@datagrok/sequence-translator 1.0.15 → 1.0.16

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.
@@ -0,0 +1,118 @@
1
+ import * as DG from 'datagrok-api/dg';
2
+ import {COL_NAMES, GENERATED_COL_NAMES, SEQUENCE_TYPES} from '../autostart/constants';
3
+ import * as grok from 'datagrok-api/grok';
4
+ import {removeEmptyRows} from '../helpers';
5
+ import {parseStrandsFromDuplexCell, parseStrandsFromTriplexOrDimerCell} from './parse';
6
+ import {isValidSequence} from '../structures-works/sequence-codes-tools';
7
+ import {batchMolWeight, molecularWeight, saltMass, saltMolWeigth} from '../autostart/calculations';
8
+ import {weightsObj} from '../structures-works/map';
9
+
10
+ export class SdfColumnsExistsError extends Error {
11
+ constructor(message: string) {
12
+ super();
13
+ }
14
+ }
15
+
16
+ export function sdfAddColumns(
17
+ df: DG.DataFrame, saltNamesList: string[], saltsMolWeightList: number[], onError: (rowI: number, err: any) => void
18
+ ): DG.DataFrame {
19
+ const sequenceCol = df.getCol(COL_NAMES.SEQUENCE);
20
+ const saltCol = df.getCol(COL_NAMES.SALT);
21
+ const equivalentsCol = df.getCol(COL_NAMES.EQUIVALENTS);
22
+ const typeCol = df.getCol(COL_NAMES.TYPE);
23
+ const chemistryNameCol = df.getCol(COL_NAMES.CHEMISTRY_NAME);
24
+
25
+ if (GENERATED_COL_NAMES.some((colName) => df.columns.contains(colName)))
26
+ throw new SdfColumnsExistsError('Columns already exist');
27
+
28
+ df = removeEmptyRows(df, sequenceCol);
29
+
30
+ df.columns.addNewString(COL_NAMES.COMPOUND_NAME).init((i: number) => {
31
+ let res: string = '';
32
+ try {
33
+ res = ([SEQUENCE_TYPES.DUPLEX, SEQUENCE_TYPES.DIMER, SEQUENCE_TYPES.TRIPLEX].includes(typeCol.get(i))) ?
34
+ chemistryNameCol.get(i) :
35
+ sequenceCol.get(i);
36
+ } catch (err) {
37
+ onError(i, err);
38
+ }
39
+ return res;
40
+ });
41
+
42
+ df.columns.addNewString(COL_NAMES.COMPOUND_COMMENTS).init((i: number) => {
43
+ let res: string = '';
44
+ try {
45
+ if ([SEQUENCE_TYPES.SENSE_STRAND, SEQUENCE_TYPES.ANTISENSE_STRAND].includes(typeCol.get(i))) {
46
+ res = sequenceCol.get(i);
47
+ } else if (typeCol.get(i) == SEQUENCE_TYPES.DUPLEX) {
48
+ const obj = parseStrandsFromDuplexCell(sequenceCol.get(i));
49
+ res = `${chemistryNameCol.get(i)}; duplex of SS: ${obj.SS} and AS: ${obj.AS}`;
50
+ } else if ([SEQUENCE_TYPES.DIMER, SEQUENCE_TYPES.TRIPLEX].includes(typeCol.get(i))) {
51
+ const obj = parseStrandsFromTriplexOrDimerCell(sequenceCol.get(i));
52
+ res = `${chemistryNameCol.get(i)}; duplex of SS: ${obj.SS} and AS1: ${obj.AS1} and AS2: ${obj.AS2}`;
53
+ }
54
+ } catch (err) {
55
+ onError(i, err);
56
+ }
57
+ return res;
58
+ });
59
+
60
+ df.columns.addNewFloat(COL_NAMES.COMPOUND_MOL_WEIGHT).init((i: number) => {
61
+ let res: number = Number.NaN;
62
+ try {
63
+ if ([SEQUENCE_TYPES.SENSE_STRAND, SEQUENCE_TYPES.ANTISENSE_STRAND].includes(typeCol.get(i))) {
64
+ res = (isValidSequence(sequenceCol.get(i), null).indexOfFirstNotValidChar == -1) ?
65
+ molecularWeight(sequenceCol.get(i), weightsObj) :
66
+ DG.FLOAT_NULL;
67
+ } else if (typeCol.get(i) == SEQUENCE_TYPES.DUPLEX) {
68
+ const obj = parseStrandsFromDuplexCell(sequenceCol.get(i));
69
+ res = (Object.values(obj).every((seq) => isValidSequence(seq, null).indexOfFirstNotValidChar == -1)) ?
70
+ molecularWeight(obj.SS, weightsObj) + molecularWeight(obj.AS, weightsObj) :
71
+ DG.FLOAT_NULL;
72
+ } else if ([SEQUENCE_TYPES.DIMER, SEQUENCE_TYPES.TRIPLEX].includes(typeCol.get(i))) {
73
+ const obj = parseStrandsFromTriplexOrDimerCell(sequenceCol.get(i));
74
+ res = (Object.values(obj).every((seq) => isValidSequence(seq, null).indexOfFirstNotValidChar == -1)) ?
75
+ molecularWeight(obj.SS, weightsObj) + molecularWeight(obj.AS1, weightsObj) +
76
+ molecularWeight(obj.AS2, weightsObj) :
77
+ DG.FLOAT_NULL;
78
+ }
79
+ } catch (err) {
80
+ onError(i, err);
81
+ }
82
+ return res;
83
+ });
84
+
85
+ df.columns.addNewFloat(COL_NAMES.SALT_MASS).init((i: number) => {
86
+ let res: number = Number.NaN;
87
+ try {
88
+ res = saltMass(saltNamesList, saltsMolWeightList, equivalentsCol, i, saltCol);
89
+ } catch (err) {
90
+ onError(i, err);
91
+ }
92
+ return res;
93
+ });
94
+
95
+ df.columns.addNewFloat(COL_NAMES.SALT_MOL_WEIGHT).init((i: number) => {
96
+ let res: number = Number.NaN;
97
+ try {
98
+ res = saltMolWeigth(saltNamesList, saltCol, saltsMolWeightList, i);
99
+ } catch (err) {
100
+ onError(i, err);
101
+ }
102
+ return res;
103
+ });
104
+
105
+ const compoundMolWeightCol = df.getCol(COL_NAMES.COMPOUND_MOL_WEIGHT);
106
+ const saltMassCol = df.getCol(COL_NAMES.SALT_MASS);
107
+ df.columns.addNewFloat(COL_NAMES.BATCH_MOL_WEIGHT).init((i: number) => {
108
+ let res: number = Number.NaN;
109
+ try {
110
+ res = batchMolWeight(compoundMolWeightCol, saltMassCol, i);
111
+ } catch (err) {
112
+ onError(i, err);
113
+ }
114
+ return res;
115
+ });
116
+
117
+ return df;
118
+ }
@@ -0,0 +1,56 @@
1
+ import * as DG from 'datagrok-api/dg';
2
+ import {COL_NAMES, GENERATED_COL_NAMES, SEQUENCE_TYPES} from '../autostart/constants';
3
+ import {differenceOfTwoArrays, download} from '../helpers';
4
+ import * as grok from 'datagrok-api/grok';
5
+ import {SYNTHESIZERS} from '../structures-works/map';
6
+ import {sequenceToMolV3000} from '../structures-works/from-monomers';
7
+ import {parseStrandsFromDuplexCell, parseStrandsFromTriplexOrDimerCell} from './parse';
8
+ import {linkStrandsV3000} from '../structures-works/mol-transformations';
9
+
10
+ export async function sdfSaveTable(table: DG.DataFrame, onError: (rowI: number, err: any) => void) {
11
+ if (GENERATED_COL_NAMES.some((colName) => !table.columns.contains(colName))) {
12
+ const absentColNames = differenceOfTwoArrays(GENERATED_COL_NAMES, table.columns.names()).join(`', '`);
13
+ grok.shell.warning(`File saved without columns '${absentColNames}'`);
14
+ }
15
+
16
+ const sequenceCol = table.getCol(COL_NAMES.SEQUENCE);
17
+ const typeCol = table.getCol(COL_NAMES.TYPE);
18
+
19
+ let resultStr = '';
20
+ const rowCount = table.rowCount;
21
+ for (let i = 0; i < rowCount; i++) {
22
+ try {
23
+ let rowStr = '';
24
+ const format = SYNTHESIZERS.GCRS; //getFormat(sequenceCol.get(i))!;
25
+ if (typeCol.get(i) == SEQUENCE_TYPES.SENSE_STRAND) {
26
+ rowStr += `${sequenceToMolV3000(sequenceCol.get(i), false, true, format)}\n> <Sequence>\nSense Strand\n\n`;
27
+ } else if (typeCol.get(i) == SEQUENCE_TYPES.ANTISENSE_STRAND) {
28
+ rowStr += `${sequenceToMolV3000(sequenceCol.get(i), true, true, format)}\n> <Sequence>\nAnti Sense\n\n`;
29
+ } else if (typeCol.get(i) == SEQUENCE_TYPES.DUPLEX) {
30
+ const obj = parseStrandsFromDuplexCell(sequenceCol.get(i));
31
+ const as = `${sequenceToMolV3000(obj.AS, true, true, format)}\n> <Sequence>\nAnti Sense\n\n`;
32
+ const ss = `${sequenceToMolV3000(obj.SS, false, true, format)}\n> <Sequence>\nSense Strand\n\n`;
33
+ rowStr += `${linkStrandsV3000({senseStrands: [ss], antiStrands: [as]}, true)}\n\n`;
34
+ } else if ([SEQUENCE_TYPES.TRIPLEX, SEQUENCE_TYPES.DIMER].includes(typeCol.get(i))) {
35
+ const obj = parseStrandsFromTriplexOrDimerCell(sequenceCol.get(i));
36
+ const as1 = `${sequenceToMolV3000(obj.AS1, true, true, format)}\n> <Sequence>\nAnti Sense\n\n`;
37
+ const as2 = `${sequenceToMolV3000(obj.AS2, true, true, format)}\n> <Sequence>\nAnti Sense\n\n`;
38
+ const ss = `${sequenceToMolV3000(obj.SS, false, true, format)}\n> <Sequence>\nSense Strand\n\n`;
39
+ rowStr += `${linkStrandsV3000({senseStrands: [ss], antiStrands: [as1, as2]}, true)}\n\n`;
40
+ }
41
+
42
+ for (const col of table.columns) {
43
+ if (col.name != COL_NAMES.SEQUENCE)
44
+ rowStr += `> <${col.name}>\n${col.get(i)}\n\n`;
45
+ }
46
+
47
+ rowStr += '$$$$\n';
48
+
49
+ resultStr += rowStr;
50
+ } catch (err: any) {
51
+ onError(i, err);
52
+ }
53
+ }
54
+
55
+ download(`${table.name}.sdf`, encodeURIComponent(resultStr));
56
+ }
@@ -1,4 +1,4 @@
1
- <html><head><meta charset="utf-8"/><title>SequenceTranslator Test Report. Datagrok version datagrok/datagrok:latest SHA=91c83d8913ff. Commit f94596bc.</title><style type="text/css">html,
1
+ <html><head><meta charset="utf-8"/><title>SequenceTranslator Test Report. Datagrok version datagrok/datagrok:latest SHA=6288c2fbe346. Commit cce4ac1d.</title><style type="text/css">html,
2
2
  body {
3
3
  font-family: Arial, Helvetica, sans-serif;
4
4
  font-size: 1rem;
@@ -229,7 +229,7 @@ header {
229
229
  font-size: 1rem;
230
230
  padding: 0 0.5rem;
231
231
  }
232
- </style></head><body><div id="jesthtml-content"><header><h1 id="title">SequenceTranslator Test Report. Datagrok version datagrok/datagrok:latest SHA=91c83d8913ff. Commit f94596bc.</h1></header><div id="metadata-container"><div id="timestamp">Started: 2022-11-29 11:55:21</div><div id="summary"><div id="suite-summary"><div class="summary-total">Suites (1)</div><div class="summary-passed">1 passed</div><div class="summary-failed summary-empty">0 failed</div><div class="summary-pending summary-empty">0 pending</div></div><div id="test-summary"><div class="summary-total">Tests (1)</div><div class="summary-passed">1 passed</div><div class="summary-failed summary-empty">0 failed</div><div class="summary-pending summary-empty">0 pending</div></div></div></div><div id="suite-1" class="suite-container"><div class="suite-info"><div class="suite-path">/home/runner/work/public/public/packages/SequenceTranslator/src/__jest__/remote.test.ts</div><div class="suite-time warn">18.993s</div></div><div class="suite-tests"><div class="test-result passed"><div class="test-info"><div class="test-suitename"> </div><div class="test-title">TEST</div><div class="test-status">passed</div><div class="test-duration">5.501s</div></div></div></div><div class="suite-consolelog"><div class="suite-consolelog-header">Console Log</div><div class="suite-consolelog-item"><pre class="suite-consolelog-item-origin"> at Object.&lt;anonymous&gt; (/home/runner/work/public/public/packages/SequenceTranslator/src/__jest__/test-node.ts:62:11)
232
+ </style></head><body><div id="jesthtml-content"><header><h1 id="title">SequenceTranslator Test Report. Datagrok version datagrok/datagrok:latest SHA=6288c2fbe346. Commit cce4ac1d.</h1></header><div id="metadata-container"><div id="timestamp">Started: 2022-12-12 14:55:37</div><div id="summary"><div id="suite-summary"><div class="summary-total">Suites (1)</div><div class="summary-passed">1 passed</div><div class="summary-failed summary-empty">0 failed</div><div class="summary-pending summary-empty">0 pending</div></div><div id="test-summary"><div class="summary-total">Tests (1)</div><div class="summary-passed">1 passed</div><div class="summary-failed summary-empty">0 failed</div><div class="summary-pending summary-empty">0 pending</div></div></div></div><div id="suite-1" class="suite-container"><div class="suite-info"><div class="suite-path">/home/runner/work/public/public/packages/SequenceTranslator/src/__jest__/remote.test.ts</div><div class="suite-time warn">21.067s</div></div><div class="suite-tests"><div class="test-result passed"><div class="test-info"><div class="test-suitename"> </div><div class="test-title">TEST</div><div class="test-status">passed</div><div class="test-duration">6.276s</div></div></div></div><div class="suite-consolelog"><div class="suite-consolelog-header">Console Log</div><div class="suite-consolelog-item"><pre class="suite-consolelog-item-origin"> at Object.&lt;anonymous&gt; (/home/runner/work/public/public/packages/SequenceTranslator/src/__jest__/test-node.ts:62:11)
233
233
  at Generator.next (&lt;anonymous&gt;)
234
234
  at fulfilled (/home/runner/work/public/public/packages/SequenceTranslator/src/__jest__/test-node.ts:28:58)
235
235
  at processTicksAndRejections (internal/process/task_queues.js:97:5)</pre><pre class="suite-consolelog-item-message">Using web root: http://localhost:8080</pre></div><div class="suite-consolelog-item"><pre class="suite-consolelog-item-origin"> at /home/runner/work/public/public/packages/SequenceTranslator/src/__jest__/remote.test.ts:40:11
@@ -242,16 +242,16 @@ header {
242
242
  at new Promise (&lt;anonymous&gt;)</pre><pre class="suite-consolelog-item-message">Testing SequenceTranslator package</pre></div><div class="suite-consolelog-item"><pre class="suite-consolelog-item-origin"> at /home/runner/work/public/public/packages/SequenceTranslator/src/__jest__/remote.test.ts:72:11
243
243
  at Generator.next (&lt;anonymous&gt;)
244
244
  at fulfilled (/home/runner/work/public/public/packages/SequenceTranslator/src/__jest__/remote.test.ts:28:58)
245
- at processTicksAndRejections (internal/process/task_queues.js:97:5)</pre><pre class="suite-consolelog-item-message">Test result : Success : 1 : SequenceTranslator.sequence-translator.usCfCfUfGfAf : OK
245
+ at processTicksAndRejections (internal/process/task_queues.js:97:5)</pre><pre class="suite-consolelog-item-message">Test result : Success : 2 : SequenceTranslator.sequence-translator.usCfCfUfGfAf : OK
246
246
  Test result : Success : 0 : SequenceTranslator.sequence-translator.usAfsusgsgsg : OK
247
- Test result : Success : 1 : SequenceTranslator.sequence-translator.UfUfUfsCfsuacg : OK
247
+ Test result : Success : 0 : SequenceTranslator.sequence-translator.UfUfUfsCfsuacg : OK
248
248
  Test result : Success : 0 : SequenceTranslator.sequence-translator.susususauasu : OK
249
- Test result : Success : 1 : SequenceTranslator.sequence-translator.CfGfCfsGfsCf : OK
250
- Test result : Success : 0 : SequenceTranslator.sequence-translator.acacacsacsac : OK
251
- Test result : Success : 1 : SequenceTranslator.sequence-translator.cccgggusug : OK
249
+ Test result : Success : 0 : SequenceTranslator.sequence-translator.CfGfCfsGfsCf : OK
250
+ Test result : Success : 1 : SequenceTranslator.sequence-translator.acacacsacsac : OK
251
+ Test result : Success : 0 : SequenceTranslator.sequence-translator.cccgggusug : OK
252
252
  Test result : Success : 0 : SequenceTranslator.sequence-translator.UfAfCfGfGfCfAfUf : OK
253
253
  Test result : Success : 1 : SequenceTranslator.sequence-translator.(invabasic)cuCfuUfsc : OK
254
- Test result : Success : 0 : SequenceTranslator.sequence-translator.(invabasic)usAfsucuCfuUfAfgcugUfgCfacususu : OK
254
+ Test result : Success : 1 : SequenceTranslator.sequence-translator.(invabasic)usAfsucuCfuUfAfgcugUfgCfacususu : OK
255
255
  Test result : Success : 1 : SequenceTranslator.sequence-translator.(invabasic)asacgGfuGfCfAfacucuauuca : OK
256
256
  </pre></div><div class="suite-consolelog-item"><pre class="suite-consolelog-item-origin"> at /home/runner/work/public/public/packages/SequenceTranslator/src/__jest__/remote.test.ts:74:11
257
257
  at Generator.next (&lt;anonymous&gt;)