@datagrok/bio 2.27.2 → 2.27.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +50 -0
- package/agents/package-knowledge.yaml +53 -0
- package/dist/455.js +1 -1
- package/dist/455.js.map +1 -1
- package/dist/682.js +1 -1
- package/dist/682.js.map +1 -1
- package/dist/705.js +1 -1
- package/dist/705.js.map +1 -1
- package/dist/909.js +2 -0
- package/dist/909.js.map +1 -0
- package/dist/immunum_bg.wasm +0 -0
- package/dist/package-test.js +3 -3
- package/dist/package-test.js.map +1 -1
- package/dist/package.js +3 -3
- package/dist/package.js.map +1 -1
- package/package.json +4 -2
- package/src/demo/bio01b-hierarchical-clustering-and-activity-cliffs.ts +24 -11
- package/src/package-api.ts +15 -1
- package/src/package-test.ts +1 -0
- package/src/package.g.ts +12 -1
- package/src/package.ts +22 -4
- package/src/tests/antibody-numbering-tests.ts +190 -0
- package/src/tests/detectors-tests.ts +5 -1
- package/src/tests/splitters-test.ts +8 -4
- package/src/tests/to-atomic-level-tests.ts +144 -0
- package/src/utils/annotations/numbering-ui.ts +34 -90
- package/src/utils/antibody-numbering/immunum-client.ts +45 -0
- package/src/utils/antibody-numbering/immunum-glue.js +275 -0
- package/src/utils/antibody-numbering/immunum.worker.ts +159 -0
- package/src/utils/antibody-numbering/number-antibody.ts +105 -0
- package/src/utils/antibody-numbering/types.ts +48 -0
- package/src/utils/seq-helper/seq-handler.ts +25 -9
- package/test-console-output-1.log +582 -485
- package/test-record-1.mp4 +0 -0
- package/webpack.config.js +13 -0
- package/dist/282.js +0 -2
- package/dist/282.js.map +0 -1
- package/dist/287.js +0 -2
- package/dist/287.js.map +0 -1
- package/dist/422.js +0 -2
- package/dist/422.js.map +0 -1
- package/dist/767.js +0 -2
- package/dist/767.js.map +0 -1
- package/src/utils/antibody-numbering (WIP)/alignment.ts +0 -578
- package/src/utils/antibody-numbering (WIP)/annotator.ts +0 -120
- package/src/utils/antibody-numbering (WIP)/data/blosum62.ts +0 -55
- package/src/utils/antibody-numbering (WIP)/data/consensus-aho.ts +0 -155
- package/src/utils/antibody-numbering (WIP)/data/consensus-imgt.ts +0 -162
- package/src/utils/antibody-numbering (WIP)/data/consensus-kabat.ts +0 -157
- package/src/utils/antibody-numbering (WIP)/data/consensus-martin.ts +0 -152
- package/src/utils/antibody-numbering (WIP)/data/consensus.ts +0 -36
- package/src/utils/antibody-numbering (WIP)/data/regions.ts +0 -63
- package/src/utils/antibody-numbering (WIP)/index.ts +0 -31
- package/src/utils/antibody-numbering (WIP)/testdata.ts +0 -5356
- package/src/utils/antibody-numbering (WIP)/types.ts +0 -69
- /package/dist/{8473fcbfb6e85ca6c852.wasm → wasmCluster.wasm} +0 -0
- /package/dist/{9a8fbf37666e32487835.wasm → wasmDbscan.wasm} +0 -0
package/CLAUDE.md
CHANGED
|
@@ -15,6 +15,7 @@ Category: **Bioinformatics**. Top menu: `Bio | ...`.
|
|
|
15
15
|
- `@datagrok-libraries/chem-meta` — RDKit API types (`RDModule`)
|
|
16
16
|
- `@datagrok-libraries/tutorials` — tutorial framework
|
|
17
17
|
- `@biowasm/aioli` — WebAssembly runtime for kalign (MSA)
|
|
18
|
+
- `immunum` — WebAssembly antibody/TCR numbering (IMGT/Kabat) — run in a worker via `src/utils/antibody-numbering/`
|
|
18
19
|
- `ajv` / `ajv-errors` — JSON schema validation for monomer libraries
|
|
19
20
|
- `openchemlib` — molfile conversion, chirality engine
|
|
20
21
|
|
|
@@ -59,6 +60,9 @@ Other packages depend on these implementations: **Helm**, **Peptides**, **Biostr
|
|
|
59
60
|
| `Bio \| Manage \| Monomer Libraries` | `manageLibrariesView` | Full monomer library management UI |
|
|
60
61
|
| `Bio \| Manage \| Monomers` | `manageMonomersView` | Individual monomer CRUD editor |
|
|
61
62
|
| `Bio \| Manage \| Match with Monomer Library...` | `matchWithMonomerLibrary` | Matches molecules to library monomers |
|
|
63
|
+
| `Bio \| Annotate \| Apply Numbering Scheme...` | `applyNumberingScheme` | Assigns antibody numbering (IMGT/Kabat/Chothia/AHo) via any registered engine |
|
|
64
|
+
| `Bio \| Annotate \| Scan Liabilities...` | `scanLiabilities` | Scans macromolecule sequences for deamidation / oxidation / other liabilities |
|
|
65
|
+
| `Bio \| Annotate \| Manage Annotations...` | `manageAnnotations` | View and manage sequence annotations on macromolecule columns |
|
|
62
66
|
|
|
63
67
|
**Registered Viewers:**
|
|
64
68
|
- `WebLogo` → `WebLogoViewer` — sequence logo with entropy/full-height modes
|
|
@@ -210,6 +214,48 @@ static async myAligner(
|
|
|
210
214
|
|
|
211
215
|
See `pepseaMsa()` in `package.ts` and `alignWithPepsea()` in `pepsea.ts` for a complete reference implementation.
|
|
212
216
|
|
|
217
|
+
#### Antibody Numbering
|
|
218
|
+
|
|
219
|
+
| File | Purpose |
|
|
220
|
+
|---|---|
|
|
221
|
+
| `utils/annotations/numbering-ui.ts` | `showNumberingSchemeDialog()` — generic dialog for applying antibody numbering. Discovers registered engines via `DG.Func.find({meta: {role: 'antibodyNumbering'}})`, reads the selected engine's `scheme` parameter `choices` to populate the scheme dropdown (updates when the engine changes), runs the chosen engine, and applies the result (regions/annotations + aligned column). |
|
|
222
|
+
| `utils/antibody-numbering/number-antibody.ts` | `numberAntibodyColumn()` — built-in Bio engine. Runs immunum in a worker, builds the result DataFrame in the shape the dialog expects (`position_names`, `chain_type`, `annotations_json`, `numbering_detail`, `numbering_map`). |
|
|
223
|
+
| `utils/antibody-numbering/immunum-client.ts` | Worker client: spawns a **fresh worker per call** and terminates it before returning so the WASM instance is freed. Request/response is one `MessageChannel` round-trip. |
|
|
224
|
+
| `utils/antibody-numbering/immunum.worker.ts` | Worker entry — fetches `immunum_bg.wasm` from the dist/ directory (resolved via `self.location`), initializes the module, caches an `Annotator` per (scheme, chains) tuple for the lifetime of the worker, converts immunum's `Map<posCode, residue>` + `query_start` into the per-row result shape. |
|
|
225
|
+
| `utils/antibody-numbering/immunum-glue.js` | Browser/worker-safe port of `node_modules/immunum/immunum.js`. Byte-identical wasm-bindgen glue — only the Node-only `require('fs').readFileSync` top-level loader is replaced with an explicit `initImmunum(bytes)` entry point. |
|
|
226
|
+
| `utils/antibody-numbering/types.ts` | `ImmunumNumberingRow`, `ImmunumWorkerRequest`/`ImmunumWorkerResponse`, `IMMUNUM_SCHEMES`. |
|
|
227
|
+
|
|
228
|
+
**Expected output shape (matches antpack reference script `scripts/number_antibody.py`):**
|
|
229
|
+
|
|
230
|
+
A `DG.DataFrame` with 5 string columns, one row per input sequence:
|
|
231
|
+
|
|
232
|
+
| Column | Example | Purpose |
|
|
233
|
+
|---|---|---|
|
|
234
|
+
| `position_names` | `"1, 2, 3, ..., 27A, ..."` | Comma-separated scheme position codes, in order |
|
|
235
|
+
| `chain_type` | `"Heavy"` / `"Light"` / `""` | UI-facing chain group (immunum `H` → Heavy; `K`/`L` → Light) |
|
|
236
|
+
| `annotations_json` | JSON array of FR/CDR region defs | Scheme-specific FR1-4 / CDR1-3 with `start`/`end` as *position codes* (not char indices); resolved via `numbering_map` |
|
|
237
|
+
| `numbering_detail` | JSON `[{position, aa}, ...]` | Per-residue position → amino acid |
|
|
238
|
+
| `numbering_map` | JSON `{posCode: charIdx}` | Char index into the **extracted** (gap-free, uppercased) input sequence |
|
|
239
|
+
|
|
240
|
+
The numbering-ui dialog remaps `numbering_map` indices from ungapped to gapped via `buildUngappedToGappedMap()` so aligned MSA source columns still line up.
|
|
241
|
+
|
|
242
|
+
##### Adding a New Antibody Numbering Engine
|
|
243
|
+
|
|
244
|
+
Antibody numbering engines are discovered dynamically via `DG.Func.find({meta: {role: 'antibodyNumbering'}})`.
|
|
245
|
+
To add a new engine (in this package or any other):
|
|
246
|
+
|
|
247
|
+
1. Register a function with `meta.role: 'antibodyNumbering'` that takes `(df: DG.DataFrame, seqCol: DG.Column<string>, scheme: string)` and returns a `DG.DataFrame`.
|
|
248
|
+
2. Declare the **supported schemes** on the `scheme` parameter via the `choices` option (e.g. `{choices: ['imgt', 'kabat'], initialValue: 'imgt'}`). The dialog reads these at open time and when the user switches engines, so only schemes your engine actually supports show up in the dropdown.
|
|
249
|
+
3. The returned DataFrame **must** have the 5 string columns listed above with exactly those names — the numbering-ui dialog reads them by name.
|
|
250
|
+
4. `position_names` / `numbering_detail` / `numbering_map` must agree: every code in `position_names` must key `numbering_map` and have a matching entry in `numbering_detail`.
|
|
251
|
+
5. `annotations_json` is a JSON-serialized array of region definitions with `start` / `end` as scheme position codes (strings like `"1"`, `"105"`), **not** char indices. Use `SCHEME_REGIONS` from `@datagrok-libraries/bio/src/utils/macromolecule/numbering-schemes` for the canonical boundaries.
|
|
252
|
+
|
|
253
|
+
Reference implementation: `immunumAntibodyNumbering()` in `package.ts` and `numberAntibodyColumn()` in `utils/antibody-numbering/number-antibody.ts`.
|
|
254
|
+
|
|
255
|
+
Existing engines:
|
|
256
|
+
- **Bio** — `immunumAntibodyNumbering` (WASM, in-worker, IMGT/Kabat only — advertised via the `scheme` param's `choices`)
|
|
257
|
+
- **scripts/number_antibody.py** — Python/AntPack reference (non-commercial license, not shipped in production; kept for correctness cross-checks only)
|
|
258
|
+
|
|
213
259
|
#### Seq Helper — `src/utils/seq-helper/`
|
|
214
260
|
|
|
215
261
|
| File | Purpose |
|
|
@@ -308,6 +354,7 @@ Test entry point: `src/package-test.ts` — imports all test files, exports `tes
|
|
|
308
354
|
| `helm-tests.ts` | HELM-specific operations |
|
|
309
355
|
| `msa-tests.ts` | Multiple sequence alignment |
|
|
310
356
|
| `pepsea-tests.ts` | PepSeA Docker MSA |
|
|
357
|
+
| `antibody-numbering-tests.ts` | Immunum antibody numbering worker + DataFrame shape (IMGT/Kabat, heavy/light, empty-input handling) |
|
|
311
358
|
| `to-atomic-level-tests.ts` | Sequence → molfile conversion |
|
|
312
359
|
| `to-atomic-level-ui-tests.ts` | Atomic level UI widgets |
|
|
313
360
|
| `activity-cliffs-tests.ts` | Activity cliff detection |
|
|
@@ -382,6 +429,9 @@ Test entry point: `src/package-test.ts` — imports all test files, exports `tes
|
|
|
382
429
|
| MSA (kalign) | `src/utils/multiple-sequence-alignment.ts` |
|
|
383
430
|
| MSA (PepSeA Docker) | `src/utils/pepsea.ts` + `pepseaMsa()` in `src/package.ts` |
|
|
384
431
|
| Adding MSA engines | See "Adding a New MSA Engine" in Multiple Sequence Alignment section |
|
|
432
|
+
| Antibody numbering dialog | `src/utils/annotations/numbering-ui.ts` (`showNumberingSchemeDialog`) |
|
|
433
|
+
| Antibody numbering (immunum WASM in worker) | `src/utils/antibody-numbering/` (`immunum.worker.ts`, `immunum-client.ts`, `number-antibody.ts`, `immunum-glue.js`) |
|
|
434
|
+
| Adding antibody numbering engines | See "Adding a New Antibody Numbering Engine" in Antibody Numbering section |
|
|
385
435
|
| Notation conversion | `src/utils/convert.ts` |
|
|
386
436
|
| Seq → molfile conversion | `src/utils/sequence-to-mol.ts` |
|
|
387
437
|
| HELM → molfile pipeline | `src/utils/helm-to-molfile/converter/` |
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
packageName: Bio
|
|
2
|
+
description: Bioinformatics for macromolecules — sequence similarity/diversity/subsequence/substructure search, notation conversion (FASTA, HELM, BILN, separator), MSA (kalign, MAFFT/PepSeA), WebLogo, composition analysis, sequence space, activity cliffs, antibody numbering (IMGT/Kabat/Chothia/AHo), liability scanning, HELM↔atomic-level conversion, and monomer library management
|
|
3
|
+
keywords:
|
|
4
|
+
- bioinformatics
|
|
5
|
+
- macromolecule
|
|
6
|
+
- sequence
|
|
7
|
+
- peptide
|
|
8
|
+
- protein
|
|
9
|
+
- dna
|
|
10
|
+
- rna
|
|
11
|
+
- sar
|
|
12
|
+
- fasta
|
|
13
|
+
- helm
|
|
14
|
+
- biln
|
|
15
|
+
- separator notation
|
|
16
|
+
- notation conversion
|
|
17
|
+
- bam import
|
|
18
|
+
- sequence similarity search
|
|
19
|
+
- sequence diversity search
|
|
20
|
+
- subsequence search
|
|
21
|
+
- substructure search
|
|
22
|
+
- identity
|
|
23
|
+
- msa
|
|
24
|
+
- multiple sequence alignment
|
|
25
|
+
- kalign
|
|
26
|
+
- pepsea
|
|
27
|
+
- mafft
|
|
28
|
+
- weblogo
|
|
29
|
+
- composition analysis
|
|
30
|
+
- sequence space
|
|
31
|
+
- activity cliffs
|
|
32
|
+
- region extraction
|
|
33
|
+
- vd regions
|
|
34
|
+
- compare sequences
|
|
35
|
+
- antibody numbering
|
|
36
|
+
- IMGT
|
|
37
|
+
- Kabat
|
|
38
|
+
- Chothia
|
|
39
|
+
- AHo
|
|
40
|
+
- liability scanning
|
|
41
|
+
- deamidation
|
|
42
|
+
- oxidation
|
|
43
|
+
- annotations
|
|
44
|
+
- immunum
|
|
45
|
+
- atomic level
|
|
46
|
+
- molecules to helm
|
|
47
|
+
- sequence to molecule
|
|
48
|
+
- monomer library
|
|
49
|
+
- monomer collection
|
|
50
|
+
- monomer rendering
|
|
51
|
+
- sequence cell renderer
|
|
52
|
+
apiRef: src/package-api.ts
|
|
53
|
+
docsRef: ../../help/datagrok/solutions/domains/bio/bio.md
|
package/dist/455.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var bio;(()=>{"use strict";const t={V2K_RGP_SHIFT:8,V2K_RGP_LINE:"M RGP",V2K_A_LINE:"A ",V3K_COUNTS_SHIFT:14,V3K_IDX_SHIFT:7,V3K_HEADER_FIRST_LINE:"\nDatagrok macromolecule handler\n\n",V3K_HEADER_SECOND_LINE:" 0 0 0 0 0 0 999 V3000\n",V3K_BEGIN_CTAB_BLOCK:"M V30 BEGIN CTAB\n",V3K_END_CTAB_BLOCK:"M V30 END CTAB\n",V3K_BEGIN_COUNTS_LINE:"M V30 COUNTS ",V3K_COUNTS_LINE_ENDING:" 0 0 0\n",V3K_BEGIN_ATOM_BLOCK:"M V30 BEGIN ATOM\n",V3K_END_ATOM_BLOCK:"M V30 END ATOM\n",V3K_BEGIN_BOND_BLOCK:"M V30 BEGIN BOND\n",V3K_END_BOND_BLOCK:"M V30 END BOND\n",V3K_BOND_CONFIG:" CFG=",V3K_BEGIN_DATA_LINE:"M V30 ",V3K_END:"M END",PRECISION_FACTOR:1e4,DEOXYRIBOSE:{polymerType:"RNA",symbol:"d"},RIBOSE:{polymerType:"RNA",symbol:"r"},PHOSPHATE:{polymerType:"RNA",symbol:"p"},OXYGEN:"O",HYDROGEN:"H"};function o(t,o){return t[o.polymerType]?.[o.symbol]}
|
|
1
|
+
var bio;(()=>{"use strict";const t={V2K_RGP_SHIFT:8,V2K_RGP_LINE:"M RGP",V2K_A_LINE:"A ",V3K_COUNTS_SHIFT:14,V3K_IDX_SHIFT:7,V3K_HEADER_FIRST_LINE:"\nDatagrok macromolecule handler\n\n",V3K_HEADER_SECOND_LINE:" 0 0 0 0 0 0 999 V3000\n",V3K_BEGIN_CTAB_BLOCK:"M V30 BEGIN CTAB\n",V3K_END_CTAB_BLOCK:"M V30 END CTAB\n",V3K_BEGIN_COUNTS_LINE:"M V30 COUNTS ",V3K_COUNTS_LINE_ENDING:" 0 0 0\n",V3K_BEGIN_ATOM_BLOCK:"M V30 BEGIN ATOM\n",V3K_END_ATOM_BLOCK:"M V30 END ATOM\n",V3K_BEGIN_BOND_BLOCK:"M V30 BEGIN BOND\n",V3K_END_BOND_BLOCK:"M V30 END BOND\n",V3K_BOND_CONFIG:" CFG=",V3K_BEGIN_DATA_LINE:"M V30 ",V3K_END:"M END",PRECISION_FACTOR:1e4,DEOXYRIBOSE:{polymerType:"RNA",symbol:"d"},RIBOSE:{polymerType:"RNA",symbol:"r"},PHOSPHATE:{polymerType:"RNA",symbol:"p"},OXYGEN:"O",HYDROGEN:"H"};function o(t,o){return t[o.polymerType]?.[o.symbol]}var n,e,s,i;!function(t){t[t.SUGAR=0]="SUGAR",t[t.BASE=1]="BASE",t[t.PHOSPHATE=2]="PHOSPHATE"}(n||(n={}));class a extends Map{constructor(t){super(t)}}class l{constructor(t,o){this.molfile=t,this.monomers=o}static createEmpty(){return new l("",new a(null))}}new RegExp("[rd]\\((\\w)\\)p?","g");class h{constructor(t,o,n){this.name=t,this.alphabet=o,this.cutoff=n}}!function(t){t.FASTA="fasta",t.SEPARATOR="separator",t.HELM="helm",t.CUSTOM="custom",t.BILN="biln"}(e||(e={})),function(t){t.DNA="DNA",t.RNA="RNA",t.PT="PT",t.UN="UN"}(s||(s={})),function(t){t.aligned="aligned",t.alphabet="alphabet",t.alphabetSize=".alphabetSize",t.alphabetIsMultichar=".alphabetIsMultichar",t.separator="separator",t.isHelmCompatible=".isHelmCompatible",t.positionNames=".positionNames",t.positionLabels=".positionLabels",t.regions=".regions",t.positionShift=".positionShift",t.selectedPosition=".selectedPosition",t.polymerTypeColumnName=".polymerTypeColumnName",t.annotations=".annotations",t.numberingScheme=".numberingScheme",t.annotationColumnName=".annotationColumnName"}(i||(i={}));const r=new class{constructor(){this.fasta={peptide:new Set(["G","L","Y","S","E","Q","D","N","F","A","K","R","H","C","V","P","W","I","M","T"]),dna:new Set(["A","C","G","T"]),rna:new Set(["A","C","G","U"])}}};var c;function b(t){let o;switch(t){case c.BASE:case c.SUGAR:case c.LINKER:case c.NUCLEOTIDE:case"nucleotide":o="RNA";break;case c.AA:o="PEPTIDE";break;case c.CHEM:o="CHEM";break;case c.BLOB:o="BLOB";break;default:o="PEPTIDE",console.warn(`Unexpected HelmType '${t}'`)}return o}function f(n,e,i,h,r){if(0===n.length)return l.createEmpty();const c="RNA"===h&&!!r&&r.length===n.length&&(n.length%3==0||n.length%3==2),{atomCount:f,bondCount:S,needsCapping:d}=function(n,e,i,a,l){let h=0,r=0,c=0,f=!0,m=null,E=null;for(let t=0;t<n.length;++t){const s=n[t];if(""!==s.symbol){if("*"==s.symbol)throw new Error("Gap canonical symbol is '', not '*");m=o(e,{symbol:s.symbol,polymerType:b(s.biotype)}),h+=m.atoms.x.length,r+=m.bonds.bondTypes.length,c++,l&&t%3==2&&(E=m)}}if("PEPTIDE"===a)h+=1,r+=c,c>0&&((m?.meta?.rNodes?.length??0)<2||m?.terminalR2Atom?.toLowerCase()===t.HYDROGEN.toLowerCase())&&(f=!1,h-=1,r-=1);else if(l)h+=1,r+=c;else{const a=i===s.DNA?o(e,t.DEOXYRIBOSE):o(e,t.RIBOSE),l=o(e,t.PHOSPHATE);h+=(n.length-1)*l.atoms.x.length,h+=n.length*a.atoms.x.length,h+=1,r+=(n.length-1)*l.bonds.bondTypes.length,r+=n.length*a.bonds.bondTypes.length,r-=1,r+=3*n.length}return{atomCount:h,bondCount:r,needsCapping:f}}(n,e,i,h,c),A=new Array(f),y=new Array(S);let u,T=null,I=null;"PEPTIDE"===h?u=m:(u=N,c||(T=i===s.DNA?o(e,t.DEOXYRIBOSE):o(e,t.RIBOSE),I=o(e,t.PHOSPHATE)));const O={i:0,nodeShift:0,bondShift:0,backbonePositionShift:new Array(2).fill(0),branchPositionShift:new Array(2).fill(0),backboneAttachNode:0,branchAttachNode:0,flipFactor:1},C={sugar:T,phosphate:I,seqLength:c?Math.ceil(n.length/3):n.length,atomCount:f,bondCount:S},g=new a,B=[];let L,D=0;if(c)!function(t,n,e,s,i,a,l,h,r,c){const f=a.seqLength,m=t.length===3*f;for(let a=0;a<f;++a){i.i=a;const f=t[3*a],m=t[3*a+1],N=o(n,{symbol:f.symbol,polymerType:b(f.biotype)}),S=o(n,{symbol:m.symbol,polymerType:b(m.biotype)}),_=0===a?null:o(n,{symbol:t[3*(a-1)+2].symbol,polymerType:b(t[3*(a-1)+2].biotype)}),d=3*a;if(_){const o=i.nodeShift,n=i.bondShift;E(_,e,s,i),_.stereoAtoms?.forEach(t=>h.push(t+c())),r(_.atoms.x.length);const b=3*(a-1)+2,f=[];for(let t=o;t<i.nodeShift;++t)f.push(t);const m=[];for(let t=n;t<i.bondShift;++t)m.push(t);l.set(b,{biotype:t[b].biotype,symbol:t[b].symbol,atoms:f,bonds:m})}const A=i.nodeShift,y=i.bondShift;E(N,e,s,i),N.stereoAtoms?.forEach(t=>h.push(t+c())),r(N.atoms.x.length);const u=[];for(let t=A;t<i.nodeShift;++t)u.push(t);const T=[];for(let t=y;t<i.bondShift;++t)T.push(t);l.set(d,{biotype:f.biotype,symbol:f.symbol,atoms:u,bonds:T});const I=i.nodeShift,O=i.bondShift;p(S,e,s,i),S.stereoAtoms?.forEach(t=>h.push(t+c())),r(S.atoms.x.length);const C=[];for(let t=I;t<i.nodeShift;++t)C.push(t);const g=[];for(let t=O;t<i.bondShift;++t)g.push(t);l.set(d+1,{biotype:m.biotype,symbol:m.symbol,atoms:C,bonds:g})}if(m){const a=3*(f-1)+2,m=t[a],N=o(n,{symbol:m.symbol,polymerType:b(m.biotype)}),p=i.nodeShift,S=i.bondShift;E(N,e,s,i),N.stereoAtoms?.forEach(t=>h.push(t+c())),r(N.atoms.x.length);const _=[];for(let t=p;t<i.nodeShift;++t)_.push(t);const d=[];for(let t=S;t<i.bondShift;++t)d.push(t);l.set(a,{biotype:m.biotype,symbol:m.symbol,atoms:_,bonds:d})}}(n,e,A,y,O,C,g,B,t=>{D+=t},()=>D);else for(O.i=0;O.i<C.seqLength;++O.i){const t=n[O.i];if(""===t.symbol)continue;const s=o(e,{symbol:t.symbol,polymerType:b(t.biotype)});L=s.terminalR2Atom;const i=O.nodeShift,a=O.bondShift;u(s,A,y,O,C),s.stereoAtoms?.forEach(t=>B.push(t+D)),D+=s.atoms.x.length;const l=O.nodeShift-i,h=new Array(l);for(let t=0;t<l;++t)h[t]=i+t;const r=O.bondShift-a,c=new Array(r);for(let t=0;t<r;++t)c[t]=a+t;g.set(O.i,{biotype:t.biotype,symbol:t.symbol,atoms:h,bonds:c})}d&&function(o,n,e,s,i=t.OXYGEN){const a=e.nodeShift+1;o[s.atomCount]=t.V3K_BEGIN_DATA_LINE+a+" "+(i??t.OXYGEN)+" "+_(e.backbonePositionShift[0])+" "+e.flipFactor*_(e.backbonePositionShift[1])+" 0.000000 0\n";const l=e.backboneAttachNode,h=a;n[s.bondCount]=t.V3K_BEGIN_DATA_LINE+e.bondShift+" 1 "+l+" "+h+"\n"}(A,y,O,C,L??t.OXYGEN);const K=t.V3K_BEGIN_COUNTS_LINE+f+" "+S+t.V3K_COUNTS_LINE_ENDING;let V="";return V+=t.V3K_HEADER_FIRST_LINE,V+=t.V3K_HEADER_SECOND_LINE,V+=t.V3K_BEGIN_CTAB_BLOCK,V+=K,V+=t.V3K_BEGIN_ATOM_BLOCK,V+=A.join(""),V+=t.V3K_END_ATOM_BLOCK,V+=t.V3K_BEGIN_BOND_BLOCK,V+=y.join(""),V+=t.V3K_END_BOND_BLOCK,B.length>0&&(V+=function(t){const o=[];let n=`M V30 MDLV30/STEABS ATOMS=(${t.length}`;for(let e=0;e<t.length;e++){const s=`${n} ${t[e]}`;s.length>76?(o.push(`${n} -\n`),n=`M V30 ${t[e]}`):n=s,e===t.length-1&&o.push(`${n})\n`)}return`M V30 BEGIN COLLECTION\n${o.join("")}M V30 END COLLECTION\n`}(B)),V+=t.V3K_END_CTAB_BLOCK,V+=t.V3K_END,{molfile:V,monomers:g}}function m(t,o,n,e){e.flipFactor=(-1)**(e.i%2),E(t,o,n,e)}function E(o,n,e,s){!function(o,n,e){for(let s=0;s<o.atoms.atomTypes.length;++s){const i=e.nodeShift+s+1;n[e.nodeShift+s]=t.V3K_BEGIN_DATA_LINE+i+" "+o.atoms.atomTypes[s]+" "+_(e.backbonePositionShift[0]+o.atoms.x[s])+" "+_(e.backbonePositionShift[1]+e.flipFactor*o.atoms.y[s])+" "+o.atoms.kwargs[s]}}(o,n,s),S(o,e,s),function(o,n,e){if(0!==e.backboneAttachNode){const s=e.bondShift,i=e.backboneAttachNode,a=o.meta.terminalNodes[0]+e.nodeShift;n[e.bondShift-1]=t.V3K_BEGIN_DATA_LINE+s+" 1 "+i+" "+a+"\n"}}(o,e,s),null!==o.meta.branchShift&&o.meta.terminalNodes.length>2&&function(t,o){o.branchAttachNode=o.nodeShift+t.meta.terminalNodes[2];for(let n=0;n<2;++n)o.branchPositionShift[n]=o.backbonePositionShift[n]+t.meta.branchShift[n]}(o,s),function(t,o){o.backboneAttachNode=o.nodeShift+t.meta.terminalNodes[1],o.bondShift+=t.bonds.atomPairs.length+1,o.nodeShift+=t.atoms.atomTypes.length,o.backbonePositionShift[0]+=t.meta.backboneShift?.[0]??0,o.backbonePositionShift[1]+=o.flipFactor*(t.meta.backboneShift?.[1]??0)}(o,s)}function N(t,o,n,e,s){if(0===e.i)E(s.sugar,o,n,e);else for(const t of[s.phosphate,s.sugar])E(t,o,n,e);p(t,o,n,e)}function p(o,n,e,s){!function(o,n,e){for(let s=0;s<o.atoms.atomTypes.length;++s){const i=e.nodeShift+s+1;n[e.nodeShift+s]=t.V3K_BEGIN_DATA_LINE+i+" "+o.atoms.atomTypes[s]+" "+_(e.branchPositionShift[0]+o.atoms.x[s])+" "+_(e.branchPositionShift[1]+e.flipFactor*o.atoms.y[s])+" "+o.atoms.kwargs[s]}}(o,n,s),S(o,e,s),function(o,n,e){const s=e.bondShift,i=e.branchAttachNode,a=o.meta.terminalNodes[0]+e.nodeShift;n[s-1]=t.V3K_BEGIN_DATA_LINE+s+" 1 "+i+" "+a+"\n"}(o,e,s);const i=s.bondShift,a=s.branchAttachNode,l=o.meta.terminalNodes[0]+s.nodeShift;e[i-1]=t.V3K_BEGIN_DATA_LINE+i+" 1 "+a+" "+l+"\n",s.bondShift+=o.bonds.atomPairs.length+1,s.nodeShift+=o.atoms.atomTypes.length}function S(o,n,e){for(let s=0;s<o.bonds.atomPairs.length;++s){const i=e.bondShift+s+1,a=o.bonds.atomPairs[s][0]+e.nodeShift,l=o.bonds.atomPairs[s][1]+e.nodeShift;let h="";if(o.bonds.bondConfiguration.has(s)){let t=o.bonds.bondConfiguration.get(s);e.flipFactor<0&&(t=1===t?3:1),h=" CFG="+t}const r=o.bonds.kwargs.has(s)?" "+o.bonds.kwargs.get(s):"";n[e.bondShift+s]=t.V3K_BEGIN_DATA_LINE+i+" "+o.bonds.bondTypes[s]+" "+a+" "+l+h+r+"\n"}}function _(o){return Math.round(t.PRECISION_FACTOR*o)/t.PRECISION_FACTOR}new h(s.PT,r.fasta.peptide,.5),new h(s.DNA,r.fasta.dna,.55),new h(s.RNA,r.fasta.rna,.55),e.FASTA,e.SEPARATOR,e.HELM,e.BILN,function(t){t.BASE="HELM_BASE",t.SUGAR="HELM_SUGAR",t.LINKER="HELM_LINKER",t.AA="HELM_AA",t.CHEM="HELM_CHEM",t.BLOB="HELM_BLOB",t.NUCLEOTIDE="HELM_NUCLETIDE"}(c||(c={})),onmessage=t=>{const{seqList:o,rolesList:n,monomersDict:e,alphabet:s,polymerType:i,start:a,end:l}=t.data,h=new Array(l-a),r=new Array(0);for(let t=a;t<l;++t)try{const l=o[t],r=n?n[t]:void 0;h[t-a]=f(l,e,s,i,r)}catch(o){const n=`Cannot get molfile of row #${t}: ${o instanceof Error?o.message:o.toString()}.`;r.push(n)}postMessage({molfiles:h,warnings:r})},bio={}})();
|
|
2
2
|
//# sourceMappingURL=455.js.map
|
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/macromolecule/consts.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/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","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[\"annotations\"] = \".annotations\";\n TAGS[\"numberingScheme\"] = \".numberingScheme\";\n TAGS[\"annotationColumnName\"] = \".annotationColumnName\";\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/** Tag on Monomer columns storing the nqName of a function that returns an IMonomerCanonicalizer.\n * The `.%` prefix ensures this tag is persisted with projects. */\nexport const MONOMER_CANONICALIZER_FUNC_TAG = '.%monomer-canonicalizer-func';\n/** Column temp key for the cached IMonomerCanonicalizer instance */\nexport const MONOMER_CANONICALIZER_TEMP = 'monomer-canonicalizer';\nexport const NOTATION_PROVIDER_CONSTRUCTOR_ROLE = 'notationProviderConstructor';\n//# sourceMappingURL=consts.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","import { NOTATION_PROVIDER_CONSTRUCTOR_ROLE } from './consts';\nexport class NotationProviderBase {\n /** Name of the custom notation */\n static get notationName() {\n return 'Custom';\n }\n ;\n /** flag to let bio know if this provider implements method for converting helm to it */\n static get implementsFromHelm() {\n return false;\n }\n ;\n /** Method for converting HELM to this notation */\n static convertFromHelm(helm, options) {\n throw new Error(`Method convertFromHelm not implemented for this notation provider`);\n }\n ;\n static async getProviderConstructors() {\n // this is terrible, I know, but otherwise this gets put in webworkers and fails due to DG resolution)))\n // @ts-ignore\n if (window?.DG) {\n // @ts-ignore\n const constFuncs = window.DG.Func.find({ meta: { role: NOTATION_PROVIDER_CONSTRUCTOR_ROLE } });\n return Promise.all(constFuncs.map((f) => f.apply({})));\n }\n return [];\n }\n}\n/** 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","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","NOTATION","ALPHABET","TAGS","RegExp","CandidateType","name","alphabet","cutoff","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":"2BAAO,MAAMA,EAAqB,CAE9BC,cAAe,EACfC,aAAc,SACdC,WAAY,MAEZC,iBAAkB,GAClBC,cAAe,EACfC,sBAAuB,uCACvBC,uBAAwB,4CACxBC,qBAAsB,sBACtBC,mBAAoB,oBACpBC,sBAAuB,iBACvBC,uBAAwB,WACxBC,qBAAsB,sBACtBC,mBAAoB,oBACpBC,qBAAsB,sBACtBC,mBAAoB,oBACpBC,gBAAiB,QACjBC,oBAAqB,UACrBC,QAAS,SACTC,iBAAkB,IAElBC,YAAa,CAAEC,YAAa,MAA8BC,OAAQ,KAClEC,OAAQ,CAAEF,YAAa,MAA8BC,OAAQ,KAC7DE,UAAW,CAAEH,YAAa,MAA8BC,OAAQ,KAChEG,OAAQ,IACRC,SAAU,KC3BP,SAASC,EAAYC,EAAMC,GAC9B,OAAOD,EAAKC,EAAOR,eAAeQ,EAAOP,OAC7C,CAWO,IAAIQ,ECXAC,EAQAC,EAQAC,GDJX,SAAWH,GACPA,EAAeA,EAAsB,MAAI,GAAK,QAC9CA,EAAeA,EAAqB,KAAI,GAAK,OAC7CA,EAAeA,EAA0B,UAAI,GAAK,WACrD,CAJD,CAIGA,IAAmBA,EAAiB,CAAC,IACjC,MAAMI,UAAmBC,IAC5B,WAAAC,CAAYC,GACRC,MAAMD,EACV,EAGG,MAAME,EACT,WAAAH,CAAYI,EAASC,GACjBC,KAAKF,QAAUA,EACfE,KAAKD,SAAWA,CACpB,CACA,kBAAOE,GAAgB,OAAO,IAAIJ,EAAe,GAAI,IAAIL,EAAW,MAAQ,EEa5C,IAAIU,OAAO,oBAA0E,KCdlH,MAAMC,EACT,WAAAT,CAAYU,EAAMC,EAAUC,GACxBN,KAAKI,KAAOA,EACZJ,KAAKK,SAAWA,EAChBL,KAAKM,OAASA,CAClB,GF/BJ,SAAWjB,GACPA,EAAgB,MAAI,QACpBA,EAAoB,UAAI,YACxBA,EAAe,KAAI,OACaA,EAAiB,OAAI,SACrBA,EAAe,KAAI,MACtD,CAND,CAMGA,IAAaA,EAAW,CAAC,IAE5B,SAAWC,GACPA,EAAc,IAAI,MAClBA,EAAc,IAAI,MAClBA,EAAa,GAAI,KAEjBA,EAAa,GAAI,IACpB,CAND,CAMGA,IAAaA,EAAW,CAAC,IAE5B,SAAWC,GACPA,EAAc,QAAI,UAClBA,EAAe,SAAI,WACnBA,EAAmB,aAAI,gBACvBA,EAA0B,oBAAI,uBAC9BA,EAAgB,UAAI,YACpBA,EAAuB,iBAAI,oBAC3BA,EAAoB,cAAI,iBACxBA,EAAqB,eAAI,kBACzBA,EAAc,QAAI,WAClBA,EAAoB,cAAI,iBACxBA,EAAuB,iBAAI,oBAC3BA,EAA4B,sBAAI,yBAChCA,EAAkB,YAAI,eACtBA,EAAsB,gBAAI,mBAC1BA,EAA2B,qBAAI,uBAClC,CAhBD,CAgBGA,IAASA,EAAO,CAAC,IAEb,MAIMgB,EAAY,IAAI,MACzB,WAAAb,GACIM,KAAKQ,MAAQ,CACTC,QAAS,IAAIC,IAAI,CACb,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC7C,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAEjDC,IAAK,IAAID,IAAI,CAAC,IAAK,IAAK,IAAK,MAC7BE,IAAK,IAAIF,IAAI,CAAC,IAAK,IAAK,IAAK,MAErC,GGnDG,IAAIG,ECgBJ,SAASC,EAAsBC,GAClC,IAAIpC,EACJ,OAAQoC,GACJ,KAAKF,EAAUG,KACf,KAAKH,EAAUI,MACf,KAAKJ,EAAUK,OACf,KAAKL,EAAUM,WAEf,IAAK,aACDxC,EAAc,MACd,MACJ,KAAKkC,EAAUO,GACXzC,EAAc,UACd,MACJ,KAAKkC,EAAUQ,KACX1C,EAAc,OACd,MACJ,KAAKkC,EAAUS,KACX3C,EAAc,OACd,MACJ,QACIA,EAAc,UACd4C,QAAQC,KAAK,wBAAwBT,MAE7C,OAAOpC,CACX,CCCO,SAAS8C,EAAoBC,EAAYC,EAActB,EAAU1B,EAAaiD,GACjF,GAA0B,IAAtBF,EAAWG,OAEX,OAAOhC,EAAeI,cAK1B,MAAM6B,EAA8B,QAAhBnD,KAAuDiD,GACvEA,EAAMC,SAAWH,EAAWG,SAAWH,EAAWG,OAAS,GAAM,GAAKH,EAAWG,OAAS,GAAM,IAE9F,UAAEE,EAAS,UAAEC,EAAS,aAAEC,GA+PlC,SAAoCP,EAAYC,EAActB,EAAU1B,EAAamD,GACjF,IAAIC,EAAY,EACZC,EAAY,EACZE,EAAe,EACfD,GAAe,EACfE,EAAmB,KACnBC,EAAqB,KAEzB,IAAK,IAAIC,EAAI,EAAGA,EAAIX,EAAWG,SAAUQ,EAAG,CACxC,MAAMC,EAAaZ,EAAWW,GAC9B,GLnQkB,KKmQdC,EAAW1D,OAAf,CAEA,GAAyB,KAArB0D,EAAW1D,OACX,MAAM,IAAI2D,MAAM,sCACpBJ,EAAmBlD,EAAY0C,EAAc,CAAE/C,OAAQ0D,EAAW1D,OAAQD,YAAamC,EAAsBwB,EAAWE,WACxHT,GAAaI,EAAiBM,MAAMC,EAAEb,OACtCG,GAAaG,EAAiBQ,MAAMC,UAAUf,OAC9CK,IAGIJ,GAAeO,EAAI,GAAM,IACzBD,EAAqBD,EAVb,CAWhB,CAEA,GAAoB,YAAhBxD,EAEAoD,GAAa,EAEbC,GAAaE,EAITA,EAAe,KACVC,GAAkBU,MAAMC,QAAQjB,QAAU,GAAK,GAAKM,GAAkBY,gBAAgBC,gBAAkB,EAAEhE,SAASgE,iBACpHf,GAAe,EACfF,GAAa,EACbC,GAAa,QAIpB,GAAIF,EASLC,GAAa,EACbC,GAAaE,MAEZ,CACD,MAAMe,EAAS5C,IAAaf,EAAS4D,IACjCjE,EAAY0C,EAAc,EAAEjD,aAAeO,EAAY0C,EAAc,EAAE9C,QACrEsE,EAAYlE,EAAY0C,EAAc,EAAE7C,WAE9CiD,IAAcL,EAAWG,OAAS,GAAKsB,EAAUV,MAAMC,EAAEb,OAEzDE,GAAaL,EAAWG,OAASoB,EAAMR,MAAMC,EAAEb,OAE/CE,GAAa,EAEbC,IAAcN,EAAWG,OAAS,GAAKsB,EAAUR,MAAMC,UAAUf,OAEjEG,GAAaN,EAAWG,OAASoB,EAAMN,MAAMC,UAAUf,OAEvDG,GAAa,EAEbA,GAAiC,EAApBN,EAAWG,MAC5B,CACA,MAAO,CAAEE,YAAWC,YAAWC,eACnC,CAvUmDmB,CAA2B1B,EAAYC,EAActB,EAAU1B,EAAamD,GAErHuB,EAAmB,IAAIC,MAAMvB,GAC7BwB,EAAmB,IAAID,MAAMtB,GACnC,IAAIwB,EACAP,EAAQ,KACRE,EAAY,KACI,YAAhBxE,EACA6E,EAAuBC,GAEvBD,EAAuBE,EAGlB5B,IACDmB,EAAS5C,IAAaf,EAAS4D,IAAOjE,EAAY0C,EAAc,EAAEjD,aAAeO,EAAY0C,EAAc,EAAE9C,QAC7GsE,EAAYlE,EAAY0C,EAAc,EAAE7C,aAGhD,MAAM6E,EAAI,CACNtB,EAAG,EACHuB,UAAW,EACXC,UAAW,EACXC,sBAAuB,IAAIR,MAAM,GAAGS,KAAK,GACzCC,oBAAqB,IAAIV,MAAM,GAAGS,KAAK,GACvCE,mBAAoB,EACpBC,iBAAkB,EAClBC,WAAY,GAEVC,EAAK,CACPnB,MAAOA,EACPE,UAAWA,EAEXkB,UAAWvC,EAAcwC,KAAKC,KAAK7C,EAAWG,OAAS,GAAKH,EAAWG,OACvEE,UAAWA,EACXC,UAAWA,GAETjC,EAAW,IAAIP,EACfgF,EAAmB,GACzB,IACIC,EADAC,EAAS,EAEb,GAAI5C,GAgTR,SAA4BJ,EAAYC,EAAc0B,EAAkBE,EAAkBI,EAAGS,EAAIrE,EAAUyE,EAAkBG,EAAUC,GACnI,MAAMC,EAAIT,EAAGC,UAEPS,EAAepD,EAAWG,SAAW,EAAIgD,EAC/C,IAAK,IAAIE,EAAI,EAAGA,EAAIF,IAAKE,EAAG,CACxBpB,EAAEtB,EAAI0C,EACN,MAAMC,EAAUtD,EAAW,EAAIqD,GACzBE,EAASvD,EAAW,EAAIqD,EAAI,GAC5BG,EAASjG,EAAY0C,EAAc,CAAE/C,OAAQoG,EAAQpG,OAAQD,YAAamC,EAAsBkE,EAAQxC,WACxG2C,EAAQlG,EAAY0C,EAAc,CAAE/C,OAAQqG,EAAOrG,OAAQD,YAAamC,EAAsBmE,EAAOzC,WAIrG4C,EAAmB,IAANL,EAAW,KAC1B9F,EAAY0C,EAAc,CAAE/C,OAAQ8C,EAAW,GAAKqD,EAAI,GAAK,GAAGnG,OAC5DD,YAAamC,EAAsBY,EAAW,GAAKqD,EAAI,GAAK,GAAGvC,WAEjE6C,EAAc,EAAIN,EACxB,GAAIK,EAAW,CACX,MAAME,EAAgB3B,EAAEC,UAClB2B,EAAgB5B,EAAEE,UACxB2B,EAA6BJ,EAAW/B,EAAkBE,EAAkBI,GAC5EyB,EAAUK,aAAaC,QAASrD,GAAMmC,EAAiBmB,KAAKtD,EAAIuC,MAChED,EAASS,EAAU3C,MAAMC,EAAEb,QAE3B,MAAM+D,EAAc,GAAKb,EAAI,GAAK,EAC5Bc,EAAQ,GACd,IAAK,IAAIC,EAAIR,EAAeQ,EAAInC,EAAEC,YAAakC,EAC3CD,EAAMF,KAAKG,GACf,MAAMC,EAAQ,GACd,IAAK,IAAIC,EAAIT,EAAeS,EAAIrC,EAAEE,YAAamC,EAC3CD,EAAMJ,KAAKK,GACfjG,EAASkG,IAAIL,EAAa,CACtBpD,QAASd,EAAWkE,GAAapD,QACjC5D,OAAQ8C,EAAWkE,GAAahH,OAChC6D,MAAOoD,EAAOlD,MAAOoD,GAE7B,CACA,MAAMG,EAAiBvC,EAAEC,UACnBuC,EAAiBxC,EAAEE,UACzB2B,EAA6BN,EAAQ7B,EAAkBE,EAAkBI,GACzEuB,EAAOO,aAAaC,QAASrD,GAAMmC,EAAiBmB,KAAKtD,EAAIuC,MAC7DD,EAASO,EAAOzC,MAAMC,EAAEb,QACxB,MAAMuE,EAAS,GACf,IAAK,IAAIN,EAAII,EAAgBJ,EAAInC,EAAEC,YAAakC,EAC5CM,EAAOT,KAAKG,GAChB,MAAMO,EAAS,GACf,IAAK,IAAIL,EAAIG,EAAgBH,EAAIrC,EAAEE,YAAamC,EAC5CK,EAAOV,KAAKK,GAChBjG,EAASkG,IAAIZ,EAAa,CACtB7C,QAASwC,EAAQxC,QAAS5D,OAAQoG,EAAQpG,OAC1C6D,MAAO2D,EAAQzD,MAAO0D,IAE1B,MAAMC,EAAgB3C,EAAEC,UAClB2C,EAAgB5C,EAAEE,UACxB2C,EAA2BrB,EAAO9B,EAAkBE,EAAkBI,GACtEwB,EAAMM,aAAaC,QAASrD,GAAMmC,EAAiBmB,KAAKtD,EAAIuC,MAC5DD,EAASQ,EAAM1C,MAAMC,EAAEb,QACvB,MAAM4E,EAAS,GACf,IAAK,IAAIX,EAAIQ,EAAeR,EAAInC,EAAEC,YAAakC,EAC3CW,EAAOd,KAAKG,GAChB,MAAMY,EAAS,GACf,IAAK,IAAIV,EAAIO,EAAeP,EAAIrC,EAAEE,YAAamC,EAC3CU,EAAOf,KAAKK,GAChBjG,EAASkG,IAAIZ,EAAc,EAAG,CAC1B7C,QAASyC,EAAOzC,QAAS5D,OAAQqG,EAAOrG,OACxC6D,MAAOgE,EAAQ9D,MAAO+D,GAE9B,CAOA,GAAI5B,EAAc,CACd,MAAM6B,EAAc,GAAK9B,EAAI,GAAK,EAC5B+B,EAAalF,EAAWiF,GACxBE,EAAY5H,EAAY0C,EAAc,CAAE/C,OAAQgI,EAAWhI,OAAQD,YAAamC,EAAsB8F,EAAWpE,WACjHsE,EAAiBnD,EAAEC,UACnBmD,EAAiBpD,EAAEE,UACzB2B,EAA6BqB,EAAWxD,EAAkBE,EAAkBI,GAC5EkD,EAAUpB,aAAaC,QAASrD,GAAMmC,EAAiBmB,KAAKtD,EAAIuC,MAChED,EAASkC,EAAUpE,MAAMC,EAAEb,QAC3B,MAAMmF,EAAS,GACf,IAAK,IAAIlB,EAAIgB,EAAgBhB,EAAInC,EAAEC,YAAakC,EAC5CkB,EAAOrB,KAAKG,GAChB,MAAMmB,EAAS,GACf,IAAK,IAAIjB,EAAIe,EAAgBf,EAAIrC,EAAEE,YAAamC,EAC5CiB,EAAOtB,KAAKK,GAChBjG,EAASkG,IAAIU,EAAa,CACtBnE,QAASoE,EAAWpE,QAAS5D,OAAQgI,EAAWhI,OAChD6D,MAAOuE,EAAQrE,MAAOsE,GAE9B,CACJ,CA9YQC,CAAmBxF,EAAYC,EAAc0B,EAAkBE,EAAkBI,EAAGS,EAAIrE,EAAUyE,EAAmBsB,IAAQpB,GAAUoB,GAAM,IAAMpB,QAGnJ,IAAKf,EAAEtB,EAAI,EAAGsB,EAAEtB,EAAI+B,EAAGC,YAAaV,EAAEtB,EAAG,CACrC,MAAMC,EAAaZ,EAAWiC,EAAEtB,GAChC,GLxCc,KKwCVC,EAAW1D,OACX,SACJ,MAAMuI,EAAUlI,EAAY0C,EAAc,CAAE/C,OAAQ0D,EAAW1D,OAAQD,YAAamC,EAAsBwB,EAAWE,WACrHiC,EAAyB0C,EAAQpE,eACjC,MAAMqE,EAAazD,EAAEC,UACfyD,EAAa1D,EAAEE,UACrBL,EAAqB2D,EAAS9D,EAAkBE,EAAkBI,EAAGS,GAErE+C,EAAQ1B,aAAaC,QAASrD,GAAMmC,EAAiBmB,KAAKtD,EAAIqC,IAC9DA,GAAUyC,EAAQ1E,MAAMC,EAAEb,OAC1B,MAAMyF,EAAa3D,EAAEC,UAAYwD,EAC3BG,EAAY,IAAIjE,MAAMgE,GAC5B,IAAK,IAAIE,EAAM,EAAGA,EAAMF,IAAcE,EAClCD,EAAUC,GAAOJ,EAAaI,EAClC,MAAMC,EAAa9D,EAAEE,UAAYwD,EAC3BK,EAAY,IAAIpE,MAAMmE,GAC5B,IAAK,IAAIE,EAAM,EAAGA,EAAMF,IAAcE,EAClCD,EAAUC,GAAON,EAAaM,EAClC5H,EAASkG,IAAItC,EAAEtB,EAAG,CACdG,QAASF,EAAWE,QACpB5D,OAAQ0D,EAAW1D,OACnB6D,MAAO8E,EAAW5E,MAAO+E,GAEjC,CAGAzF,GAiDR,SAA8BoB,EAAkBE,EAAkBI,EAAGS,EAAIwD,EAAkB,EAAE7I,QAEzF,MAAM8I,EAAUlE,EAAEC,UAAY,EAC9BP,EAAiBe,EAAGrC,WAAa,EAAExD,oBAAsBsJ,EAAU,KAC9DD,GAAmB,EAAE7I,QAAU,IAAM+I,EAAcnE,EAAEG,sBAAsB,IAAM,IAClFH,EAAEQ,WAAa2D,EAAcnE,EAAEG,sBAAsB,IAFxB,gBAIjC,MAAMiE,EAAYpE,EAAEM,mBACd+D,EAAaH,EACnBtE,EAAiBa,EAAGpC,WAAa,EAAEzD,oBAAsBoF,EAAEE,UAA1B,MACnBkE,EAAY,IAAMC,EAAa,IACjD,CA3DQC,CAAqB5E,EAAkBE,EAAkBI,EAAGS,EAAIK,GAA0B,EAAE1F,QAChG,MAAMmJ,EAAoB,EAAElK,sBAAwB+D,EAAY,IAAMC,EAAY,EAAE/D,uBAIpF,IAAIkK,EAAS,GAgBb,OAfAA,GAAU,EAAEvK,sBACZuK,GAAU,EAAEtK,uBACZsK,GAAU,EAAErK,qBACZqK,GAAUD,EACVC,GAAU,EAAEjK,qBACZiK,GAAU9E,EAAiB+E,KAAK,IAChCD,GAAU,EAAEhK,mBACZgK,GAAU,EAAE/J,qBACZ+J,GAAU5E,EAAiB6E,KAAK,IAChCD,GAAU,EAAE9J,mBACRmG,EAAiB3C,OAAS,IAC1BsG,GAMR,SAA4BE,GAGxB,MACMC,EAAY,GAClB,IAAIC,EAAmB,+BAA+BF,EAAWxG,SACjE,IAAK,IAAIQ,EAAI,EAAGA,EAAIgG,EAAWxG,OAAQQ,IAAK,CACxC,MAAMmG,EAAa,GAAGD,KAAoBF,EAAWhG,KACjDmG,EAAW3G,OALA,IAMXyG,EAAU3C,KAAK,GAAG4C,SAClBA,EAAmB,UAAUF,EAAWhG,MAGxCkG,EAAmBC,EAEnBnG,IAAMgG,EAAWxG,OAAS,GAC1ByG,EAAU3C,KAAK,GAAG4C,OAC1B,CACA,MAAO,4BAA4BD,EAAUF,KAAK,4BACtD,CAzBkBK,CAAmBjE,IACjC2D,GAAU,EAAEpK,mBACZoK,GAAU,EAAE3J,QAEL,CAAEsB,QAASqI,EAAQpI,SAAUA,EACxC,CAsCA,SAAS0D,EAAuB0D,EAAS9D,EAAkBE,EAAkBI,GACzEA,EAAEQ,aAAe,KAAOR,EAAEtB,EAAI,GAC9BmD,EAA6B2B,EAAS9D,EAAkBE,EAAkBI,EAC9E,CACA,SAAS6B,EAA6B2B,EAAS9D,EAAkBE,EAAkBI,IAmDnF,SAAuBwD,EAAS9D,EAAkBM,GAC9C,IAAK,IAAI+E,EAAI,EAAGA,EAAIvB,EAAQ1E,MAAMkG,UAAU9G,SAAU6G,EAAG,CACrD,MAAMb,EAAUlE,EAAEC,UAAY8E,EAAI,EAClCrF,EAAiBM,EAAEC,UAAY8E,GAAK,EAAEnK,oBAAsBsJ,EAAU,IAClEV,EAAQ1E,MAAMkG,UAAUD,GAAK,IAC7BZ,EAAcnE,EAAEG,sBAAsB,GAAKqD,EAAQ1E,MAAMC,EAAEgG,IAAM,IACjEZ,EAAcnE,EAAEG,sBAAsB,GAAKH,EAAEQ,WAAagD,EAAQ1E,MAAMmG,EAAEF,IAC1E,IAAMvB,EAAQ1E,MAAMoG,OAAOH,EACnC,CACJ,CAzDII,CAAc3B,EAAS9D,EAAkBM,GAEzCoF,EAAc5B,EAAS5D,EAAkBI,GAwF7C,SAAgCwD,EAAS5D,EAAkBI,GACvD,GAA6B,IAAzBA,EAAEM,mBAA0B,CAC5B,MAAM+E,EAAUrF,EAAEE,UACZkE,EAAYpE,EAAEM,mBACd+D,EAAab,EAAQtE,KAAKoG,cAAc,GAAKtF,EAAEC,UACrDL,EAAiBI,EAAEE,UAAY,GAAK,EAAEtF,oBAAsByK,EAAxB,MACtBjB,EAAY,IAAMC,EAAa,IACjD,CACJ,CA9FIkB,CAAuB/B,EAAS5D,EAAkBI,GAEjB,OAA7BwD,EAAQtE,KAAKsG,aAAwBhC,EAAQtE,KAAKoG,cAAcpH,OAAS,GAqCjF,SAA+BsF,EAASxD,GACpCA,EAAEO,iBAAmBP,EAAEC,UAAYuD,EAAQtE,KAAKoG,cAAc,GAC9D,IAAK,IAAI5G,EAAI,EAAGA,EAAI,IAAKA,EACrBsB,EAAEK,oBAAoB3B,GAAKsB,EAAEG,sBAAsBzB,GAAK8E,EAAQtE,KAAKsG,YAAY9G,EACzF,CAxCQ+G,CAAsBjC,EAASxD,GA6BvC,SAAuCwD,EAASxD,GAC5CA,EAAEM,mBAAqBN,EAAEC,UAAYuD,EAAQtE,KAAKoG,cAAc,GAChEtF,EAAEE,WAAasD,EAAQxE,MAAM0G,UAAUxH,OAAS,EAChD8B,EAAEC,WAAauD,EAAQ1E,MAAMkG,UAAU9G,OACvC8B,EAAEG,sBAAsB,IAAMqD,EAAQtE,KAAKyG,gBAAgB,IAAM,EACjE3F,EAAEG,sBAAsB,IAAMH,EAAEQ,YAAcgD,EAAQtE,KAAKyG,gBAAgB,IAAM,EACrF,CAjCIC,CAA8BpC,EAASxD,EAC3C,CACA,SAASD,EAAwB8F,EAAYnG,EAAkBE,EAAkBI,EAAGS,GAGhF,GAAY,IAART,EAAEtB,EACFmD,EAA6BpB,EAAGnB,MAAOI,EAAkBE,EAAkBI,QAE3E,IAAK,MAAMwD,IAAW,CAAC/C,EAAGjB,UAAWiB,EAAGnB,OACpCuC,EAA6B2B,EAAS9D,EAAkBE,EAAkBI,GAElF6C,EAA2BgD,EAAYnG,EAAkBE,EAAkBI,EAC/E,CACA,SAAS6C,EAA2BW,EAAS9D,EAAkBE,EAAkBI,IAqCjF,SAA6BwD,EAAS9D,EAAkBM,GACpD,IAAK,IAAI+E,EAAI,EAAGA,EAAIvB,EAAQ1E,MAAMkG,UAAU9G,SAAU6G,EAAG,CACrD,MAAMb,EAAUlE,EAAEC,UAAY8E,EAAI,EAClCrF,EAAiBM,EAAEC,UAAY8E,GAAK,EAAEnK,oBAAsBsJ,EAAU,IAClEV,EAAQ1E,MAAMkG,UAAUD,GAAK,IAC7BZ,EAAcnE,EAAEK,oBAAoB,GAAKmD,EAAQ1E,MAAMC,EAAEgG,IAAM,IAC/DZ,EAAcnE,EAAEK,oBAAoB,GAAKL,EAAEQ,WAAagD,EAAQ1E,MAAMmG,EAAEF,IACxE,IAAMvB,EAAQ1E,MAAMoG,OAAOH,EACnC,CACJ,CA7CIe,CAAoBtC,EAAS9D,EAAkBM,GAC/CoF,EAAc5B,EAAS5D,EAAkBI,GA4E7C,SAAkC+F,EAAenG,EAAkBI,GAC/D,MAAMqF,EAAUrF,EAAEE,UACZkE,EAAYpE,EAAEO,iBACd8D,EAAa0B,EAAc7G,KAAKoG,cAAc,GAAKtF,EAAEC,UAC3DL,EAAiByF,EAAU,GAAK,EAAEzK,oBAAsByK,EAAxB,MAClBjB,EAAY,IAAMC,EAAa,IACjD,CAjFI2B,CAAyBxC,EAAS5D,EAAkBI,GAEpD,MAAMqF,EAAUrF,EAAEE,UACZkE,EAAYpE,EAAEO,iBACd8D,EAAab,EAAQtE,KAAKoG,cAAc,GAAKtF,EAAEC,UACrDL,EAAiByF,EAAU,GAAK,EAAEzK,oBAAsByK,EAAxB,MAClBjB,EAAY,IAAMC,EAAa,KAE7CrE,EAAEE,WAAasD,EAAQxE,MAAM0G,UAAUxH,OAAS,EAChD8B,EAAEC,WAAauD,EAAQ1E,MAAMkG,UAAU9G,MAC3C,CAkCA,SAASkH,EAAc5B,EAAS5D,EAAkBI,GAE9C,IAAK,IAAI+E,EAAI,EAAGA,EAAIvB,EAAQxE,MAAM0G,UAAUxH,SAAU6G,EAAG,CACrD,MAAMM,EAAUrF,EAAEE,UAAY6E,EAAI,EAC5BX,EAAYZ,EAAQxE,MAAM0G,UAAUX,GAAG,GAAK/E,EAAEC,UAC9CoE,EAAab,EAAQxE,MAAM0G,UAAUX,GAAG,GAAK/E,EAAEC,UACrD,IAAIgG,EAAU,GACd,GAAIzC,EAAQxE,MAAMkH,kBAAkBC,IAAIpB,GAAI,CAExC,IAAIqB,EAAc5C,EAAQxE,MAAMkH,kBAAkBG,IAAItB,GAClD/E,EAAEQ,WAAa,IACf4F,EAA+B,IAAhBA,EAAqB,EAAI,GAC5CH,EAAU,QAAUG,CACxB,CACA,MAAMlB,EAAS1B,EAAQxE,MAAMkG,OAAOiB,IAAIpB,GACpC,IAAMvB,EAAQxE,MAAMkG,OAAOmB,IAAItB,GAAK,GACxCnF,EAAiBI,EAAEE,UAAY6E,GAAK,EAAEnK,oBAAsByK,EAAU,IAClE7B,EAAQxE,MAAMC,UAAU8F,GAAK,IAC7BX,EAAY,IAAMC,EAAa4B,EAAUf,EAAS,IAC1D,CACJ,CAuNO,SAASf,EAAcpF,GAC1B,OAAO4B,KAAK2F,MAAM,EAAExL,iBAAmBiE,GAAK,EAAEjE,gBAClD,CL7bI,IAAI0B,EAAcb,EAAS4K,GAAI3J,EAAUC,MAAMC,QAAS,IACxD,IAAIN,EAAcb,EAAS4D,IAAK3C,EAAUC,MAAMG,IAAK,KACrD,IAAIR,EAAcb,EAAS6K,IAAK5J,EAAUC,MAAMI,IAAK,KAKpDvB,EAAS+K,MACT/K,EAASgL,UACThL,EAASiL,KACTjL,EAASkL,KG/Dd,SAAW1J,GACPA,EAAgB,KAAI,YACpBA,EAAiB,MAAI,aACrBA,EAAkB,OAAI,cACtBA,EAAc,GAAI,UAClBA,EAAgB,KAAI,YACpBA,EAAgB,KAAI,YACpBA,EAAsB,WAAI,gBAC7B,CARD,CAQGA,IAAcA,EAAY,CAAC,IGR9B2J,UAAaC,IACT,MAAM,QAAEC,EAAO,UAAEC,EAAS,aAAEhJ,EAAY,SAAEtB,EAAQ,YAAE1B,EAAW,MAAEiM,EAAK,IAAEC,GAAQJ,EAAMK,KAChFC,EAAa,IAAIzH,MAAMuH,EAAMD,GAC7BI,EAAqB,IAAI1H,MAAM,GACrC,IAAK,IAAI2H,EAAOL,EAAOK,EAAOJ,IAAOI,EACjC,IACI,MAAMC,EAAMR,EAAQO,GACdrJ,EAAQ+I,EAAYA,EAAUM,QAAQE,EAC5CJ,EAAWE,EAAOL,GAASnJ,EAAoByJ,EAAKvJ,EAActB,EAAU1B,EAAaiD,EAC7F,CACA,MAAOwJ,GACH,MACMC,EAAM,8BAA8BJ,MAD3BG,aAAe7I,MAAQ6I,EAAIE,QAAUF,EAAIG,cAExDP,EAAmBrF,KAAK0F,EAC5B,CAEJG,YAAY,CAAEC,SAAUV,EAAYW,SAAUV,K","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/macromolecule/consts.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/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}\n/** Role of an entry in a HELM RNA splitted sequence (sugar, base, phosphate). */\nexport var NucleotideRole;\n(function (NucleotideRole) {\n NucleotideRole[NucleotideRole[\"SUGAR\"] = 0] = \"SUGAR\";\n NucleotideRole[NucleotideRole[\"BASE\"] = 1] = \"BASE\";\n NucleotideRole[NucleotideRole[\"PHOSPHATE\"] = 2] = \"PHOSPHATE\";\n})(NucleotideRole || (NucleotideRole = {}));\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","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[\"annotations\"] = \".annotations\";\n TAGS[\"numberingScheme\"] = \".numberingScheme\";\n TAGS[\"annotationColumnName\"] = \".annotationColumnName\";\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/** Tag on Monomer columns storing the nqName of a function that returns an IMonomerCanonicalizer.\n * The `.%` prefix ensures this tag is persisted with projects. */\nexport const MONOMER_CANONICALIZER_FUNC_TAG = '.%monomer-canonicalizer-func';\n/** Column temp key for the cached IMonomerCanonicalizer instance */\nexport const MONOMER_CANONICALIZER_TEMP = 'monomer-canonicalizer';\nexport const NOTATION_PROVIDER_CONSTRUCTOR_ROLE = 'notationProviderConstructor';\n//# sourceMappingURL=consts.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","import { NOTATION_PROVIDER_CONSTRUCTOR_ROLE } from './consts';\nexport class NotationProviderBase {\n /** Name of the custom notation */\n static get notationName() {\n return 'Custom';\n }\n ;\n /** flag to let bio know if this provider implements method for converting helm to it */\n static get implementsFromHelm() {\n return false;\n }\n ;\n /** Method for converting HELM to this notation */\n static convertFromHelm(helm, options) {\n throw new Error(`Method convertFromHelm not implemented for this notation provider`);\n }\n ;\n static async getProviderConstructors() {\n // this is terrible, I know, but otherwise this gets put in webworkers and fails due to DG resolution)))\n // @ts-ignore\n if (window?.DG) {\n // @ts-ignore\n const constFuncs = window.DG.Func.find({ meta: { role: NOTATION_PROVIDER_CONSTRUCTOR_ROLE } });\n return Promise.all(constFuncs.map((f) => f.apply({})));\n }\n return [];\n }\n}\n/** 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","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 (\n // RNA: all branch monomers (bases) and all backbone monomers (sugars +\n // phosphates, including modified ones). Modifications are looked up by\n // symbol at assembly time, so they MUST be present in the formatted lib.\n polymerType === \"RNA\" /* HELM_POLYMER_TYPE.RNA */ &&\n (it[\"monomerType\" /* HELM_FIELDS.MONOMER_TYPE */] === \"Branch\" /* HELM_MONOMER_TYPE.BRANCH */ ||\n it[\"monomerType\" /* HELM_FIELDS.MONOMER_TYPE */] === \"Backbone\" /* HELM_MONOMER_TYPE.BACKBONE */) ||\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 {ISeqMonomer[]} monomerSeq - Sequence of monomer symbols (canonical)\n * @param {MonomerMolGraphMap} monomersDict - Mapping of monomer symbols to MolGraph objects\n * @param {ALPHABET} alphabet - Alphabet of the column\n * @param {PolymerType} polymerType - Polymer type\n * @param {Array} roles - Optional per-position NucleotideRole tags. When set, RNA assembly\n * uses per-position sugars/phosphates from monomerSeq directly (HELM triples mode).\n * @return {MolfileWithMap} - Molfile V3000 + per-position monomer index map */\nexport function monomerSeqToMolfile(monomerSeq, monomersDict, alphabet, polymerType, roles) {\n if (monomerSeq.length === 0) {\n // throw new Error('monomerSeq is empty');\n return MolfileWithMap.createEmpty();\n }\n // Triples mode is on only when (a) caller flagged the row with roles, and\n // (b) the row's length is a positive multiple of 3 (sugar/base/phosphate triples).\n // in edge cases, terminal phosphate may be missing, so we also allow length % 3 === 2, but only if roles are present to disambiguate the monomers.\n const triplesMode = polymerType === \"RNA\" /* HELM_POLYMER_TYPE.RNA */ && !!roles &&\n roles.length === monomerSeq.length && (monomerSeq.length % 3 === 0 || monomerSeq.length % 3 === 2);\n // define atom and bond counts, taking into account the bond type\n const { atomCount, bondCount, needsCapping } = getResultingAtomBondCounts(monomerSeq, monomersDict, alphabet, polymerType, triplesMode);\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 // Default sugar/phosphate are only consulted in bases-only mode. In\n // triples mode, every nucleotide carries its own.\n if (!triplesMode) {\n sugar = (alphabet === ALPHABET.DNA) ? getMolGraph(monomersDict, C.DEOXYRIBOSE) : getMolGraph(monomersDict, C.RIBOSE);\n phosphate = getMolGraph(monomersDict, C.PHOSPHATE);\n }\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 // In triples mode, the \"logical\" sequence length is the nucleotide count.\n seqLength: triplesMode ? Math.ceil(monomerSeq.length / 3) : 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 if (triplesMode) {\n runTriplesAssembly(monomerSeq, monomersDict, molfileAtomBlock, molfileBondBlock, v, LC, monomers, steabsCollection, (a) => { nAtoms += a; }, () => nAtoms);\n }\n else {\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 }\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 {ISeqMonomer[]} monomerSeq - the sequence of monomers\n * @param {MonomerMolGraphMap} monomersDict - the dictionary of monomers\n * @param {ALPHABET} alphabet - the alphabet of the monomers\n * @param {PolymerType} polymerType - the type of polymer\n * @param {boolean} triplesMode - true when monomerSeq is a flat list of HELM RNA triples\n * @return {Object} the atom/bond counts plus needsCapping flag */\nfunction getResultingAtomBondCounts(monomerSeq, monomersDict, alphabet, polymerType, triplesMode) {\n let atomCount = 0;\n let bondCount = 0;\n let monomerCount = 0;\n let needsCapping = true;\n let lastMonomerGraph = null;\n let lastPhosphateGraph = null;\n // sum up all the atoms/nodes provided by the sequence\n for (let i = 0; i < monomerSeq.length; ++i) {\n const seqMonomer = monomerSeq[i];\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 // In triples mode, every 3rd entry (index 2 mod 3) is a phosphate. Track\n // the LAST one — its atoms/bonds are dropped at the 3'-terminus.\n if (triplesMode && i % 3 === 2)\n lastPhosphateGraph = lastMonomerGraph;\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 if (triplesMode) { // nucleotides — HELM triples (per-position sugar/base/phosphate)\n void lastPhosphateGraph; // kept for symmetry; trailing P is now retained when HELM wrote it\n // Per-monomer-loop already summed sugars + bases + phosphates for every\n // entry in monomerSeq. Reservation: each backbone (sugar/phosphate)\n // reserves +1 bond slot for the chain-extending bond, each branch (base)\n // reserves +1 for its branch bond. Total reservations = monomerCount.\n // length === 3N → trailing P emitted, monomerCount = 3N.\n // length === 3N - 1 → trailing P absent, monomerCount = 3N - 1.\n // Either way, bondCount = sum_bonds + monomerCount.\n atomCount += 1; // OH cap atom (rides on trailing P or on last sugar's R2)\n bondCount += monomerCount;\n }\n else { // nucleotides — bases-only legacy path with default sugar/phosphate\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/** Triples-mode RNA assembly. Iterate by NUCLEOTIDE; each nucleotide normally\n * contributes 3 entries from monomerSeq in order [sugar, base, phosphate].\n * The LAST nucleotide may omit its trailing phosphate (length === 3N - 1) —\n * in that case HELM specified an unphosphorylated 3'-end and we cap on the\n * last sugar's R2 instead of on a final phosphate.\n *\n * @param {ISeqMonomer[]} monomerSeq - flat sugar/base/[phosphate] entries\n * @param {MonomerMolGraphMap} monomersDict - monomer dictionary\n * @param {string[]} molfileAtomBlock - output atom block buffer\n * @param {string[]} molfileBondBlock - output bond block buffer\n * @param {LoopVariables} v - mutable loop variables\n * @param {LoopConstants} LC - loop constants (seqLength = nucleotide count)\n * @param {MonomerMap} monomers - per-position monomer index map (filled in)\n * @param {number[]} steabsCollection - stereo atoms collected for STEABS block\n * @param {Function} addAtoms - callback to bump per-row atom counter for stereo offsets\n * @param {Function} getAtoms - callback to read current atom counter */\nfunction runTriplesAssembly(monomerSeq, monomersDict, molfileAtomBlock, molfileBondBlock, v, LC, monomers, steabsCollection, addAtoms, getAtoms) {\n const N = LC.seqLength;\n // length === 3N → trailing P present. length === 3N-1 → trailing P absent.\n const hasTrailingP = monomerSeq.length === 3 * N;\n for (let n = 0; n < N; ++n) {\n v.i = n;\n const sugarSm = monomerSeq[3 * n];\n const baseSm = monomerSeq[3 * n + 1];\n const sugarG = getMolGraph(monomersDict, { symbol: sugarSm.symbol, polymerType: helmTypeToPolymerType(sugarSm.biotype) });\n const baseG = getMolGraph(monomersDict, { symbol: baseSm.symbol, polymerType: helmTypeToPolymerType(baseSm.biotype) });\n // The previous nucleotide's trailing phosphate is the linker into THIS\n // nucleotide's sugar. It always exists for n >= 1 because only the\n // very LAST nucleotide is permitted to omit its phosphate.\n const prevPhosG = (n === 0) ? null :\n getMolGraph(monomersDict, { symbol: monomerSeq[3 * (n - 1) + 2].symbol,\n polymerType: helmTypeToPolymerType(monomerSeq[3 * (n - 1) + 2].biotype) });\n // emit prevPhosphate (chain linker), then sugar, then base\n const seqStartIdx = 3 * n; // for keying the per-row monomer map by HELM splitter index\n if (prevPhosG) {\n const prevAtomFirst = v.nodeShift;\n const prevBondFirst = v.bondShift;\n addBackboneMonomerToMolblock(prevPhosG, molfileAtomBlock, molfileBondBlock, v);\n prevPhosG.stereoAtoms?.forEach((i) => steabsCollection.push(i + getAtoms()));\n addAtoms(prevPhosG.atoms.x.length);\n // The phosphate \"belongs to\" nucleotide n-1's HELM index (3*(n-1)+2).\n const prevPhosKey = 3 * (n - 1) + 2;\n const aList = [];\n for (let a = prevAtomFirst; a < v.nodeShift; ++a)\n aList.push(a);\n const bList = [];\n for (let b = prevBondFirst; b < v.bondShift; ++b)\n bList.push(b);\n monomers.set(prevPhosKey, {\n biotype: monomerSeq[prevPhosKey].biotype,\n symbol: monomerSeq[prevPhosKey].symbol,\n atoms: aList, bonds: bList,\n });\n }\n const sugarAtomFirst = v.nodeShift;\n const sugarBondFirst = v.bondShift;\n addBackboneMonomerToMolblock(sugarG, molfileAtomBlock, molfileBondBlock, v);\n sugarG.stereoAtoms?.forEach((i) => steabsCollection.push(i + getAtoms()));\n addAtoms(sugarG.atoms.x.length);\n const sAList = [];\n for (let a = sugarAtomFirst; a < v.nodeShift; ++a)\n sAList.push(a);\n const sBList = [];\n for (let b = sugarBondFirst; b < v.bondShift; ++b)\n sBList.push(b);\n monomers.set(seqStartIdx, {\n biotype: sugarSm.biotype, symbol: sugarSm.symbol,\n atoms: sAList, bonds: sBList,\n });\n const baseAtomFirst = v.nodeShift;\n const baseBondFirst = v.bondShift;\n addBranchMonomerToMolblock(baseG, molfileAtomBlock, molfileBondBlock, v);\n baseG.stereoAtoms?.forEach((i) => steabsCollection.push(i + getAtoms()));\n addAtoms(baseG.atoms.x.length);\n const bAList = [];\n for (let a = baseAtomFirst; a < v.nodeShift; ++a)\n bAList.push(a);\n const bBList = [];\n for (let b = baseBondFirst; b < v.bondShift; ++b)\n bBList.push(b);\n monomers.set(seqStartIdx + 1, {\n biotype: baseSm.biotype, symbol: baseSm.symbol,\n atoms: bAList, bonds: bBList,\n });\n }\n // Emit the trailing phosphate (the LAST nucleotide's P) as the final\n // backbone monomer ONLY if HELM explicitly wrote it. The OH cap then\n // rides on its free oxygen (3'-phosphate-OH terminus). If HELM omitted\n // the trailing phosphate, the cap rides on the last sugar's R2 — that\n // requires no extra emission here, since v.backboneAttachNode already\n // points at the last sugar's R2 attach.\n if (hasTrailingP) {\n const lastPhosKey = 3 * (N - 1) + 2;\n const lastPhosSm = monomerSeq[lastPhosKey];\n const lastPhosG = getMolGraph(monomersDict, { symbol: lastPhosSm.symbol, polymerType: helmTypeToPolymerType(lastPhosSm.biotype) });\n const trailAtomFirst = v.nodeShift;\n const trailBondFirst = v.bondShift;\n addBackboneMonomerToMolblock(lastPhosG, molfileAtomBlock, molfileBondBlock, v);\n lastPhosG.stereoAtoms?.forEach((i) => steabsCollection.push(i + getAtoms()));\n addAtoms(lastPhosG.atoms.x.length);\n const tAList = [];\n for (let a = trailAtomFirst; a < v.nodeShift; ++a)\n tAList.push(a);\n const tBList = [];\n for (let b = trailBondFirst; b < v.bondShift; ++b)\n tBList.push(b);\n monomers.set(lastPhosKey, {\n biotype: lastPhosSm.biotype, symbol: lastPhosSm.symbol,\n atoms: tAList, bonds: tBList,\n });\n }\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, rolesList, 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 const roles = rolesList ? rolesList[rowI] : undefined;\n resMolList[rowI - start] = monomerSeqToMolfile(seq, monomersDict, alphabet, polymerType, roles);\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","NucleotideRole","NOTATION","ALPHABET","TAGS","MonomerMap","Map","constructor","entries","super","MolfileWithMap","molfile","monomers","this","createEmpty","RegExp","CandidateType","name","alphabet","cutoff","Alphabets","fasta","peptide","Set","dna","rna","HelmTypes","helmTypeToPolymerType","helmType","BASE","SUGAR","LINKER","NUCLEOTIDE","AA","CHEM","BLOB","console","warn","monomerSeqToMolfile","monomerSeq","monomersDict","roles","length","triplesMode","atomCount","bondCount","needsCapping","monomerCount","lastMonomerGraph","lastPhosphateGraph","i","seqMonomer","Error","biotype","atoms","x","bonds","bondTypes","meta","rNodes","terminalR2Atom","toLowerCase","sugar","DNA","phosphate","getResultingAtomBondCounts","molfileAtomBlock","Array","molfileBondBlock","addMonomerToMolblock","addAminoAcidToMolblock","addNucleotideToMolblock","v","nodeShift","bondShift","backbonePositionShift","fill","branchPositionShift","backboneAttachNode","branchAttachNode","flipFactor","LC","seqLength","Math","ceil","steabsCollection","lastMonomerCappingAtom","nAtoms","addAtoms","getAtoms","N","hasTrailingP","n","sugarSm","baseSm","sugarG","baseG","prevPhosG","seqStartIdx","prevAtomFirst","prevBondFirst","addBackboneMonomerToMolblock","stereoAtoms","forEach","push","prevPhosKey","aList","a","bList","b","set","sugarAtomFirst","sugarBondFirst","sAList","sBList","baseAtomFirst","baseBondFirst","addBranchMonomerToMolblock","bAList","bBList","lastPhosKey","lastPhosSm","lastPhosG","trailAtomFirst","trailBondFirst","tAList","tBList","runTriplesAssembly","monomer","mAtomFirst","mBondFirst","mAtomCount","mAtomList","maI","mBondCount","mBondList","mbI","cappingAtomType","atomIdx","keepPrecision","firstAtom","secondAtom","capResultingMolblock","molfileCountsLine","result","join","collection","rowsArray","newCollectionRow","updatedRow","getCollectionBlock","j","atomTypes","y","kwargs","fillAtomLines","fillBondLines","bondIdx","terminalNodes","fillChainExtendingBond","branchShift","updateBranchVariables","atomPairs","backboneShift","updateChainExtendingVariables","nucleobase","fillBranchAtomLines","branchMonomer","fillBackboneToBranchBond","bondCfg","bondConfiguration","has","orientation","get","round","PT","RNA","FASTA","SEPARATOR","HELM","BILN","onmessage","event","seqList","rolesList","start","end","data","resMolList","molfileWarningList","rowI","seq","undefined","err","msg","message","toString","postMessage","molfiles","warnings"],"sourceRoot":""}
|
package/dist/682.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var bio;(()=>{"use strict";var t={5540(t,n,e){e.d(n,{K:()=>i}),t=e.hmd(t);var r,i=(r="undefined"!=typeof document&&document.currentScript?document.currentScript.src:void 0,function(t={}){var n,e,i=void 0!==t?t:{};i.ready=new Promise(function(t,r){n=t,e=r});var o,a=Object.assign({},i),s="object"==typeof window,c="function"==typeof importScripts,u=("object"==typeof process&&"object"==typeof process.versions&&process.versions.node,"");(s||c)&&(c?u=self.location.href:"undefined"!=typeof document&&document.currentScript&&(u=document.currentScript.src),r&&(u=r),u=0!==u.indexOf("blob:")?u.substr(0,u.replace(/[?#].*/,"").lastIndexOf("/")+1):"",c&&(o=t=>{var n=new XMLHttpRequest;return n.open("GET",t,!1),n.responseType="arraybuffer",n.send(null),new Uint8Array(n.response)})),i.print||console.log.bind(console);var f,l,p=i.printErr||console.warn.bind(console);Object.assign(i,a),a=null,i.arguments&&i.arguments,i.thisProgram&&i.thisProgram,i.quit&&i.quit,i.wasmBinary&&(f=i.wasmBinary),i.noExitRuntime,"object"!=typeof WebAssembly&&U("no native wasm support detected");var h,d,m,y=!1;function b(){var t=l.buffer;i.HEAP8=h=new Int8Array(t),i.HEAP16=new Int16Array(t),i.HEAP32=new Int32Array(t),i.HEAPU8=d=new Uint8Array(t),i.HEAPU16=new Uint16Array(t),i.HEAPU32=m=new Uint32Array(t),i.HEAPF32=new Float32Array(t),i.HEAPF64=new Float64Array(t)}var w=[],v=[],g=[];function _(t){w.unshift(t)}function A(t){g.unshift(t)}var x,E,R=0,P=null,S=null;function U(t){i.onAbort&&i.onAbort(t),p(t="Aborted("+t+")"),y=!0,t+=". Build with -sASSERTIONS for more info.";var n=new WebAssembly.RuntimeError(t);throw e(n),n}function j(t){return t.startsWith("data:application/octet-stream;base64,")}function I(t){try{if(t==x&&f)return new Uint8Array(f);if(o)return o(t);throw"both async and sync fetching of the wasm failed"}catch(t){U(t)}}function O(t,n,e){return function(t){return f||!s&&!c||"function"!=typeof fetch?Promise.resolve().then(function(){return I(t)}):fetch(t,{credentials:"same-origin"}).then(function(n){if(!n.ok)throw"failed to load wasm binary file at '"+t+"'";return n.arrayBuffer()}).catch(function(){return I(t)})}(t).then(function(t){return WebAssembly.instantiate(t,n)}).then(function(t){return t}).then(e,function(t){p("failed to asynchronously prepare wasm: "+t),U(t)})}function C(t){for(;t.length>0;)t.shift()(i)}function T(t){this.excPtr=t,this.ptr=t-24,this.set_type=function(t){m[this.ptr+4>>2]=t},this.get_type=function(){return m[this.ptr+4>>2]},this.set_destructor=function(t){m[this.ptr+8>>2]=t},this.get_destructor=function(){return m[this.ptr+8>>2]},this.set_caught=function(t){t=t?1:0,h[this.ptr+12|0]=t},this.get_caught=function(){return 0!=h[this.ptr+12|0]},this.set_rethrown=function(t){t=t?1:0,h[this.ptr+13|0]=t},this.get_rethrown=function(){return 0!=h[this.ptr+13|0]},this.init=function(t,n){this.set_adjusted_ptr(0),this.set_type(t),this.set_destructor(n)},this.set_adjusted_ptr=function(t){m[this.ptr+16>>2]=t},this.get_adjusted_ptr=function(){return m[this.ptr+16>>2]},this.get_exception_ptr=function(){if(q(this.get_type()))return m[this.excPtr>>2];var t=this.get_adjusted_ptr();return 0!==t?t:this.excPtr}}function H(t){var n=l.buffer;try{return l.grow(t-n.byteLength+65535>>>16),b(),1}catch(t){}}function k(t){return i["_"+t]}j(x="wasmDbscan.wasm")||(E=x,x=i.locateFile?i.locateFile(E,u):u+E);var F="undefined"!=typeof TextDecoder?new TextDecoder("utf8"):void 0;function M(t,n,e,r,i){var o={string:t=>{var n=0;return null!=t&&0!==t&&(n=function(t){var n=function(t){for(var n=0,e=0;e<t.length;++e){var r=t.charCodeAt(e);r<=127?n++:r<=2047?n+=2:r>=55296&&r<=57343?(n+=4,++e):n+=3}return n}(t)+1,e=N(n);return function(t,n,e){!function(t,n,e,r){if(!(r>0))return 0;for(var i=e+r-1,o=0;o<t.length;++o){var a=t.charCodeAt(o);if(a>=55296&&a<=57343&&(a=65536+((1023&a)<<10)|1023&t.charCodeAt(++o)),a<=127){if(e>=i)break;n[e++]=a}else if(a<=2047){if(e+1>=i)break;n[e++]=192|a>>6,n[e++]=128|63&a}else if(a<=65535){if(e+2>=i)break;n[e++]=224|a>>12,n[e++]=128|a>>6&63,n[e++]=128|63&a}else{if(e+3>=i)break;n[e++]=240|a>>18,n[e++]=128|a>>12&63,n[e++]=128|a>>6&63,n[e++]=128|63&a}}n[e]=0}(t,d,n,e)}(t,e,n),e}(t)),n},array:t=>{var n,e,r=N(t.length);return n=t,e=r,h.set(n,e),r}},a=k(t),s=[],c=0;if(r)for(var u=0;u<r.length;u++){var f=o[e[u]];f?(0===c&&(c=B()),s[u]=f(r[u])):s[u]=r[u]}var l=a.apply(null,s);return function(t){return 0!==c&&L(c),function(t){return"string"===n?(e=t)?function(t,n,e){for(var r=n+e,i=n;t[i]&&!(i>=r);)++i;if(i-n>16&&t.buffer&&F)return F.decode(t.subarray(n,i));for(var o="";n<i;){var a=t[n++];if(128&a){var s=63&t[n++];if(192!=(224&a)){var c=63&t[n++];if((a=224==(240&a)?(15&a)<<12|s<<6|c:(7&a)<<18|s<<12|c<<6|63&t[n++])<65536)o+=String.fromCharCode(a);else{var u=a-65536;o+=String.fromCharCode(55296|u>>10,56320|1023&u)}}else o+=String.fromCharCode((31&a)<<6|s)}else o+=String.fromCharCode(a)}return o}(d,e,r):"":"boolean"===n?Boolean(t):t;var e,r}(t)}(l)}var W,D={__cxa_throw:function(t,n,e){throw new T(t).init(n,e),t},abort:function(){U("")},emscripten_memcpy_big:function(t,n,e){d.copyWithin(t,n,n+e)},emscripten_resize_heap:function(t){var n=d.length,e=2147483648;if((t>>>=0)>e)return!1;let r=(t,n)=>t+(n-t%n)%n;for(var i=1;i<=4;i*=2){var o=n*(1+.2/i);if(o=Math.min(o,t+100663296),H(Math.min(e,r(Math.max(t,o),65536))))return!0}return!1}},B=(function(){var t,n,r,o,a={env:D,wasi_snapshot_preview1:D};function s(t,n){var e,r=t.exports;return i.asm=r,l=i.asm.memory,b(),i.asm.__indirect_function_table,e=i.asm.__wasm_call_ctors,v.unshift(e),function(){if(R--,i.monitorRunDependencies&&i.monitorRunDependencies(R),0==R&&(null!==P&&(clearInterval(P),P=null),S)){var t=S;S=null,t()}}(),r}if(R++,i.monitorRunDependencies&&i.monitorRunDependencies(R),i.instantiateWasm)try{return i.instantiateWasm(a,s)}catch(t){p("Module.instantiateWasm callback failed with error: "+t),e(t)}(t=f,n=x,r=a,o=function(t){s(t.instance)},t||"function"!=typeof WebAssembly.instantiateStreaming||j(n)||"function"!=typeof fetch?O(n,r,o):fetch(n,{credentials:"same-origin"}).then(function(t){return WebAssembly.instantiateStreaming(t,r).then(o,function(t){return p("wasm streaming compile failed: "+t),p("falling back to ArrayBuffer instantiation"),O(n,r,o)})})).catch(e)}(),i._dbscan=function(){return(i._dbscan=i.asm.dbscan).apply(null,arguments)},i._malloc=function(){return(i._malloc=i.asm.malloc).apply(null,arguments)},i._free=function(){return(i._free=i.asm.free).apply(null,arguments)},function(){return(B=i.asm.stackSave).apply(null,arguments)}),L=function(){return(L=i.asm.stackRestore).apply(null,arguments)},N=function(){return(N=i.asm.stackAlloc).apply(null,arguments)},q=function(){return(q=i.asm.__cxa_is_pointer_type).apply(null,arguments)};function z(){function t(){W||(W=!0,i.calledRun=!0,y||(C(v),n(i),i.onRuntimeInitialized&&i.onRuntimeInitialized(),function(){if(i.postRun)for("function"==typeof i.postRun&&(i.postRun=[i.postRun]);i.postRun.length;)A(i.postRun.shift());C(g)}()))}R>0||(function(){if(i.preRun)for("function"==typeof i.preRun&&(i.preRun=[i.preRun]);i.preRun.length;)_(i.preRun.shift());C(w)}(),R>0||(i.setStatus?(i.setStatus("Running..."),setTimeout(function(){setTimeout(function(){i.setStatus("")},1),t()},1)):t()))}if(i.ccall=M,i.cwrap=function(t,n,e,r){var i=!e||e.every(t=>"number"===t||"boolean"===t);return"string"!==n&&i&&!r?k(t):function(){return M(t,n,e,arguments)}},S=function t(){W||z(),W||(S=t)},i.preInit)for("function"==typeof i.preInit&&(i.preInit=[i.preInit]);i.preInit.length>0;)i.preInit.pop()();return z(),t.ready});"object"==typeof exports?t.exports=i:"function"==typeof define&&e.amdO?define([],function(){return i}):"object"==typeof exports&&(exports.exportCppDbscanLib=i)},8396(t,n,e){t.exports=e.p+"9a8fbf37666e32487835.wasm"}},n={};function e(r){var i=n[r];if(void 0!==i)return i.exports;var o=n[r]={id:r,loaded:!1,exports:{}};return t[r](o,o.exports,e),o.loaded=!0,o.exports}e.m=t,e.amdO={},e.d=(t,n)=>{for(var r in n)e.o(n,r)&&!e.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:n[r]})},e.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),e.hmd=t=>((t=Object.create(t)).children||(t.children=[]),Object.defineProperty(t,"exports",{enumerable:!0,set:()=>{throw new Error("ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: "+t.id)}}),t),e.o=(t,n)=>Object.prototype.hasOwnProperty.call(t,n),(()=>{var t;e.g.importScripts&&(t=e.g.location+"");var n=e.g.document;if(!t&&n&&(n.currentScript&&"SCRIPT"===n.currentScript.tagName.toUpperCase()&&(t=n.currentScript.src),!t)){var r=n.getElementsByTagName("script");if(r.length)for(var i=r.length-1;i>-1&&(!t||!/^http(s?):/.test(t));)t=r[i--].src}if(!t)throw new Error("Automatic publicPath is not supported in this browser");t=t.replace(/^blob:/,"").replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),e.p=t})(),e.b=self.location+"";var r=e(5540);onmessage=t=>{const{embedX:n,embedY:i,epsilon:o,minPts:a}=t.data,s={};var c,u,f,l;c=void 0,u=void 0,l=function*(){try{const t=yield async function(t,n,i,o){const a=new URL(e(8396),e.b).href,s=a.substring(0,a.lastIndexOf("/")+1)+"wasmDbscan.wasm";let c;try{c=await(0,r.K)({locateFile:()=>a,printErr:t=>{}})}catch(t){try{c=await(0,r.K)({locateFile:()=>s,printErr:t=>{}})}catch(t){throw console.error(t),new Error("Unable to load wasm file for dbscan")}}const u=c.cwrap("dbscan","null",["number","number","number","number","number","number"]),f=Float32Array.BYTES_PER_ELEMENT*t.length,l=c._malloc(f),p=c._malloc(f),h=new Uint8Array(c.HEAPU8.buffer,l,f);h.set(new Uint8Array(t.buffer));const d=new Uint8Array(c.HEAPU8.buffer,p,f);d.set(new Uint8Array(n.buffer));const m=c._malloc(f),y=new Uint8Array(c.HEAPU8.buffer,m,f);u(l,p,t.length,i,o,m);const b=new Int32Array(y.buffer,y.byteOffset,t.length);return c._free(h.byteOffset),c._free(d.byteOffset),c._free(y.byteOffset),b}(n,i,o,a);s.clusters=t,postMessage(s)}catch(t){s.error=t,postMessage(s)}},new((f=void 0)||(f=Promise))(function(t,n){function e(t){try{i(l.next(t))}catch(t){n(t)}}function r(t){try{i(l.throw(t))}catch(t){n(t)}}function i(n){var i;n.done?t(n.value):(i=n.value,i instanceof f?i:new f(function(t){t(i)})).then(e,r)}i((l=l.apply(c,u||[])).next())})},bio={}})();
|
|
1
|
+
var bio;(()=>{"use strict";var t={5540(t,n,e){e.d(n,{K:()=>o}),t=e.hmd(t);var r,o=(r="undefined"!=typeof document&&document.currentScript?document.currentScript.src:void 0,function(t={}){var n,e,o=void 0!==t?t:{};o.ready=new Promise(function(t,r){n=t,e=r});var i,a=Object.assign({},o),s="object"==typeof window,u="function"==typeof importScripts,c=("object"==typeof process&&"object"==typeof process.versions&&process.versions.node,"");(s||u)&&(u?c=self.location.href:"undefined"!=typeof document&&document.currentScript&&(c=document.currentScript.src),r&&(c=r),c=0!==c.indexOf("blob:")?c.substr(0,c.replace(/[?#].*/,"").lastIndexOf("/")+1):"",u&&(i=t=>{var n=new XMLHttpRequest;return n.open("GET",t,!1),n.responseType="arraybuffer",n.send(null),new Uint8Array(n.response)})),o.print||console.log.bind(console);var f,l,p=o.printErr||console.warn.bind(console);Object.assign(o,a),a=null,o.arguments&&o.arguments,o.thisProgram&&o.thisProgram,o.quit&&o.quit,o.wasmBinary&&(f=o.wasmBinary),o.noExitRuntime,"object"!=typeof WebAssembly&&O("no native wasm support detected");var d,h,m,y=!1;function b(){var t=l.buffer;o.HEAP8=d=new Int8Array(t),o.HEAP16=new Int16Array(t),o.HEAP32=new Int32Array(t),o.HEAPU8=h=new Uint8Array(t),o.HEAPU16=new Uint16Array(t),o.HEAPU32=m=new Uint32Array(t),o.HEAPF32=new Float32Array(t),o.HEAPF64=new Float64Array(t)}var v=[],w=[],_=[];function g(t){v.unshift(t)}function A(t){_.unshift(t)}var x,E,R=0,P=null,S=null;function O(t){o.onAbort&&o.onAbort(t),p(t="Aborted("+t+")"),y=!0,t+=". Build with -sASSERTIONS for more info.";var n=new WebAssembly.RuntimeError(t);throw e(n),n}function U(t){return t.startsWith("data:application/octet-stream;base64,")}function j(t){try{if(t==x&&f)return new Uint8Array(f);if(i)return i(t);throw"both async and sync fetching of the wasm failed"}catch(t){O(t)}}function I(t,n,e){return function(t){return f||!s&&!u||"function"!=typeof fetch?Promise.resolve().then(function(){return j(t)}):fetch(t,{credentials:"same-origin"}).then(function(n){if(!n.ok)throw"failed to load wasm binary file at '"+t+"'";return n.arrayBuffer()}).catch(function(){return j(t)})}(t).then(function(t){return WebAssembly.instantiate(t,n)}).then(function(t){return t}).then(e,function(t){p("failed to asynchronously prepare wasm: "+t),O(t)})}function C(t){for(;t.length>0;)t.shift()(o)}function H(t){this.excPtr=t,this.ptr=t-24,this.set_type=function(t){m[this.ptr+4>>2]=t},this.get_type=function(){return m[this.ptr+4>>2]},this.set_destructor=function(t){m[this.ptr+8>>2]=t},this.get_destructor=function(){return m[this.ptr+8>>2]},this.set_caught=function(t){t=t?1:0,d[this.ptr+12|0]=t},this.get_caught=function(){return 0!=d[this.ptr+12|0]},this.set_rethrown=function(t){t=t?1:0,d[this.ptr+13|0]=t},this.get_rethrown=function(){return 0!=d[this.ptr+13|0]},this.init=function(t,n){this.set_adjusted_ptr(0),this.set_type(t),this.set_destructor(n)},this.set_adjusted_ptr=function(t){m[this.ptr+16>>2]=t},this.get_adjusted_ptr=function(){return m[this.ptr+16>>2]},this.get_exception_ptr=function(){if(z(this.get_type()))return m[this.excPtr>>2];var t=this.get_adjusted_ptr();return 0!==t?t:this.excPtr}}function M(t){var n=l.buffer;try{return l.grow(t-n.byteLength+65535>>>16),b(),1}catch(t){}}function T(t){return o["_"+t]}U(x="wasmDbscan.wasm")||(E=x,x=o.locateFile?o.locateFile(E,c):c+E);var k="undefined"!=typeof TextDecoder?new TextDecoder("utf8"):void 0;function D(t,n,e,r,o){var i={string:t=>{var n=0;return null!=t&&0!==t&&(n=function(t){var n=function(t){for(var n=0,e=0;e<t.length;++e){var r=t.charCodeAt(e);r<=127?n++:r<=2047?n+=2:r>=55296&&r<=57343?(n+=4,++e):n+=3}return n}(t)+1,e=q(n);return function(t,n,e){!function(t,n,e,r){if(!(r>0))return 0;for(var o=e+r-1,i=0;i<t.length;++i){var a=t.charCodeAt(i);if(a>=55296&&a<=57343&&(a=65536+((1023&a)<<10)|1023&t.charCodeAt(++i)),a<=127){if(e>=o)break;n[e++]=a}else if(a<=2047){if(e+1>=o)break;n[e++]=192|a>>6,n[e++]=128|63&a}else if(a<=65535){if(e+2>=o)break;n[e++]=224|a>>12,n[e++]=128|a>>6&63,n[e++]=128|63&a}else{if(e+3>=o)break;n[e++]=240|a>>18,n[e++]=128|a>>12&63,n[e++]=128|a>>6&63,n[e++]=128|63&a}}n[e]=0}(t,h,n,e)}(t,e,n),e}(t)),n},array:t=>{var n,e,r=q(t.length);return n=t,e=r,d.set(n,e),r}},a=T(t),s=[],u=0;if(r)for(var c=0;c<r.length;c++){var f=i[e[c]];f?(0===u&&(u=B()),s[c]=f(r[c])):s[c]=r[c]}var l=a.apply(null,s);return function(t){return 0!==u&&L(u),function(t){return"string"===n?(e=t)?function(t,n,e){for(var r=n+e,o=n;t[o]&&!(o>=r);)++o;if(o-n>16&&t.buffer&&k)return k.decode(t.subarray(n,o));for(var i="";n<o;){var a=t[n++];if(128&a){var s=63&t[n++];if(192!=(224&a)){var u=63&t[n++];if((a=224==(240&a)?(15&a)<<12|s<<6|u:(7&a)<<18|s<<12|u<<6|63&t[n++])<65536)i+=String.fromCharCode(a);else{var c=a-65536;i+=String.fromCharCode(55296|c>>10,56320|1023&c)}}else i+=String.fromCharCode((31&a)<<6|s)}else i+=String.fromCharCode(a)}return i}(h,e,r):"":"boolean"===n?Boolean(t):t;var e,r}(t)}(l)}var W,F={__cxa_throw:function(t,n,e){throw new H(t).init(n,e),t},abort:function(){O("")},emscripten_memcpy_big:function(t,n,e){h.copyWithin(t,n,n+e)},emscripten_resize_heap:function(t){var n=h.length,e=2147483648;if((t>>>=0)>e)return!1;let r=(t,n)=>t+(n-t%n)%n;for(var o=1;o<=4;o*=2){var i=n*(1+.2/o);if(i=Math.min(i,t+100663296),M(Math.min(e,r(Math.max(t,i),65536))))return!0}return!1}},B=(function(){var t,n,r,i,a={env:F,wasi_snapshot_preview1:F};function s(t,n){var e,r=t.exports;return o.asm=r,l=o.asm.memory,b(),o.asm.__indirect_function_table,e=o.asm.__wasm_call_ctors,w.unshift(e),function(){if(R--,o.monitorRunDependencies&&o.monitorRunDependencies(R),0==R&&(null!==P&&(clearInterval(P),P=null),S)){var t=S;S=null,t()}}(),r}if(R++,o.monitorRunDependencies&&o.monitorRunDependencies(R),o.instantiateWasm)try{return o.instantiateWasm(a,s)}catch(t){p("Module.instantiateWasm callback failed with error: "+t),e(t)}(t=f,n=x,r=a,i=function(t){s(t.instance)},t||"function"!=typeof WebAssembly.instantiateStreaming||U(n)||"function"!=typeof fetch?I(n,r,i):fetch(n,{credentials:"same-origin"}).then(function(t){return WebAssembly.instantiateStreaming(t,r).then(i,function(t){return p("wasm streaming compile failed: "+t),p("falling back to ArrayBuffer instantiation"),I(n,r,i)})})).catch(e)}(),o._dbscan=function(){return(o._dbscan=o.asm.dbscan).apply(null,arguments)},o._malloc=function(){return(o._malloc=o.asm.malloc).apply(null,arguments)},o._free=function(){return(o._free=o.asm.free).apply(null,arguments)},function(){return(B=o.asm.stackSave).apply(null,arguments)}),L=function(){return(L=o.asm.stackRestore).apply(null,arguments)},q=function(){return(q=o.asm.stackAlloc).apply(null,arguments)},z=function(){return(z=o.asm.__cxa_is_pointer_type).apply(null,arguments)};function K(){function t(){W||(W=!0,o.calledRun=!0,y||(C(w),n(o),o.onRuntimeInitialized&&o.onRuntimeInitialized(),function(){if(o.postRun)for("function"==typeof o.postRun&&(o.postRun=[o.postRun]);o.postRun.length;)A(o.postRun.shift());C(_)}()))}R>0||(function(){if(o.preRun)for("function"==typeof o.preRun&&(o.preRun=[o.preRun]);o.preRun.length;)g(o.preRun.shift());C(v)}(),R>0||(o.setStatus?(o.setStatus("Running..."),setTimeout(function(){setTimeout(function(){o.setStatus("")},1),t()},1)):t()))}if(o.ccall=D,o.cwrap=function(t,n,e,r){var o=!e||e.every(t=>"number"===t||"boolean"===t);return"string"!==n&&o&&!r?T(t):function(){return D(t,n,e,arguments)}},S=function t(){W||K(),W||(S=t)},o.preInit)for("function"==typeof o.preInit&&(o.preInit=[o.preInit]);o.preInit.length>0;)o.preInit.pop()();return K(),t.ready});"object"==typeof exports?t.exports=o:"function"==typeof define&&e.amdO?define([],function(){return o}):"object"==typeof exports&&(exports.exportCppDbscanLib=o)},9323(t,n,e){e.r(n),e.d(n,{default:()=>r});const r="dist/wasmDbscan.wasm"}},n={};function e(r){var o=n[r];if(void 0!==o)return o.exports;var i=n[r]={id:r,loaded:!1,exports:{}};return t[r](i,i.exports,e),i.loaded=!0,i.exports}e.m=t,e.amdO={},e.d=(t,n)=>{for(var r in n)e.o(n,r)&&!e.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:n[r]})},e.hmd=t=>((t=Object.create(t)).children||(t.children=[]),Object.defineProperty(t,"exports",{enumerable:!0,set:()=>{throw new Error("ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: "+t.id)}}),t),e.o=(t,n)=>Object.prototype.hasOwnProperty.call(t,n),e.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},e.b=self.location+"";var r=e(5540);onmessage=t=>{const{embedX:n,embedY:o,epsilon:i,minPts:a}=t.data,s={};var u,c,f,l;u=void 0,c=void 0,l=function*(){try{const t=yield async function(t,n,o,i){const a=new URL(e(9323),e.b).href,s=a.substring(0,a.lastIndexOf("/")+1)+"wasmDbscan.wasm";let u;try{u=await(0,r.K)({locateFile:()=>a,printErr:t=>{}})}catch(t){try{u=await(0,r.K)({locateFile:()=>s,printErr:t=>{}})}catch(t){throw console.error(t),new Error("Unable to load wasm file for dbscan")}}const c=u.cwrap("dbscan","null",["number","number","number","number","number","number"]),f=Float32Array.BYTES_PER_ELEMENT*t.length,l=u._malloc(f),p=u._malloc(f),d=new Uint8Array(u.HEAPU8.buffer,l,f);d.set(new Uint8Array(t.buffer));const h=new Uint8Array(u.HEAPU8.buffer,p,f);h.set(new Uint8Array(n.buffer));const m=u._malloc(f),y=new Uint8Array(u.HEAPU8.buffer,m,f);c(l,p,t.length,o,i,m);const b=new Int32Array(y.buffer,y.byteOffset,t.length);return u._free(d.byteOffset),u._free(h.byteOffset),u._free(y.byteOffset),b}(n,o,i,a);s.clusters=t,postMessage(s)}catch(t){s.error=t,postMessage(s)}},new((f=void 0)||(f=Promise))(function(t,n){function e(t){try{o(l.next(t))}catch(t){n(t)}}function r(t){try{o(l.throw(t))}catch(t){n(t)}}function o(n){var o;n.done?t(n.value):(o=n.value,o instanceof f?o:new f(function(t){t(o)})).then(e,r)}o((l=l.apply(u,c||[])).next())})},bio={}})();
|
|
2
2
|
//# sourceMappingURL=682.js.map
|