@datagrok/sequence-translator 1.2.6 → 1.2.9

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 (102) hide show
  1. package/.eslintrc.json +5 -5
  2. package/CHANGELOG.md +12 -0
  3. package/dist/package-test.js +2 -1
  4. package/dist/package-test.js.LICENSE.txt +8 -0
  5. package/dist/package-test.js.map +1 -1
  6. package/dist/package.js +2 -1
  7. package/dist/package.js.LICENSE.txt +8 -0
  8. package/dist/package.js.map +1 -1
  9. package/files/pattern-app-data.json +80 -0
  10. package/package.json +21 -14
  11. package/src/{model → apps/common/model}/const.ts +1 -1
  12. package/src/{model/data-loading-utils → apps/common/model/data-loader}/const.ts +7 -2
  13. package/src/apps/common/model/data-loader/json-loader.ts +48 -0
  14. package/src/{model/data-loading-utils → apps/common/model/data-loader}/types.ts +13 -6
  15. package/src/{model → apps/common/model}/monomer-lib/lib-wrapper.ts +9 -12
  16. package/src/apps/common/model/oligo-toolkit-package.ts +30 -0
  17. package/src/{model → apps/common/model}/parsing-validation/format-detector.ts +5 -5
  18. package/src/{model → apps/common/model}/parsing-validation/format-handler.ts +18 -19
  19. package/src/{model → apps/common/model}/parsing-validation/sequence-validator.ts +1 -1
  20. package/src/apps/common/view/app-ui-base.ts +28 -0
  21. package/src/apps/common/view/combined-app-ui.ts +66 -0
  22. package/src/{view/utils → apps/common/view/components}/colored-input/colored-text-input.ts +1 -1
  23. package/src/{view/utils → apps/common/view/components}/draw-molecule.ts +1 -1
  24. package/src/{view/utils → apps/common/view/components}/molecule-img.ts +3 -3
  25. package/src/{view/const/ui.ts → apps/common/view/const.ts} +4 -4
  26. package/src/apps/common/view/isolated-app-ui.ts +43 -0
  27. package/src/{view/monomer-lib-viewer/viewer.ts → apps/common/view/monomer-lib-viewer.ts} +2 -2
  28. package/src/apps/common/view/utils.ts +29 -0
  29. package/src/apps/pattern/model/const.ts +121 -0
  30. package/src/apps/pattern/model/data-manager.ts +297 -0
  31. package/src/apps/pattern/model/event-bus.ts +470 -0
  32. package/src/apps/pattern/model/router.ts +46 -0
  33. package/src/apps/pattern/model/subscription-manager.ts +21 -0
  34. package/src/apps/pattern/model/translator.ts +68 -0
  35. package/src/apps/pattern/model/types.ts +52 -0
  36. package/src/apps/pattern/model/utils.ts +110 -0
  37. package/src/apps/pattern/view/components/bulk-convert/column-input.ts +69 -0
  38. package/src/apps/pattern/view/components/bulk-convert/table-controls.ts +37 -0
  39. package/src/apps/pattern/view/components/bulk-convert/table-input.ts +95 -0
  40. package/src/apps/pattern/view/components/edit-block-controls.ts +196 -0
  41. package/src/apps/pattern/view/components/left-section.ts +44 -0
  42. package/src/apps/pattern/view/components/load-block-controls.ts +198 -0
  43. package/src/apps/pattern/view/components/numeric-label-visibility-controls.ts +69 -0
  44. package/src/apps/pattern/view/components/right-section.ts +148 -0
  45. package/src/apps/pattern/view/components/strand-editor/dialog.ts +79 -0
  46. package/src/apps/pattern/view/components/strand-editor/header-controls.ts +105 -0
  47. package/src/apps/pattern/view/components/strand-editor/strand-controls.ts +159 -0
  48. package/src/apps/pattern/view/components/terminal-modification-editor.ts +127 -0
  49. package/src/apps/pattern/view/components/translation-examples-block.ts +139 -0
  50. package/src/{view/style/pattern-app.css → apps/pattern/view/style.css} +4 -0
  51. package/src/apps/pattern/view/svg-utils/const.ts +63 -0
  52. package/src/apps/pattern/view/svg-utils/dimensions-calculator.ts +498 -0
  53. package/src/apps/pattern/view/svg-utils/svg-display-manager.ts +45 -0
  54. package/src/apps/pattern/view/svg-utils/svg-element-factory.ts +82 -0
  55. package/src/apps/pattern/view/svg-utils/svg-renderer.ts +396 -0
  56. package/src/apps/pattern/view/svg-utils/utils.ts +37 -0
  57. package/src/apps/pattern/view/types.ts +14 -0
  58. package/src/apps/pattern/view/ui.ts +61 -0
  59. package/src/{model/structure-app → apps/structure/model}/mol-transformations.ts +3 -3
  60. package/src/{model/structure-app → apps/structure/model}/monomer-code-parser.ts +9 -10
  61. package/src/{model/structure-app → apps/structure/model}/oligo-structure.ts +4 -4
  62. package/src/{model/structure-app → apps/structure/model}/sequence-to-molfile.ts +2 -2
  63. package/src/{view/apps/oligo-structure.ts → apps/structure/view/ui.ts} +31 -17
  64. package/src/{model/translator-app → apps/translator/model}/conversion-utils.ts +25 -7
  65. package/src/{model/translator-app → apps/translator/model}/format-converter.ts +7 -12
  66. package/src/{view/const/oligo-translator.ts → apps/translator/view/const.ts} +2 -0
  67. package/src/apps/translator/view/ui.ts +547 -0
  68. package/src/demo/demo-st-ui.ts +12 -32
  69. package/src/package.ts +76 -56
  70. package/src/plugins/mermade.ts +9 -9
  71. package/src/polytool/const.ts +40 -0
  72. package/src/polytool/csv-to-json-monomer-lib-converter.ts +40 -0
  73. package/src/polytool/cyclized.ts +56 -0
  74. package/src/polytool/monomer-lib-handler.ts +115 -0
  75. package/src/polytool/transformation.ts +326 -0
  76. package/src/polytool/ui.ts +59 -0
  77. package/src/polytool/utils.ts +20 -0
  78. package/src/tests/const.ts +5 -5
  79. package/src/tests/formats-support.ts +6 -6
  80. package/src/tests/formats-to-helm.ts +5 -5
  81. package/src/tests/helm-to-nucleotides.ts +5 -5
  82. package/tsconfig.json +4 -10
  83. package/webpack.config.js +3 -0
  84. package/files/axolabs-style.json +0 -97
  85. package/src/model/data-loading-utils/json-loader.ts +0 -38
  86. package/src/model/pattern-app/const.ts +0 -33
  87. package/src/model/pattern-app/draw-svg.ts +0 -193
  88. package/src/model/pattern-app/helpers.ts +0 -96
  89. package/src/model/pattern-app/oligo-pattern.ts +0 -111
  90. package/src/view/app-ui.ts +0 -193
  91. package/src/view/apps/oligo-pattern.ts +0 -759
  92. package/src/view/apps/oligo-translator.ts +0 -184
  93. /package/src/{model → apps/common/model}/helpers.ts +0 -0
  94. /package/src/{model → apps/common/model}/monomer-lib/const.ts +0 -0
  95. /package/src/{view/utils → apps/common/view/components}/app-info-dialog.ts +0 -0
  96. /package/src/{view/utils → apps/common/view/components}/colored-input/input-painters.ts +0 -0
  97. /package/src/{view/style/colored-text-input.css → apps/common/view/components/colored-input/style.css} +0 -0
  98. /package/src/{view/utils → apps/common/view/components}/router.ts +0 -0
  99. /package/src/{model/structure-app → apps/structure/model}/const.ts +0 -0
  100. /package/src/{view/style/structure-app.css → apps/structure/view/style.css} +0 -0
  101. /package/src/{model/translator-app → apps/translator/model}/const.ts +0 -0
  102. /package/src/{view/style/translator-app.css → apps/translator/view/style.css} +0 -0
@@ -0,0 +1,326 @@
1
+ import * as grok from 'datagrok-api/grok';
2
+ import * as DG from 'datagrok-api/dg';
3
+
4
+ import {NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';
5
+ import {SeqHandler} from '@datagrok-libraries/bio/src/utils/seq-handler';
6
+ import {ALIGNMENT, ALPHABET} from '@datagrok-libraries/bio/src/utils/macromolecule';
7
+
8
+ //import {getMolColumnFromHelm} from '../helm-to-molfile/utils';
9
+
10
+ export const RULES_PATH = 'System:AppData/Bio/polytool-rules/';
11
+ export const RULES_STORAGE_NAME = 'Polytool';
12
+
13
+ const enum HELM_WRAPPER {
14
+ LEFT = 'PEPTIDE1{',
15
+ RIGHT = '}$$$$',
16
+ }
17
+
18
+ type ConnectionData = {
19
+ allPos1: number[],
20
+ allPos2: number[],
21
+ allAttaches1: number[],
22
+ allAttaches2: number[],
23
+ }
24
+
25
+ type Rule = {
26
+ code: number,
27
+ firstMonomer: string,
28
+ secondMonomer: string,
29
+ firstModification: string,
30
+ secondModification: string,
31
+ firstR: number,
32
+ secondR: number
33
+ }
34
+
35
+ function addCommonTags(col: DG.Column): void {
36
+ col.setTag('quality', DG.SEMTYPE.MACROMOLECULE);
37
+ col.setTag('aligned', ALIGNMENT.SEQ);
38
+ col.setTag('alphabet', ALPHABET.PT);
39
+ }
40
+
41
+ class TransformationCommon {
42
+ helmColumn: DG.Column;
43
+
44
+ constructor(helmColumn: DG.Column<string>) {
45
+ this.helmColumn = helmColumn;
46
+ }
47
+
48
+ protected getLinkedPositions(monomers: string[], rules: Rule[]): [number, number][] {
49
+ const monomersNames = monomers.map((m) => { return m.replace('[', '').replace(']', ''); });
50
+ const result: [number, number][] = new Array<[number, number]>(rules.length);
51
+
52
+ for (let i = 0; i < rules.length; i++) {
53
+ let firstFound = false;
54
+ let secondFound = false;
55
+ let firstIsFirst = false;
56
+ let firstEntryIndex = -1;
57
+ let secondEntryIndex = -1;
58
+ const add = `(${rules[i].code})`;
59
+ for (let j = 0; j < monomersNames.length; j++) {
60
+ if (monomersNames[j].includes(add)) {
61
+ if (firstFound) {
62
+ if (firstIsFirst && monomersNames[j] == rules[i].secondMonomer + add) {
63
+ secondFound = true;
64
+ secondEntryIndex = j;
65
+ break;
66
+ } else if (!firstIsFirst && monomersNames[j] == rules[i].firstMonomer + add) {
67
+ secondFound = true;
68
+ secondEntryIndex = j;
69
+ break;
70
+ } else {
71
+ continue;
72
+ }
73
+ //result[i][1] = j;
74
+ // secondFound = true;
75
+ // break;
76
+ } else {
77
+ if (monomersNames[j] == rules[i].firstMonomer + add) {
78
+ firstFound = true;
79
+ firstIsFirst = true;
80
+ firstEntryIndex = j;
81
+ } else if (monomersNames[j] == rules[i].secondMonomer + add) {
82
+ firstFound = true;
83
+ firstIsFirst = false;
84
+ firstEntryIndex = j;
85
+ } else {
86
+ continue;
87
+ }
88
+ //result[i] = [j, 0];
89
+ }
90
+ }
91
+ }
92
+
93
+ if (!(firstFound && secondFound))
94
+ result[i] = [-1, -1];
95
+ else if (firstIsFirst)
96
+ result[i] = [firstEntryIndex, secondEntryIndex];
97
+ else
98
+ result[i] = [secondEntryIndex, firstEntryIndex];
99
+ }
100
+
101
+
102
+ return result;
103
+ }
104
+
105
+ protected getRules(rulesTables: DG.DataFrame[]): Rule[] {
106
+ const ruleCount = rulesTables.map((df) => df.rowCount).reduce((a, b) => a + b);
107
+ const rules: Rule[] = new Array<Rule>(ruleCount);
108
+
109
+ let counter = 0;
110
+ for (let i = 0; i < rulesTables.length; i++) {
111
+ const codeCol = rulesTables[i].columns.byName('code');
112
+ const monomer1Col = rulesTables[i].columns.byName('monomer1');
113
+ const monomer2Col = rulesTables[i].columns.byName('monomer2');
114
+ const modification1Col = rulesTables[i].columns.byName('modification1');
115
+ const modification2Col = rulesTables[i].columns.byName('modification2');
116
+ const r1Col = rulesTables[i].columns.byName('R1');
117
+ const r2Col = rulesTables[i].columns.byName('R2');
118
+
119
+ for (let j = 0; j < rulesTables[i].rowCount; j++, counter++) {
120
+ rules[counter] = {
121
+ code: codeCol.get(j),
122
+ firstMonomer: monomer1Col.get(j),
123
+ secondMonomer: monomer2Col.get(j),
124
+ firstModification: modification1Col.get(j),
125
+ secondModification: modification2Col.get(j),
126
+ firstR: r1Col.get(j),
127
+ secondR: r2Col.get(j),
128
+ };
129
+ }
130
+ }
131
+
132
+ return rules;
133
+ }
134
+
135
+ protected getDimeric(helm: string): [string[], [number, number][]] {
136
+ const seq = helm.replace(HELM_WRAPPER.LEFT, '').replace(HELM_WRAPPER.RIGHT, '');
137
+ const monomers = seq.split('.');
138
+ const duplicates: [number, number][] = [];
139
+
140
+ for (let i = 0; i < monomers.length; i++) {
141
+ if (monomers[i].includes('(#2)')) {
142
+ monomers[i] = monomers[i].replace('(#2)', '');
143
+ const duplicateStart = i + 1;
144
+ let duplicateFinish = 0;
145
+ for (let j = duplicateStart + 1; j < monomers.length; j++) {
146
+ if (monomers[j].includes('}')) {
147
+ duplicateFinish = j; break;
148
+ }
149
+ }
150
+ monomers[duplicateStart] = monomers[duplicateStart].replace('{', '');
151
+ monomers[duplicateFinish] = monomers[duplicateFinish].replace('}', '');
152
+ duplicates.push([duplicateStart, duplicateFinish]);
153
+ }
154
+ }
155
+
156
+ return [monomers, duplicates];
157
+ }
158
+
159
+ protected getAllCycles(rules: Rule[], monomers: string [], positions: [number, number][]) :
160
+ [string [], number [], number [], number [], number []] {
161
+ const allPos1: number [] = [];
162
+ const allPos2: number [] = [];
163
+ const allAttaches1: number [] = [];
164
+ const allAttaches2: number [] = [];
165
+ const ruleCount = rules.length;
166
+
167
+ for (let i = 0; i < ruleCount; i++) {
168
+ if (positions[i][0] == -1)
169
+ continue;
170
+
171
+ const firstMonomer = monomers[positions[i][0]].replace('[', '').replace(']', '');
172
+ const secondMonomer = monomers[positions[i][1]].replace('[', '').replace(']', '');
173
+
174
+ monomers[positions[i][0]] = monomers[positions[i][0]].replace(firstMonomer, rules[i].firstModification);
175
+ monomers[positions[i][1]] = monomers[positions[i][1]].replace(secondMonomer, rules[i].secondModification);
176
+
177
+ allPos1.push(positions[i][0] + 1);
178
+ allPos2.push(positions[i][1] + 1);
179
+ allAttaches1.push(rules[i].firstR);
180
+ allAttaches2.push(rules[i].secondR);
181
+ }
182
+
183
+ return [monomers, allPos1, allPos2, allAttaches1, allAttaches2];
184
+ }
185
+
186
+ protected getHelmCycle(source: ConnectionData, polFirst: number, poSecond: number): string {
187
+ let cycled = '';
188
+
189
+ for (let i = 0; i < source.allPos1.length; i++) {
190
+ if (i == 0)
191
+ cycled += `PEPTIDE${polFirst},PEPTIDE${poSecond},`;
192
+ else
193
+ cycled += `|PEPTIDE${polFirst},PEPTIDE${poSecond},`;
194
+ cycled += `${source.allPos1[i]}:R${source.allAttaches1[i]}-${source.allPos2[i]}:R${source.allAttaches2[i]}`;
195
+ }
196
+ return cycled;
197
+ }
198
+
199
+ //"PEPTIDE1{[(#2)Succ].[{R].F.[Dab(2)].T.G.H.F.G.A.A.Y.P.[E(2)].[NH2}]}$$$$"
200
+ protected getTransformedHelm(helm: string, rules: Rule[]): string {
201
+ const [monomers, duplicates] = this.getDimeric(helm);
202
+ const positions = this.getLinkedPositions(monomers, rules);
203
+ const [monomersCycled, allPos1, allPos2, allAttaches1, allAttaches2] =
204
+ this.getAllCycles(rules, monomers, positions);
205
+
206
+ helm = 'PEPTIDE1{';
207
+ for (let i = 0; i < monomersCycled.length; i++)
208
+ helm += i != monomersCycled.length - 1 ? monomersCycled[i] + '.' : monomersCycled[i];
209
+
210
+ helm += '}';
211
+
212
+ const dimerCodes = new Array<string>(duplicates.length);
213
+ const cycleCodes = new Array<string>(duplicates.length);
214
+ for (let i = 0; i < duplicates.length; i++) {
215
+ let helmAdd = `|PEPTIDE${i + 2}{`;
216
+ const lengthAdd = duplicates[i][1] - duplicates[i][0];
217
+ //const monomersAdd = new Array<string>(lengthAdd);
218
+ const allPosAdd1: number [] = [];
219
+ const allPosAdd2: number [] = [];
220
+ const allAttachesAdd1: number [] = [];
221
+ const allAttachesAdd2: number [] = [];
222
+
223
+ for (let j = 0; j <= lengthAdd; j ++) {
224
+ const index = j + duplicates[i][0];
225
+ helmAdd += j != lengthAdd ? monomersCycled[index] + '.' : monomersCycled[index];
226
+ }
227
+
228
+ helmAdd += '}';
229
+
230
+ for (let j = 0; j < allPos1.length; j++) {
231
+ if (allPos1[j] - 1 >= duplicates[i][0] && allPos1[j] - 1 <= duplicates[i][1]) {
232
+ allPosAdd1.push(allPos1[j] - duplicates[i][0]);
233
+ allPosAdd2.push(allPos2[j] - duplicates[i][0]);
234
+ allAttachesAdd1.push(allAttaches1[j]);
235
+ allAttachesAdd2.push(allAttaches1[j]);
236
+ }
237
+ }
238
+
239
+ const addCyclysation = this.getHelmCycle({
240
+ allPos1: allPosAdd1,
241
+ allPos2: allPosAdd2,
242
+ allAttaches1: allAttachesAdd1,
243
+ allAttaches2: allAttachesAdd2}, i + 2, i + 2);
244
+
245
+ dimerCodes[i] = helmAdd;
246
+ cycleCodes[i] = this.getHelmCycle({
247
+ allPos1: [duplicates[i][0]],
248
+ allPos2: [1],
249
+ allAttaches1: [1],
250
+ allAttaches2: [1]}, 1, i + 2);
251
+ cycleCodes.push(addCyclysation);
252
+ }
253
+
254
+ for (let i = 0; i < dimerCodes.length; i++)
255
+ helm += dimerCodes[i];
256
+
257
+ helm += '$';
258
+ const mainCyclysation = this.getHelmCycle({allPos1, allPos2, allAttaches1, allAttaches2}, 1, 1);
259
+ helm += mainCyclysation;
260
+ for (let i = 0; i < cycleCodes.length; i++) {
261
+ helm += '|';
262
+ helm += cycleCodes[i];
263
+ }
264
+ helm += '$$$';
265
+ return helm;
266
+ }
267
+
268
+ transform(rulesTables: DG.DataFrame[]): string[] {
269
+ const rules = this.getRules(rulesTables);
270
+ const resultList = this.helmColumn.toList().map((helm: string) => {
271
+ return this.getTransformedHelm(helm, rules);
272
+ });
273
+ return resultList;
274
+ }
275
+ }
276
+
277
+ class PolymerTransformation {
278
+ private constructor() {}
279
+
280
+ static getInstance(molColumn: DG.Column<string>) {
281
+ return new TransformationCommon(molColumn);
282
+ }
283
+ }
284
+
285
+ export async function addTransformedColumn(
286
+ molColumn: DG.Column<string>, addHelm: boolean, ruleFiles: string[], chiralityEngine?: boolean
287
+ ): Promise<void> {
288
+ const df = molColumn.dataFrame;
289
+ const sh = SeqHandler.forColumn(molColumn);
290
+ const sourceHelmCol = sh.convert(NOTATION.HELM);
291
+ const pt = PolymerTransformation.getInstance(sourceHelmCol);
292
+ const fileSource = new DG.FileSource(RULES_PATH);
293
+
294
+ const rulesRawFrames: DG.DataFrame[] = new Array<DG.DataFrame>(ruleFiles.length);
295
+
296
+ for (let i = 0; i < ruleFiles.length; i++) {
297
+ const rulesRaw = await fileSource.readAsText(ruleFiles[i].replace(RULES_PATH, ''));
298
+ rulesRawFrames[i] = DG.DataFrame.fromCsv(rulesRaw);
299
+ }
300
+
301
+ const targetList = pt.transform(rulesRawFrames);
302
+ const helmColName = df.columns.getUnusedName('transformed(' + molColumn.name + ')');
303
+ const targetHelmCol = DG.Column.fromList('string', helmColName, targetList);
304
+
305
+ addCommonTags(targetHelmCol);
306
+ targetHelmCol.setTag('units', NOTATION.HELM);
307
+
308
+ //const molCol = await getMolColumnFromHelm(df, targetHelmCol, chiralityEngine);
309
+ const molCol = await grok.functions.call('Bio:getMolFromHelm', {
310
+ 'df': df,
311
+ 'helmCol': targetHelmCol,
312
+ 'chiralityEngine': chiralityEngine
313
+ });
314
+
315
+
316
+ molCol.name = df.columns.getUnusedName('molfile(' + molColumn.name + ')');
317
+ molCol.semType = DG.SEMTYPE.MOLECULE;
318
+
319
+ if (addHelm) {
320
+ targetHelmCol.setTag('cell.renderer', 'helm');
321
+ //targetHelmCol.semType = DG.SEMTYPE.MACROMOLECULE;
322
+ df.columns.add(targetHelmCol);
323
+ }
324
+ df.columns.add(molCol, true);
325
+ await grok.data.detectSemanticTypes(df);
326
+ }
@@ -0,0 +1,59 @@
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
+ }
@@ -0,0 +1,20 @@
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
+
@@ -5,20 +5,20 @@ export const formatsToHelm: {[key: string]: Dict} = {
5
5
  'UfAfsCfsGfuacg': 'RNA1{[fR](U)p.[fR](A)[sp].[fR](C)[sp].[fR](G)p.[25r](U)p.[25r](A)p.[25r](C)p.[25r](G)}$$$$'
6
6
  },
7
7
  'BioSpring': {
8
- 'AT*GC*123456789': 'RNA1{r(A)p.r(T)[sp].r(G)p.r(C)[sp].[fR](U)p.[fR](A)p.[fR](C)p.[fR](G)p.[25r](U)p.[25r](A)p.[25r](C)p.[25r](G)p.d([m5C])}$$$$'
8
+ 'A*GC*123456789': 'RNA1{r(A)[sp].r(G)p.r(C)[sp].[fR](U)p.[fR](A)p.[fR](C)p.[fR](G)p.[25r](U)p.[25r](A)p.[25r](C)p.[25r](G)p.d([m5C])}$$$$'
9
9
  },
10
10
  'Mermade12': {
11
11
  'hefglijkLIJKHEFG': 'RNA1{[25r](U)[sp].[25r](A)[sp].[25r](C)[sp].[25r](G)[sp].[fR](U)[sp].[fR](A)[sp].[fR](C)[sp].[fR](G)[sp].[fR](U)p.[fR](A)p.[fR](C)p.[fR](G)p.[25r](U)p.[25r](A)p.[25r](C)p.[25r](G)}$$$$'
12
12
  }
13
- }
13
+ };
14
14
 
15
15
  export const helmToNucleotides: Dict = {
16
16
  'RNA1{[fR](U)p.[fR](A)[sp].[fR](C)[sp].[fR](G)p.[25r](U)p.[25r](A)p.[25r](C)p.[25r](G)}$$$$': 'UACGUACG',
17
17
 
18
- 'RNA1{r(A)p.r(T)[sp].r(G)p.r(C)[sp].[fR](U)p.[fR](A)p.[fR](C)p.[fR](G)p.[25r](U)p.[25r](A)p.[25r](C)p.[25r](G)p.d([m5C])}$$$$': 'ATGCUACGUACGC',
18
+ 'RNA1{r(A)[sp].r(G)p.r(C)[sp].[fR](U)p.[fR](A)p.[fR](C)p.[fR](G)p.[25r](U)p.[25r](A)p.[25r](C)p.[25r](G)p.d([m5C])}$$$$': 'AGCUACGUACGC',
19
19
 
20
20
  'RNA1{[25r](U)[sp].[25r](A)[sp].[25r](C)[sp].[25r](G)[sp].[fR](U)[sp].[fR](A)[sp].[fR](C)[sp].[fR](G)[sp].[fR](U)p.[fR](A)p.[fR](C)p.[fR](G)p.[25r](U)p.[25r](A)p.[25r](C)p.[25r](G)}$$$$': 'UACGUACGUACGUACG'
21
- }
21
+ };
22
22
 
23
23
  export const helmToMolfile: Dict = {
24
- }
24
+ };
@@ -4,11 +4,11 @@ import * as ui from 'datagrok-api/ui';
4
4
  import * as DG from 'datagrok-api/dg';
5
5
 
6
6
  import {before, category, expect, test} from '@datagrok-libraries/utils/src/test';
7
- import {DEFAULT_FORMATS} from '../model/const';
8
- import {getJsonData} from '../model/data-loading-utils/json-loader';
7
+ import {DEFAULT_FORMATS} from '../apps/common/model/const';
8
+ import {loadJsonData} from '../apps/common/model/data-loader/json-loader';
9
9
  import {formatsToHelm} from './const';
10
- import {SequenceValidator} from '../model/parsing-validation/sequence-validator';
11
- import {getTranslatedSequences} from '../model/translator-app/conversion-utils';
10
+ import {SequenceValidator} from '../apps/common/model/parsing-validation/sequence-validator';
11
+ import {getTranslatedSequences} from '../apps/translator/model/conversion-utils';
12
12
  import {_package} from '../package';
13
13
 
14
14
  function getTranslationObject(sequence: string, format: string): {[format: string]: string} {
@@ -19,11 +19,11 @@ function getTranslationObject(sequence: string, format: string): {[format: strin
19
19
  const inputs = {
20
20
  [DEFAULT_FORMATS.AXOLABS]: 'Afcgacsu',
21
21
  [DEFAULT_FORMATS.HELM]: 'RNA1{[fR](A)p.[25r](C)p.[25r](G)p.[25r](A)p.[25r](C)[sp].[25r](U)}$$$$'
22
- }
22
+ };
23
23
 
24
24
  category('Formats support', () => {
25
25
  before(async () => {
26
- await getJsonData();
26
+ await loadJsonData();
27
27
  await _package.initMonomerLib();
28
28
  });
29
29
 
@@ -4,9 +4,9 @@ import * as ui from 'datagrok-api/ui';
4
4
  import * as DG from 'datagrok-api/dg';
5
5
 
6
6
  import {before, category, expect, test} from '@datagrok-libraries/utils/src/test';
7
- import {DEFAULT_FORMATS} from '../model/const';
8
- import {FormatConverter} from '../model/translator-app/format-converter';
9
- import {getJsonData} from '../model/data-loading-utils/json-loader';
7
+ import {DEFAULT_FORMATS} from '../apps/common/model/const';
8
+ import {FormatConverter} from '../apps/translator/model/format-converter';
9
+ import {loadJsonData} from '../apps/common/model/data-loader/json-loader';
10
10
  import {formatsToHelm} from './const';
11
11
  import {_package} from '../package';
12
12
 
@@ -20,7 +20,7 @@ function getFromat(helm: string, format: string): string {
20
20
 
21
21
  category('Formats to HELM', () => {
22
22
  before(async () => {
23
- await getJsonData();
23
+ await loadJsonData();
24
24
  await _package.initMonomerLib();
25
25
  });
26
26
 
@@ -37,7 +37,7 @@ category('Formats to HELM', () => {
37
37
 
38
38
  category('HELM to Formats', () => {
39
39
  before(async () => {
40
- await getJsonData();
40
+ await loadJsonData();
41
41
  await _package.initMonomerLib();
42
42
  });
43
43
 
@@ -4,15 +4,15 @@ import * as ui from 'datagrok-api/ui';
4
4
  import * as DG from 'datagrok-api/dg';
5
5
 
6
6
  import {before, category, expect, test} from '@datagrok-libraries/utils/src/test';
7
- import {getNucleotidesSequence} from '../model/translator-app/conversion-utils';
8
- import {getJsonData} from '../model/data-loading-utils/json-loader';
7
+ import {getNucleotidesSequence} from '../apps/translator/model/conversion-utils';
8
+ import {loadJsonData} from '../apps/common/model/data-loader/json-loader';
9
9
  import {helmToNucleotides} from './const';
10
10
  import {_package} from '../package';
11
- import {MonomerLibWrapper} from '../model/monomer-lib/lib-wrapper';
11
+ import {MonomerLibWrapper} from '../apps/common/model/monomer-lib/lib-wrapper';
12
12
 
13
13
  category('HELM to Nucleotides', () => {
14
14
  before(async () => {
15
- await getJsonData();
15
+ await loadJsonData();
16
16
  await _package.initMonomerLib();
17
17
  });
18
18
 
@@ -22,5 +22,5 @@ category('HELM to Nucleotides', () => {
22
22
  const result = getNucleotidesSequence(helm, MonomerLibWrapper.getInstance());
23
23
  expect(result, expected);
24
24
  });
25
- })
25
+ });
26
26
  });
package/tsconfig.json CHANGED
@@ -4,15 +4,9 @@
4
4
 
5
5
  /* Basic Options */
6
6
  // "incremental": true, /* Enable incremental compilation */
7
- "target": "es2022",
8
- /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */
9
- "module": "es2022",
10
- /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */
11
- "lib": [
12
- "ES2022",
13
- "dom"
14
- ],
15
- /* Specify library files to be included in the compilation. */
7
+ "target": "es2020", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */
8
+ "module": "es2020", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */
9
+ "lib": ["ES2022", "ES2022.String", "dom"], /* Specify library files to be included in the compilation. */
16
10
  // "allowJs": true, /* Allow javascript files to be compiled. */
17
11
  // "checkJs": true, /* Report errors in .js files. */
18
12
  // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', 'react', 'react-jsx' or 'react-jsxdev'. */
@@ -71,7 +65,7 @@
71
65
  // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
72
66
 
73
67
  /* Advanced Options */
74
- "skipLibCheck": true, /* Skip type checking of declaration files. */
68
+ "skipLibCheck": false, /* Skip type checking of declaration files. */
75
69
  "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */
76
70
  }
77
71
  }
package/webpack.config.js CHANGED
@@ -2,6 +2,9 @@ const path = require('path');
2
2
  const packageName = path.parse(require('./package.json').name).name.toLowerCase().replace(/-/g, '');
3
3
 
4
4
  module.exports = {
5
+ cache: {
6
+ type: 'filesystem',
7
+ },
5
8
  mode: 'development',
6
9
  entry: {
7
10
  package: ['./src/package.ts'],
@@ -1,97 +0,0 @@
1
- {
2
- "RNA": {
3
- "fullName": "RNA nucleotides",
4
- "symbols": ["A", "C", "G", "U"],
5
- "color": "rgb(255,230,153)"
6
- },
7
- "DNA": {
8
- "fullName": "DNA nucleotides",
9
- "symbols": ["dA", "dC", "dG", "dT"],
10
- "color": "rgb(66, 120, 245)"
11
- },
12
- "2'-Fluoro": {
13
- "fullName": "2'-Fluoro nucleotides",
14
- "symbols": ["Af", "Cf", "Gf", "Uf"],
15
- "color": "rgb(95, 212, 245)"
16
- },
17
- "2'-O-Methyl": {
18
- "fullName": "2'-O-Methyl nucleotides",
19
- "symbols": ["a", "c", "g", "u"],
20
- "color": "rgb(150, 95, 245)"
21
- },
22
- "2'-O-MOE": {
23
- "fullName": "2'-O-MOE nucleotides (including 5-Methyl C)",
24
- "symbols": ["Am", "Cm", "Gm", "Tm"],
25
- "color": "rgb(129, 199, 130)"
26
- },
27
- "GNA": {
28
- "fullName": "Glycol nucleic acid",
29
- "symbols": ["(GNA-A)", "(GNA-C)", "(GNA-G)", "(GNA-T)"],
30
- "color": "rgb(199, 169, 129)"
31
- },
32
- "LNA": {
33
- "fullName": "Locked nucleic acid (including 5-Methyl C)",
34
- "symbols": ["Ab", "Cb", "Gb", "Tb"],
35
- "color": "rgb(250, 185, 182)"
36
- },
37
- "UNA": {
38
- "fullName": "Unlocked nucleotides",
39
- "symbols": ["Ao", "Co", "Go", "Uo"],
40
- "color": "rgb(237, 104, 184)"
41
- },
42
- "A": {
43
- "fullName": "Adenosine",
44
- "symbols": ["a"],
45
- "color": "rgb(255,230,153)"
46
- },
47
- "C": {
48
- "fullName": "Cytidine",
49
- "symbols": ["c"],
50
- "color": "rgb(255,230,153)"
51
- },
52
- "G": {
53
- "fullName": "Guanosine",
54
- "symbols": ["g"],
55
- "color": "rgb(255,230,153)"
56
- },
57
- "U": {
58
- "fullName": "Uridine",
59
- "symbols": ["u"],
60
- "color": "rgb(255,230,153)"
61
- },
62
- "X-New": {
63
- "fullName": "",
64
- "symbols": ["X"],
65
- "color": "rgb(196, 91, 252)"
66
- },
67
- "Y-New": {
68
- "fullName": "",
69
- "symbols": ["Y"],
70
- "color": "rgb(150, 177, 255)"
71
- },
72
- "Z-New": {
73
- "fullName": "",
74
- "symbols": ["Z"],
75
- "color": "rgb(11, 222, 71)"
76
- },
77
- "invAb": {
78
- "fullName": "Inverted abasic capped",
79
- "symbols": ["(invAb)"],
80
- "color": "rgb(243, 153, 247)"
81
- },
82
- "5'-vinylps": {
83
- "fullName": "5'-vinylphosphonate-2'-OMe-uridine",
84
- "symbols": ["(vinu)"],
85
- "color": "rgb(99, 3, 40)"
86
- },
87
- "invAb(o)": {
88
- "fullName": "Inverted abasic capped (overhang)",
89
- "symbols": ["(invAb)"],
90
- "color": "rgb(240, 224, 108)"
91
- },
92
- "2'-OMe-U(o)": {
93
- "fullName": "Nucleotide Uridine with 2'O-Methyl protection (overhang)",
94
- "symbols": ["mU"],
95
- "color": "rgb(190, 237, 123)"
96
- }
97
- }