@datagrok/sequence-translator 1.7.0 → 1.8.0

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.7.0",
4
+ "version": "1.8.0",
5
5
  "author": {
6
6
  "name": "Leonid Stolbov",
7
7
  "email": "lstolbov@datagrok.ai"
@@ -22,13 +22,13 @@
22
22
  }
23
23
  ],
24
24
  "dependencies": {
25
- "@datagrok-libraries/bio": "^5.46.0",
25
+ "@datagrok-libraries/bio": "^5.50.0",
26
26
  "@datagrok-libraries/chem-meta": "^1.2.8",
27
27
  "@datagrok-libraries/tutorials": "^1.4.3",
28
28
  "@datagrok-libraries/utils": "^4.3.7",
29
29
  "@types/react": "^18.0.15",
30
30
  "cash-dom": "^8.1.0",
31
- "datagrok-api": "^1.21.1",
31
+ "datagrok-api": "^1.24.0",
32
32
  "lodash": "^4.17.21",
33
33
  "object-hash": "^3.0.0",
34
34
  "openchemlib": "6.0.1",
@@ -42,9 +42,9 @@
42
42
  "@datagrok-libraries/helm-web-editor": "^1.1.13",
43
43
  "@datagrok-libraries/js-draw-lite": "^0.0.10",
44
44
  "@datagrok/bio": "^2.18.0",
45
- "@datagrok/helm": "^2.7.0",
46
45
  "@datagrok/chem": "^1.13.0",
47
- "@types/jquery": "^3.5.14",
46
+ "@datagrok/helm": "^2.7.0",
47
+ "@types/jquery": "^3.5.32",
48
48
  "@types/js-yaml": "^4.0.5",
49
49
  "@types/lodash": "^4.14.202",
50
50
  "@types/node-fetch": "^2.6.2",
@@ -10,7 +10,7 @@ import {errInfo} from '@datagrok-libraries/bio/src/utils/err-info';
10
10
  import {ALPHABET, NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';
11
11
  import {getSeqHelper, ISeqHelper, ToAtomicLevelRes} from '@datagrok-libraries/bio/src/utils/seq-helper';
12
12
  import {MmcrTemps} from '@datagrok-libraries/bio/src/utils/cell-renderer-consts';
13
- import {addMonomerHoverLink, buildMonomerHoverLink} from '@datagrok-libraries/bio/src/monomer-works/monomer-hover';
13
+ import {addMonomerHoverLink} from '@datagrok-libraries/bio/src/monomer-works/monomer-hover';
14
14
  import {getRdKitModule} from '@datagrok-libraries/bio/src/chem/rdkit-module';
15
15
  import {RDModule} from '@datagrok-libraries/chem-meta/src/rdkit-api';
16
16
 
@@ -68,10 +68,10 @@ export async function polyToolEnumerateChemUI(cell?: DG.Cell): Promise<void> {
68
68
 
69
69
  export async function polyToolConvertUI(): Promise<void> {
70
70
  await _package.initPromise;
71
- let dialog: DG.Dialog;
71
+ let dialog: DG.Dialog | null = null;
72
72
  try {
73
73
  dialog = await getPolyToolConvertDialog();
74
- dialog.show();
74
+ dialog?.show();
75
75
  } catch (err: any) {
76
76
  const [errMsg, errStack] = errInfo(err);
77
77
  grok.shell.warning('To run PolyTool Conversion, open a dataframe with macromolecules');
@@ -79,25 +79,38 @@ export async function polyToolConvertUI(): Promise<void> {
79
79
  }
80
80
  }
81
81
 
82
- export async function getPolyToolConvertDialog(srcCol?: DG.Column): Promise<DG.Dialog> {
82
+ export async function getPolyToolConvertDialog(srcCol?: DG.Column): Promise<DG.Dialog | null> {
83
83
  const subs: Unsubscribable[] = [];
84
84
  const destroy = () => {
85
85
  for (const sub of subs) sub.unsubscribe();
86
86
  };
87
87
  try {
88
88
  let srcColVal: DG.Column<string> | undefined = srcCol;
89
+ const srcColList = grok.shell.t.columns.bySemTypeAll(DG.SEMTYPE.MACROMOLECULE);
90
+ const customSrcCols = srcColList.filter((col) => {
91
+ const sh = _package.seqHelper.getSeqHandler(col);
92
+ return sh.notation === NOTATION.CUSTOM;
93
+ });
89
94
  if (!srcColVal) {
90
- const srcColList = grok.shell.t.columns.bySemTypeAll(DG.SEMTYPE.MACROMOLECULE);
91
95
  if (srcColList.length < 1)
92
96
  throw new Error(PT_ERROR_DATAFRAME);
97
+
98
+ if (customSrcCols.length < 1) {
99
+ const toAtomicLevelFunc = DG.Func.find({package: 'Bio', name: 'toAtomicLevel'})[0];
100
+ if (toAtomicLevelFunc) {
101
+ toAtomicLevelFunc.prepare().edit();
102
+ return null;
103
+ }
104
+ grok.shell.warning('Polytool requires a macromolecule column with custom notation. \n\nUse Top menu | Bio | Transform | To Atomic Level.');
105
+ return null;
106
+ }
107
+
93
108
  srcColVal = srcColList[0];
94
109
  }
95
110
  const srcColInput = ui.input.column('Column', {
96
111
  table: srcColVal.dataFrame, value: srcColVal,
97
112
  filter: (col: DG.Column) => {
98
- if (col.semType !== DG.SEMTYPE.MACROMOLECULE) return false;
99
- const sh = _package.seqHelper.getSeqHandler(col);
100
- return sh.notation === NOTATION.CUSTOM;
113
+ return customSrcCols.includes(col);
101
114
  }
102
115
  });
103
116
 
@@ -353,6 +366,8 @@ function buildCyclizedMonomerHoverLink(
353
366
  const resLink: MonomerHoverLink = {
354
367
  targetCol: molCol,
355
368
  handler: (seqGridCell: DG.GridCell, cyclizedMonomer: ISeqMonomer | null, targetGridCol: DG.GridColumn): boolean => {
369
+ if (!seqGridCell || !targetGridCol.grid || !seqCol.dataFrame)
370
+ return true;
356
371
  const grid = targetGridCol.grid;
357
372
  const tableRowIdx = seqGridCell.tableRowIndex!;
358
373
  const gridRowIdx = seqGridCell.gridRow;
@@ -360,13 +375,13 @@ function buildCyclizedMonomerHoverLink(
360
375
  const positionMap = positionMaps[gridRowIdx];
361
376
 
362
377
  const prev = getMonomerHover();
363
- if (!prev || (prev && (prev.dataFrameId != seqCol.dataFrame.id || prev.gridRowIdx != gridRowIdx ||
378
+ if (!prev || (prev && (prev.dataFrameId != seqCol.dataFrame?.id || prev.gridRowIdx != gridRowIdx ||
364
379
  prev.seqColName != seqCol.name || prev.seqPosition != cyclizedMonomer?.position))
365
380
  ) {
366
381
  if (prev) {
367
382
  setMonomerHover(null);
368
- prev.gridCell.grid?.invalidate();
369
- // prev.gridCell.render();
383
+ //prev.gridCell.grid?.invalidate();
384
+ prev.gridCell.render();
370
385
  }
371
386
  if (!cyclizedMonomer) {
372
387
  setMonomerHover(null);
@@ -389,7 +404,6 @@ function buildCyclizedMonomerHoverLink(
389
404
 
390
405
  const resSubstructList: ISubstruct[] = [];
391
406
  const seqMonomerList: number[] = positionMap[cyclizedMonomer.position];
392
- console.log(seqMonomerList);
393
407
  for (const seqMonomer of seqMonomerList) {
394
408
  const monomerMap = molMonomerMap.get(seqMonomer); // single monomer
395
409
  if (!monomerMap) return {atoms: [], bonds: [], highlightAtomColors: [], highlightBondColors: []};
@@ -402,8 +416,8 @@ function buildCyclizedMonomerHoverLink(
402
416
  });
403
417
 
404
418
  // TODO: Invalidate targetGridCell
405
- grid.invalidate();
406
- // targetGridCell.render();
419
+ //grid.invalidate();
420
+ targetGridCell.render();
407
421
  }
408
422
 
409
423
  return true;
@@ -167,6 +167,9 @@ async function getPolyToolEnumerateDialog(
167
167
  resDataRole = (resSeqValue.tags[PolyToolTags.dataRole] as PolyToolDataRole.template) ?? PolyToolDataRole.macromolecule;
168
168
  } else {
169
169
  const seqCol = DG.Column.fromList(DG.COLUMN_TYPE.STRING, 'seq', [PT_HELM_EXAMPLE]);
170
+ seqCol.semType = DG.SEMTYPE.MACROMOLECULE;
171
+ const _tempDf = DG.DataFrame.fromColumns([seqCol]);
172
+
170
173
  seqCol.meta.units = NOTATION.HELM;
171
174
  const sh = seqHelper.getSeqHandler(seqCol);
172
175
  resSeqValue = sh.getValue(0);
@@ -184,7 +187,7 @@ async function getPolyToolEnumerateDialog(
184
187
  const warningsTextDiv = ui.divText('', {style: {color: 'red'}});
185
188
  // #### Inputs
186
189
  inputs = {
187
- macromolecule: helmHelper.createHelmInput(
190
+ macromolecule: helmHelper.createHelmInput(
188
191
  'Macromolecule', {
189
192
  editable: false,
190
193
  editorOptions: {
@@ -192,9 +195,20 @@ async function getPolyToolEnumerateDialog(
192
195
  monomerNumbering: MonomerNumberingTypes.continuous,
193
196
  getMonomer: (a: HelmAtom | HelmType, name?: string): GetMonomerResType => {
194
197
  const aa: HelmAtom = a as HelmAtom;
198
+
199
+
195
200
  if (aa.T === 'ATOM') {
196
- const canonicalSymbol = seqValue.getSplitted().getCanonical(aa.bio!.continuousId - 1);
197
- return monomerLibFuncs.getMonomer(aa.bio!.type, canonicalSymbol);
201
+ try {
202
+ if (!seqValue.isDna() && !seqValue.isRna()) {
203
+ const canonicalSymbol = seqValue.getSplitted().getCanonical(aa.bio!.continuousId - 1);
204
+ return monomerLibFuncs.getMonomer(aa.bio!.type, canonicalSymbol);
205
+ } else {
206
+ const canonicalSymbol = seqValue.getSplittedWithSugarsAndPhosphates().getCanonical(aa.bio!.continuousId - 1);
207
+ return monomerLibFuncs.getMonomer(aa.bio!.type, canonicalSymbol);
208
+ }
209
+ } catch (_) {
210
+ return monomerLibFuncs.getMonomer(a, name);
211
+ }
198
212
  } else { return monomerLibFuncs.getMonomer(a, name); }
199
213
  },
200
214
  },
@@ -727,7 +741,7 @@ async function polyToolEnumerateSeq(
727
741
  toAtomicLevel.chiralityEngine, toAtomicLevel.highlightMonomers);
728
742
  enumeratorResDf.columns.add(talRes.molCol!, false);
729
743
  const resMolCol = talRes.molCol!;
730
- buildMonomerHoverLink(resHelmCol, resMolCol, monomerLib, helmHelper.seqHelper, rdKitModule);
744
+ await buildMonomerHoverLink(resHelmCol, resMolCol, monomerLib, helmHelper.seqHelper, rdKitModule, true);
731
745
  } else if (dataRole === PolyToolDataRole.template) {
732
746
  const talRes = await polyToolConvert(enumCol,
733
747
  toAtomicLevel.generateHelm, false, toAtomicLevel.chiralityEngine, false, toAtomicLevel.rules);