@datagrok/bio 2.12.16 → 2.12.18

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 (38) hide show
  1. package/CHANGELOG.md +20 -2
  2. package/dist/79.js.map +1 -1
  3. package/dist/package-test.js +5 -5
  4. package/dist/package-test.js.map +1 -1
  5. package/dist/package.js +3 -3
  6. package/dist/package.js.map +1 -1
  7. package/package.json +6 -6
  8. package/src/package-test.ts +1 -1
  9. package/src/package.ts +38 -44
  10. package/src/tests/monomer-libraries-tests.ts +1 -4
  11. package/src/tests/renderers-monomer-placer-tests.ts +9 -8
  12. package/src/tests/renderers-test.ts +1 -1
  13. package/src/tests/scoring.ts +2 -2
  14. package/src/tests/substructure-filters-tests.ts +4 -2
  15. package/src/tests/to-atomic-level-tests.ts +1 -1
  16. package/src/tests/utils.ts +15 -0
  17. package/src/utils/cell-renderer.ts +45 -70
  18. package/src/utils/{poly-tool/cyclized.ts → cyclized.ts} +3 -7
  19. package/src/utils/helm-to-molfile/converter/converter.ts +10 -5
  20. package/src/utils/helm-to-molfile/converter/monomer-wrapper.ts +9 -9
  21. package/src/utils/helm-to-molfile/converter/polymer.ts +10 -3
  22. package/src/utils/monomer-cell-renderer.ts +18 -8
  23. package/src/utils/monomer-lib/lib-manager.ts +56 -18
  24. package/src/utils/monomer-lib/library-file-manager/event-manager.ts +15 -9
  25. package/src/utils/monomer-lib/library-file-manager/file-manager.ts +78 -59
  26. package/src/utils/monomer-lib/library-file-manager/file-validator.ts +3 -1
  27. package/src/utils/monomer-lib/library-file-manager/ui.ts +52 -47
  28. package/src/utils/monomer-lib/monomer-lib.ts +91 -10
  29. package/src/utils/sequence-to-mol.ts +7 -7
  30. package/src/widgets/bio-substructure-filter-helm.ts +5 -4
  31. package/src/widgets/bio-substructure-filter.ts +2 -3
  32. package/webpack.config.js +3 -0
  33. package/src/utils/poly-tool/const.ts +0 -40
  34. package/src/utils/poly-tool/csv-to-json-monomer-lib-converter.ts +0 -40
  35. package/src/utils/poly-tool/monomer-lib-handler.ts +0 -115
  36. package/src/utils/poly-tool/transformation.ts +0 -320
  37. package/src/utils/poly-tool/ui.ts +0 -59
  38. package/src/utils/poly-tool/utils.ts +0 -20
@@ -1,320 +0,0 @@
1
- import * as grok from 'datagrok-api/grok';
2
- import * as ui from 'datagrok-api/ui';
3
- import * as DG from 'datagrok-api/dg';
4
-
5
- import {NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';
6
- import {SeqHandler} from '@datagrok-libraries/bio/src/utils/seq-handler';
7
- import {ALIGNMENT, ALPHABET} from '@datagrok-libraries/bio/src/utils/macromolecule';
8
-
9
- import {getMolColumnFromHelm} from '../helm-to-molfile/utils';
10
-
11
- export const RULES_PATH = 'System:AppData/Bio/polytool-rules/';
12
- export const RULES_STORAGE_NAME = 'Polytool';
13
-
14
- const enum HELM_WRAPPER {
15
- LEFT = 'PEPTIDE1{',
16
- RIGHT = '}$$$$',
17
- }
18
-
19
- type ConnectionData = {
20
- allPos1: number[],
21
- allPos2: number[],
22
- allAttaches1: number[],
23
- allAttaches2: number[],
24
- }
25
-
26
- type Rule = {
27
- code: number,
28
- firstMonomer: string,
29
- secondMonomer: string,
30
- firstModification: string,
31
- secondModification: string,
32
- firstR: number,
33
- secondR: number
34
- }
35
-
36
- function addCommonTags(col: DG.Column): void {
37
- col.setTag('quality', DG.SEMTYPE.MACROMOLECULE);
38
- col.setTag('aligned', ALIGNMENT.SEQ);
39
- col.setTag('alphabet', ALPHABET.PT);
40
- }
41
-
42
- class TransformationCommon {
43
- helmColumn: DG.Column;
44
-
45
- constructor(helmColumn: DG.Column<string>) {
46
- this.helmColumn = helmColumn;
47
- }
48
-
49
- protected getLinkedPositions(monomers: string[], rules: Rule[]): [number, number][] {
50
- const monomersNames = monomers.map((m) => { return m.replace('[', '').replace(']', ''); });
51
- const result: [number, number][] = new Array<[number, number]>(rules.length);
52
-
53
- for (let i = 0; i < rules.length; i++) {
54
- let firstFound = false;
55
- let secondFound = false;
56
- let firstIsFirst = false;
57
- let firstEntryIndex = -1;
58
- let secondEntryIndex = -1;
59
- const add = `(${rules[i].code})`;
60
- for (let j = 0; j < monomersNames.length; j++) {
61
- if (monomersNames[j].includes(add)) {
62
- if (firstFound) {
63
- if (firstIsFirst && monomersNames[j] == rules[i].secondMonomer + add) {
64
- secondFound = true;
65
- secondEntryIndex = j;
66
- break;
67
- } else if (!firstIsFirst && monomersNames[j] == rules[i].firstMonomer + add) {
68
- secondFound = true;
69
- secondEntryIndex = j;
70
- break;
71
- } else
72
- continue;
73
-
74
- //result[i][1] = j;
75
- // secondFound = true;
76
- // break;
77
- } else {
78
- if (monomersNames[j] == rules[i].firstMonomer + add) {
79
- firstFound = true;
80
- firstIsFirst = true;
81
- firstEntryIndex = j;
82
- } else if (monomersNames[j] == rules[i].secondMonomer + add) {
83
- firstFound = true;
84
- firstIsFirst = false;
85
- firstEntryIndex = j;
86
- } else
87
- continue;
88
-
89
- //result[i] = [j, 0];
90
- }
91
- }
92
- }
93
-
94
- if (!(firstFound && secondFound))
95
- result[i] = [-1, -1];
96
- else if (firstIsFirst)
97
- result[i] = [firstEntryIndex, secondEntryIndex];
98
- else
99
- result[i] = [secondEntryIndex, firstEntryIndex];
100
- }
101
-
102
-
103
- return result;
104
- }
105
-
106
- protected getRules(rulesTables: DG.DataFrame[]): Rule[] {
107
- const ruleCount = rulesTables.map((df) => df.rowCount).reduce((a, b) => a + b);
108
- const rules: Rule[] = new Array<Rule>(ruleCount);
109
-
110
- let counter = 0;
111
- for (let i = 0; i < rulesTables.length; i++) {
112
- const codeCol = rulesTables[i].columns.byName('code');
113
- const monomer1Col = rulesTables[i].columns.byName('monomer1');
114
- const monomer2Col = rulesTables[i].columns.byName('monomer2');
115
- const modification1Col = rulesTables[i].columns.byName('modification1');
116
- const modification2Col = rulesTables[i].columns.byName('modification2');
117
- const r1Col = rulesTables[i].columns.byName('R1');
118
- const r2Col = rulesTables[i].columns.byName('R2');
119
-
120
- for (let j = 0; j < rulesTables[i].rowCount; j++, counter++) {
121
- rules[counter] = {
122
- code: codeCol.get(j),
123
- firstMonomer: monomer1Col.get(j),
124
- secondMonomer: monomer2Col.get(j),
125
- firstModification: modification1Col.get(j),
126
- secondModification: modification2Col.get(j),
127
- firstR: r1Col.get(j),
128
- secondR: r2Col.get(j),
129
- };
130
- }
131
- }
132
-
133
- return rules;
134
- }
135
-
136
- protected getDimeric(helm: string): [string[], [number, number][]] {
137
- const seq = helm.replace(HELM_WRAPPER.LEFT, '').replace(HELM_WRAPPER.RIGHT, '');
138
- const monomers = seq.split('.');
139
- const duplicates: [number, number][] = [];
140
-
141
- for (let i = 0; i < monomers.length; i++) {
142
- if (monomers[i].includes('(#2)')) {
143
- monomers[i] = monomers[i].replace('(#2)', '');
144
- const duplicateStart = i + 1;
145
- let duplicateFinish = 0;
146
- for (let j = duplicateStart + 1; j < monomers.length; j++) {
147
- if (monomers[j].includes('}')) {
148
- duplicateFinish = j; break;
149
- }
150
- }
151
- monomers[duplicateStart] = monomers[duplicateStart].replace('{', '');
152
- monomers[duplicateFinish] = monomers[duplicateFinish].replace('}', '');
153
- duplicates.push([duplicateStart, duplicateFinish]);
154
- }
155
- }
156
-
157
- return [monomers, duplicates];
158
- }
159
-
160
- protected getAllCycles(rules: Rule[], monomers: string [], positions: [number, number][]) :
161
- [string [], number [], number [], number [], number []] {
162
- const allPos1: number [] = [];
163
- const allPos2: number [] = [];
164
- const allAttaches1: number [] = [];
165
- const allAttaches2: number [] = [];
166
- const ruleCount = rules.length;
167
-
168
- for (let i = 0; i < ruleCount; i++) {
169
- if (positions[i][0] == -1)
170
- continue;
171
-
172
- const firstMonomer = monomers[positions[i][0]].replace('[', '').replace(']', '');
173
- const secondMonomer = monomers[positions[i][1]].replace('[', '').replace(']', '');
174
-
175
- monomers[positions[i][0]] = monomers[positions[i][0]].replace(firstMonomer, rules[i].firstModification);
176
- monomers[positions[i][1]] = monomers[positions[i][1]].replace(secondMonomer, rules[i].secondModification);
177
-
178
- allPos1.push(positions[i][0] + 1);
179
- allPos2.push(positions[i][1] + 1);
180
- allAttaches1.push(rules[i].firstR);
181
- allAttaches2.push(rules[i].secondR);
182
- }
183
-
184
- return [monomers, allPos1, allPos2, allAttaches1, allAttaches2];
185
- }
186
-
187
- protected getHelmCycle(source: ConnectionData, polFirst: number, poSecond: number): string {
188
- let cycled = '';
189
-
190
- for (let i = 0; i < source.allPos1.length; i++) {
191
- if (i == 0)
192
- cycled += `PEPTIDE${polFirst},PEPTIDE${poSecond},`;
193
- else
194
- cycled += `|PEPTIDE${polFirst},PEPTIDE${poSecond},`;
195
- cycled += `${source.allPos1[i]}:R${source.allAttaches1[i]}-${source.allPos2[i]}:R${source.allAttaches2[i]}`;
196
- }
197
- return cycled;
198
- }
199
-
200
- //"PEPTIDE1{[(#2)Succ].[{R].F.[Dab(2)].T.G.H.F.G.A.A.Y.P.[E(2)].[NH2}]}$$$$"
201
- protected getTransformedHelm(helm: string, rules: Rule[]): string {
202
- const [monomers, duplicates] = this.getDimeric(helm);
203
- const positions = this.getLinkedPositions(monomers, rules);
204
- const [monomersCycled, allPos1, allPos2, allAttaches1, allAttaches2] =
205
- this.getAllCycles(rules, monomers, positions);
206
-
207
- helm = 'PEPTIDE1{';
208
- for (let i = 0; i < monomersCycled.length; i++)
209
- helm += i != monomersCycled.length - 1 ? monomersCycled[i] + '.' : monomersCycled[i];
210
-
211
- helm += '}';
212
-
213
- const dimerCodes = new Array<string>(duplicates.length);
214
- const cycleCodes = new Array<string>(duplicates.length);
215
- for (let i = 0; i < duplicates.length; i++) {
216
- let helmAdd = `|PEPTIDE${i + 2}{`;
217
- const lengthAdd = duplicates[i][1] - duplicates[i][0];
218
- //const monomersAdd = new Array<string>(lengthAdd);
219
- const allPosAdd1: number [] = [];
220
- const allPosAdd2: number [] = [];
221
- const allAttachesAdd1: number [] = [];
222
- const allAttachesAdd2: number [] = [];
223
-
224
- for (let j = 0; j <= lengthAdd; j ++) {
225
- const index = j + duplicates[i][0];
226
- helmAdd += j != lengthAdd ? monomersCycled[index] + '.' : monomersCycled[index];
227
- }
228
-
229
- helmAdd += '}';
230
-
231
- for (let j = 0; j < allPos1.length; j++) {
232
- if (allPos1[j] - 1 >= duplicates[i][0] && allPos1[j] - 1 <= duplicates[i][1]) {
233
- allPosAdd1.push(allPos1[j] - duplicates[i][0]);
234
- allPosAdd2.push(allPos2[j] - duplicates[i][0]);
235
- allAttachesAdd1.push(allAttaches1[j]);
236
- allAttachesAdd2.push(allAttaches1[j]);
237
- }
238
- }
239
-
240
- const addCyclysation = this.getHelmCycle({
241
- allPos1: allPosAdd1,
242
- allPos2: allPosAdd2,
243
- allAttaches1: allAttachesAdd1,
244
- allAttaches2: allAttachesAdd2}, i + 2, i + 2);
245
-
246
- dimerCodes[i] = helmAdd;
247
- cycleCodes[i] = this.getHelmCycle({
248
- allPos1: [duplicates[i][0]],
249
- allPos2: [1],
250
- allAttaches1: [1],
251
- allAttaches2: [1]}, 1, i + 2);
252
- cycleCodes.push(addCyclysation);
253
- }
254
-
255
- for (let i = 0; i < dimerCodes.length; i++)
256
- helm += dimerCodes[i];
257
-
258
- helm += '$';
259
- const mainCyclysation = this.getHelmCycle({allPos1, allPos2, allAttaches1, allAttaches2}, 1, 1);
260
- helm += mainCyclysation;
261
- for (let i = 0; i < cycleCodes.length; i++) {
262
- helm += '|';
263
- helm += cycleCodes[i];
264
- }
265
- helm += '$$$';
266
- return helm;
267
- }
268
-
269
- transform(rulesTables: DG.DataFrame[]): string[] {
270
- const rules = this.getRules(rulesTables);
271
- const resultList = this.helmColumn.toList().map((helm: string) => {
272
- return this.getTransformedHelm(helm, rules);
273
- });
274
- return resultList;
275
- }
276
- }
277
-
278
- class PolymerTransformation {
279
- private constructor() {}
280
-
281
- static getInstance(molColumn: DG.Column<string>) {
282
- return new TransformationCommon(molColumn);
283
- }
284
- }
285
-
286
- export async function addTransformedColumn(
287
- molColumn: DG.Column<string>, addHelm: boolean, ruleFiles: string[], chiralityEngine?: boolean
288
- ): Promise<void> {
289
- const df = molColumn.dataFrame;
290
- const sh = SeqHandler.forColumn(molColumn);
291
- const sourceHelmCol = sh.convert(NOTATION.HELM);
292
- const pt = PolymerTransformation.getInstance(sourceHelmCol);
293
- const fileSource = new DG.FileSource(RULES_PATH);
294
-
295
- const rulesRawFrames: DG.DataFrame[] = new Array<DG.DataFrame>(ruleFiles.length);
296
-
297
- for (let i = 0; i < ruleFiles.length; i++) {
298
- const rulesRaw = await fileSource.readAsText(ruleFiles[i].replace(RULES_PATH, ''));
299
- rulesRawFrames[i] = DG.DataFrame.fromCsv(rulesRaw);
300
- }
301
-
302
- const targetList = pt.transform(rulesRawFrames);
303
- const helmColName = df.columns.getUnusedName('transformed(' + molColumn.name + ')');
304
- const targetHelmCol = DG.Column.fromList('string', helmColName, targetList);
305
-
306
- addCommonTags(targetHelmCol);
307
- targetHelmCol.setTag('units', NOTATION.HELM);
308
-
309
- const molCol = await getMolColumnFromHelm(df, targetHelmCol, chiralityEngine);
310
- molCol.name = df.columns.getUnusedName('molfile(' + molColumn.name + ')');
311
- molCol.semType = DG.SEMTYPE.MOLECULE;
312
-
313
- if (addHelm) {
314
- targetHelmCol.setTag('cell.renderer', 'helm');
315
- //targetHelmCol.semType = DG.SEMTYPE.MACROMOLECULE;
316
- df.columns.add(targetHelmCol);
317
- }
318
- df.columns.add(molCol, true);
319
- await grok.data.detectSemanticTypes(df);
320
- }
@@ -1,59 +0,0 @@
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 {addTransformedColumn} from './transformation';
7
- import {RULES_PATH, RULES_STORAGE_NAME} from './transformation';
8
- import {ActiveFiles} from '@datagrok-libraries/utils/src/settings/active-files-base';
9
-
10
- class RuleInputs extends ActiveFiles {
11
- constructor(path: string, userStorageName: string, ext: string ) {
12
- super(path, userStorageName, ext);
13
- }
14
- }
15
-
16
- export async function getPolyToolDialog(): Promise<DG.Dialog> {
17
- const targetColumns = grok.shell.t.columns.bySemTypeAll(DG.SEMTYPE.MACROMOLECULE);
18
- if (!targetColumns)
19
- throw new Error('No dataframe with macromolecule columns open');
20
-
21
- const targetColumnInput = ui.columnInput(
22
- 'Column', grok.shell.t, targetColumns[0], null,
23
- {filter: (col: DG.Column) => col.semType === DG.SEMTYPE.MACROMOLECULE}
24
- );
25
-
26
- const generateHelmChoiceInput = ui.boolInput('Get HELM', true);
27
- ui.tooltip.bind(generateHelmChoiceInput.root, 'Add HELM column');
28
-
29
- const chiralityEngineInput = ui.boolInput('Chirality engine', false);
30
- const ruleInputs = new RuleInputs(RULES_PATH, RULES_STORAGE_NAME, '.csv');
31
- const rulesForm = await ruleInputs.getForm();
32
-
33
- const div = ui.div([
34
- targetColumnInput,
35
- generateHelmChoiceInput,
36
- chiralityEngineInput,
37
- 'Rules used',
38
- rulesForm
39
- ]);
40
-
41
- const dialog = ui.dialog('Poly Tool')
42
- .add(div)
43
- .onOK(async () => {
44
- const molCol = targetColumnInput.value;
45
- if (!molCol) {
46
- grok.shell.warning('No marcomolecule column chosen!');
47
- return;
48
- }
49
-
50
- const files = await ruleInputs.getActive();
51
-
52
- addTransformedColumn(molCol!,
53
- generateHelmChoiceInput.value!,
54
- files,
55
- chiralityEngineInput.value!);
56
- });
57
-
58
- return dialog;
59
- }
@@ -1,20 +0,0 @@
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 {ALPHABET, ALIGNMENT, NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';
7
-
8
- export function _setPeptideColumn(col: DG.Column): void {
9
- addCommonTags(col);
10
- col.setTag('units', NOTATION.SEPARATOR);
11
- col.setTag('separator', '-');
12
- // col.setTag('cell.renderer', 'sequence');
13
- }
14
-
15
- function addCommonTags(col: DG.Column<any>) {
16
- col.setTag('quality', DG.SEMTYPE.MACROMOLECULE);
17
- col.setTag('aligned', ALIGNMENT.SEQ);
18
- col.setTag('alphabet', ALPHABET.PT);
19
- }
20
-