@datagrok/bio 2.24.0 → 2.25.1

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 (35) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/detectors.js +26 -12
  3. package/dist/455.js.map +1 -1
  4. package/dist/package-test.js +2 -2
  5. package/dist/package-test.js.map +1 -1
  6. package/dist/package.js +2 -2
  7. package/dist/package.js.map +1 -1
  8. package/files/samples/HELM_CHEMS.csv +11 -0
  9. package/package.json +2 -2
  10. package/src/analysis/sequence-space.ts +1 -1
  11. package/src/demo/bio03-atomic-level.ts +1 -1
  12. package/src/package-types.ts +1 -1
  13. package/src/package.ts +1 -1
  14. package/src/tests/monomer-libraries-tests.ts +1 -1
  15. package/src/utils/get-region.ts +2 -2
  16. package/src/utils/helm-to-molfile/converter/const.ts +0 -1
  17. package/src/utils/helm-to-molfile/converter/converter.ts +3 -3
  18. package/src/utils/helm-to-molfile/converter/helm.ts +14 -6
  19. package/src/utils/helm-to-molfile/converter/mol-bonds.ts +1 -1
  20. package/src/utils/helm-to-molfile/converter/mol-wrapper.ts +2 -2
  21. package/src/utils/helm-to-molfile/converter/r-group-handler.ts +2 -2
  22. package/src/utils/monomer-lib/library-file-manager/file-validator.ts +1 -1
  23. package/src/utils/monomer-lib/library-file-manager/ui.ts +22 -5
  24. package/src/utils/monomer-lib/monomer-lib-base.ts +31 -3
  25. package/src/utils/monomer-lib/monomer-lib.ts +0 -26
  26. package/src/utils/monomer-lib/monomer-manager/monomer-manager.ts +1 -1
  27. package/src/utils/monomer-lib/smiles2Monomer.ts +128 -0
  28. package/src/utils/monomer-lib/web-editor-monomer-dummy.ts +15 -1
  29. package/src/utils/multiple-sequence-alignment-ui.ts +1 -1
  30. package/src/utils/multiple-sequence-alignment.ts +1 -1
  31. package/src/utils/seq-helper/seq-handler.ts +25 -16
  32. package/src/utils/ui-utils.ts +1 -1
  33. package/src/viewers/web-logo-viewer.ts +19 -8
  34. package/test-console-output-1.log +784 -775
  35. package/test-record-1.mp4 +0 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # Bio changelog
2
2
 
3
+ ## 2.25.1 (2025-10-30)
4
+
5
+ * Rework User lib settings storage to accomodate shortened duplicate preferences
6
+ * Detectors: Improve BILN with SMILES/CHEMS detection
7
+ * Support BILN with SMILES/CHEMS rendering, conversion and Helm converter
8
+ * Monomer libraries: Fix dialogs for adding/removing libraries
9
+
10
+ ## 2.25.0 (2025-10-29)
11
+
12
+ * CHEMS and SMILES support in HELM
13
+
3
14
  ## 2.24.0 (2025-10-28)
4
15
 
5
16
  * Monomer library management rework: Transition to library providers, instead of single file based monomer libraries. Support multiple library providers.
package/detectors.js CHANGED
@@ -90,7 +90,7 @@ class BioPackageDetectors extends DG.Package {
90
90
  }
91
91
 
92
92
  /** Parts of the column name required in the column's name under the detector. It must be in lowercase. */
93
- likelyColNamePartList = ['seq', 'msa', 'dna', 'rna', 'fasta', 'helm', 'sense', 'protein', 'pep', 'enumerated'];
93
+ likelyColNamePartList = ['seq', 'msa', 'dna', 'rna', 'fasta', 'helm', 'sense', 'protein', 'pep', 'enumerated', 'biln'];
94
94
 
95
95
  veryLikelyColNamePartList = ['peptide', 'oligo', 'sequence', 'enumerated',
96
96
  'heavy_chain', 'light_chain', 'heay-chain', 'light-chain', 'heavychain', 'lightchain',
@@ -156,10 +156,11 @@ class BioPackageDetectors extends DG.Package {
156
156
  try {
157
157
  const last = this.detectMacromoleculeStoreLast();
158
158
  const colName = col.name;
159
+ const colNameLower = colName.toLowerCase();
159
160
  const colNameLikely = this.likelyColNamePartList.some(
160
- (requiredColNamePart) => colName.toLowerCase().includes(requiredColNamePart));
161
+ (requiredColNamePart) => colNameLower.includes(requiredColNamePart));
161
162
  const colNameVeryLikely = this.veryLikelyColNamePartList.some(
162
- (requiredColNamePart) => colName.toLowerCase().includes(requiredColNamePart));
163
+ (requiredColNamePart) => colNameLower.includes(requiredColNamePart));
163
164
  const seqMinLength = colNameVeryLikely ? 3 : colNameLikely ? 7 : 10;
164
165
  const maxBadRatio = colNameLikely ? 0.05 : 0.005;
165
166
 
@@ -172,7 +173,7 @@ class BioPackageDetectors extends DG.Package {
172
173
  const categoriesSample = [...new Set((col.length < SEQ_SAMPLE_LIMIT ?
173
174
  wu.count(0).take(Math.min(SEQ_SAMPLE_LIMIT, col.length)).map((rowI) => col.get(rowI)) :
174
175
  this.sample(col, SEQ_SAMPLE_LIMIT))
175
- .map((seq) => !!seq ? seq.substring(0, SEQ_SAMPLE_LENGTH_LIMIT * 5) : '')
176
+ .map((seq) => !!seq ? seq.substring(0, SEQ_SAMPLE_LENGTH_LIMIT * 10) : '')
176
177
  .filter((seq) => seq.length !== 0/* skip empty values for detector */),
177
178
  )].map((s) => s?.trim());
178
179
  last.categoriesSample = categoriesSample;
@@ -198,11 +199,14 @@ class BioPackageDetectors extends DG.Package {
198
199
  }
199
200
 
200
201
  //not HELM
201
- const dotIsLikelyBilnSplitter = categoriesSample.every((s) => {
202
+ let hasDots = false;
203
+ let dotIsLikelyBilnSplitter = categoriesSample.every((s) => {
202
204
  const parts = s.split('.');
203
205
  // each part should be connected
206
+ hasDots = hasDots || parts.length > 1;
204
207
  return parts.length == 1 || parts.every((p) => /\(\d{1,2},\d{1,2}\)/g.test(p));
205
208
  });
209
+ dotIsLikelyBilnSplitter = dotIsLikelyBilnSplitter && hasDots;
206
210
  // if the dot (dissalowed character for macromolecules) is likely a biln separator,
207
211
  // we can just replace it with '-' and remove all connection parts to help detector detect it as separator
208
212
  if (dotIsLikelyBilnSplitter) {
@@ -257,7 +261,16 @@ class BioPackageDetectors extends DG.Package {
257
261
  return null;
258
262
  }
259
263
 
260
- const separator = this.detectSeparator(statsAsChars.freq, categoriesSample, seqMinLength);
264
+ // for BILN, there might be smiles in there, with bunch of special characters
265
+ let isPossiblyBiln = colNameLower.includes('biln') || dotIsLikelyBilnSplitter;
266
+ if (isPossiblyBiln) {
267
+ for (const symbol of ['@', '$', ';', '*'])
268
+ delete statsAsChars.freq[symbol];
269
+ }
270
+
271
+ const separator = this.detectSeparator(statsAsChars.freq, categoriesSample, seqMinLength, isPossiblyBiln);
272
+ if (separator !== '-')
273
+ isPossiblyBiln = false;
261
274
  const checkForbiddenSeparatorRes = this.checkForbiddenSeparator(separator);
262
275
  if (checkForbiddenSeparatorRes) {
263
276
  last.rejectReason = `Separator '${separator}' is forbidden.`;
@@ -300,7 +313,7 @@ class BioPackageDetectors extends DG.Package {
300
313
  }
301
314
  // Single- and multi-char monomer names for sequences with separators have constraints
302
315
  if (units === NOTATION.SEPARATOR || (units === NOTATION.FASTA && alphabetIsMultichar)) {
303
- const badSymbol /*: string | null*/ = this.checkBadMultichar(stats.freq);
316
+ const badSymbol /*: string | null*/ = this.checkBadMultichar(stats.freq, isPossiblyBiln);
304
317
  if (badSymbol) {
305
318
  last.rejectReason = `Forbidden multi-char monomer: '${badSymbol}'.`;
306
319
  return null;
@@ -349,7 +362,7 @@ class BioPackageDetectors extends DG.Package {
349
362
  * @param categoriesSample A string array of seqs sample
350
363
  * @param seqMinLength A threshold on min seq length for contributing to stats
351
364
  */
352
- detectSeparator(freq, categoriesSample, seqMinLength) {
365
+ detectSeparator(freq, categoriesSample, seqMinLength, isPossiblyBiln = false) {
353
366
  // To detect a separator we analyze col's sequences character frequencies.
354
367
  // If there is an exceptionally frequent symbol, then we will call it the separator.
355
368
  // The most frequent symbol should occur with a rate of at least 0.15
@@ -371,7 +384,7 @@ class BioPackageDetectors extends DG.Package {
371
384
 
372
385
  const maxFreq = Math.max(...Object.values(cleanFreq));
373
386
 
374
- const sep = Object.entries(freq).find(([k, v]) => v === maxFreq)[0];
387
+ const sep = Object.entries(cleanFreq).find(([k, v]) => v === maxFreq)[0];
375
388
  const sepFreq = freq[sep];
376
389
  const otherSumFreq = Object.entries(freq).filter((kv) => kv[0] !== sep)
377
390
  .map((kv) => kv[1]).reduce((pSum, a) => pSum + a, 0);
@@ -379,7 +392,7 @@ class BioPackageDetectors extends DG.Package {
379
392
  // Splitter with separator test application
380
393
  const splitter = this.getSplitterWithSeparator(sep, SEQ_SAMPLE_LENGTH_LIMIT);
381
394
  const stats = this.getStats(categoriesSample, seqMinLength, splitter);
382
- const badSymbol = this.checkBadMultichar(stats.freq);
395
+ const badSymbol = this.checkBadMultichar(stats.freq, isPossiblyBiln);
383
396
  if (badSymbol) return null;
384
397
  // TODO: Test for Gamma/Erlang distribution
385
398
  const totalMonomerCount = wu(Object.values(stats.freq)).reduce((sum, a) => sum + a, 0);
@@ -407,11 +420,12 @@ class BioPackageDetectors extends DG.Package {
407
420
  /** Dots and colons are nor allowed in multichar monomer names (but space is allowed).
408
421
  * The monomer name/label cannot contain digits only (but single digit is allowed).
409
422
  */
410
- checkBadMultichar(freq) /* : string | null */ {
423
+ checkBadMultichar(freq, isPossiblyBiln = false) /* : string | null */ {
411
424
  for (const symbol of Object.keys(freq)) {
412
425
  if (symbol && !isNaN(symbol))
413
426
  return symbol; // performance evaluated better with RegExp
414
-
427
+ if (isPossiblyBiln && symbol.startsWith('[') && symbol.endsWith(']'))
428
+ continue; // biln monomer smiles can contain forbidden characters within []
415
429
  const symbolLen = symbol.length;
416
430
  if (this.forbiddenMulticharFirst.includes(symbol[0]))
417
431
  return symbol;
package/dist/455.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"455.js","mappings":"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","sources":["webpack://bio/./node_modules/@datagrok-libraries/bio/src/monomer-works/consts.js","webpack://bio/./node_modules/@datagrok-libraries/bio/src/monomer-works/types.js","webpack://bio/./node_modules/@datagrok-libraries/bio/src/utils/const.js","webpack://bio/./node_modules/@datagrok-libraries/bio/src/utils/macromolecule/types.js","webpack://bio/./node_modules/@datagrok-libraries/bio/src/utils/macromolecule/consts.js","webpack://bio/./node_modules/@datagrok-libraries/js-draw-lite/src/types/org.js","webpack://bio/./node_modules/@datagrok-libraries/bio/src/monomer-works/monomer-works.js","webpack://bio/./node_modules/@datagrok-libraries/bio/src/monomer-works/to-atomic-level-utils.js","webpack://bio/./node_modules/@datagrok-libraries/bio/src/monomer-works/seq-to-molfile-worker.js"],"sourcesContent":["export const monomerWorksConsts = {\n // constants for parsing molfile V2000\n V2K_RGP_SHIFT: 8,\n V2K_RGP_LINE: 'M RGP',\n V2K_A_LINE: 'A ',\n // constants for parsing/reconstruction of molfile V3000\n V3K_COUNTS_SHIFT: 14,\n V3K_IDX_SHIFT: 7,\n V3K_HEADER_FIRST_LINE: '\\nDatagrok macromolecule handler\\n\\n',\n V3K_HEADER_SECOND_LINE: ' 0 0 0 0 0 0 999 V3000\\n',\n V3K_BEGIN_CTAB_BLOCK: 'M V30 BEGIN CTAB\\n',\n V3K_END_CTAB_BLOCK: 'M V30 END CTAB\\n',\n V3K_BEGIN_COUNTS_LINE: 'M V30 COUNTS ',\n V3K_COUNTS_LINE_ENDING: ' 0 0 0\\n',\n V3K_BEGIN_ATOM_BLOCK: 'M V30 BEGIN ATOM\\n',\n V3K_END_ATOM_BLOCK: 'M V30 END ATOM\\n',\n V3K_BEGIN_BOND_BLOCK: 'M V30 BEGIN BOND\\n',\n V3K_END_BOND_BLOCK: 'M V30 END BOND\\n',\n V3K_BOND_CONFIG: ' CFG=',\n V3K_BEGIN_DATA_LINE: 'M V30 ',\n V3K_END: 'M END',\n PRECISION_FACTOR: 10000, // HELMCoreLibrary has 4 significant digits after decimal point in atom coordinates\n // symbols for the corresponding monomers in HELM library\n DEOXYRIBOSE: { polymerType: \"RNA\" /* PolymerTypes.RNA */, symbol: 'd' },\n RIBOSE: { polymerType: \"RNA\" /* PolymerTypes.RNA */, symbol: 'r' },\n PHOSPHATE: { polymerType: \"RNA\" /* PolymerTypes.RNA */, symbol: 'p' },\n OXYGEN: 'O',\n HYDROGEN: 'H',\n};\n//# sourceMappingURL=consts.js.map","export function getMolGraph(dict, libKey) {\n return dict[libKey.polymerType]?.[libKey.symbol];\n}\nexport function hasMolGraph(dict, libKey) {\n return !!dict[libKey.polymerType]?.[libKey.symbol];\n}\nexport function setMolGraph(dict, libKey, value) {\n let pt = dict[libKey.polymerType];\n if (!pt)\n pt = dict[libKey.polymerType] = {};\n pt[libKey.symbol] = value;\n}\nexport class MonomerMap extends Map {\n constructor(entries) {\n super(entries);\n }\n}\n/** @property monomers key - helm seq position, */\nexport class MolfileWithMap {\n constructor(molfile, monomers) {\n this.molfile = molfile;\n this.monomers = monomers;\n }\n static createEmpty() { return new MolfileWithMap('', new MonomerMap(null)); }\n}\n//# sourceMappingURL=types.js.map","// core fields of HELM library object used in toAtomicLevel function\nexport const HELM_CORE_FIELDS = [\n \"symbol\" /* HELM_FIELDS.SYMBOL */,\n \"molfile\" /* HELM_FIELDS.MOLFILE */,\n \"rgroups\" /* HELM_FIELDS.RGROUPS */,\n \"name\" /* HELM_FIELDS.NAME */,\n // HELM_FIELDS.MONOMER_TYPE, // add if terminal monomers for PEPTIDEs to be\n // supported\n];\nexport const SDF_MONOMER_NAME = 'MonomerName';\n// todo: ideally, keys should be expressed via constants\nexport const jsonSdfMonomerLibDict = {\n 'monomerType': null, // -> Backbone\n 'smiles': null,\n 'name': 'Name',\n 'author': null,\n 'molfile': 'molecule',\n 'naturalAnalog': 'MonomerNaturalAnalogCode',\n 'rgroups': 'MonomerCaps',\n 'createDate': null,\n 'id': null,\n 'polymerType': 'MonomerType',\n 'symbol': 'MonomerName'\n};\nexport const DUMMY_MONOMER = {\n 'monomerType': 'Backbone',\n 'smiles': '',\n 'name': '',\n 'author': 'Datagrok',\n 'molfile': '',\n 'naturalAnalog': '',\n 'rgroups': [],\n 'createDate': null,\n 'id': 0,\n 'polymerType': 'PEPTIDE',\n 'symbol': ''\n};\n// range of hex nubers used in PepSea library to endode monomers\nexport const MONOMER_ENCODE_MIN = 0x100;\nexport const MONOMER_ENCODE_MAX = 0x40A;\nexport const RIBOSE_SYMBOL = 'r';\nexport const DEOXYRIBOSE_SYMBOL = 'd';\nexport const PHOSPHATE_SYMBOL = 'p';\nexport const HELM_WRAPPERS_REGEXP = new RegExp(`[${RIBOSE_SYMBOL}${DEOXYRIBOSE_SYMBOL}]\\\\((\\\\w)\\\\)${PHOSPHATE_SYMBOL}?`, 'g');\n//# sourceMappingURL=const.js.map","/** Alphabet candidate type */\nexport class CandidateType {\n constructor(name, alphabet, cutoff) {\n this.name = name;\n this.alphabet = alphabet;\n this.cutoff = cutoff;\n }\n}\n/** Alphabet candidate similarity type */\nexport class CandidateSimType extends CandidateType {\n constructor(candidate, freq, similarity) {\n super(candidate.name, candidate.alphabet, candidate.cutoff);\n this.freq = freq;\n this.similarity = similarity;\n }\n}\n//# sourceMappingURL=types.js.map","import { CandidateType } from './types';\n/** enum type to simplify setting \"user-friendly\" notation if necessary */\nexport var NOTATION;\n(function (NOTATION) {\n NOTATION[\"FASTA\"] = \"fasta\";\n NOTATION[\"SEPARATOR\"] = \"separator\";\n NOTATION[\"HELM\"] = \"helm\";\n /* Requires notation handler */ NOTATION[\"CUSTOM\"] = \"custom\";\n /* Requires notation handler */ NOTATION[\"BILN\"] = \"biln\";\n})(NOTATION || (NOTATION = {}));\nexport var ALPHABET;\n(function (ALPHABET) {\n ALPHABET[\"DNA\"] = \"DNA\";\n ALPHABET[\"RNA\"] = \"RNA\";\n ALPHABET[\"PT\"] = \"PT\";\n /** Unknown */\n ALPHABET[\"UN\"] = \"UN\";\n})(ALPHABET || (ALPHABET = {}));\nexport var TAGS;\n(function (TAGS) {\n TAGS[\"aligned\"] = \"aligned\";\n TAGS[\"alphabet\"] = \"alphabet\";\n TAGS[\"alphabetSize\"] = \".alphabetSize\";\n TAGS[\"alphabetIsMultichar\"] = \".alphabetIsMultichar\";\n TAGS[\"separator\"] = \"separator\";\n TAGS[\"isHelmCompatible\"] = \".isHelmCompatible\";\n TAGS[\"positionNames\"] = \".positionNames\";\n TAGS[\"positionLabels\"] = \".positionLabels\";\n TAGS[\"regions\"] = \".regions\";\n TAGS[\"positionShift\"] = \".positionShift\";\n TAGS[\"selectedPosition\"] = \".selectedPosition\";\n TAGS[\"polymerTypeColumnName\"] = \".polymerTypeColumnName\";\n})(TAGS || (TAGS = {}));\nexport { TAGS as BioTags };\nexport const positionSeparator = ', ';\nexport const monomerRe = /(?:\\[([A-Za-z0-9_\\-,()]+)\\])|([A-Za-z\\-])/g;\nexport const helmRe = /(PEPTIDE1|DNA1|RNA1)\\{([^}]+)}/g;\nexport const helmPp1Re = /\\[([^\\[\\]]+)]/g;\nexport const Alphabets = new class {\n constructor() {\n this.fasta = {\n peptide: new Set([\n 'G', 'L', 'Y', 'S', 'E', 'Q', 'D', 'N', 'F', 'A',\n 'K', 'R', 'H', 'C', 'V', 'P', 'W', 'I', 'M', 'T',\n ]),\n dna: new Set(['A', 'C', 'G', 'T']),\n rna: new Set(['A', 'C', 'G', 'U']),\n };\n }\n}();\nexport const candidateAlphabets = [\n new CandidateType(ALPHABET.PT, Alphabets.fasta.peptide, 0.50),\n new CandidateType(ALPHABET.DNA, Alphabets.fasta.dna, 0.55),\n new CandidateType(ALPHABET.RNA, Alphabets.fasta.rna, 0.55),\n];\n/** Canonical gap symbol */\nexport const GAP_SYMBOL = '';\nexport const GapOriginals = {\n [NOTATION.FASTA]: '-',\n [NOTATION.SEPARATOR]: '',\n [NOTATION.HELM]: '*',\n [NOTATION.BILN]: '',\n};\nexport const MONOMER_MOTIF_SPLITTER = ' , ';\n//# sourceMappingURL=consts.js.map","export var HelmTypes;\n(function (HelmTypes) {\n HelmTypes[\"BASE\"] = \"HELM_BASE\";\n HelmTypes[\"SUGAR\"] = \"HELM_SUGAR\";\n HelmTypes[\"LINKER\"] = \"HELM_LINKER\";\n HelmTypes[\"AA\"] = \"HELM_AA\";\n HelmTypes[\"CHEM\"] = \"HELM_CHEM\";\n HelmTypes[\"BLOB\"] = \"HELM_BLOB\";\n HelmTypes[\"NUCLEOTIDE\"] = \"HELM_NUCLETIDE\";\n})(HelmTypes || (HelmTypes = {}));\n//# sourceMappingURL=org.js.map","import { HelmTypes } from '../helm/consts';\nexport class MonomerWorks {\n //private molfileConverter: IMolfileConverter;\n constructor(monomerLib /*, molfileConverter: IMolfileConverter*/) {\n this.monomerLib = monomerLib;\n //this.molfileConverter = molfileConverter;\n }\n //types according to Monomer possible\n getCappedRotatedMonomer(monomerType, monomerName) {\n // TODO: Check type of monomerType arg\n const monomer = this.monomerLib.getMonomer(monomerType, monomerName);\n if (monomer)\n return monomer.molfile; //TODO cap\n return null;\n }\n}\nexport function helmTypeToPolymerType(helmType) {\n let polymerType = undefined;\n switch (helmType) {\n case HelmTypes.BASE:\n case HelmTypes.SUGAR: // r - ribose, d - deoxyribose\n case HelmTypes.LINKER: // p - phosphate\n case HelmTypes.NUCLEOTIDE:\n // @ts-ignore\n case 'nucleotide':\n polymerType = \"RNA\" /* PolymerTypes.RNA */;\n break;\n case HelmTypes.AA:\n polymerType = \"PEPTIDE\" /* PolymerTypes.PEPTIDE */;\n break;\n case HelmTypes.CHEM:\n polymerType = \"CHEM\" /* PolymerTypes.CHEM */;\n break;\n case HelmTypes.BLOB:\n polymerType = \"BLOB\" /* PolymerTypes.BLOB */;\n break;\n default:\n polymerType = \"PEPTIDE\" /* PolymerTypes.PEPTIDE */;\n console.warn(`Unexpected HelmType '${helmType}'`);\n }\n return polymerType;\n}\n//# sourceMappingURL=monomer-works.js.map","/* eslint-disable max-len */\nimport { monomerWorksConsts as C } from './consts';\nimport { getMolGraph, MolfileWithMap, MonomerMap } from './types';\nimport { HELM_CORE_FIELDS, } from '../utils/const';\nimport { ALPHABET, GAP_SYMBOL } from '../utils/macromolecule/consts';\nimport { helmTypeToPolymerType } from './monomer-works';\n/** Get a mapping of peptide symbols to HELM monomer library objects with selected fields.\n * @param {IMonomerLib} monomerLib - Monomer library\n * @param {HELM_POLYMER_TYPE} polymerType - Polymer type\n * @param {ALPHABET} alphabet - Alphabet of the column\n * @return {Map<string, any>} - Mapping of peptide symbols to HELM monomer library objects with selected fields*/\nexport function getFormattedMonomerLib(monomerLib, polymerType, alphabet) {\n const map = new Map();\n for (const monomerSymbol of monomerLib.getMonomerSymbolsByType(polymerType)) {\n const it = monomerLib.getMonomer(polymerType, monomerSymbol);\n if (polymerType === \"RNA\" /* HELM_POLYMER_TYPE.RNA */ &&\n (it[\"monomerType\" /* HELM_FIELDS.MONOMER_TYPE */] === \"Branch\" /* HELM_MONOMER_TYPE.BRANCH */ ||\n alphabet === ALPHABET.DNA && it[\"symbol\" /* HELM_FIELDS.SYMBOL */] === C.DEOXYRIBOSE.symbol ||\n alphabet === ALPHABET.RNA && it[\"symbol\" /* HELM_FIELDS.SYMBOL */] === C.RIBOSE.symbol ||\n it[\"symbol\" /* HELM_FIELDS.SYMBOL */] === C.PHOSPHATE.symbol) ||\n polymerType === \"PEPTIDE\" /* HELM_POLYMER_TYPE.PEPTIDE */ &&\n it[\"monomerType\" /* HELM_FIELDS.MONOMER_TYPE */] !== \"Branch\" /* HELM_MONOMER_TYPE.BRANCH */) {\n const monomerObject = {};\n HELM_CORE_FIELDS.forEach((field) => {\n //@ts-ignore\n monomerObject[field] = it[field];\n });\n map.set(it[\"symbol\" /* HELM_FIELDS.SYMBOL */], monomerObject);\n }\n }\n return map;\n}\n/** Translate a sequence of monomer symbols into Molfile V3000\n * @param {string[]} monomerSeq - Sequence of monomer symbols (canonical)\n * @param {Map<string, MolGraph>} monomersDict - Mapping of monomer symbols to MolGraph objects\n * @param {ALPHABET} alphabet - Alphabet of the column\n * @param {PolymerType} polymerType - Polymer type\n * @return {string} - Molfile V3000*/\nexport function monomerSeqToMolfile(monomerSeq, monomersDict, alphabet, polymerType) {\n if (monomerSeq.length === 0) {\n // throw new Error('monomerSeq is empty');\n return MolfileWithMap.createEmpty();\n }\n // define atom and bond counts, taking into account the bond type\n const getAtomAndBondCounts = getResultingAtomBondCounts;\n const { atomCount, bondCount, needsCapping } = getAtomAndBondCounts(monomerSeq, monomersDict, alphabet, polymerType);\n // create arrays to store lines of the resulting molfile\n const molfileAtomBlock = new Array(atomCount);\n const molfileBondBlock = new Array(bondCount);\n let addMonomerToMolblock;\n let sugar = null;\n let phosphate = null;\n if (polymerType === \"PEPTIDE\" /* HELM_POLYMER_TYPE.PEPTIDE */)\n addMonomerToMolblock = addAminoAcidToMolblock;\n else { // nucleotides\n addMonomerToMolblock = addNucleotideToMolblock;\n sugar = (alphabet === ALPHABET.DNA) ? getMolGraph(monomersDict, C.DEOXYRIBOSE) : getMolGraph(monomersDict, C.RIBOSE);\n phosphate = getMolGraph(monomersDict, C.PHOSPHATE);\n }\n const v = {\n i: 0,\n nodeShift: 0,\n bondShift: 0,\n backbonePositionShift: new Array(2).fill(0),\n branchPositionShift: new Array(2).fill(0),\n backboneAttachNode: 0,\n branchAttachNode: 0,\n flipFactor: 1,\n };\n const LC = {\n sugar: sugar,\n phosphate: phosphate,\n seqLength: monomerSeq.length,\n atomCount: atomCount,\n bondCount: bondCount,\n };\n const monomers = new MonomerMap();\n const steabsCollection = [];\n let nAtoms = 0;\n let lastMonomerCappingAtom = undefined;\n for (v.i = 0; v.i < LC.seqLength; ++v.i) {\n const seqMonomer = monomerSeq[v.i];\n if (seqMonomer.symbol === GAP_SYMBOL)\n continue;\n const monomer = getMolGraph(monomersDict, { symbol: seqMonomer.symbol, polymerType: helmTypeToPolymerType(seqMonomer.biotype) });\n lastMonomerCappingAtom = monomer.terminalR2Atom;\n const mAtomFirst = v.nodeShift;\n const mBondFirst = v.bondShift;\n addMonomerToMolblock(monomer, molfileAtomBlock, molfileBondBlock, v, LC);\n //adding stereo atoms to array for further STEABS block generation\n monomer.stereoAtoms?.forEach((i) => steabsCollection.push(i + nAtoms));\n nAtoms += monomer.atoms.x.length;\n const mAtomCount = v.nodeShift - mAtomFirst;\n const mAtomList = new Array(mAtomCount);\n for (let maI = 0; maI < mAtomCount; ++maI)\n mAtomList[maI] = mAtomFirst + maI;\n const mBondCount = v.bondShift - mBondFirst;\n const mBondList = new Array(mBondCount);\n for (let mbI = 0; mbI < mBondCount; ++mbI)\n mBondList[mbI] = mBondFirst + mbI;\n monomers.set(v.i, {\n biotype: seqMonomer.biotype,\n symbol: seqMonomer.symbol,\n atoms: mAtomList, bonds: mBondList\n });\n }\n // if the last monomer needs to be capped, add the terminal OH to the resulting molfile\n if (needsCapping)\n capResultingMolblock(molfileAtomBlock, molfileBondBlock, v, LC, lastMonomerCappingAtom ?? C.OXYGEN);\n const molfileCountsLine = C.V3K_BEGIN_COUNTS_LINE + atomCount + ' ' + bondCount + C.V3K_COUNTS_LINE_ENDING;\n // todo: possible optimization may be achieved by replacing .join('') with +=\n // since counterintuitively joining an array into a new string is reportedly\n // slower than using += as below\n let result = '';\n result += C.V3K_HEADER_FIRST_LINE;\n result += C.V3K_HEADER_SECOND_LINE;\n result += C.V3K_BEGIN_CTAB_BLOCK;\n result += molfileCountsLine;\n result += C.V3K_BEGIN_ATOM_BLOCK;\n result += molfileAtomBlock.join('');\n result += C.V3K_END_ATOM_BLOCK;\n result += C.V3K_BEGIN_BOND_BLOCK;\n result += molfileBondBlock.join('');\n result += C.V3K_END_BOND_BLOCK;\n if (steabsCollection.length > 0)\n result += getCollectionBlock(steabsCollection);\n result += C.V3K_END_CTAB_BLOCK;\n result += C.V3K_END;\n // return molfileParts.join('');\n return { molfile: result, monomers: monomers };\n}\nfunction getCollectionBlock(collection) {\n //one row in STEABS block can be no longer than 80 symbols\n //maxSymbols = 80 symbols minus ' -\\n' (4 symbols)\n const maxSymbols = 76;\n const rowsArray = [];\n let newCollectionRow = `M V30 MDLV30/STEABS ATOMS=(${collection.length}`;\n for (let i = 0; i < collection.length; i++) {\n const updatedRow = `${newCollectionRow} ${collection[i]}`;\n if (updatedRow.length > maxSymbols) {\n rowsArray.push(`${newCollectionRow} -\\n`);\n newCollectionRow = `M V30 ${collection[i]}`;\n }\n else\n newCollectionRow = updatedRow;\n //in case last atom was added - close the block\n if (i === collection.length - 1)\n rowsArray.push(`${newCollectionRow})\\n`);\n }\n return `M V30 BEGIN COLLECTION\\n${rowsArray.join('')}M V30 END COLLECTION\\n`;\n}\n/** Cap the resulting (after sewing up all the monomers) molfile with 'O'\n * @param {string[]} molfileAtomBlock - Array of lines of the resulting molfile atom block\n * @param {string[]} molfileBondBlock - Array of lines of the resulting molfile bond block\n * @param {LoopVariables} v - Loop variables\n * @param {LoopConstants} LC - Loop constants*/\nfunction capResultingMolblock(molfileAtomBlock, molfileBondBlock, v, LC, cappingAtomType = C.OXYGEN) {\n // add terminal oxygen\n const atomIdx = v.nodeShift + 1;\n molfileAtomBlock[LC.atomCount] = C.V3K_BEGIN_DATA_LINE + atomIdx + ' ' +\n (cappingAtomType ?? C.OXYGEN) + ' ' + keepPrecision(v.backbonePositionShift[0]) + ' ' +\n v.flipFactor * keepPrecision(v.backbonePositionShift[1]) + ' ' + '0.000000 0' + '\\n';\n // add terminal bond\n const firstAtom = v.backboneAttachNode;\n const secondAtom = atomIdx;\n molfileBondBlock[LC.bondCount] = C.V3K_BEGIN_DATA_LINE + v.bondShift + ' ' +\n 1 + ' ' + firstAtom + ' ' + secondAtom + '\\n';\n}\nfunction addAminoAcidToMolblock(monomer, molfileAtomBlock, molfileBondBlock, v) {\n v.flipFactor = (-1) ** (v.i % 2); // to flip every even monomer over OX\n addBackboneMonomerToMolblock(monomer, molfileAtomBlock, molfileBondBlock, v);\n}\nfunction addBackboneMonomerToMolblock(monomer, molfileAtomBlock, molfileBondBlock, v) {\n // todo: remove these comments to the docstrings of the corr. functions\n // construnct the lines of V3K molfile atom block\n fillAtomLines(monomer, molfileAtomBlock, v);\n // construct the lines of V3K molfile bond block\n fillBondLines(monomer, molfileBondBlock, v);\n // peptide bond\n fillChainExtendingBond(monomer, molfileBondBlock, v);\n // update branch variables if necessary\n if (monomer.meta.branchShift !== null && monomer.meta.terminalNodes.length > 2)\n updateBranchVariables(monomer, v);\n // update loop variables\n updateChainExtendingVariables(monomer, v);\n}\nfunction addNucleotideToMolblock(nucleobase, molfileAtomBlock, molfileBondBlock, v, LC) {\n // construnct the lines of V3K molfile atom block corresponding to phosphate\n // and sugar\n if (v.i === 0)\n addBackboneMonomerToMolblock(LC.sugar, molfileAtomBlock, molfileBondBlock, v);\n else {\n for (const monomer of [LC.phosphate, LC.sugar])\n addBackboneMonomerToMolblock(monomer, molfileAtomBlock, molfileBondBlock, v);\n }\n addBranchMonomerToMolblock(nucleobase, molfileAtomBlock, molfileBondBlock, v);\n}\nfunction addBranchMonomerToMolblock(monomer, molfileAtomBlock, molfileBondBlock, v) {\n fillBranchAtomLines(monomer, molfileAtomBlock, v);\n fillBondLines(monomer, molfileBondBlock, v);\n fillBackboneToBranchBond(monomer, molfileBondBlock, v);\n // C-N bond\n const bondIdx = v.bondShift;\n const firstAtom = v.branchAttachNode;\n const secondAtom = monomer.meta.terminalNodes[0] + v.nodeShift;\n molfileBondBlock[bondIdx - 1] = C.V3K_BEGIN_DATA_LINE + bondIdx + ' ' +\n 1 + ' ' + firstAtom + ' ' + secondAtom + '\\n';\n // update loop variables\n v.bondShift += monomer.bonds.atomPairs.length + 1;\n v.nodeShift += monomer.atoms.atomTypes.length;\n}\nfunction updateChainExtendingVariables(monomer, v) {\n v.backboneAttachNode = v.nodeShift + monomer.meta.terminalNodes[1];\n v.bondShift += monomer.bonds.atomPairs.length + 1;\n v.nodeShift += monomer.atoms.atomTypes.length;\n v.backbonePositionShift[0] += monomer.meta.backboneShift?.[0] ?? 0; // todo: non-null check\n v.backbonePositionShift[1] += v.flipFactor * (monomer.meta.backboneShift?.[1] ?? 0);\n}\nfunction updateBranchVariables(monomer, v) {\n v.branchAttachNode = v.nodeShift + monomer.meta.terminalNodes[2];\n for (let i = 0; i < 2; ++i)\n v.branchPositionShift[i] = v.backbonePositionShift[i] + monomer.meta.branchShift[i];\n}\nfunction fillAtomLines(monomer, molfileAtomBlock, v) {\n for (let j = 0; j < monomer.atoms.atomTypes.length; ++j) {\n const atomIdx = v.nodeShift + j + 1;\n molfileAtomBlock[v.nodeShift + j] = C.V3K_BEGIN_DATA_LINE + atomIdx + ' ' +\n monomer.atoms.atomTypes[j] + ' ' +\n keepPrecision(v.backbonePositionShift[0] + monomer.atoms.x[j]) + ' ' +\n keepPrecision(v.backbonePositionShift[1] + v.flipFactor * monomer.atoms.y[j]) +\n ' ' + monomer.atoms.kwargs[j];\n }\n}\n// todo: remove as quickfix\nfunction fillBranchAtomLines(monomer, molfileAtomBlock, v) {\n for (let j = 0; j < monomer.atoms.atomTypes.length; ++j) {\n const atomIdx = v.nodeShift + j + 1;\n molfileAtomBlock[v.nodeShift + j] = C.V3K_BEGIN_DATA_LINE + atomIdx + ' ' +\n monomer.atoms.atomTypes[j] + ' ' +\n keepPrecision(v.branchPositionShift[0] + monomer.atoms.x[j]) + ' ' +\n keepPrecision(v.branchPositionShift[1] + v.flipFactor * monomer.atoms.y[j]) +\n ' ' + monomer.atoms.kwargs[j];\n }\n}\nfunction fillBondLines(monomer, molfileBondBlock, v) {\n // construct the lines of V3K molfile bond block\n for (let j = 0; j < monomer.bonds.atomPairs.length; ++j) {\n const bondIdx = v.bondShift + j + 1;\n const firstAtom = monomer.bonds.atomPairs[j][0] + v.nodeShift;\n const secondAtom = monomer.bonds.atomPairs[j][1] + v.nodeShift;\n let bondCfg = '';\n if (monomer.bonds.bondConfiguration.has(j)) {\n // flip orientation when necessary\n let orientation = monomer.bonds.bondConfiguration.get(j);\n if (v.flipFactor < 0)\n orientation = (orientation === 1) ? 3 : 1;\n bondCfg = ' CFG=' + orientation;\n }\n const kwargs = monomer.bonds.kwargs.has(j) ?\n ' ' + monomer.bonds.kwargs.get(j) : '';\n molfileBondBlock[v.bondShift + j] = C.V3K_BEGIN_DATA_LINE + bondIdx + ' ' +\n monomer.bonds.bondTypes[j] + ' ' +\n firstAtom + ' ' + secondAtom + bondCfg + kwargs + '\\n';\n }\n}\nfunction fillChainExtendingBond(monomer, molfileBondBlock, v) {\n if (v.backboneAttachNode !== 0) {\n const bondIdx = v.bondShift;\n const firstAtom = v.backboneAttachNode;\n const secondAtom = monomer.meta.terminalNodes[0] + v.nodeShift;\n molfileBondBlock[v.bondShift - 1] = C.V3K_BEGIN_DATA_LINE + bondIdx + ' ' +\n 1 + ' ' + firstAtom + ' ' + secondAtom + '\\n';\n }\n}\n// todo: remove\nfunction fillBackboneToBranchBond(branchMonomer, molfileBondBlock, v) {\n const bondIdx = v.bondShift;\n const firstAtom = v.branchAttachNode;\n const secondAtom = branchMonomer.meta.terminalNodes[0] + v.nodeShift;\n molfileBondBlock[bondIdx - 1] = C.V3K_BEGIN_DATA_LINE + bondIdx + ' ' +\n 1 + ' ' + firstAtom + ' ' + secondAtom + '\\n';\n}\n/** Compute the atom/bond counts for the resulting molfile, depending on the\n * type of polymer (peptide/nucleotide)\n * @param {string[]}monomerSeq - the sequence of monomers\n * @param {Map<string, MolGraph>}monomersDict - the dictionary of monomers\n * @param {ALPHABET}alphabet - the alphabet of the monomers\n * @param {HELM_POLYMER_TYPE}polymerType - the type of polymer\n * @return {{atomCount: number, bondCount: number}} - the atom/bond counts*/\nfunction getResultingAtomBondCounts(monomerSeq, monomersDict, alphabet, polymerType) {\n let atomCount = 0;\n let bondCount = 0;\n let monomerCount = 0;\n let needsCapping = true;\n let lastMonomerGraph = null;\n // sum up all the atoms/nodes provided by the sequence\n for (const seqMonomer of monomerSeq) {\n if (seqMonomer.symbol === GAP_SYMBOL)\n continue; // Skip for gap/empty monomer in MSA\n if (seqMonomer.symbol == '*')\n throw new Error(`Gap canonical symbol is '', not '*`);\n lastMonomerGraph = getMolGraph(monomersDict, { symbol: seqMonomer.symbol, polymerType: helmTypeToPolymerType(seqMonomer.biotype) });\n atomCount += lastMonomerGraph.atoms.x.length;\n bondCount += lastMonomerGraph.bonds.bondTypes.length;\n monomerCount++;\n }\n // add extra values depending on the polymer type\n if (polymerType === \"PEPTIDE\" /* HELM_POLYMER_TYPE.PEPTIDE */) {\n // add the rightmost/terminating cap group 'OH' (i.e. 'O')\n atomCount += 1;\n // add chain-extending bonds (C-NH per each monomer pair and terminal C-OH)\n bondCount += monomerCount;\n // if the last monomer is something like NH2, which only has R1, there is no need to cap it\n // although, this should never happen, but hey... in other bits of code, there is a chunk that adds pseudo-R2 as hydrogen\n // we should also check, if the R2 of the last monomer is not hydrogen, that case should also be omitted\n if (monomerCount > 0) {\n if ((lastMonomerGraph?.meta?.rNodes?.length ?? 0) < 2 || lastMonomerGraph?.terminalR2Atom?.toLowerCase() === C.HYDROGEN.toLowerCase()) {\n needsCapping = false;\n atomCount -= 1; // remove the last atom (the terminal 'O')\n bondCount -= 1; // remove the last bond (the terminal C-OH)\n }\n }\n }\n else { // nucleotides\n const sugar = (alphabet === ALPHABET.DNA) ?\n getMolGraph(monomersDict, C.DEOXYRIBOSE) : getMolGraph(monomersDict, C.RIBOSE);\n const phosphate = getMolGraph(monomersDict, C.PHOSPHATE);\n // add phosphate per each pair of nucleobase symbols\n atomCount += (monomerSeq.length - 1) * phosphate.atoms.x.length;\n // add sugar per each nucleobase symbol\n atomCount += monomerSeq.length * sugar.atoms.x.length;\n // add the leftmost cap group 'OH' (i.e. 'O')\n atomCount += 1;\n // add bonds from phosphate monomers\n bondCount += (monomerSeq.length - 1) * phosphate.bonds.bondTypes.length;\n // add bonds from sugar monomers\n bondCount += monomerSeq.length * sugar.bonds.bondTypes.length;\n // exclude the first chain-extending bond O-P (absent, no 'leftmost' phosphate)\n bondCount -= 1;\n // add chain-extending and branch bonds (O-P, C-O and C-N per each nucleotide)\n bondCount += monomerSeq.length * 3;\n }\n return { atomCount, bondCount, needsCapping };\n}\n/** Keep precision upon floating point operations over atom coordinates\n * @param {number}x - the floating point number\n * @return {number} - the floating point number with the same precision\n */\nexport function keepPrecision(x) {\n return Math.round(C.PRECISION_FACTOR * x) / C.PRECISION_FACTOR;\n}\n//# sourceMappingURL=to-atomic-level-utils.js.map","import { monomerSeqToMolfile } from './to-atomic-level-utils';\nonmessage = (event) => {\n const { seqList, monomersDict, alphabet, polymerType, start, end } = event.data;\n const resMolList = new Array(end - start);\n const molfileWarningList = new Array(0);\n for (let rowI = start; rowI < end; ++rowI) {\n try {\n const seq = seqList[rowI];\n resMolList[rowI - start] = monomerSeqToMolfile(seq, monomersDict, alphabet, polymerType);\n }\n catch (err) {\n const errMsg = err instanceof Error ? err.message : err.toString();\n const msg = `Cannot get molfile of row #${rowI}: ${errMsg}.`;\n molfileWarningList.push(msg);\n }\n }\n postMessage({ molfiles: resMolList, warnings: molfileWarningList });\n};\n//# sourceMappingURL=seq-to-molfile-worker.js.map"],"names":["monomerWorksConsts","V2K_RGP_SHIFT","V2K_RGP_LINE","V2K_A_LINE","V3K_COUNTS_SHIFT","V3K_IDX_SHIFT","V3K_HEADER_FIRST_LINE","V3K_HEADER_SECOND_LINE","V3K_BEGIN_CTAB_BLOCK","V3K_END_CTAB_BLOCK","V3K_BEGIN_COUNTS_LINE","V3K_COUNTS_LINE_ENDING","V3K_BEGIN_ATOM_BLOCK","V3K_END_ATOM_BLOCK","V3K_BEGIN_BOND_BLOCK","V3K_END_BOND_BLOCK","V3K_BOND_CONFIG","V3K_BEGIN_DATA_LINE","V3K_END","PRECISION_FACTOR","DEOXYRIBOSE","polymerType","symbol","RIBOSE","PHOSPHATE","OXYGEN","HYDROGEN","getMolGraph","dict","libKey","MonomerMap","Map","constructor","entries","super","MolfileWithMap","molfile","monomers","this","createEmpty","RegExp","CandidateType","name","alphabet","cutoff","NOTATION","TAGS","ALPHABET","Alphabets","fasta","peptide","Set","dna","rna","HelmTypes","helmTypeToPolymerType","helmType","BASE","SUGAR","LINKER","NUCLEOTIDE","AA","CHEM","BLOB","console","warn","monomerSeqToMolfile","monomerSeq","monomersDict","length","getAtomAndBondCounts","getResultingAtomBondCounts","atomCount","bondCount","needsCapping","molfileAtomBlock","Array","molfileBondBlock","addMonomerToMolblock","sugar","phosphate","addAminoAcidToMolblock","addNucleotideToMolblock","DNA","v","i","nodeShift","bondShift","backbonePositionShift","fill","branchPositionShift","backboneAttachNode","branchAttachNode","flipFactor","LC","seqLength","steabsCollection","lastMonomerCappingAtom","nAtoms","seqMonomer","monomer","biotype","terminalR2Atom","mAtomFirst","mBondFirst","stereoAtoms","forEach","push","atoms","x","mAtomCount","mAtomList","maI","mBondCount","mBondList","mbI","set","bonds","cappingAtomType","atomIdx","keepPrecision","firstAtom","secondAtom","capResultingMolblock","molfileCountsLine","result","join","collection","rowsArray","newCollectionRow","updatedRow","getCollectionBlock","addBackboneMonomerToMolblock","j","atomTypes","y","kwargs","fillAtomLines","fillBondLines","bondIdx","meta","terminalNodes","fillChainExtendingBond","branchShift","updateBranchVariables","atomPairs","backboneShift","updateChainExtendingVariables","nucleobase","fillBranchAtomLines","branchMonomer","fillBackboneToBranchBond","addBranchMonomerToMolblock","bondCfg","bondConfiguration","has","orientation","get","bondTypes","monomerCount","lastMonomerGraph","Error","rNodes","toLowerCase","Math","round","PT","RNA","FASTA","SEPARATOR","HELM","BILN","onmessage","event","seqList","start","end","data","resMolList","molfileWarningList","rowI","seq","err","msg","message","toString","postMessage","molfiles","warnings"],"sourceRoot":""}
1
+ {"version":3,"file":"455.js","mappings":"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","sources":["webpack://bio/./node_modules/@datagrok-libraries/bio/src/monomer-works/consts.js","webpack://bio/./node_modules/@datagrok-libraries/bio/src/monomer-works/types.js","webpack://bio/./node_modules/@datagrok-libraries/bio/src/utils/const.js","webpack://bio/./node_modules/@datagrok-libraries/bio/src/utils/macromolecule/types.js","webpack://bio/./node_modules/@datagrok-libraries/bio/src/utils/macromolecule/consts.js","webpack://bio/./node_modules/@datagrok-libraries/js-draw-lite/src/types/org.js","webpack://bio/./node_modules/@datagrok-libraries/bio/src/monomer-works/monomer-works.js","webpack://bio/./node_modules/@datagrok-libraries/bio/src/monomer-works/to-atomic-level-utils.js","webpack://bio/./node_modules/@datagrok-libraries/bio/src/monomer-works/seq-to-molfile-worker.js"],"sourcesContent":["export const monomerWorksConsts = {\n // constants for parsing molfile V2000\n V2K_RGP_SHIFT: 8,\n V2K_RGP_LINE: 'M RGP',\n V2K_A_LINE: 'A ',\n // constants for parsing/reconstruction of molfile V3000\n V3K_COUNTS_SHIFT: 14,\n V3K_IDX_SHIFT: 7,\n V3K_HEADER_FIRST_LINE: '\\nDatagrok macromolecule handler\\n\\n',\n V3K_HEADER_SECOND_LINE: ' 0 0 0 0 0 0 999 V3000\\n',\n V3K_BEGIN_CTAB_BLOCK: 'M V30 BEGIN CTAB\\n',\n V3K_END_CTAB_BLOCK: 'M V30 END CTAB\\n',\n V3K_BEGIN_COUNTS_LINE: 'M V30 COUNTS ',\n V3K_COUNTS_LINE_ENDING: ' 0 0 0\\n',\n V3K_BEGIN_ATOM_BLOCK: 'M V30 BEGIN ATOM\\n',\n V3K_END_ATOM_BLOCK: 'M V30 END ATOM\\n',\n V3K_BEGIN_BOND_BLOCK: 'M V30 BEGIN BOND\\n',\n V3K_END_BOND_BLOCK: 'M V30 END BOND\\n',\n V3K_BOND_CONFIG: ' CFG=',\n V3K_BEGIN_DATA_LINE: 'M V30 ',\n V3K_END: 'M END',\n PRECISION_FACTOR: 10000, // HELMCoreLibrary has 4 significant digits after decimal point in atom coordinates\n // symbols for the corresponding monomers in HELM library\n DEOXYRIBOSE: { polymerType: \"RNA\" /* PolymerTypes.RNA */, symbol: 'd' },\n RIBOSE: { polymerType: \"RNA\" /* PolymerTypes.RNA */, symbol: 'r' },\n PHOSPHATE: { polymerType: \"RNA\" /* PolymerTypes.RNA */, symbol: 'p' },\n OXYGEN: 'O',\n HYDROGEN: 'H',\n};\n//# sourceMappingURL=consts.js.map","export function getMolGraph(dict, libKey) {\n return dict[libKey.polymerType]?.[libKey.symbol];\n}\nexport function hasMolGraph(dict, libKey) {\n return !!dict[libKey.polymerType]?.[libKey.symbol];\n}\nexport function setMolGraph(dict, libKey, value) {\n let pt = dict[libKey.polymerType];\n if (!pt)\n pt = dict[libKey.polymerType] = {};\n pt[libKey.symbol] = value;\n}\nexport class MonomerMap extends Map {\n constructor(entries) {\n super(entries);\n }\n}\n/** @property monomers key - helm seq position, */\nexport class MolfileWithMap {\n constructor(molfile, monomers) {\n this.molfile = molfile;\n this.monomers = monomers;\n }\n static createEmpty() { return new MolfileWithMap('', new MonomerMap(null)); }\n}\n//# sourceMappingURL=types.js.map","// core fields of HELM library object used in toAtomicLevel function\nexport const HELM_CORE_FIELDS = [\n \"symbol\" /* HELM_FIELDS.SYMBOL */,\n \"molfile\" /* HELM_FIELDS.MOLFILE */,\n \"rgroups\" /* HELM_FIELDS.RGROUPS */,\n \"name\" /* HELM_FIELDS.NAME */,\n // HELM_FIELDS.MONOMER_TYPE, // add if terminal monomers for PEPTIDEs to be\n // supported\n];\nexport const SDF_MONOMER_NAME = 'MonomerName';\n// todo: ideally, keys should be expressed via constants\nexport const jsonSdfMonomerLibDict = {\n 'monomerType': null, // -> Backbone\n 'smiles': null,\n 'name': 'Name',\n 'author': null,\n 'molfile': 'molecule',\n 'naturalAnalog': 'MonomerNaturalAnalogCode',\n 'rgroups': 'MonomerCaps',\n 'createDate': null,\n 'id': null,\n 'polymerType': 'MonomerType',\n 'symbol': 'MonomerName'\n};\nexport const DUMMY_MONOMER = {\n 'monomerType': 'Backbone',\n 'smiles': '',\n 'name': '',\n 'author': 'Datagrok',\n 'molfile': '',\n 'naturalAnalog': '',\n 'rgroups': [],\n 'createDate': null,\n 'id': 0,\n 'polymerType': 'PEPTIDE',\n 'symbol': ''\n};\n// range of hex nubers used in PepSea library to endode monomers\nexport const MONOMER_ENCODE_MIN = 0x100;\nexport const MONOMER_ENCODE_MAX = 0x40A;\nexport const RIBOSE_SYMBOL = 'r';\nexport const DEOXYRIBOSE_SYMBOL = 'd';\nexport const PHOSPHATE_SYMBOL = 'p';\nexport const HELM_WRAPPERS_REGEXP = new RegExp(`[${RIBOSE_SYMBOL}${DEOXYRIBOSE_SYMBOL}]\\\\((\\\\w)\\\\)${PHOSPHATE_SYMBOL}?`, 'g');\n//# sourceMappingURL=const.js.map","/** Alphabet candidate type */\nexport class CandidateType {\n constructor(name, alphabet, cutoff) {\n this.name = name;\n this.alphabet = alphabet;\n this.cutoff = cutoff;\n }\n}\n/** Alphabet candidate similarity type */\nexport class CandidateSimType extends CandidateType {\n constructor(candidate, freq, similarity) {\n super(candidate.name, candidate.alphabet, candidate.cutoff);\n this.freq = freq;\n this.similarity = similarity;\n }\n}\n//# sourceMappingURL=types.js.map","import { CandidateType } from './types';\n/** enum type to simplify setting \"user-friendly\" notation if necessary */\nexport var NOTATION;\n(function (NOTATION) {\n NOTATION[\"FASTA\"] = \"fasta\";\n NOTATION[\"SEPARATOR\"] = \"separator\";\n NOTATION[\"HELM\"] = \"helm\";\n /* Requires notation handler */ NOTATION[\"CUSTOM\"] = \"custom\";\n /* Requires notation handler */ NOTATION[\"BILN\"] = \"biln\";\n})(NOTATION || (NOTATION = {}));\nexport var ALPHABET;\n(function (ALPHABET) {\n ALPHABET[\"DNA\"] = \"DNA\";\n ALPHABET[\"RNA\"] = \"RNA\";\n ALPHABET[\"PT\"] = \"PT\";\n /** Unknown */\n ALPHABET[\"UN\"] = \"UN\";\n})(ALPHABET || (ALPHABET = {}));\nexport var TAGS;\n(function (TAGS) {\n TAGS[\"aligned\"] = \"aligned\";\n TAGS[\"alphabet\"] = \"alphabet\";\n TAGS[\"alphabetSize\"] = \".alphabetSize\";\n TAGS[\"alphabetIsMultichar\"] = \".alphabetIsMultichar\";\n TAGS[\"separator\"] = \"separator\";\n TAGS[\"isHelmCompatible\"] = \".isHelmCompatible\";\n TAGS[\"positionNames\"] = \".positionNames\";\n TAGS[\"positionLabels\"] = \".positionLabels\";\n TAGS[\"regions\"] = \".regions\";\n TAGS[\"positionShift\"] = \".positionShift\";\n TAGS[\"selectedPosition\"] = \".selectedPosition\";\n TAGS[\"polymerTypeColumnName\"] = \".polymerTypeColumnName\";\n})(TAGS || (TAGS = {}));\nexport { TAGS as BioTags };\nexport const positionSeparator = ', ';\nexport const monomerRe = /(?:\\[([A-Za-z0-9_\\-,()]+)\\])|([A-Za-z\\-])/g;\nexport const helmRe = /(PEPTIDE1|DNA1|RNA1)\\{([^}]+)}/g;\nexport const helmPp1Re = /\\[([^\\[\\]]+)]/g;\nexport const Alphabets = new class {\n constructor() {\n this.fasta = {\n peptide: new Set([\n 'G', 'L', 'Y', 'S', 'E', 'Q', 'D', 'N', 'F', 'A',\n 'K', 'R', 'H', 'C', 'V', 'P', 'W', 'I', 'M', 'T',\n ]),\n dna: new Set(['A', 'C', 'G', 'T']),\n rna: new Set(['A', 'C', 'G', 'U']),\n };\n }\n}();\nexport const candidateAlphabets = [\n new CandidateType(ALPHABET.PT, Alphabets.fasta.peptide, 0.50),\n new CandidateType(ALPHABET.DNA, Alphabets.fasta.dna, 0.55),\n new CandidateType(ALPHABET.RNA, Alphabets.fasta.rna, 0.55),\n];\n/** Canonical gap symbol */\nexport const GAP_SYMBOL = '';\nexport const GapOriginals = {\n [NOTATION.FASTA]: '-',\n [NOTATION.SEPARATOR]: '',\n [NOTATION.HELM]: '*',\n [NOTATION.BILN]: '',\n};\nexport const MONOMER_MOTIF_SPLITTER = ' , ';\n//# sourceMappingURL=consts.js.map","export var HelmTypes;\n(function (HelmTypes) {\n HelmTypes[\"BASE\"] = \"HELM_BASE\";\n HelmTypes[\"SUGAR\"] = \"HELM_SUGAR\";\n HelmTypes[\"LINKER\"] = \"HELM_LINKER\";\n HelmTypes[\"AA\"] = \"HELM_AA\";\n HelmTypes[\"CHEM\"] = \"HELM_CHEM\";\n HelmTypes[\"BLOB\"] = \"HELM_BLOB\";\n HelmTypes[\"NUCLEOTIDE\"] = \"HELM_NUCLETIDE\";\n})(HelmTypes || (HelmTypes = {}));\n//# sourceMappingURL=org.js.map","import { HelmTypes } from '../helm/consts';\nexport class MonomerWorks {\n //private molfileConverter: IMolfileConverter;\n constructor(monomerLib /*, molfileConverter: IMolfileConverter*/) {\n this.monomerLib = monomerLib;\n //this.molfileConverter = molfileConverter;\n }\n //types according to Monomer possible\n getCappedRotatedMonomer(monomerType, monomerName) {\n // TODO: Check type of monomerType arg\n const monomer = this.monomerLib.getMonomer(monomerType, monomerName);\n if (monomer)\n return monomer.molfile; //TODO cap\n return null;\n }\n}\nexport function helmTypeToPolymerType(helmType) {\n let polymerType = undefined;\n switch (helmType) {\n case HelmTypes.BASE:\n case HelmTypes.SUGAR: // r - ribose, d - deoxyribose\n case HelmTypes.LINKER: // p - phosphate\n case HelmTypes.NUCLEOTIDE:\n // @ts-ignore\n case 'nucleotide':\n polymerType = \"RNA\" /* PolymerTypes.RNA */;\n break;\n case HelmTypes.AA:\n polymerType = \"PEPTIDE\" /* PolymerTypes.PEPTIDE */;\n break;\n case HelmTypes.CHEM:\n polymerType = \"CHEM\" /* PolymerTypes.CHEM */;\n break;\n case HelmTypes.BLOB:\n polymerType = \"BLOB\" /* PolymerTypes.BLOB */;\n break;\n default:\n polymerType = \"PEPTIDE\" /* PolymerTypes.PEPTIDE */;\n console.warn(`Unexpected HelmType '${helmType}'`);\n }\n return polymerType;\n}\n//# sourceMappingURL=monomer-works.js.map","/* eslint-disable max-len */\nimport { monomerWorksConsts as C } from './consts';\nimport { getMolGraph, MolfileWithMap, MonomerMap } from './types';\nimport { HELM_CORE_FIELDS, } from '../utils/const';\nimport { ALPHABET, GAP_SYMBOL } from '../utils/macromolecule/consts';\nimport { helmTypeToPolymerType } from './monomer-works';\n/** Get a mapping of peptide symbols to HELM monomer library objects with selected fields.\n * @param {IMonomerLib} monomerLib - Monomer library\n * @param {HELM_POLYMER_TYPE} polymerType - Polymer type\n * @param {ALPHABET} alphabet - Alphabet of the column\n * @return {Map<string, any>} - Mapping of peptide symbols to HELM monomer library objects with selected fields*/\nexport function getFormattedMonomerLib(monomerLib, polymerType, alphabet) {\n const map = new Map();\n for (const monomerSymbol of monomerLib.getMonomerSymbolsByType(polymerType)) {\n const it = monomerLib.getMonomer(polymerType, monomerSymbol);\n if (polymerType === \"RNA\" /* HELM_POLYMER_TYPE.RNA */ &&\n (it[\"monomerType\" /* HELM_FIELDS.MONOMER_TYPE */] === \"Branch\" /* HELM_MONOMER_TYPE.BRANCH */ ||\n alphabet === ALPHABET.DNA && it[\"symbol\" /* HELM_FIELDS.SYMBOL */] === C.DEOXYRIBOSE.symbol ||\n alphabet === ALPHABET.RNA && it[\"symbol\" /* HELM_FIELDS.SYMBOL */] === C.RIBOSE.symbol ||\n it[\"symbol\" /* HELM_FIELDS.SYMBOL */] === C.PHOSPHATE.symbol) ||\n polymerType === \"PEPTIDE\" /* HELM_POLYMER_TYPE.PEPTIDE */ &&\n it[\"monomerType\" /* HELM_FIELDS.MONOMER_TYPE */] !== \"Branch\" /* HELM_MONOMER_TYPE.BRANCH */) {\n const monomerObject = {};\n HELM_CORE_FIELDS.forEach((field) => {\n //@ts-ignore\n monomerObject[field] = it[field];\n });\n map.set(monomerSymbol, monomerObject);\n }\n }\n return map;\n}\n/** Translate a sequence of monomer symbols into Molfile V3000\n * @param {string[]} monomerSeq - Sequence of monomer symbols (canonical)\n * @param {Map<string, MolGraph>} monomersDict - Mapping of monomer symbols to MolGraph objects\n * @param {ALPHABET} alphabet - Alphabet of the column\n * @param {PolymerType} polymerType - Polymer type\n * @return {string} - Molfile V3000*/\nexport function monomerSeqToMolfile(monomerSeq, monomersDict, alphabet, polymerType) {\n if (monomerSeq.length === 0) {\n // throw new Error('monomerSeq is empty');\n return MolfileWithMap.createEmpty();\n }\n // define atom and bond counts, taking into account the bond type\n const getAtomAndBondCounts = getResultingAtomBondCounts;\n const { atomCount, bondCount, needsCapping } = getAtomAndBondCounts(monomerSeq, monomersDict, alphabet, polymerType);\n // create arrays to store lines of the resulting molfile\n const molfileAtomBlock = new Array(atomCount);\n const molfileBondBlock = new Array(bondCount);\n let addMonomerToMolblock;\n let sugar = null;\n let phosphate = null;\n if (polymerType === \"PEPTIDE\" /* HELM_POLYMER_TYPE.PEPTIDE */)\n addMonomerToMolblock = addAminoAcidToMolblock;\n else { // nucleotides\n addMonomerToMolblock = addNucleotideToMolblock;\n sugar = (alphabet === ALPHABET.DNA) ? getMolGraph(monomersDict, C.DEOXYRIBOSE) : getMolGraph(monomersDict, C.RIBOSE);\n phosphate = getMolGraph(monomersDict, C.PHOSPHATE);\n }\n const v = {\n i: 0,\n nodeShift: 0,\n bondShift: 0,\n backbonePositionShift: new Array(2).fill(0),\n branchPositionShift: new Array(2).fill(0),\n backboneAttachNode: 0,\n branchAttachNode: 0,\n flipFactor: 1,\n };\n const LC = {\n sugar: sugar,\n phosphate: phosphate,\n seqLength: monomerSeq.length,\n atomCount: atomCount,\n bondCount: bondCount,\n };\n const monomers = new MonomerMap();\n const steabsCollection = [];\n let nAtoms = 0;\n let lastMonomerCappingAtom = undefined;\n for (v.i = 0; v.i < LC.seqLength; ++v.i) {\n const seqMonomer = monomerSeq[v.i];\n if (seqMonomer.symbol === GAP_SYMBOL)\n continue;\n const monomer = getMolGraph(monomersDict, { symbol: seqMonomer.symbol, polymerType: helmTypeToPolymerType(seqMonomer.biotype) });\n lastMonomerCappingAtom = monomer.terminalR2Atom;\n const mAtomFirst = v.nodeShift;\n const mBondFirst = v.bondShift;\n addMonomerToMolblock(monomer, molfileAtomBlock, molfileBondBlock, v, LC);\n //adding stereo atoms to array for further STEABS block generation\n monomer.stereoAtoms?.forEach((i) => steabsCollection.push(i + nAtoms));\n nAtoms += monomer.atoms.x.length;\n const mAtomCount = v.nodeShift - mAtomFirst;\n const mAtomList = new Array(mAtomCount);\n for (let maI = 0; maI < mAtomCount; ++maI)\n mAtomList[maI] = mAtomFirst + maI;\n const mBondCount = v.bondShift - mBondFirst;\n const mBondList = new Array(mBondCount);\n for (let mbI = 0; mbI < mBondCount; ++mbI)\n mBondList[mbI] = mBondFirst + mbI;\n monomers.set(v.i, {\n biotype: seqMonomer.biotype,\n symbol: seqMonomer.symbol,\n atoms: mAtomList, bonds: mBondList\n });\n }\n // if the last monomer needs to be capped, add the terminal OH to the resulting molfile\n if (needsCapping)\n capResultingMolblock(molfileAtomBlock, molfileBondBlock, v, LC, lastMonomerCappingAtom ?? C.OXYGEN);\n const molfileCountsLine = C.V3K_BEGIN_COUNTS_LINE + atomCount + ' ' + bondCount + C.V3K_COUNTS_LINE_ENDING;\n // todo: possible optimization may be achieved by replacing .join('') with +=\n // since counterintuitively joining an array into a new string is reportedly\n // slower than using += as below\n let result = '';\n result += C.V3K_HEADER_FIRST_LINE;\n result += C.V3K_HEADER_SECOND_LINE;\n result += C.V3K_BEGIN_CTAB_BLOCK;\n result += molfileCountsLine;\n result += C.V3K_BEGIN_ATOM_BLOCK;\n result += molfileAtomBlock.join('');\n result += C.V3K_END_ATOM_BLOCK;\n result += C.V3K_BEGIN_BOND_BLOCK;\n result += molfileBondBlock.join('');\n result += C.V3K_END_BOND_BLOCK;\n if (steabsCollection.length > 0)\n result += getCollectionBlock(steabsCollection);\n result += C.V3K_END_CTAB_BLOCK;\n result += C.V3K_END;\n // return molfileParts.join('');\n return { molfile: result, monomers: monomers };\n}\nfunction getCollectionBlock(collection) {\n //one row in STEABS block can be no longer than 80 symbols\n //maxSymbols = 80 symbols minus ' -\\n' (4 symbols)\n const maxSymbols = 76;\n const rowsArray = [];\n let newCollectionRow = `M V30 MDLV30/STEABS ATOMS=(${collection.length}`;\n for (let i = 0; i < collection.length; i++) {\n const updatedRow = `${newCollectionRow} ${collection[i]}`;\n if (updatedRow.length > maxSymbols) {\n rowsArray.push(`${newCollectionRow} -\\n`);\n newCollectionRow = `M V30 ${collection[i]}`;\n }\n else\n newCollectionRow = updatedRow;\n //in case last atom was added - close the block\n if (i === collection.length - 1)\n rowsArray.push(`${newCollectionRow})\\n`);\n }\n return `M V30 BEGIN COLLECTION\\n${rowsArray.join('')}M V30 END COLLECTION\\n`;\n}\n/** Cap the resulting (after sewing up all the monomers) molfile with 'O'\n * @param {string[]} molfileAtomBlock - Array of lines of the resulting molfile atom block\n * @param {string[]} molfileBondBlock - Array of lines of the resulting molfile bond block\n * @param {LoopVariables} v - Loop variables\n * @param {LoopConstants} LC - Loop constants*/\nfunction capResultingMolblock(molfileAtomBlock, molfileBondBlock, v, LC, cappingAtomType = C.OXYGEN) {\n // add terminal oxygen\n const atomIdx = v.nodeShift + 1;\n molfileAtomBlock[LC.atomCount] = C.V3K_BEGIN_DATA_LINE + atomIdx + ' ' +\n (cappingAtomType ?? C.OXYGEN) + ' ' + keepPrecision(v.backbonePositionShift[0]) + ' ' +\n v.flipFactor * keepPrecision(v.backbonePositionShift[1]) + ' ' + '0.000000 0' + '\\n';\n // add terminal bond\n const firstAtom = v.backboneAttachNode;\n const secondAtom = atomIdx;\n molfileBondBlock[LC.bondCount] = C.V3K_BEGIN_DATA_LINE + v.bondShift + ' ' +\n 1 + ' ' + firstAtom + ' ' + secondAtom + '\\n';\n}\nfunction addAminoAcidToMolblock(monomer, molfileAtomBlock, molfileBondBlock, v) {\n v.flipFactor = (-1) ** (v.i % 2); // to flip every even monomer over OX\n addBackboneMonomerToMolblock(monomer, molfileAtomBlock, molfileBondBlock, v);\n}\nfunction addBackboneMonomerToMolblock(monomer, molfileAtomBlock, molfileBondBlock, v) {\n // todo: remove these comments to the docstrings of the corr. functions\n // construnct the lines of V3K molfile atom block\n fillAtomLines(monomer, molfileAtomBlock, v);\n // construct the lines of V3K molfile bond block\n fillBondLines(monomer, molfileBondBlock, v);\n // peptide bond\n fillChainExtendingBond(monomer, molfileBondBlock, v);\n // update branch variables if necessary\n if (monomer.meta.branchShift !== null && monomer.meta.terminalNodes.length > 2)\n updateBranchVariables(monomer, v);\n // update loop variables\n updateChainExtendingVariables(monomer, v);\n}\nfunction addNucleotideToMolblock(nucleobase, molfileAtomBlock, molfileBondBlock, v, LC) {\n // construnct the lines of V3K molfile atom block corresponding to phosphate\n // and sugar\n if (v.i === 0)\n addBackboneMonomerToMolblock(LC.sugar, molfileAtomBlock, molfileBondBlock, v);\n else {\n for (const monomer of [LC.phosphate, LC.sugar])\n addBackboneMonomerToMolblock(monomer, molfileAtomBlock, molfileBondBlock, v);\n }\n addBranchMonomerToMolblock(nucleobase, molfileAtomBlock, molfileBondBlock, v);\n}\nfunction addBranchMonomerToMolblock(monomer, molfileAtomBlock, molfileBondBlock, v) {\n fillBranchAtomLines(monomer, molfileAtomBlock, v);\n fillBondLines(monomer, molfileBondBlock, v);\n fillBackboneToBranchBond(monomer, molfileBondBlock, v);\n // C-N bond\n const bondIdx = v.bondShift;\n const firstAtom = v.branchAttachNode;\n const secondAtom = monomer.meta.terminalNodes[0] + v.nodeShift;\n molfileBondBlock[bondIdx - 1] = C.V3K_BEGIN_DATA_LINE + bondIdx + ' ' +\n 1 + ' ' + firstAtom + ' ' + secondAtom + '\\n';\n // update loop variables\n v.bondShift += monomer.bonds.atomPairs.length + 1;\n v.nodeShift += monomer.atoms.atomTypes.length;\n}\nfunction updateChainExtendingVariables(monomer, v) {\n v.backboneAttachNode = v.nodeShift + monomer.meta.terminalNodes[1];\n v.bondShift += monomer.bonds.atomPairs.length + 1;\n v.nodeShift += monomer.atoms.atomTypes.length;\n v.backbonePositionShift[0] += monomer.meta.backboneShift?.[0] ?? 0; // todo: non-null check\n v.backbonePositionShift[1] += v.flipFactor * (monomer.meta.backboneShift?.[1] ?? 0);\n}\nfunction updateBranchVariables(monomer, v) {\n v.branchAttachNode = v.nodeShift + monomer.meta.terminalNodes[2];\n for (let i = 0; i < 2; ++i)\n v.branchPositionShift[i] = v.backbonePositionShift[i] + monomer.meta.branchShift[i];\n}\nfunction fillAtomLines(monomer, molfileAtomBlock, v) {\n for (let j = 0; j < monomer.atoms.atomTypes.length; ++j) {\n const atomIdx = v.nodeShift + j + 1;\n molfileAtomBlock[v.nodeShift + j] = C.V3K_BEGIN_DATA_LINE + atomIdx + ' ' +\n monomer.atoms.atomTypes[j] + ' ' +\n keepPrecision(v.backbonePositionShift[0] + monomer.atoms.x[j]) + ' ' +\n keepPrecision(v.backbonePositionShift[1] + v.flipFactor * monomer.atoms.y[j]) +\n ' ' + monomer.atoms.kwargs[j];\n }\n}\n// todo: remove as quickfix\nfunction fillBranchAtomLines(monomer, molfileAtomBlock, v) {\n for (let j = 0; j < monomer.atoms.atomTypes.length; ++j) {\n const atomIdx = v.nodeShift + j + 1;\n molfileAtomBlock[v.nodeShift + j] = C.V3K_BEGIN_DATA_LINE + atomIdx + ' ' +\n monomer.atoms.atomTypes[j] + ' ' +\n keepPrecision(v.branchPositionShift[0] + monomer.atoms.x[j]) + ' ' +\n keepPrecision(v.branchPositionShift[1] + v.flipFactor * monomer.atoms.y[j]) +\n ' ' + monomer.atoms.kwargs[j];\n }\n}\nfunction fillBondLines(monomer, molfileBondBlock, v) {\n // construct the lines of V3K molfile bond block\n for (let j = 0; j < monomer.bonds.atomPairs.length; ++j) {\n const bondIdx = v.bondShift + j + 1;\n const firstAtom = monomer.bonds.atomPairs[j][0] + v.nodeShift;\n const secondAtom = monomer.bonds.atomPairs[j][1] + v.nodeShift;\n let bondCfg = '';\n if (monomer.bonds.bondConfiguration.has(j)) {\n // flip orientation when necessary\n let orientation = monomer.bonds.bondConfiguration.get(j);\n if (v.flipFactor < 0)\n orientation = (orientation === 1) ? 3 : 1;\n bondCfg = ' CFG=' + orientation;\n }\n const kwargs = monomer.bonds.kwargs.has(j) ?\n ' ' + monomer.bonds.kwargs.get(j) : '';\n molfileBondBlock[v.bondShift + j] = C.V3K_BEGIN_DATA_LINE + bondIdx + ' ' +\n monomer.bonds.bondTypes[j] + ' ' +\n firstAtom + ' ' + secondAtom + bondCfg + kwargs + '\\n';\n }\n}\nfunction fillChainExtendingBond(monomer, molfileBondBlock, v) {\n if (v.backboneAttachNode !== 0) {\n const bondIdx = v.bondShift;\n const firstAtom = v.backboneAttachNode;\n const secondAtom = monomer.meta.terminalNodes[0] + v.nodeShift;\n molfileBondBlock[v.bondShift - 1] = C.V3K_BEGIN_DATA_LINE + bondIdx + ' ' +\n 1 + ' ' + firstAtom + ' ' + secondAtom + '\\n';\n }\n}\n// todo: remove\nfunction fillBackboneToBranchBond(branchMonomer, molfileBondBlock, v) {\n const bondIdx = v.bondShift;\n const firstAtom = v.branchAttachNode;\n const secondAtom = branchMonomer.meta.terminalNodes[0] + v.nodeShift;\n molfileBondBlock[bondIdx - 1] = C.V3K_BEGIN_DATA_LINE + bondIdx + ' ' +\n 1 + ' ' + firstAtom + ' ' + secondAtom + '\\n';\n}\n/** Compute the atom/bond counts for the resulting molfile, depending on the\n * type of polymer (peptide/nucleotide)\n * @param {string[]}monomerSeq - the sequence of monomers\n * @param {Map<string, MolGraph>}monomersDict - the dictionary of monomers\n * @param {ALPHABET}alphabet - the alphabet of the monomers\n * @param {HELM_POLYMER_TYPE}polymerType - the type of polymer\n * @return {{atomCount: number, bondCount: number}} - the atom/bond counts*/\nfunction getResultingAtomBondCounts(monomerSeq, monomersDict, alphabet, polymerType) {\n let atomCount = 0;\n let bondCount = 0;\n let monomerCount = 0;\n let needsCapping = true;\n let lastMonomerGraph = null;\n // sum up all the atoms/nodes provided by the sequence\n for (const seqMonomer of monomerSeq) {\n if (seqMonomer.symbol === GAP_SYMBOL)\n continue; // Skip for gap/empty monomer in MSA\n if (seqMonomer.symbol == '*')\n throw new Error(`Gap canonical symbol is '', not '*`);\n lastMonomerGraph = getMolGraph(monomersDict, { symbol: seqMonomer.symbol, polymerType: helmTypeToPolymerType(seqMonomer.biotype) });\n atomCount += lastMonomerGraph.atoms.x.length;\n bondCount += lastMonomerGraph.bonds.bondTypes.length;\n monomerCount++;\n }\n // add extra values depending on the polymer type\n if (polymerType === \"PEPTIDE\" /* HELM_POLYMER_TYPE.PEPTIDE */) {\n // add the rightmost/terminating cap group 'OH' (i.e. 'O')\n atomCount += 1;\n // add chain-extending bonds (C-NH per each monomer pair and terminal C-OH)\n bondCount += monomerCount;\n // if the last monomer is something like NH2, which only has R1, there is no need to cap it\n // although, this should never happen, but hey... in other bits of code, there is a chunk that adds pseudo-R2 as hydrogen\n // we should also check, if the R2 of the last monomer is not hydrogen, that case should also be omitted\n if (monomerCount > 0) {\n if ((lastMonomerGraph?.meta?.rNodes?.length ?? 0) < 2 || lastMonomerGraph?.terminalR2Atom?.toLowerCase() === C.HYDROGEN.toLowerCase()) {\n needsCapping = false;\n atomCount -= 1; // remove the last atom (the terminal 'O')\n bondCount -= 1; // remove the last bond (the terminal C-OH)\n }\n }\n }\n else { // nucleotides\n const sugar = (alphabet === ALPHABET.DNA) ?\n getMolGraph(monomersDict, C.DEOXYRIBOSE) : getMolGraph(monomersDict, C.RIBOSE);\n const phosphate = getMolGraph(monomersDict, C.PHOSPHATE);\n // add phosphate per each pair of nucleobase symbols\n atomCount += (monomerSeq.length - 1) * phosphate.atoms.x.length;\n // add sugar per each nucleobase symbol\n atomCount += monomerSeq.length * sugar.atoms.x.length;\n // add the leftmost cap group 'OH' (i.e. 'O')\n atomCount += 1;\n // add bonds from phosphate monomers\n bondCount += (monomerSeq.length - 1) * phosphate.bonds.bondTypes.length;\n // add bonds from sugar monomers\n bondCount += monomerSeq.length * sugar.bonds.bondTypes.length;\n // exclude the first chain-extending bond O-P (absent, no 'leftmost' phosphate)\n bondCount -= 1;\n // add chain-extending and branch bonds (O-P, C-O and C-N per each nucleotide)\n bondCount += monomerSeq.length * 3;\n }\n return { atomCount, bondCount, needsCapping };\n}\n/** Keep precision upon floating point operations over atom coordinates\n * @param {number}x - the floating point number\n * @return {number} - the floating point number with the same precision\n */\nexport function keepPrecision(x) {\n return Math.round(C.PRECISION_FACTOR * x) / C.PRECISION_FACTOR;\n}\n//# sourceMappingURL=to-atomic-level-utils.js.map","import { monomerSeqToMolfile } from './to-atomic-level-utils';\nonmessage = (event) => {\n const { seqList, monomersDict, alphabet, polymerType, start, end } = event.data;\n const resMolList = new Array(end - start);\n const molfileWarningList = new Array(0);\n for (let rowI = start; rowI < end; ++rowI) {\n try {\n const seq = seqList[rowI];\n resMolList[rowI - start] = monomerSeqToMolfile(seq, monomersDict, alphabet, polymerType);\n }\n catch (err) {\n const errMsg = err instanceof Error ? err.message : err.toString();\n const msg = `Cannot get molfile of row #${rowI}: ${errMsg}.`;\n molfileWarningList.push(msg);\n }\n }\n postMessage({ molfiles: resMolList, warnings: molfileWarningList });\n};\n//# sourceMappingURL=seq-to-molfile-worker.js.map"],"names":["monomerWorksConsts","V2K_RGP_SHIFT","V2K_RGP_LINE","V2K_A_LINE","V3K_COUNTS_SHIFT","V3K_IDX_SHIFT","V3K_HEADER_FIRST_LINE","V3K_HEADER_SECOND_LINE","V3K_BEGIN_CTAB_BLOCK","V3K_END_CTAB_BLOCK","V3K_BEGIN_COUNTS_LINE","V3K_COUNTS_LINE_ENDING","V3K_BEGIN_ATOM_BLOCK","V3K_END_ATOM_BLOCK","V3K_BEGIN_BOND_BLOCK","V3K_END_BOND_BLOCK","V3K_BOND_CONFIG","V3K_BEGIN_DATA_LINE","V3K_END","PRECISION_FACTOR","DEOXYRIBOSE","polymerType","symbol","RIBOSE","PHOSPHATE","OXYGEN","HYDROGEN","getMolGraph","dict","libKey","MonomerMap","Map","constructor","entries","super","MolfileWithMap","molfile","monomers","this","createEmpty","RegExp","CandidateType","name","alphabet","cutoff","NOTATION","TAGS","ALPHABET","Alphabets","fasta","peptide","Set","dna","rna","HelmTypes","helmTypeToPolymerType","helmType","BASE","SUGAR","LINKER","NUCLEOTIDE","AA","CHEM","BLOB","console","warn","monomerSeqToMolfile","monomerSeq","monomersDict","length","getAtomAndBondCounts","getResultingAtomBondCounts","atomCount","bondCount","needsCapping","molfileAtomBlock","Array","molfileBondBlock","addMonomerToMolblock","sugar","phosphate","addAminoAcidToMolblock","addNucleotideToMolblock","DNA","v","i","nodeShift","bondShift","backbonePositionShift","fill","branchPositionShift","backboneAttachNode","branchAttachNode","flipFactor","LC","seqLength","steabsCollection","lastMonomerCappingAtom","nAtoms","seqMonomer","monomer","biotype","terminalR2Atom","mAtomFirst","mBondFirst","stereoAtoms","forEach","push","atoms","x","mAtomCount","mAtomList","maI","mBondCount","mBondList","mbI","set","bonds","cappingAtomType","atomIdx","keepPrecision","firstAtom","secondAtom","capResultingMolblock","molfileCountsLine","result","join","collection","rowsArray","newCollectionRow","updatedRow","getCollectionBlock","addBackboneMonomerToMolblock","j","atomTypes","y","kwargs","fillAtomLines","fillBondLines","bondIdx","meta","terminalNodes","fillChainExtendingBond","branchShift","updateBranchVariables","atomPairs","backboneShift","updateChainExtendingVariables","nucleobase","fillBranchAtomLines","branchMonomer","fillBackboneToBranchBond","addBranchMonomerToMolblock","bondCfg","bondConfiguration","has","orientation","get","bondTypes","monomerCount","lastMonomerGraph","Error","rNodes","toLowerCase","Math","round","PT","RNA","FASTA","SEPARATOR","HELM","BILN","onmessage","event","seqList","start","end","data","resMolList","molfileWarningList","rowI","seq","err","msg","message","toString","postMessage","molfiles","warnings"],"sourceRoot":""}