@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.
@@ -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} from '@datagrok-libraries/chem-meta/src/types';
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 seqHelper: ISeqHelper = await getSeqHelper();
304
- const toAtomicLevelRes =
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]; // TODO: Map position of harmonized sequence
391
+ const seqMonomerList: number[] = positionMap[cyclizedMonomer.position];
392
+ console.log(seqMonomerList);
433
393
  for (const seqMonomer of seqMonomerList) {
434
- const monomerMap = molMonomerMap.get(cyclizedMonomer!.position); // single monomer
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
- //const res: ISubstruct = mergeSubstructs(resSubstructList);
440
- return undefined;
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
- // addSubstructProvider(molCol.temp, resLink); //
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