@datagrok/helm 2.2.1 → 2.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +21 -0
- package/dist/package-test.js +1 -1
- package/dist/package-test.js.map +1 -1
- package/dist/package.js +1 -1
- package/dist/package.js.map +1 -1
- package/files/tests/helm2-bracket.csv +2 -0
- package/package.json +13 -10
- package/src/cell-renderer.ts +8 -33
- package/src/helm-helper.ts +67 -17
- package/src/helm-monomer-placer.ts +7 -9
- package/src/helm-web-editor.ts +33 -3
- package/src/package-test.ts +8 -3
- package/src/package-utils.ts +69 -42
- package/src/package.ts +121 -141
- package/src/tests/findMonomers-tests.ts +2 -0
- package/src/tests/get-all-parts-tests.ts +5 -0
- package/src/tests/get-molfiles-tests.ts +3 -1
- package/src/tests/get-monomer-tests.ts +88 -19
- package/src/tests/helm-service-tests.ts +4 -0
- package/src/tests/helm-tests.ts +7 -1
- package/src/tests/helm-web-editor-tests.ts +55 -0
- package/src/tests/parse-helm-tests.ts +98 -0
- package/src/tests/properties-widget-tests.ts +33 -4
- package/src/tests/renderers-tests.ts +3 -1
- package/src/tests/utils.ts +6 -0
- package/src/types/index.ts +5 -0
- package/src/utils/get-hovered.ts +3 -4
- package/src/utils/{dummy-monomer.ts → get-monomer-dummy.ts} +10 -45
- package/src/utils/get-monomer-of-library.ts +90 -0
- package/src/utils/get-monomer.ts +23 -21
- package/src/utils/helm-grid-cell-renderer.ts +19 -3
- package/src/utils/helm-service.ts +6 -5
- package/src/utils/index.ts +11 -17
- package/src/widgets/properties-widget.ts +29 -9
- package/tsconfig.json +1 -1
- package/vendor/helm-web-editor.development.js +39640 -0
- package/vendor/helm-web-editor.production.js +2 -0
- package/vendor/helm-web-editor.production.js.map +1 -0
- package/webpack.config.js +15 -12
- package/helm/JSDraw/Pistoia.HELM.js +0 -27
- package/helm/JSDraw/Scilligence.JSDraw2.Lite.js +0 -12
- package/helm/JSDraw/Scilligence.JSDraw2.Resources.js +0 -762
- package/helm/JSDraw/dojo.js +0 -250
- package/helm/JSDraw/test.html +0 -24
package/src/package.ts
CHANGED
|
@@ -3,90 +3,133 @@ import * as grok from 'datagrok-api/grok';
|
|
|
3
3
|
import * as ui from 'datagrok-api/ui';
|
|
4
4
|
import * as DG from 'datagrok-api/dg';
|
|
5
5
|
|
|
6
|
-
// import '@datagrok-libraries/bio/src/types/dojo';
|
|
7
|
-
// import * as dojo from 'DOJO';
|
|
8
|
-
import '@datagrok-libraries/bio/src/types/helm';
|
|
9
|
-
import '@datagrok-libraries/bio/src/types/jsdraw2';
|
|
10
|
-
import * as scil from 'scil';
|
|
11
|
-
import * as org from 'org';
|
|
12
|
-
import * as JSDraw2 from 'JSDraw2';
|
|
13
|
-
|
|
14
6
|
import $ from 'cash-dom';
|
|
15
7
|
|
|
8
|
+
import {testEvent} from '@datagrok-libraries/utils/src/test';
|
|
16
9
|
import {errorToConsole} from '@datagrok-libraries/utils/src/to-console';
|
|
10
|
+
import {errInfo} from '@datagrok-libraries/bio/src/utils/err-info';
|
|
17
11
|
import {NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';
|
|
18
|
-
import {
|
|
19
|
-
import {IMonomerLib
|
|
12
|
+
import {SeqHandler} from '@datagrok-libraries/bio/src/utils/seq-handler';
|
|
13
|
+
import {IMonomerLib} from '@datagrok-libraries/bio/src/types';
|
|
14
|
+
import {App, HweWindow} from '@datagrok-libraries/bio/src/helm/types';
|
|
20
15
|
import {IHelmHelper} from '@datagrok-libraries/bio/src/helm/helm-helper';
|
|
21
16
|
import {HelmServiceBase} from '@datagrok-libraries/bio/src/viewers/helm-service';
|
|
17
|
+
import {getMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';
|
|
22
18
|
|
|
23
19
|
import {HelmCellRenderer} from './cell-renderer';
|
|
24
20
|
import {HelmHelper} from './helm-helper';
|
|
25
21
|
import {getPropertiesWidget} from './widgets/properties-widget';
|
|
26
22
|
import {HelmGridCellRenderer, HelmGridCellRendererBack} from './utils/helm-grid-cell-renderer';
|
|
27
|
-
import {_getHelmService, HelmPackage,
|
|
23
|
+
import {_getHelmService, HelmPackage, initHelmLoadAndPatchDojo} from './package-utils';
|
|
24
|
+
import {RGROUP_CAP_GROUP_NAME, RGROUP_LABEL, SMILES} from './constants';
|
|
25
|
+
import {getRS} from './utils/get-monomer-dummy';
|
|
28
26
|
|
|
29
|
-
|
|
27
|
+
// Do not import anything than types from @datagrok/helm-web-editor/src/types
|
|
28
|
+
import {buildWebEditorApp} from './helm-web-editor';
|
|
29
|
+
import {JSDraw2HelmModule, OrgHelmModule, ScilModule} from './types';
|
|
30
30
|
|
|
31
31
|
export const _package = new HelmPackage();
|
|
32
32
|
|
|
33
|
+
let monomerLib: IMonomerLib | null = null;
|
|
34
|
+
|
|
35
|
+
/*
|
|
36
|
+
Loading modules:
|
|
37
|
+
Through Helm/package.json/sources section
|
|
38
|
+
dojo from ajax.googleapis.com
|
|
39
|
+
HELMWebEditor
|
|
40
|
+
JSDraw.Lite is embedded into HELMWebEditor bundle (dist/package.js)
|
|
41
|
+
*/
|
|
42
|
+
|
|
43
|
+
declare const window: Window & HweWindow;
|
|
44
|
+
declare const scil: ScilModule;
|
|
45
|
+
declare const JSDraw2: JSDraw2HelmModule;
|
|
46
|
+
declare const org: OrgHelmModule;
|
|
47
|
+
|
|
33
48
|
//tags: init
|
|
34
49
|
export async function initHelm(): Promise<void> {
|
|
35
|
-
const logPrefix: string = 'Helm: initHelm()';
|
|
50
|
+
const logPrefix: string = 'Helm: _package.initHelm()';
|
|
36
51
|
_package.logger.debug(`${logPrefix}, start`);
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
.
|
|
84
|
-
const
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
52
|
+
|
|
53
|
+
try {
|
|
54
|
+
const [_, lib]: [void, IMonomerLib] = await Promise.all([
|
|
55
|
+
Promise.all([
|
|
56
|
+
new Promise<void>((resolve, reject) => {
|
|
57
|
+
// @ts-ignore
|
|
58
|
+
// try { dojo.ready(function() { resolve(null); }); } catch (err: any) { reject(err); }
|
|
59
|
+
resolve();
|
|
60
|
+
}),
|
|
61
|
+
(async () => {
|
|
62
|
+
_package.logger.debug(`${logPrefix}, dependence loading …`);
|
|
63
|
+
const t1: number = performance.now();
|
|
64
|
+
|
|
65
|
+
_package.logger.debug(`${logPrefix}, dojox loading and patching …`);
|
|
66
|
+
await initHelmLoadAndPatchDojo();
|
|
67
|
+
_package.logger.debug(`${logPrefix}, dojox loaded and patched`);
|
|
68
|
+
|
|
69
|
+
// Alternatively load old bundles by package.json/sources
|
|
70
|
+
_package.logger.debug(`${logPrefix}, HelmWebEditor awaiting …`);
|
|
71
|
+
require('vendor/helm-web-editor'); // through webpack.config.ts/alias
|
|
72
|
+
await window.helmWebEditor$.initPromise;
|
|
73
|
+
_package.logger.debug(`${logPrefix}, HelmWebEditor loaded`);
|
|
74
|
+
|
|
75
|
+
org.helm.webeditor.kCaseSensitive = true; // GROK-13880
|
|
76
|
+
|
|
77
|
+
_package.logger.debug(`${logPrefix}, scil.Utils.alert patch`);
|
|
78
|
+
_package.initHelmPatchScilAlert(); // patch immediately
|
|
79
|
+
|
|
80
|
+
const t2: number = performance.now();
|
|
81
|
+
_package.logger.debug(`${logPrefix}, dependence loaded, ET: ${(t2 - t1)} ms`);
|
|
82
|
+
})()
|
|
83
|
+
]).then(() => {
|
|
84
|
+
|
|
85
|
+
// settings
|
|
86
|
+
}),
|
|
87
|
+
(async () => {
|
|
88
|
+
const libHelper = await getMonomerLibHelper();
|
|
89
|
+
return libHelper.getBioLib();
|
|
90
|
+
})()
|
|
91
|
+
]);
|
|
92
|
+
|
|
93
|
+
_package.logger.debug(`${logPrefix}, then(), lib loaded`);
|
|
94
|
+
monomerLib = lib;
|
|
95
|
+
// rewriteLibraries(); // initHelm()
|
|
96
|
+
await _package.initHelmPatchPistoia(monomerLib);
|
|
97
|
+
|
|
98
|
+
monomerLib.onChanged.subscribe((_) => {
|
|
99
|
+
const logPrefixInt = `${logPrefix} monomerLib.onChanged()`;
|
|
100
|
+
try {
|
|
101
|
+
const libSummary = monomerLib!.getSummaryObj();
|
|
102
|
+
const isLibEmpty = Object.keys(libSummary).length == 0;
|
|
103
|
+
const libSummaryLog = isLibEmpty ? 'empty' : Object.entries(libSummary)
|
|
104
|
+
.map(([pt, count]) => `${pt}: ${count}`)
|
|
105
|
+
.join(', ');
|
|
106
|
+
_package.logger.debug(`${logPrefixInt}, start, lib: { ${libSummaryLog} }`);
|
|
107
|
+
|
|
108
|
+
const libSummaryHtml = isLibEmpty ? 'empty' : Object.entries(libSummary)
|
|
109
|
+
.map(([pt, count]) => `${pt} ${count}`)
|
|
110
|
+
.join('<br />');
|
|
111
|
+
const libMsg: string = `Monomer lib updated:<br /> ${libSummaryHtml}`;
|
|
112
|
+
grok.shell.info(libMsg);
|
|
113
|
+
|
|
114
|
+
// _package.logger.debug(`${logPrefixInt}, org,helm.webeditor.Monomers updating ...`);
|
|
115
|
+
// rewriteLibraries(); // initHelm() monomerLib.onChanged()
|
|
116
|
+
// _package.logger.debug(`${logPrefixInt}, end, org.helm.webeditor.Monomers completed`);
|
|
117
|
+
} catch (err: any) {
|
|
118
|
+
const errMsg = errorToConsole(err);
|
|
119
|
+
console.error(`${logPrefixInt} error:\n` + errMsg);
|
|
120
|
+
// throw err; // Prevent disabling event handler
|
|
121
|
+
}
|
|
89
122
|
});
|
|
123
|
+
} catch (err: any) {
|
|
124
|
+
const [errMsg, errStack] = errInfo(err);
|
|
125
|
+
// const errMsg: string = err instanceof Error ? err.message : !!err ? err.toString() : 'Exception \'undefined\'';
|
|
126
|
+
grok.shell.error(`Package \'Helm\' init error:\n${errMsg}`);
|
|
127
|
+
const errRes = new Error(`${logPrefix} error:\n ${errMsg}\n${errStack}`);
|
|
128
|
+
errRes.stack = errStack;
|
|
129
|
+
throw errRes;
|
|
130
|
+
} finally {
|
|
131
|
+
_package.logger.debug(`${logPrefix}, finally`);
|
|
132
|
+
}
|
|
90
133
|
_package.logger.debug(`${logPrefix}, end`);
|
|
91
134
|
}
|
|
92
135
|
|
|
@@ -94,51 +137,6 @@ export function getMonomerLib(): IMonomerLib | null {
|
|
|
94
137
|
return monomerLib;
|
|
95
138
|
}
|
|
96
139
|
|
|
97
|
-
/** Fills org.helm.webeditor.Monomers dictionary for WebEditor */
|
|
98
|
-
function rewriteLibraries() {
|
|
99
|
-
org.helm.webeditor.Monomers.clear();
|
|
100
|
-
monomerLib!.getPolymerTypes().forEach((polymerType) => {
|
|
101
|
-
const monomerSymbols = monomerLib!.getMonomerSymbolsByType(polymerType);
|
|
102
|
-
monomerSymbols.forEach((monomerSymbol) => {
|
|
103
|
-
let isBroken = false;
|
|
104
|
-
const monomer: Monomer = monomerLib!.getMonomer(polymerType, monomerSymbol)!;
|
|
105
|
-
const webEditorMonomer: org.helm.WebEditorMonomer = {
|
|
106
|
-
id: monomerSymbol,
|
|
107
|
-
m: monomer.molfile,
|
|
108
|
-
n: monomer.name,
|
|
109
|
-
na: monomer.naturalAnalog,
|
|
110
|
-
rs: monomer.rgroups.length,
|
|
111
|
-
type: monomer.polymerType,
|
|
112
|
-
mt: monomer.monomerType,
|
|
113
|
-
at: {}
|
|
114
|
-
};
|
|
115
|
-
|
|
116
|
-
if (monomer.rgroups.length > 0) {
|
|
117
|
-
// @ts-ignore
|
|
118
|
-
webEditorMonomer.rs = monomer.rgroups.length;
|
|
119
|
-
const at: { [prop: string]: any } = {};
|
|
120
|
-
monomer.rgroups.forEach((it) => {
|
|
121
|
-
at[it[RGROUP_LABEL]] = it[RGROUP_CAP_GROUP_NAME];
|
|
122
|
-
});
|
|
123
|
-
webEditorMonomer.at = at;
|
|
124
|
-
} else if (monomer[SMILES] != null) {
|
|
125
|
-
// @ts-ignore
|
|
126
|
-
webEditorMonomer.rs = Object.keys(getRS(monomer[SMILES].toString())).length;
|
|
127
|
-
webEditorMonomer.at = getRS(monomer[SMILES].toString());
|
|
128
|
-
} else
|
|
129
|
-
isBroken = true;
|
|
130
|
-
|
|
131
|
-
if (!isBroken) {
|
|
132
|
-
org.helm.webeditor.Monomers.addOneMonomer(webEditorMonomer);
|
|
133
|
-
}
|
|
134
|
-
});
|
|
135
|
-
});
|
|
136
|
-
|
|
137
|
-
// Obsolete
|
|
138
|
-
const grid: DG.Grid = grok.shell.tv?.grid;
|
|
139
|
-
if (grid) grid.invalidate();
|
|
140
|
-
}
|
|
141
|
-
|
|
142
140
|
//name: getHelmService
|
|
143
141
|
//output: object result
|
|
144
142
|
export function getHelmService(): HelmServiceBase {
|
|
@@ -151,6 +149,8 @@ export function getHelmService(): HelmServiceBase {
|
|
|
151
149
|
//meta.columnTags: quality=Macromolecule, units=helm
|
|
152
150
|
//output: grid_cell_renderer result
|
|
153
151
|
export function helmCellRenderer(): HelmCellRenderer {
|
|
152
|
+
const logPrefix = `Helm: _package.getHelmCellRenderer()`;
|
|
153
|
+
_package.logger.debug(`${logPrefix}, start`);
|
|
154
154
|
// return new HelmCellRenderer(); // old
|
|
155
155
|
return new HelmGridCellRenderer(); // new
|
|
156
156
|
}
|
|
@@ -198,34 +198,16 @@ function openWebEditor(cell: DG.Cell, value?: string, units?: string) {
|
|
|
198
198
|
const col = cell.column as DG.Column<string>;
|
|
199
199
|
const sh = SeqHandler.forColumn(col);
|
|
200
200
|
const rowIdx = cell.rowIndex;
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
mexfontsize: '90%',
|
|
205
|
-
mexrnapinontab: true,
|
|
206
|
-
topmargin: 20,
|
|
207
|
-
mexmonomerstab: true,
|
|
208
|
-
sequenceviewonly: false,
|
|
209
|
-
mexfavoritefirst: true,
|
|
210
|
-
mexfilter: true
|
|
211
|
-
});
|
|
212
|
-
const sizes = app.calculateSizes();
|
|
213
|
-
app.canvas.resize(sizes.rightwidth - 100, sizes.topheight - 210);
|
|
214
|
-
let s = {width: sizes.rightwidth - 100 + 'px', height: sizes.bottomheight + 'px'};
|
|
215
|
-
scil.apply(app.sequence.style, s);
|
|
216
|
-
scil.apply(app.notation.style, s);
|
|
217
|
-
s = {width: sizes.rightwidth + 'px', height: (sizes.bottomheight + app.toolbarheight) + 'px'};
|
|
218
|
-
scil.apply(app.properties.parent.style, s);
|
|
219
|
-
app.structureview.resize(sizes.rightwidth, sizes.bottomheight + app.toolbarheight);
|
|
220
|
-
app.mex.resize(sizes.topheight - 80);
|
|
221
|
-
setTimeout(() => {
|
|
201
|
+
let app: App;
|
|
202
|
+
setTimeout(async () => {
|
|
203
|
+
app = await buildWebEditorApp(view);
|
|
222
204
|
if (!!cell && units === undefined)
|
|
223
205
|
app.canvas.helm.setSequence(cell.value, 'HELM');
|
|
224
206
|
else
|
|
225
207
|
app.canvas.helm.setSequence(value!, 'HELM');
|
|
226
|
-
},
|
|
227
|
-
ui.dialog({showHeader: false, showFooter: true})
|
|
228
|
-
|
|
208
|
+
}, 20);
|
|
209
|
+
const dlg = ui.dialog({showHeader: false, showFooter: true});
|
|
210
|
+
dlg.add(view)
|
|
229
211
|
.onOK(() => {
|
|
230
212
|
const helmValue: string = app.canvas.getHelm(true).replace(/<\/span>/g, '')
|
|
231
213
|
.replace(/<span style='background:#bbf;'>/g, '');
|
|
@@ -238,6 +220,10 @@ function openWebEditor(cell: DG.Cell, value?: string, units?: string) {
|
|
|
238
220
|
}
|
|
239
221
|
}
|
|
240
222
|
}).show({modal: true, fullScreen: true});
|
|
223
|
+
|
|
224
|
+
// Quick fix for full screen dialog
|
|
225
|
+
const dlgCntDiv = $(dlg.root).find('div').get()[0] as HTMLDivElement;
|
|
226
|
+
dlgCntDiv.className = dlgCntDiv.className.replace('dlg- ui-form', 'dlg-ui-form');
|
|
241
227
|
}
|
|
242
228
|
|
|
243
229
|
//name: getMolfiles
|
|
@@ -267,15 +253,9 @@ export function getMolfiles(col: DG.Column): DG.Column {
|
|
|
267
253
|
//name: getHelmHelper
|
|
268
254
|
//output: object result
|
|
269
255
|
export async function getHelmHelper(): Promise<IHelmHelper> {
|
|
270
|
-
return
|
|
256
|
+
return _package.hh;
|
|
271
257
|
}
|
|
272
258
|
|
|
273
|
-
import {testEvent} from '@datagrok-libraries/utils/src/test';
|
|
274
|
-
import {CellRendererBackAsyncBase} from '@datagrok-libraries/bio/src/utils/cell-renderer-async-base';
|
|
275
|
-
import {RGROUP_CAP_GROUP_NAME, RGROUP_LABEL, SMILES} from './constants';
|
|
276
|
-
import {getRS} from './utils/dummy-monomer';
|
|
277
|
-
import {getMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';
|
|
278
|
-
|
|
279
259
|
//name: measureCellRenderer
|
|
280
260
|
export async function measureCellRenderer(): Promise<void> {
|
|
281
261
|
const grid = grok.shell.tv.grid;
|
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
} from '@datagrok-libraries/bio/src/monomer-works/lib-settings';
|
|
11
11
|
|
|
12
12
|
import {findMonomers, parseHelm} from '../utils';
|
|
13
|
+
import {initHelmMainPackage} from './utils';
|
|
13
14
|
|
|
14
15
|
|
|
15
16
|
/** Tests with default monomer library */
|
|
@@ -19,6 +20,7 @@ category('findMonomers', () => {
|
|
|
19
20
|
let userLibSettings: UserLibSettings;
|
|
20
21
|
|
|
21
22
|
before(async () => {
|
|
23
|
+
await initHelmMainPackage();
|
|
22
24
|
monomerLibHelper = await getMonomerLibHelper();
|
|
23
25
|
userLibSettings = await getUserLibSettings();
|
|
24
26
|
|
|
@@ -5,6 +5,7 @@ import * as DG from 'datagrok-api/dg';
|
|
|
5
5
|
import {after, before, category, delay, expect, test, expectArray} from '@datagrok-libraries/utils/src/test';
|
|
6
6
|
|
|
7
7
|
import {getAllParts} from '../helm-monomer-placer';
|
|
8
|
+
import {initHelmMainPackage} from './utils';
|
|
8
9
|
|
|
9
10
|
category('getAllParts', () => {
|
|
10
11
|
/** All parts of Helm string are required for fallback rendering. */
|
|
@@ -21,6 +22,10 @@ category('getAllParts', () => {
|
|
|
21
22
|
}
|
|
22
23
|
};
|
|
23
24
|
|
|
25
|
+
before(async () => {
|
|
26
|
+
await initHelmMainPackage();
|
|
27
|
+
});
|
|
28
|
+
|
|
24
29
|
for (const [testName, testData] of Object.entries(tests)) {
|
|
25
30
|
test(`${testName}`, async () => {
|
|
26
31
|
await _testAllParts(testData.seq, testData.tgt);
|
|
@@ -3,6 +3,7 @@ import * as ui from 'datagrok-api/ui';
|
|
|
3
3
|
import * as DG from 'datagrok-api/dg';
|
|
4
4
|
|
|
5
5
|
import {after, before, category, delay, expect, test, expectArray, testEvent} from '@datagrok-libraries/utils/src/test';
|
|
6
|
+
import {getHelmHelper} from '@datagrok-libraries/bio/src/helm/helm-helper';
|
|
6
7
|
import {
|
|
7
8
|
getUserLibSettings, setUserLibSettings, setUserLibSettingsForTests
|
|
8
9
|
} from '@datagrok-libraries/bio/src/monomer-works/lib-settings';
|
|
@@ -11,7 +12,7 @@ import {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/sr
|
|
|
11
12
|
import {MolfileHandler} from '@datagrok-libraries/chem-meta/src/parsing-utils/molfile-handler';
|
|
12
13
|
import {MolfileHandlerBase} from '@datagrok-libraries/chem-meta/src/parsing-utils/molfile-handler-base';
|
|
13
14
|
|
|
14
|
-
import {awaitGrid} from './utils';
|
|
15
|
+
import {awaitGrid, initHelmMainPackage} from './utils';
|
|
15
16
|
|
|
16
17
|
import {_package} from '../package-test';
|
|
17
18
|
|
|
@@ -20,6 +21,7 @@ category('getMolfiles', () => {
|
|
|
20
21
|
let userLibSettings: UserLibSettings;
|
|
21
22
|
|
|
22
23
|
before(async () => {
|
|
24
|
+
await initHelmMainPackage();
|
|
23
25
|
monomerLibHelper = await getMonomerLibHelper();
|
|
24
26
|
userLibSettings = await getUserLibSettings();
|
|
25
27
|
await setUserLibSettingsForTests();
|
|
@@ -3,17 +3,15 @@ import * as ui from 'datagrok-api/ui';
|
|
|
3
3
|
import * as DG from 'datagrok-api/dg';
|
|
4
4
|
|
|
5
5
|
import wu from 'wu';
|
|
6
|
-
import * as org from 'org';
|
|
7
|
-
import * as JSDraw2 from 'JSDraw2';
|
|
8
|
-
import Atom = JSDraw2.Atom;
|
|
9
|
-
import JsAtom = JSDraw2.JsAtom;
|
|
10
6
|
|
|
11
7
|
import {
|
|
12
|
-
after, before, category, delay, expect, test, expectArray, testEvent, expectFloat
|
|
8
|
+
after, before, category, delay, expect, test, expectArray, testEvent, expectFloat, timeout
|
|
13
9
|
} from '@datagrok-libraries/utils/src/test';
|
|
10
|
+
import {getHelmHelper} from '@datagrok-libraries/bio/src/helm/helm-helper';
|
|
14
11
|
import {errInfo} from '@datagrok-libraries/bio/src/utils/err-info';
|
|
15
|
-
import {HelmType,
|
|
16
|
-
import {
|
|
12
|
+
import {Atom, HelmType, IJsAtom, IWebEditorMonomer, GetMonomerFunc} from '@datagrok-libraries/bio/src/helm/types';
|
|
13
|
+
import {IMonomerLib, Monomer, MonomerLibSummaryType} from '@datagrok-libraries/bio/src/types';
|
|
14
|
+
import {IHelmHelper} from '@datagrok-libraries/bio/src/helm/helm-helper';
|
|
17
15
|
import {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';
|
|
18
16
|
import {UserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/types';
|
|
19
17
|
import {
|
|
@@ -21,10 +19,19 @@ import {
|
|
|
21
19
|
} from '@datagrok-libraries/bio/src/monomer-works/lib-settings';
|
|
22
20
|
import {defaultMonomerLibSummary, expectMonomerLib} from '@datagrok-libraries/bio/src/tests/monomer-lib-tests';
|
|
23
21
|
|
|
24
|
-
import {
|
|
22
|
+
import {getMonomerHandleArgs} from '../utils/get-monomer';
|
|
23
|
+
import {JSDraw2HelmModule, OrgHelmModule} from '../types';
|
|
24
|
+
|
|
25
|
+
import {HelmHelper} from '../helm-helper';
|
|
26
|
+
import {RGROUP_CAP_GROUP_NAME, RGROUP_LABEL, SMILES} from '../constants';
|
|
27
|
+
import {getRS} from '../utils/get-monomer-dummy';
|
|
28
|
+
import {initHelmMainPackage} from './utils';
|
|
25
29
|
|
|
26
30
|
import {_package} from '../package-test';
|
|
27
31
|
|
|
32
|
+
declare const org: OrgHelmModule;
|
|
33
|
+
declare const JSDraw2: JSDraw2HelmModule;
|
|
34
|
+
|
|
28
35
|
type TestDataType = { args: { a: any, name?: string }, tgt: any };
|
|
29
36
|
|
|
30
37
|
const tests: { [testName: string]: TestDataType } = {
|
|
@@ -64,18 +71,30 @@ const tests: { [testName: string]: TestDataType } = {
|
|
|
64
71
|
};
|
|
65
72
|
|
|
66
73
|
category('getMonomer', ()=>{
|
|
74
|
+
let libHelper: IMonomerLibHelper;
|
|
75
|
+
let helmHelper: IHelmHelper;
|
|
76
|
+
|
|
67
77
|
let monomerLibHelper: IMonomerLibHelper;
|
|
68
78
|
/** Backup actual user's monomer libraries settings */
|
|
69
79
|
let userLibSettings: UserLibSettings;
|
|
70
80
|
|
|
71
81
|
before(async ()=>{
|
|
72
|
-
|
|
73
|
-
|
|
82
|
+
await initHelmMainPackage();
|
|
83
|
+
|
|
84
|
+
[libHelper, helmHelper] = await Promise.all([getMonomerLibHelper(), getHelmHelper()]);
|
|
85
|
+
|
|
86
|
+
await timeout(async () => { monomerLibHelper = await getMonomerLibHelper(); }, 5000,
|
|
87
|
+
'get monomerLibHelper');
|
|
88
|
+
await timeout(async () => { userLibSettings = await getUserLibSettings(); }, 5000,
|
|
89
|
+
'get user lib settings for backup');
|
|
74
90
|
|
|
75
91
|
// Tests 'findMonomers' requires default monomer library loaded
|
|
76
|
-
await setUserLibSettingsForTests();
|
|
77
|
-
|
|
78
|
-
await monomerLibHelper.
|
|
92
|
+
await timeout(async () => { await setUserLibSettingsForTests(); }, 5000,
|
|
93
|
+
'set user lib settings for tests');
|
|
94
|
+
await timeout(async ()=> { await monomerLibHelper.awaitLoaded(); }, 5000,
|
|
95
|
+
'await monomerLib to be loaded');
|
|
96
|
+
await timeout(async () => { await monomerLibHelper.loadLibraries(true); }, 5000,
|
|
97
|
+
'reload monomerLib with settings for tests'); // load default libraries for tests
|
|
79
98
|
});
|
|
80
99
|
|
|
81
100
|
after(async ()=>{
|
|
@@ -84,13 +103,20 @@ category('getMonomer', ()=>{
|
|
|
84
103
|
});
|
|
85
104
|
|
|
86
105
|
test('original', async () =>{
|
|
106
|
+
const monomerLib = libHelper.getBioLib();
|
|
107
|
+
rewriteLibraries(monomerLib);
|
|
108
|
+
|
|
109
|
+
// const overriddenGetMonomer = helmHelper.revertOriginalGetMonomer();
|
|
110
|
+
// try {
|
|
87
111
|
const helmHelper: IHelmHelper = await getHelmHelper();
|
|
88
112
|
expect(helmHelper != null, true);
|
|
89
113
|
// @ts-ignore
|
|
90
|
-
const
|
|
91
|
-
const getMonomerFunc = mainPkg.getMonomerOriginal;
|
|
114
|
+
const getMonomerFunc = helmHelper.originalGetMonomer!;
|
|
92
115
|
|
|
93
116
|
return _testAll('original', getMonomerFunc);
|
|
117
|
+
// } finally {
|
|
118
|
+
// helmHelper.overrideGetMonomer(overriddenGetMonomer);
|
|
119
|
+
// }
|
|
94
120
|
}, {isAggregated: true});
|
|
95
121
|
|
|
96
122
|
test('monomerLib', async () =>{
|
|
@@ -163,7 +189,6 @@ category('getMonomer', ()=>{
|
|
|
163
189
|
/* Tests getMonomer function adding missing monomers. */
|
|
164
190
|
const helmStr = 'PEPTIDE1{[mis1].R.[mis2].T.C.F}$$$$;';
|
|
165
191
|
|
|
166
|
-
|
|
167
192
|
expectMonomerLib(monomerLibHelper.getBioLib());
|
|
168
193
|
const editor = new JSDraw2.Editor(ui.div(), {viewonly: true});
|
|
169
194
|
editor.setHelm(helmStr);
|
|
@@ -174,11 +199,11 @@ category('getMonomer', ()=>{
|
|
|
174
199
|
});
|
|
175
200
|
});
|
|
176
201
|
|
|
177
|
-
function getAtomFromJson(argA:
|
|
202
|
+
function getAtomFromJson(argA: IJsAtom<HelmType> | HelmType): Atom<HelmType> | HelmType {
|
|
178
203
|
let res: Atom<HelmType> | HelmType;
|
|
179
|
-
const a = argA as
|
|
204
|
+
const a = argA as IJsAtom<HelmType>;
|
|
180
205
|
if (a.T === 'ATOM')
|
|
181
|
-
res = new JSDraw2.Atom
|
|
206
|
+
res = new JSDraw2.Atom(a.p, a.elem, a.bio);
|
|
182
207
|
else
|
|
183
208
|
res = argA as HelmType;
|
|
184
209
|
return res;
|
|
@@ -208,3 +233,47 @@ export function expectObjectWithNull(actual: { [key: string]: any }, expected: {
|
|
|
208
233
|
}
|
|
209
234
|
}
|
|
210
235
|
}
|
|
236
|
+
|
|
237
|
+
/** Fills org.helm.webeditor.Monomers dictionary for WebEditor */
|
|
238
|
+
function rewriteLibraries(monomerLib: IMonomerLib): void {
|
|
239
|
+
org.helm.webeditor.Monomers.clear();
|
|
240
|
+
monomerLib!.getPolymerTypes().forEach((polymerType) => {
|
|
241
|
+
const monomerSymbols = monomerLib!.getMonomerSymbolsByType(polymerType);
|
|
242
|
+
monomerSymbols.forEach((monomerSymbol) => {
|
|
243
|
+
let isBroken = false;
|
|
244
|
+
const monomer: Monomer = monomerLib!.getMonomer(polymerType, monomerSymbol)!;
|
|
245
|
+
const webEditorMonomer: IWebEditorMonomer = {
|
|
246
|
+
id: monomerSymbol,
|
|
247
|
+
m: monomer.molfile,
|
|
248
|
+
n: monomer.name,
|
|
249
|
+
na: monomer.naturalAnalog,
|
|
250
|
+
rs: monomer.rgroups.length,
|
|
251
|
+
type: monomer.polymerType,
|
|
252
|
+
mt: monomer.monomerType,
|
|
253
|
+
at: {},
|
|
254
|
+
};
|
|
255
|
+
|
|
256
|
+
if (monomer.rgroups.length > 0) {
|
|
257
|
+
// @ts-ignore
|
|
258
|
+
webEditorMonomer.rs = monomer.rgroups.length;
|
|
259
|
+
const at: { [prop: string]: any } = {};
|
|
260
|
+
monomer.rgroups.forEach((it) => {
|
|
261
|
+
at[it[RGROUP_LABEL]] = it[RGROUP_CAP_GROUP_NAME];
|
|
262
|
+
});
|
|
263
|
+
webEditorMonomer.at = at;
|
|
264
|
+
} else if (monomer[SMILES] != null) {
|
|
265
|
+
// @ts-ignore
|
|
266
|
+
webEditorMonomer.rs = Object.keys(getRS(monomer[SMILES].toString())).length;
|
|
267
|
+
webEditorMonomer.at = getRS(monomer[SMILES].toString());
|
|
268
|
+
} else
|
|
269
|
+
isBroken = true;
|
|
270
|
+
|
|
271
|
+
if (!isBroken)
|
|
272
|
+
org.helm.webeditor.Monomers.addOneMonomer(webEditorMonomer);
|
|
273
|
+
});
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
// Obsolete
|
|
277
|
+
const grid: DG.Grid = grok.shell.tv?.grid;
|
|
278
|
+
if (grid) grid.invalidate();
|
|
279
|
+
}
|
|
@@ -7,6 +7,7 @@ import {Subject} from 'rxjs';
|
|
|
7
7
|
import {
|
|
8
8
|
category, expect, test, awaitCheck, delay, testEvent, before, after
|
|
9
9
|
} from '@datagrok-libraries/utils/src/test';
|
|
10
|
+
import {getHelmHelper} from '@datagrok-libraries/bio/src/helm/helm-helper';
|
|
10
11
|
import {
|
|
11
12
|
getHelmService, HelmServiceBase, HelmAux, HelmProps
|
|
12
13
|
} from '@datagrok-libraries/bio/src/viewers/helm-service';
|
|
@@ -18,6 +19,8 @@ import {
|
|
|
18
19
|
getUserLibSettings, setUserLibSettings, setUserLibSettingsForTests
|
|
19
20
|
} from '@datagrok-libraries/bio/src/monomer-works/lib-settings';
|
|
20
21
|
|
|
22
|
+
import {initHelmMainPackage} from './utils';
|
|
23
|
+
|
|
21
24
|
import {_package} from '../package-test';
|
|
22
25
|
|
|
23
26
|
category('HelmService', () => {
|
|
@@ -30,6 +33,7 @@ category('HelmService', () => {
|
|
|
30
33
|
before(async () => {
|
|
31
34
|
const logPrefix = `Helm: tests: HelmService: before`;
|
|
32
35
|
_package.logger.debug(`${logPrefix}, start`);
|
|
36
|
+
await initHelmMainPackage();
|
|
33
37
|
try {
|
|
34
38
|
monomerLibHelper = await getMonomerLibHelper();
|
|
35
39
|
userLibSettings = await getUserLibSettings();
|
package/src/tests/helm-tests.ts
CHANGED
|
@@ -3,8 +3,10 @@ import * as ui from 'datagrok-api/ui';
|
|
|
3
3
|
import * as DG from 'datagrok-api/dg';
|
|
4
4
|
|
|
5
5
|
import {after, before, category, delay, expect, test, expectArray} from '@datagrok-libraries/utils/src/test';
|
|
6
|
+
|
|
6
7
|
//import {findMonomers, helmToFasta, helmToPeptide, helmToRNA, initHelm} from '../package';
|
|
7
8
|
import {parseHelm} from '../utils';
|
|
9
|
+
import {initHelmMainPackage} from './utils';
|
|
8
10
|
|
|
9
11
|
import {_package} from '../package-test';
|
|
10
12
|
|
|
@@ -51,7 +53,7 @@ category('Helm', () => {
|
|
|
51
53
|
// });
|
|
52
54
|
|
|
53
55
|
const complexMonomers = [
|
|
54
|
-
// tests parsing of complex
|
|
56
|
+
// tests parsing of complex monomer in square brackets like [L-hArg(Et,Et)]
|
|
55
57
|
'PEPTIDE1{[L-hArg(Et,Et)].E.F.G}|PEPTIDE2{C.E}$PEPTIDE1,PEPTIDE2,2:R3-1:R1$$$V2.0',
|
|
56
58
|
// tests parsing of complex monomer and one as a side chain as well
|
|
57
59
|
'PEPTIDE1{[L-hArg(Et,Et)]([L-hArg(Et,Et)]).E.F.G}$$$$',
|
|
@@ -76,6 +78,10 @@ category('Helm', () => {
|
|
|
76
78
|
'complex-side-chain', 'complex+side-chain+linker'
|
|
77
79
|
];
|
|
78
80
|
|
|
81
|
+
before(async () => {
|
|
82
|
+
await initHelmMainPackage();
|
|
83
|
+
});
|
|
84
|
+
|
|
79
85
|
test('parseHelm', async () => {
|
|
80
86
|
const expectedResults = [
|
|
81
87
|
['meI', 'hHis', 'Aca', 'N', 'T', 'dK', 'Thr_PO3H2', 'D-Tyr_Et', 'Aze', 'dV', 'E', 'Phe_4Me'],
|