@datagrok/sequence-translator 1.0.16 → 1.1.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.
Files changed (92) hide show
  1. package/.eslintrc.json +4 -3
  2. package/CHANGELOG.md +3 -0
  3. package/detectors.js +8 -28
  4. package/dist/package-test.js +2 -72987
  5. package/dist/package-test.js.map +1 -0
  6. package/dist/package.js +2 -72192
  7. package/dist/package.js.map +1 -0
  8. package/files/axolabs-style.json +97 -0
  9. package/files/codes-to-symbols.json +66 -0
  10. package/files/formats-to-helm.json +59 -0
  11. package/files/linkers.json +22 -0
  12. package/files/monomer-lib.json +1094 -0
  13. package/link-bio +7 -0
  14. package/package.json +30 -26
  15. package/scripts/build-monomer-lib.py +391 -122
  16. package/src/demo/demo-st-ui.ts +71 -0
  17. package/src/demo/handle-error.ts +12 -0
  18. package/src/model/axolabs/axolabs-tab.ts +111 -0
  19. package/src/model/axolabs/const.ts +33 -0
  20. package/src/{axolabs → model/axolabs}/draw-svg.ts +1 -1
  21. package/src/{axolabs → model/axolabs}/helpers.ts +7 -5
  22. package/src/model/const.ts +19 -0
  23. package/src/model/data-loading-utils/const.ts +8 -0
  24. package/src/model/data-loading-utils/json-loader.ts +38 -0
  25. package/src/model/data-loading-utils/types.ts +30 -0
  26. package/src/model/format-translation/const.ts +8 -0
  27. package/src/model/format-translation/conversion-utils.ts +48 -0
  28. package/src/model/format-translation/format-converter.ts +107 -0
  29. package/src/model/helpers.ts +12 -0
  30. package/src/model/monomer-lib/const.ts +3 -0
  31. package/src/model/monomer-lib/lib-wrapper.ts +106 -0
  32. package/src/model/parsing-validation/format-detector.ts +57 -0
  33. package/src/model/parsing-validation/sequence-validator.ts +52 -0
  34. package/src/model/sequence-to-structure-utils/const.ts +1 -0
  35. package/src/{structures-works → model/sequence-to-structure-utils}/mol-transformations.ts +61 -87
  36. package/src/model/sequence-to-structure-utils/monomer-code-parser.ts +92 -0
  37. package/src/model/sequence-to-structure-utils/sdf-tab.ts +94 -0
  38. package/src/model/sequence-to-structure-utils/sequence-to-molfile.ts +409 -0
  39. package/src/package.ts +106 -77
  40. package/src/tests/const.ts +17 -0
  41. package/src/tests/smiles-tests.ts +32 -457
  42. package/src/view/const/main-tab.ts +3 -0
  43. package/src/view/const/view.ts +10 -0
  44. package/src/view/css/axolabs-tab.css +1 -0
  45. package/src/view/css/colored-text-input.css +27 -0
  46. package/src/view/css/main-tab.css +46 -0
  47. package/src/view/css/sdf-tab.css +39 -0
  48. package/src/view/monomer-lib-viewer/viewer.ts +22 -0
  49. package/src/view/tabs/axolabs.ts +720 -0
  50. package/src/view/tabs/main.ts +174 -0
  51. package/src/view/tabs/sdf.ts +173 -0
  52. package/src/view/utils/app-info-dialog.ts +18 -0
  53. package/src/view/utils/colored-input/colored-text-input.ts +56 -0
  54. package/src/view/utils/colored-input/input-painters.ts +44 -0
  55. package/src/view/utils/draw-molecule.ts +86 -0
  56. package/src/view/utils/molecule-img.ts +106 -0
  57. package/src/view/view.ts +129 -0
  58. package/tsconfig.json +12 -18
  59. package/webpack.config.js +17 -4
  60. package/README.md +0 -84
  61. package/css/style.css +0 -18
  62. package/img/Sequence Translator Axolabs.png +0 -0
  63. package/jest.config.js +0 -33
  64. package/setup-unlink-clean.cmd +0 -14
  65. package/setup.cmd +0 -14
  66. package/setup.sh +0 -37
  67. package/src/__jest__/remote.test.ts +0 -77
  68. package/src/__jest__/test-node.ts +0 -97
  69. package/src/apps/oligo-sd-file-app.ts +0 -58
  70. package/src/autostart/ICDs.ts +0 -3
  71. package/src/autostart/IDPs.ts +0 -3
  72. package/src/autostart/calculations.ts +0 -40
  73. package/src/autostart/constants.ts +0 -37
  74. package/src/autostart/registration.ts +0 -241
  75. package/src/autostart/salts.ts +0 -2
  76. package/src/autostart/sources.ts +0 -3
  77. package/src/autostart/users.ts +0 -3
  78. package/src/axolabs/constants.ts +0 -101
  79. package/src/axolabs/define-pattern.ts +0 -873
  80. package/src/helpers.ts +0 -28
  81. package/src/main/main-view.ts +0 -262
  82. package/src/structures-works/const.ts +0 -5
  83. package/src/structures-works/converters.ts +0 -323
  84. package/src/structures-works/from-monomers.ts +0 -267
  85. package/src/structures-works/map.ts +0 -720
  86. package/src/structures-works/save-sense-antisense.ts +0 -91
  87. package/src/structures-works/sequence-codes-tools.ts +0 -344
  88. package/src/utils/parse.ts +0 -27
  89. package/src/utils/sdf-add-columns.ts +0 -118
  90. package/src/utils/sdf-save-table.ts +0 -56
  91. package/test-SequenceTranslator-6288c2fbe346-cce4ac1d.html +0 -259
  92. package/vendors/openchemlib-full.js +0 -293
@@ -1,267 +0,0 @@
1
- // import {map, SYNTHESIZERS, TECHNOLOGIES, MODIFICATIONS, DELIMITER} from './map';
2
- import {map, SYNTHESIZERS, TECHNOLOGIES, DELIMITER} from './map';
3
- import {isValidSequence} from './sequence-codes-tools';
4
- import {sortByStringLengthInDescendingOrder} from '../helpers';
5
- import {getMonomerWorks} from '../package';
6
- import {getNucleotidesMol} from './mol-transformations';
7
-
8
- import {standardPhosphateLinkSmiles, MODIFICATIONS} from './const';
9
- import {getMonomerLib} from '../package';
10
- // todo: remove
11
- // const NAME = 'name';
12
- const CODES = 'codes';
13
- // const SMILES = 'smiles';
14
- const MOL = 'molfile';
15
-
16
- export function sequenceToMolV3000(
17
- sequence: string, inverted: boolean = false, oclRender: boolean = false,
18
- format: string,
19
- ): string {
20
- const monomerNameFromCode = getCodeToNameMap(sequence, format);
21
- let codes = sortByStringLengthInDescendingOrder(Object.keys(monomerNameFromCode));
22
- let i = 0;
23
- const codesList = [];
24
- const links = ['s', 'ps', '*'];
25
- const includesStandardLinkAlready = ['e', 'h', /*'g',*/ 'f', 'i', 'l', 'k', 'j'];
26
- const dropdowns = Object.keys(MODIFICATIONS);
27
- codes = codes.concat(dropdowns).concat(DELIMITER);
28
- while (i < sequence.length) {
29
- const code = codes.find((s: string) => s === sequence.slice(i, i + s.length))!;
30
- i += code.length;
31
- inverted ? codesList.unshift(code) : codesList.push(code);
32
- }
33
-
34
- const monomers: string[] = [];
35
-
36
- for (let i = 0; i < codesList.length; i++) {
37
- if (links.includes(codesList[i]) ||
38
- includesStandardLinkAlready.includes(codesList[i]) ||
39
- (i < codesList.length - 1 && links.includes(codesList[i + 1]))
40
- ) {
41
- let aa = monomerNameFromCode[codesList[i]];
42
- if(aa !== undefined)
43
- monomers.push(aa);
44
- else
45
- monomers.push(codesList[i]);
46
- }
47
- else {
48
- let aa = monomerNameFromCode[codesList[i]];
49
- if(aa !== undefined)
50
- monomers.push(aa);
51
- else
52
- monomers.push(codesList[i]);
53
- monomers.push('p linkage');
54
- }
55
- }
56
-
57
- const lib = getMonomerLib();
58
- const mols: string [] = [];
59
- for(let i = 0; i < monomers.length; i++) {
60
- const mnmr = lib?.getMonomer('RNA', monomers[i]);
61
- mols.push(mnmr?.molfile!);
62
- }
63
-
64
-
65
- return getNucleotidesMol(mols);
66
- //return getMonomerWorks()?.getAtomicLevel(monomers, 'RNA')!;
67
- }
68
-
69
- export function sequenceToMolV3000_new(
70
- sequence: string, inverted: boolean = false, oclRender: boolean = false,
71
- format: string,
72
- ): string {
73
- const monomerNameFromCode = getCodeToNameMap(sequence, format);
74
- let codes = sortByStringLengthInDescendingOrder(Object.keys(monomerNameFromCode));
75
- let i = 0;
76
- const codesList = [];
77
- const links = ['s', 'ps', '*'];
78
- const includesStandardLinkAlready = ['e', 'h', /*'g',*/ 'f', 'i', 'l', 'k', 'j'];
79
- const dropdowns = Object.keys(MODIFICATIONS);
80
- codes = codes.concat(dropdowns).concat(DELIMITER);
81
- while (i < sequence.length) {
82
- const code = codes.find((s: string) => s === sequence.slice(i, i + s.length))!;
83
- i += code.length;
84
- inverted ? codesList.unshift(code) : codesList.push(code);
85
- }
86
-
87
- const monomers: string[] = [];
88
-
89
- for (let i = 0; i < codesList.length; i++) {
90
- if (links.includes(codesList[i]) ||
91
- includesStandardLinkAlready.includes(codesList[i]) ||
92
- (i < codesList.length - 1 && links.includes(codesList[i + 1]))
93
- )
94
- monomers.push(monomerNameFromCode[codesList[i]]);
95
- else {
96
- monomers.push(monomerNameFromCode[codesList[i]]);
97
- monomers.push('p linkage');
98
- }
99
- }
100
-
101
- return getMonomerWorks()?.getAtomicLevel(monomers, 'RNA')!;
102
- }
103
-
104
- export function sequenceToSmiles(sequence: string, inverted: boolean = false, format: string): string {
105
- const obj = getObjectWithCodesAndSmiles(sequence, format);
106
- let codes = sortByStringLengthInDescendingOrder(Object.keys(obj));
107
- let i = 0;
108
- let smiles = '';
109
- const codesList = [];
110
- const links = ['s', 'ps', '*'];
111
- const includesStandardLinkAlready = ['e', 'h', /*'g',*/ 'f', 'i', 'l', 'k', 'j'];
112
- const dropdowns = Object.keys(MODIFICATIONS);
113
- codes = codes.concat(dropdowns).concat(DELIMITER);
114
- while (i < sequence.length) {
115
- const code = codes.find((s: string) => s == sequence.slice(i, i + s.length))!;
116
- i += code.length;
117
- inverted ? codesList.unshift(code) : codesList.push(code);
118
- }
119
- for (let i = 0; i < codesList.length; i++) {
120
- if (dropdowns.includes(codesList[i])) {
121
- smiles += (i >= codesList.length / 2) ?
122
- MODIFICATIONS[codesList[i]].right + standardPhosphateLinkSmiles :
123
- MODIFICATIONS[codesList[i]].left + standardPhosphateLinkSmiles;
124
- } else {
125
- if (links.includes(codesList[i]) ||
126
- includesStandardLinkAlready.includes(codesList[i]) ||
127
- (i < codesList.length - 1 && links.includes(codesList[i + 1]))
128
- )
129
- smiles += obj[codesList[i]];
130
- else
131
- smiles += obj[codesList[i]] + standardPhosphateLinkSmiles;
132
- }
133
- }
134
- smiles = smiles.replace(/OO/g, 'O');
135
- return (
136
- (
137
- links.includes(codesList[codesList.length - 1]) &&
138
- codesList.length > 1 &&
139
- !includesStandardLinkAlready.includes(codesList[codesList.length - 2])
140
- ) ||
141
- dropdowns.includes(codesList[codesList.length - 1]) ||
142
- includesStandardLinkAlready.includes(codesList[codesList.length - 1])
143
- ) ?
144
- smiles :
145
- smiles.slice(0, smiles.length - standardPhosphateLinkSmiles.length + 1);
146
- }
147
-
148
- function getCodeToNameMap(sequence: string, format: string) {
149
- const obj: { [code: string]: string } = {};
150
- const NAME = 'name';
151
- if (format == null) {
152
- for (const synthesizer of Object.keys(map)) {
153
- for (const technology of Object.keys(map[synthesizer])) {
154
- for (const code of Object.keys(map[synthesizer][technology]))
155
- obj[code] = map[synthesizer][technology][code][NAME]!;
156
- }
157
- }
158
- } else {
159
- for (const technology of Object.keys(map[format])) {
160
- for (const code of Object.keys(map[format][technology]))
161
- obj[code] = map[format][technology][code][NAME]!;
162
- // obj[code] = map[format][technology][code].SMILES;
163
- }
164
- }
165
- obj[DELIMITER] = '';
166
- // TODO: create object based from synthesizer type to avoid key(codes) duplicates
167
- const output = isValidSequence(sequence, format);
168
- if (output.synthesizer!.includes(SYNTHESIZERS.MERMADE_12))
169
- obj['g'] = map[SYNTHESIZERS.MERMADE_12][TECHNOLOGIES.SI_RNA]['g'][NAME]!;
170
- else if (output.synthesizer!.includes(SYNTHESIZERS.AXOLABS))
171
- obj['g'] = map[SYNTHESIZERS.AXOLABS][TECHNOLOGIES.SI_RNA]['g'][NAME]!;
172
- return obj;
173
- }
174
-
175
- function getObjectWithCodesAndSmiles(sequence: string, format: string) {
176
- const obj: { [code: string]: string } = {};
177
- if (format == null) {
178
- for (const synthesizer of Object.keys(map)) {
179
- for (const technology of Object.keys(map[synthesizer])) {
180
- for (const code of Object.keys(map[synthesizer][technology]))
181
- obj[code] = map[synthesizer][technology][code].SMILES;
182
- }
183
- }
184
- } else {
185
- for (const technology of Object.keys(map[format])) {
186
- for (const code of Object.keys(map[format][technology]))
187
- obj[code] = map[format][technology][code].SMILES;
188
- }
189
- }
190
- obj[DELIMITER] = '';
191
- // TODO: create object based from synthesizer type to avoid key(codes) duplicates
192
- const output = isValidSequence(sequence, format);
193
- if (output.synthesizer!.includes(SYNTHESIZERS.MERMADE_12))
194
- obj['g'] = map[SYNTHESIZERS.MERMADE_12][TECHNOLOGIES.SI_RNA]['g'].SMILES;
195
- else if (output.synthesizer!.includes(SYNTHESIZERS.AXOLABS))
196
- obj['g'] = map[SYNTHESIZERS.AXOLABS][TECHNOLOGIES.SI_RNA]['g'].SMILES;
197
- return obj;
198
- }
199
-
200
- function getObjectWithCodesAndMolsFromFile(sequence: string, format: string, libFileContent: string) {
201
- const obj: { [code: string]: string } = {};
202
- // todo: type
203
- const lib: any[] = JSON.parse(libFileContent); //consider using library
204
-
205
- for (const item of lib) {
206
- for (const synthesizer of Object.keys(item[CODES])) {
207
- if (synthesizer === format) {
208
- for (const technology of Object.keys(item[CODES][synthesizer])) {
209
- const codes = item[CODES][synthesizer][technology];
210
- let mol: string = item[MOL];
211
- // todo: find another solution
212
- mol = mol.replace(/ R /g, ' O ');
213
-
214
- for (const code of codes)
215
- obj[code] = mol;
216
- }
217
- }
218
- }
219
- }
220
-
221
- obj[DELIMITER] = '';
222
- // TODO: create object based on synthesizer type to avoid key(codes) duplicates
223
- const output = isValidSequence(sequence, format);
224
- if (output.synthesizer!.includes(SYNTHESIZERS.MERMADE_12)) {
225
- // todo: remove as quickfix, optimize access to 'g'
226
- for (const item of lib) {
227
- for (const synthesizer of Object.keys(item[CODES])) {
228
- for (const technology of Object.keys(item[CODES][synthesizer])) {
229
- const codes = item[CODES][synthesizer][technology];
230
- for (const code of codes) {
231
- const condition =
232
- (code === 'g') &&
233
- (synthesizer === SYNTHESIZERS.MERMADE_12) &&
234
- (technology === TECHNOLOGIES.SI_RNA);
235
- if (condition) {
236
- let mol: string = item[MOL];
237
- // todo: find another solution
238
- mol = mol.replace(/ R /g, ' O ');
239
- obj[code] = mol;
240
- }
241
- }
242
- }
243
- }
244
- }
245
- } else if (output.synthesizer!.includes(SYNTHESIZERS.AXOLABS)) {
246
- for (const item of lib) {
247
- for (const synthesizer of Object.keys(item[CODES])) {
248
- for (const technology of Object.keys(item[CODES][synthesizer])) {
249
- const codes = item[CODES][synthesizer][technology];
250
- for (const code of codes) {
251
- const condition =
252
- (code === 'g') &&
253
- (synthesizer === SYNTHESIZERS.AXOLABS) &&
254
- (technology === TECHNOLOGIES.SI_RNA);
255
- if (condition) {
256
- let mol: string = item[MOL];
257
- // todo: find another solution
258
- mol = mol.replace(/ R /g, ' O ');
259
- obj[code] = mol;
260
- }
261
- }
262
- }
263
- }
264
- }
265
- }
266
- return obj;
267
- }