@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/.eslintrc.json +2 -1
- package/CHANGELOG.md +7 -1
- package/dist/455.js +1 -1
- package/dist/455.js.map +1 -1
- package/dist/package-test.js +1 -1
- package/dist/package-test.js.map +1 -1
- package/dist/package.js +1 -1
- package/dist/package.js.map +1 -1
- package/package.json +5 -5
- package/src/polytool/pt-dialog.ts +28 -14
- package/src/polytool/pt-enumerate-seq-dialog.ts +18 -4
- package/test-console-output-1.log +262 -239
- package/test-record-1.mp4 +0 -0
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@datagrok/sequence-translator",
|
|
3
3
|
"friendlyName": "Sequence Translator",
|
|
4
|
-
"version": "1.
|
|
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.
|
|
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.
|
|
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
|
-
"@
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
197
|
-
|
|
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);
|