@datagrok/bio 2.1.11 → 2.4.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 (64) hide show
  1. package/README.md +11 -12
  2. package/css/helm.css +10 -0
  3. package/detectors.js +83 -59
  4. package/dist/package-test.js +2 -68651
  5. package/dist/package-test.js.map +1 -0
  6. package/dist/package.js +2 -66040
  7. package/dist/package.js.map +1 -0
  8. package/dockerfiles/Dockerfile +86 -0
  9. package/files/icons/composition-analysis.svg +17 -0
  10. package/files/icons/sequence-diversity-viewer.svg +4 -0
  11. package/files/icons/sequence-similarity-viewer.svg +4 -0
  12. package/files/icons/vdregions-viewer.svg +22 -0
  13. package/files/icons/weblogo-viewer.svg +7 -0
  14. package/files/tests/testUrl.csv +11 -0
  15. package/files/tests/toAtomicLevelTest.csv +4 -0
  16. package/package.json +29 -32
  17. package/src/analysis/sequence-activity-cliffs.ts +15 -13
  18. package/src/analysis/sequence-diversity-viewer.ts +3 -2
  19. package/src/analysis/sequence-search-base-viewer.ts +4 -2
  20. package/src/analysis/sequence-similarity-viewer.ts +4 -4
  21. package/src/analysis/sequence-space.ts +2 -1
  22. package/src/calculations/monomerLevelMols.ts +6 -6
  23. package/src/package-test.ts +9 -2
  24. package/src/package.ts +230 -145
  25. package/src/substructure-search/substructure-search.ts +25 -22
  26. package/src/tests/Palettes-test.ts +9 -9
  27. package/src/tests/WebLogo-positions-test.ts +131 -68
  28. package/src/tests/_first-tests.ts +9 -0
  29. package/src/tests/activity-cliffs-tests.ts +8 -7
  30. package/src/tests/activity-cliffs-utils.ts +17 -9
  31. package/src/tests/bio-tests.ts +30 -21
  32. package/src/tests/checkInputColumn-tests.ts +17 -17
  33. package/src/tests/converters-test.ts +81 -46
  34. package/src/tests/detectors-benchmark-tests.ts +17 -17
  35. package/src/tests/detectors-tests.ts +190 -178
  36. package/src/tests/fasta-export-tests.ts +2 -3
  37. package/src/tests/monomer-libraries-tests.ts +34 -0
  38. package/src/tests/pepsea-tests.ts +21 -0
  39. package/src/tests/renderers-test.ts +33 -29
  40. package/src/tests/sequence-space-test.ts +6 -4
  41. package/src/tests/similarity-diversity-tests.ts +4 -4
  42. package/src/tests/splitters-test.ts +6 -7
  43. package/src/tests/substructure-filters-tests.ts +23 -1
  44. package/src/tests/utils/sequences-generators.ts +7 -7
  45. package/src/tests/utils.ts +2 -1
  46. package/src/tests/viewers.ts +16 -0
  47. package/src/utils/cell-renderer.ts +116 -54
  48. package/src/utils/constants.ts +7 -6
  49. package/src/utils/convert.ts +17 -11
  50. package/src/utils/monomer-lib.ts +174 -0
  51. package/src/utils/multiple-sequence-alignment.ts +49 -26
  52. package/src/utils/pepsea.ts +78 -0
  53. package/src/utils/save-as-fasta.ts +9 -8
  54. package/src/utils/ui-utils.ts +15 -3
  55. package/src/viewers/vd-regions-viewer.ts +125 -83
  56. package/src/viewers/web-logo-viewer.ts +1031 -0
  57. package/src/widgets/bio-substructure-filter.ts +38 -24
  58. package/tsconfig.json +71 -72
  59. package/webpack.config.js +4 -11
  60. package/dist/vendors-node_modules_datagrok-libraries_ml_src_workers_dimensionality-reducer_js.js +0 -8988
  61. package/jest.config.js +0 -33
  62. package/src/__jest__/remote.test.ts +0 -77
  63. package/src/__jest__/test-node.ts +0 -98
  64. package/test-Bio-91c83d8913ff-bb573307.html +0 -392
@@ -1,14 +1,15 @@
1
1
  import * as grok from 'datagrok-api/grok';
2
2
  import * as DG from 'datagrok-api/dg';
3
- import * as bio from '@datagrok-libraries/bio';
4
3
 
5
4
  import {after, before, category, delay, expect, test} from '@datagrok-libraries/utils/src/test';
6
5
 
7
6
  import {importFasta, multipleSequenceAlignmentAny} from '../package';
8
7
  import {convertDo} from '../utils/convert';
9
- import {SEM_TYPES, TAGS} from '../utils/constants';
8
+ import * as C from '../utils/constants';
10
9
  import {generateLongSequence, generateManySequences, performanceTest} from './utils/sequences-generators';
11
10
  import {errorToConsole} from '@datagrok-libraries/utils/src/to-console';
11
+ import {ALIGNMENT, ALPHABET, NOTATION, TAGS as bioTAGS} from '@datagrok-libraries/bio/src/utils/macromolecule';
12
+ import {UnitsHandler} from '@datagrok-libraries/bio/src/utils/units-handler';
12
13
 
13
14
  category('renderers', () => {
14
15
  let tvList: DG.TableView[];
@@ -20,8 +21,9 @@ category('renderers', () => {
20
21
  });
21
22
 
22
23
  after(async () => {
23
- dfList.forEach((df: DG.DataFrame) => { grok.shell.closeTable(df); });
24
- tvList.forEach((tv: DG.TableView) => tv.close());
24
+ // Closing viewes and data frames leads to exception
25
+ // dfList.forEach((df: DG.DataFrame) => { grok.shell.closeTable(df); });
26
+ // tvList.forEach((tv: DG.TableView) => tv.close());
25
27
  });
26
28
 
27
29
  test('long sequence performance ', async () => {
@@ -50,7 +52,7 @@ category('renderers', () => {
50
52
 
51
53
  test('afterConvert', async () => {
52
54
  await _testAfterConvert();
53
- });
55
+ }, {skipReason: 'GROK-12765'});
54
56
 
55
57
  test('selectRendererBySemType', async () => {
56
58
  await _selectRendererBySemType();
@@ -103,9 +105,9 @@ category('renderers', () => {
103
105
  async function _rendererMacromoleculeDifference() {
104
106
  const seqDiffCol: DG.Column = DG.Column.fromStrings('SequencesDiff',
105
107
  ['meI/hHis/Aca/N/T/dK/Thr_PO3H2/Aca#D-Tyr_Et/Tyr_ab-dehydroMe/meN/E/N/dV']);
106
- seqDiffCol.tags[DG.TAGS.UNITS] = bio.NOTATION.SEPARATOR;
107
- seqDiffCol.tags[TAGS.SEPARATOR] = '/';
108
- seqDiffCol.semType = SEM_TYPES.MACROMOLECULE_DIFFERENCE;
108
+ seqDiffCol.tags[DG.TAGS.UNITS] = NOTATION.SEPARATOR;
109
+ seqDiffCol.tags[bioTAGS.separator] = '/';
110
+ seqDiffCol.semType = C.SEM_TYPES.MACROMOLECULE_DIFFERENCE;
109
111
  const df = DG.DataFrame.fromColumns([seqDiffCol]);
110
112
 
111
113
  const tv: DG.TableView = grok.shell.addTableView(df);
@@ -116,7 +118,7 @@ category('renderers', () => {
116
118
  tvList.push(tv);
117
119
 
118
120
  const resCellRenderer = seqDiffCol.getTag(DG.TAGS.CELL_RENDERER);
119
- expect(resCellRenderer, 'MacromoleculeDifference');
121
+ expect(resCellRenderer, C.SEM_TYPES.MACROMOLECULE_DIFFERENCE);
120
122
  }
121
123
 
122
124
  async function _testAfterMsa() {
@@ -138,22 +140,22 @@ category('renderers', () => {
138
140
  `semType="${srcSeqCol!.semType}", units="${srcSeqCol!.getTag(DG.TAGS.UNITS)}", ` +
139
141
  `cell.renderer="${srcSeqCol!.getTag(DG.TAGS.CELL_RENDERER)}"`);
140
142
  expect(srcSeqCol.semType, DG.SEMTYPE.MACROMOLECULE);
141
- expect(srcSeqCol.getTag(DG.TAGS.UNITS), bio.NOTATION.FASTA);
142
- expect(srcSeqCol.getTag(bio.TAGS.aligned), bio.ALIGNMENT.SEQ);
143
- expect(srcSeqCol.getTag(bio.TAGS.alphabet), bio.ALPHABET.PT);
143
+ expect(srcSeqCol.getTag(DG.TAGS.UNITS), NOTATION.FASTA);
144
+ expect(srcSeqCol.getTag(bioTAGS.aligned), ALIGNMENT.SEQ);
145
+ expect(srcSeqCol.getTag(bioTAGS.alphabet), ALPHABET.PT);
144
146
  expect(srcSeqCol.getTag(DG.TAGS.CELL_RENDERER), 'sequence');
145
147
 
146
- const msaSeqCol: DG.Column = (await multipleSequenceAlignmentAny(df, srcSeqCol!))!;
148
+ const msaSeqCol = multipleSequenceAlignmentAny(srcSeqCol);
147
149
  tv.grid.invalidate();
148
150
 
149
- expect(msaSeqCol.semType, DG.SEMTYPE.MACROMOLECULE);
150
- expect(msaSeqCol.getTag(DG.TAGS.UNITS), bio.NOTATION.FASTA);
151
- expect(msaSeqCol.getTag(bio.TAGS.aligned), bio.ALIGNMENT.SEQ_MSA);
152
- expect(msaSeqCol.getTag(bio.TAGS.alphabet), bio.ALPHABET.PT);
153
- expect(msaSeqCol.getTag(DG.TAGS.CELL_RENDERER), 'sequence');
151
+ // expect(msaSeqCol.semType, DG.SEMTYPE.MACROMOLECULE);
152
+ // expect(msaSeqCol.getTag(DG.TAGS.UNITS), NOTATION.FASTA);
153
+ // expect(msaSeqCol.getTag(bioTAGS.aligned), ALIGNMENT.SEQ_MSA);
154
+ // expect(msaSeqCol.getTag(bioTAGS.alphabet), ALPHABET.PT);
155
+ // expect(msaSeqCol.getTag(DG.TAGS.CELL_RENDERER), 'sequence');
154
156
 
155
157
  // check newColumn with UnitsHandler constructor
156
- const uh: bio.UnitsHandler = new bio.UnitsHandler(msaSeqCol);
158
+ // const uh: UnitsHandler = new UnitsHandler(msaSeqCol);
157
159
 
158
160
  dfList.push(df);
159
161
  tvList.push(tv);
@@ -175,13 +177,13 @@ category('renderers', () => {
175
177
  tvList.push(tv);
176
178
  dfList.push(df);
177
179
 
178
- const tgtCol: DG.Column = await convertDo(srcCol, bio.NOTATION.SEPARATOR, '/');
180
+ const tgtCol: DG.Column = await convertDo(srcCol, NOTATION.SEPARATOR, '/');
179
181
 
180
182
  const resCellRenderer = tgtCol.getTag(DG.TAGS.CELL_RENDERER);
181
183
  expect(resCellRenderer, 'sequence');
182
184
 
183
185
  // check tgtCol with UnitsHandler constructor
184
- const uh: bio.UnitsHandler = new bio.UnitsHandler(tgtCol);
186
+ const uh: UnitsHandler = new UnitsHandler(tgtCol);
185
187
  }
186
188
 
187
189
  async function _selectRendererBySemType() {
@@ -190,9 +192,9 @@ category('renderers', () => {
190
192
  /**/
191
193
  const seqDiffCol: DG.Column = DG.Column.fromStrings('SequencesDiff',
192
194
  ['meI/hHis/Aca/N/T/dK/Thr_PO3H2/Aca#D-Tyr_Et/Tyr_ab-dehydroMe/meN/E/N/dV']);
193
- seqDiffCol.tags[DG.TAGS.UNITS] = bio.NOTATION.SEPARATOR;
194
- seqDiffCol.tags[TAGS.SEPARATOR] = '/';
195
- seqDiffCol.semType = SEM_TYPES.MACROMOLECULE_DIFFERENCE;
195
+ seqDiffCol.tags[DG.TAGS.UNITS] = NOTATION.SEPARATOR;
196
+ seqDiffCol.tags[bioTAGS.separator] = '/';
197
+ seqDiffCol.semType = C.SEM_TYPES.MACROMOLECULE_DIFFERENCE;
196
198
  const df = DG.DataFrame.fromColumns([seqDiffCol]);
197
199
  const tv = grok.shell.addTableView(df);
198
200
  dfList.push(df);
@@ -200,10 +202,11 @@ category('renderers', () => {
200
202
 
201
203
  await delay(100);
202
204
  const renderer = seqDiffCol.getTag(DG.TAGS.CELL_RENDERER);
203
- if (renderer !== 'MacromoleculeDifference') // this is value of MacromoleculeDifferenceCR.cellType
205
+ if (renderer !== 'MacromoleculeDifference') { // this is value of MacromoleculeDifferenceCR.cellType
204
206
  throw new Error(`Units 'separator', separator '/' and semType 'MacromoleculeDifference' ` +
205
207
  `have been manually set on column but after df was added as table, ` +
206
208
  `view renderer has set to '${renderer}' instead of correct 'MacromoleculeDifference'.`);
209
+ }
207
210
  }
208
211
 
209
212
  /** GROK-11212 Do not overwrite / recalculate 'cell.renderer' tag that has been set programmatically
@@ -211,9 +214,9 @@ category('renderers', () => {
211
214
  async function _setRendererManually() {
212
215
  const seqDiffCol: DG.Column = DG.Column.fromStrings('SequencesDiff',
213
216
  ['meI/hHis/Aca/N/T/dK/Thr_PO3H2/Aca#D-Tyr_Et/Tyr_ab-dehydroMe/meN/E/N/dV']);
214
- seqDiffCol.tags[DG.TAGS.UNITS] = bio.NOTATION.SEPARATOR;
215
- seqDiffCol.tags[TAGS.SEPARATOR] = '/';
216
- seqDiffCol.semType = SEM_TYPES.MACROMOLECULE;
217
+ seqDiffCol.tags[DG.TAGS.UNITS] = NOTATION.SEPARATOR;
218
+ seqDiffCol.tags[bioTAGS.separator] = '/';
219
+ seqDiffCol.semType = DG.SEMTYPE.MACROMOLECULE;
217
220
  const tgtCellRenderer = 'MacromoleculeDifference';
218
221
  seqDiffCol.setTag(DG.TAGS.CELL_RENDERER, tgtCellRenderer);
219
222
  const df = DG.DataFrame.fromColumns([seqDiffCol]);
@@ -224,9 +227,10 @@ category('renderers', () => {
224
227
 
225
228
  await delay(100);
226
229
  const resCellRenderer = seqDiffCol.getTag(DG.TAGS.CELL_RENDERER);
227
- if (resCellRenderer !== tgtCellRenderer) // this is value of MacromoleculeDifferenceCR.cellType
230
+ if (resCellRenderer !== tgtCellRenderer) { // this is value of MacromoleculeDifferenceCR.cellType
228
231
  throw new Error(`Tag 'cell.renderer' has been manually set to '${tgtCellRenderer}' for column ` +
229
232
  `but after df was added as table, tag 'cell.renderer' has reset to '${resCellRenderer}' ` +
230
233
  `instead of manual '${tgtCellRenderer}'.`);
234
+ }
231
235
  }
232
236
  });
@@ -1,7 +1,9 @@
1
- import {after, before, category, test, expect, delay} from '@datagrok-libraries/utils/src/test';
1
+ import * as grok from 'datagrok-api/grok';
2
+ import * as ui from 'datagrok-api/ui';
2
3
  import * as DG from 'datagrok-api/dg';
4
+
5
+ import {after, before, category, test, expect, delay} from '@datagrok-libraries/utils/src/test';
3
6
  import {readDataframe} from './utils';
4
- import * as grok from 'datagrok-api/grok';
5
7
  import {_testSequenceSpaceReturnsResult} from './sequence-space-utils';
6
8
 
7
9
  category('sequenceSpace', async () => {
@@ -16,7 +18,7 @@ category('sequenceSpace', async () => {
16
18
  await _testSequenceSpaceReturnsResult(testFastaDf, 'UMAP', 'MSA');
17
19
  grok.shell.closeTable(testFastaDf);
18
20
  testFastaTableView.close();
19
- });
21
+ }, {skipReason: 'GROK-12775'});
20
22
 
21
23
  test('sequenceSpaceWithEmptyRows', async () => {
22
24
  testHelmWithEmptyRows = await readDataframe('tests/sample_MSA_data_empty_vals.csv');
@@ -24,5 +26,5 @@ category('sequenceSpace', async () => {
24
26
  await _testSequenceSpaceReturnsResult(testHelmWithEmptyRows, 'UMAP', 'MSA');
25
27
  grok.shell.closeTable(testHelmWithEmptyRows);
26
28
  testHelmWithEmptyRowsTableView.close();
27
- });
29
+ }, {skipReason: 'GROK-12775'});
28
30
  });
@@ -31,9 +31,9 @@ category('similarity/diversity', async () => {
31
31
 
32
32
  async function _testSimilaritySearchViewer() {
33
33
  const molecules = await createTableView('tests/sample_MSA_data.csv');
34
- const viewer = molecules.addViewer('SequenceSimilaritySearchViewer');
34
+ const viewer = molecules.addViewer('Sequence Similarity Search');
35
35
  await delay(100);
36
- const similaritySearchViewer = getSearchViewer(viewer, 'SequenceSimilaritySearchViewer');
36
+ const similaritySearchViewer = getSearchViewer(viewer, 'Sequence Similarity Search');
37
37
  viewList.push(similaritySearchViewer);
38
38
  viewList.push(molecules);
39
39
  if (!similaritySearchViewer.molCol)
@@ -59,9 +59,9 @@ async function _testSimilaritySearchViewer() {
59
59
 
60
60
  async function _testDiversitySearchViewer() {
61
61
  const molecules = await createTableView('tests/sample_MSA_data.csv');
62
- const viewer = molecules.addViewer('SequenceDiversitySearchViewer');
62
+ const viewer = molecules.addViewer('Sequence Diversity Search');
63
63
  await delay(10);
64
- const diversitySearchviewer = getSearchViewer(viewer, 'SequenceDiversitySearchViewer');
64
+ const diversitySearchviewer = getSearchViewer(viewer, 'Sequence Diversity Search');
65
65
  viewList.push(diversitySearchviewer);
66
66
  viewList.push(molecules);
67
67
  if (!diversitySearchviewer.renderMolIds)
@@ -1,12 +1,12 @@
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
- import * as bio from '@datagrok-libraries/bio';
5
4
 
6
5
  import {after, before, category, test, expect, expectArray, expectObject} from '@datagrok-libraries/utils/src/test';
7
6
  import * as C from '../utils/constants';
8
7
  import {splitToMonomers, _package, getHelmMonomers} from '../package';
9
8
  import {errorToConsole} from '@datagrok-libraries/utils/src/to-console';
9
+ import {TAGS as bioTAGS, splitterAsFasta, splitterAsHelm} from '@datagrok-libraries/bio/src/utils/macromolecule';
10
10
 
11
11
 
12
12
  category('splitters', () => {
@@ -83,7 +83,7 @@ category('splitters', () => {
83
83
  const semType = await grok.functions.call('Bio:detectMacromolecule', {col: seqCol});
84
84
  if (semType)
85
85
  seqCol.semType = semType;
86
- seqCol.setTag(C.TAGS.ALIGNED, C.MSA);
86
+ seqCol.setTag(bioTAGS.aligned, C.MSA);
87
87
 
88
88
  const tv: DG.TableView = grok.shell.addTableView(df);
89
89
  // call to calculate 'cell.renderer' tag
@@ -92,9 +92,9 @@ category('splitters', () => {
92
92
  dfList.push(df);
93
93
  tvList.push(tv);
94
94
 
95
- splitToMonomers(seqCol);
95
+ splitToMonomers();
96
96
  expect(df.columns.names().includes('17'), true);
97
- });
97
+ }, {skipReason: 'GROK-12766'});
98
98
 
99
99
  test('getHelmMonomers', async () => {
100
100
  const df: DG.DataFrame = DG.DataFrame.fromCsv(
@@ -122,14 +122,13 @@ PEPTIDE1{hHis.Aca.Cys_SEt}$$$,5.72388
122
122
  });
123
123
 
124
124
  export async function _testFastaSplitter(src: string, tgt: string[]) {
125
- const res: string[] = bio.splitterAsFasta(src);
125
+ const res: string[] = splitterAsFasta(src);
126
126
  console.debug(`Bio: tests: splitters: src=${JSON.stringify(src)}, res=${JSON.stringify(res)} .`);
127
127
  expectArray(res, tgt);
128
128
  }
129
129
 
130
130
  export async function _testHelmSplitter(src: string, tgt: string[]) {
131
- const res: string[] = bio.splitterAsHelm(src);
131
+ const res: string[] = splitterAsHelm(src);
132
132
  console.debug(`Bio: tests: splitters: src=${JSON.stringify(src)}, res=${JSON.stringify(res)} .`);
133
133
  expectArray(res, tgt);
134
134
  }
135
-
@@ -1,11 +1,33 @@
1
1
  import {after, before, category, test, expect, delay} from '@datagrok-libraries/utils/src/test';
2
2
  import * as DG from 'datagrok-api/dg';
3
3
  import * as grok from 'datagrok-api/grok';
4
+
4
5
  import {readDataframe} from './utils';
5
6
  import {BioSubstructureFilter, HelmFilter, SeparatorFilter} from '../widgets/bio-substructure-filter';
7
+ import {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';
8
+ import {LIB_DEFAULT, LIB_STORAGE_NAME} from '../utils/monomer-lib';
6
9
 
7
10
 
8
11
  category('substructureFilters', async () => {
12
+ let monomerLibHelper: IMonomerLibHelper;
13
+ /** Backup actual user's monomer libraries settings */
14
+ let userLibrariesSettings: {};
15
+
16
+ before(async () => {
17
+ monomerLibHelper = await getMonomerLibHelper();
18
+ userLibrariesSettings = await grok.dapi.userDataStorage.get(LIB_STORAGE_NAME, true);
19
+
20
+ // Test 'helm' requires default monomer library loaded
21
+ await grok.dapi.userDataStorage.post(LIB_STORAGE_NAME, LIB_DEFAULT, true);
22
+ await monomerLibHelper.loadLibraries(true); // load default libraries
23
+ });
24
+
25
+ after(async () => {
26
+ // UserDataStorage.put() replaces existing data
27
+ await grok.dapi.userDataStorage.put(LIB_STORAGE_NAME, userLibrariesSettings, true);
28
+ await monomerLibHelper.loadLibraries(true); // load user settings libraries
29
+ });
30
+
9
31
  test('fasta', async () => {
10
32
  const fasta = await readDataframe('tests/filter_FASTA.csv');
11
33
  const filter = new BioSubstructureFilter();
@@ -69,5 +91,5 @@ category('substructureFilters', async () => {
69
91
  expect(filter.dataFrame!.filter.trueCount, 1);
70
92
  expect(filter.dataFrame!.filter.get(3), true);
71
93
  helmTableView.close();
72
- }, {skipReason: '#1206'});
94
+ }, {skipReason: 'GROK-12779'});
73
95
  });
@@ -1,18 +1,18 @@
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
- import * as bio from '@datagrok-libraries/bio';
4
+ import {ALIGNMENT, ALPHABET, NOTATION, TAGS as bioTAGS} from '@datagrok-libraries/bio/src/utils/macromolecule';
5
5
 
6
6
 
7
7
  export function generateManySequences(): DG.Column[] {
8
- let columns: DG.Column[] = [];
8
+ const columns: DG.Column[] = [];
9
9
  columns.push(DG.Column.fromList('string', 'MSA', new Array(10 ** 6).fill('meI/hHis/Aca/N/T/dE/Thr_PO3H2/Aca/D-Tyr_Et/Tyr_ab-dehydroMe/dV/E/N/D-Orn/D-aThr//Phe_4Me')));
10
10
  columns.push(DG.Column.fromList('string', 'Activity', new Array(10 ** 6).fill('5.30751')));
11
11
  return columns;
12
12
  }
13
13
 
14
14
  export function generateLongSequence(): DG.Column[] {
15
- let columns: DG.Column[] = [];
15
+ const columns: DG.Column[] = [];
16
16
  const longSequence = `meI/hHis/Aca/N/T/dE/Thr_PO3H2/Aca/D-Tyr_Et/Tyr_ab-dehydroMe/dV/E/N/D-Orn/D-aThr`.repeat(10 ** 5);
17
17
  columns.push(DG.Column.fromList('string', 'MSA', new Array(10 ** 2).fill(longSequence)));
18
18
  columns.push(DG.Column.fromList('string', 'Activity', new Array(10 ** 2).fill('7.30751')));
@@ -21,10 +21,10 @@ export function generateLongSequence(): DG.Column[] {
21
21
 
22
22
  export function setTagsMacromolecule(col: DG.Column) {
23
23
  col.semType = DG.SEMTYPE.MACROMOLECULE;
24
- col.setTag(DG.TAGS.UNITS, bio.NOTATION.SEPARATOR);
25
- col.setTag(bio.TAGS.aligned, bio.ALIGNMENT.SEQ_MSA);
26
- col.setTag(bio.TAGS.alphabet, bio.ALPHABET.UN);
27
- col.setTag(bio.TAGS.separator, '/');
24
+ col.setTag(DG.TAGS.UNITS, NOTATION.SEPARATOR);
25
+ col.setTag(bioTAGS.aligned, ALIGNMENT.SEQ_MSA);
26
+ col.setTag(bioTAGS.alphabet, ALPHABET.UN);
27
+ col.setTag(bioTAGS.separator, '/');
28
28
  return col;
29
29
  }
30
30
 
@@ -1,8 +1,9 @@
1
1
  import * as DG from 'datagrok-api/dg';
2
2
  import * as grok from 'datagrok-api/grok';
3
+
4
+ import {_package} from '../package-test';
3
5
  import {expect} from '@datagrok-libraries/utils/src/test';
4
6
  import {runKalign} from '../utils/multiple-sequence-alignment';
5
- import {_package} from '../package-test';
6
7
 
7
8
  export async function loadFileAsText(name: string): Promise<string> {
8
9
  return await _package.files.readAsText(name);
@@ -0,0 +1,16 @@
1
+ import * as DG from 'datagrok-api/dg';
2
+ // import * as grok from 'datagrok-api/grok';
3
+ //import * as ui from 'datagrok-api/ui';
4
+
5
+ import {category, test, testViewer} from '@datagrok-libraries/utils/src/test';
6
+ import {readDataframe} from './utils';
7
+
8
+
9
+ category('viewers', () => {
10
+ const viewers = DG.Func.find({package: 'Bio', tags: ['viewer']}).map((f) => f.friendlyName);
11
+ for (const v of viewers) {
12
+ test(v, async () => {
13
+ await testViewer(v, await readDataframe('data/sample_FASTA_DNA.csv'), true);
14
+ });
15
+ }
16
+ });