@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.
- package/.eslintrc.json +16 -3
- package/dist/package-test.js +529 -206
- package/dist/package.js +529 -206
- package/package.json +2 -2
- package/src/apps/oligo-sd-file-app.ts +58 -0
- package/src/autostart/calculations.ts +9 -6
- package/src/autostart/constants.ts +0 -12
- package/src/autostart/registration.ts +121 -149
- package/src/main/main-view.ts +4 -4
- package/src/package.ts +50 -3
- package/src/utils/parse.ts +27 -0
- package/src/utils/sdf-add-columns.ts +118 -0
- package/src/utils/sdf-save-table.ts +56 -0
- package/{test-SequenceTranslator-91c83d8913ff-f94596bc.html → test-SequenceTranslator-6288c2fbe346-cce4ac1d.html} +8 -8
|
@@ -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=
|
|
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=
|
|
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.<anonymous> (/home/runner/work/public/public/packages/SequenceTranslator/src/__jest__/test-node.ts:62:11)
|
|
233
233
|
at Generator.next (<anonymous>)
|
|
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 (<anonymous>)</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 (<anonymous>)
|
|
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 :
|
|
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 :
|
|
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 :
|
|
250
|
-
Test result : Success :
|
|
251
|
-
Test result : Success :
|
|
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 :
|
|
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 (<anonymous>)
|