@datagrok/sequence-translator 1.0.7 → 1.0.9

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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@datagrok/sequence-translator",
3
3
  "friendlyName": "Sequence Translator",
4
- "version": "1.0.7",
4
+ "version": "1.0.9",
5
5
  "author": {
6
6
  "name": "Vadym Kovadlo",
7
7
  "email": "vkovadlo@datagrok.ai"
@@ -13,7 +13,7 @@
13
13
  "directory": "packages/SequenceTranslator"
14
14
  },
15
15
  "dependencies": {
16
- "@datagrok-libraries/utils": "^0.1.0",
16
+ "@datagrok-libraries/utils": "^1.9.2",
17
17
  "@types/react": "^18.0.15",
18
18
  "datagrok-api": "^1.6.0",
19
19
  "datagrok-tools": "^4.1.2",
@@ -22,6 +22,26 @@ function stringify(items: string[]): string {
22
22
  return '["' + items.join('", "') + '"]';
23
23
  }
24
24
 
25
+ function saltMass(saltNames: string[], molWeightCol: DG.Column, equivalentsCol: DG.Column, i: number,
26
+ saltCol: DG.Column) {
27
+ const saltRowIndex = saltNames.indexOf(saltCol.get(i));
28
+ return (
29
+ saltRowIndex == -1 || molWeightCol.get(saltRowIndex) == DG.FLOAT_NULL || equivalentsCol.get(i) == DG.INT_NULL) ?
30
+ DG.FLOAT_NULL :
31
+ molWeightCol.get(saltRowIndex) * equivalentsCol.get(i);
32
+ }
33
+
34
+ function saltMolWeigth(saltNamesList: string[], saltCol: DG.Column, molWeightCol: DG.Column, i: number) {
35
+ const saltRowIndex = saltNamesList.indexOf(saltCol.get(i));
36
+ return (saltRowIndex == -1) ? DG.FLOAT_NULL : molWeightCol.get(saltRowIndex);
37
+ }
38
+
39
+ function batchMolWeight(compoundMolWeightCol: DG.Column, saltMassCol: DG.Column, i: number) {
40
+ return (compoundMolWeightCol.getString(i) == '' || saltMassCol.getString(i) == '') ?
41
+ DG.FLOAT_NULL :
42
+ compoundMolWeightCol.get(i) + saltMassCol.get(i);
43
+ }
44
+
25
45
  function molecularWeight(sequence: string, weightsObj: {[index: string]: number}): number {
26
46
  const codes = sortByStringLengthInDescendingOrder(Object.keys(weightsObj)).concat(Object.keys(MODIFICATIONS));
27
47
  let weight = 0;
@@ -117,14 +137,18 @@ export function oligoSdFile(table: DG.DataFrame) {
117
137
  const icdsDf = DG.DataFrame.fromCsv(ICDS);
118
138
  const idpsDf = DG.DataFrame.fromCsv(IDPS);
119
139
 
120
- async function addColumns(t: DG.DataFrame, saltsDf: DG.DataFrame) {
140
+ const sequenceCol = table.getCol(COL_NAMES.SEQUENCE);
141
+ const saltCol = table.getCol(COL_NAMES.SALT);
142
+ const equivalentsCol = table.getCol(COL_NAMES.EQUIVALENTS);
143
+ const typeColumn = table.getCol(COL_NAMES.TYPE);
144
+
145
+ const molWeightCol = saltsDf.getCol('MOLWEIGHT');
146
+ const saltNamesList = saltsDf.getCol('DISPLAY').toList();
147
+
148
+ function addColumns(t: DG.DataFrame) {
121
149
  if (t.columns.contains(COL_NAMES.COMPOUND_NAME))
122
150
  return grok.shell.error('Columns already exist');
123
151
 
124
- const sequenceCol = t.getCol(COL_NAMES.SEQUENCE);
125
- const saltCol = t.getCol(COL_NAMES.SALT);
126
- const equivalentsCol = t.getCol(COL_NAMES.EQUIVALENTS);
127
-
128
152
  for (let i = t.rowCount - 1; i > -1; i--) {
129
153
  if (sequenceCol.get(i) == '')
130
154
  t.rows.removeAt(i, 1, false);
@@ -132,12 +156,11 @@ export function oligoSdFile(table: DG.DataFrame) {
132
156
 
133
157
  t.columns.addNewString(COL_NAMES.COMPOUND_NAME).init((i: number) => sequenceCol.get(i));
134
158
 
135
- t.columns.addNewString(COL_NAMES.COMPOUND_COMMENTS).init((i: number) => (i > 0 && i % 2 == 0) ?
159
+ t.columns.addNewString(COL_NAMES.COMPOUND_COMMENTS).init((i: number) => (i > 2 && typeColumn.get(i) == 'Duplex') ?
136
160
  sequenceCol.get(i) + '; duplex of SS: ' + sequenceCol.get(i - 2) + ' and AS: ' + sequenceCol.get(i - 1) :
137
161
  sequenceCol.get(i),
138
162
  );
139
- const molWeightCol = saltsDf.getCol('MOLWEIGHT');
140
- const saltNamesList = saltsDf.getCol('DISPLAY').toList();
163
+
141
164
  const weightsObj: {[code: string]: number} = {};
142
165
  for (const synthesizer of Object.keys(map)) {
143
166
  for (const technology of Object.keys(map[synthesizer])) {
@@ -154,19 +177,14 @@ export function oligoSdFile(table: DG.DataFrame) {
154
177
  DG.FLOAT_NULL;
155
178
  });
156
179
 
157
- t.columns.addNewFloat(COL_NAMES.SALT_MASS).init((i: number) => {
158
- const saltRowIndex = saltNamesList.indexOf(saltCol.get(i));
159
- return (saltRowIndex == -1) ? DG.FLOAT_NULL : molWeightCol.get(saltRowIndex) * equivalentsCol.get(i);
160
- });
180
+ t.columns.addNewFloat(COL_NAMES.SALT_MASS).init((i: number) =>
181
+ saltMass(saltNamesList, molWeightCol, equivalentsCol, i, saltCol));
161
182
 
162
- t.columns.addNewFloat(COL_NAMES.SALT_MOL_WEIGHT).init((i: number) => {
163
- const saltRowIndex = saltNamesList.indexOf(saltCol.get(i));
164
- return (saltRowIndex == -1) ? DG.FLOAT_NULL : molWeightCol.get(saltRowIndex);
165
- });
183
+ t.columns.addNewFloat(COL_NAMES.SALT_MOL_WEIGHT).init((i: number) =>
184
+ saltMolWeigth(saltNamesList, saltCol, molWeightCol, i));
166
185
 
167
- await t.columns.addNewCalculated(COL_NAMES.BATCH_MW,
168
- '${' + COL_NAMES.CPD_MW + '} + ${' + COL_NAMES.SALT_MASS + '}', DG.COLUMN_TYPE.FLOAT, false,
169
- );
186
+ t.columns.addNewFloat(COL_NAMES.BATCH_MW).init((i: number) =>
187
+ batchMolWeight(t.getCol(COL_NAMES.CPD_MW), t.getCol(COL_NAMES.SALT_MASS), i));
170
188
 
171
189
  addColumnsPressed = true;
172
190
  return newDf = t;
@@ -181,8 +199,8 @@ export function oligoSdFile(table: DG.DataFrame) {
181
199
  if (table.getCol(COL_NAMES.IDP).type != DG.COLUMN_TYPE.STRING)
182
200
  table.changeColumnType(COL_NAMES.IDP, DG.COLUMN_TYPE.STRING);
183
201
  d.append(
184
- ui.link('Add Columns', async () => {
185
- await addColumns(table, saltsDf);
202
+ ui.link('Add Columns', () => {
203
+ addColumns(table);
186
204
  view.grid.columns.setOrder(Object.values(COL_NAMES));
187
205
  }, 'Add columns: \'' + [COL_NAMES.COMPOUND_NAME, COL_NAMES.COMPOUND_COMMENTS, COL_NAMES.CPD_MW,
188
206
  COL_NAMES.SALT_MASS, COL_NAMES.BATCH_MW].join('\', \''), '',
@@ -205,9 +223,26 @@ export function oligoSdFile(table: DG.DataFrame) {
205
223
  args.args.menu.item('Fill Column With Value', () => {
206
224
  const v = args.args.context.table.currentCell.value;
207
225
  args.args.context.table.currentCell.column.init(v);
226
+ for (let i = 0; i < view.dataFrame.rowCount; i++)
227
+ updateCalculatedColumns(view.dataFrame, i);
208
228
  });
209
229
  }
210
230
  });
231
+
232
+ view.dataFrame.onDataChanged.subscribe(() => {
233
+ const colName = view.dataFrame.currentCol.name;
234
+ if ([COL_NAMES.SALT, COL_NAMES.EQUIVALENTS, COL_NAMES.SALT_MOL_WEIGHT].includes(colName))
235
+ updateCalculatedColumns(view.dataFrame, view.dataFrame.currentRowIdx);
236
+ });
237
+
238
+ function updateCalculatedColumns(t: DG.DataFrame, i: number): void {
239
+ const smValue = saltMass(saltNamesList, molWeightCol, equivalentsCol, i, saltCol);
240
+ t.getCol(COL_NAMES.SALT_MASS).set(i, smValue, false);
241
+ const smwValue = saltMolWeigth(saltNamesList, saltCol, molWeightCol, i);
242
+ t.getCol(COL_NAMES.SALT_MOL_WEIGHT).set(i, smwValue, false);
243
+ const bmw = batchMolWeight(t.getCol(COL_NAMES.CPD_MW), t.getCol(COL_NAMES.SALT_MASS), i);
244
+ t.getCol(COL_NAMES.BATCH_MW).set(i, bmw, false);
245
+ }
211
246
  }),
212
247
  ]);
213
248
  grok.shell.v.setRibbonPanels([[d]]);
@@ -13,17 +13,17 @@ export const axolabsMap:
13
13
  symbols: ['dA', 'dC', 'dG', 'dT'],
14
14
  color: 'rgb(197,224,180)',
15
15
  },
16
- '2\'-Fluoro': {
16
+ "2\"-Fluoro": {
17
17
  fullName: '2\'-Fluoro nucleotides',
18
18
  symbols: ['Af', 'Cf', 'Gf', 'Uf'],
19
19
  color: 'rgb(68,114,196)',
20
20
  },
21
- '2\'-O-Methyl': {
21
+ "2\"-O-Methyl": {
22
22
  fullName: '2\'-O-Methyl nucleotides',
23
23
  symbols: ['a', 'c', 'g', 'u'],
24
24
  color: 'rgb(166,166,166)',
25
25
  },
26
- '2\'-O-MOE': {
26
+ "2\"-O-MOE": {
27
27
  fullName: '2\'-O-MOE nucleotides (including 5-Methyl C)',
28
28
  symbols: ['Am', 'Cm', 'Gm', 'Tm'],
29
29
  color: 'rgb(112,48,160)',
@@ -83,7 +83,7 @@ export const axolabsMap:
83
83
  symbols: ['(invabasic)', '(invabasic)', '(invabasic)', '(invabasic)'],
84
84
  color: invAbasicColor,
85
85
  },
86
- '5\'-vinylps': {
86
+ "5\"-vinylps": {
87
87
  fullName: '5\'-vinylphosphonate-2\'-OMe-uridine',
88
88
  symbols: ['(vinu)', '(vinu)', '(vinu)', '(vinu)'],
89
89
  color: 'rgb(0,0,139)',
@@ -93,7 +93,7 @@ export const axolabsMap:
93
93
  symbols: ['(invabasic)', '(invabasic)', '(invabasic)', '(invabasic)'],
94
94
  color: invAbasicColor,
95
95
  },
96
- '2\'-OMe-U(o)': {
96
+ "2\"-OMe-U(o)": {
97
97
  fullName: 'Nucleotide Uridine with 2\'O-Methyl protection (overhang)',
98
98
  symbols: ['mU', 'mU', 'mU', 'mU'],
99
99
  color: 'rgb(65,233,80)',
@@ -56,7 +56,7 @@ M V30 BEGIN ATOM
56
56
  M V30 1 O 1.0934 -2.1636 0 0
57
57
  M V30 2 C 1.8365 -1.4945 0 0 CFG=2
58
58
  M V30 3 C 2.8147 -1.7024 0 0
59
- M V30 4 C 3.3147 -0.8364 0 0 VAL=3
59
+ M V30 4 C 3.3147 -0.8364 0 0
60
60
  M V30 5 O 2.6455 -0.0932 0 0
61
61
  M V30 6 C 1.732 -0.5 0 0 CFG=1
62
62
  M V30 7 C 0.866 0 0 0
@@ -29,8 +29,8 @@ export function saveSenseAntiSense() {
29
29
  const moleculeSvgDiv = ui.block([]);
30
30
  const ssInput = ui.textInput('Sense Strand', '');
31
31
  const asInput = ui.textInput('Anti Sense', '');
32
- const straight = '5\' ->3\'';
33
- const inverse = '3\' ->5\'';
32
+ const straight = "5 prime -> 3 prime";
33
+ const inverse = "3 prime -> 5 prime";
34
34
  let ssInverse = false;
35
35
  let asInverse = false;
36
36
 
@@ -1,4 +1,4 @@
1
- <html><head><meta charset="utf-8"/><title>SequenceTranslator Test Report. Datagrok version datagrok/datagrok:latest SHA=4ba776b36f56. Commit 5798c6fc.</title><style type="text/css">html,
1
+ <html><head><meta charset="utf-8"/><title>SequenceTranslator Test Report. Datagrok version datagrok/datagrok:latest SHA=7770371320b2. Commit 1d307ddc.</title><style type="text/css">html,
2
2
  body {
3
3
  font-family: Arial, Helvetica, sans-serif;
4
4
  font-size: 1rem;
@@ -229,11 +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=4ba776b36f56. Commit 5798c6fc.</h1></header><div id="metadata-container"><div id="timestamp">Started: 2022-09-15 14:52:27</div><div id="summary"><div id="suite-summary"><div class="summary-total">Suites (1)</div><div class="summary-passed summary-empty">0 passed</div><div class="summary-failed">1 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 summary-empty">0 passed</div><div class="summary-failed">1 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">40.999s</div></div><div class="suite-tests"><div class="test-result failed"><div class="test-info"><div class="test-suitename"> </div><div class="test-title">TEST</div><div class="test-status">failed</div><div class="test-duration">24.16s</div></div><div class="failureMessages"> <pre class="failureMsg">Error: Evaluation failed: TypeError: Cannot read properties of null (reading 'get')
233
- at __puppeteer_evaluation_script__:14:72
234
- at ExecutionContext._evaluateInternal (/home/runner/work/public/public/packages/SequenceTranslator/node_modules/puppeteer/src/common/ExecutionContext.ts:273:13)
235
- at processTicksAndRejections (internal/process/task_queues.js:97:5)
236
- at ExecutionContext.evaluate (/home/runner/work/public/public/packages/SequenceTranslator/node_modules/puppeteer/src/common/ExecutionContext.ts:140:12)</pre></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=7770371320b2. Commit 1d307ddc.</h1></header><div id="metadata-container"><div id="timestamp">Started: 2022-09-29 08:43:13</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">17.787s</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">2.717s</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)
237
233
  at Generator.next (&lt;anonymous&gt;)
238
234
  at fulfilled (/home/runner/work/public/public/packages/SequenceTranslator/src/__jest__/test-node.ts:28:58)
239
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
@@ -243,4 +239,18 @@ header {
243
239
  at Object.&lt;anonymous&gt;.__awaiter (/home/runner/work/public/public/packages/SequenceTranslator/src/__jest__/remote.test.ts:27:12)
244
240
  at Object.&lt;anonymous&gt; (/home/runner/work/public/public/packages/SequenceTranslator/src/__jest__/remote.test.ts:38:23)
245
241
  at Promise.then.completed (/home/runner/work/public/public/packages/SequenceTranslator/node_modules/jest-circus/build/utils.js:391:28)
246
- at new Promise (&lt;anonymous&gt;)</pre><pre class="suite-consolelog-item-message">Testing SequenceTranslator package</pre></div></div></div></div></body></html>
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:66:11
243
+ at Generator.next (&lt;anonymous&gt;)
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 : 2 : SequenceTranslator.sequence-translator.usCfCfUfGfAf : OK
246
+ Test result : Success : 1 : SequenceTranslator.sequence-translator.usAfsusgsgsg : OK
247
+ Test result : Success : 0 : SequenceTranslator.sequence-translator.UfUfUfsCfsuacg : OK
248
+ Test result : Success : 0 : SequenceTranslator.sequence-translator.susususauasu : 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
+ Test result : Success : 0 : SequenceTranslator.sequence-translator.UfAfCfGfGfCfAfUf : OK
253
+ Test result : Success : 0 : SequenceTranslator.sequence-translator.(invabasic)cuCfuUfsc : OK
254
+ Test result : Success : 0 : SequenceTranslator.sequence-translator.(invabasic)usAfsucuCfuUfAfgcugUfgCfacususu : OK
255
+ Test result : Success : 0 : SequenceTranslator.sequence-translator.(invabasic)asacgGfuGfCfAfacucuauuca : OK
256
+ </pre></div></div></div></div></body></html>