@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.
Files changed (65) hide show
  1. package/CHANGELOG.md +25 -1
  2. package/dist/36.js +1 -1
  3. package/dist/36.js.map +1 -1
  4. package/dist/42.js +1 -1
  5. package/dist/42.js.map +1 -1
  6. package/dist/590.js +2 -0
  7. package/dist/590.js.map +1 -0
  8. package/dist/709.js +1 -2
  9. package/dist/709.js.map +1 -1
  10. package/dist/79.js.map +1 -1
  11. package/dist/895.js +3 -0
  12. package/dist/895.js.map +1 -0
  13. package/dist/package-test.js +8 -1
  14. package/dist/package-test.js.LICENSE.txt +1 -0
  15. package/dist/package-test.js.map +1 -1
  16. package/dist/package.js +8 -1
  17. package/dist/package.js.LICENSE.txt +1 -0
  18. package/dist/package.js.map +1 -1
  19. package/files/{data → monomer-libraries}/HELMCoreLibrary.json +594 -594
  20. package/files/tests/libraries/HELMmonomerSchema.json +96 -0
  21. package/files/tests/to-atomic-level-msa-fasta-input.csv +10 -0
  22. package/files/tests/to-atomic-level-msa-fasta-output.csv +2178 -0
  23. package/package.json +15 -13
  24. package/scripts/sequence_generator.md +48 -0
  25. package/scripts/sequence_generator.py +515 -256
  26. package/src/package-test.ts +4 -0
  27. package/src/package.ts +37 -33
  28. package/src/tests/WebLogo-layout-tests.ts +37 -0
  29. package/src/tests/WebLogo-positions-test.ts +5 -0
  30. package/src/tests/WebLogo-project-tests.ts +63 -0
  31. package/src/tests/activity-cliffs-tests.ts +3 -2
  32. package/src/tests/monomer-libraries-tests.ts +7 -4
  33. package/src/tests/msa-tests.ts +2 -2
  34. package/src/tests/pepsea-tests.ts +1 -1
  35. package/src/tests/renderers-test.ts +16 -16
  36. package/src/tests/scoring.ts +3 -2
  37. package/src/tests/splitters-test.ts +7 -12
  38. package/src/tests/substructure-filters-tests.ts +280 -57
  39. package/src/tests/to-atomic-level-tests.ts +35 -24
  40. package/src/tests/utils/sequences-generators.ts +6 -3
  41. package/src/tests/utils.ts +6 -6
  42. package/src/utils/docker.ts +36 -0
  43. package/src/utils/helm-to-molfile.ts +3 -3
  44. package/src/utils/monomer-lib/lib-manager.ts +116 -0
  45. package/src/utils/monomer-lib/library-file-manager/consts.ts +1 -0
  46. package/src/utils/monomer-lib/library-file-manager/custom-monomer-lib-handlers.ts +80 -0
  47. package/src/utils/monomer-lib/library-file-manager/event-manager.ts +58 -0
  48. package/src/utils/monomer-lib/library-file-manager/file-manager.ts +187 -0
  49. package/src/utils/monomer-lib/library-file-manager/file-validator.ts +56 -0
  50. package/src/utils/monomer-lib/library-file-manager/style.css +8 -0
  51. package/src/utils/monomer-lib/library-file-manager/ui.ts +224 -0
  52. package/src/utils/monomer-lib/monomer-lib.ts +114 -0
  53. package/src/utils/poly-tool/const.ts +28 -0
  54. package/src/utils/poly-tool/monomer-lib-handler.ts +115 -0
  55. package/src/utils/poly-tool/types.ts +6 -0
  56. package/src/utils/poly-tool/ui.ts +2 -2
  57. package/src/viewers/vd-regions-viewer.ts +9 -4
  58. package/src/viewers/web-logo-viewer.ts +10 -5
  59. package/src/widgets/bio-substructure-filter-helm.ts +168 -0
  60. package/src/widgets/bio-substructure-filter-types.ts +131 -0
  61. package/src/widgets/bio-substructure-filter.ts +218 -175
  62. package/src/widgets/composition-analysis-widget.ts +1 -1
  63. package/files/libraries/HELMCoreLibrary.json +0 -18218
  64. package/src/utils/monomer-lib.ts +0 -305
  65. /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
- LibSettings, getUserLibSettings, setUserLibSettings, setUserLibSettingsForTests
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 {BioSubstructureFilter, HelmFilter, SeparatorFilter} from '../widgets/bio-substructure-filter';
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: LibSettings;
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 fasta = await readDataframe('tests/filter_FASTA.csv');
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
- await grok.data.detectSemanticTypes(fasta);
40
- filter.attach(fasta);
41
- filter.bioFilter!.substructure = 'MD';
42
- await delay(100);
43
- expect(filter.dataFrame!.filter.trueCount, 3);
44
- expect(filter.dataFrame!.filter.get(0), true);
45
- expect(filter.dataFrame!.filter.get(3), true);
46
- expect(filter.dataFrame!.filter.get(8), true);
47
- expect(filter.dataFrame!.filter.get(1), false);
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.bioFilter!.substructure = 'meI';
56
- await delay(100);
57
- expect(filter.dataFrame!.filter.trueCount, 7);
58
- expect(filter.dataFrame!.filter.get(2), false);
59
- filter.bioFilter!.substructure = '/meI';
60
- await delay(100);
61
- expect(filter.dataFrame!.filter.trueCount, 0);
62
- filter.bioFilter!.substructure = 'meI-hHis';
63
- (filter.bioFilter! as SeparatorFilter).separatorInput.value = '-';
64
- await delay(100);
65
- expect(filter.dataFrame!.filter.trueCount, 7);
66
- expect(filter.dataFrame!.filter.get(2), false);
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
- const helm = await readDataframe('tests/filter_HELM.csv');
71
- const helmTableView = grok.shell.addTableView(helm);
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
- await grok.data.detectSemanticTypes(helm);
74
-
75
- _package.logger.debug('Bio/substructureFilters/helm, filter attaching.');
76
- filter.attach(helm);
77
- _package.logger.debug('Bio/substructureFilters/helm, filter attached.');
78
-
79
- _package.logger.debug('Bio/substructureFilters/helm, filter 1 changing.');
80
- (filter.bioFilter! as HelmFilter).helmSubstructure = 'PEPTIDE1{C}$$$$V2.0';
81
-
82
- _package.logger.debug('Bio/substructureFilters/helm, filter 1 change awaiting.');
83
- await testEvent(helm.onRowsFiltered, () => {},
84
- () => { filter.bioFilter!.onChanged.next(); }, 20000);
85
- _package.logger.debug('Bio/substructureFilters/helm, filter 1 changed.');
86
- expect(filter.dataFrame!.filter.trueCount, 2);
87
- expect(filter.dataFrame!.filter.get(0), true);
88
- expect(filter.dataFrame!.filter.get(3), true);
89
-
90
- _package.logger.debug('Bio/substructureFilters/helm, filter 2 changing.');
91
- (filter.bioFilter! as HelmFilter).helmSubstructure = 'PEPTIDE1{A.C}$$$$V2.0';
92
- _package.logger.debug('Bio/substructureFilters/helm, filter 2 change awaiting.');
93
- await testEvent(helm.onRowsFiltered, () => {},
94
- () => { filter.bioFilter!.onChanged.next(); }, 20000);
95
- await awaitGrid(helmTableView.grid);
96
- _package.logger.debug('Bio/substructureFilters/helm, filter 2 changed.');
97
- expect(filter.dataFrame!.filter.trueCount, 1);
98
- expect(filter.dataFrame!.filter.get(3), true);
99
- }, {timeout: 30000});
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, LibSettings, setUserLibSettings, setUserLibSettingsForTests
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 testNames: { [k: string]: string } = {
25
- PT: 'peptides-fasta',
26
- DNA: 'dna-fasta',
27
- MSA: 'msa-separator',
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 outputPath: { [k: string]: string } = {
37
- PT: 'tests/to-atomic-level-peptides-fasta-output.csv',
38
- DNA: 'tests/to-atomic-level-dna-fasta-output.csv',
39
- MSA: 'tests/to-atomic-level-msa-separator-output.csv',
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: LibSettings;
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 key in testNames) {
61
- sourceDf[key] = DG.DataFrame.fromCsv((await fileSource.readAsText(inputPath[key])).replace(/\n$/, ''));
62
- await grok.data.detectSemanticTypes(sourceDf[key]);
63
- targetDf[key] = DG.DataFrame.fromCsv((await fileSource.readAsText(outputPath[key])).replace(/\n$/, ''));
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 key in testNames) {
83
- test(`${testNames[key]}`, async () => {
84
- await getTestResult(sourceDf[key], targetDf[key]);
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 {awaitCheck} from '@datagrok-libraries/utils/src/test';
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 awaitCheck(() => { return view.grid.dataFrame !== df; },
36
- 'View grid has wrong data frame ', 100);
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;
@@ -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 = 10000): Promise<void> {
38
- const container = await grok.dapi.docker.dockerContainers.filter('bio').first();
39
- if (container.status !== 'started' && container.status !== 'checking')
40
- await delay(ms);
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 {RDMol, RDModule} from '@datagrok-libraries/chem-meta/src/rdkit-api';
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 {MonomerLibHelper} from './monomer-lib';
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 = MonomerLibHelper.instance.getBioLib();
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`);