@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.
- package/CHANGELOG.md +13 -0
- package/dist/36.js +1 -1
- package/dist/36.js.map +1 -1
- package/dist/42.js +1 -1
- package/dist/42.js.map +1 -1
- package/dist/590.js +2 -0
- package/dist/590.js.map +1 -0
- package/dist/709.js +1 -2
- package/dist/709.js.map +1 -1
- package/dist/79.js.map +1 -1
- package/dist/895.js +3 -0
- package/dist/895.js.map +1 -0
- package/dist/package-test.js +8 -1
- package/dist/package-test.js.LICENSE.txt +1 -0
- package/dist/package-test.js.map +1 -1
- package/dist/package.js +8 -1
- package/dist/package.js.LICENSE.txt +1 -0
- package/dist/package.js.map +1 -1
- package/files/{data → monomer-libraries}/HELMCoreLibrary.json +594 -594
- package/files/tests/libraries/HELMmonomerSchema.json +96 -0
- package/package.json +12 -10
- package/scripts/sequence_generator.md +48 -0
- package/scripts/sequence_generator.py +515 -256
- package/src/package-test.ts +4 -0
- package/src/package.ts +26 -24
- package/src/tests/WebLogo-layout-tests.ts +37 -0
- package/src/tests/WebLogo-positions-test.ts +5 -0
- package/src/tests/WebLogo-project-tests.ts +63 -0
- package/src/tests/activity-cliffs-tests.ts +3 -2
- package/src/tests/monomer-libraries-tests.ts +7 -4
- package/src/tests/scoring.ts +3 -2
- package/src/tests/substructure-filters-tests.ts +3 -2
- package/src/tests/to-atomic-level-tests.ts +3 -2
- package/src/utils/helm-to-molfile.ts +3 -3
- package/src/utils/monomer-lib/lib-manager.ts +116 -0
- package/src/utils/monomer-lib/library-file-manager/consts.ts +1 -0
- package/src/utils/monomer-lib/library-file-manager/custom-monomer-lib-handlers.ts +80 -0
- package/src/utils/monomer-lib/library-file-manager/event-manager.ts +58 -0
- package/src/utils/monomer-lib/library-file-manager/file-manager.ts +187 -0
- package/src/utils/monomer-lib/library-file-manager/file-validator.ts +56 -0
- package/src/utils/monomer-lib/library-file-manager/style.css +8 -0
- package/src/utils/monomer-lib/library-file-manager/ui.ts +224 -0
- package/src/utils/monomer-lib/monomer-lib.ts +114 -0
- package/src/utils/poly-tool/const.ts +28 -0
- package/src/utils/poly-tool/monomer-lib-handler.ts +115 -0
- package/src/utils/poly-tool/types.ts +6 -0
- package/src/utils/poly-tool/ui.ts +2 -2
- package/src/viewers/vd-regions-viewer.ts +5 -4
- package/src/viewers/web-logo-viewer.ts +6 -5
- package/src/widgets/bio-substructure-filter.ts +4 -1
- package/files/libraries/HELMCoreLibrary.json +0 -18218
- package/src/utils/monomer-lib.ts +0 -305
- /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
|
+
}
|
|
@@ -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 {
|
|
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 =
|
|
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
|
-
|
|
508
|
+
get onRendered(): Observable<void> { return this._onRendered; }
|
|
509
509
|
|
|
510
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1285
|
+
get onRendered(): Observable<void> { return this._onRendered; }
|
|
1286
1286
|
|
|
1287
|
-
|
|
1288
|
-
const
|
|
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.
|
|
1292
|
+
this.render(WlRenderLevel.None, callLog);
|
|
1292
1293
|
this._onRendered.next();
|
|
1293
1294
|
});
|
|
1294
1295
|
}
|
|
1295
1296
|
|
|
1296
|
-
|
|
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 () => {
|
|
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> {
|