@datagrok/bio 2.11.29 → 2.11.33
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 +25 -1
- package/dist/36.js +1 -1
- package/dist/36.js.map +1 -1
- package/dist/42.js +1 -1
- package/dist/42.js.map +1 -1
- package/dist/590.js +2 -0
- package/dist/590.js.map +1 -0
- package/dist/709.js +1 -2
- package/dist/709.js.map +1 -1
- package/dist/79.js.map +1 -1
- package/dist/895.js +3 -0
- package/dist/895.js.map +1 -0
- package/dist/package-test.js +8 -1
- package/dist/package-test.js.LICENSE.txt +1 -0
- package/dist/package-test.js.map +1 -1
- package/dist/package.js +8 -1
- package/dist/package.js.LICENSE.txt +1 -0
- package/dist/package.js.map +1 -1
- package/files/{data → monomer-libraries}/HELMCoreLibrary.json +594 -594
- package/files/tests/libraries/HELMmonomerSchema.json +96 -0
- package/files/tests/to-atomic-level-msa-fasta-input.csv +10 -0
- package/files/tests/to-atomic-level-msa-fasta-output.csv +2178 -0
- package/package.json +15 -13
- package/scripts/sequence_generator.md +48 -0
- package/scripts/sequence_generator.py +515 -256
- package/src/package-test.ts +4 -0
- package/src/package.ts +37 -33
- package/src/tests/WebLogo-layout-tests.ts +37 -0
- package/src/tests/WebLogo-positions-test.ts +5 -0
- package/src/tests/WebLogo-project-tests.ts +63 -0
- package/src/tests/activity-cliffs-tests.ts +3 -2
- package/src/tests/monomer-libraries-tests.ts +7 -4
- package/src/tests/msa-tests.ts +2 -2
- package/src/tests/pepsea-tests.ts +1 -1
- package/src/tests/renderers-test.ts +16 -16
- package/src/tests/scoring.ts +3 -2
- package/src/tests/splitters-test.ts +7 -12
- package/src/tests/substructure-filters-tests.ts +280 -57
- package/src/tests/to-atomic-level-tests.ts +35 -24
- package/src/tests/utils/sequences-generators.ts +6 -3
- package/src/tests/utils.ts +6 -6
- package/src/utils/docker.ts +36 -0
- package/src/utils/helm-to-molfile.ts +3 -3
- package/src/utils/monomer-lib/lib-manager.ts +116 -0
- package/src/utils/monomer-lib/library-file-manager/consts.ts +1 -0
- package/src/utils/monomer-lib/library-file-manager/custom-monomer-lib-handlers.ts +80 -0
- package/src/utils/monomer-lib/library-file-manager/event-manager.ts +58 -0
- package/src/utils/monomer-lib/library-file-manager/file-manager.ts +187 -0
- package/src/utils/monomer-lib/library-file-manager/file-validator.ts +56 -0
- package/src/utils/monomer-lib/library-file-manager/style.css +8 -0
- package/src/utils/monomer-lib/library-file-manager/ui.ts +224 -0
- package/src/utils/monomer-lib/monomer-lib.ts +114 -0
- package/src/utils/poly-tool/const.ts +28 -0
- package/src/utils/poly-tool/monomer-lib-handler.ts +115 -0
- package/src/utils/poly-tool/types.ts +6 -0
- package/src/utils/poly-tool/ui.ts +2 -2
- package/src/viewers/vd-regions-viewer.ts +9 -4
- package/src/viewers/web-logo-viewer.ts +10 -5
- package/src/widgets/bio-substructure-filter-helm.ts +168 -0
- package/src/widgets/bio-substructure-filter-types.ts +131 -0
- package/src/widgets/bio-substructure-filter.ts +218 -175
- package/src/widgets/composition-analysis-widget.ts +1 -1
- package/files/libraries/HELMCoreLibrary.json +0 -18218
- package/src/utils/monomer-lib.ts +0 -305
- /package/dist/{709.js.LICENSE.txt → 895.js.LICENSE.txt} +0 -0
|
@@ -1,14 +1,20 @@
|
|
|
1
|
-
import * as DG from 'datagrok-api/dg';
|
|
2
1
|
import * as grok from 'datagrok-api/grok';
|
|
2
|
+
import * as ui from 'datagrok-api/ui';
|
|
3
|
+
import * as DG from 'datagrok-api/dg';
|
|
3
4
|
|
|
4
|
-
import {after, before, category, test, expect, delay, testEvent} from '@datagrok-libraries/utils/src/test';
|
|
5
|
+
import {after, before, category, test, expect, delay, testEvent, awaitCheck} from '@datagrok-libraries/utils/src/test';
|
|
5
6
|
import {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';
|
|
6
7
|
import {
|
|
7
|
-
|
|
8
|
+
getUserLibSettings, setUserLibSettings, setUserLibSettingsForTests
|
|
8
9
|
} from '@datagrok-libraries/bio/src/monomer-works/lib-settings';
|
|
10
|
+
import {UserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/types';
|
|
9
11
|
|
|
10
12
|
import {awaitGrid, readDataframe} from './utils';
|
|
11
|
-
import {
|
|
13
|
+
import {
|
|
14
|
+
BioSubstructureFilter, FastaBioFilter, SeparatorBioFilter, SeparatorFilterProps
|
|
15
|
+
} from '../widgets/bio-substructure-filter';
|
|
16
|
+
import {BioFilterProps} from '../widgets/bio-substructure-filter-types';
|
|
17
|
+
import {HelmBioFilter} from '../widgets/bio-substructure-filter-helm';
|
|
12
18
|
|
|
13
19
|
import {_package} from '../package-test';
|
|
14
20
|
|
|
@@ -16,7 +22,7 @@ import {_package} from '../package-test';
|
|
|
16
22
|
category('substructureFilters', async () => {
|
|
17
23
|
let monomerLibHelper: IMonomerLibHelper;
|
|
18
24
|
/** Backup actual user's monomer libraries settings */
|
|
19
|
-
let userLibSettings:
|
|
25
|
+
let userLibSettings: UserLibSettings;
|
|
20
26
|
|
|
21
27
|
before(async () => {
|
|
22
28
|
monomerLibHelper = await getMonomerLibHelper();
|
|
@@ -34,17 +40,29 @@ category('substructureFilters', async () => {
|
|
|
34
40
|
});
|
|
35
41
|
|
|
36
42
|
test('fasta', async () => {
|
|
37
|
-
const
|
|
43
|
+
const df = await readDataframe('tests/filter_FASTA.csv');
|
|
44
|
+
await grok.data.detectSemanticTypes(df);
|
|
45
|
+
|
|
46
|
+
const fSubStr: string = 'MD';
|
|
47
|
+
const fTrueCount: number = 3;
|
|
48
|
+
|
|
38
49
|
const filter = new BioSubstructureFilter();
|
|
39
|
-
|
|
40
|
-
filter.
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
50
|
+
filter.attach(df);
|
|
51
|
+
await filter.awaitRendered();
|
|
52
|
+
try {
|
|
53
|
+
expect(!!filter.bioFilter, true);
|
|
54
|
+
expect(filter.bioFilter!.type, 'FastaBioFilter');
|
|
55
|
+
const bf = filter.bioFilter as FastaBioFilter;
|
|
56
|
+
|
|
57
|
+
await testEvent(df.onRowsFiltered, () => {}, () => {
|
|
58
|
+
bf.props = new BioFilterProps(fSubStr);
|
|
59
|
+
}, 5000, 'testEvent onRowsFiltered');
|
|
60
|
+
expect(filter.dataFrame!.filter.trueCount, fTrueCount);
|
|
61
|
+
expect(filter.dataFrame?.filter.toBinaryString(), '10010000100000');
|
|
62
|
+
} finally {
|
|
63
|
+
filter.detach();
|
|
64
|
+
}
|
|
65
|
+
await filter.awaitRendered();
|
|
48
66
|
});
|
|
49
67
|
|
|
50
68
|
test('separator', async () => {
|
|
@@ -52,49 +70,254 @@ category('substructureFilters', async () => {
|
|
|
52
70
|
const filter = new BioSubstructureFilter();
|
|
53
71
|
await grok.data.detectSemanticTypes(msa);
|
|
54
72
|
filter.attach(msa);
|
|
55
|
-
filter.
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
73
|
+
await filter.awaitRendered();
|
|
74
|
+
try {
|
|
75
|
+
expect(!!filter.bioFilter, true);
|
|
76
|
+
expect(filter.bioFilter!.type, 'SeparatorBioFilter');
|
|
77
|
+
const bf = filter.bioFilter as SeparatorBioFilter;
|
|
78
|
+
|
|
79
|
+
await testEvent(msa.onRowsFiltered, () => {}, () => {
|
|
80
|
+
bf.props = new SeparatorFilterProps('meI');
|
|
81
|
+
}, 5000, 'testEvent onRowsFiltered');
|
|
82
|
+
expect(filter.dataFrame!.filter.trueCount, 7);
|
|
83
|
+
expect(filter.dataFrame!.filter.get(2), false);
|
|
84
|
+
|
|
85
|
+
await testEvent(msa.onRowsFiltered, () => {}, () => {
|
|
86
|
+
bf.props = new SeparatorFilterProps('/meI');
|
|
87
|
+
}, 5000, 'testEvent onRowsFiltered');
|
|
88
|
+
expect(filter.dataFrame!.filter.trueCount, 0);
|
|
89
|
+
|
|
90
|
+
await testEvent(msa.onRowsFiltered, () => {}, () => {
|
|
91
|
+
bf.props = new SeparatorFilterProps('meI-hHis', '-');
|
|
92
|
+
}, 5000, 'testEvent onRowsFiltered');
|
|
93
|
+
expect(filter.dataFrame!.filter.trueCount, 7);
|
|
94
|
+
expect(filter.dataFrame!.filter.get(2), false);
|
|
95
|
+
} finally {
|
|
96
|
+
filter.detach();
|
|
97
|
+
}
|
|
98
|
+
await filter.awaitRendered();
|
|
67
99
|
});
|
|
68
100
|
|
|
69
|
-
test('helm', async () => {
|
|
70
|
-
|
|
71
|
-
|
|
101
|
+
// test('helm', async () => {
|
|
102
|
+
// const df = await readDataframe('tests/filter_HELM.csv');
|
|
103
|
+
// await grok.data.detectSemanticTypes(df);
|
|
104
|
+
// const view = grok.shell.addTableView(df);
|
|
105
|
+
//
|
|
106
|
+
// // // Helm filter calls waitForElementInDom
|
|
107
|
+
// // const fg = view.getFiltersGroup({createDefaultFilters: false});
|
|
108
|
+
// // _package.logger.debug('Bio tests: substructureFilters/helm, filter attaching.');
|
|
109
|
+
// // const filter = new BioSubstructureFilter();
|
|
110
|
+
// // filter.attach(df);
|
|
111
|
+
// // _package.logger.debug('Bio tests: substructureFilters/helm, filter attached.');
|
|
112
|
+
// // const fg = await df.plot.fromType(DG.VIEWER.FILTERS, {
|
|
113
|
+
// // filters: [
|
|
114
|
+
// // {type: 'Bio:bioSubstructureFilter', column: 'HELM string'}]
|
|
115
|
+
// // }) as DG.FilterGroup;
|
|
116
|
+
// // const fg2 = view.getFiltersGroup({createDefaultFilters: false});
|
|
117
|
+
// const fg = view.getFiltersGroup();
|
|
118
|
+
// await awaitCheck(() => fg.filters.length == 1, 'Filter panel has not been created', 3000);
|
|
119
|
+
// await awaitGrid(view.grid);
|
|
120
|
+
// const filter = fg.filters[0] as BioSubstructureFilter;
|
|
121
|
+
// // TODO: Check filter type
|
|
122
|
+
//
|
|
123
|
+
// _package.logger.debug('Bio tests: substructureFilters/helm, filter 1 changing.');
|
|
124
|
+
// const bf = filter.bioFilter as HelmBioFilter;
|
|
125
|
+
// await delay(1000); // to draw grid and filters
|
|
126
|
+
// await bf.awaitRendered();
|
|
127
|
+
//
|
|
128
|
+
// _package.logger.debug('Bio tests: substructureFilters/helm, filter 1 change awaiting.');
|
|
129
|
+
// await testEvent(df.onRowsFiltered, () => {}, () => {
|
|
130
|
+
// bf.props = new BioFilterProps('PEPTIDE1{C}$$$$V2.0');
|
|
131
|
+
// }, 20000);
|
|
132
|
+
// _package.logger.debug('Bio tests: substructureFilters/helm, filter 1 changed.');
|
|
133
|
+
// expect(filter.dataFrame!.filter.trueCount, 2);
|
|
134
|
+
// expect(filter.dataFrame!.filter.get(0), true);
|
|
135
|
+
// expect(filter.dataFrame!.filter.get(3), true);
|
|
136
|
+
//
|
|
137
|
+
// _package.logger.debug('Bio tests: substructureFilters/helm, filter 2 changing.');
|
|
138
|
+
// await testEvent(df.onRowsFiltered, () => {}, () => {
|
|
139
|
+
// bf.props = new BioFilterProps('PEPTIDE1{A.C}$$$$V2.0');
|
|
140
|
+
// }, 20000);
|
|
141
|
+
// await awaitGrid(view.grid);
|
|
142
|
+
// _package.logger.debug('Bio tests: substructureFilters/helm, filter 2 changed.');
|
|
143
|
+
// expect(filter.dataFrame!.filter.trueCount, 1);
|
|
144
|
+
// expect(filter.dataFrame!.filter.get(3), true);
|
|
145
|
+
// }, {timeout: 30000});
|
|
146
|
+
|
|
147
|
+
test('helm-dialog', async () => {
|
|
148
|
+
const logPrefix = 'Bio tests: substructureFilters/helm-dialog';
|
|
149
|
+
const df = await readDataframe('tests/filter_HELM.csv');
|
|
150
|
+
await grok.data.detectSemanticTypes(df);
|
|
151
|
+
const view = grok.shell.addTableView(df);
|
|
152
|
+
|
|
153
|
+
_package.logger.debug(`${logPrefix}, filter attaching.`);
|
|
72
154
|
const filter = new BioSubstructureFilter();
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
(
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
155
|
+
filter.attach(df);
|
|
156
|
+
const dlg = ui.dialog('Test filters').add(filter.root).show(); // to waitForElementInDom
|
|
157
|
+
await filter.awaitRendered();
|
|
158
|
+
try {
|
|
159
|
+
const bf = filter.bioFilter as HelmBioFilter;
|
|
160
|
+
expect(filter.bioFilter !== null, true, 'bioFilter is not created');
|
|
161
|
+
|
|
162
|
+
// filter 1
|
|
163
|
+
_package.logger.debug(`${logPrefix}, filter 1 change awaiting...`);
|
|
164
|
+
await testEvent(df.onRowsFiltered, () => {}, () => {
|
|
165
|
+
bf.props = new BioFilterProps('PEPTIDE1{A.C}$$$$V2.0');
|
|
166
|
+
}, 20000);
|
|
167
|
+
_package.logger.debug(`${logPrefix}, filter 1 changed.`);
|
|
168
|
+
expect(filter.dataFrame!.filter.trueCount, 1);
|
|
169
|
+
expect(filter.dataFrame!.filter.toBinaryString(), '0001');
|
|
170
|
+
|
|
171
|
+
// filter 2
|
|
172
|
+
_package.logger.debug(`${logPrefix}, filter 2 change awaiting...`);
|
|
173
|
+
await testEvent(df.onRowsFiltered, () => {}, () => {
|
|
174
|
+
bf.props = new BioFilterProps('PEPTIDE1{C}$$$$V2.0');
|
|
175
|
+
}, 20000);
|
|
176
|
+
await awaitGrid(view.grid);
|
|
177
|
+
_package.logger.debug(`${logPrefix}, filter 2 changed.`);
|
|
178
|
+
expect(filter.dataFrame!.filter.trueCount, 2);
|
|
179
|
+
expect(filter.dataFrame!.filter.toBinaryString(), '1001');
|
|
180
|
+
} finally {
|
|
181
|
+
dlg.close();
|
|
182
|
+
}
|
|
183
|
+
await filter.awaitRendered();
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
// Generates unhandled exception accessing isFiltering before bioFilter created
|
|
187
|
+
test('helm-view', async () => {
|
|
188
|
+
const logPrefix = 'Bio tests: substructureFilters/helm-view';
|
|
189
|
+
const df = await readDataframe('tests/filter_HELM.csv');
|
|
190
|
+
const col = df.getCol('HELM string');
|
|
191
|
+
await grok.data.detectSemanticTypes(df);
|
|
192
|
+
const view = grok.shell.addTableView(df);
|
|
193
|
+
|
|
194
|
+
const fg = view.getFiltersGroup();
|
|
195
|
+
|
|
196
|
+
// await awaitCheck(() => fg.filters.length == 1, 'await filters.length == 1', 1000);
|
|
197
|
+
// const filter = fg.filters.filter((f) => f.columnName == col.name)[0] as BioSubstructureFilter;
|
|
198
|
+
await awaitGrid(view.grid);
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
test('sync-fasta', async () => {
|
|
202
|
+
const df = await _package.files.readCsv('tests/filter_FASTA.csv');
|
|
203
|
+
await grok.data.detectSemanticTypes(df);
|
|
204
|
+
|
|
205
|
+
const fSubStr: string = 'MD';
|
|
206
|
+
const fTrueCount: number = 3;
|
|
207
|
+
|
|
208
|
+
const f1 = await createFilter('fasta', df);
|
|
209
|
+
const f2 = await createFilter('fasta', df);
|
|
210
|
+
await Promise.all([f1.awaitRendered(), f2.awaitRendered()]);
|
|
211
|
+
try {
|
|
212
|
+
expect(!!f1.bioFilter, true);
|
|
213
|
+
expect(!!f2.bioFilter, true);
|
|
214
|
+
expect(f1.bioFilter!.type, 'FastaBioFilter');
|
|
215
|
+
expect(f2.bioFilter!.type, 'FastaBioFilter');
|
|
216
|
+
const bf1 = f1.bioFilter as FastaBioFilter;
|
|
217
|
+
const bf2 = f2.bioFilter as FastaBioFilter;
|
|
218
|
+
|
|
219
|
+
await testEvent(df.onRowsFiltered, () => {}, () => {
|
|
220
|
+
bf1.props = new BioFilterProps(fSubStr);
|
|
221
|
+
}, 10000, 'await onRowsFiltered');
|
|
222
|
+
expect(df.filter.trueCount, fTrueCount);
|
|
223
|
+
|
|
224
|
+
await f1.awaitRendered();
|
|
225
|
+
expect(bf2.props.substructure, fSubStr);
|
|
226
|
+
} finally {
|
|
227
|
+
f1.detach();
|
|
228
|
+
f2.detach();
|
|
229
|
+
}
|
|
230
|
+
await Promise.all([f1.awaitRendered(), f2.awaitRendered()]);
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
// MSA filter has the second input field for separator
|
|
234
|
+
test('sync-msa', async () => {
|
|
235
|
+
const df = await _package.files.readCsv('tests/filter_MSA.csv');
|
|
236
|
+
await grok.data.detectSemanticTypes(df);
|
|
237
|
+
|
|
238
|
+
const fSubStr: string = 'hHis-Aca';
|
|
239
|
+
const fSepStr: string = '-';
|
|
240
|
+
const fTrueCount: number = 8;
|
|
241
|
+
|
|
242
|
+
const f1 = await createFilter('MSA', df);
|
|
243
|
+
const f2 = await createFilter('MSA', df);
|
|
244
|
+
await Promise.all([f1.awaitRendered(), f2.awaitRendered()]);
|
|
245
|
+
try {
|
|
246
|
+
expect(!!f1.bioFilter, true);
|
|
247
|
+
expect(!!f2.bioFilter, true);
|
|
248
|
+
expect(f1.bioFilter!.type, 'SeparatorBioFilter');
|
|
249
|
+
expect(f2.bioFilter!.type, 'SeparatorBioFilter');
|
|
250
|
+
const bf1 = f1.bioFilter as SeparatorBioFilter;
|
|
251
|
+
const bf2 = f2.bioFilter as SeparatorBioFilter;
|
|
252
|
+
|
|
253
|
+
await testEvent(df.onRowsFiltered, () => {}, () => {
|
|
254
|
+
bf1.props = new SeparatorFilterProps(fSubStr, fSepStr);
|
|
255
|
+
}, 10000, 'await onRowsFiltered');
|
|
256
|
+
expect(df.filter.trueCount, fTrueCount);
|
|
257
|
+
|
|
258
|
+
expect(bf2.props.substructure, fSubStr);
|
|
259
|
+
expect(bf2.props.separator, fSepStr);
|
|
260
|
+
} finally {
|
|
261
|
+
f1.detach();
|
|
262
|
+
f2.detach();
|
|
263
|
+
}
|
|
264
|
+
await Promise.all([f1.awaitRendered(), f2.awaitRendered()]);
|
|
265
|
+
});
|
|
266
|
+
|
|
267
|
+
test('sync-helm', async () => {
|
|
268
|
+
const df = await _package.files.readCsv('tests/filter_HELM.csv');
|
|
269
|
+
await grok.data.detectSemanticTypes(df);
|
|
270
|
+
const view = grok.shell.addTableView(df);
|
|
271
|
+
|
|
272
|
+
const fSubStr: string = 'PEPTIDE1{A.C}$$$$V2.0';
|
|
273
|
+
const fTrueCount: number = 1;
|
|
274
|
+
|
|
275
|
+
const f1 = await createFilter('HELM string', df);
|
|
276
|
+
const f2 = await createFilter('HELM string', df);
|
|
277
|
+
const dlg = ui.dialog('Test filters').add(f1.root).add(f2.root).show(); // to waitForElementInDom
|
|
278
|
+
await Promise.all([f1.awaitRendered(), f2.awaitRendered()]);
|
|
279
|
+
try {
|
|
280
|
+
expect(!!f1.bioFilter, true);
|
|
281
|
+
expect(!!f2.bioFilter, true);
|
|
282
|
+
expect(f1.bioFilter!.type, 'HelmBioFilter');
|
|
283
|
+
expect(f2.bioFilter!.type, 'HelmBioFilter');
|
|
284
|
+
const bf1 = f1.bioFilter as HelmBioFilter;
|
|
285
|
+
const bf2 = f2.bioFilter as HelmBioFilter;
|
|
286
|
+
|
|
287
|
+
await testEvent(df.onRowsFiltered, () => {}, () => {
|
|
288
|
+
bf1.props = new BioFilterProps(fSubStr);
|
|
289
|
+
}, 60000, 'await onRowsFiltered'); // wait to load monomers
|
|
290
|
+
await awaitGrid(view.grid);
|
|
291
|
+
//debugger;
|
|
292
|
+
|
|
293
|
+
_package.logger.debug('Bio tests: substructureFilters/sync-helm, before changed event');
|
|
294
|
+
await delay(f1.debounceTime * 2);
|
|
295
|
+
_package.logger.debug('Bio tests: substructureFilters/sync-helm, after changed event');
|
|
296
|
+
expect(df.filter.trueCount, fTrueCount);
|
|
297
|
+
|
|
298
|
+
await f1.awaitRendered();
|
|
299
|
+
expect(bf2.props.substructure, fSubStr);
|
|
300
|
+
} finally {
|
|
301
|
+
f1.detach();
|
|
302
|
+
f2.detach();
|
|
303
|
+
dlg.close();
|
|
304
|
+
}
|
|
305
|
+
await Promise.all([f1.awaitRendered(), f2.awaitRendered()]);
|
|
306
|
+
await awaitGrid(view.grid);
|
|
307
|
+
});
|
|
100
308
|
});
|
|
309
|
+
|
|
310
|
+
async function createFilter(colName: string, df: DG.DataFrame): Promise<BioSubstructureFilter> {
|
|
311
|
+
if (!df.columns.names().includes(colName)) {
|
|
312
|
+
throw new Error(`The column '${colName}' not found. ` +
|
|
313
|
+
`Available in data frame are ${JSON.stringify(df.columns.names())}`);
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
const filter = new BioSubstructureFilter();
|
|
317
|
+
filter.attach(df);
|
|
318
|
+
filter.applyState({columnName: colName});
|
|
319
|
+
filter.column = df.col(colName);
|
|
320
|
+
filter.columnName = colName;
|
|
321
|
+
//filter.tableName = df.name;
|
|
322
|
+
return filter;
|
|
323
|
+
};
|
|
@@ -11,8 +11,9 @@ import {IMonomerLib} from '@datagrok-libraries/bio/src/types/index';
|
|
|
11
11
|
import {ALPHABET, NOTATION, TAGS as bioTAGS} from '@datagrok-libraries/bio/src/utils/macromolecule';
|
|
12
12
|
import {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';
|
|
13
13
|
import {
|
|
14
|
-
getUserLibSettings,
|
|
14
|
+
getUserLibSettings, setUserLibSettings, setUserLibSettingsForTests
|
|
15
15
|
} from '@datagrok-libraries/bio/src/monomer-works/lib-settings';
|
|
16
|
+
import {UserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/types';
|
|
16
17
|
import {UnitsHandler} from '@datagrok-libraries/bio/src/utils/units-handler';
|
|
17
18
|
|
|
18
19
|
import {toAtomicLevel} from '../package';
|
|
@@ -21,22 +22,30 @@ import {_package} from '../package-test';
|
|
|
21
22
|
const appPath = 'System:AppData/Bio';
|
|
22
23
|
const fileSource = new DG.FileSource(appPath);
|
|
23
24
|
|
|
24
|
-
const
|
|
25
|
-
PT
|
|
26
|
-
DNA
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
const inputPath: { [k: string]: string } = {
|
|
31
|
-
PT: 'tests/to-atomic-level-peptides-fasta-input.csv',
|
|
32
|
-
DNA: 'tests/to-atomic-level-dna-fasta-input.csv',
|
|
33
|
-
MSA: 'tests/to-atomic-level-msa-separator-input.csv',
|
|
34
|
-
};
|
|
25
|
+
const enum Tests {
|
|
26
|
+
PT = 'peptides-fasta',
|
|
27
|
+
DNA = 'dna-fasta',
|
|
28
|
+
MSA_SEPARATOR = 'msa-separator',
|
|
29
|
+
MSA_FASTA = 'msa-fasta',
|
|
30
|
+
}
|
|
35
31
|
|
|
36
|
-
const
|
|
37
|
-
PT:
|
|
38
|
-
|
|
39
|
-
|
|
32
|
+
const TestsData: { [testName: string]: { inPath: string, outPath: string } } = {
|
|
33
|
+
[Tests.PT]: {
|
|
34
|
+
inPath: 'tests/to-atomic-level-peptides-fasta-input.csv',
|
|
35
|
+
outPath: 'tests/to-atomic-level-peptides-fasta-output.csv'
|
|
36
|
+
},
|
|
37
|
+
[Tests.DNA]: {
|
|
38
|
+
inPath: 'tests/to-atomic-level-dna-fasta-input.csv',
|
|
39
|
+
outPath: 'tests/to-atomic-level-dna-fasta-output.csv'
|
|
40
|
+
},
|
|
41
|
+
[Tests.MSA_SEPARATOR]: {
|
|
42
|
+
inPath: 'tests/to-atomic-level-msa-separator-input.csv',
|
|
43
|
+
outPath: 'tests/to-atomic-level-msa-separator-output.csv'
|
|
44
|
+
},
|
|
45
|
+
[Tests.MSA_FASTA]: {
|
|
46
|
+
inPath: 'tests/to-atomic-level-msa-fasta-input.csv',
|
|
47
|
+
outPath: 'tests/to-atomic-level-msa-fasta-output.csv'
|
|
48
|
+
},
|
|
40
49
|
};
|
|
41
50
|
|
|
42
51
|
const inputColName = 'sequence';
|
|
@@ -48,7 +57,7 @@ category('toAtomicLevel', async () => {
|
|
|
48
57
|
|
|
49
58
|
let monomerLibHelper: IMonomerLibHelper;
|
|
50
59
|
/** Backup actual user's monomer libraries settings */
|
|
51
|
-
let userLibSettings:
|
|
60
|
+
let userLibSettings: UserLibSettings;
|
|
52
61
|
|
|
53
62
|
before(async () => {
|
|
54
63
|
monomerLibHelper = await getMonomerLibHelper();
|
|
@@ -57,10 +66,12 @@ category('toAtomicLevel', async () => {
|
|
|
57
66
|
await setUserLibSettingsForTests();
|
|
58
67
|
await monomerLibHelper.loadLibraries(true);
|
|
59
68
|
|
|
60
|
-
for (const
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
69
|
+
for (const [testName, testData] of Object.entries(TestsData)) {
|
|
70
|
+
const inputPath = testData.inPath;
|
|
71
|
+
|
|
72
|
+
sourceDf[testName] = DG.DataFrame.fromCsv((await fileSource.readAsText(testData.inPath)).replace(/\n$/, ''));
|
|
73
|
+
await grok.data.detectSemanticTypes(sourceDf[testName]);
|
|
74
|
+
targetDf[testName] = DG.DataFrame.fromCsv((await fileSource.readAsText(testData.outPath)).replace(/\n$/, ''));
|
|
64
75
|
}
|
|
65
76
|
});
|
|
66
77
|
|
|
@@ -79,9 +90,9 @@ category('toAtomicLevel', async () => {
|
|
|
79
90
|
expectArray(obtainedArray, expectedArray);
|
|
80
91
|
}
|
|
81
92
|
|
|
82
|
-
for (const
|
|
83
|
-
test(`${
|
|
84
|
-
await getTestResult(sourceDf[
|
|
93
|
+
for (const [testName, testData] of Object.entries(TestsData)) {
|
|
94
|
+
test(`${testName}`, async () => {
|
|
95
|
+
await getTestResult(sourceDf[testName], targetDf[testName]);
|
|
85
96
|
});
|
|
86
97
|
}
|
|
87
98
|
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import * as grok from 'datagrok-api/grok';
|
|
2
2
|
import * as ui from 'datagrok-api/ui';
|
|
3
3
|
import * as DG from 'datagrok-api/dg';
|
|
4
|
+
|
|
4
5
|
import {ALIGNMENT, ALPHABET, NOTATION, TAGS as bioTAGS} from '@datagrok-libraries/bio/src/utils/macromolecule';
|
|
5
|
-
import {
|
|
6
|
+
import {expect} from '@datagrok-libraries/utils/src/test';
|
|
7
|
+
|
|
8
|
+
import {awaitGrid} from '../utils';
|
|
6
9
|
|
|
7
10
|
|
|
8
11
|
export function generateManySequences(): DG.Column[] {
|
|
@@ -32,8 +35,8 @@ export async function performanceTest(generateFunc: () => DG.Column[], testName:
|
|
|
32
35
|
const col: DG.Column = df.columns.byName('MSA');
|
|
33
36
|
const view: DG.TableView = grok.shell.addTableView(df);
|
|
34
37
|
|
|
35
|
-
await
|
|
36
|
-
|
|
38
|
+
await awaitGrid(view.grid);
|
|
39
|
+
expect(view.grid.dataFrame.id, df.id);
|
|
37
40
|
|
|
38
41
|
const endTime: number = Date.now();
|
|
39
42
|
const elapsedTime: number = endTime - startTime;
|
package/src/tests/utils.ts
CHANGED
|
@@ -3,6 +3,8 @@ import * as grok from 'datagrok-api/grok';
|
|
|
3
3
|
|
|
4
4
|
import {delay, expect, testEvent} from '@datagrok-libraries/utils/src/test';
|
|
5
5
|
|
|
6
|
+
import {startDockerContainer} from '../utils/docker';
|
|
7
|
+
|
|
6
8
|
import {_package} from '../package-test';
|
|
7
9
|
|
|
8
10
|
export async function loadFileAsText(name: string): Promise<string> {
|
|
@@ -34,12 +36,10 @@ export function _testTableIsNotEmpty(table: DG.DataFrame): void {
|
|
|
34
36
|
|
|
35
37
|
/** Waits if container is not started
|
|
36
38
|
* @param {number} ms - time to wait in milliseconds */
|
|
37
|
-
export async function awaitContainerStart(ms: number =
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
// TODO: Enable with new JS API version
|
|
42
|
-
// await grok.dapi.docker.dockerContainers.run(container.id, true);
|
|
39
|
+
export async function awaitContainerStart(ms: number = 30000): Promise<void> {
|
|
40
|
+
const dc = await grok.dapi.docker.dockerContainers.filter('bio').first();
|
|
41
|
+
const dcId = dc.id;
|
|
42
|
+
await startDockerContainer(dcId, ms);
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
export async function awaitGrid(grid: DG.Grid, timeout: number = 5000): Promise<void> {
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import * as grok from 'datagrok-api/grok';
|
|
2
|
+
import * as ui from 'datagrok-api/ui';
|
|
3
|
+
import * as DG from 'datagrok-api/dg';
|
|
4
|
+
import {delay} from '@datagrok-libraries/utils/src/test';
|
|
5
|
+
|
|
6
|
+
export async function startDockerContainer(dcId: string, timeout: number = 30000): Promise<void> {
|
|
7
|
+
// TODO: Use the new dockerContainers API
|
|
8
|
+
const res = await grok.dapi.docker.dockerContainers.run(dcId /*, true */);
|
|
9
|
+
let end: boolean = false;
|
|
10
|
+
for (let i = 0; i < timeout / 200; ++i) {
|
|
11
|
+
const dc = await grok.dapi.docker.dockerContainers.find(dcId);
|
|
12
|
+
switch (dc.status) {
|
|
13
|
+
case 'stopped': {
|
|
14
|
+
await grok.dapi.docker.dockerContainers.run(dcId);
|
|
15
|
+
break;
|
|
16
|
+
}
|
|
17
|
+
case 'pending change':
|
|
18
|
+
case 'changing': {
|
|
19
|
+
// skip to wait
|
|
20
|
+
break;
|
|
21
|
+
}
|
|
22
|
+
case 'checking':
|
|
23
|
+
case 'started': {
|
|
24
|
+
end = true;
|
|
25
|
+
break;
|
|
26
|
+
}
|
|
27
|
+
case 'error': {
|
|
28
|
+
throw new Error('Docker container error state.');
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
if (end) break;
|
|
32
|
+
await delay(200);
|
|
33
|
+
}
|
|
34
|
+
if (!end) throw new Error('Docker container run timeout.');
|
|
35
|
+
// this.dc = await grok.dapi.docker.dockerContainers.find(dcId);
|
|
36
|
+
}
|
|
@@ -5,11 +5,11 @@ import * as DG from 'datagrok-api/dg';
|
|
|
5
5
|
|
|
6
6
|
import {MolfileHandler} from '@datagrok-libraries/chem-meta/src/parsing-utils/molfile-handler';
|
|
7
7
|
import {MolfileHandlerBase} from '@datagrok-libraries/chem-meta/src/parsing-utils/molfile-handler-base';
|
|
8
|
-
import {
|
|
8
|
+
import {RDModule} from '@datagrok-libraries/chem-meta/src/rdkit-api';
|
|
9
9
|
import {HELM_POLYMER_TYPE, HELM_RGROUP_FIELDS} from '@datagrok-libraries/bio/src/utils/const';
|
|
10
10
|
import {errInfo} from '@datagrok-libraries/bio/src/utils/err-info';
|
|
11
11
|
|
|
12
|
-
import {
|
|
12
|
+
import {MonomerLibManager} from './monomer-lib/lib-manager';
|
|
13
13
|
|
|
14
14
|
import {_package} from '../package';
|
|
15
15
|
|
|
@@ -173,7 +173,7 @@ class MonomerWrapper {
|
|
|
173
173
|
monomerSymbol: string,
|
|
174
174
|
polymerType: HELM_POLYMER_TYPE,
|
|
175
175
|
) {
|
|
176
|
-
const monomerLib =
|
|
176
|
+
const monomerLib = MonomerLibManager.instance.getBioLib();
|
|
177
177
|
const monomer = monomerLib.getMonomer(polymerType, monomerSymbol);
|
|
178
178
|
if (!monomer)
|
|
179
179
|
throw new Error(`Monomer ${monomerSymbol} is not found in the library`);
|