@datagrok-libraries/bio 6.0.0 → 6.0.2
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/CHANGELOG.md +5 -0
- package/package.json +1 -1
- package/src/monomer-works/lib-settings.d.ts.map +1 -1
- package/src/monomer-works/lib-settings.js +14 -4
- package/src/monomer-works/lib-settings.js.map +1 -1
- package/src/monomer-works/monomer-hover.d.ts.map +1 -1
- package/src/monomer-works/monomer-hover.js +38 -10
- package/src/monomer-works/monomer-hover.js.map +1 -1
- package/src/monomer-works/seq-to-molfile-worker.js +3 -2
- package/src/monomer-works/seq-to-molfile-worker.js.map +1 -1
- package/src/monomer-works/seq-to-molfile.d.ts +1 -1
- package/src/monomer-works/seq-to-molfile.d.ts.map +1 -1
- package/src/monomer-works/seq-to-molfile.js +2 -2
- package/src/monomer-works/seq-to-molfile.js.map +1 -1
- package/src/monomer-works/to-atomic-level-utils.d.ts +15 -1
- package/src/monomer-works/to-atomic-level-utils.d.ts.map +1 -1
- package/src/monomer-works/to-atomic-level-utils.js +179 -1
- package/src/monomer-works/to-atomic-level-utils.js.map +1 -1
- package/src/monomer-works/to-atomic-level.d.ts +1 -0
- package/src/monomer-works/to-atomic-level.d.ts.map +1 -1
- package/src/monomer-works/to-atomic-level.js +70 -32
- package/src/monomer-works/to-atomic-level.js.map +1 -1
- package/src/monomer-works/types.d.ts +5 -0
- package/src/monomer-works/types.d.ts.map +1 -1
- package/src/utils/macromolecule/utils.d.ts.map +1 -1
- package/src/utils/macromolecule/utils.js +11 -7
- package/src/utils/macromolecule/utils.js.map +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
# bio changelog
|
|
2
2
|
|
|
3
|
+
## 6.0.2 (2026-07-06)
|
|
4
|
+
|
|
5
|
+
* To atomic level (linear path): support multi-chain HELM (e.g. `RNA1{...}|RNA2{...}`) — each disjoint chain is assembled independently and stacked vertically into a single molfile instead of being fused into one continuous chain.
|
|
6
|
+
* Monomer hover (linear path): fix the HELM monomer→atom map — infer polymer type from the parsed HELM graph (not the alphabet, which mis-detects modified RNA as UN) and build the map with per-position RNA roles and multi-chain stacking so it matches the rendered molfile.
|
|
7
|
+
|
|
3
8
|
## 5.61.2 (2025-11-03)
|
|
4
9
|
|
|
5
10
|
* Split User settings for duplicate monomer preferences into separate entries to avoid length limits.
|
package/package.json
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"access": "public"
|
|
9
9
|
},
|
|
10
10
|
"friendlyName": "Datagrok bio library",
|
|
11
|
-
"version": "6.0.
|
|
11
|
+
"version": "6.0.2",
|
|
12
12
|
"description": "Bio utilities, types supporting Macromolecule, Molecule3D data",
|
|
13
13
|
"dependencies": {
|
|
14
14
|
"@datagrok-libraries/chem-meta": "^1.2.7",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lib-settings.d.ts","sourceRoot":"","sources":["lib-settings.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,eAAe,EAAC,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"lib-settings.d.ts","sourceRoot":"","sources":["lib-settings.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,eAAe,EAAC,MAAM,SAAS,CAAC;AA0DxC,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,eAAe,CAAC,CAwBnE;AAED,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAmB9E"}
|
|
@@ -14,12 +14,23 @@ async function getDuplicatePrefsFull() {
|
|
|
14
14
|
if (!resStr)
|
|
15
15
|
return {};
|
|
16
16
|
// chunk will end with special suffix and just before it will have the number of the next chunk key
|
|
17
|
+
let iter = 1;
|
|
17
18
|
while (resStr.endsWith(CHUNK_KEY_SUFFIX)) {
|
|
18
|
-
const
|
|
19
|
+
const nextChunkKeysCount = iter.toString().length;
|
|
20
|
+
const nextChunkIndex = new Array(nextChunkKeysCount).fill(0)
|
|
21
|
+
.reduce((acc, _, i) => acc + resStr.charAt(resStr.length - nextChunkKeysCount + i - CHUNK_KEY_SUFFIX.length), '');
|
|
22
|
+
const nextChunkKey = `${DUPLICATE_MONOMER_PREFERENCES_KEY}${nextChunkIndex}`;
|
|
19
23
|
const nextChunkStr = (await grok.userSettings.getValue(LIB_STORAGE_NAME, nextChunkKey, true)) ?? '';
|
|
20
|
-
resStr = resStr.slice(0, resStr.length - CHUNK_KEY_SUFFIX.length -
|
|
24
|
+
resStr = resStr.slice(0, resStr.length - CHUNK_KEY_SUFFIX.length - nextChunkIndex.length) + nextChunkStr;
|
|
25
|
+
iter++;
|
|
26
|
+
}
|
|
27
|
+
try {
|
|
28
|
+
return JSON.parse(resStr);
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
console.error(`Failed to parse duplicateMonomerPreferences from user settings: ${err}`);
|
|
32
|
+
return {};
|
|
21
33
|
}
|
|
22
|
-
return JSON.parse(resStr);
|
|
23
34
|
}
|
|
24
35
|
async function setDuplicatePrefsFull(value) {
|
|
25
36
|
const valueStr = JSON.stringify(value);
|
|
@@ -73,7 +84,6 @@ export async function setUserLibSettings(value) {
|
|
|
73
84
|
}
|
|
74
85
|
await setDuplicatePrefsFull(duplicatePrefsShortHand);
|
|
75
86
|
//await grok.userSettings.add(LIB_STORAGE_NAME, DUPLICATE_MONOMER_PREFERENCES_KEY, JSON.stringify(duplicatePrefsShortHand), true);
|
|
76
|
-
value.duplicateMonomerPreferences = {}; // clear to reduce size
|
|
77
87
|
await grok.userSettings.add(LIB_STORAGE_NAME, LIB_SETTINGS_KEY, JSON.stringify(value), true);
|
|
78
88
|
});
|
|
79
89
|
await userLibSettingsPromise;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lib-settings.js","sourceRoot":"","sources":["lib-settings.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,OAAO,KAAK,IAAI,MAAM,mBAAmB,CAAC;AAG1C,0BAA0B;AAC1B,MAAM,gBAAgB,GAAG,WAAW,CAAC;AACrC,MAAM,gBAAgB,GAAG,UAAU,CAAC;AACpC,MAAM,iCAAiC,GAAG,6BAA6B,CAAC;AAUxE,2GAA2G;AAC3G,mDAAmD;AACnD,MAAM,+BAA+B,GAAG,IAAI,CAAC;AAC7C,MAAM,gBAAgB,GAAG,WAAW,CAAC;AACrC,KAAK,UAAU,qBAAqB;IACpC,6EAA6E;IAC3E,IAAI,MAAM,GAAW,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,gBAAgB,EAAE,iCAAiC,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;IACvH,IAAI,CAAC,MAAM;QACT,OAAO,EAAE,CAAC;IACZ,mGAAmG;IACnG,OAAO,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACzC,MAAM,
|
|
1
|
+
{"version":3,"file":"lib-settings.js","sourceRoot":"","sources":["lib-settings.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"monomer-hover.d.ts","sourceRoot":"","sources":["monomer-hover.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAMtC,OAAO,EAAC,QAAQ,EAAC,MAAM,6CAA6C,CAAC;AAIrE,OAAO,EAAC,eAAe,EAAC,MAAM,0BAA0B,CAAC;AACzD,OAAO,
|
|
1
|
+
{"version":3,"file":"monomer-hover.d.ts","sourceRoot":"","sources":["monomer-hover.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAMtC,OAAO,EAAC,QAAQ,EAAC,MAAM,6CAA6C,CAAC;AAIrE,OAAO,EAAC,eAAe,EAAC,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAW,WAAW,EAAc,MAAM,eAAe,CAAC;AAKjE,OAAO,EAAC,gBAAgB,EAAC,MAAM,SAAS,CAAC;AAGzC,OAAO,EAA0B,UAAU,EAAC,MAAM,qBAAqB,CAAC;AAExE,eAAO,MAAM,qBAAqB,sBAAsB,CAAC;AAEzD,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,gBAAgB,QAM7E;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EACpD,UAAU,EAAE,eAAe,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,GAAE,OAAe,GACrG,OAAO,CAAC,gBAAgB,CAAC,CAyJ3B;AAED,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,WAAW,GAAG,IAAI,GACvD,IAAI,CAkBN;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,gBAAgB,EAAE,CAElF"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import wu from 'wu';
|
|
2
2
|
import { LRUCache } from 'lru-cache';
|
|
3
3
|
import { addSubstructProvider, getMonomerHover, setMonomerHover } from '@datagrok-libraries/chem-meta/src/types';
|
|
4
|
-
import { PolymerTypes } from '../helm/consts';
|
|
4
|
+
import { HelmTypes, PolymerTypes } from '../helm/consts';
|
|
5
5
|
import { ALPHABET } from '../utils/macromolecule';
|
|
6
|
-
import { getMonomersDictFromLib } from './to-atomic-level';
|
|
6
|
+
import { buildRolesForHelmRna, getMonomersDictFromLib } from './to-atomic-level';
|
|
7
7
|
import { monomerSeqToMolfile } from './to-atomic-level-utils';
|
|
8
8
|
import { getMolHighlight } from './seq-to-molfile';
|
|
9
9
|
export const MonomerHoverLinksTemp = 'MonomerHoverLinks';
|
|
@@ -28,10 +28,15 @@ export async function buildMonomerHoverLink(seqCol, molCol, monomerLib, seqHelpe
|
|
|
28
28
|
const getSeqMonomerCorrectedPosition = (pos) => {
|
|
29
29
|
if (pos == undefined)
|
|
30
30
|
return null;
|
|
31
|
-
//
|
|
32
|
-
//
|
|
31
|
+
// HELM RNA is split into per-position sugar/base/phosphate monomers, so the
|
|
32
|
+
// renderer reports a flat monomer index and the monomer map is keyed by that
|
|
33
|
+
// same flat index — both for the POM converter and (since the map is now
|
|
34
|
+
// built with roles) for the linear path. No division needed in either case.
|
|
33
35
|
if (isNucleotideHelmSequence)
|
|
34
|
-
return
|
|
36
|
+
return pos;
|
|
37
|
+
// Non-HELM DNA/RNA: the linear map keys by base position; the POM converter
|
|
38
|
+
// expands each base into a sugar/base/phosphate triple, so map the base to
|
|
39
|
+
// its base entry (the middle of its triple).
|
|
35
40
|
if (isNucleotideNonHelmSequence)
|
|
36
41
|
return throughPOM ? pos * 3 + 1 : pos;
|
|
37
42
|
return pos;
|
|
@@ -41,15 +46,38 @@ export async function buildMonomerHoverLink(seqCol, molCol, monomerLib, seqHelpe
|
|
|
41
46
|
const seqSH = seqHelper.getSeqHandler(seqCol);
|
|
42
47
|
if (!throughPOM) {
|
|
43
48
|
const seqSS = seqSH.getSplitted(tableRowIdx);
|
|
44
|
-
const
|
|
49
|
+
const gi = seqSS.graphInfo;
|
|
50
|
+
// Polymer type: for HELM read it from the parsed graph rather than the
|
|
51
|
+
// alphabet — modified RNA can mis-detect as ALPHABET.UN. The whole row is
|
|
52
|
+
// assumed to be the first chain's type. Non-HELM falls back to the alphabet.
|
|
53
|
+
let polymerType;
|
|
54
|
+
if (seqSH.isHelm() && gi?.polymerTypes && gi.polymerTypes.length > 0)
|
|
55
|
+
polymerType = gi.polymerTypes[0];
|
|
56
|
+
else {
|
|
57
|
+
const a = seqSH.alphabet;
|
|
58
|
+
polymerType = (a === ALPHABET.RNA || a === ALPHABET.DNA) ? PolymerTypes.RNA : PolymerTypes.PEPTIDE;
|
|
59
|
+
}
|
|
60
|
+
// Coerce a UN alphabet to RNA for the RNA polymer path (only used for the
|
|
61
|
+
// bases-only default sugar/phosphate selection; irrelevant in triples mode).
|
|
62
|
+
let alphabet = seqSH.alphabet;
|
|
63
|
+
if (polymerType === PolymerTypes.RNA && alphabet !== ALPHABET.RNA && alphabet !== ALPHABET.DNA)
|
|
64
|
+
alphabet = ALPHABET.RNA;
|
|
65
|
+
// HELM RNA is assembled from per-position sugar/base/phosphate triples;
|
|
66
|
+
// the monomer map must be built with the same roles (and multi-chain
|
|
67
|
+
// stacking) the real conversion uses, otherwise every monomer is treated
|
|
68
|
+
// as a base and the atom map does not match the rendered molfile.
|
|
69
|
+
const isHelmRna = seqSH.isHelm() && polymerType === PolymerTypes.RNA;
|
|
70
|
+
const biotype = isHelmRna ? HelmTypes.NUCLEOTIDE : seqSH.defaultBiotype;
|
|
45
71
|
const seqMList = wu.count(0).take(seqSS.length)
|
|
46
72
|
.map((posIdx) => { return { position: posIdx, symbol: seqSS.getCanonical(posIdx), biotype: biotype }; })
|
|
47
73
|
.toArray();
|
|
48
|
-
const
|
|
49
|
-
|
|
50
|
-
const
|
|
74
|
+
const chainStarts = (gi?.disjointSeqStarts && gi.disjointSeqStarts.length > 0) ?
|
|
75
|
+
gi.disjointSeqStarts.slice() : [0];
|
|
76
|
+
const roles = isHelmRna ?
|
|
77
|
+
buildRolesForHelmRna([seqMList], monomerLib, polymerType, [chainStarts])[0] : undefined;
|
|
78
|
+
const monomersDict = getMonomersDictFromLib([seqMList], [roles], polymerType, alphabet, monomerLib, rdKitModule);
|
|
51
79
|
// Call seq-to-molfile worker core directly
|
|
52
|
-
const molWM = monomerSeqToMolfile(seqMList, monomersDict, alphabet, polymerType);
|
|
80
|
+
const molWM = monomerSeqToMolfile(seqMList, monomersDict, alphabet, polymerType, roles, chainStarts);
|
|
53
81
|
return molWM.monomers;
|
|
54
82
|
}
|
|
55
83
|
else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"monomer-hover.js","sourceRoot":"","sources":["monomer-hover.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAC,QAAQ,EAAC,MAAM,WAAW,CAAC;AAInC,OAAO,EAAC,oBAAoB,EAAE,eAAe,EAAc,eAAe,EAAC,MAAM,yCAAyC,CAAC;AAI3H,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"monomer-hover.js","sourceRoot":"","sources":["monomer-hover.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAC,QAAQ,EAAC,MAAM,WAAW,CAAC;AAInC,OAAO,EAAC,oBAAoB,EAAE,eAAe,EAAc,eAAe,EAAC,MAAM,yCAAyC,CAAC;AAI3H,OAAO,EAAC,SAAS,EAAE,YAAY,EAAC,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAC,QAAQ,EAAC,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAC,oBAAoB,EAAE,sBAAsB,EAAC,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAC,mBAAmB,EAAC,MAAM,yBAAyB,CAAC;AAE5D,OAAO,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAC;AAIjD,MAAM,CAAC,MAAM,qBAAqB,GAAG,mBAAmB,CAAC;AAEzD,MAAM,UAAU,mBAAmB,CAAC,UAAe,EAAE,OAAyB;IAC5E,IAAI,OAAO,GAAG,UAAU,CAAC,qBAAqB,CAAC,CAAC;IAChD,IAAI,CAAC,OAAO;QACV,OAAO,GAAG,UAAU,CAAC,qBAAqB,CAAC,GAAG,EAAE,CAAC;IACnD,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtB,UAAU,CAAC,qBAAqB,CAAC,GAAG,OAAO,CAAC;AAC9C,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,MAAyB,EAAE,MAAyB,EACpD,UAA2B,EAAE,SAAqB,EAAE,WAAqB,EAAE,aAAsB,KAAK;IAEtG,MAAM,KAAK,GAAG,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,YAAY,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,QAAQ,CAAC,GAAG,IAAI,KAAK,CAAC,QAAQ,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC;IACxF,MAAM,wBAAwB,GAAG,KAAK,CAAC,MAAM,EAAE,IAAI,YAAY,CAAC;IAChE,iIAAiI;IACjI,sFAAsF;IACtF,MAAM,2BAA2B,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,YAAY,CAAC;IAEpE,MAAM,8BAA8B,GAAG,CAAC,GAAY,EAAE,EAAE;QACtD,IAAI,GAAG,IAAI,SAAS;YAAE,OAAO,IAAI,CAAC;QAClC,4EAA4E;QAC5E,6EAA6E;QAC7E,yEAAyE;QACzE,4EAA4E;QAC5E,IAAI,wBAAwB;YAC1B,OAAO,GAAG,CAAC;QACb,4EAA4E;QAC5E,2EAA2E;QAC3E,6CAA6C;QAC7C,IAAI,2BAA2B;YAC7B,OAAO,UAAU,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QACxC,OAAO,GAAG,CAAC;IACb,CAAC,CAAC;IAEF,MAAM,sBAAsB,GAAmC,UAAU,CAAC,CAAC,CAAC,MAAM,SAAS,CAAC,yBAAyB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACzI,SAAS,eAAe,CAAC,MAAyB,EAAE,WAAmB;QACrE,MAAM,KAAK,GAAG,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC9C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;YAC7C,MAAM,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC;YAE3B,uEAAuE;YACvE,0EAA0E;YAC1E,6EAA6E;YAC7E,IAAI,WAAwB,CAAC;YAC7B,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,YAAY,IAAI,EAAE,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC;gBAClE,WAAW,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;iBAC9B,CAAC;gBACJ,MAAM,CAAC,GAAG,KAAK,CAAC,QAAoB,CAAC;gBACrC,WAAW,GAAG,CAAC,CAAC,KAAK,QAAQ,CAAC,GAAG,IAAI,CAAC,KAAK,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC;YACrG,CAAC;YAED,0EAA0E;YAC1E,6EAA6E;YAC7E,IAAI,QAAQ,GAAG,KAAK,CAAC,QAAoB,CAAC;YAC1C,IAAI,WAAW,KAAK,YAAY,CAAC,GAAG,IAAI,QAAQ,KAAK,QAAQ,CAAC,GAAG,IAAI,QAAQ,KAAK,QAAQ,CAAC,GAAG;gBAC5F,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC;YAE1B,wEAAwE;YACxE,qEAAqE;YACrE,yEAAyE;YACzE,kEAAkE;YAClE,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE,IAAI,WAAW,KAAK,YAAY,CAAC,GAAG,CAAC;YACrE,MAAM,OAAO,GAAa,SAAS,CAAC,CAAC,CAAE,SAAS,CAAC,UAAuB,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC;YAChG,MAAM,QAAQ,GAAkB,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;iBAC3D,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,GAAG,OAAO,EAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,EAAgB,CAAC,CAAC,CAAC,CAAC;iBACpH,OAAO,EAAE,CAAC;YAEb,MAAM,WAAW,GAAG,CAAC,EAAE,EAAE,iBAAiB,IAAI,EAAE,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC9E,EAAE,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACrC,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC;gBACvB,oBAAoB,CAAC,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAE1F,MAAM,YAAY,GAAG,sBAAsB,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;YACjH,2CAA2C;YAC3C,MAAM,KAAK,GAAG,mBAAmB,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;YACrG,OAAO,KAAK,CAAC,QAAQ,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YACxC,MAAM,KAAK,GAAG,SAAS,CAAC,uBAAuB,CAAC,IAAI,EAAE,sBAAuB,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,4CAA4C;YAC1I,OAAO,KAAK,CAAC,QAAQ,CAAC;QACxB,CAAC;IACH,CAAC;IAED,MAAM,kBAAkB,GAAG,IAAI,QAAQ,CAAqB,EAAC,GAAG,EAAE,GAAG,EAAC,CAAC,CAAC;IAExE,SAAS,aAAa,CAAC,MAAyB,EAAE,WAAmB;QACnE,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACpC,IAAI,GAAG,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC;QAE7B,IAAI,aAAa,GAAG,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChD,IAAI,CAAC,aAAa;YAChB,kBAAkB,CAAC,GAAG,CAAC,GAAG,EAAE,aAAa,GAAG,eAAe,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;QAEpF,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,MAAM,OAAO,GAAqB;QAChC,SAAS,EAAE,MAAM;QACjB,OAAO,EAAE,CAAC,WAAwB,EAAE,UAA8B,EAAE,aAA4B,EAAW,EAAE;YAC3G,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC;YAChC,MAAM,WAAW,GAAG,WAAW,CAAC,aAAc,CAAC;YAC/C,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,CAAC;YACvC,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YACjE,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;YAC/B,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,MAAM,CAAC,SAAS,CAAC,EAAE,IAAI,IAAI,CAAC,UAAU,IAAI,UAAU;gBAC7F,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,IAAI,UAAU,EAAE,QAAQ,CAAC,CAAC,EAC5E,CAAC;gBACD,IAAI,IAAI,EAAE,CAAC;oBACT,eAAe,CAAC,IAAI,CAAC,CAAC;oBACtB,mCAAmC;oBACnC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;gBACzB,CAAC;gBACD,IAAI,CAAC,UAAU,EAAE,CAAC;oBAChB,eAAe,CAAC,IAAI,CAAC,CAAC;oBACtB,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,eAAe,CAAC;oBACd,QAAQ,EAAE,cAAc;oBACxB,WAAW,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE;oBAChC,UAAU,EAAE,UAAU;oBACtB,UAAU,EAAE,MAAM,CAAC,IAAI;oBACvB,WAAW,EAAE,8BAA8B,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;oBACvE,YAAY,EAAE,GAA2B,EAAE;wBACzC,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,MAAM,KAAK,GAAG;4BAC1C,OAAO,SAAS,CAAC;wBAEnB,MAAM,aAAa,GAAG,aAAa,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;wBACzD,IAAI,CAAC,aAAa;4BAChB,OAAO,SAAS,CAAC;wBAEnB,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,8BAA8B,CAAC,UAAU,EAAE,QAAQ,CAAE,CAAC,CAAC,CAAC,iBAAiB;wBAC9G,IAAI,CAAC,UAAU;4BAAE,OAAO,EAAC,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,mBAAmB,EAAE,EAAE,EAAE,mBAAmB,EAAE,EAAE,EAAC,CAAC;wBAEjG,MAAM,GAAG,GAAe,eAAe,CAAC,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC,CAAC;wBAClE,OAAO,GAAG,CAAC;oBACb,CAAC;iBACF,CAAC,CAAC;gBAEH,kCAAkC;gBAClC,oBAAoB;gBACpB,cAAc,CAAC,MAAM,EAAE,CAAC;YAC1B,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QACD,wBAAwB,CAAA,YAAY,EAAE,CAAC,WAA0B,EAA2B,EAAE;YAC5F,IAAI,MAAM,CAAC,MAAM,4EAAmC,IAAI,MAAM;gBAAE,OAAO,SAAS,CAAC;YACjF,IAAI,WAAW,IAAI,IAAI;gBAAE,OAAO,SAAS,CAAC;YAC1C,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACpC,IAAI,CAAC,GAAG;gBAAE,OAAO,SAAS,CAAC;YAE3B,MAAM,aAAa,GAAG,aAAa,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YACzD,IAAI,CAAC,aAAa;gBAAE,OAAO,SAAS,CAAC;YACrC,MAAM,GAAG,GAAe,eAAe,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,UAAU,CAAC,CAAC;YAC5E,OAAO,GAAG,CAAC;QACb,CAAC;KACF,CAAC;IAEF,mBAAmB,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC1C,oBAAoB,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAE3C,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,WAAwB,EAAE,UAA8B;IAExD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,WAAW,CAAC,WAAW,CAAC;QACvC,IAAI,CAAC,MAAM;YAAE,OAAO;QAEpB,MAAM,OAAO,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAC7C,KAAK,IAAI,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC;YACtD,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;YAC1B,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC5D,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;gBACpE,IAAI,CAAC,UAAU;oBACb,MAAM;YACV,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAyB;IAC5D,OAAO,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,CAAC;AAClD,CAAC"}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { monomerSeqToMolfile } from './to-atomic-level-utils';
|
|
2
2
|
onmessage = (event) => {
|
|
3
|
-
const { seqList, rolesList, monomersDict, alphabet, polymerType, start, end } = event.data;
|
|
3
|
+
const { seqList, rolesList, chainStartsList, monomersDict, alphabet, polymerType, start, end } = event.data;
|
|
4
4
|
const resMolList = new Array(end - start);
|
|
5
5
|
const molfileWarningList = new Array(0);
|
|
6
6
|
for (let rowI = start; rowI < end; ++rowI) {
|
|
7
7
|
try {
|
|
8
8
|
const seq = seqList[rowI];
|
|
9
9
|
const roles = rolesList ? rolesList[rowI] : undefined;
|
|
10
|
-
|
|
10
|
+
const chainStarts = chainStartsList ? chainStartsList[rowI] : undefined;
|
|
11
|
+
resMolList[rowI - start] = monomerSeqToMolfile(seq, monomersDict, alphabet, polymerType, roles, chainStarts);
|
|
11
12
|
}
|
|
12
13
|
catch (err) {
|
|
13
14
|
const errMsg = err instanceof Error ? err.message : err.toString();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seq-to-molfile-worker.js","sourceRoot":"","sources":["seq-to-molfile-worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,mBAAmB,EAAC,MAAM,yBAAyB,CAAC;AAG5D,SAAS,GAAG,CAAC,KAAK,EAAE,EAAE;IACpB,MAAM,EAAC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAC,
|
|
1
|
+
{"version":3,"file":"seq-to-molfile-worker.js","sourceRoot":"","sources":["seq-to-molfile-worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,mBAAmB,EAAC,MAAM,yBAAyB,CAAC;AAG5D,SAAS,GAAG,CAAC,KAAK,EAAE,EAAE;IACpB,MAAM,EAAC,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAC,GACjE,KAAK,CAAC,IAAI,CAAC;IACtC,MAAM,UAAU,GAAqB,IAAI,KAAK,CAAiB,GAAG,GAAG,KAAK,CAAC,CAAC;IAC5E,MAAM,kBAAkB,GAAG,IAAI,KAAK,CAAS,CAAC,CAAC,CAAC;IAChD,KAAK,IAAI,IAAI,GAAG,KAAK,EAAE,IAAI,GAAG,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC;QAC1C,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;YAC1B,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACtD,MAAM,WAAW,GAAG,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACxE,UAAU,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,mBAAmB,CAAC,GAAG,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;QAC/G,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,MAAM,MAAM,GAAW,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YAC3E,MAAM,GAAG,GAAW,8BAA8B,IAAI,KAAK,MAAM,GAAG,CAAC;YACrE,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IACD,WAAW,CAAC,EAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,kBAAkB,EAA0B,CAAC,CAAC;AAC7F,CAAC,CAAC"}
|
|
@@ -13,6 +13,6 @@ export type SeqToMolfileResult = {
|
|
|
13
13
|
}[];
|
|
14
14
|
warnings: string[];
|
|
15
15
|
};
|
|
16
|
-
export declare function seqToMolFileWorker(seqCol: DG.Column<string>, monomersDict: MonomerMolGraphMap, alphabet: ALPHABET, polymerType: PolymerType, monomerLib: IMonomerLib, seqHelper: ISeqHelper, rdKitModule: RDModule, rolesList?: (NucleotideRole[] | undefined)[]): Promise<ToAtomicLevelRes>;
|
|
16
|
+
export declare function seqToMolFileWorker(seqCol: DG.Column<string>, monomersDict: MonomerMolGraphMap, alphabet: ALPHABET, polymerType: PolymerType, monomerLib: IMonomerLib, seqHelper: ISeqHelper, rdKitModule: RDModule, rolesList?: (NucleotideRole[] | undefined)[], chainStartsList?: number[][]): Promise<ToAtomicLevelRes>;
|
|
17
17
|
export declare function getMolHighlight(monomerMaps: Iterable<MonomerMapValue>, monomerLib: IMonomerLibBase): ISubstruct;
|
|
18
18
|
//# sourceMappingURL=seq-to-molfile.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seq-to-molfile.d.ts","sourceRoot":"","sources":["seq-to-molfile.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAItC,OAAO,EAAC,QAAQ,EAAC,MAAM,6CAA6C,CAAC;AAGrE,OAAO,EAAC,QAAQ,EAAC,MAAM,wBAAwB,CAAC;AAChD,OAAO,EACqB,UAAU,EAAE,eAAe,EAAE,kBAAkB,EAAE,cAAc,EAE1F,MAAM,SAAS,CAAC;AACjB,OAAO,EAAC,UAAU,EAAE,gBAAgB,EAAC,MAAM,qBAAqB,CAAC;AAEjE,OAAO,EAAC,WAAW,EAAE,eAAe,EAAC,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAc,WAAW,EAAC,MAAM,eAAe,CAAC;AAEvD,OAAO,EAAC,UAAU,EAAC,MAAM,yCAAyC,CAAC;AAGnE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,UAAU,CAAA;KACrB,EAAE,CAAC;IACJ,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB,CAAA;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,kBAAkB,EAClG,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAC5C,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EACrE,SAAS,CAAC,EAAE,CAAC,cAAc,EAAE,GAAG,SAAS,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"seq-to-molfile.d.ts","sourceRoot":"","sources":["seq-to-molfile.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAItC,OAAO,EAAC,QAAQ,EAAC,MAAM,6CAA6C,CAAC;AAGrE,OAAO,EAAC,QAAQ,EAAC,MAAM,wBAAwB,CAAC;AAChD,OAAO,EACqB,UAAU,EAAE,eAAe,EAAE,kBAAkB,EAAE,cAAc,EAE1F,MAAM,SAAS,CAAC;AACjB,OAAO,EAAC,UAAU,EAAE,gBAAgB,EAAC,MAAM,qBAAqB,CAAC;AAEjE,OAAO,EAAC,WAAW,EAAE,eAAe,EAAC,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAc,WAAW,EAAC,MAAM,eAAe,CAAC;AAEvD,OAAO,EAAC,UAAU,EAAC,MAAM,yCAAyC,CAAC;AAGnE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,UAAU,CAAA;KACrB,EAAE,CAAC;IACJ,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB,CAAA;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,kBAAkB,EAClG,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAC5C,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EACrE,SAAS,CAAC,EAAE,CAAC,cAAc,EAAE,GAAG,SAAS,CAAC,EAAE,EAC5C,eAAe,CAAC,EAAE,MAAM,EAAE,EAAE,GAC3B,OAAO,CAAC,gBAAgB,CAAC,CAuD3B;AAED,wBAAgB,eAAe,CAAC,WAAW,EAAE,QAAQ,CAAC,eAAe,CAAC,EAAE,UAAU,EAAE,eAAe,GAAG,UAAU,CAuB/G"}
|
|
@@ -2,7 +2,7 @@ import * as DG from 'datagrok-api/dg';
|
|
|
2
2
|
import wu from 'wu';
|
|
3
3
|
import { getMolColName, hexToPercentRgb } from './utils';
|
|
4
4
|
import { HelmTypes, PolymerTypes } from '../helm/consts';
|
|
5
|
-
export async function seqToMolFileWorker(seqCol, monomersDict, alphabet, polymerType, monomerLib, seqHelper, rdKitModule, rolesList) {
|
|
5
|
+
export async function seqToMolFileWorker(seqCol, monomersDict, alphabet, polymerType, monomerLib, seqHelper, rdKitModule, rolesList, chainStartsList) {
|
|
6
6
|
const srcColLength = seqCol.length;
|
|
7
7
|
const df = seqCol.dataFrame;
|
|
8
8
|
const threadCount = Math.max(navigator.hardwareConcurrency - 2, 1);
|
|
@@ -29,7 +29,7 @@ export async function seqToMolFileWorker(seqCol, monomersDict, alphabet, polymer
|
|
|
29
29
|
resolve(res.data);
|
|
30
30
|
};
|
|
31
31
|
});
|
|
32
|
-
worker.postMessage({ seqList, rolesList, monomersDict, alphabet, polymerType, start, end });
|
|
32
|
+
worker.postMessage({ seqList, rolesList, chainStartsList, monomersDict, alphabet, polymerType, start, end });
|
|
33
33
|
}
|
|
34
34
|
const molList = [];
|
|
35
35
|
const warnings = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seq-to-molfile.js","sourceRoot":"","sources":["seq-to-molfile.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAEtC,OAAO,EAAE,MAAM,IAAI,CAAC;AAWpB,OAAO,EAAC,aAAa,EAAE,eAAe,EAAC,MAAM,SAAS,CAAC;AAGvD,OAAO,EAAC,SAAS,EAAE,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAYvD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAyB,EAAE,YAAgC,EAClG,QAAkB,EAAE,WAAwB,EAC5C,UAAuB,EAAE,SAAqB,EAAE,WAAqB,EACrE,SAA4C;
|
|
1
|
+
{"version":3,"file":"seq-to-molfile.js","sourceRoot":"","sources":["seq-to-molfile.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,11 +15,25 @@ export declare function getFormattedMonomerLib(monomerLib: IMonomerLibBase, poly
|
|
|
15
15
|
* @param {PolymerType} polymerType - Polymer type
|
|
16
16
|
* @param {Array} roles - Optional per-position NucleotideRole tags. When set, RNA assembly
|
|
17
17
|
* uses per-position sugars/phosphates from monomerSeq directly (HELM triples mode).
|
|
18
|
+
* @param {number[]} chainStarts - Optional 0-based start positions of disjoint HELM chains.
|
|
19
|
+
* When more than one chain is present each chain is assembled independently and the
|
|
20
|
+
* chains are stacked vertically into a single molfile (multi-strand HELM support).
|
|
18
21
|
* @return {MolfileWithMap} - Molfile V3000 + per-position monomer index map */
|
|
19
|
-
export declare function monomerSeqToMolfile(monomerSeq: ISeqMonomer[], monomersDict: MonomerMolGraphMap, alphabet: ALPHABET, polymerType: PolymerType, roles?: NucleotideRole[]): MolfileWithMap;
|
|
22
|
+
export declare function monomerSeqToMolfile(monomerSeq: ISeqMonomer[], monomersDict: MonomerMolGraphMap, alphabet: ALPHABET, polymerType: PolymerType, roles?: NucleotideRole[], chainStarts?: number[]): MolfileWithMap;
|
|
20
23
|
/** Keep precision upon floating point operations over atom coordinates
|
|
21
24
|
* @param {number}x - the floating point number
|
|
22
25
|
* @return {number} - the floating point number with the same precision
|
|
23
26
|
*/
|
|
24
27
|
export declare function keepPrecision(x: number): number;
|
|
28
|
+
/** Combine several already-assembled single-chain molfiles into one molfile,
|
|
29
|
+
* stacking them vertically: the first chain keeps its coordinates, every
|
|
30
|
+
* subsequent chain is shifted straight down so its top-most atom sits just
|
|
31
|
+
* below the running bottom of everything placed so far. Atom / bond indices
|
|
32
|
+
* and per-monomer maps are re-based, STEABS collections merged, and the
|
|
33
|
+
* monomer-map keys offset by each chain's start position so the combined map
|
|
34
|
+
* still keys by original flat HELM position.
|
|
35
|
+
* @param {MolfileWithMap[]} parts - per-chain assembled molfiles (chain order)
|
|
36
|
+
* @param {number[]} chainStarts - flat start position of each chain
|
|
37
|
+
* @return {MolfileWithMap} - single combined molfile + merged monomer map */
|
|
38
|
+
export declare function combineMolfilesVertically(parts: MolfileWithMap[], chainStarts: number[]): MolfileWithMap;
|
|
25
39
|
//# sourceMappingURL=to-atomic-level-utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"to-atomic-level-utils.d.ts","sourceRoot":"","sources":["to-atomic-level-utils.ts"],"names":[],"mappings":"AAEA,OAAO,EAA4C,cAAc,EAAwB,kBAAkB,EACzG,cAAc,EAAC,MAAM,SAAS,CAAC;AAEjC,OAAO,EAAC,QAAQ,EAAa,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAC,eAAe,EAAU,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAC,WAAW,EAAE,WAAW,EAAC,MAAM,eAAe,CAAC;AAIvD;;;;iHAIiH;AACjH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,GACxE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAqBlB;AAED
|
|
1
|
+
{"version":3,"file":"to-atomic-level-utils.d.ts","sourceRoot":"","sources":["to-atomic-level-utils.ts"],"names":[],"mappings":"AAEA,OAAO,EAA4C,cAAc,EAAwB,kBAAkB,EACzG,cAAc,EAAC,MAAM,SAAS,CAAC;AAEjC,OAAO,EAAC,QAAQ,EAAa,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAC,eAAe,EAAU,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAC,WAAW,EAAE,WAAW,EAAC,MAAM,eAAe,CAAC;AAIvD;;;;iHAIiH;AACjH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,GACxE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAqBlB;AAED;;;;;;;;;;+EAU+E;AAC/E,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,WAAW,EAAE,EAAE,YAAY,EAAE,kBAAkB,EAC3D,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAC5C,KAAK,CAAC,EAAE,cAAc,EAAE,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,GAC/C,cAAc,CA8IhB;AAmWD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE/C;AAmFD;;;;;;;;;6EAS6E;AAC7E,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,cAAc,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,cAAc,CAkFxG"}
|
|
@@ -36,12 +36,31 @@ export function getFormattedMonomerLib(monomerLib, polymerType, alphabet) {
|
|
|
36
36
|
* @param {PolymerType} polymerType - Polymer type
|
|
37
37
|
* @param {Array} roles - Optional per-position NucleotideRole tags. When set, RNA assembly
|
|
38
38
|
* uses per-position sugars/phosphates from monomerSeq directly (HELM triples mode).
|
|
39
|
+
* @param {number[]} chainStarts - Optional 0-based start positions of disjoint HELM chains.
|
|
40
|
+
* When more than one chain is present each chain is assembled independently and the
|
|
41
|
+
* chains are stacked vertically into a single molfile (multi-strand HELM support).
|
|
39
42
|
* @return {MolfileWithMap} - Molfile V3000 + per-position monomer index map */
|
|
40
|
-
export function monomerSeqToMolfile(monomerSeq, monomersDict, alphabet, polymerType, roles) {
|
|
43
|
+
export function monomerSeqToMolfile(monomerSeq, monomersDict, alphabet, polymerType, roles, chainStarts) {
|
|
41
44
|
if (monomerSeq.length === 0) {
|
|
42
45
|
// throw new Error('monomerSeq is empty');
|
|
43
46
|
return MolfileWithMap.createEmpty();
|
|
44
47
|
}
|
|
48
|
+
// Multi-chain HELM (e.g. RNA1{...}|RNA2{...}): assemble each disjoint chain
|
|
49
|
+
// on its own, then stack them vertically into a single molfile. Each chain
|
|
50
|
+
// reuses the exact single-chain assembly below, so its geometry, capping and
|
|
51
|
+
// per-monomer atom/bond map are unchanged; combineMolfilesVertically shifts
|
|
52
|
+
// the coordinates and re-bases the atom/bond indices and monomer-map keys.
|
|
53
|
+
if (chainStarts && chainStarts.length > 1) {
|
|
54
|
+
const parts = new Array(chainStarts.length);
|
|
55
|
+
for (let c = 0; c < chainStarts.length; ++c) {
|
|
56
|
+
const s = chainStarts[c];
|
|
57
|
+
const e = c + 1 < chainStarts.length ? chainStarts[c + 1] : monomerSeq.length;
|
|
58
|
+
const subSeq = monomerSeq.slice(s, e);
|
|
59
|
+
const subRoles = roles ? roles.slice(s, e) : undefined;
|
|
60
|
+
parts[c] = monomerSeqToMolfile(subSeq, monomersDict, alphabet, polymerType, subRoles);
|
|
61
|
+
}
|
|
62
|
+
return combineMolfilesVertically(parts, chainStarts);
|
|
63
|
+
}
|
|
45
64
|
// Triples mode is on only when the caller flagged the row with roles
|
|
46
65
|
// (built and validated by `buildRolesForHelmRna` in to-atomic-level.ts).
|
|
47
66
|
// The roles array carries the per-position semantics — including
|
|
@@ -451,4 +470,163 @@ function runTriplesAssembly(monomerSeq, roles, monomersDict, molfileAtomBlock, m
|
|
|
451
470
|
export function keepPrecision(x) {
|
|
452
471
|
return Math.round(C.PRECISION_FACTOR * x) / C.PRECISION_FACTOR;
|
|
453
472
|
}
|
|
473
|
+
// Vertical gap (in molfile coordinate units) inserted between stacked chains
|
|
474
|
+
// of a multi-strand HELM. Roughly two bond lengths — enough to read the strands
|
|
475
|
+
// as separate without pushing them far apart.
|
|
476
|
+
const CHAIN_VERTICAL_GAP = 3.0;
|
|
477
|
+
const STEABS_MARKER = 'M V30 MDLV30/STEABS ATOMS=(';
|
|
478
|
+
/** Split `body` into its first `n` space-separated tokens plus a trailing
|
|
479
|
+
* remainder token (so the result has n+1 entries). The remainder keeps any
|
|
480
|
+
* embedded spaces of the tail verbatim.
|
|
481
|
+
* @param {string} body - the line body to split
|
|
482
|
+
* @param {number} n - number of leading tokens to peel off
|
|
483
|
+
* @return {string[]} - the n tokens followed by the remainder */
|
|
484
|
+
function splitLeadingTokens(body, n) {
|
|
485
|
+
const out = [];
|
|
486
|
+
let s = body;
|
|
487
|
+
for (let i = 0; i < n; ++i) {
|
|
488
|
+
const sp = s.indexOf(' ');
|
|
489
|
+
if (sp === -1) {
|
|
490
|
+
out.push(s);
|
|
491
|
+
s = '';
|
|
492
|
+
continue;
|
|
493
|
+
}
|
|
494
|
+
out.push(s.substring(0, sp));
|
|
495
|
+
s = s.substring(sp + 1);
|
|
496
|
+
}
|
|
497
|
+
out.push(s);
|
|
498
|
+
return out;
|
|
499
|
+
}
|
|
500
|
+
/** Extract the data lines (`M V30 ...`) between a BEGIN/END marker pair.
|
|
501
|
+
* @param {string} molfile - the V3000 molfile
|
|
502
|
+
* @param {string} beginMarker - the block BEGIN marker line
|
|
503
|
+
* @param {string} endMarker - the block END marker line
|
|
504
|
+
* @return {string[]} - the data lines of the block, newline stripped */
|
|
505
|
+
function extractBlockDataLines(molfile, beginMarker, endMarker) {
|
|
506
|
+
const begin = molfile.indexOf(beginMarker);
|
|
507
|
+
if (begin === -1)
|
|
508
|
+
return [];
|
|
509
|
+
const start = molfile.indexOf('\n', begin) + 1;
|
|
510
|
+
const end = molfile.indexOf(endMarker, start);
|
|
511
|
+
return molfile.substring(start, end === -1 ? molfile.length : end)
|
|
512
|
+
.split('\n')
|
|
513
|
+
.filter((l) => l.startsWith(C.V3K_BEGIN_DATA_LINE))
|
|
514
|
+
.map((l) => l.substring(C.V3K_BEGIN_DATA_LINE.length));
|
|
515
|
+
}
|
|
516
|
+
/** Parse a molfile produced by monomerSeqToMolfile back into atoms / bonds /
|
|
517
|
+
* stereo-atom indices. Robust because we control the exact serialization
|
|
518
|
+
* format; only the fields we need to renumber (indices) and shift (y) are
|
|
519
|
+
* parsed, everything past them is preserved verbatim as an opaque tail.
|
|
520
|
+
* @param {string} molfile - the V3000 molfile
|
|
521
|
+
* @return {ParsedMol} - parsed atoms, bonds and STEABS atom indices */
|
|
522
|
+
function parseGeneratedMolfile(molfile) {
|
|
523
|
+
const atoms = [];
|
|
524
|
+
for (const body of extractBlockDataLines(molfile, C.V3K_BEGIN_ATOM_BLOCK, C.V3K_END_ATOM_BLOCK)) {
|
|
525
|
+
// body: "<idx> <type> <x> <y> <z> <...kwargs>"
|
|
526
|
+
const t = splitLeadingTokens(body, 4); // [idx, type, x, y, tail]
|
|
527
|
+
atoms.push({ type: t[1], xStr: t[2], y: parseFloat(t[3]), tail: t[4] });
|
|
528
|
+
}
|
|
529
|
+
const bonds = [];
|
|
530
|
+
for (const body of extractBlockDataLines(molfile, C.V3K_BEGIN_BOND_BLOCK, C.V3K_END_BOND_BLOCK)) {
|
|
531
|
+
// body: "<idx> <btype> <a1> <a2> <...cfg/kwargs>"
|
|
532
|
+
const t = splitLeadingTokens(body, 4); // [idx, btype, a1, a2, tail]
|
|
533
|
+
bonds.push({ btype: t[1], a1: parseInt(t[2]), a2: parseInt(t[3]), tail: t[4] });
|
|
534
|
+
}
|
|
535
|
+
const steabs = [];
|
|
536
|
+
let idx = molfile.indexOf(STEABS_MARKER);
|
|
537
|
+
while (idx !== -1) {
|
|
538
|
+
idx += STEABS_MARKER.length;
|
|
539
|
+
const closeIdx = molfile.indexOf(')', idx);
|
|
540
|
+
// first entry inside the parens is the atom count, not an atom index
|
|
541
|
+
steabs.push(...molfile.substring(idx, closeIdx).split(' ').slice(1)
|
|
542
|
+
.map((s) => parseInt(s)).filter((n) => !Number.isNaN(n)));
|
|
543
|
+
idx = molfile.indexOf(STEABS_MARKER, closeIdx);
|
|
544
|
+
}
|
|
545
|
+
return { atoms, bonds, steabs };
|
|
546
|
+
}
|
|
547
|
+
/** Combine several already-assembled single-chain molfiles into one molfile,
|
|
548
|
+
* stacking them vertically: the first chain keeps its coordinates, every
|
|
549
|
+
* subsequent chain is shifted straight down so its top-most atom sits just
|
|
550
|
+
* below the running bottom of everything placed so far. Atom / bond indices
|
|
551
|
+
* and per-monomer maps are re-based, STEABS collections merged, and the
|
|
552
|
+
* monomer-map keys offset by each chain's start position so the combined map
|
|
553
|
+
* still keys by original flat HELM position.
|
|
554
|
+
* @param {MolfileWithMap[]} parts - per-chain assembled molfiles (chain order)
|
|
555
|
+
* @param {number[]} chainStarts - flat start position of each chain
|
|
556
|
+
* @return {MolfileWithMap} - single combined molfile + merged monomer map */
|
|
557
|
+
export function combineMolfilesVertically(parts, chainStarts) {
|
|
558
|
+
const combinedAtomLines = [];
|
|
559
|
+
const combinedBondLines = [];
|
|
560
|
+
const combinedSteabs = [];
|
|
561
|
+
const combinedMap = new MonomerMap();
|
|
562
|
+
let atomOffset = 0;
|
|
563
|
+
let bondOffset = 0;
|
|
564
|
+
let runningBottom = Number.POSITIVE_INFINITY; // lowest y placed so far
|
|
565
|
+
let anyPlaced = false;
|
|
566
|
+
for (let c = 0; c < parts.length; ++c) {
|
|
567
|
+
const part = parts[c];
|
|
568
|
+
if (!part || !part.molfile)
|
|
569
|
+
continue;
|
|
570
|
+
const pm = parseGeneratedMolfile(part.molfile);
|
|
571
|
+
if (pm.atoms.length === 0)
|
|
572
|
+
continue;
|
|
573
|
+
let minY = Number.POSITIVE_INFINITY;
|
|
574
|
+
let maxY = Number.NEGATIVE_INFINITY;
|
|
575
|
+
for (const a of pm.atoms) {
|
|
576
|
+
if (a.y < minY)
|
|
577
|
+
minY = a.y;
|
|
578
|
+
if (a.y > maxY)
|
|
579
|
+
maxY = a.y;
|
|
580
|
+
}
|
|
581
|
+
// First placed chain keeps its coordinates; later chains drop below the
|
|
582
|
+
// current bottom, leaving CHAIN_VERTICAL_GAP between the strands.
|
|
583
|
+
const yShift = anyPlaced ? keepPrecision(runningBottom - CHAIN_VERTICAL_GAP - maxY) : 0;
|
|
584
|
+
for (let ai = 0; ai < pm.atoms.length; ++ai) {
|
|
585
|
+
const a = pm.atoms[ai];
|
|
586
|
+
const newIdx = atomOffset + ai + 1;
|
|
587
|
+
const newY = keepPrecision(a.y + yShift);
|
|
588
|
+
combinedAtomLines.push(C.V3K_BEGIN_DATA_LINE + newIdx + ' ' + a.type + ' ' + a.xStr + ' ' + newY + ' ' + a.tail + '\n');
|
|
589
|
+
}
|
|
590
|
+
for (let bi = 0; bi < pm.bonds.length; ++bi) {
|
|
591
|
+
const b = pm.bonds[bi];
|
|
592
|
+
const newIdx = bondOffset + bi + 1;
|
|
593
|
+
const tail = b.tail ? ' ' + b.tail : '';
|
|
594
|
+
combinedBondLines.push(C.V3K_BEGIN_DATA_LINE + newIdx + ' ' + b.btype + ' ' + (b.a1 + atomOffset) + ' ' + (b.a2 + atomOffset) + tail + '\n');
|
|
595
|
+
}
|
|
596
|
+
for (const s of pm.steabs)
|
|
597
|
+
combinedSteabs.push(s + atomOffset);
|
|
598
|
+
const posOffset = chainStarts[c] ?? 0;
|
|
599
|
+
for (const [pos, val] of part.monomers) {
|
|
600
|
+
combinedMap.set(posOffset + pos, {
|
|
601
|
+
biotype: val.biotype,
|
|
602
|
+
symbol: val.symbol,
|
|
603
|
+
atoms: val.atoms.map((x) => x + atomOffset),
|
|
604
|
+
bonds: val.bonds.map((x) => x + bondOffset),
|
|
605
|
+
});
|
|
606
|
+
}
|
|
607
|
+
const newBottom = keepPrecision(minY + yShift);
|
|
608
|
+
runningBottom = anyPlaced ? Math.min(runningBottom, newBottom) : newBottom;
|
|
609
|
+
anyPlaced = true;
|
|
610
|
+
atomOffset += pm.atoms.length;
|
|
611
|
+
bondOffset += pm.bonds.length;
|
|
612
|
+
}
|
|
613
|
+
if (!anyPlaced)
|
|
614
|
+
return MolfileWithMap.createEmpty();
|
|
615
|
+
let result = '';
|
|
616
|
+
result += C.V3K_HEADER_FIRST_LINE;
|
|
617
|
+
result += C.V3K_HEADER_SECOND_LINE;
|
|
618
|
+
result += C.V3K_BEGIN_CTAB_BLOCK;
|
|
619
|
+
result += C.V3K_BEGIN_COUNTS_LINE + atomOffset + ' ' + bondOffset + C.V3K_COUNTS_LINE_ENDING;
|
|
620
|
+
result += C.V3K_BEGIN_ATOM_BLOCK;
|
|
621
|
+
result += combinedAtomLines.join('');
|
|
622
|
+
result += C.V3K_END_ATOM_BLOCK;
|
|
623
|
+
result += C.V3K_BEGIN_BOND_BLOCK;
|
|
624
|
+
result += combinedBondLines.join('');
|
|
625
|
+
result += C.V3K_END_BOND_BLOCK;
|
|
626
|
+
if (combinedSteabs.length > 0)
|
|
627
|
+
result += getCollectionBlock(combinedSteabs);
|
|
628
|
+
result += C.V3K_END_CTAB_BLOCK;
|
|
629
|
+
result += C.V3K_END;
|
|
630
|
+
return { molfile: result, monomers: combinedMap };
|
|
631
|
+
}
|
|
454
632
|
//# sourceMappingURL=to-atomic-level-utils.js.map
|