@datagrok/bio 2.11.30 → 2.11.33

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.
Files changed (53) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/36.js +1 -1
  3. package/dist/36.js.map +1 -1
  4. package/dist/42.js +1 -1
  5. package/dist/42.js.map +1 -1
  6. package/dist/590.js +2 -0
  7. package/dist/590.js.map +1 -0
  8. package/dist/709.js +1 -2
  9. package/dist/709.js.map +1 -1
  10. package/dist/79.js.map +1 -1
  11. package/dist/895.js +3 -0
  12. package/dist/895.js.map +1 -0
  13. package/dist/package-test.js +8 -1
  14. package/dist/package-test.js.LICENSE.txt +1 -0
  15. package/dist/package-test.js.map +1 -1
  16. package/dist/package.js +8 -1
  17. package/dist/package.js.LICENSE.txt +1 -0
  18. package/dist/package.js.map +1 -1
  19. package/files/{data → monomer-libraries}/HELMCoreLibrary.json +594 -594
  20. package/files/tests/libraries/HELMmonomerSchema.json +96 -0
  21. package/package.json +12 -10
  22. package/scripts/sequence_generator.md +48 -0
  23. package/scripts/sequence_generator.py +515 -256
  24. package/src/package-test.ts +4 -0
  25. package/src/package.ts +26 -24
  26. package/src/tests/WebLogo-layout-tests.ts +37 -0
  27. package/src/tests/WebLogo-positions-test.ts +5 -0
  28. package/src/tests/WebLogo-project-tests.ts +63 -0
  29. package/src/tests/activity-cliffs-tests.ts +3 -2
  30. package/src/tests/monomer-libraries-tests.ts +7 -4
  31. package/src/tests/scoring.ts +3 -2
  32. package/src/tests/substructure-filters-tests.ts +3 -2
  33. package/src/tests/to-atomic-level-tests.ts +3 -2
  34. package/src/utils/helm-to-molfile.ts +3 -3
  35. package/src/utils/monomer-lib/lib-manager.ts +116 -0
  36. package/src/utils/monomer-lib/library-file-manager/consts.ts +1 -0
  37. package/src/utils/monomer-lib/library-file-manager/custom-monomer-lib-handlers.ts +80 -0
  38. package/src/utils/monomer-lib/library-file-manager/event-manager.ts +58 -0
  39. package/src/utils/monomer-lib/library-file-manager/file-manager.ts +187 -0
  40. package/src/utils/monomer-lib/library-file-manager/file-validator.ts +56 -0
  41. package/src/utils/monomer-lib/library-file-manager/style.css +8 -0
  42. package/src/utils/monomer-lib/library-file-manager/ui.ts +224 -0
  43. package/src/utils/monomer-lib/monomer-lib.ts +114 -0
  44. package/src/utils/poly-tool/const.ts +28 -0
  45. package/src/utils/poly-tool/monomer-lib-handler.ts +115 -0
  46. package/src/utils/poly-tool/types.ts +6 -0
  47. package/src/utils/poly-tool/ui.ts +2 -2
  48. package/src/viewers/vd-regions-viewer.ts +5 -4
  49. package/src/viewers/web-logo-viewer.ts +6 -5
  50. package/src/widgets/bio-substructure-filter.ts +4 -1
  51. package/files/libraries/HELMCoreLibrary.json +0 -18218
  52. package/src/utils/monomer-lib.ts +0 -305
  53. /package/dist/{709.js.LICENSE.txt → 895.js.LICENSE.txt} +0 -0
@@ -0,0 +1,115 @@
1
+ /* Do not change these import lines to match external modules in webpack configuration */
2
+ import * as grok from 'datagrok-api/grok';
3
+ import * as ui from 'datagrok-api/ui';
4
+ import * as DG from 'datagrok-api/dg';
5
+
6
+ import {HELM_FIELDS, DUMMY_MONOMER} from '@datagrok-libraries/bio/src/utils/const';
7
+ import {
8
+ helmFieldsToPolyToolInputFields, R_GROUP_BLOCK_DUMMY
9
+ } from './const';
10
+ import {Monomer, RGroup} from '@datagrok-libraries/bio/src/types/index';
11
+
12
+ export class PolyToolMonomerLibHandler {
13
+ constructor(private rawLib: any[]) { }
14
+
15
+ isValid(): boolean {
16
+ return this.rawLib.every((entry) => {
17
+ return typeof entry === 'object' &&
18
+ Object.values(helmFieldsToPolyToolInputFields).every((field) => {
19
+ return field in entry &&
20
+ typeof entry[field] === 'string';
21
+ });
22
+ });
23
+ }
24
+
25
+ getJsonMonomerLib(): any {
26
+ const resultLib: any[] = [];
27
+ this.rawLib.forEach((rawMonomer) => {
28
+ const monomer = this.prepareMonomer(rawMonomer);
29
+ resultLib.push(monomer);
30
+ });
31
+ return resultLib;
32
+ }
33
+
34
+ private prepareMonomer(rawMonomer: any): Monomer {
35
+ const monomer: Monomer = {...DUMMY_MONOMER};
36
+
37
+ Object.entries(helmFieldsToPolyToolInputFields).forEach(([key, value]) => {
38
+ const monomerSymbol = rawMonomer[value] as string;
39
+ //@ts-ignore
40
+ monomer[key] = monomerSymbol;
41
+ });
42
+
43
+ let key = HELM_FIELDS.SMILES;
44
+ const rawSmiles = rawMonomer[helmFieldsToPolyToolInputFields[key]];
45
+ const smilesHandler = new SmilesHandler(rawSmiles);
46
+ const smiles = smilesHandler.getCappedSmiles();
47
+ monomer[key] = smiles;
48
+
49
+ key = HELM_FIELDS.RGROUPS;
50
+ monomer[key] = RGroupHandler.getRGroups(smilesHandler.getNumberOfRGroups());
51
+
52
+ key = HELM_FIELDS.MOLFILE;
53
+ monomer[key] = new MolBlockHandler(smilesHandler.getSmilesWithRGroups()).getMolfile();
54
+
55
+ return monomer;
56
+ }
57
+ }
58
+
59
+ class SmilesHandler {
60
+ constructor(rawSmiles: string) {
61
+ const regex = /\[R(\d+)\]/g;
62
+ let i = 0;
63
+ this.smilesWithRGroups = rawSmiles.replace(regex, (_, capturedDigit) => { ++i; return `[${capturedDigit}*]`; });
64
+ this.numberOfRGroups = i;
65
+ }
66
+
67
+ private numberOfRGroups: number;
68
+ private smilesWithRGroups: string;
69
+
70
+ getSmilesWithRGroups(): string {
71
+ return this.smilesWithRGroups;
72
+ }
73
+
74
+ getCappedSmiles(): string {
75
+ const smiles = this.capRGroups();
76
+ return smiles;
77
+ }
78
+
79
+ getNumberOfRGroups(): number {
80
+ return this.numberOfRGroups;
81
+ }
82
+
83
+ private capRGroups(): string {
84
+ let result = this.smilesWithRGroups.replace('[1*]', '[H:1]');
85
+ result = result.replace('[2*]', '[OH:2]');
86
+ return result.replace('[3*]', '[H:3]');
87
+ }
88
+ }
89
+
90
+ class RGroupHandler {
91
+ private constructor() {};
92
+
93
+ static getRGroups(numberOfRGroups: number): RGroup[] {
94
+ return R_GROUP_BLOCK_DUMMY.slice(0, numberOfRGroups);
95
+ }
96
+ }
97
+
98
+ class MolBlockHandler {
99
+ constructor(private smilesWithRGroups: string) { }
100
+
101
+ getMolfile(): string {
102
+ let molfile = DG.chem.convert(this.smilesWithRGroups, DG.chem.Notation.Smiles, DG.chem.Notation.MolBlock);
103
+ molfile = this.restoreRGPLine(molfile);
104
+ molfile = this.fixRGroupSymbols(molfile);
105
+ return molfile;
106
+ }
107
+
108
+ private restoreRGPLine(rawMolfile: string): string {
109
+ return rawMolfile.replace('M ISO', 'M RGP');
110
+ }
111
+
112
+ private fixRGroupSymbols(molfile: string): string {
113
+ return molfile.replace(/\bR\b/g, 'R#');
114
+ }
115
+ }
@@ -12,3 +12,9 @@ export type ConnectionData = {
12
12
  attachmentPoint: number,
13
13
  }
14
14
 
15
+ export type PolyToolLib = {
16
+ 'Short Name': string,
17
+ 'Medium Name': string,
18
+ 'SMILES': string,
19
+ 'Synonyms': string
20
+ }
@@ -4,7 +4,7 @@ import * as ui from 'datagrok-api/ui';
4
4
  import * as DG from 'datagrok-api/dg';
5
5
 
6
6
  import {HELM_POLYMER_TYPE} from '@datagrok-libraries/bio/src/utils/const';
7
- import {MonomerLibHelper} from '../../utils/monomer-lib';
7
+ import {MonomerLibManager} from '../monomer-lib/lib-manager';
8
8
  import {ALL_MONOMERS, CYCLIZATION_TYPE, TRANSFORMATION_TYPE} from './const';
9
9
  import {addTransformedColumn} from './transformation';
10
10
  import * as rxjs from 'rxjs';
@@ -73,7 +73,7 @@ export function getPolyToolDialog(): DG.Dialog {
73
73
  'Type', cyclizationTypes[2], cyclizationTypes, () => { onCyclizationChoice.next(); }
74
74
  );
75
75
 
76
- const monomerLib = MonomerLibHelper.instance.getBioLib();
76
+ const monomerLib = MonomerLibManager.instance.getBioLib();
77
77
  let monomerList1: string[] = [];
78
78
  let monomerList2: string[] = [];
79
79
  let leftTerminalChoice = ui.choiceInput(
@@ -505,18 +505,19 @@ export class VdRegionsViewer extends DG.JsViewer implements IVdRegionsViewer {
505
505
 
506
506
  private _onRendered: Subject<void> = new Subject<void>();
507
507
 
508
- public get onRendered(): Observable<void> { return this._onRendered; }
508
+ get onRendered(): Observable<void> { return this._onRendered; }
509
509
 
510
- public invalidate(): void {
511
- const logPrefix = `${this.viewerToLog()}.invalidate()`;
510
+ invalidate(caller?: string): void {
511
+ const logPrefix = `${this.viewerToLog()}.invalidate(${caller ? ` <- ${caller} ` : ''})`;
512
512
  // Put the event trigger in the tail of the synced calls queue.
513
513
  this.viewSyncer.sync(`${logPrefix}`, async () => {
514
514
  // update view / render
515
+ // TODO: Request re-render
515
516
  this._onRendered.next();
516
517
  });
517
518
  }
518
519
 
519
- public async awaitRendered(timeout: number | undefined = 5000): Promise<void> {
520
+ async awaitRendered(timeout: number | undefined = 5000): Promise<void> {
520
521
  await testEvent(this.onRendered, () => {}, () => {
521
522
  this.invalidate();
522
523
  }, timeout);
@@ -1282,18 +1282,19 @@ export class WebLogoViewer extends DG.JsViewer implements IWebLogoViewer {
1282
1282
 
1283
1283
  private _onRendered: Subject<void> = new Subject<void>();
1284
1284
 
1285
- public get onRendered(): Observable<void> { return this._onRendered; }
1285
+ get onRendered(): Observable<void> { return this._onRendered; }
1286
1286
 
1287
- public invalidate(): void {
1288
- const logPrefix = `${this.viewerToLog()}.invalidate()`;
1287
+ invalidate(caller?: string): void {
1288
+ const callLog = `invalidate(${caller ? ` <- ${caller} ` : ''})`;
1289
+ const logPrefix = `${this.viewerToLog()}.${callLog}`;
1289
1290
  // Put the event trigger in the tail of the synced calls queue.
1290
1291
  this.viewSyncer.sync(`${logPrefix}`, async () => {
1291
- this.invalidate();
1292
+ this.render(WlRenderLevel.None, callLog);
1292
1293
  this._onRendered.next();
1293
1294
  });
1294
1295
  }
1295
1296
 
1296
- public async awaitRendered(timeout: number | undefined = 5000): Promise<void> {
1297
+ async awaitRendered(timeout: number | undefined = 5000): Promise<void> {
1297
1298
  await testEvent(this.onRendered, () => {}, () => {
1298
1299
  this.invalidate();
1299
1300
  }, timeout);
@@ -249,7 +249,10 @@ export class BioSubstructureFilter extends DG.Filter implements IRenderer {
249
249
 
250
250
  invalidate(caller?: string): void {
251
251
  const logPrefix = `${this.filterToLog()}.invalidate(${caller ? ` <- ${caller} ` : ''})`;
252
- this.filterSyncer.sync(logPrefix, async () => { this._onRendered.next(); });
252
+ this.filterSyncer.sync(logPrefix, async () => {
253
+ // TODO: Request re-render
254
+ this._onRendered.next();
255
+ });
253
256
  }
254
257
 
255
258
  async awaitRendered(timeout: number = 10000): Promise<void> {