@datagrok/bio 2.15.13 → 2.16.0

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 (78) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/detectors.js +16 -11
  3. package/dist/455.js.map +1 -1
  4. package/dist/980.js +1 -1
  5. package/dist/980.js.map +1 -1
  6. package/dist/package-test.js +6 -6
  7. package/dist/package-test.js.map +1 -1
  8. package/dist/package.js +3 -3
  9. package/dist/package.js.map +1 -1
  10. package/package.json +5 -5
  11. package/src/analysis/sequence-activity-cliffs.ts +3 -4
  12. package/src/analysis/sequence-diversity-viewer.ts +5 -3
  13. package/src/analysis/sequence-similarity-viewer.ts +8 -5
  14. package/src/analysis/sequence-space.ts +3 -2
  15. package/src/calculations/monomerLevelMols.ts +3 -3
  16. package/src/demo/bio01-similarity-diversity.ts +4 -1
  17. package/src/package-test.ts +1 -1
  18. package/src/package-types.ts +35 -2
  19. package/src/package.ts +57 -71
  20. package/src/tests/WebLogo-layout-tests.ts +1 -1
  21. package/src/tests/WebLogo-positions-test.ts +11 -5
  22. package/src/tests/WebLogo-project-tests.ts +1 -1
  23. package/src/tests/activity-cliffs-utils.ts +11 -14
  24. package/src/tests/bio-tests.ts +85 -79
  25. package/src/tests/checkInputColumn-tests.ts +15 -10
  26. package/src/tests/converters-test.ts +12 -5
  27. package/src/tests/detectors-benchmark-tests.ts +5 -2
  28. package/src/tests/detectors-tests.ts +51 -44
  29. package/src/tests/detectors-weak-and-likely-tests.ts +12 -5
  30. package/src/tests/fasta-export-tests.ts +13 -5
  31. package/src/tests/helm-tests.ts +85 -0
  32. package/src/tests/mm-distance-tests.ts +14 -7
  33. package/src/tests/monomer-libraries-tests.ts +1 -1
  34. package/src/tests/msa-tests.ts +33 -24
  35. package/src/tests/renderers-monomer-placer-tests.ts +2 -5
  36. package/src/tests/renderers-test.ts +15 -9
  37. package/src/tests/scoring.ts +9 -6
  38. package/src/tests/seq-handler-get-helm-tests.ts +7 -5
  39. package/src/tests/seq-handler-get-region-tests.ts +9 -3
  40. package/src/tests/seq-handler-splitted-tests.ts +11 -5
  41. package/src/tests/seq-handler-tests.ts +17 -10
  42. package/src/tests/sequence-space-utils.ts +9 -4
  43. package/src/tests/splitters-test.ts +5 -4
  44. package/src/tests/substructure-filters-tests.ts +16 -13
  45. package/src/tests/to-atomic-level-tests.ts +5 -3
  46. package/src/tests/to-atomic-level-ui-tests.ts +4 -1
  47. package/src/tests/utils/detectors-utils.ts +4 -4
  48. package/src/utils/calculate-scores.ts +11 -9
  49. package/src/utils/cell-renderer-custom.ts +27 -17
  50. package/src/utils/cell-renderer.ts +14 -8
  51. package/src/utils/check-input-column.ts +13 -9
  52. package/src/utils/context-menu.ts +4 -4
  53. package/src/utils/convert.ts +21 -14
  54. package/src/utils/get-region-func-editor.ts +8 -5
  55. package/src/utils/get-region.ts +4 -5
  56. package/src/utils/helm-to-molfile/converter/helm.ts +4 -4
  57. package/src/utils/helm-to-molfile/utils.ts +5 -6
  58. package/src/utils/macromolecule-column-widget.ts +6 -7
  59. package/src/utils/monomer-cell-renderer-base.ts +8 -1
  60. package/src/utils/monomer-lib/lib-manager.ts +3 -2
  61. package/src/utils/monomer-lib/monomer-colors.ts +10 -10
  62. package/src/utils/monomer-lib/monomer-lib-base.ts +6 -1
  63. package/src/utils/monomer-lib/monomer-lib.ts +15 -9
  64. package/src/utils/multiple-sequence-alignment-ui.ts +30 -30
  65. package/src/utils/save-as-fasta.ts +19 -12
  66. package/src/utils/seq-helper/seq-handler.ts +859 -0
  67. package/src/utils/seq-helper/seq-helper.ts +11 -21
  68. package/src/utils/sequence-to-mol.ts +7 -8
  69. package/src/utils/split-to-monomers.ts +7 -2
  70. package/src/utils/types.ts +8 -7
  71. package/src/utils/ui-utils.ts +2 -2
  72. package/src/viewers/web-logo-viewer.ts +18 -16
  73. package/src/widgets/bio-substructure-filter.ts +1 -2
  74. package/src/widgets/composition-analysis-widget.ts +6 -6
  75. package/src/widgets/representations.ts +7 -4
  76. package/src/tests/detectors-custom-notation-tests.ts +0 -37
  77. package/src/utils/cyclized.ts +0 -89
  78. package/src/utils/dimerized.ts +0 -10
@@ -5,12 +5,12 @@ import * as ui from 'datagrok-api/ui';
5
5
  import $ from 'cash-dom';
6
6
  import {fromEvent} from 'rxjs';
7
7
 
8
- import {category, expect, test, delay, testEvent} from '@datagrok-libraries/utils/src/test';
8
+ import {category, expect, test, delay, testEvent, before} from '@datagrok-libraries/utils/src/test';
9
9
  import {ALIGNMENT, ALPHABET, NOTATION, TAGS as bioTAGS} from '@datagrok-libraries/bio/src/utils/macromolecule';
10
- import {SeqHandler} from '@datagrok-libraries/bio/src/utils/seq-handler';
10
+ import {ISeqHelper, getSeqHelper} from '@datagrok-libraries/bio/src/utils/seq-helper';
11
+ import {ISeqHandler} from '@datagrok-libraries/bio/src/utils/macromolecule/seq-handler';
11
12
  import {generateLongSequence, generateManySequences} from '@datagrok-libraries/bio/src/utils/generator';
12
13
 
13
- import {importFasta} from '../package';
14
14
  import {convertDo} from '../utils/convert';
15
15
  import {performanceTest} from './utils/sequences-generators';
16
16
  import {multipleSequenceAlignmentUI} from '../utils/multiple-sequence-alignment-ui';
@@ -20,6 +20,12 @@ import * as C from '../utils/constants';
20
20
  import {_package} from '../package-test';
21
21
 
22
22
  category('renderers', () => {
23
+ let seqHelper: ISeqHelper;
24
+
25
+ before(async () => {
26
+ seqHelper = await getSeqHelper();
27
+ });
28
+
23
29
  test('long sequence performance ', async () => {
24
30
  await performanceTest(generateLongSequence, 'Long sequences');
25
31
  });
@@ -124,7 +130,7 @@ category('renderers', () => {
124
130
 
125
131
  async function _testAfterMsa() {
126
132
  const fastaTxt: string = await grok.dapi.files.readAsText('System:AppData/Bio/samples/FASTA.fasta');
127
- const df: DG.DataFrame = importFasta(fastaTxt)[0];
133
+ const df = (await grok.functions.call('Bio:importFasta', {fileContent: fastaTxt}))[0] as DG.DataFrame;
128
134
 
129
135
  const srcSeqCol: DG.Column = df.getCol('sequence');
130
136
  const semType: string = await grok.functions.call('Bio:detectMacromolecule', {col: srcSeqCol});
@@ -148,7 +154,7 @@ category('renderers', () => {
148
154
  expect(srcSeqCol.getTag(bioTAGS.alphabet), ALPHABET.PT);
149
155
  expect(srcSeqCol.getTag(DG.TAGS.CELL_RENDERER), 'sequence');
150
156
 
151
- const msaSeqCol = await multipleSequenceAlignmentUI({col: srcSeqCol});
157
+ const msaSeqCol = await multipleSequenceAlignmentUI({col: srcSeqCol}, seqHelper);
152
158
  await awaitGrid(tv.grid);
153
159
  expect(tv.grid.dataFrame.id, df.id);
154
160
 
@@ -159,7 +165,7 @@ category('renderers', () => {
159
165
  expect(msaSeqCol.getTag(DG.TAGS.CELL_RENDERER), 'sequence');
160
166
 
161
167
  // check newColumn with SeqHandler constructor
162
- const _sh: SeqHandler = SeqHandler.forColumn(msaSeqCol);
168
+ const _sh: ISeqHandler = seqHelper.getSeqHandler(msaSeqCol);
163
169
  }
164
170
 
165
171
  async function _testAfterConvert() {
@@ -175,7 +181,7 @@ category('renderers', () => {
175
181
  // call to calculate 'cell.renderer' tag
176
182
  await grok.data.detectSemanticTypes(df);
177
183
 
178
- const tgtCol: DG.Column = await convertDo(srcCol, NOTATION.SEPARATOR, '/');
184
+ const tgtCol: DG.Column = await convertDo(srcCol, seqHelper, NOTATION.SEPARATOR, '/');
179
185
  await awaitGrid(tv.grid);
180
186
  expect(tv.grid.dataFrame.id, df.id);
181
187
 
@@ -183,7 +189,7 @@ category('renderers', () => {
183
189
  expect(resCellRenderer, 'sequence');
184
190
 
185
191
  // check tgtCol with SeqHandler constructor
186
- const _sh: SeqHandler = SeqHandler.forColumn(tgtCol);
192
+ const _sh: ISeqHandler = seqHelper.getSeqHandler(tgtCol);
187
193
  }
188
194
 
189
195
  async function _testAfterConvertToHelm() {
@@ -192,7 +198,7 @@ category('renderers', () => {
192
198
  await awaitGrid(view.grid);
193
199
 
194
200
  const srcCol = df.getCol('sequence');
195
- const sh = SeqHandler.forColumn(srcCol);
201
+ const sh = seqHelper.getSeqHandler(srcCol);
196
202
  const tgtCol = sh.convert(NOTATION.HELM);
197
203
  df.columns.add(tgtCol);
198
204
  await awaitGrid(view.grid);
@@ -6,9 +6,8 @@ import wu from 'wu';
6
6
 
7
7
  import {category, test, expectFloat, before, after, expect} from '@datagrok-libraries/utils/src/test';
8
8
  import {NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';
9
- import {IMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';
9
+ import {IMonomerLibHelper, getMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';
10
10
 
11
- import {getMonomerLibHelper, sequenceIdentityScoring, sequenceSimilarityScoring} from '../package';
12
11
  import {
13
12
  getUserLibSettings, setUserLibSettings
14
13
  } from '@datagrok-libraries/bio/src/monomer-works/lib-settings';
@@ -51,7 +50,8 @@ PEPTIDE1{[1Nal].[1Nal].[1Nal].[1Nal].[1Nal].[1Nal].[1Nal].[1Nal].[1Nal].[1Nal].[
51
50
  });
52
51
 
53
52
  test('Identity', async () => {
54
- const scoresCol = await sequenceIdentityScoring(table, seqCol, reference);
53
+ const scoresCol = await grok.functions.call('Bio:sequenceIdentityScoring',
54
+ {table: table, macromolecule: seqCol, reference: reference}) as DG.Column<number>;
55
55
  for (let i = 0; i < scoresCol.length; i++) {
56
56
  const resScore = scoresCol.get(i)!;
57
57
  const tgtScore = table.get(expectedIdentity, i);
@@ -61,19 +61,22 @@ PEPTIDE1{[1Nal].[1Nal].[1Nal].[1Nal].[1Nal].[1Nal].[1Nal].[1Nal].[1Nal].[1Nal].[
61
61
  });
62
62
 
63
63
  test('Identity-shortReference', async () => {
64
- const scoresCol = await sequenceIdentityScoring(table, seqCol, shortReference);
64
+ const scoresCol = await grok.functions.call('Bio:sequenceIdentityScoring',
65
+ {table: table, macromolecule: seqCol, reference: shortReference}) as DG.Column<number>;
65
66
  expect(wu.count(0).take(scoresCol.length).map((rowI) => scoresCol.get(rowI))
66
67
  .every((v) => v != null && !isNaN(v)), true);
67
68
  });
68
69
 
69
70
  test('Identity-longReference', async () => {
70
- const scoresCol = await sequenceIdentityScoring(table, seqCol, longReference);
71
+ const scoresCol = await grok.functions.call('Bio:sequenceIdentityScoring',
72
+ {table: table, macromolecule: seqCol, reference: longReference}) as DG.Column<number>;
71
73
  expect(wu.count(0).take(scoresCol.length).map((rowI) => scoresCol.get(rowI))
72
74
  .every((v) => v != null && !isNaN(v)), true);
73
75
  });
74
76
 
75
77
  test('Similarity', async () => {
76
- const scoresCol = await sequenceSimilarityScoring(table, seqCol, reference);
78
+ const scoresCol = await grok.functions.call('Bio:sequenceSimilarityScoring',
79
+ {table: table, macromolecule: seqCol, reference: reference}) as DG.Column<number>;
77
80
  for (let i = 0; i < scoresCol.length; i++) {
78
81
  const resScore = scoresCol.get(i)!;
79
82
  const tgtScore = table.get(expectedSimilarity, i);
@@ -3,17 +3,19 @@ import * as ui from 'datagrok-api/ui';
3
3
  import * as DG from 'datagrok-api/dg';
4
4
 
5
5
  import {after, before, category, expect, test} from '@datagrok-libraries/utils/src/test';
6
- import {SeqHandler} from '@datagrok-libraries/bio/src/utils/seq-handler';
7
- import {NOTATION, TAGS} from '@datagrok-libraries/bio/src/utils/macromolecule';
6
+ import {ISeqHelper, getSeqHelper} from '@datagrok-libraries/bio/src/utils/seq-helper';
7
+ import {NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';
8
8
  import {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';
9
9
  import {getUserLibSettings, setUserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/lib-settings';
10
10
  import {UserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/types';
11
11
 
12
12
  category('SeqHandler: getHelm', () => {
13
+ let seqHelper: ISeqHelper;
13
14
  let monomerLibHelper: IMonomerLibHelper;
14
15
  let userLibSettings: UserLibSettings; // backup
15
16
 
16
17
  before(async () => {
18
+ seqHelper = await getSeqHelper();
17
19
  monomerLibHelper = await getMonomerLibHelper();
18
20
  userLibSettings = await getUserLibSettings();
19
21
 
@@ -26,7 +28,6 @@ category('SeqHandler: getHelm', () => {
26
28
  await monomerLibHelper.loadMonomerLib(true); // load user settings libraries
27
29
  });
28
30
 
29
-
30
31
  const tests: {
31
32
  [testName: string]: {
32
33
  src: {
@@ -79,8 +80,9 @@ category('SeqHandler: getHelm', () => {
79
80
  // if (srcSeparator) seqCol.setTag(TAGS.separator, srcSeparator);
80
81
  await grok.data.detectSemanticTypes(df);
81
82
 
82
- const sh = SeqHandler.forColumn(seqCol);
83
- const resHelm = await sh.getHelm(0, false);
83
+ const sh = seqHelper.getSeqHandler(seqCol);
84
+ const resSemValue = await sh.getHelm(0);
85
+ const resHelm = resSemValue.value;
84
86
  expect(resHelm, tgtHelm);
85
87
  }
86
88
  });
@@ -1,11 +1,17 @@
1
1
  import * as grok from 'datagrok-api/grok';
2
2
  import * as DG from 'datagrok-api/dg';
3
3
 
4
- import {category, expect, expectArray, test} from '@datagrok-libraries/utils/src/test';
5
- import {SeqHandler} from '@datagrok-libraries/bio/src/utils/seq-handler';
4
+ import {before, category, expect, expectArray, test} from '@datagrok-libraries/utils/src/test';
5
+ import {ISeqHelper, getSeqHelper} from '@datagrok-libraries/bio/src/utils/seq-helper';
6
6
  import {ALPHABET, NOTATION, TAGS} from '@datagrok-libraries/bio/src/utils/macromolecule';
7
7
 
8
8
  category('SeqHandler: getRegion', () => {
9
+ let seqHelper: ISeqHelper;
10
+
11
+ before(async () => {
12
+ seqHelper = await getSeqHelper();
13
+ });
14
+
9
15
  const data: {
10
16
  [testName: string]: {
11
17
  srcCsv: string,
@@ -76,7 +82,7 @@ PEPTIDE1{[Cys_SEt].T.*.*}$$$$`,
76
82
  const semType: string | null = await grok.functions.call('Bio:detectMacromolecule', {col: srcSeqCol});
77
83
  if (semType) srcSeqCol.semType = semType;
78
84
 
79
- const srcSh = SeqHandler.forColumn(srcSeqCol);
85
+ const srcSh = seqHelper.getSeqHandler(srcSeqCol);
80
86
  const resSeqCol = srcSh.getRegion(testData.startIdx, testData.endIdx, 'regSeq');
81
87
 
82
88
  const tgtDf = DG.DataFrame.fromCsv(testData.tgtCsv);
@@ -3,8 +3,8 @@ import * as DG from 'datagrok-api/dg';
3
3
 
4
4
  import wu from 'wu';
5
5
 
6
- import {category, expect, expectArray, test} from '@datagrok-libraries/utils/src/test';
7
- import {SeqHandler} from '@datagrok-libraries/bio/src/utils/seq-handler';
6
+ import {before, category, expect, expectArray, test} from '@datagrok-libraries/utils/src/test';
7
+ import {ISeqHelper, getSeqHelper} from '@datagrok-libraries/bio/src/utils/seq-helper';
8
8
  import {NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';
9
9
  import {GapOriginals} from '@datagrok-libraries/bio/src/utils/macromolecule/consts';
10
10
 
@@ -16,7 +16,13 @@ enum Tests {
16
16
  helm = 'helm',
17
17
  }
18
18
 
19
- category('SeqHandler', () => {
19
+ category('SeqHandler: splitted', () => {
20
+ let seqHelper: ISeqHelper;
21
+
22
+ before(async () => {
23
+ seqHelper = await getSeqHelper();
24
+ });
25
+
20
26
  const fG = GapOriginals[NOTATION.FASTA];
21
27
  const hG = GapOriginals[NOTATION.HELM];
22
28
  const sG = GapOriginals[NOTATION.SEPARATOR];
@@ -123,7 +129,7 @@ PEPTIDE1{meI.hHis.Aca.Cys_SEt.T.dK.Thr_PO3H2.T.dK.Thr_PO3H2}$$$$`
123
129
  };
124
130
 
125
131
  for (const [testName, testData] of Object.entries(data)) {
126
- test(`splitted-${testName}`, async () => {
132
+ test(`${testName}`, async () => {
127
133
  const df: DG.DataFrame = DG.DataFrame.fromCsv(testData.src.csv);
128
134
  const col: DG.Column = df.getCol('seq');
129
135
 
@@ -131,7 +137,7 @@ PEPTIDE1{meI.hHis.Aca.Cys_SEt.T.dK.Thr_PO3H2.T.dK.Thr_PO3H2}$$$$`
131
137
  if (semType) col.semType = semType;
132
138
  expect(col.semType, DG.SEMTYPE.MACROMOLECULE);
133
139
 
134
- const sh = SeqHandler.forColumn(col);
140
+ const sh = seqHelper.getSeqHandler(col);
135
141
  expect(sh.notation, testData.tgt.notation);
136
142
  expect(sh.separator === testData.tgt.separator, true);
137
143
 
@@ -2,9 +2,10 @@ 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 {category, test, expect} from '@datagrok-libraries/utils/src/test';
6
- import {SeqHandler} from '@datagrok-libraries/bio/src/utils/seq-handler';
5
+ import {category, test, expect, before} from '@datagrok-libraries/utils/src/test';
7
6
  import {ALPHABET, NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';
7
+ import {ISeqHelper, getSeqHelper} from '@datagrok-libraries/bio/src/utils/seq-helper';
8
+ import {ISeqHandler} from '@datagrok-libraries/bio/src/utils/macromolecule/seq-handler';
8
9
 
9
10
  const seqDna = `seq
10
11
  ACGTCACGTC
@@ -28,6 +29,12 @@ PEPTIDE1{Lys_Boc.hHis.Aca.Cys_SEt.T.dK.Thr_PO3H2.Aca.Tyr_PO3H2.D-Chg.dV.Thr_PO3H
28
29
  PEPTIDE1{meI.hHis.Aca.Cys_SEt.T.dK.Thr_PO3H2.Aca.Tyr_PO3H2.D-Chg.dV.Thr_PO3H2.N.D-Orn.D-aThr.Phe_4Me}$$$$`;
29
30
 
30
31
  category('SeqHandler', () => {
32
+ let seqHelper: ISeqHelper;
33
+
34
+ before(async () => {
35
+ seqHelper = await getSeqHelper();
36
+ });
37
+
31
38
  test('Seq-Fasta', async () => {
32
39
  const [_df, sh] = await loadCsvWithDetection(seqDna);
33
40
  expect(sh.notation, NOTATION.FASTA);
@@ -78,38 +85,38 @@ category('SeqHandler', () => {
78
85
  const seqCol = df.getCol('seq');
79
86
 
80
87
  // col.version will change because of changing .tags
81
- const sh1 = SeqHandler.forColumn(seqCol);
88
+ const sh1 = seqHelper.getSeqHandler(seqCol);
82
89
 
83
90
  const v1 = seqCol.version;
84
91
  // col.version MUST NOT change and the same object returned
85
- const sh2 = SeqHandler.forColumn(seqCol);
92
+ const sh2 = seqHelper.getSeqHandler(seqCol);
86
93
  const v2 = seqCol.version;
87
94
  expect(v1, v2, 'Unexpected column version changed');
88
95
  expect(sh1, sh2, 'Unexpected SeqHandler object changed');
89
96
 
90
97
  df.rows.addNew(['TACCCCTTCAAC']);
91
- const sh3 = SeqHandler.forColumn(seqCol);
98
+ const sh3 = seqHelper.getSeqHandler(seqCol);
92
99
  const v3 = seqCol.version;
93
100
  expect(v2 < v3, true, 'Stalled column version on add row');
94
101
  expect(sh2 !== sh3, true, 'Stalled SeqHandler object on add row');
95
102
 
96
103
  seqCol.set(1, 'CAGTGTCCCCGT');
97
- const sh4 = SeqHandler.forColumn(seqCol);
104
+ const sh4 = seqHelper.getSeqHandler(seqCol);
98
105
  const v4 = seqCol.version;
99
106
  expect(v3 < v4, true, 'Stalled column version on change data');
100
107
  expect(sh3 !== sh4, true, 'Stalled SeqHandler object on change data');
101
108
 
102
109
  seqCol.setTag('testTag', 'testValue');
103
- const sh5 = SeqHandler.forColumn(seqCol);
110
+ const sh5 = seqHelper.getSeqHandler(seqCol);
104
111
  const v5 = seqCol.version;
105
112
  expect(v4 < v5, true, 'Stalled column version on set tag');
106
113
  expect(sh4 !== sh5, true, 'Stalled SeqHandler object on set tag');
107
114
  });
108
115
 
109
- async function loadCsvWithDetection(csv: string): Promise<[df: DG.DataFrame, sh: SeqHandler]> {
116
+ async function loadCsvWithDetection(csv: string): Promise<[df: DG.DataFrame, sh: ISeqHandler]> {
110
117
  const df = DG.DataFrame.fromCsv(csv);
111
118
  await grok.data.detectSemanticTypes(df);
112
- const sh = SeqHandler.forColumn(df.getCol('seq'));
119
+ const sh = seqHelper.getSeqHandler(df.getCol('seq'));
113
120
  return [df, sh];
114
121
  }
115
122
 
@@ -121,7 +128,7 @@ category('SeqHandler', () => {
121
128
  // col.semType = DG.SEMTYPE.MACROMOLECULE;
122
129
  // if (value === NOTATION.SEPARATOR)
123
130
  // col.setTag(TAGS.separator, '-');
124
- // const sh = SeqHandler.forColumn(df.getCol('seq'));
131
+ // const sh = seqHelper.getSeqHandler(df.getCol('seq'));
125
132
  // return [df, sh];
126
133
  // }
127
134
  });
@@ -1,13 +1,13 @@
1
1
  import * as DG from 'datagrok-api/dg';
2
2
  import * as grok from 'datagrok-api/grok';
3
+
3
4
  import {expect} from '@datagrok-libraries/utils/src/test';
4
- import {sequenceSpaceTopMenu} from '../package';
5
5
  import {MmDistanceFunctionsNames} from '@datagrok-libraries/ml/src/macromolecule-distance-functions';
6
6
  import {BYPASS_LARGE_DATA_WARNING} from '@datagrok-libraries/ml/src/functionEditors/consts';
7
7
  import {DimReductionMethods} from '@datagrok-libraries/ml/src/multi-column-dimensionality-reduction/types';
8
8
 
9
9
  export async function _testSequenceSpaceReturnsResult(
10
- df: DG.DataFrame, algorithm: DimReductionMethods, colName: string,
10
+ df: DG.DataFrame, algorithm: DimReductionMethods, colName: string
11
11
  ) {
12
12
  // await grok.data.detectSemanticTypes(df);
13
13
  const col: DG.Column = df.getCol(colName);
@@ -18,7 +18,12 @@ export async function _testSequenceSpaceReturnsResult(
18
18
  const preprocessingFunc = DG.Func.find({package: 'Bio', name: 'macromoleculePreprocessingFunction'})[0];
19
19
  if (!preprocessingFunc)
20
20
  throw new Error('Preprocessing function not found');
21
- const sp = await sequenceSpaceTopMenu(df, df.col(colName)!, algorithm, MmDistanceFunctionsNames.LEVENSHTEIN, true,
22
- preprocessingFunc, {[BYPASS_LARGE_DATA_WARNING]: true});
21
+ const sp = await grok.functions.call('Bio:sequenceSpaceTopMenu', {
22
+ table: df, molecules: df.col(colName)!,
23
+ methodName: algorithm, similarityMetric: MmDistanceFunctionsNames.LEVENSHTEIN,
24
+ plotEmbeddings: true, preprocessingFunction: preprocessingFunc, options: {[BYPASS_LARGE_DATA_WARNING]: true}
25
+ });
26
+ // const sp = await sequenceSpaceTopMenu(df, df.col(colName)!, algorithm, MmDistanceFunctionsNames.LEVENSHTEIN, true,
27
+ // preprocessingFunc, {[BYPASS_LARGE_DATA_WARNING]: true});
23
28
  expect(sp != null, true);
24
29
  }
@@ -11,13 +11,12 @@ import {ISeqSplitted} from '@datagrok-libraries/bio/src/utils/macromolecule/type
11
11
  import {IMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';
12
12
  import {UserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/types';
13
13
  import {getMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';
14
+ import {ISeqHelper, getSeqHelper} from '@datagrok-libraries/bio/src/utils/seq-helper';
14
15
 
15
16
  import {splitToMonomersUI} from '../utils/split-to-monomers';
16
17
  import {awaitGrid} from './utils';
17
18
  import * as C from '../utils/constants';
18
- import {getHelmMonomers} from '../package';
19
19
 
20
- import {_package} from '../package-test';
21
20
  import {getUserLibSettings, setUserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/lib-settings';
22
21
 
23
22
  category('splitters', async () => {
@@ -89,10 +88,12 @@ category('splitters', async () => {
89
88
  });
90
89
 
91
90
  category('splitters', () => {
91
+ let seqHelper: ISeqHelper;
92
92
  let monomerLibHelper: IMonomerLibHelper;
93
93
  let userLibSettings: UserLibSettings;
94
94
 
95
95
  before(async () => {
96
+ seqHelper = await getSeqHelper();
96
97
  monomerLibHelper = await getMonomerLibHelper();
97
98
  userLibSettings = await getUserLibSettings();
98
99
 
@@ -113,7 +114,7 @@ category('splitters', () => {
113
114
  seqCol.semType = semType;
114
115
  seqCol.setTag(bioTAGS.aligned, C.MSA);
115
116
 
116
- const newDf = await splitToMonomersUI(df, seqCol);
117
+ const newDf: DG.DataFrame = await grok.functions.call('Bio:splitToMonomersTopMenu', {table: df, sequence: seqCol});
117
118
  expect(newDf.columns.names().includes('17'), true);
118
119
  // call to calculate 'cell.renderer' tag
119
120
  await grok.data.detectSemanticTypes(newDf);
@@ -134,7 +135,7 @@ PEPTIDE1{hHis.Aca.Cys_SEt}$$$,5.72388
134
135
  const expectedMonomerList = ['hHis', 'Aca', 'Cys_SEt', 'N', 'T'];
135
136
 
136
137
  const helmCol: DG.Column = df.getCol('HELM');
137
- const res = getHelmMonomers(helmCol);
138
+ const res = await grok.functions.call('Bio:getHelmMonomers', {sequence: helmCol}) as string[];
138
139
 
139
140
  const missed = expectedMonomerList.filter((m) => !res.includes(m));
140
141
  const unexpected = res.filter((m) => !expectedMonomerList.includes(m));
@@ -23,7 +23,6 @@ import {HelmBioFilter} from '../widgets/bio-substructure-filter-helm';
23
23
 
24
24
  import {_package} from '../package-test';
25
25
 
26
-
27
26
  category('bio-substructure-filters', async () => {
28
27
  let helmHelper: IHelmHelper;
29
28
  let monomerLibHelper: IMonomerLibHelper;
@@ -52,7 +51,7 @@ category('bio-substructure-filters', async () => {
52
51
  const fSubStr: string = 'MD';
53
52
  const fTrueCount: number = 3;
54
53
 
55
- const filter = new BioSubstructureFilter();
54
+ const filter = await createBioSubstructureFilter();
56
55
  filter.attach(df);
57
56
  await filter.awaitRendered();
58
57
  try {
@@ -69,11 +68,11 @@ category('bio-substructure-filters', async () => {
69
68
  filter.detach();
70
69
  }
71
70
  await filter.awaitRendered();
72
- });
71
+ }, {skipReason: 'GROK-16782'});
73
72
 
74
73
  test('separator', async () => {
75
74
  const msa = await readDataframe('tests/filter_MSA.csv');
76
- const filter = new BioSubstructureFilter();
75
+ const filter = await createBioSubstructureFilter();
77
76
  await grok.data.detectSemanticTypes(msa);
78
77
  filter.attach(msa);
79
78
  await filter.awaitRendered();
@@ -102,7 +101,7 @@ category('bio-substructure-filters', async () => {
102
101
  filter.detach();
103
102
  }
104
103
  await filter.awaitRendered();
105
- });
104
+ }, {skipReason: 'GROK-16782'});
106
105
 
107
106
  // test('helm', async () => {
108
107
  // const df = await readDataframe('tests/filter_HELM.csv');
@@ -112,7 +111,7 @@ category('bio-substructure-filters', async () => {
112
111
  // // // Helm filter calls waitForElementInDom
113
112
  // // const fg = view.getFiltersGroup({createDefaultFilters: false});
114
113
  // // _package.logger.debug('Bio tests: substructureFilters/helm, filter attaching.');
115
- // // const filter = new BioSubstructureFilter();
114
+ // // const filter = await createBioSubstructureFilter();
116
115
  // // filter.attach(df);
117
116
  // // _package.logger.debug('Bio tests: substructureFilters/helm, filter attached.');
118
117
  // // const fg = await df.plot.fromType(DG.VIEWER.FILTERS, {
@@ -157,7 +156,7 @@ category('bio-substructure-filters', async () => {
157
156
  const view = grok.shell.addTableView(df);
158
157
 
159
158
  _package.logger.debug(`${logPrefix}, filter attaching.`);
160
- const filter = new BioSubstructureFilter();
159
+ const filter = await createBioSubstructureFilter();
161
160
  filter.attach(df);
162
161
  const dlg = ui.dialog('Test filters').add(filter.root).show(); // to waitForElementInDom
163
162
  await filter.awaitRendered();
@@ -188,7 +187,7 @@ category('bio-substructure-filters', async () => {
188
187
  }
189
188
  await filter.awaitRendered();
190
189
  await delay(3000); //TODO: await for grid.onLookChanged
191
- });
190
+ }, {skipReason: 'GROK-16782'});
192
191
 
193
192
  // Generates unhandled exception accessing isFiltering before bioFilter created
194
193
  test('helm-view', async () => {
@@ -235,7 +234,7 @@ category('bio-substructure-filters', async () => {
235
234
  f2.detach();
236
235
  }
237
236
  await Promise.all([f1.awaitRendered(), f2.awaitRendered()]);
238
- });
237
+ }, {skipReason: 'GROK-16782'});
239
238
 
240
239
  // MSA filter has the second input field for separator
241
240
  test('sync-msa', async () => {
@@ -269,7 +268,7 @@ category('bio-substructure-filters', async () => {
269
268
  f2.detach();
270
269
  }
271
270
  await Promise.all([f1.awaitRendered(), f2.awaitRendered()]);
272
- });
271
+ }, {skipReason: 'GROK-16782'});
273
272
 
274
273
  test('sync-helm', async () => {
275
274
  const df = await _package.files.readCsv('tests/filter_HELM.csv');
@@ -312,7 +311,7 @@ category('bio-substructure-filters', async () => {
312
311
  await Promise.all([f1.awaitRendered(), f2.awaitRendered()]);
313
312
  await awaitGrid(view.grid);
314
313
  await delay(3000); //TODO: await for grid.onLookChanged
315
- });
314
+ }, {skipReason: 'GROK-16782'});
316
315
 
317
316
  // two seq columns
318
317
 
@@ -337,7 +336,6 @@ category('bio-substructure-filters', async () => {
337
336
  const fSeq2SubStr: string = 'GCATT';
338
337
  const fSeq2Trues: number[] = df.getCol('trueSeq2').toList();
339
338
 
340
- //const seq2Filter = new BioSubstructureFilter();
341
339
  const filterList: any[] = [
342
340
  {type: 'Bio:bioSubstructureFilter', columnName: fSeq1ColName},
343
341
  {type: 'Bio:bioSubstructureFilter', columnName: fSeq2ColName},
@@ -459,7 +457,7 @@ async function createFilter(colName: string, df: DG.DataFrame): Promise<BioSubst
459
457
  `Available in data frame are ${JSON.stringify(df.columns.names())}`);
460
458
  }
461
459
 
462
- const filter = new BioSubstructureFilter();
460
+ const filter = await createBioSubstructureFilter();
463
461
  filter.attach(df);
464
462
  filter.applyState({columnName: colName});
465
463
  filter.column = df.col(colName);
@@ -467,3 +465,8 @@ async function createFilter(colName: string, df: DG.DataFrame): Promise<BioSubst
467
465
  //filter.tableName = df.name;
468
466
  return filter;
469
467
  };
468
+
469
+ async function createBioSubstructureFilter(): Promise<BioSubstructureFilter> {
470
+ const filter = await grok.functions.call('Bio:bioSubstructureFilter');
471
+ return filter.dart.jsFilter as BioSubstructureFilter;
472
+ }
@@ -15,7 +15,7 @@ import {
15
15
  getUserLibSettings, setUserLibSettings
16
16
  } from '@datagrok-libraries/bio/src/monomer-works/lib-settings';
17
17
  import {UserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/types';
18
- import {SeqHandler} from '@datagrok-libraries/bio/src/utils/seq-handler';
18
+ import {getSeqHelper, ISeqHelper} from '@datagrok-libraries/bio/src/utils/seq-helper';
19
19
  import {getRdKitModule} from '@datagrok-libraries/bio/src/chem/rdkit-module';
20
20
 
21
21
  import {_package} from '../package-test';
@@ -60,11 +60,13 @@ category('toAtomicLevel', async () => {
60
60
  /** Backup actual user's monomer libraries settings */
61
61
  let userLibSettings: UserLibSettings;
62
62
 
63
+ let seqHelper: ISeqHelper;
63
64
  let monomerLib: IMonomerLib;
64
65
  let rdKitModule: RDModule;
65
66
 
66
67
  before(async () => {
67
68
  rdKitModule = await getRdKitModule();
69
+ seqHelper = await getSeqHelper();
68
70
  monomerLibHelper = await getMonomerLibHelper();
69
71
  userLibSettings = await getUserLibSettings();
70
72
  // Clear settings to test default
@@ -214,7 +216,7 @@ PEPTIDE1{Lys_Boc.hHis.Aca.Cys_SEt.T.dK.Thr_PO3H2.Aca.Tyr_PO3H2.Thr_PO3H2.Aca.Tyr
214
216
  seqCol.semType = DG.SEMTYPE.MACROMOLECULE;
215
217
  seqCol.meta.units = NOTATION.FASTA;
216
218
  seqCol.setTag(bioTAGS.alphabet, ALPHABET.PT);
217
- const sh = SeqHandler.forColumn(seqCol);
219
+ const sh = seqHelper.getSeqHandler(seqCol);
218
220
  const resCol = (await _testToAtomicLevel(srcDf, 'seq', monomerLibHelper))!;
219
221
  expect(polishMolfile(resCol.get(0)), polishMolfile(tgtMol));
220
222
  });
@@ -223,7 +225,7 @@ PEPTIDE1{Lys_Boc.hHis.Aca.Cys_SEt.T.dK.Thr_PO3H2.Aca.Tyr_PO3H2.Thr_PO3H2.Aca.Tyr
223
225
  df: DG.DataFrame, seqColName: string = 'seq', monomerLibHelper: IMonomerLibHelper
224
226
  ): Promise<DG.Column | null> {
225
227
  const seqCol: DG.Column<string> = df.getCol(seqColName);
226
- const res = await _toAtomicLevel(df, seqCol, monomerLib, rdKitModule);
228
+ const res = await _toAtomicLevel(df, seqCol, monomerLib, seqHelper, rdKitModule);
227
229
  if (res.warnings.length > 0)
228
230
  _package.logger.warning(`_toAtomicLevel() warnings ${res.warnings.join('\n')}`);
229
231
  return res.molCol;
@@ -11,6 +11,7 @@ import {UserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/types';
11
11
  import {NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';
12
12
  import {getRdKitModule} from '@datagrok-libraries/bio/src/chem/rdkit-module';
13
13
  import {RDModule} from '@datagrok-libraries/chem-meta/src/rdkit-api';
14
+ import {ISeqHelper, getSeqHelper} from '@datagrok-libraries/bio/src/utils/seq-helper';
14
15
 
15
16
  type TestDataTargetType = { atomCount: number, bondCount: number };
16
17
  type TestDataType = {
@@ -22,10 +23,12 @@ category('toAtomicLevel-ui', () => {
22
23
 
23
24
  let monomerLibHelper: IMonomerLibHelper;
24
25
  let userLibSettings: UserLibSettings;
26
+ let seqHelper: ISeqHelper;
25
27
  let monomerLib: IMonomerLib;
26
28
  let rdKitModule: RDModule;
27
29
 
28
30
  before(async () => {
31
+ seqHelper = await getSeqHelper();
29
32
  rdKitModule = await getRdKitModule();
30
33
  monomerLibHelper = await getMonomerLibHelper();
31
34
  userLibSettings = await getUserLibSettings();
@@ -95,7 +98,7 @@ category('toAtomicLevel-ui', () => {
95
98
  async function _testToAtomicLevelFunc(
96
99
  seqCol: DG.Column<string>, nonlinear: boolean, tgt: TestDataTargetType,
97
100
  ): Promise<void> {
98
- const res = (await sequenceToMolfile(seqCol.dataFrame, seqCol, nonlinear, false, monomerLib, rdKitModule))!;
101
+ const res = (await sequenceToMolfile(seqCol.dataFrame, seqCol, nonlinear, false, monomerLib, seqHelper, rdKitModule))!;
99
102
  expect(res.molCol!.semType, DG.SEMTYPE.MOLECULE);
100
103
  const resMolStr = res.molCol!.get(0)!;
101
104
  const resRdMol = rdKitModule.get_mol(resMolStr);
@@ -3,7 +3,7 @@ import * as grok from 'datagrok-api/grok';
3
3
 
4
4
  import {ALIGNMENT, NOTATION, TAGS as bioTAGS} from '@datagrok-libraries/bio/src/utils/macromolecule';
5
5
  import {expect} from '@datagrok-libraries/utils/src/test';
6
- import {SeqHandler} from '@datagrok-libraries/bio/src/utils/seq-handler';
6
+ import {ISeqHelper} from '@datagrok-libraries/bio/src/utils/seq-helper';
7
7
 
8
8
  export type DetectorTestData = { [testName: string]: { csv: string, neg?: string[], pos?: { [colName: string]: PosCol } } };
9
9
 
@@ -35,8 +35,8 @@ export async function _testNeg(readDf: DfReaderFunc, colName: string) {
35
35
  }
36
36
 
37
37
  export async function _testPos(
38
- readDf: DfReaderFunc, colName: string, units: string, aligned: string | null,
39
- alphabet: string | null, alphabetSize: number, alphabetIsMultichar?: boolean,
38
+ readDf: DfReaderFunc, colName: string, seqHelper: ISeqHelper,
39
+ units: string, aligned: string | null, alphabet: string | null, alphabetSize: number, alphabetIsMultichar?: boolean,
40
40
  separator: string | null = null,
41
41
  ) {
42
42
  const df: DG.DataFrame = await readDf();
@@ -53,7 +53,7 @@ export async function _testPos(
53
53
  if (separator)
54
54
  expect(col.getTag(bioTAGS.separator), separator);
55
55
 
56
- const sh = SeqHandler.forColumn(col);
56
+ const sh = seqHelper.getSeqHandler(col);
57
57
  expect(sh.getAlphabetSize(), alphabetSize);
58
58
  expect(sh.getAlphabetIsMultichar(), alphabetIsMultichar);
59
59
  if (!sh.isHelm()) {
@@ -1,13 +1,15 @@
1
1
  import * as DG from 'datagrok-api/dg';
2
- import { calculateScores, SCORE } from '@datagrok-libraries/bio/src/utils/macromolecule/scoring';
2
+
3
+ import {calculateScores, SCORE} from '@datagrok-libraries/bio/src/utils/macromolecule/scoring';
4
+ import {ISeqHelper} from '@datagrok-libraries/bio/src/utils/seq-helper';
3
5
 
4
6
  export async function calculateScoresWithEmptyValues(
5
- table: DG.DataFrame, macromolecule: DG.Column, reference: string, scoring: SCORE
7
+ table: DG.DataFrame, macromolecule: DG.Column, reference: string, scoring: SCORE, seqHelper: ISeqHelper,
6
8
  ): Promise<DG.Column<number>> {
7
- const scores = await calculateScores(table, macromolecule, reference, scoring);
8
- for (let i = 0; i < scores.length; i++) {
9
- if (macromolecule.isNone(i))
10
- scores.set(i, null, false);
11
- }
12
- return scores;
13
- }
9
+ const scores = await calculateScores(table, macromolecule, reference, scoring, seqHelper);
10
+ for (let i = 0; i < scores.length; i++) {
11
+ if (macromolecule.isNone(i))
12
+ scores.set(i, null, false);
13
+ }
14
+ return scores;
15
+ }