@datagrok/sequence-translator 1.6.4 → 1.7.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/CHANGELOG.md +11 -0
- 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/conversion/pt-atomic.ts +70 -0
- package/src/polytool/conversion/pt-chain.ts +22 -2
- package/src/polytool/conversion/pt-conversion.ts +5 -2
- package/src/polytool/conversion/pt-rule-cards.ts +160 -0
- package/src/polytool/conversion/pt-rules.ts +24 -0
- package/src/polytool/conversion/pt-tools-parse.ts +11 -21
- package/src/polytool/conversion/rule-manager.ts +52 -6
- package/src/polytool/conversion/style.css +32 -0
- package/src/polytool/pt-dialog.ts +21 -61
- package/src/polytool/pt-enumerate-seq-dialog.ts +1 -1
- package/src/tests/polytool-convert-tests.ts +1 -1
- package/test-console-output-1.log +1662 -0
- package/test-record-1.mp4 +0 -0
|
@@ -37,10 +37,13 @@ import {PolymerTypes} from '@datagrok-libraries/js-draw-lite/src/types/org';
|
|
|
37
37
|
import {_toAtomicLevel, getMonomersDictFromLib} from '@datagrok-libraries/bio/src/monomer-works/to-atomic-level';
|
|
38
38
|
import {monomerSeqToMolfile} from '@datagrok-libraries/bio/src/monomer-works/to-atomic-level-utils';
|
|
39
39
|
import {LRUCache} from 'lru-cache';
|
|
40
|
-
import {getMonomerHover, ISubstruct, setMonomerHover}
|
|
40
|
+
import {addSubstructProvider, getMonomerHover, ISubstruct, setMonomerHover}
|
|
41
|
+
from '@datagrok-libraries/chem-meta/src/types';
|
|
41
42
|
import {getMolHighlight} from '@datagrok-libraries/bio/src/monomer-works/seq-to-molfile';
|
|
42
43
|
import {ChemTags} from '@datagrok-libraries/chem-meta/src/consts';
|
|
44
|
+
import {mergeSubstructs} from '@datagrok-libraries/chem-meta/src/types';
|
|
43
45
|
import {getMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';
|
|
46
|
+
import {dealGroups, helmToMol} from './conversion/pt-atomic';
|
|
44
47
|
|
|
45
48
|
type PolyToolConvertSerialized = {
|
|
46
49
|
generateHelm: boolean;
|
|
@@ -259,16 +262,6 @@ async function getPolyToolEnumerationChemDialog(cell?: DG.Cell): Promise<DG.Dial
|
|
|
259
262
|
}
|
|
260
263
|
}
|
|
261
264
|
|
|
262
|
-
function dealGroups(col: DG.Column<string>): void {
|
|
263
|
-
for (let i = 0; i < col.length; i++) {
|
|
264
|
-
col.set(i, col.get(i)!.replaceAll('undefined', 'H'));
|
|
265
|
-
col.set(i, col.get(i)!.replaceAll('Oh', 'O'));
|
|
266
|
-
col.set(i, col.get(i)!.replaceAll('0.000000 3', '0.000000 0'));
|
|
267
|
-
col.set(i, col.get(i)!.replaceAll('?', 'O'));
|
|
268
|
-
col.set(i, col.get(i)!.replaceAll('0 3\n', '0 0\n'));
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
|
|
272
265
|
/** Returns Helm and molfile columns. */
|
|
273
266
|
export async function polyToolConvert(seqCol: DG.Column<string>,
|
|
274
267
|
generateHelm: boolean, linearize: boolean, chiralityEngine: boolean, highlight: boolean, ruleFiles: string[]
|
|
@@ -283,7 +276,7 @@ export async function polyToolConvert(seqCol: DG.Column<string>,
|
|
|
283
276
|
|
|
284
277
|
const table = seqCol.dataFrame;
|
|
285
278
|
const rules = await getRules(ruleFiles);
|
|
286
|
-
const [resList, isLinear] = doPolyToolConvert(seqCol.toList(), rules, helmHelper);
|
|
279
|
+
const [resList, isLinear, positionMaps] = doPolyToolConvert(seqCol.toList(), rules, helmHelper);
|
|
287
280
|
|
|
288
281
|
const resHelmColName = getUnusedName(table, `transformed(${seqCol.name})`);
|
|
289
282
|
const resHelmCol = DG.Column.fromType(DG.COLUMN_TYPE.STRING, resHelmColName, resList.length)
|
|
@@ -295,61 +288,25 @@ export async function polyToolConvert(seqCol: DG.Column<string>,
|
|
|
295
288
|
|
|
296
289
|
|
|
297
290
|
const rdKitModule: RDModule = await getRdKitModule();
|
|
291
|
+
const seqHelper: ISeqHelper = await getSeqHelper();
|
|
292
|
+
|
|
298
293
|
const lib = await getOverriddenLibrary(rules);
|
|
299
294
|
const resHelmColTemp = resHelmCol.temp;
|
|
300
295
|
resHelmColTemp[MmcrTemps.overriddenLibrary] = lib;
|
|
301
296
|
resHelmCol.temp = resHelmColTemp;
|
|
302
297
|
|
|
303
|
-
const
|
|
304
|
-
|
|
305
|
-
await seqHelper.helmToAtomicLevel(resHelmCol, chiralityEngine, highlight, lib);
|
|
306
|
-
|
|
307
|
-
const resMolCol = toAtomicLevelRes.molCol!;
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
const allLinear = isLinear.filter((l) => l).length;
|
|
311
|
-
if (linearize && allLinear > 0) {
|
|
312
|
-
const lin = new Array<string>(allLinear);
|
|
313
|
-
let counter = 0;
|
|
314
|
-
for (let i = 0; i < isLinear.length; i++) {
|
|
315
|
-
if (isLinear[i]) {
|
|
316
|
-
lin[counter] = resList[i];
|
|
317
|
-
counter++;
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
const linCol = DG.Column.fromStrings('helm', lin);
|
|
322
|
-
linCol.semType = DG.SEMTYPE.MACROMOLECULE;
|
|
323
|
-
linCol.meta.units = NOTATION.HELM;
|
|
324
|
-
linCol.setTag(DG.TAGS.CELL_RENDERER, 'helm');
|
|
325
|
-
|
|
326
|
-
const monomerLibHelper = await getMonomerLibHelper();
|
|
327
|
-
const systemMonomerLib = monomerLibHelper.getMonomerLib();
|
|
328
|
-
let linear: ToAtomicLevelRes | null = null;
|
|
329
|
-
try {
|
|
330
|
-
linear = await _toAtomicLevel(DG.DataFrame.create(0), linCol, systemMonomerLib, seqHelper, rdKitModule);
|
|
331
|
-
counter = 0;
|
|
332
|
-
for (let i = 0; i < isLinear.length; i++) {
|
|
333
|
-
if (isLinear[i]) {
|
|
334
|
-
resMolCol.set(i, linear!.molCol!.get(counter));
|
|
335
|
-
counter++;
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
} catch (e: any) {
|
|
339
|
-
grok.shell.warning('PolyTool was not able to linearize sequences');
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
dealGroups(resMolCol);
|
|
298
|
+
const resMolCol = await helmToMol(resHelmCol, resList,
|
|
299
|
+
isLinear, chiralityEngine, highlight, linearize, lib, rdKitModule, seqHelper);
|
|
344
300
|
resMolCol.name = getUnusedName(table, `molfile(${seqCol.name})`);
|
|
345
301
|
resMolCol.semType = DG.SEMTYPE.MOLECULE;
|
|
302
|
+
|
|
346
303
|
if (table) {
|
|
347
304
|
table.columns.add(resMolCol, true);
|
|
348
305
|
await grok.data.detectSemanticTypes(table);
|
|
349
306
|
}
|
|
350
307
|
|
|
351
|
-
buildMonomerHoverLink(resHelmCol, resMolCol, lib, seqHelper, rdKitModule);
|
|
352
|
-
buildCyclizedMonomerHoverLink(seqCol, resHelmCol, resMolCol, lib, seqHelper, rdKitModule);
|
|
308
|
+
//buildMonomerHoverLink(resHelmCol, resMolCol, lib, seqHelper, rdKitModule);
|
|
309
|
+
buildCyclizedMonomerHoverLink(seqCol, resHelmCol, resMolCol, lib, seqHelper, rdKitModule, positionMaps);
|
|
353
310
|
|
|
354
311
|
return [resHelmCol, resMolCol];
|
|
355
312
|
} finally {
|
|
@@ -359,7 +316,8 @@ export async function polyToolConvert(seqCol: DG.Column<string>,
|
|
|
359
316
|
|
|
360
317
|
function buildCyclizedMonomerHoverLink(
|
|
361
318
|
cyclizedCol: DG.Column<string>, seqCol: DG.Column<string>, molCol: DG.Column<string>,
|
|
362
|
-
monomerLib: IMonomerLibBase, seqHelper: ISeqHelper, rdKitModule: RDModule
|
|
319
|
+
monomerLib: IMonomerLibBase, seqHelper: ISeqHelper, rdKitModule: RDModule,
|
|
320
|
+
positionMaps: number[][][]
|
|
363
321
|
): MonomerHoverLink {
|
|
364
322
|
function buildMonomerMap(seqCol: DG.Column<string>, tableRowIdx: number): MonomerMap {
|
|
365
323
|
const seqSH = seqHelper.getSeqHandler(seqCol);
|
|
@@ -399,6 +357,7 @@ function buildCyclizedMonomerHoverLink(
|
|
|
399
357
|
const tableRowIdx = seqGridCell.tableRowIndex!;
|
|
400
358
|
const gridRowIdx = seqGridCell.gridRow;
|
|
401
359
|
const targetGridCell = grid.cell(targetGridCol.name, gridRowIdx);
|
|
360
|
+
const positionMap = positionMaps[gridRowIdx];
|
|
402
361
|
|
|
403
362
|
const prev = getMonomerHover();
|
|
404
363
|
if (!prev || (prev && (prev.dataFrameId != seqCol.dataFrame.id || prev.gridRowIdx != gridRowIdx ||
|
|
@@ -429,15 +388,16 @@ function buildCyclizedMonomerHoverLink(
|
|
|
429
388
|
return undefined;
|
|
430
389
|
|
|
431
390
|
const resSubstructList: ISubstruct[] = [];
|
|
432
|
-
const seqMonomerList: number[] = [cyclizedMonomer.position];
|
|
391
|
+
const seqMonomerList: number[] = positionMap[cyclizedMonomer.position];
|
|
392
|
+
console.log(seqMonomerList);
|
|
433
393
|
for (const seqMonomer of seqMonomerList) {
|
|
434
|
-
const monomerMap = molMonomerMap.get(
|
|
394
|
+
const monomerMap = molMonomerMap.get(seqMonomer); // single monomer
|
|
435
395
|
if (!monomerMap) return {atoms: [], bonds: [], highlightAtomColors: [], highlightBondColors: []};
|
|
436
396
|
resSubstructList.push(getMolHighlight([monomerMap], monomerLib));
|
|
437
397
|
}
|
|
438
398
|
//TODO: refine merge substract
|
|
439
|
-
|
|
440
|
-
return
|
|
399
|
+
const res: ISubstruct = mergeSubstructs(resSubstructList);
|
|
400
|
+
return res;
|
|
441
401
|
}
|
|
442
402
|
});
|
|
443
403
|
|
|
@@ -463,7 +423,7 @@ function buildCyclizedMonomerHoverLink(
|
|
|
463
423
|
};
|
|
464
424
|
|
|
465
425
|
addMonomerHoverLink(cyclizedCol.temp, resLink);
|
|
466
|
-
|
|
426
|
+
addSubstructProvider(molCol.temp, resLink);
|
|
467
427
|
|
|
468
428
|
return resLink;
|
|
469
429
|
}
|
|
@@ -656,8 +656,8 @@ async function getPolyToolEnumerateDialog(
|
|
|
656
656
|
},
|
|
657
657
|
/* applyInput */ (x: PolyToolEnumerateHelmSerialized): void => {
|
|
658
658
|
//inputs.macromolecule.stringValue = x.macromolecule;
|
|
659
|
-
inputs.placeholders.stringValue = x.placeholders;
|
|
660
659
|
inputs.enumeratorType.value = x.enumeratorType ?? PolyToolEnumeratorTypes.Single;
|
|
660
|
+
inputs.placeholders.stringValue = x.placeholders;
|
|
661
661
|
inputs.placeholdersBreadth.stringValue = x.placeholdersBreadth;
|
|
662
662
|
inputs.trivialNameCol.stringValue = x.trivialNameCol;
|
|
663
663
|
inputs.keepOriginal.value = x.keepOriginal ?? false;
|
|
@@ -107,7 +107,7 @@ category('PolyTool: Convert', () => {
|
|
|
107
107
|
for (const [testName, testData] of Object.entries(tests)) {
|
|
108
108
|
test(`toAtomicLevel-${testName}`, async () => {
|
|
109
109
|
const rules = await getRules(['rules_example.json']);
|
|
110
|
-
const [helmList, isLinear] = doPolyToolConvert([testData.src.seq], rules, helmHelper);
|
|
110
|
+
const [helmList, isLinear, positionMaps] = doPolyToolConvert([testData.src.seq], rules, helmHelper);
|
|
111
111
|
|
|
112
112
|
const lib = await getOverriddenLibrary(rules);
|
|
113
113
|
|