@datagrok/bio 2.15.13 → 2.16.2

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 (80) hide show
  1. package/CHANGELOG.md +25 -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 +14 -14
  11. package/src/analysis/sequence-activity-cliffs.ts +9 -8
  12. package/src/analysis/sequence-diversity-viewer.ts +6 -4
  13. package/src/analysis/sequence-similarity-viewer.ts +9 -6
  14. package/src/analysis/sequence-space.ts +3 -2
  15. package/src/calculations/monomerLevelMols.ts +4 -5
  16. package/src/demo/bio01-similarity-diversity.ts +4 -1
  17. package/src/package-test.ts +1 -1
  18. package/src/package-types.ts +34 -2
  19. package/src/package.ts +60 -76
  20. package/src/substructure-search/substructure-search.ts +15 -9
  21. package/src/tests/WebLogo-layout-tests.ts +1 -1
  22. package/src/tests/WebLogo-positions-test.ts +11 -5
  23. package/src/tests/WebLogo-project-tests.ts +1 -1
  24. package/src/tests/activity-cliffs-utils.ts +11 -14
  25. package/src/tests/bio-tests.ts +85 -79
  26. package/src/tests/checkInputColumn-tests.ts +15 -10
  27. package/src/tests/converters-test.ts +12 -5
  28. package/src/tests/detectors-benchmark-tests.ts +5 -2
  29. package/src/tests/detectors-tests.ts +51 -44
  30. package/src/tests/detectors-weak-and-likely-tests.ts +12 -5
  31. package/src/tests/fasta-export-tests.ts +13 -5
  32. package/src/tests/helm-tests.ts +85 -0
  33. package/src/tests/mm-distance-tests.ts +14 -7
  34. package/src/tests/monomer-libraries-tests.ts +1 -1
  35. package/src/tests/msa-tests.ts +33 -24
  36. package/src/tests/renderers-monomer-placer-tests.ts +2 -5
  37. package/src/tests/renderers-test.ts +15 -9
  38. package/src/tests/scoring.ts +9 -6
  39. package/src/tests/seq-handler-get-helm-tests.ts +7 -5
  40. package/src/tests/seq-handler-get-region-tests.ts +9 -3
  41. package/src/tests/seq-handler-splitted-tests.ts +11 -5
  42. package/src/tests/seq-handler-tests.ts +17 -10
  43. package/src/tests/sequence-space-utils.ts +9 -4
  44. package/src/tests/splitters-test.ts +5 -4
  45. package/src/tests/substructure-filters-tests.ts +22 -23
  46. package/src/tests/to-atomic-level-tests.ts +5 -3
  47. package/src/tests/to-atomic-level-ui-tests.ts +4 -1
  48. package/src/tests/utils/detectors-utils.ts +4 -4
  49. package/src/utils/calculate-scores.ts +11 -9
  50. package/src/utils/cell-renderer-custom.ts +27 -17
  51. package/src/utils/cell-renderer.ts +14 -8
  52. package/src/utils/check-input-column.ts +13 -9
  53. package/src/utils/context-menu.ts +4 -4
  54. package/src/utils/convert.ts +21 -14
  55. package/src/utils/get-region-func-editor.ts +8 -5
  56. package/src/utils/get-region.ts +4 -5
  57. package/src/utils/helm-to-molfile/converter/helm.ts +4 -4
  58. package/src/utils/helm-to-molfile/utils.ts +5 -6
  59. package/src/utils/macromolecule-column-widget.ts +6 -7
  60. package/src/utils/monomer-cell-renderer-base.ts +8 -1
  61. package/src/utils/monomer-lib/lib-manager.ts +3 -2
  62. package/src/utils/monomer-lib/monomer-colors.ts +10 -10
  63. package/src/utils/monomer-lib/monomer-lib-base.ts +6 -1
  64. package/src/utils/monomer-lib/monomer-lib.ts +15 -9
  65. package/src/utils/multiple-sequence-alignment-ui.ts +30 -30
  66. package/src/utils/save-as-fasta.ts +19 -12
  67. package/src/utils/seq-helper/seq-handler.ts +836 -0
  68. package/src/utils/seq-helper/seq-helper.ts +43 -19
  69. package/src/utils/sequence-to-mol.ts +7 -8
  70. package/src/utils/split-to-monomers.ts +7 -2
  71. package/src/utils/types.ts +8 -7
  72. package/src/utils/ui-utils.ts +2 -2
  73. package/src/viewers/web-logo-viewer.ts +18 -16
  74. package/src/widgets/bio-substructure-filter-helm.ts +5 -2
  75. package/src/widgets/bio-substructure-filter.ts +14 -24
  76. package/src/widgets/composition-analysis-widget.ts +6 -6
  77. package/src/widgets/representations.ts +7 -4
  78. package/src/tests/detectors-custom-notation-tests.ts +0 -37
  79. package/src/utils/cyclized.ts +0 -89
  80. package/src/utils/dimerized.ts +0 -10
@@ -2,14 +2,21 @@ import * as DG from 'datagrok-api/dg';
2
2
  import * as ui from 'datagrok-api/ui';
3
3
  import * as grok from 'datagrok-api/grok';
4
4
 
5
- import {category, expect, expectArray, test} from '@datagrok-libraries/utils/src/test';
5
+ import {before, category, expect, expectArray, test} from '@datagrok-libraries/utils/src/test';
6
+ import {NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';
7
+ import {ISeqHelper, getSeqHelper} from '@datagrok-libraries/bio/src/utils/seq-helper';
8
+
6
9
  import {saveAsFastaDo, wrapSequence} from '../utils/save-as-fasta';
7
- import {NOTATION, splitterAsFasta} from '@datagrok-libraries/bio/src/utils/macromolecule';
8
- import {SeqHandler} from '@datagrok-libraries/bio/src/utils/seq-handler';
9
10
 
10
11
  type SaveAsFastaTestArgs = { srcCsv: string, idCols: string [], seqCol: string, lineWidth: number, tgtFasta: string };
11
12
 
12
13
  category('fastaExport', () => {
14
+ let seqHelper: ISeqHelper;
15
+
16
+ before(async () => {
17
+ seqHelper = await getSeqHelper();
18
+ });
19
+
13
20
  enum WrapDataTest {
14
21
  single = 'single',
15
22
  multi = 'multi'
@@ -92,7 +99,7 @@ MRGGL
92
99
  const col = DG.Column.fromStrings('src', [srcSeq]);
93
100
  col.semType = DG.SEMTYPE.MACROMOLECULE;
94
101
  col.meta.units = NOTATION.FASTA;
95
- const sh = SeqHandler.forColumn(col);
102
+ const sh = seqHelper.getSeqHandler(col);
96
103
  const srcSS = sh.getSplitted(0);
97
104
  const wrapRes: string[] = wrapSequence(srcSS, lineWidth);
98
105
  const wrapTgt: string[] = wrapData[testKey].tgt;
@@ -108,7 +115,8 @@ MRGGL
108
115
  seqCol.meta.units = NOTATION.FASTA;
109
116
  const idCols: DG.Column[] = args.idCols.map((colName) => df.getCol(colName));
110
117
 
111
- const fastaRes: string = saveAsFastaDo(idCols, seqCol, args.lineWidth);
118
+ const seqHandler = seqHelper.getSeqHandler(seqCol);
119
+ const fastaRes: string = saveAsFastaDo(idCols, seqHandler, args.lineWidth);
112
120
  expect(fastaRes, args.tgtFasta);
113
121
  }
114
122
  });
@@ -0,0 +1,85 @@
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
+
5
+ import wu from 'wu';
6
+
7
+ import {before, category, expect, expectArray, test} from '@datagrok-libraries/utils/src/test';
8
+ import {Helm} from '../utils/helm-to-molfile/converter/helm';
9
+
10
+ category('helm', () => {
11
+ const tests = {
12
+ 'single-linear': {
13
+ src: {helm: 'PEPTIDE1{R.F.Y.[GGaz].T.[meI]}$$$$'},
14
+ tgt: {
15
+ simplePolymers: [6],
16
+ bondedRGroups: [1, 2, 2, 2, 2, 1],
17
+ }
18
+ },
19
+ 'single-cyclized-C-2-2': {
20
+ src: {helm: 'PEPTIDE1{R.F.C.Y.G.H.[GGaz].C.T.[meI]}$PEPTIDE1,PEPTIDE1,3:R3-8,R3$$$'},
21
+ tgt: {
22
+ simplePolymers: [10],
23
+ bondedRGroups: [1, 2, 3, 2, 2, 2, 2, 3, 2, 1],
24
+ }
25
+ },
26
+ 'single-cyclized-C-1-1': {
27
+ src: {helm: 'PEPTIDE1{F.C.Y.G.H.[GGaz].C.[meI]}$PEPTIDE1,PEPTIDE1,2:R3-7,R3$$$'},
28
+ tgt: {
29
+ simplePolymers: [8],
30
+ bondedRGroups: [1, 3, 2, 2, 2, 1, 3, 1],
31
+ }
32
+ },
33
+ 'single-cyclized-C-0-0': {
34
+ src: {helm: 'PEPTIDE1{C.Y.G.H.[GGaz].C}$PEPTIDE1,PEPTIDE1,2:R3-7,R3$$$'},
35
+ tgt: {
36
+ simplePolymers: [6],
37
+ bondedRGroups: [2, 2, 2, 2, 2, 2],
38
+ }
39
+ },
40
+ 'two-separated-1': {
41
+ src: {helm: 'PEPTIDE1{R.F.Y.[GGaz].T}|PEPTIDE2{[meI]}$$$$'},
42
+ tgt: {
43
+ simplePolymers: [5, 1],
44
+ bondedRGroups: [1, 2, 2, 2, 1, 1],
45
+ }
46
+ },
47
+ 'two-separated-2': {
48
+ src: {helm: 'PEPTIDE1{R.F.Y.[GGaz]}|PEPTIDE2{T.[meI]}$$$$'},
49
+ tgt: {
50
+ simplePolymers: [4, 2],
51
+ bondedRGroups: [1, 2, 2, 1, 1, 1],
52
+ }
53
+ },
54
+ 'two-connected-1': {
55
+ src: {helm: 'PEPTIDE1{R.F.Y.[GGaz].T}|PEPTIDE2{[meI]}$PEPTIDE1,PEPTIDE2,5:R2-1,R1$$$'},
56
+ tgt: {
57
+ simplePolymers: [5, 1],
58
+ bondedRGroups: [1, 2, 2, 2, 2, 1],
59
+ }
60
+ },
61
+ 'two-connected-2': {
62
+ src: {helm: 'PEPTIDE1{R.F.Y.[GGaz]}|PEPTIDE2{T.[meI]}$PEPTIDE1,PEPTIDE2,4:R2-1,R1$$$'},
63
+ tgt: {
64
+ simplePolymers: [4, 2],
65
+ bondedRGroups: [1, 2, 2, 2, 2, 1],
66
+ }
67
+ }
68
+ };
69
+
70
+ for (const [testName, {src, tgt}] of Object.entries(tests)) {
71
+ test(testName, async () => {
72
+ const resHelm = new Helm(src.helm);
73
+
74
+ const simplePolymers = resHelm.simplePolymers
75
+ .map((sp) => sp.monomers.length);
76
+ const totalMonomerCount = simplePolymers.reduce((a, b) => a + b, 0);
77
+ expect(simplePolymers, tgt.simplePolymers);
78
+
79
+ const bondedRGroups = wu.count(0).take(resHelm.bondedRGroupsMap.size)
80
+ .map((i) => resHelm.bondedRGroupsMap.get(i)!.length).toArray();
81
+ expect(totalMonomerCount, bondedRGroups.length);
82
+ // expectArray(bondedRGroups, tgt.bondedRGroups);
83
+ }, {skipReason: 'new tests'});
84
+ }
85
+ });
@@ -2,12 +2,19 @@ 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, expect, test} from '@datagrok-libraries/utils/src/test';
6
- import {SeqHandler} from '@datagrok-libraries/bio/src/utils/seq-handler';
5
+ import {before, category, expect, test} from '@datagrok-libraries/utils/src/test';
6
+ import {ISeqHandler} from '@datagrok-libraries/bio/src/utils/macromolecule/seq-handler';
7
+ import {ISeqHelper, getSeqHelper} from '@datagrok-libraries/bio/src/utils/seq-helper';
7
8
  import {MmDistanceFunctionsNames, mmDistanceFunctions}
8
9
  from '@datagrok-libraries/ml/src/macromolecule-distance-functions';
9
10
 
10
11
  category('Distance', async () => {
12
+ let seqHelper: ISeqHelper;
13
+
14
+ before(async () => {
15
+ seqHelper = await getSeqHelper();
16
+ });
17
+
11
18
  const scoringMatrix = [
12
19
  [1, 0, 0, 0],
13
20
  [0, 1, 0, 0],
@@ -42,19 +49,19 @@ ATCGAATCGA
42
49
  ATCGAATCGA`;
43
50
 
44
51
  test('protein-distance-function', async () => {
45
- const sh = await _initMacromoleculeColumn(protTable);
52
+ const sh = await _initMacromoleculeColumn(protTable, seqHelper);
46
53
  const distFunc = sh.getDistanceFunctionName();
47
54
  expect(distFunc, MmDistanceFunctionsNames.LEVENSHTEIN);
48
55
  });
49
56
 
50
57
  test('DNA-distance-function', async () => {
51
- const sh = await _initMacromoleculeColumn(DNATable);
58
+ const sh = await _initMacromoleculeColumn(DNATable, seqHelper);
52
59
  const distFunc = sh.getDistanceFunctionName();
53
60
  expect(distFunc, MmDistanceFunctionsNames.LEVENSHTEIN);
54
61
  });
55
62
 
56
63
  test('MSA-distance-function', async () => {
57
- const sh = await _initMacromoleculeColumn(MSATable);
64
+ const sh = await _initMacromoleculeColumn(MSATable, seqHelper);
58
65
  const distFunc = sh.getDistanceFunctionName();
59
66
  expect(distFunc, MmDistanceFunctionsNames.HAMMING);
60
67
  });
@@ -127,7 +134,7 @@ ATCGAATCGA`;
127
134
  }, {benchmark: true});
128
135
  });
129
136
 
130
- async function _initMacromoleculeColumn(csv: string): Promise<SeqHandler> {
137
+ async function _initMacromoleculeColumn(csv: string, seqHelper: ISeqHelper): Promise<ISeqHandler> {
131
138
  const srcDf: DG.DataFrame = DG.DataFrame.fromCsv(csv);
132
139
  const seqCol = srcDf.col('seq')!;
133
140
  const semType: string = await grok.functions
@@ -135,7 +142,7 @@ async function _initMacromoleculeColumn(csv: string): Promise<SeqHandler> {
135
142
  if (semType)
136
143
  seqCol.semType = semType;
137
144
  await grok.data.detectSemanticTypes(srcDf);
138
- const sh = SeqHandler.forColumn(seqCol);
145
+ const sh = seqHelper.getSeqHandler(seqCol);
139
146
  return sh;
140
147
  }
141
148
 
@@ -83,7 +83,7 @@ category('monomerLibraries', () => {
83
83
  const absentOverrideMonomer = monomerLib.getMonomer(overMon.polymerType, overMon.symbol);
84
84
  expect(absentOverrideMonomer === null, true, `Unexpectedly found monomer '${overMon.symbol}' `);
85
85
 
86
- const overriddenMonomerLib = monomerLib.override({[overMon.polymerType]: {[overMon.symbol]: overMon}});
86
+ const overriddenMonomerLib = monomerLib.override({[overMon.polymerType]: {[overMon.symbol]: overMon}}, 'test');
87
87
  const resOverMon = overriddenMonomerLib.getMonomer(overMon.polymerType, overMon.symbol);
88
88
  expectObject(resOverMon as any, overMon);
89
89
  });
@@ -2,13 +2,21 @@ 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, expect, expectArray, test} from '@datagrok-libraries/utils/src/test';
5
+ import {before, category, expect, expectArray, test} from '@datagrok-libraries/utils/src/test';
6
6
  import {ALIGNMENT, ALPHABET, NOTATION, TAGS as bioTAGS} from '@datagrok-libraries/bio/src/utils/macromolecule';
7
+ import {ISeqHelper, getSeqHelper} from '@datagrok-libraries/bio/src/utils/seq-helper';
8
+
7
9
  import {runKalign} from '../utils/multiple-sequence-alignment';
8
10
  import {multipleSequenceAlignmentUI} from '../utils/multiple-sequence-alignment-ui';
9
11
  import {awaitContainerStart} from '../utils/docker';
10
12
 
11
13
  category('MSA', async () => {
14
+ let seqHelper: ISeqHelper;
15
+
16
+ before(async () => {
17
+ seqHelper = await getSeqHelper();
18
+ });
19
+
12
20
  //table = await grok.data.files.openTable('Demo:Files/bio/peptides.csv');
13
21
  const fromCsv = `seq
14
22
  FWRWYVKHP
@@ -99,6 +107,30 @@ MWRSWYCKHPMWRSWYCKHPMWRSWYCKHPMWRSWYCKHPMWRSWYCKHPMWRSWYCKHPMWRSWYCKHPMWRSWYCKHP
99
107
  SeparatorLongFromCsv, SeparatorLongToCsv, NOTATION.SEPARATOR, NOTATION.FASTA, ALPHABET.PT,
100
108
  );
101
109
  });
110
+
111
+ async function _testMSAOnColumn(
112
+ srcCsv: string, tgtCsv: string,
113
+ srcNotation: NOTATION, tgtNotation: NOTATION, alphabet?: ALPHABET, pepseaMethod?: string,
114
+ ): Promise<void> {
115
+ const srcDf: DG.DataFrame = DG.DataFrame.fromCsv(srcCsv);
116
+ await grok.data.detectSemanticTypes(srcDf);
117
+ const tgtDf: DG.DataFrame = DG.DataFrame.fromCsv(tgtCsv);
118
+
119
+ const tgtCol = tgtDf.getCol('seq')!;
120
+ const srcCol: DG.Column = srcDf.getCol('seq')!;
121
+ expect(srcCol.semType, DG.SEMTYPE.MACROMOLECULE);
122
+ expect(srcCol.meta.units, srcNotation);
123
+ if (alphabet)
124
+ expect(srcCol.getTag(bioTAGS.alphabet), alphabet);
125
+
126
+ const msaSeqCol = await multipleSequenceAlignmentUI({col: srcCol, pepsea: {method: pepseaMethod}}, seqHelper);
127
+ expect(msaSeqCol.semType, DG.SEMTYPE.MACROMOLECULE);
128
+ expect(msaSeqCol.meta.units, tgtNotation);
129
+ expect(msaSeqCol.getTag(bioTAGS.aligned), ALIGNMENT.SEQ_MSA);
130
+ if (alphabet)
131
+ expect(msaSeqCol.getTag(bioTAGS.alphabet), alphabet);
132
+ expectArray(msaSeqCol.toList(), tgtCol.toList());
133
+ }
102
134
  });
103
135
 
104
136
  async function _testMsaIsCorrect(srcCsv: string, tgtCsv: string): Promise<void> {
@@ -114,27 +146,4 @@ async function _testMsaIsCorrect(srcCsv: string, tgtCsv: string): Promise<void>
114
146
  expectArray(resCol.toList(), tgtCol.toList());
115
147
  }
116
148
 
117
- async function _testMSAOnColumn(
118
- srcCsv: string, tgtCsv: string,
119
- srcNotation: NOTATION, tgtNotation: NOTATION, alphabet?: ALPHABET, pepseaMethod?: string,
120
- ): Promise<void> {
121
- const srcDf: DG.DataFrame = DG.DataFrame.fromCsv(srcCsv);
122
- await grok.data.detectSemanticTypes(srcDf);
123
- const tgtDf: DG.DataFrame = DG.DataFrame.fromCsv(tgtCsv);
124
149
 
125
- const tgtCol = tgtDf.getCol('seq')!;
126
- const srcCol: DG.Column = srcDf.getCol('seq')!;
127
- expect(srcCol.semType, DG.SEMTYPE.MACROMOLECULE);
128
- expect(srcCol.meta.units, srcNotation);
129
- if (alphabet)
130
- expect(srcCol.getTag(bioTAGS.alphabet), alphabet);
131
-
132
- const msaSeqCol = await multipleSequenceAlignmentUI({col: srcCol, pepsea: {method: pepseaMethod}});
133
- expect(msaSeqCol.semType, DG.SEMTYPE.MACROMOLECULE);
134
- expect(msaSeqCol.semType, DG.SEMTYPE.MACROMOLECULE);
135
- expect(msaSeqCol.meta.units, tgtNotation);
136
- expect(msaSeqCol.getTag(bioTAGS.aligned), ALIGNMENT.SEQ_MSA);
137
- if (alphabet)
138
- expect(msaSeqCol.getTag(bioTAGS.alphabet), alphabet);
139
- expectArray(msaSeqCol.toList(), tgtCol.toList());
140
- }
@@ -7,7 +7,7 @@ import wu from 'wu';
7
7
  import {after, before, category, expect, test} from '@datagrok-libraries/utils/src/test';
8
8
  import {MonomerPlacer, hitBounds} from '@datagrok-libraries/bio/src/utils/cell-renderer-monomer-placer';
9
9
  import {monomerToShort} from '@datagrok-libraries/bio/src/utils/macromolecule';
10
- import {SeqHandler} from '@datagrok-libraries/bio/src/utils/seq-handler';
10
+ import {getSeqHelper, ISeqHelper} from '@datagrok-libraries/bio/src/utils/seq-helper';
11
11
  import {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';
12
12
  import {
13
13
  getUserLibSettings, setUserLibSettings
@@ -115,14 +115,13 @@ id3,QHIRE--LT
115
115
  const sepWidth: number = 12;
116
116
  const colTemp: MonomerPlacer = new MonomerPlacer(null, seqCol, _package.logger, monLength,
117
117
  () => {
118
- const sh = SeqHandler.forColumn(seqCol);
119
118
  return {
120
- seqHandler: sh,
121
119
  monomerCharWidth: charWidth,
122
120
  separatorWidth: sepWidth,
123
121
  monomerToShort: monomerToShort,
124
122
  };
125
123
  });
124
+ await colTemp.init();
126
125
 
127
126
  const width: number = 10000;
128
127
  const testList = testData.testList;
@@ -142,9 +141,7 @@ id3,QHIRE--LT
142
141
  throw new Error('Test failed error(s):\n' + errorList.join(', \n'));
143
142
  });
144
143
  }
145
- });
146
144
 
147
- category('renderers: monomerPlacer', () => {
148
145
  const boundsTestData = {
149
146
  bounds: [10, 20, 30, 40, 50, 60],
150
147
  tests: {
@@ -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
  });