@datagrok/helm 3.0.1 → 3.0.3
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 +13 -0
- package/CLAUDE.md +78 -92
- package/dist/489.js +2 -0
- package/dist/489.js.map +1 -0
- package/dist/package-test.js +1 -1
- package/dist/package-test.js.map +1 -1
- package/dist/package.js +1 -1
- package/dist/package.js.map +1 -1
- package/files/samples/helm-showcase.csv +7 -9
- package/package.json +12 -9
- package/src/helm-helper.ts +3 -0
- package/src/package-api.ts +1 -0
- package/src/package-test.ts +0 -4
- package/src/package.g.ts +2 -0
- package/src/package.ts +4 -1
- package/src/tests/helm-input-tests.ts +3 -3
- package/src/utils/helm-grid-cell-renderer.ts +3 -0
- package/test-console-output-1.log +344 -0
- package/test-playwright-report.json +118 -0
- package/test-record-1.mp4 +0 -0
- package/test-report-playwright.csv +1 -0
- package/tsconfig.json +2 -1
- package/dist/137.js +0 -2
- package/dist/137.js.map +0 -1
- package/dist/323.js +0 -2
- package/dist/323.js.map +0 -1
- package/dist/455.js +0 -2
- package/dist/455.js.map +0 -1
- package/dist/657.js +0 -2
- package/dist/657.js.map +0 -1
- package/dist/782.js +0 -2
- package/dist/782.js.map +0 -1
- package/dist/884.js +0 -2
- package/dist/884.js.map +0 -1
- package/dist/94.js +0 -2
- package/dist/94.js.map +0 -1
- package/dist/libraries_bio_src_monomer-works_seq-to-molfile-worker_ts.js +0 -16420
- package/dist/libraries_bio_src_monomer-works_seq-to-molfile-worker_ts.js.map +0 -1
- package/dist/package-dojo.js +0 -2
- package/dist/package-dojo.js.map +0 -1
- package/dist/vendors-HELM_node_modules_lru-cache_dist_esm_index_js.js +0 -1560
- package/dist/vendors-HELM_node_modules_lru-cache_dist_esm_index_js.js.map +0 -1
package/dist/323.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"323.js","mappings":"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","sources":["webpack://helm/webpack/runtime/chunk loaded","webpack://helm/webpack/runtime/startup chunk dependencies","webpack://helm/../../libraries/bio/src/helm/consts.ts","webpack://helm/../../libraries/bio/src/monomer-works/consts.ts","webpack://helm/../../libraries/bio/src/monomer-works/types.ts","webpack://helm/../../libraries/bio/src/utils/const.ts","webpack://helm/../../libraries/bio/src/utils/macromolecule/types.ts","webpack://helm/../../libraries/bio/src/utils/macromolecule/consts.ts","webpack://helm/../../libraries/bio/src/monomer-works/monomer-works.ts","webpack://helm/../../libraries/bio/src/monomer-works/to-atomic-level-utils.ts","webpack://helm/../../libraries/bio/src/monomer-works/seq-to-molfile-worker.ts","webpack://helm/webpack/bootstrap","webpack://helm/webpack/runtime/define property getters","webpack://helm/webpack/runtime/ensure chunk","webpack://helm/webpack/runtime/get javascript chunk filename","webpack://helm/webpack/runtime/global","webpack://helm/webpack/runtime/hasOwnProperty shorthand","webpack://helm/webpack/runtime/publicPath","webpack://helm/webpack/runtime/importScripts chunk loading","webpack://helm/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn __webpack_require__.e(657).then(next);\n};","// HELM type vocabulary is owned by `@datagrok-libraries/hwe` (the standalone\n// HELM editor) and re-exported here as the single source of truth. The string\n// values match the canonical Pistoia HELM Web Editor, except `NUCLEOTIDE` which\n// uses the corrected spelling `HELM_NUCLEOTIDE` (was `HELM_NUCLETIDE`).\nimport {HelmTypes, MonomerTypes, PolymerTypes} from '@datagrok-libraries/hwe';\n\nexport {HelmTypes, MonomerTypes, PolymerTypes};\n\n// hwe migration: these two small enums are not part of the hwe value vocabulary.\n// They are defined here locally (replicating the legacy HELM Web Editor values)\n// so `@datagrok-libraries/bio` no longer depends on\n// `@datagrok-libraries/helm-web-editor`.\nexport enum MonomerNumberingTypes {\n default = 0,\n continuous = 1,\n}\n\nexport enum HelmTabKeys {\n Sequence = 'sequence',\n Helm = 'notation',\n Properties = 'properties',\n StructureView = 'structureview',\n}\n","import {PolymerTypes} from '../helm/consts';\n\nexport 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: 10_000, // HELMCoreLibrary has 4 significant digits after decimal point in atom coordinates\n // symbols for the corresponding monomers in HELM library\n\n DEOXYRIBOSE: {polymerType: PolymerTypes.RNA, symbol: 'd'},\n RIBOSE: {polymerType: PolymerTypes.RNA, symbol: 'r'},\n PHOSPHATE: {polymerType: PolymerTypes.RNA, symbol: 'p'},\n\n OXYGEN: 'O',\n HYDROGEN: 'H',\n} as const;\n\n","// interface for typed arrays, like Float32Array and Uint32Array\nimport {ALPHABET} from '../utils/macromolecule';\nimport {HELM_POLYMER_TYPE} from '../utils/const';\nimport {HelmType, ISeqMonomer} from '../helm/types';\n\nexport interface ITypedArray {\n length: number;\n [key: number]: any;\n}\n\n/** Type for user settings of monomer library set to use. */\nexport type UserLibSettings = {\n exclude: string[],\n explicit: string[],\n /** Libraries might contain different monomers for same symbol. Object for monomer symbol to library name of choice*/\n duplicateMonomerPreferences: {[polymerType: string]: {[monomerSymbol: string]: string}}\n}\n\n/** Stores necessary data about atoms of a monomer parsed from Molfile */\nexport type Atoms = {\n /** Element symbols for monomer's atoms */\n atomTypes: string[],\n /** Cartesian coordiantes of monomer's atoms */\n x: Float32Array,\n y: Float32Array,\n /** V3K atom line may contain keyword args */\n kwargs: string[],\n }\n\n/** Stores necessary data about bonds of a monomer parsed from Molfile */\nexport type Bonds = {\n /** bond types for all lines of Molfile bond block */\n bondTypes: Uint32Array,\n /** Indices of all atom pairs, indexing starting from 1 */\n atomPairs: number[][],\n /** If a bond has CFG=... keyword argument, it is parsed and sotred as a\n * value of the map, with the key being the bond's index */\n bondConfiguration: Map<number, number>,\n /** V3K bond line may contain keyword args */\n kwargs: Map<number, string>,\n}\n\n/** Metadata associated with the monomer necessary to restore the resulting molfile */\nexport type MonomerMetadata = {\n /** terminal nodes: 0-th corresponds to the \"leftmost\" one, 1st, to the \"rightmost\",\n * e.g. N-terminus and C-terminus in peptides */\n terminalNodes: number[],\n /** r-group nodes: 0-th corresponds to the \"leftmost\" one, 1st, to the \"rightmost\" */\n rNodes: number[],\n /** shift from the origin to the next backbone, null for branch monomers */\n backboneShift: number[] | null,\n /** shift from the origin to the next branch, null for branch monomers */\n branchShift: number[] | null\n}\n\nexport type MolGraph = {\n atoms: Atoms,\n bonds: Bonds,\n meta: MonomerMetadata,\n stereoAtoms?: number[],\n terminalR2Atom?: string, // for peptides, store the removed R2 Atom type, if any\n}\n\nexport type MonomerMolGraphMap = { [polymerType: string]: { [symbol: string]: MolGraph } };\n\nexport type LibMonomerKey = { polymerType: string, symbol: string }\n\nexport function getMolGraph(dict: MonomerMolGraphMap, libKey: LibMonomerKey): MolGraph | undefined {\n return dict[libKey.polymerType]?.[libKey.symbol];\n}\n\nexport function hasMolGraph(dict: MonomerMolGraphMap, libKey: LibMonomerKey): boolean {\n return !!dict[libKey.polymerType]?.[libKey.symbol];\n}\n\nexport function setMolGraph(dict: MonomerMolGraphMap, libKey: LibMonomerKey, value: MolGraph): void {\n let pt = dict[libKey.polymerType];\n if (!pt)\n pt = dict[libKey.polymerType] = {};\n pt[libKey.symbol] = value;\n}\n\n// export function getMolGraph(\n// dict: MonomerMolGraphMap, polymerType: PolymerType, symbol: string\n// ): MolGraph | undefined {\n// return dict[polymerType]?.[symbol];\n// }\n\nexport type Point = {\n x: number,\n y: number\n}\n\n/** Helper structure wrapping common arguments to several functions */\nexport type LoopVariables = {\n i: number,\n nodeShift: number,\n bondShift: number,\n backbonePositionShift: number[],\n backboneAttachNode: number; // node to which the next backbone is attached\n branchPositionShift: number[],\n branchAttachNode: number,\n flipFactor: number,\n // todo: should we consider representations other than planar?\n}\n\n/** Helper structure wrapping common arguments to several functions */\nexport type LoopConstants = {\n sugar: MolGraph | null,\n phosphate: MolGraph | null,\n seqLength: number,\n atomCount: number,\n bondCount: number,\n}\n\n/** Helper structure to simulate pointer to number */\nexport type NumberWrapper = {\n value: number | null // null if there is no branch attach node\n}\n\n/** Role of an entry in a HELM RNA splitted sequence.\n * SUGAR/BASE/PHOSPHATE are the standard triple positions.\n * TERMINAL_5P marks a 5'-end terminal modifier (e.g. Chol) — a monomer\n * with R2 only that takes the place of the leading sugar.\n * TERMINAL_3P marks a 3'-end terminal modifier (e.g. GalNAc) — a monomer\n * with R1 only that takes the place of the trailing phosphate. The OH cap\n * MUST be omitted when a TERMINAL_3P is present. */\nexport enum NucleotideRole {\n SUGAR = 0,\n BASE = 1,\n PHOSPHATE = 2,\n TERMINAL_5P = 3,\n TERMINAL_3P = 4,\n}\n\nexport type MonomerMapValue = { biotype: HelmType, symbol: string, atoms: number[], bonds: number[] };\n\nexport class MonomerMap extends Map<number, MonomerMapValue> {\n constructor(entries?: [number, MonomerMapValue][] | null) {\n super(entries);\n }\n}\n\n/** @property monomers key - helm seq position, */\nexport class MolfileWithMap {\n constructor(\n public readonly molfile: string,\n public readonly monomers: MonomerMap,\n ) {}\n\n static createEmpty() { return new MolfileWithMap('', new MonomerMap(null)); }\n}\n\n/** Only simple types allowed for worker data, avoid classes with methods */\nexport type SeqToMolfileWorkerData = {\n seqList: ISeqMonomer[][],\n /** Per-row parallel array of NucleotideRole tags (only set for rows in\n * \"HELM RNA triples\" mode, where each nucleotide contributes 3 entries\n * sugar/base/phosphate). undefined for legacy bases-only rows. */\n rolesList?: (NucleotideRole[] | undefined)[],\n monomersDict: MonomerMolGraphMap,\n alphabet: ALPHABET,\n polymerType: HELM_POLYMER_TYPE,\n start: number,\n end: number,\n}\n\nexport type SeqToMolfileWorkerRes = {\n molfiles: MolfileWithMap[];\n warnings: string[]\n}\n","import {MonomerType, PolymerType} from '../helm/types';\nimport {MonomerTypes, PolymerTypes} from '../helm/consts';\nimport {RGroup} from '../types/monomer-library';\n\n// hwe exports the HELM type vocabulary as `as const` objects (value-only), not\n// TS enums, so we re-create the value+type duality the old `import X = Enum`\n// aliases provided — consumers use these both as a value (`.RNA`) and as a type.\nconst HELM_POLYMER_TYPE = PolymerTypes;\ntype HELM_POLYMER_TYPE = PolymerType;\nconst HELM_MONOMER_TYPE = MonomerTypes;\ntype HELM_MONOMER_TYPE = MonomerType;\n\nexport {HELM_POLYMER_TYPE, HELM_MONOMER_TYPE};\n\n/** Required HELM library monomer fields:\n * https://github.com/PistoiaHELM/HELMMonomerSets/blob/master/HELMmonomerSchema.json */\nexport const enum HELM_REQUIRED_FIELD {\n SYMBOL = 'symbol',\n NAME = 'name',\n MOLFILE = 'molfile',\n AUTHOR = 'author',\n ID = 'id',\n RGROUPS = 'rgroups',\n SMILES = 'smiles',\n POLYMER_TYPE = 'polymerType',\n MONOMER_TYPE = 'monomerType',\n CREATE_DATE = 'createDate',\n}\n\n// fields of \"rgroups\" sub-object in HELM library\nexport const enum HELM_RGROUP_FIELDS {\n CAP_GROUP_SMILES = 'capGroupSmiles',\n // WARNING: both capitalization variants coexist\n CAP_GROUP_SMILES_UPPERCASE = 'capGroupSMILES',\n ALTERNATE_ID = 'alternateId',\n CAP_GROUP_NAME = 'capGroupName',\n LABEL = 'label',\n}\n\nexport const enum HELM_OPTIONAL_FIELDS {\n NATURAL_ANALOG = 'naturalAnalog',\n META = 'meta', // for SequenceTranslator\n}\n\n// todo: remove\nexport const enum HELM_FIELDS {\n MONOMER_TYPE = 'monomerType',\n SMILES = 'smiles',\n NAME = 'name',\n AUTHOR = 'author',\n MOLFILE = 'molfile',\n NATURAL_ANALOG = 'naturalAnalog',\n RGROUPS = 'rgroups',\n CREATE_DATE = 'createDate',\n ID = 'id',\n POLYMER_TYPE = 'polymerType',\n SYMBOL = 'symbol'\n}\n\n// core fields of HELM library object used in toAtomicLevel function\nexport const HELM_CORE_FIELDS = [\n HELM_FIELDS.SYMBOL,\n HELM_FIELDS.MOLFILE,\n HELM_FIELDS.RGROUPS,\n HELM_FIELDS.NAME,\n // HELM_FIELDS.MONOMER_TYPE, // add if terminal monomers for PEPTIDEs to be\n // supported\n];\n\nexport const SDF_MONOMER_NAME = 'MonomerName';\n\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};\n\nexport const DUMMY_MONOMER = {\n 'monomerType': 'Backbone' as MonomerType,\n 'smiles': '',\n 'name': '',\n 'author': 'Datagrok',\n 'molfile': '',\n 'naturalAnalog': '',\n 'rgroups': [] as RGroup[],\n 'createDate': null,\n 'id': 0,\n 'polymerType': 'PEPTIDE' as PolymerType,\n 'symbol': ''\n} as const;\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;\n\nexport const RIBOSE_SYMBOL = 'r';\nexport const DEOXYRIBOSE_SYMBOL = 'd';\nexport const PHOSPHATE_SYMBOL = 'p';\nexport const HELM_WRAPPERS_REGEXP = new RegExp(\n `[${RIBOSE_SYMBOL}${DEOXYRIBOSE_SYMBOL}]\\\\((\\\\w)\\\\)${PHOSPHATE_SYMBOL}?`,\n 'g'\n);\n\n","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {CellRendererBackBase} from '../cell-renderer-back-base';\nimport {ISeqHandler} from './seq-handler';\nimport {PolymerType} from '../../helm/types';\nimport {NOTATION_PROVIDER_CONSTRUCTOR_ROLE} from './consts';\n\nexport type SeqSplittedBase = ArrayLike<string> & Iterable<string>;\n\nexport interface ISeqConnection {\n seq1Type: PolymerType;\n seq2Type: PolymerType;\n seqIndex1: number;\n seqIndex2: number;\n monomerIndex1: number;\n monomerIndex2: number;\n rGroup1: number;\n rGroup2: number;\n}\n\nexport interface ISeqGraphInfo {\n /** Connections between monomers with numbers - note that monomer numbers are 0-based*/\n connections: ISeqConnection[];\n /** Start positions of disjoint sequence parts in the original sequence */\n disjointSeqStarts: number[];\n /** Polimer types same as the indexes. only applicapble to helm */\n polymerTypes?: PolymerType[];\n}\n\nexport interface ISeqSplitted {\n\n graphInfo?: ISeqGraphInfo;\n\n isGap(posIdx: number): boolean;\n\n /** */\n getCanonical(posIdx: number): string;\n\n /** For fasta and Helm must not be enclosed to square brackets [meA].*/\n getOriginal(posIdx: number): string;\n\n // TODO: Get ISeqMonomer for seq position\n // get(posIdx: number): ISeqMonomer;\n\n length: number;\n\n /** Returns list of canonical monomers in the region specified */\n getCanonicalRegion(start: number, end: number): string[];\n\n /** Returns the list of original monomers in the region specified */\n getOriginalRegion(start: number, end: number): string[];\n\n get gapOriginal(): string;\n}\n\n/**\n * Extracts displayable monomer symbol(s) from a raw position value.\n * Used by the Monomer cell renderer when a notation provider needs custom\n * interpretation of split-to-monomer position values.\n *\n * For example, a Parabilis position `[VHL1379]*dLys` contains two monomers\n * (`VHL1379` and `dLys`). The canonicalizer separates them with\n * {@link MONOMER_MOTIF_SPLITTER} so the renderer can display/tooltip each one.\n */\nexport interface IMonomerCanonicalizer {\n /** Convert a raw position value to a displayable monomer string.\n * If the position contains multiple monomers, join them with\n * {@link MONOMER_MOTIF_SPLITTER} (` , `). */\n canonicalize(original: string): string;\n\n /** Returns true if the raw position value represents a gap in this notation. */\n isGap(original: string): boolean;\n}\n\nexport interface INotationProvider {\n get defaultGapOriginal(): string;\n\n /** Adjust {@link seqHandler} units, {@link seqHandler.column.tags} by {@link seqHandler} constructor */\n setUnits(seqHandler: ISeqHandler): void;\n\n get splitter(): SplitterFunc;\n\n /** Any Macromolecule can be presented as Helm notation */\n getHelm(seq: string, options: any): string;\n\n createCellRendererBack(gridCol: DG.GridColumn | null, tableCol: DG.Column<string>): CellRendererBackBase<string>;\n\n /** nqName of a registered function that returns an {@link IMonomerCanonicalizer} instance.\n * When set, split-to-monomers will tag Monomer columns with this function name so the\n * monomer cell renderer can resolve display symbols from raw position values.\n * Return null/undefined if no custom canonicalization is needed. */\n readonly monomerCanonicalizerFuncName?: string | null;\n}\n\nexport abstract class NotationProviderBase {\n /** Name of the custom notation */\n static get notationName(): string {\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(): boolean {\n return false;\n };\n\n /** Method for converting HELM to this notation */\n static convertFromHelm(helm: string, options: any): string {\n throw new Error(`Method convertFromHelm not implemented for this notation provider`);\n };\n\n static async getProviderConstructors(): Promise<typeof NotationProviderBase[]> {\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: any[] = 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\nexport type SeqColStats = { freq: MonomerFreqs, sameLength: boolean }\nexport type SplitterFunc = (seq: string) => ISeqSplitted;\nexport type MonomerFreqs = { [m: string]: number };\n\n/** Alphabet candidate type */\nexport class CandidateType {\n name: string;\n alphabet: Set<string>;\n cutoff: number;\n\n constructor(name: string, alphabet: Set<string>, cutoff: number) {\n this.name = name;\n this.alphabet = alphabet;\n this.cutoff = cutoff;\n }\n}\n\n/** Alphabet candidate similarity type */\nexport class CandidateSimType extends CandidateType {\n freq: MonomerFreqs;\n /** Cos, max = 1, min = 0 */\n similarity: number;\n\n constructor(candidate: CandidateType, freq: MonomerFreqs, similarity: number) {\n super(candidate.name, candidate.alphabet, candidate.cutoff);\n this.freq = freq;\n this.similarity = similarity;\n }\n}\n","import {CandidateType} from './types';\n\n/** enum type to simplify setting \"user-friendly\" notation if necessary */\nexport enum NOTATION {\n FASTA = 'fasta',\n SEPARATOR = 'separator',\n HELM = 'helm',\n /* Requires notation handler */ CUSTOM = 'custom',\n /* Requires notation handler */ BILN = 'biln',\n}\n\nexport const enum ALIGNMENT {\n SEQ_MSA = 'SEQ.MSA',\n SEQ = 'SEQ',\n}\n\nexport enum ALPHABET {\n DNA = 'DNA',\n RNA = 'RNA',\n PT = 'PT',\n /** Unknown */\n UN = 'UN',\n}\n\nexport enum TAGS {\n aligned = 'aligned',\n alphabet = 'alphabet',\n alphabetSize = '.alphabetSize',\n alphabetIsMultichar = '.alphabetIsMultichar',\n separator = 'separator',\n isHelmCompatible = '.isHelmCompatible',\n positionNames = '.positionNames',\n positionLabels = '.positionLabels',\n regions = '.regions',\n positionShift = '.positionShift',\n selectedPosition = '.selectedPosition',\n polymerTypeColumnName = '.polymerTypeColumnName',\n annotations = '.annotations',\n numberingScheme = '.numberingScheme',\n annotationColumnName = '.annotationColumnName',\n}\n\nexport {TAGS as BioTags};\n\nexport const positionSeparator: string = ', ';\n\nexport const monomerRe: RegExp = /(?:\\[([A-Za-z0-9_\\-,()]+)\\])|([A-Za-z\\-])/g;\n\nexport const helmRe: RegExp = /(PEPTIDE1|DNA1|RNA1)\\{([^}]+)}/g;\nexport const helmPp1Re: RegExp = /\\[([^\\[\\]]+)]/g;\n\nexport const Alphabets = new class {\n fasta = {\n peptide: new Set<string>([\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<string>(['A', 'C', 'G', 'T']),\n rna: new Set<string>(['A', 'C', 'G', 'U']),\n };\n}();\n\nexport const candidateAlphabets: CandidateType[] = [\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\n/** Canonical gap symbol */\nexport const GAP_SYMBOL: string = '' as const;\n\nexport const GapOriginals: {\n [units: string]: string\n} = {\n [NOTATION.FASTA]: '-',\n [NOTATION.SEPARATOR]: '',\n [NOTATION.HELM]: '*',\n [NOTATION.BILN]: '',\n};\n\nexport const MONOMER_MOTIF_SPLITTER = ' , ';\n\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\n/** Column temp key for the cached IMonomerCanonicalizer instance */\nexport const MONOMER_CANONICALIZER_TEMP = 'monomer-canonicalizer';\nexport const NOTATION_PROVIDER_CONSTRUCTOR_ROLE = 'notationProviderConstructor';\n","import * as grok from 'datagrok-api/grok';\nimport * as ui from 'datagrok-api/ui';\nimport * as DG from 'datagrok-api/dg';\n\nimport {IMonomerLibBase} from '../types/monomer-library';\nimport {HelmType, PolymerType} from '../helm/types';\nimport {HelmTypes, PolymerTypes} from '../helm/consts';\n\n/** Hypothetical interface to convert mol block notation.\n * It should be placed in the chem-meta package, and have an implementation in the Chem package.\n * So dependency of MonomerWorks on molfile conversion operation becomes explicit.\n */\nexport interface IMolfileConverter {\n convertV2000toV3000(src: string): string;\n\n convertV3000toV2000(src: string): string;\n}\n\nexport class MonomerWorks {\n private monomerLib: IMonomerLibBase;\n\n //private molfileConverter: IMolfileConverter;\n\n constructor(monomerLib: IMonomerLibBase/*, molfileConverter: IMolfileConverter*/) {\n this.monomerLib = monomerLib;\n //this.molfileConverter = molfileConverter;\n }\n\n //types according to Monomer possible\n public getCappedRotatedMonomer(monomerType: PolymerType, monomerName: string): string | null {\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\n return null;\n }\n}\n\nexport function helmTypeToPolymerType(helmType: HelmType): PolymerType {\n let polymerType: PolymerType | undefined = 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 = PolymerTypes.RNA;\n break;\n case HelmTypes.AA:\n polymerType = PolymerTypes.PEPTIDE;\n break;\n case HelmTypes.CHEM:\n polymerType = PolymerTypes.CHEM;\n break;\n case HelmTypes.BLOB:\n polymerType = PolymerTypes.BLOB;\n break;\n default:\n polymerType = PolymerTypes.PEPTIDE;\n console.warn(`Unexpected HelmType '${helmType}'`);\n }\n return polymerType;\n}\n","/* eslint-disable max-len */\nimport {monomerWorksConsts as C} from './consts';\nimport {getMolGraph, LoopConstants, LoopVariables, MolfileWithMap, MolGraph, MonomerMap, MonomerMolGraphMap,\n NucleotideRole} from './types';\nimport {HELM_FIELDS, HELM_CORE_FIELDS, HELM_POLYMER_TYPE, HELM_MONOMER_TYPE,} from '../utils/const';\nimport {ALPHABET, GAP_SYMBOL} from '../utils/macromolecule/consts';\nimport {IMonomerLibBase, Monomer} from '../types/monomer-library';\nimport {ISeqMonomer, PolymerType} from '../helm/types';\nimport {helmTypeToPolymerType} from './monomer-works';\n\n\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(\n monomerLib: IMonomerLibBase, polymerType: PolymerType, alphabet: ALPHABET\n): Map<string, any> {\n const map = new Map<string, any>();\n for (const monomerSymbol of monomerLib.getMonomerSymbolsByType(polymerType)) {\n const it: Monomer = 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 === HELM_POLYMER_TYPE.RNA || (\n polymerType === HELM_POLYMER_TYPE.PEPTIDE &&\n it[HELM_FIELDS.MONOMER_TYPE] !== HELM_MONOMER_TYPE.BRANCH\n )) {\n const monomerObject: { [key: string]: any } = {};\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\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(\n monomerSeq: ISeqMonomer[], monomersDict: MonomerMolGraphMap,\n alphabet: ALPHABET, polymerType: PolymerType,\n roles?: NucleotideRole[]\n): MolfileWithMap {\n if (monomerSeq.length === 0) {\n // throw new Error('monomerSeq is empty');\n return MolfileWithMap.createEmpty();\n }\n\n // Triples mode is on only when the caller flagged the row with roles\n // (built and validated by `buildRolesForHelmRna` in to-atomic-level.ts).\n // The roles array carries the per-position semantics — including\n // TERMINAL_5P / TERMINAL_3P for non-canonical chain ends — so we don't\n // re-validate the length here.\n const triplesMode = polymerType === HELM_POLYMER_TYPE.RNA && !!roles &&\n roles.length === monomerSeq.length;\n\n // define atom and bond counts, taking into account the bond type\n const {atomCount, bondCount, needsCapping} =\n getResultingAtomBondCounts(monomerSeq, monomersDict, alphabet, polymerType, triplesMode, roles);\n\n // create arrays to store lines of the resulting molfile\n const molfileAtomBlock = new Array<string>(atomCount);\n const molfileBondBlock = new Array<string>(bondCount);\n\n let addMonomerToMolblock: (monomer: MolGraph, molfileAtomBlock: string[], molfileBondBlock: string[], v: LoopVariables, LC: LoopConstants) => void;\n\n let sugar = null;\n let phosphate = null;\n\n if (polymerType === 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: LoopVariables = {\n i: 0,\n nodeShift: 0,\n bondShift: 0,\n backbonePositionShift: new Array<number>(2).fill(0),\n branchPositionShift: new Array<number>(2).fill(0),\n backboneAttachNode: 0,\n branchAttachNode: 0,\n flipFactor: 1,\n };\n\n const LC: LoopConstants = {\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\n const monomers: MonomerMap = new MonomerMap();\n const steabsCollection: number [] = [];\n let nAtoms = 0;\n let lastMonomerCappingAtom: string | undefined = undefined;\n\n if (triplesMode) {\n runTriplesAssembly(\n monomerSeq, roles!, monomersDict, molfileAtomBlock, molfileBondBlock,\n v, LC, monomers, steabsCollection,\n (a) => { nAtoms += a; }, () => nAtoms);\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) 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\n const mAtomCount = v.nodeShift - mAtomFirst;\n const mAtomList: number[] = new Array<number>(mAtomCount);\n for (let maI = 0; maI < mAtomCount; ++maI) mAtomList[maI] = mAtomFirst + maI;\n\n const mBondCount = v.bondShift - mBondFirst;\n const mBondList: number[] = new Array<number>(mBondCount);\n for (let mbI = 0; mbI < mBondCount; ++mbI) mBondList[mbI] = mBondFirst + mbI;\n\n monomers.set(v.i, {\n biotype: seqMonomer.biotype,\n symbol: seqMonomer.symbol,\n atoms: mAtomList, bonds: mBondList\n });\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\n const molfileCountsLine = C.V3K_BEGIN_COUNTS_LINE + atomCount + ' ' + bondCount + C.V3K_COUNTS_LINE_ENDING;\n\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\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\n // return molfileParts.join('');\n return {molfile: result, monomers: monomers};\n}\n\n\nfunction getCollectionBlock(collection: number[]): string {\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\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 } 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\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(\n molfileAtomBlock: string[], molfileBondBlock: string[],\n v: LoopVariables, LC: LoopConstants, cappingAtomType: string = C.OXYGEN\n): void {\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\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}\n\nfunction addAminoAcidToMolblock(monomer: MolGraph, molfileAtomBlock: string[],\n molfileBondBlock: string[], v: LoopVariables\n): void {\n v.flipFactor = (-1) ** (v.i % 2); // to flip every even monomer over OX\n addBackboneMonomerToMolblock(monomer, molfileAtomBlock, molfileBondBlock, v);\n}\n\nfunction addBackboneMonomerToMolblock(\n monomer: MolGraph, molfileAtomBlock: string[], molfileBondBlock: string[], v: LoopVariables\n): void {\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\n // construct the lines of V3K molfile bond block\n fillBondLines(monomer, molfileBondBlock, v);\n\n // peptide bond\n fillChainExtendingBond(monomer, molfileBondBlock, v);\n\n // update branch variables if necessary\n if (monomer.meta.branchShift !== null && monomer.meta.terminalNodes.length > 2)\n updateBranchVariables(monomer, v);\n\n // update loop variables\n updateChainExtendingVariables(monomer, v);\n}\n\nfunction addNucleotideToMolblock(\n nucleobase: MolGraph, molfileAtomBlock: string[], molfileBondBlock: string[], v: LoopVariables, LC: LoopConstants\n): void {\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\n addBranchMonomerToMolblock(nucleobase, molfileAtomBlock, molfileBondBlock, v);\n}\n\nfunction addBranchMonomerToMolblock(\n monomer: MolGraph, molfileAtomBlock: string[], molfileBondBlock: string[], v: LoopVariables\n): void {\n fillBranchAtomLines(monomer, molfileAtomBlock, v);\n fillBondLines(monomer, molfileBondBlock, v);\n fillBackboneToBranchBond(monomer, molfileBondBlock, v);\n\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\n // update loop variables\n v.bondShift += monomer.bonds.atomPairs.length + 1;\n v.nodeShift += monomer.atoms.atomTypes.length;\n}\n\nfunction updateChainExtendingVariables(monomer: MolGraph, v: LoopVariables): void {\n v.backboneAttachNode = v.nodeShift + monomer.meta.terminalNodes[1];\n v.bondShift += monomer.bonds.atomPairs.length + 1;\n\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}\n\nfunction updateBranchVariables(monomer: MolGraph, v: LoopVariables): void {\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}\n\nfunction fillAtomLines(monomer: MolGraph, molfileAtomBlock: string[], v: LoopVariables): void {\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\n// todo: remove as quickfix\nfunction fillBranchAtomLines(monomer: MolGraph, molfileAtomBlock: string[], v: LoopVariables): void {\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}\n\nfunction fillBondLines(monomer: MolGraph, molfileBondBlock: string[], v: LoopVariables): void {\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}\n\nfunction fillChainExtendingBond(monomer: MolGraph, molfileBondBlock: string[], v: LoopVariables): void {\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\n// todo: remove\nfunction fillBackboneToBranchBond(branchMonomer: MolGraph, molfileBondBlock: string[], v: LoopVariables): void {\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\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 * @param {Array} roles - per-position role tags (only meaningful when triplesMode is true)\n * @return {Object} the atom/bond counts plus needsCapping flag */\nfunction getResultingAtomBondCounts(\n monomerSeq: ISeqMonomer[], monomersDict: MonomerMolGraphMap,\n alphabet: ALPHABET, polymerType: PolymerType,\n triplesMode: boolean, roles?: NucleotideRole[]\n): { atomCount: number, bondCount: number, needsCapping: boolean } {\n let atomCount = 0;\n let bondCount = 0;\n\n let monomerCount: number = 0;\n let needsCapping = true;\n let lastMonomerGraph: MolGraph | null = null;\n let lastPhosphateGraph: MolGraph | null = 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) 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) lastPhosphateGraph = lastMonomerGraph;\n }\n\n // add extra values depending on the polymer type\n if (polymerType === 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 } 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\n // Per-monomer-loop already summed sugars + bases + phosphates for every\n // entry in monomerSeq (terminals included). Reservation: each backbone\n // emit (sugar / phosphate / terminal) reserves +1 bond slot for the\n // chain-extending bond, each branch (base) reserves +1 for its branch\n // bond. Total reservations = monomerCount.\n bondCount += monomerCount;\n\n // OH cap atom rides on the 3'-end. Skip it when HELM specified a\n // 3'-terminal modifier (e.g. GalNAc) that IS the chain end.\n const has3pTerm = !!roles && roles.length > 0 &&\n roles[roles.length - 1] === NucleotideRole.TERMINAL_3P;\n if (has3pTerm) {\n needsCapping = false;\n // Mirror the peptide branch (which does both atomCount-- and bondCount--\n // when it skips the terminal cap). `bondCount += monomerCount` above\n // reserves one chain-extending slot per monomer; the LAST monomer's slot\n // is normally filled by the terminal OH cap bond. With a 3'-terminal\n // modifier there is no cap, so that last reserved slot stays empty —\n // leaving the declared bond count one higher than the emitted bond\n // lines. Drop it so the V3000 COUNTS line matches the bond block exactly\n // (otherwise the pre-OCL molfile is malformed and only survives because\n // the OCL chirality pass re-derives the counts).\n bondCount -= 1;\n } else\n atomCount += 1; // OH cap atom (rides on trailing P or on last sugar's R2)\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\n // add phosphate per each pair of nucleobase symbols\n atomCount += (monomerSeq.length - 1) * phosphate.atoms.x.length;\n\n // add sugar per each nucleobase symbol\n atomCount += monomerSeq.length * sugar.atoms.x.length;\n\n // add the leftmost cap group 'OH' (i.e. 'O')\n atomCount += 1;\n\n // add bonds from phosphate monomers\n bondCount += (monomerSeq.length - 1) * phosphate.bonds.bondTypes.length;\n\n // add bonds from sugar monomers\n bondCount += monomerSeq.length * sugar.bonds.bondTypes.length;\n\n // exclude the first chain-extending bond O-P (absent, no 'leftmost' phosphate)\n bondCount -= 1;\n\n // add chain-extending and branch bonds (O-P, C-O and C-N per each nucleotide)\n bondCount += monomerSeq.length * 3;\n }\n\n return {atomCount, bondCount, needsCapping};\n}\n\n// Role-driven RNA assembly. Walks the monomers in chain order and emits\n// each one according to its NucleotideRole (assigned by `buildRolesForHelmRna`\n// from the library, not from a fixed triple index):\n// - BASE → branch monomer, attached to the\n// branch point of the sugar most\n// recently emitted.\n// - SUGAR / PHOSPHATE / TERMINAL_5P / 3P → backbone monomer, chained to the\n// previous backbone unit.\n//\n// Because the role comes from chemistry, this transparently handles every\n// backbone layout — standard [sugar, base, phosphate] triples, a 5'-leading\n// phosphate, several phosphates / linkers in a row, a linker dropped in the\n// middle of the chain, missing trailing phosphate, and 5'/3' terminal\n// modifiers — without any index arithmetic. The first backbone monomer\n// naturally has no incoming chain bond (v.backboneAttachNode starts at 0),\n// and the trailing OH cap is added by the caller via needsCapping (skipped\n// when a TERMINAL_3P ends the chain).\nfunction runTriplesAssembly(\n monomerSeq: ISeqMonomer[], roles: NucleotideRole[],\n monomersDict: MonomerMolGraphMap,\n molfileAtomBlock: string[], molfileBondBlock: string[],\n v: LoopVariables, LC: LoopConstants,\n monomers: MonomerMap, steabsCollection: number[],\n addAtoms: (n: number) => void, getAtoms: () => number\n): void {\n void LC; // assembly is driven by per-monomer roles, not by LC.seqLength\n for (let i = 0; i < monomerSeq.length; ++i) {\n const sm = monomerSeq[i];\n if (sm.symbol === GAP_SYMBOL) continue;\n const role = roles[i];\n const mG = getMolGraph(monomersDict,\n {symbol: sm.symbol, polymerType: helmTypeToPolymerType(sm.biotype)})!;\n\n const aFirst = v.nodeShift;\n const bFirst = v.bondShift;\n v.i = i; // keep loop counter monotone (unused by nucleotide geometry)\n if (role === NucleotideRole.BASE)\n // Branch: attaches to v.branchAttachNode, set when the preceding sugar\n // was emitted. Does not advance the backbone, so the next backbone unit\n // still chains from that sugar's 3' side.\n addBranchMonomerToMolblock(mG, molfileAtomBlock, molfileBondBlock, v);\n else\n // Backbone: sugar / phosphate / linker / terminal modifier. Chains from\n // the previous backbone unit (none for the very first one) and, for a\n // sugar, sets up the branch attach point for the next base.\n addBackboneMonomerToMolblock(mG, molfileAtomBlock, molfileBondBlock, v);\n\n mG.stereoAtoms?.forEach((s) => steabsCollection.push(s + getAtoms()));\n addAtoms(mG.atoms.x.length);\n\n const aList: number[] = [];\n for (let a = aFirst; a < v.nodeShift; ++a) aList.push(a);\n const bList: number[] = [];\n for (let b = bFirst; b < v.bondShift; ++b) bList.push(b);\n monomers.set(i, {biotype: sm.biotype, symbol: sm.symbol, atoms: aList, bonds: bList});\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: number): number {\n return Math.round(C.PRECISION_FACTOR * x) / C.PRECISION_FACTOR;\n}\n\n","import {monomerSeqToMolfile} from './to-atomic-level-utils';\nimport {MolfileWithMap, SeqToMolfileWorkerData, SeqToMolfileWorkerRes} from './types';\n\nonmessage = (event) => {\n const {seqList, rolesList, monomersDict, alphabet, polymerType, start, end}: SeqToMolfileWorkerData = event.data;\n const resMolList: MolfileWithMap[] = new Array<MolfileWithMap>(end - start);\n const molfileWarningList = new Array<string>(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 } catch (err: any) {\n const errMsg: string = err instanceof Error ? err.message : err.toString();\n const msg: string = `Cannot get molfile of row #${rowI}: ${errMsg}.`;\n molfileWarningList.push(msg);\n }\n }\n postMessage({molfiles: resMolList, warnings: molfileWarningList} as SeqToMolfileWorkerRes);\n};\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// the startup function\n__webpack_require__.x = () => {\n\t// Load entry module and return exports\n\t// This entry module depends on other loaded chunks and execution need to be delayed\n\tvar __webpack_exports__ = __webpack_require__.O(undefined, [657], () => (__webpack_require__(323)))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks and chunks that the entrypoint depends on\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".js\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT')\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/^blob:/, \"\").replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","// no baseURI\n\n// object to store loaded chunks\n// \"1\" means \"already loaded\"\nvar installedChunks = {\n\t323: 1\n};\n\n// importScripts chunk loading\nvar installChunk = (data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\tfor(var moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\twhile(chunkIds.length)\n\t\tinstalledChunks[chunkIds.pop()] = 1;\n\tparentChunkLoadingFunction(data);\n};\n__webpack_require__.f.i = (chunkId, promises) => {\n\t// \"1\" is the signal for \"already loaded\"\n\tif(!installedChunks[chunkId]) {\n\t\tif(true) { // all chunks have JS\n\t\t\timportScripts(__webpack_require__.p + __webpack_require__.u(chunkId));\n\t\t}\n\t}\n};\n\nvar chunkLoadingGlobal = self[\"webpackChunkhelm\"] = self[\"webpackChunkhelm\"] || [];\nvar parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);\nchunkLoadingGlobal.push = installChunk;\n\n// no HMR\n\n// no HMR manifest","// run startup\nvar __webpack_exports__ = __webpack_require__.x();\n"],"names":["deferred","next","MonomerNumberingTypes","HelmTabKeys","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","RNA","symbol","RIBOSE","PHOSPHATE","OXYGEN","HYDROGEN","getMolGraph","dict","libKey","NucleotideRole","MonomerMap","Map","constructor","entries","super","MolfileWithMap","molfile","monomers","createEmpty","RegExp","CandidateType","name","alphabet","cutoff","this","NOTATION","ALPHABET","TAGS","Alphabets","fasta","peptide","Set","dna","rna","helmTypeToPolymerType","helmType","BASE","SUGAR","LINKER","NUCLEOTIDE","AA","PEPTIDE","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","TERMINAL_3P","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","sm","role","mG","aFirst","bFirst","addBranchMonomerToMolblock","addBackboneMonomerToMolblock","stereoAtoms","forEach","s","push","aList","a","bList","b","set","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","FASTA","SEPARATOR","HELM","BILN","onmessage","event","seqList","rolesList","start","end","data","resMolList","molfileWarningList","rowI","seq","undefined","err","msg","message","toString","postMessage","molfiles","warnings","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","m","__webpack_exports__","O","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","Object","keys","every","key","splice","r","d","definition","o","defineProperty","enumerable","f","e","chunkId","Promise","all","reduce","promises","u","g","globalThis","Function","window","obj","prop","prototype","hasOwnProperty","call","scriptUrl","importScripts","location","document","currentScript","tagName","toUpperCase","src","scripts","getElementsByTagName","test","replace","p","installedChunks","chunkLoadingGlobal","self","parentChunkLoadingFunction","bind","moreModules","runtime","pop","then"],"sourceRoot":""}
|
package/dist/455.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
var helm;(()=>{"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",t[t.TERMINAL_5P=3]="TERMINAL_5P",t[t.TERMINAL_3P=4]="TERMINAL_3P"}(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 E(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 b(e,i,h,r,c){if(0===e.length)return l.createEmpty();const b="RNA"===r&&!!c&&c.length===e.length,{atomCount:A,bondCount:p,needsCapping:d}=function(e,i,a,l,h,r){let c=0,b=0,f=0,m=!0,N=null,_=null;for(let t=0;t<e.length;++t){const n=e[t];if(""!==n.symbol){if("*"==n.symbol)throw new Error("Gap canonical symbol is '', not '*");N=o(i,{symbol:n.symbol,polymerType:E(n.biotype)}),c+=N.atoms.x.length,b+=N.bonds.bondTypes.length,f++,h&&t%3==2&&(_=N)}}if("PEPTIDE"===l)c+=1,b+=f,f>0&&((N?.meta?.rNodes?.length??0)<2||N?.terminalR2Atom?.toLowerCase()===t.HYDROGEN.toLowerCase())&&(m=!1,c-=1,b-=1);else if(h)b+=f,r&&r.length>0&&r[r.length-1]===n.TERMINAL_3P?m=!1:c+=1;else{const n=a===s.DNA?o(i,t.DEOXYRIBOSE):o(i,t.RIBOSE),l=o(i,t.PHOSPHATE);c+=(e.length-1)*l.atoms.x.length,c+=e.length*n.atoms.x.length,c+=1,b+=(e.length-1)*l.bonds.bondTypes.length,b+=e.length*n.bonds.bondTypes.length,b-=1,b+=3*e.length}return{atomCount:c,bondCount:b,needsCapping:m}}(e,i,h,r,b,c),T=new Array(A),y=new Array(p);let u,I=null,O=null;"PEPTIDE"===r?u=f:(u=N,b||(I=h===s.DNA?o(i,t.DEOXYRIBOSE):o(i,t.RIBOSE),O=o(i,t.PHOSPHATE)));const g={i:0,nodeShift:0,bondShift:0,backbonePositionShift:new Array(2).fill(0),branchPositionShift:new Array(2).fill(0),backboneAttachNode:0,branchAttachNode:0,flipFactor:1},L={sugar:I,phosphate:O,seqLength:b?Math.ceil(e.length/3):e.length,atomCount:A,bondCount:p},C=new a,B=[];let D,P=0;if(b)!function(t,e,s,i,a,l,h,r,c,b,f){const N=e.length>0&&e[0]===n.TERMINAL_5P,A=e.length>0&&e[e.length-1]===n.TERMINAL_3P,S=N?1:0,p=(A?e.length-1:e.length)-S,d=Math.ceil(p/3),T=p===3*d,y=(t,n)=>{const e=o(s,{symbol:t.symbol,polymerType:E(t.biotype)}),h=l.nodeShift,N=l.bondShift;m(e,i,a,l),e.stereoAtoms?.forEach(t=>c.push(t+f())),b(e.atoms.x.length);const _=[];for(let t=h;t<l.nodeShift;++t)_.push(t);const A=[];for(let t=N;t<l.bondShift;++t)A.push(t);r.set(n,{biotype:t.biotype,symbol:t.symbol,atoms:_,bonds:A})};N&&(l.i=0,y(t[0],0));for(let n=0;n<d;++n){l.i=n+(N?1:0);const e=S+3*n,h=e+1,A=t[e],p=t[h],d=o(s,{symbol:A.symbol,polymerType:E(A.biotype)}),T=o(s,{symbol:p.symbol,polymerType:E(p.biotype)});if(n>=1){const o=S+3*(n-1)+2;y(t[o],o)}const u=l.nodeShift,I=l.bondShift;m(d,i,a,l),d.stereoAtoms?.forEach(t=>c.push(t+f())),b(d.atoms.x.length);const O=[];for(let t=u;t<l.nodeShift;++t)O.push(t);const g=[];for(let t=I;t<l.bondShift;++t)g.push(t);r.set(e,{biotype:A.biotype,symbol:A.symbol,atoms:O,bonds:g});const L=l.nodeShift,C=l.bondShift;_(T,i,a,l),T.stereoAtoms?.forEach(t=>c.push(t+f())),b(T.atoms.x.length);const B=[];for(let t=L;t<l.nodeShift;++t)B.push(t);const D=[];for(let t=C;t<l.bondShift;++t)D.push(t);r.set(h,{biotype:p.biotype,symbol:p.symbol,atoms:B,bonds:D})}if(T){const o=S+3*(d-1)+2;y(t[o],o)}A&&(l.i=d+(N?1:0),y(t[e.length-1],e.length-1))}(e,c,i,T,y,g,0,C,B,t=>{P+=t},()=>P);else for(g.i=0;g.i<L.seqLength;++g.i){const t=e[g.i];if(""===t.symbol)continue;const n=o(i,{symbol:t.symbol,polymerType:E(t.biotype)});D=n.terminalR2Atom;const s=g.nodeShift,a=g.bondShift;u(n,T,y,g,L),n.stereoAtoms?.forEach(t=>B.push(t+P)),P+=n.atoms.x.length;const l=g.nodeShift-s,h=new Array(l);for(let t=0;t<l;++t)h[t]=s+t;const r=g.bondShift-a,c=new Array(r);for(let t=0;t<r;++t)c[t]=a+t;C.set(g.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)+" "+S(e.backbonePositionShift[0])+" "+e.flipFactor*S(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"}(T,y,g,L,D??t.OXYGEN);const R=t.V3K_BEGIN_COUNTS_LINE+A+" "+p+t.V3K_COUNTS_LINE_ENDING;let K="";return K+=t.V3K_HEADER_FIRST_LINE,K+=t.V3K_HEADER_SECOND_LINE,K+=t.V3K_BEGIN_CTAB_BLOCK,K+=R,K+=t.V3K_BEGIN_ATOM_BLOCK,K+=T.join(""),K+=t.V3K_END_ATOM_BLOCK,K+=t.V3K_BEGIN_BOND_BLOCK,K+=y.join(""),K+=t.V3K_END_BOND_BLOCK,B.length>0&&(K+=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)),K+=t.V3K_END_CTAB_BLOCK,K+=t.V3K_END,{molfile:K,monomers:C}}function f(t,o,n,e){e.flipFactor=(-1)**(e.i%2),m(t,o,n,e)}function m(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]+" "+S(e.backbonePositionShift[0]+o.atoms.x[s])+" "+S(e.backbonePositionShift[1]+e.flipFactor*o.atoms.y[s])+" "+o.atoms.kwargs[s]}}(o,n,s),A(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)m(s.sugar,o,n,e);else for(const t of[s.phosphate,s.sugar])m(t,o,n,e);_(t,o,n,e)}function _(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]+" "+S(e.branchPositionShift[0]+o.atoms.x[s])+" "+S(e.branchPositionShift[1]+e.flipFactor*o.atoms.y[s])+" "+o.atoms.kwargs[s]}}(o,n,s),A(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 A(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 S(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]=b(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})},helm={}})();
|
|
2
|
-
//# sourceMappingURL=455.js.map
|
package/dist/455.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"455.js","mappings":"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","sources":["webpack://helm/./node_modules/@datagrok-libraries/bio/src/monomer-works/consts.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/monomer-works/types.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/utils/macromolecule/consts.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/utils/const.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/utils/macromolecule/types.js","webpack://helm/./node_modules/@datagrok-libraries/js-draw-lite/src/types/org.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/monomer-works/monomer-works.js","webpack://helm/./node_modules/@datagrok-libraries/bio/src/monomer-works/to-atomic-level-utils.js","webpack://helm/./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.\n * SUGAR/BASE/PHOSPHATE are the standard triple positions.\n * TERMINAL_5P marks a 5'-end terminal modifier (e.g. Chol) — a monomer\n * with R2 only that takes the place of the leading sugar.\n * TERMINAL_3P marks a 3'-end terminal modifier (e.g. GalNAc) — a monomer\n * with R1 only that takes the place of the trailing phosphate. The OH cap\n * MUST be omitted when a TERMINAL_3P is present. */\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[\"TERMINAL_5P\"] = 3] = \"TERMINAL_5P\";\n NucleotideRole[NucleotideRole[\"TERMINAL_3P\"] = 4] = \"TERMINAL_3P\";\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, NucleotideRole } 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 */ || (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 the caller flagged the row with roles\n // (built and validated by `buildRolesForHelmRna` in to-atomic-level.ts).\n // The roles array carries the per-position semantics — including\n // TERMINAL_5P / TERMINAL_3P for non-canonical chain ends — so we don't\n // re-validate the length here.\n const triplesMode = polymerType === \"RNA\" /* HELM_POLYMER_TYPE.RNA */ && !!roles &&\n roles.length === monomerSeq.length;\n // define atom and bond counts, taking into account the bond type\n const { atomCount, bondCount, needsCapping } = getResultingAtomBondCounts(monomerSeq, monomersDict, alphabet, polymerType, triplesMode, roles);\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, roles, 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 * @param {Array} roles - per-position role tags (only meaningful when triplesMode is true)\n * @return {Object} the atom/bond counts plus needsCapping flag */\nfunction getResultingAtomBondCounts(monomerSeq, monomersDict, alphabet, polymerType, triplesMode, roles) {\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 (terminals included). Reservation: each backbone\n // emit (sugar / phosphate / terminal) reserves +1 bond slot for the\n // chain-extending bond, each branch (base) reserves +1 for its branch\n // bond. Total reservations = monomerCount.\n bondCount += monomerCount;\n // OH cap atom rides on the 3'-end. Skip it when HELM specified a\n // 3'-terminal modifier (e.g. GalNAc) that IS the chain end.\n const has3pTerm = !!roles && roles.length > 0 &&\n roles[roles.length - 1] === NucleotideRole.TERMINAL_3P;\n if (has3pTerm)\n needsCapping = false;\n else\n atomCount += 1; // OH cap atom (rides on trailing P or on last sugar's R2)\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. Iterates by NUCLEOTIDE over the row's \"core\"\n// positions (those tagged SUGAR/BASE/PHOSPHATE), and emits at most one\n// TERMINAL_5P at the head and one TERMINAL_3P at the tail.\n//\n// Layout permutations the function handles:\n// roles = [SUGAR, BASE, PHOSPHATE, ...] // standard RNA\n// roles = [..., SUGAR, BASE] // no trailing P\n// roles = [TERMINAL_5P, SUGAR, BASE, PHOSPHATE, ...] // 5' modifier\n// roles = [..., SUGAR, BASE, TERMINAL_3P] // 3' modifier (replaces last P)\n// roles = [TERMINAL_5P, ..., TERMINAL_3P] // both\n//\n// When a TERMINAL_3P is present the OH cap MUST be skipped (the last\n// monomer is the chain end, period); the caller takes responsibility for\n// needsCapping=false in `getResultingAtomBondCounts`.\nfunction runTriplesAssembly(monomerSeq, roles, monomersDict, molfileAtomBlock, molfileBondBlock, v, LC, monomers, steabsCollection, addAtoms, getAtoms) {\n const has5pTerm = roles.length > 0 && roles[0] === NucleotideRole.TERMINAL_5P;\n const has3pTerm = roles.length > 0 && roles[roles.length - 1] === NucleotideRole.TERMINAL_3P;\n const coreStart = has5pTerm ? 1 : 0;\n const coreEnd = has3pTerm ? roles.length - 1 : roles.length;\n const coreLen = coreEnd - coreStart;\n const N = Math.ceil(coreLen / 3); // nucleotide count in the core\n // coreLen === 3N → trailing P present. coreLen === 3N - 1 → no trailing P.\n const hasTrailingP = coreLen === 3 * N;\n // Helper: emit one monomer as a backbone unit and record its atom/bond\n // ranges in the per-row monomer map.\n const emitBackbone = (sm, mapKey) => {\n const mG = getMolGraph(monomersDict, { symbol: sm.symbol, polymerType: helmTypeToPolymerType(sm.biotype) });\n const aFirst = v.nodeShift;\n const bFirst = v.bondShift;\n addBackboneMonomerToMolblock(mG, molfileAtomBlock, molfileBondBlock, v);\n mG.stereoAtoms?.forEach((i) => steabsCollection.push(i + getAtoms()));\n addAtoms(mG.atoms.x.length);\n const aList = [];\n for (let a = aFirst; a < v.nodeShift; ++a)\n aList.push(a);\n const bList = [];\n for (let b = bFirst; b < v.bondShift; ++b)\n bList.push(b);\n monomers.set(mapKey, { biotype: sm.biotype, symbol: sm.symbol, atoms: aList, bonds: bList });\n };\n // 1. 5'-end terminal modifier (e.g. Chol).\n if (has5pTerm) {\n v.i = 0;\n emitBackbone(monomerSeq[0], 0);\n }\n // 2. Core triples loop: each iteration emits [prev-P (if n>=1)] + sugar + base.\n for (let n = 0; n < N; ++n) {\n v.i = n + (has5pTerm ? 1 : 0); // keep v.i monotone across emits\n const sugarSeqIdx = coreStart + 3 * n;\n const baseSeqIdx = sugarSeqIdx + 1;\n const sugarSm = monomerSeq[sugarSeqIdx];\n const baseSm = monomerSeq[baseSeqIdx];\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 // Inter-nucleotide phosphate sits at coreStart + 3*(n-1) + 2 for n >= 1.\n if (n >= 1) {\n const prevPhosKey = coreStart + 3 * (n - 1) + 2;\n emitBackbone(monomerSeq[prevPhosKey], prevPhosKey);\n }\n // Sugar (backbone)\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(sugarSeqIdx, {\n biotype: sugarSm.biotype, symbol: sugarSm.symbol,\n atoms: sAList, bonds: sBList,\n });\n // Base (branch)\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(baseSeqIdx, {\n biotype: baseSm.biotype, symbol: baseSm.symbol,\n atoms: bAList, bonds: bBList,\n });\n }\n // 3. Trailing phosphate (the LAST nucleotide's P) — only if HELM wrote\n // one AND there is no 3'-terminal modifier replacing it.\n if (hasTrailingP) {\n const lastPhosKey = coreStart + 3 * (N - 1) + 2;\n emitBackbone(monomerSeq[lastPhosKey], lastPhosKey);\n }\n // 4. 3'-end terminal modifier (e.g. GalNAc).\n if (has3pTerm) {\n v.i = N + (has5pTerm ? 1 : 0);\n emitBackbone(monomerSeq[roles.length - 1], roles.length - 1);\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","TERMINAL_3P","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","has5pTerm","TERMINAL_5P","has3pTerm","coreStart","coreLen","N","hasTrailingP","emitBackbone","sm","mapKey","mG","aFirst","bFirst","addBackboneMonomerToMolblock","stereoAtoms","forEach","push","aList","a","bList","b","set","n","sugarSeqIdx","baseSeqIdx","sugarSm","baseSm","sugarG","baseG","prevPhosKey","sugarAtomFirst","sugarBondFirst","sAList","sBList","baseAtomFirst","baseBondFirst","addBranchMonomerToMolblock","bAList","bBList","lastPhosKey","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/657.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunkhelm=self.webpackChunkhelm||[]).push([[657],{533:(t,e,i)=>{"object"==typeof performance&&performance&&"function"==typeof performance.now?performance:Date,new Set;const r="object"==typeof process&&process?process:{};let l=globalThis.AbortController,s=globalThis.AbortSignal;if(void 0===l){s=class{onabort;_onabort=[];reason;aborted=!1;addEventListener(t,e){this._onabort.push(e)}},l=class{constructor(){e()}signal=new s;abort(t){if(!this.signal.aborted){this.signal.reason=t,this.signal.aborted=!0;for(const e of this.signal._onabort)e(t);this.signal.onabort?.(t)}}};let t="1"!==r.env?.LRU_CACHE_IGNORE_AC_WARNING;const e=()=>{var i,l,s,o;t&&(t=!1,i="AbortController is not defined. If using lru-cache in node 14, load an AbortController polyfill from the `node-abort-controller` package. A minimal polyfill is provided for use by LRUCache.fetch(), but it should not be relied upon in other contexts (eg, passing it to other APIs that use AbortController/AbortSignal might have undesirable effects). You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.",l="NO_ABORT_CONTROLLER",s="ENOTSUP",o=e,"function"==typeof r.emitWarning?r.emitWarning(i,l,s,o):console.error(`[${s}] ${l}: ${i}`))}}Symbol("type"),Symbol.iterator,Symbol.toStringTag},657:(t,e,i)=>{i.d(e,{kC:()=>l,oE:()=>r}),i(533);Error;new Map([[123,"lbrace"],[125,"rbrace"],[40,"lparen"],[41,"rparen"],[93,"rbracket"],[124,"pipe"],[46,"dot"],[44,"comma"],[43,"plus"],[58,"colon"],[45,"dash"],[36,"dollar"],[62,"gt"],[63,"question"],[42,"asterisk"],[95,"underscore"],[39,"apos"]]);new Map;var r={AA:"HELM_AA",SUGAR:"HELM_SUGAR",BASE:"HELM_BASE",LINKER:"HELM_LINKER",CHEM:"HELM_CHEM",BLOB:"HELM_BLOB",NUCLEOTIDE:"HELM_NUCLEOTIDE"},l={PEPTIDE:"PEPTIDE",RNA:"RNA",CHEM:"CHEM",BLOB:"BLOB",G:"G"};var s=class{constructor(){this._listeners=new Set,this._completed=!1}subscribe(t){return this._completed?()=>{}:(this._listeners.add(t),()=>{this._listeners.delete(t)})}next(t){if(!this._completed)for(let e of[...this._listeners])e(t)}complete(){this._completed=!0,this._listeners.clear()}get observerCount(){return this._listeners.size}};function o(t){return{line:"#202020",text:"#000000",background:t}}function n(t){return{line:"#e0e0e0",text:"#ffffff",background:v(t,.25)}}function a(t){let e=/^#([0-9a-fA-F]{6})$/.exec(t),i=/^#([0-9a-fA-F]{3})$/.exec(t);if(null!==e){let t=e[1];return[parseInt(t.slice(0,2),16),parseInt(t.slice(2,4),16),parseInt(t.slice(4,6),16)]}if(null!==i){let t=i[1];return[parseInt(t[0]+t[0],16),parseInt(t[1]+t[1],16),parseInt(t[2]+t[2],16)]}return null}function h(t){return t.toString(16).padStart(2,"0")}function d(t,e,i){return`#${h(t)}${h(e)}${h(i)}`}function u(t,e,i){let r=t/255,l=e/255,s=i/255,o=Math.max(r,l,s),n=Math.min(r,l,s),a=(o+n)/2;if(o===n)return[0,0,a];let h,d=o-n;return h=o===r?60*((l-s)/d+(l<s?6:0)):o===l?60*((s-r)/d+2):60*((r-l)/d+4),[h,a>.5?d/(2-o-n):d/(o+n),a]}function p(t,e,i){let r=i;return r<0&&(r+=1),r>1&&(r-=1),r<1/6?t+6*(e-t)*r:r<.5?e:r<2/3?t+(e-t)*(2/3-r)*6:t}function c(t,e,i){if(0===e){let t=Math.round(255*i);return[t,t,t]}let r=i<.5?i*(1+e):i+e-i*e,l=2*i-r,s=t/360;return[Math.round(255*p(l,r,s+1/3)),Math.round(255*p(l,r,s)),Math.round(255*p(l,r,s-1/3))]}function _(t,e=.3,i=.1){let r=a(t);if(null===r)return t;let[l,s,o]=u(r[0],r[1],r[2]),n=Math.max(0,Math.min(1,s*(1-e))),h=Math.max(0,Math.min(.95,o+i*(1-o))),[p,_,b]=c(l,n,h);return d(p,_,b)}function b(t){let e=a(t);if(null===e)return 0;let i=t=>{let e=t/255;return e<=.03928?e/12.92:Math.pow((e+.055)/1.055,2.4)};return.2126*i(e[0])+.7152*i(e[1])+.0722*i(e[2])}function f(t){let e=a(t);if(null===e)return"#1f2937";let[i,r,l]=u(e[0],e[1],e[2]);if(l>.85||r<.15&&l>.7)return"#1f2937";let s=Math.max(.08,l-.3);return function(t){let e=(t.h%360+360)%360,i=Math.max(0,Math.min(1,t.s)),r=Math.max(0,Math.min(1,t.l)),[l,s,o]=c(e,i,r);return d(l,s,o)}({h:i,s:Math.min(1,r+.1),l:s})}function g(t){let e=function(t){let e=a(t);return null===e?null:{r:e[0]/255,g:e[1]/255,b:e[2]/255}}(t);if(null===e)return"#1f2937";let i=t=>t<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4),r=.2126*i(e.r)+.7152*i(e.g)+.0722*i(e.b);return 1.05/(r+.05)>(r+.05)/.05?"#ffffff":"#1f2937"}function v(t,e){let i=a(t);if(null===i)return t;let r=1-e;return d(Math.max(0,Math.min(255,Math.round(i[0]*r))),Math.max(0,Math.min(255,Math.round(i[1]*r))),Math.max(0,Math.min(255,Math.round(i[2]*r))))}var m={A:o("#A0A0FF"),G:o("#FF7070"),T:o("#A0FFA0"),C:o("#FF8C4B"),U:o("#FF8080")},y={R:o("#7a85c1"),r:o("#7a85c1")},w={P:o("#9aa5e1"),p:o("#9aa5e1")},k={A:o("#C8C8C8"),R:o("#145AFF"),N:o("#00DCDC"),D:o("#E60A0A"),C:o("#E6E600"),E:o("#00DCDC"),Q:o("#E60A0A"),G:o("#EBEBEB"),H:o("#8282D2"),I:o("#0F820F"),L:o("#0F820F"),K:o("#145AFF"),M:o("#E6E600"),F:o("#3232AA"),P:o("#DC9682"),S:o("#FA9600"),T:o("#FA9600"),W:o("#B45AB4"),Y:o("#3232AA"),V:o("#0F820F")},A={R:o("#eeeeee")},S={B:o("#999999"),G:o("#e2e2e2")},C={P:o("#9aa5e1")},T={name:"light",fallback:{line:"#202020",text:"#000000",background:"#eeeeee"},errorTriple:{line:"#cc0000",text:"#000000",background:"#FFFF00"},palette:{[r.BASE]:m,[r.SUGAR]:y,[r.LINKER]:w,[r.AA]:k,[r.CHEM]:A,[r.BLOB]:S,[r.NUCLEOTIDE]:C}};function E(t){let e={};for(let[i,r]of Object.entries(t))e[i]=n(r.background);return e}var x={name:"dark",fallback:{line:"#e0e0e0",text:"#ffffff",background:v("#eeeeee",.5)},errorTriple:{line:"#ff5050",text:"#ffffff",background:v("#FFFF00",.4)},palette:{[r.BASE]:E(m),[r.SUGAR]:E(y),[r.LINKER]:E(w),[r.AA]:E(k),[r.CHEM]:E(A),[r.BLOB]:E(S),[r.NUCLEOTIDE]:E(C)}};function M(t,e,i=T){if(null===t)return{...i.errorTriple};let r=t.meta?.colors;if(void 0!==r){let t="light"===i.name?r.light:"dark"===i.name?r.dark:void 0;if(void 0!==t)return{...t,line:f(t.background)};if(void 0!==r.default)return{...r.default,line:f(r.default.background)}}let l=t.naturalAnalog;if(void 0!==l&&""!==l){let t=i.palette[e];if(void 0!==t){let e=t[l];if(void 0!==e)return{...e,line:f(e.background),text:g(e.background)}}}return{...i.fallback,line:f(i.fallback.background),text:g(i.fallback.background)}}function $(t){switch(t.polymerType){case l.PEPTIDE:return r.AA;case l.CHEM:return r.CHEM;case l.BLOB:return r.BLOB;case l.RNA:if("Branch"===t.monomerType)return r.BASE;if("Backbone"===t.monomerType){let e=t.naturalAnalog;return"P"===e||"p"===e?r.LINKER:r.SUGAR}return null;default:return null}}new Set(["PEPTIDE","RNA","CHEM","BLOB"]),new Set(["Backbone","Branch","Terminal","Undefined"]);new Set(["?","*","_","X","N"]);Math.PI;function B(t,e){let i=Math.min(t.x,e.x),r=Math.min(t.y,e.y);return{x:i,y:r,width:Math.max(t.x+t.width,e.x+e.width)-i,height:Math.max(t.y+t.height,e.y+e.height)-r}}function L(t){if(Number.isInteger(t))return 0===t?"0":t.toString();if(!Number.isFinite(t)||Object.is(t,-0))return"0";let e=Math.round(1e3*t)/1e3;return 0===e?"0":e.toString()}function F(t){if(0===t.length)return"";let e=t[0],i=`M ${L(e.x)} ${L(e.y)}`;for(let e=1;e<t.length;e++){let r=t[e];i+=` L ${L(r.x)} ${L(r.y)}`}return i+=` L ${L(e.x)} ${L(e.y)} Z`,i}function R(t,e,i,r){let l=[],s=360/e;for(let o=0;o<e;o++){let e=(r+o*s)*Math.PI/180;l.push({x:t.x+i*Math.cos(e),y:t.y+i*Math.sin(e)})}return l}function P(t,e,i,r){let l=Math.abs(e)/2,s=Math.abs(i)/2,o=Math.max(0,Math.min(r,l,s)),n=t.x-l,a=t.y-s,h=n+2*l,d=a+2*s,u=`M ${L(n+o)} ${L(a)}`;return u+=` L ${L(h-o)} ${L(a)}`,u+=` A ${L(o)} ${L(o)} 0 0 1 ${L(h)} ${L(a+o)}`,u+=` L ${L(h)} ${L(d-o)}`,u+=` A ${L(o)} ${L(o)} 0 0 1 ${L(h-o)} ${L(d)}`,u+=` L ${L(n+o)} ${L(d)}`,u+=` A ${L(o)} ${L(o)} 0 0 1 ${L(n)} ${L(d-o)}`,u+=` L ${L(n)} ${L(a+o)}`,u+=` A ${L(o)} ${L(o)} 0 0 1 ${L(n+o)} ${L(a)}`,u+=" Z",u}function I(t,e,i){let r=Math.abs(e),l=Math.abs(i);return`M ${L(t.x-r)} ${L(t.y)} A ${L(r)} ${L(l)} 0 1 0 ${L(t.x+r)} ${L(t.y)} A ${L(r)} ${L(l)} 0 1 0 ${L(t.x-r)} ${L(t.y)} Z`}function N(t,e,i,r){switch(t){case"hexagon":{let t=i*Math.sqrt(3)/2,r=i;return{x:e.x-t,y:e.y-r,width:2*t,height:2*r}}case"diamond":return{x:e.x-i,y:e.y-i,width:2*i,height:2*i};case"pentagon":{let t=Math.cos(18*Math.PI/180)*i,r=-i,l=Math.sin(54*Math.PI/180)*i;return{x:e.x-t,y:e.y+r,width:2*t,height:l-r}}case"rounded-rect":case"blob":{let t=r??i,l=Math.abs(i)/2,s=Math.abs(t)/2;return{x:e.x-l,y:e.y-s,width:2*l,height:2*s}}case"ellipse":{let t=Math.abs(i),l=Math.abs(r??i);return{x:e.x-t,y:e.y-l,width:2*t,height:2*l}}case"circle":{let t=Math.abs(i);return{x:e.x-t,y:e.y-t,width:2*t,height:2*t}}}}var H='"Helvetica Neue", Helvetica, Arial, sans-serif';function O(t){return{aa:{size:.72*t,strokeWidth:5},sugar:{size:1.39*t,strokeWidth:5,cornerRadius:.3*t},base:{size:.88*t,strokeWidth:5},linker:{size:.63*t,strokeWidth:5},chem:{size:1.49*t,strokeWidth:5,cornerRadius:.5*t},blob:{size:1.64*t,strokeWidth:5,cornerRadius:.8*t},nucleotide:{size:.98*t,strokeWidth:5}}}var D={name:"light",background:"#ffffff",defaultStroke:"#202020",defaultFill:"#ffffff",selectionColor:"#FFC107",highlightColor:"#A4E2DC",errorColor:"#cc0000",fontSize:14,fontFamily:H,bondLength:28,textColor:"#000000",idColor:"#00aa00",annotationColor:"#FFA500",tagDotColor:"#dd2222",hbondColor:"#888888",nonCanonicalHbondColor:"#cc8800",crossPolymerBondColor:"#1f5fcd",colorTheme:T,palette:{softenCanvas:!1},shapes:O(14)};O(14);function U(t,e){switch(e){case r.AA:return t.shapes.aa;case r.SUGAR:return t.shapes.sugar;case r.BASE:return t.shapes.base;case r.LINKER:return t.shapes.linker;case r.CHEM:return t.shapes.chem;case r.BLOB:return t.shapes.blob;case r.NUCLEOTIDE:return t.shapes.nucleotide}}function z(t){switch(t){case r.AA:return"hexagon";case r.SUGAR:return"rounded-rect";case r.BASE:return"diamond";case r.LINKER:return"circle";case r.CHEM:return"rounded-rect";case r.BLOB:return"blob";case r.NUCLEOTIDE:return"pentagon"}}function G(t,e,i=0){let r=U(e,t.biotype);if("*"===t.symbol)return function(t,e){return I(t,e,e)}(t.p,r.size+i);switch(z(t.biotype)){case"hexagon":{let e=0===i?0:i/Math.cos(Math.PI/6);return function(t,e,i=-30){return F(R(t,6,e,i))}(t.p,r.size+e)}case"diamond":{let e=0===i?0:i/Math.cos(Math.PI/4);return function(t,e){return F([{x:t.x,y:t.y-e},{x:t.x+e,y:t.y},{x:t.x,y:t.y+e},{x:t.x-e,y:t.y}])}(t.p,r.size+e)}case"pentagon":{let e=0===i?0:i/Math.cos(Math.PI/5);return function(t,e,i=-90){return F(R(t,5,e,i))}(t.p,r.size+e)}case"rounded-rect":return P(t.p,r.size+2*i,r.size+2*i,(r.cornerRadius??0)+i);case"blob":return function(t,e,i,r){return P(t,e,i,r)}(t.p,r.size+2*i,r.size+2*i,(r.cornerRadius??0)+i);case"circle":return I(t.p,r.size+i,r.size+i)}}function q(t,e){let i,r=U(e,t.biotype),l="*"===t.symbol?"circle":z(t.biotype);switch(l){case"hexagon":case"diamond":case"pentagon":case"circle":i=N(l,t.p,r.size);break;case"rounded-rect":case"blob":i=N(l,t.p,r.size,r.size)}let s=r.strokeWidth/2;return{x:i.x-s,y:i.y-s,width:i.width+2*s,height:i.height+2*s}}function j(t,e){return U(e,t.biotype)}var K=/[&"'<>]/;function W(t){return K.test(t)?t.replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(/</g,"<").replace(/>/g,">"):t}function V(t){if(Number.isInteger(t))return 0===t?"0":t.toString();if(!Number.isFinite(t)||Object.is(t,-0))return"0";let e=Math.round(1e3*t)/1e3;return 0===e?"0":e.toString()}function X(t,e,i){let r=`<${t}`;if(void 0!==e)for(let t in e){let i=e[t];if(void 0!==i&&!1!==i){if(!0===i){r+=` ${t}`;continue}r+="number"==typeof i?` ${t}="${V(i)}"`:` ${t}="${W(i)}"`}}return void 0===i?`${r}/>`:"string"==typeof i?`${r}>${i}</${t}>`:`${r}>${i.join("")}</${t}>`}function Y(t,e,i){if(0===i.size)return X("g",{class:"hw-layer hw-highlights"},"");let r=[];for(let l of t.atoms){if(!i.has(l.id))continue;let t=G(l,e,(j(l,e).strokeWidth+3)/2);r.push(X("path",{d:t,class:"hw-highlight",fill:"none",stroke:e.highlightColor,"stroke-width":3,"stroke-linejoin":"round","stroke-linecap":"round","data-symbol":l.symbol,"data-ring-atom-id":l.id,"data-testid":`highlight-ring-${l.id}`}))}return X("g",{class:"hw-layer hw-highlights"},r.join(""))}function Z(t,e,i){if(0===i.size)return X("g",{class:"hw-layer hw-selections"},"");let r=[];for(let l of t.atoms){if(!i.has(l.id))continue;let t=G(l,e,(j(l,e).strokeWidth+3)/2);r.push(X("path",{d:t,class:"hw-selection",fill:"none",stroke:e.selectionColor,"stroke-width":3,"stroke-linejoin":"round","stroke-linecap":"round","data-symbol":l.symbol,"data-ring-atom-id":l.id,"data-testid":`selection-ring-${l.id}`}))}return X("g",{class:"hw-layer hw-selections"},r.join(""))}new WeakMap;var J=class{constructor(t,e){this.atoms=t,this.bonds=e,this.isEmpty=0===t.size&&0===e.size,Object.freeze(this)}};new J(new Set,new Set);function Q(t){let e=t.ownerDocument;if(null!=e)return e;let i=globalThis;if(void 0!==i.document)return i.document;throw new Error("EditorView: no Document available (host.ownerDocument is null).")}function tt(t,e,i,r){let l=t.createElement(e);if(void 0!==i)for(let t of Object.keys(i)){let e=i[t];!1===e||void 0===e||l.setAttribute(t,!0===e?"":String(e))}if(void 0!==r)for(let e of r)"string"==typeof e?l.appendChild(t.createTextNode(e)):l.appendChild(e);return l}function et(t,e,i=220,r=140){if(null==t||""===e)return null;try{let l=t.get_mol(e);if(null===l)return null;let s=l.get_svg(i,r);return l.delete(),s}catch{return null}}function it(t,e,i){let r="data-testid";for(let i=0;i<t.body.children.length;i++){let l=t.body.children[i];if(void 0!==l&&l.getAttribute(r)===e)return l}let l=tt(t,"div",{class:i,[r]:e});return l.style.display="none",t.body.appendChild(l),l}function rt(t,e,i){for(;null!==e.firstChild;)e.removeChild(e.firstChild);if(e.appendChild(tt(t,"div",{class:"hw-tooltip__symbol"},[i.symbol])),void 0!==i.name&&""!==i.name&&i.name!==i.symbol&&e.appendChild(tt(t,"div",{class:"hw-tooltip__name"},[i.name])),void 0!==i.rdkitSvg&&null!==i.rdkitSvg&&""!==i.rdkitSvg){let r={class:"hw-tooltip__rdkit"};void 0!==i.rdkitTestid&&(r["data-testid"]=i.rdkitTestid);let l=tt(t,"div",r);l.innerHTML=i.rdkitSvg,e.appendChild(l)}void 0!==i.hint&&""!==i.hint&&e.appendChild(tt(t,"div",{class:"hw-tooltip__hint"},[i.hint]))}function lt(t,e,i){let r=t.style;r.display="block",r.left=`${e+12}px`,r.top=`${i+12}px`}function st(t){null!==t&&(t.style.display="none")}function ot(t){let e=t.body;if(null!=e)for(let t=0;t<e.children.length;t++){let i=e.children[t];if(void 0===i)continue;let r=void 0===i.getAttribute?null:i.getAttribute("data-testid");null!=r&&r.endsWith("-tooltip")&&st(i)}}var nt=class t{constructor(t,e,i){this._baseTransform="",this._viewport={scale:1,offset:{x:0,y:0}},this._pinnedBbox=null,this._tooltip=null,this._bondTooltip=null,this._rdkitSvgCache=new Map,this._unsubs=[],this._destroyed=!1,this.host=t,this._editor=e,this._doc=i?.documentImpl??Q(t),this._width=i?.width??400,this._height=i?.height??200,function(t){let e=Q(t);if(null!==e.querySelector("style[data-hw-editor-view-styles]"))return;let i=e.createElement("style");i.setAttribute("data-hw-editor-view-styles",""),i.textContent=".hw-editor-view{position:relative;display:block;overflow:hidden;outline:none;}.hw-editor-view svg{display:block;user-select:none;}.hw-editor-view.hw-view-only{cursor:default;}";let r=e.head??e.documentElement;null!==r&&r.appendChild(i)}(t);let r=this._doc.createElement("div");r.setAttribute("class","hw-editor-view"),t.appendChild(r),this._tooltip=it(this._doc,"atom-tooltip","hw-atom-tooltip"),this._bondTooltip=it(this._doc,"bond-tooltip","hw-bond-tooltip"),this._svgRoot=this._renderFresh(),this._unsubs.push(e.on("mol:changed",t=>{this._hideTooltip(),this._hideBondTooltip(),("setHelm"===t.reason||"cleanLayout"===t.reason||"initial"===t.reason)&&(this._pinnedBbox=null),this._renderFresh()})),this._unsubs.push(e.on("selection:change",t=>{this._refreshOverlays(t)})),this._unsubs.push(e.on("highlight:change",t=>{this._refreshOverlays(t)})),this._unsubs.push(e.on("theme:change",()=>{this._renderFresh()})),this._unsubs.push(e.on("view:resize",t=>{this._applyResize(t.width,t.height)})),this._unsubs.push(e.on("view:viewport-change",t=>{this._viewport=t.viewport,this._applyViewport(t.viewport)})),this._unsubs.push(e.on("view:fit-to-content",()=>{this._pinnedBbox=null,this._renderFresh()})),this._unsubs.push(e.on("monomer:hover",t=>{this._showTooltip(t.atom,t.clientX,t.clientY)})),this._unsubs.push(e.on("monomer:hover-end",()=>{this._hideTooltip()})),this._unsubs.push(e.on("bond:hover",t=>{this._showBondTooltip(t.bond,t.clientX,t.clientY)})),this._unsubs.push(e.on("bond:hover-end",()=>{this._hideBondTooltip()})),this._unsubs.push(e.on("bond:preview",t=>{this._paintBondPreview(t.start.p,t.cursor,null!==t.candidate)})),this._unsubs.push(e.on("bond:preview-end",()=>{this._clearBondPreview()})),this._unsubs.push(e.on("bond:cancel",()=>{this._clearBondPreview()})),this._unsubs.push(e.on("selection:rectangle-start",t=>{this._paintSelectionRect(t.origin,t.origin)})),this._unsubs.push(e.on("selection:rectangle-update",t=>{this._paintSelectionRectFromRect(t.rect)})),this._unsubs.push(e.on("selection:rectangle-end",()=>{this._clearSelectionRect()}))}get svgRoot(){return this._svgRoot}get width(){return this._width}get height(){return this._height}resize(t,e){this._destroyed||(this._width=t,this._height=e,this._renderFresh())}redraw(){this._destroyed||this._renderFresh()}destroy(){if(this._destroyed)return;this._destroyed=!0;for(let t of this._unsubs)t();this._unsubs.length=0;let t=this.host.querySelector(".hw-editor-view");null!==t&&null!==t.parentNode&&t.parentNode.removeChild(t),st(this._tooltip),st(this._bondTooltip),this._tooltip=null,this._bondTooltip=null}_renderFresh(){let t=this._editor.getService(),e=this._currentTheme(),i=this._editor.getMol();null===this._pinnedBbox&&(this._pinnedBbox=function(t,e=D){if(0===t.atoms.length)return{x:0,y:0,width:0,height:0};let i=q(t.atoms[0],e);for(let r=1;r<t.atoms.length;r++)i=B(i,q(t.atoms[r],e));return i}(i,e));let r=t.renderMol(i,{width:this._width,height:this._height,theme:e,fixedModelBbox:this._pinnedBbox});this._svgRoot=function(t,e){let i=Q(t),r=t.querySelector(".hw-editor-view");if(null===r)throw new Error("EditorView.replaceSvg: missing .hw-editor-view wrapper.");let l=i.createElement("div");l.innerHTML=e;let s=l.querySelector("svg");if(null===s)throw new Error("EditorView.replaceSvg: rendered output contained no <svg>.");for(;null!==r.firstChild;)r.removeChild(r.firstChild);return r.appendChild(s),s}(this.host,r);let l=this._svgRoot.querySelector(".hw-content");return this._baseTransform=null!==l?l.getAttribute("transform")??"":"",this._svgRoot.setAttribute("data-testid","editor-svg"),this._applyOverlaysToCurrent(),(1!==this._viewport.scale||0!==this._viewport.offset.x||0!==this._viewport.offset.y)&&this._applyViewport(this._viewport),this._svgRoot}_refreshOverlays(t){this._applyOverlaysToCurrent()}_applyOverlaysToCurrent(){let t=this._editor.getMol(),e=this._editor.getSelection(),i=function(t,e={}){let i=e.theme??D,r=e.selectedAtomIds??new Set;return{highlightLayer:Y(t,i,e.highlightedAtomIds??new Set),selectionLayer:Z(t,i,r)}}(t,{theme:this._currentTheme(),selectedAtomIds:e.atoms,highlightedAtomIds:this._editorHighlights()});this._spliceLayer("hw-highlights",i.highlightLayer),this._spliceLayer("hw-selections",i.selectionLayer)}_spliceLayer(t,e){let i=this._svgRoot.querySelector(`.${t}`);if(null===i||null===i.parentNode)return;let r=this._doc.createElementNS("http://www.w3.org/2000/svg","svg");r.innerHTML=e;let l=r.querySelector(`.${t}`);null!==l&&i.parentNode.replaceChild(l,i)}_editorHighlights(){let t=this._editor;return"function"==typeof t._currentHighlights?t._currentHighlights():new Set}_currentTheme(){let t=this._editor;return"function"==typeof t._currentTheme?t._currentTheme():this._editor.getService().theme}_applyResize(t,e){this._width=t,this._height=e,this._pinnedBbox=null,this._renderFresh()}_applyViewport(t){let e=this._svgRoot.querySelector(".hw-content");if(null===e)return;let i=`translate(${t.offset.x} ${t.offset.y}) scale(${t.scale})`,r=""===this._baseTransform?i:`${i} ${this._baseTransform}`;e.setAttribute("transform",r)}_showTooltip(t,e,i){let r=this._tooltip;if(null===r)return;let l=""===t.symbol?"?":t.symbol,s=t.monomer?.name??"",o=t.bio.positionInChain,n=""===t.bio.chainId?"?":t.bio.chainId,a=""!==s&&s!==l?`${s} @ ${n}:${o}`:`${l} @ ${n}:${o}`,h=this._renderRdkitTooltipSvg(t);rt(this._doc,r,{symbol:l,name:a,rdkitSvg:h,rdkitTestid:"atom-tooltip-rdkit-svg"});let d=""!==s&&s!==l?`${l} — ${s} @ ${n}:${o}`:`${l} @ ${n}:${o}`,u=this._doc.createElement("div");u.setAttribute("class","hw-atom-tooltip__text"),u.style.display="none",u.appendChild(this._doc.createTextNode(d)),r.appendChild(u),lt(r,e,i)}_renderRdkitTooltipSvg(e){let i=this._editor.getService().options.rdkitModule;if(null==i)return null;let r=e.monomer;if(null===r)return null;let l=r.smiles;if(void 0===l||""===l)return null;let s=`${r.polymerType}:${r.symbol}`;if(this._rdkitSvgCache.has(s))return this._rdkitSvgCache.get(s)??null;let o=et(i,l,220,140);if(this._rdkitSvgCache.size>=t._RDKIT_CACHE_LIMIT){let t=this._rdkitSvgCache.keys().next().value;void 0!==t&&this._rdkitSvgCache.delete(t)}return this._rdkitSvgCache.set(s,o),o}_hideTooltip(){st(this._tooltip)}_showBondTooltip(t,e,i){let r=this._bondTooltip;if(null===r)return;let l=at(t.r1),s=at(t.r2),o=`${t.a1.symbol}@${t.a1.bio.chainId}:${t.a1.bio.positionInChain}`,n=`${t.a2.symbol}@${t.a2.bio.chainId}:${t.a2.bio.positionInChain}`;rt(this._doc,r,{symbol:`${l}-${s} (${t.kind})`,name:`${o} ↔ ${n}`}),lt(r,e,i)}_hideBondTooltip(){st(this._bondTooltip)}_paintBondPreview(t,e,i){let r=this._svgRoot.querySelector(".hw-content");if(null===r)return;let l=r.querySelector(".hw-bond-preview");null===l&&(l=this._doc.createElementNS("http://www.w3.org/2000/svg","line"),l.setAttribute("class","hw-bond-preview"),l.setAttribute("data-testid","bond-preview"),l.setAttribute("stroke-dasharray","6 4"),l.setAttribute("stroke-width","2"),l.setAttribute("fill","none"),l.setAttribute("pointer-events","none"),r.appendChild(l)),l.setAttribute("x1",String(t.x)),l.setAttribute("y1",String(t.y)),l.setAttribute("x2",String(e.x)),l.setAttribute("y2",String(e.y)),l.setAttribute("stroke",i?"#1f5fcd":"#999999")}_clearBondPreview(){let t=this._svgRoot.querySelector(".hw-bond-preview");null!==t&&null!==t.parentNode&&t.parentNode.removeChild(t)}_paintSelectionRect(t,e){let i=Math.min(t.x,e.x),r=Math.min(t.y,e.y),l=Math.abs(t.x-e.x),s=Math.abs(t.y-e.y);this._paintSelectionRectAt(i,r,l,s)}_paintSelectionRectFromRect(t){this._paintSelectionRectAt(t.x,t.y,t.width,t.height)}_paintSelectionRectAt(t,e,i,r){let l=this._svgRoot.querySelector(".hw-content");if(null===l)return;let s=l.querySelector(".hw-selection-rect");null===s&&(s=this._doc.createElementNS("http://www.w3.org/2000/svg","rect"),s.setAttribute("class","hw-selection-rect"),s.setAttribute("data-testid","selection-rect"),s.setAttribute("fill","rgba(31, 95, 205, 0.08)"),s.setAttribute("stroke","#1f5fcd"),s.setAttribute("stroke-width","1"),s.setAttribute("stroke-dasharray","4 3"),s.setAttribute("pointer-events","none"),l.appendChild(s)),s.setAttribute("x",String(t)),s.setAttribute("y",String(e)),s.setAttribute("width",String(i)),s.setAttribute("height",String(r))}_clearSelectionRect(){let t=this._svgRoot.querySelector(".hw-selection-rect");null!==t&&null!==t.parentNode&&t.parentNode.removeChild(t)}};nt._RDKIT_CACHE_LIMIT=256;function at(t){switch(t.kind){case"numeric":return`R${t.r}`;case"unspecified":return"?";case"wildcard":return"*";case"pair":return"pair";case"positional":return`${t.position}pos:R${t.r}`}}var ht=class t{constructor(t,e){this._onClose=null,this._primaryAction=null,this._host=t,this._doc=e.documentImpl??Q(t);let i=this._doc,r={class:"hw-modal-backdrop",role:"presentation"};void 0!==e.testId&&(r["data-testid"]=`dialog-${e.testId}`);let l=tt(i,"div",r),s={class:"hw-modal",role:"dialog","aria-modal":"true","aria-label":e.title};void 0!==e.testId&&(s["data-testid"]=`dialog-${e.testId}-frame`);let o=tt(i,"div",s),n=tt(i,"div",{class:"hw-modal__header"},[e.title]),a=tt(i,"div",{class:"hw-modal__body"});o.appendChild(n),o.appendChild(a),l.appendChild(o);let h=t=>{t.stopPropagation()};for(let t of["mousedown","mousemove","mouseup","mouseover","mouseenter","mouseleave","wheel","contextmenu","dblclick","keydown","keyup","keypress"])l.addEventListener(t,h);o.addEventListener("keydown",t=>{let e=t;if("Enter"!==e.key||"TEXTAREA"===e.target?.tagName)return;let i=this._primaryAction;null!==i&&(e.preventDefault?.(),e.stopImmediatePropagation?.(),i())}),l.addEventListener("click",t=>{t.target!==l?t.stopPropagation():this.close()}),this.root=l,this.body=a}static anyOpen(){return t._openStack.length>0}static closeTopmost(){let e=t._openStack[t._openStack.length-1];return void 0!==e&&(e.close(),!0)}open(e){this._onClose=e??null,null===this.root.parentNode&&this._host.appendChild(this.root),t._openStack.includes(this)||t._openStack.push(this),ot(this._doc)}close(){let e=t._openStack.indexOf(this);e>=0&&t._openStack.splice(e,1),null!==this.root.parentNode&&this.root.parentNode.removeChild(this.root);let i=this._onClose;this._onClose=null,null!==i&&i()}setPrimaryAction(t){this._primaryAction=t}get isOpen(){return null!==this.root.parentNode}};ht._openStack=[];Object.freeze(new Set);function dt(t){return t.startsWith("[")&&t.endsWith("]")||1===t.length&&/^[A-Za-z]$/.test(t)?t:`[${t}]`}function ut(t,e,i){return`${dt(t)}(${dt(e)})${dt(i)}`}var pt="http://www.w3.org/2000/svg",ct={sugar:r.SUGAR,base:r.BASE,linker:r.LINKER},_t={sugar:["r","R"],base:["A"],linker:["p","P"]},bt={x:70,y:60},ft={x:140,y:60},gt={x:70,y:130},vt=class t{constructor(t,e,i){this.onValueSet=new s,this.onPickModeChange=new s,this._slots=new Map,this._favStar=null,this._pickMode=null,this._destroyed=!1,this._builderRdkitCache=new Map,this._editor=e,this._doc=i?.documentImpl??Q(t),this._hooks=i?.paletteHooks??null,this._favHooks=i?.favoriteHooks??null,this.element=tt(this._doc,"div",{class:"hw-rna-builder","data-testid":"rna-builder"});let r=tt(this._doc,"div",{class:"hw-rna-builder__header"});if(r.appendChild(tt(this._doc,"div",{class:"hw-rna-builder__title"},["RNA builder"])),null!==this._favHooks){let t=tt(this._doc,"span",{class:"hw-rna-builder__fav hw-rna-builder__fav--disabled",role:"button",tabindex:"0","data-testid":"rna-builder-fav-star",title:"Favorite this triplet","aria-pressed":"false","aria-disabled":"true"},["☆"]),e=t=>{t.stopPropagation();let e=this.getSelection();""===e.preview||null===this._favHooks||this._favHooks.toggleFavoriteTriplet(e.sugar,e.base,e.linker)};t.addEventListener("click",e),t.addEventListener("keydown",t=>{let i=t;("Enter"===i.key||" "===i.key)&&e(t)}),this._favStar=t,r.appendChild(t)}this.element.appendChild(r),this._hintEl=tt(this._doc,"div",{class:"hw-rna-builder__hint","data-testid":"rna-builder-hint",hidden:!0}),this.element.appendChild(this._hintEl);let l=this._buildSvg();this.element.appendChild(l),this._preview=tt(this._doc,"div",{class:"hw-rna-builder__preview","data-testid":"rna-builder-preview"}),this.element.appendChild(this._preview),this._addBtn=tt(this._doc,"button",{class:"hw-rna-builder__add",type:"button","data-testid":"rna-builder-add-btn"},["Add triplet"]),this._addBtn.addEventListener("click",()=>this._onAddClicked()),this.element.appendChild(this._addBtn),t.appendChild(this.element);let o=e.getService().monomerLib.onChanged.subscribe(()=>{this._destroyed||this.refresh()}),n=e.on("theme:change",()=>{this._destroyed||this._repaintSlotColors()});this._libUnsub=()=>{try{o()}catch{}try{n()}catch{}},this._populateDefaults(),this._updatePreview(),this._repaintSlotColors()}refresh(){this._populateDefaults(),this._updatePreview(),this._repaintSlotColors()}getSelection(){let t=this._slots.get("sugar")?.value??"",e=this._slots.get("base")?.value??"",i=this._slots.get("linker")?.value??"";return{sugar:t,base:e,linker:i,preview:""!==t&&""!==e&&""!==i?ut(t,e,i):""}}setField(t,e){let i=this._slots.get(t);void 0!==i&&(i.value=e,this._setLabelText(i.labelEl,e),this._repaintSlot(i),this._updatePreview(),this.onValueSet.next({field:t,symbol:e}))}startPickMode(t){this._pickMode!==t?(null!==this._pickMode&&this._setSlotPressed(this._pickMode,!1),this._pickMode=t,this._setSlotPressed(t,!0),this._setHintActive(t),this.onPickModeChange.next({field:t}),null!==this._hooks&&this._hooks.beginBiotypeFilter(ct[t],e=>{this.setField(t,e),this._exitPickMode()},()=>{this._exitPickMode()})):this.cancelPickMode()}cancelPickMode(){null!==this._pickMode&&(null!==this._hooks&&this._hooks.endBiotypeFilter(),this._exitPickMode())}getPickMode(){return this._pickMode}triggerAdd(){this._onAddClicked()}destroy(){this._destroyed||(this._destroyed=!0,null!==this._pickMode&&null!==this._hooks&&this._hooks.endBiotypeFilter(),this._libUnsub(),this.onValueSet.complete(),this.onPickModeChange.complete(),null!==this.element.parentNode&&this.element.parentNode.removeChild(this.element))}_buildSvg(){let t=this._doc.createElementNS(pt,"svg");t.setAttribute("class","hw-rna-builder__triplet"),t.setAttribute("viewBox","0 0 200 180"),t.setAttribute("data-testid","rna-builder-triplet-svg"),t.setAttribute("role","group"),t.setAttribute("aria-label","Triplet preview");let e=this._doc.createElementNS(pt,"line");e.setAttribute("class","hw-rna-builder__bond"),e.setAttribute("x1",String(bt.x+18)),e.setAttribute("y1",String(bt.y)),e.setAttribute("x2",String(ft.x-18)),e.setAttribute("y2",String(ft.y)),t.appendChild(e);let i=this._doc.createElementNS(pt,"line");i.setAttribute("class","hw-rna-builder__bond"),i.setAttribute("x1",String(bt.x)),i.setAttribute("y1",String(bt.y+18)),i.setAttribute("x2",String(gt.x)),i.setAttribute("y2",String(gt.y-22)),t.appendChild(i);let r=this._doc.createElementNS(pt,"rect");r.setAttribute("class","hw-rna-builder__slot-shape"),r.setAttribute("x",String(-18)),r.setAttribute("y",String(-18)),r.setAttribute("width",String(36)),r.setAttribute("height",String(36)),r.setAttribute("rx","8"),r.setAttribute("ry","8");let l=this._buildSlot("sugar","Pick sugar (backbone)",bt,r),s=this._doc.createElementNS(pt,"circle");s.setAttribute("class","hw-rna-builder__slot-shape"),s.setAttribute("cx","0"),s.setAttribute("cy","0"),s.setAttribute("r",String(18));let o=this._buildSlot("linker","Pick linker",ft,s),n=this._doc.createElementNS(pt,"path");n.setAttribute("class","hw-rna-builder__slot-shape"),n.setAttribute("d","M -22 0 L 0 -22 L 22 0 L 0 22 Z");let a=this._buildSlot("base","Pick base",gt,n);return t.appendChild(o.groupEl),t.appendChild(l.groupEl),t.appendChild(a.groupEl),this._slots.set("sugar",l),this._slots.set("linker",o),this._slots.set("base",a),t}_buildSlot(t,e,i,r){let l=this._doc.createElementNS(pt,"g");l.setAttribute("class","hw-rna-builder__slot"),l.setAttribute("data-slot",t),l.setAttribute("data-testid",`rna-builder-slot-${t}`),l.setAttribute("role","button"),l.setAttribute("tabindex","0"),l.setAttribute("aria-label",e),l.setAttribute("aria-pressed","false"),l.setAttribute("transform",`translate(${i.x} ${i.y})`),l.appendChild(r);let s=this._doc.createElementNS(pt,"text");s.setAttribute("class","hw-rna-builder__slot-label"),s.setAttribute("data-testid",`rna-builder-${t}-value`),s.setAttribute("x","0"),s.setAttribute("y","0"),s.setAttribute("text-anchor","middle"),s.setAttribute("dominant-baseline","central"),l.appendChild(s);let o=e=>{e.stopPropagation(),this.startPickMode(t)};return l.addEventListener("click",o),l.addEventListener("keydown",t=>{let e=t;("Enter"===e.key||" "===e.key)&&o(t)}),l.addEventListener("mouseenter",e=>this._showSlotTooltip(t,e)),l.addEventListener("mouseleave",()=>this._hideSlotTooltip()),l.addEventListener("focus",()=>this._showSlotTooltip(t,null)),l.addEventListener("blur",()=>this._hideSlotTooltip()),{id:t,biotype:ct[t],groupEl:l,shapeEl:r,labelEl:s,value:""}}_setLabelText(t,e){let i=[];for(let e=t.firstChild;null!==e;e=e.nextSibling)"title"===e.nodeName||"TITLE"===e.nodeName||i.push(e);for(let e of i)t.removeChild(e);let r=function(t){let e=t.length;return e<=2?16:e<=4?11:e<=7?8:e<=10?6:5}(e);t.setAttribute("font-size",String(r)),t.setAttribute("text-anchor","middle"),t.setAttribute("dominant-baseline","central");let l=e.length>10?`${e.slice(0,9)}…`:e;t.appendChild(this._doc.createTextNode(l));let s=t.parentNode;if(null!==s){let t=null;for(let e=s.firstChild;null!==e;e=e.nextSibling)if("title"===e.nodeName||"TITLE"===e.nodeName){t=e;break}for(null===t&&(t=this._doc.createElementNS(pt,"title"),s.insertBefore(t,s.firstChild));null!==t.firstChild;)t.removeChild(t.firstChild);t.appendChild(this._doc.createTextNode(e))}}_repaintSlotColors(){for(let t of this._slots.values())this._repaintSlot(t)}_repaintSlot(t){let e=this._editor.getService().monomerLib,i=this._theme(),r=""===t.value?null:function(t,e,i){return t.getMonomerSet(e).get(i)??null}(e,t.biotype,t.value),l=M(r,t.biotype,i.colorTheme);t.shapeEl.style.fill=l.background,t.shapeEl.style.stroke=l.line,t.labelEl.style.fill=l.text}_populateDefaults(){let t=this._editor.getService().monomerLib;for(let[e,i]of this._slots.entries()){let r=yt(t,i.biotype),l=wt(r,_t[e]),s=""!==i.value&&r.some(t=>t.symbol===i.value)?i.value:l??r[0]?.symbol??"";i.value=s,this._setLabelText(i.labelEl,s)}}_updatePreview(){let t=this.getSelection();for(;null!==this._preview.firstChild;)this._preview.removeChild(this._preview.firstChild);this._preview.appendChild(this._doc.createTextNode(""===t.preview?"-":t.preview)),this._updateFavStar(t)}_updateFavStar(t){if(null===this._favStar||null===this._favHooks)return;let e=""!==t.preview,i=e&&this._favHooks.isFavoriteTriplet(t.sugar,t.base,t.linker);for(;null!==this._favStar.firstChild;)this._favStar.removeChild(this._favStar.firstChild);this._favStar.appendChild(this._doc.createTextNode(i?"★":"☆")),this._favStar.setAttribute("aria-pressed",i?"true":"false"),e?this._favStar.removeAttribute("aria-disabled"):this._favStar.setAttribute("aria-disabled","true");let r="hw-rna-builder__fav"+(i?" hw-rna-builder__fav--active":"")+(e?"":" hw-rna-builder__fav--disabled");this._favStar.setAttribute("class",r)}_onAddClicked(){let t=this.getSelection();""!==t.preview&&this._editor.placeRnaTriplet(t.sugar,t.base,t.linker)}_exitPickMode(){if(null===this._pickMode)return;let t=this._pickMode;this._setSlotPressed(t,!1),this._pickMode=null,this._setHintActive(null),this.onPickModeChange.next({field:null})}_setHintActive(t){let e=this._hintEl;for(;null!==e.firstChild;)e.removeChild(e.firstChild);if(null===t)return void e.setAttribute("hidden","");e.removeAttribute("hidden");let i="sugar"===t?"sugar":"base"===t?"base":"linker";e.appendChild(this._doc.createTextNode(`Pick ${i} from palette`))}_setSlotPressed(t,e){let i=this._slots.get(t);if(void 0===i)return;i.groupEl.setAttribute("aria-pressed",e?"true":"false");let r=(i.groupEl.getAttribute("class")??"").split(/\s+/).filter(t=>"hw-rna-builder__slot--active"!==t).join(" ");i.groupEl.setAttribute("class",e?`${r} hw-rna-builder__slot--active`:r)}_theme(){let t=this._editor;return"function"==typeof t._currentTheme?t._currentTheme():this._editor.getService().theme}_rdkit(){let t=this._editor.getService().options?.rdkitModule;return t??null}_builderRdkitSvgFor(e){if(null===e)return null;let i=e.smiles;if(void 0===i||""===i)return null;let r=this._rdkit();if(null===r)return null;let l=`${e.polymerType}:${e.symbol}`;if(this._builderRdkitCache.has(l))return this._builderRdkitCache.get(l)??null;let s=et(r,i,220,140);if(this._builderRdkitCache.size>=t._BUILDER_RDKIT_CACHE_LIMIT){let t=this._builderRdkitCache.keys().next().value;void 0!==t&&this._builderRdkitCache.delete(t)}return this._builderRdkitCache.set(l,s),s}_slotHint(t){switch(t){case"sugar":return"Click to choose a different sugar";case"base":return"Click to choose a different base";case"linker":return"Click to choose a different linker"}}_slotTitle(t,e){let i=""===e?"?":e;switch(t){case"sugar":return`Sugar: ${i}`;case"base":return`Base: ${i}`;case"linker":return`Linker: ${i}`}}_showSlotTooltip(t,e){let i=this._slots.get(t);if(void 0===i)return;let r=this._editor.getService().monomerLib.getMonomerSet(i.biotype),l=""===i.value?null:r.get(i.value)??null,s=it(this._doc,"builder-tooltip","hw-builder-tooltip");rt(this._doc,s,{symbol:this._slotTitle(t,i.value),name:l?.name??"",rdkitSvg:this._builderRdkitSvgFor(l),rdkitTestid:"builder-tooltip-rdkit-svg",hint:this._slotHint(t)});let o=e;if(null!==o&&"number"==typeof o.clientX&&"number"==typeof o.clientY)lt(s,o.clientX,o.clientY);else{let t=i.groupEl,e="function"==typeof t.getBoundingClientRect?t.getBoundingClientRect():null;null!==e?lt(s,e.left+e.width/2,e.top+e.height/2):lt(s,0,0)}}_hideSlotTooltip(){st(this._doc.body.querySelector('[data-testid="builder-tooltip"]'))}};vt._BUILDER_RDKIT_CACHE_LIMIT=256;var mt=vt;function yt(t,e){let i=t.getMonomerSet(e),r=[];for(let t of i.values())r.push(t);return r.sort((t,e)=>t.symbol.localeCompare(e.symbol)),r}function wt(t,e){let i=new Set;for(let e of t)i.add(e.symbol);for(let t of e)if(i.has(t))return t;return null}var kt="Favorites",At={[kt]:"★ Favorites",[l.PEPTIDE]:"Peptides",[l.RNA]:"RNA",[l.CHEM]:"CHEM",[l.BLOB]:"BLOB",G:"G"},St=[kt,l.PEPTIDE,l.RNA,l.CHEM,l.BLOB,"G"],Ct="hwe:palette:favorites",Tt="hwe:palette:active-tab";function Et(t){return`${t.sugar}|${t.base}|${t.linker}`}var xt=class t{constructor(t,e,i){this.favoritesChanged=new s,this._nextAddUnsub=()=>{},this._favorites=new Set,this._favoriteTriplets=[],this._pendingRnaSelection=null,this._visibleTabs=[kt],this._activeTab=kt,this._searchInput=null,this._filter="",this._destroyed=!1,this._rnaBuilder=null,this._activeBiotypeFilter=null,this._pickResolver=null,this._pickCanceller=null,this._pickEscapeListener=null,this._pickOutsideClickListener=null,this._paletteRdkitCache=new Map,this._editor=e,this._doc=i?.documentImpl??Q(t),this._opts={documentImpl:this._doc,groupByNaturalAnalog:i?.groupByNaturalAnalog??!0,allowFavorites:i?.allowFavorites??!0},this._loadFavorites(),this._activeTab=this._resolveInitialTab(i?.initialTab),this.element=tt(this._doc,"div",{class:"hw-palette","data-testid":"palette"}),t.appendChild(this.element),this._render(),this._libUnsub=e.getService().monomerLib.onChanged.subscribe(()=>{this._destroyed||this.refresh()}),this._themeUnsub=e.on("theme:change",()=>{this._destroyed||this.refresh()}),this._nextAddUnsub=e.on("option:change",t=>{this._destroyed||"nextAdd"===t.key&&this._updatePrimedClasses()})}refresh(){this._render()}setFilter(t){this._filter=t.trim().toLowerCase(),null!==this._searchInput&&this._searchInput.value!==t&&(this._searchInput.value=t),this._applyFilter()}setActiveTab(t){this._visibleTabs.includes(t)&&(this._activeTab=t,this._persistActiveTab(),this._applyActiveTabClasses(),this._applyFilter())}getActiveTab(){return this._activeTab}getFavorites(){let t=this._editor.getService().monomerLib,e=[];for(let i of this._favorites)null!==this._findMonomer(t,i)&&e.push(i);return e}setFavorite(t,e){e!==this._favorites.has(t)&&(e?this._favorites.add(t):this._favorites.delete(t),this._saveFavorites(),this._hidePaletteTooltips(),this._render(),this._emitFavoritesChanged())}clearFavorites(){0===this._favorites.size&&0===this._favoriteTriplets.length||(this._favorites.clear(),this._favoriteTriplets.length=0,this._saveFavorites(),this._render(),this._emitFavoritesChanged())}getFavoriteTriplets(){return this._favoriteTriplets.map(t=>({...t}))}isFavoriteTriplet(t,e,i){let r=Et({sugar:t,base:e,linker:i});return this._favoriteTriplets.some(t=>Et(t)===r)}setFavoriteTriplet(t,e,i,r){let l=Et({sugar:t,base:e,linker:i}),s=this._favoriteTriplets.findIndex(t=>Et(t)===l);r!==s>=0&&(r?this._favoriteTriplets.push({sugar:t,base:e,linker:i}):this._favoriteTriplets.splice(s,1),this._saveFavorites(),this._hidePaletteTooltips(),this._render(),this._emitFavoritesChanged())}_hidePaletteTooltips(){let t=this._doc.body;st(t.querySelector('[data-testid="palette-tooltip"]')),st(t.querySelector('[data-testid="palette-triplet-tooltip"]'))}_emitFavoritesChanged(){this.favoritesChanged.next({favorites:this.getFavorites(),triplets:this.getFavoriteTriplets()})}destroy(){this._destroyed||(this._destroyed=!0,null!==this._rnaBuilder&&(this._rnaBuilder.destroy(),this._rnaBuilder=null),this._libUnsub(),this._themeUnsub(),this._nextAddUnsub(),null!==this.element.parentNode&&this.element.parentNode.removeChild(this.element))}getRnaBuilder(){return this._rnaBuilder}hasActiveBiotypeFilter(){return null!==this._activeBiotypeFilter}getActiveBiotypeFilter(){return this._activeBiotypeFilter}cancelBiotypeFilter(){if(null===this._activeBiotypeFilter)return;let t=this._pickCanceller;this._teardownPickMode(),t?.()}_buildPaletteFilterHooks(){return{beginBiotypeFilter:(t,e,i)=>{null!==this._activeBiotypeFilter&&this._teardownPickMode(),this._activeBiotypeFilter=t,this._pickResolver=e,this._pickCanceller=i,this._applyFilter();let r=t=>{"Escape"===t.key&&this.cancelBiotypeFilter()};this._pickEscapeListener=r,this._doc.defaultView?.addEventListener("keydown",r);let l=t=>{if(null===this._activeBiotypeFilter)return;let e=t.target;if(null==e)return;let i=this._activeBiotypeFilter,r=e;for(;null!==r;){let t=void 0===r.getAttribute?null:r.getAttribute("class");if(null!==t){let e=t.split(/\s+/);if(e.includes("hw-palette__tile")){if((r.getAttribute("data-biotype")??"")===i)return;break}if(e.includes("hw-rna-builder__slot")){if(this._isInsideOwnPalette(r))return;break}}r=r.parentElement}this.cancelBiotypeFilter()};this._pickOutsideClickListener=l,this._doc.addEventListener("mousedown",l,!0)},endBiotypeFilter:()=>this._teardownPickMode()}}_scrollActivePaneToTop(){let t=this.element.querySelector(`.hw-palette__pane[data-tab="${this._activeTab}"]`);if(null===t)return;let e=t;try{if("function"==typeof e.scrollTo)return void e.scrollTo({top:0,behavior:"smooth"})}catch{}"number"==typeof e.scrollTop&&(e.scrollTop=0)}_isInsideOwnPalette(t){let e=t;for(;null!==e;){if(e===this.element)return!0;e=e.parentElement}return!1}_teardownPickMode(){null!==this._activeBiotypeFilter&&(this._activeBiotypeFilter=null,this._pickResolver=null,this._pickCanceller=null,null!==this._pickEscapeListener&&(this._doc.defaultView?.removeEventListener("keydown",this._pickEscapeListener),this._pickEscapeListener=null),null!==this._pickOutsideClickListener&&(this._doc.removeEventListener("mousedown",this._pickOutsideClickListener,!0),this._pickOutsideClickListener=null),this._applyFilter())}_render(){for(null!==this._rnaBuilder&&(this._pendingRnaSelection=this._rnaBuilder.getSelection(),this._rnaBuilder.destroy(),this._rnaBuilder=null);null!==this.element.firstChild;)this.element.removeChild(this.element.firstChild);let t=this._doc.createElement("input");t.setAttribute("type","search"),t.setAttribute("class","hw-palette__search"),t.setAttribute("placeholder","Search monomers..."),t.setAttribute("data-testid","palette-search"),""!==this._filter&&(t.value=this._filter),t.addEventListener("input",()=>this.setFilter(t.value)),this._searchInput=t,this.element.appendChild(t),this._visibleTabs=this._computeVisibleTabs(),this._visibleTabs.includes(this._activeTab)||(this._activeTab=kt);let e=tt(this._doc,"div",{class:"hw-palette__tabs",role:"tablist","data-testid":"palette-tabs"});for(let t of this._visibleTabs){let i=t===this._activeTab,r=tt(this._doc,"button",{class:"hw-palette__tab",type:"button",role:"tab","aria-controls":`hw-palette-pane-${t}`,"aria-selected":i?"true":"false","data-testid":`palette-tab-${t}`,"data-tab":t,title:At[t]},[At[t]]);r.addEventListener("click",()=>this.setActiveTab(t)),e.appendChild(r)}this.element.appendChild(e);let i=tt(this._doc,"div",{class:"hw-palette__panes"}),r=this._theme(),l=this._editor.getService().monomerLib;for(let t of this._visibleTabs){let e=t===this._activeTab,s=tt(this._doc,"div",{class:"hw-palette__pane",id:`hw-palette-pane-${t}`,role:"tabpanel","data-testid":`palette-pane-${t}`,"data-tab":t,hidden:!e});t===kt?this._buildFavoritesPane(s,l,r):this._buildPolymerPane(s,t,l,r),i.appendChild(s)}this.element.appendChild(i),this._applyFilter()}_computeVisibleTabs(){let t=this._editor.getService().monomerLib,e=new Set;for(let i of t.getPolymerTypes())e.add(i);let i=[];i.push(kt);for(let t of St)t!==kt&&e.has(t)&&i.push(t);return i}_buildFavoritesPane(t,e,i){let r=this._resolveFavoriteMonomers(e),l=this._favoriteTriplets;if(0===r.length&&0===l.length){let e=tt(this._doc,"div",{class:"hw-palette__placeholder","data-testid":"palette-favorites-empty"},["No favorites yet — click the ☆ on any tile to add one."]);return void t.appendChild(e)}for(let[e,i]of this._groupByPolymerAndType(r))t.appendChild(this._renderGroup(e,i));l.length>0&&t.appendChild(this._renderTripletGroup("RNA · Triplets",l,e))}_groupByPolymerAndType(t){let e=new Map;for(let i of t){let t=i.polymerType,r=i.monomerType??"Undefined",l=`${t}|${r}`,s=e.get(l);void 0===s&&(s={pt:t,mt:r,list:[]},e.set(l,s)),s.list.push(i)}let i=t=>{let e=St.indexOf(t);return e<0?99:e},r={Backbone:0,Branch:1,Terminal:2,Undefined:3};return Array.from(e.values()).sort((t,e)=>i(t.pt)-i(e.pt)||(r[t.mt]??9)-(r[e.mt]??9)||t.mt.localeCompare(e.mt)).map(t=>[`${this._polymerLabel(t.pt)} · ${t.mt}`,t.list])}_polymerLabel(t){return At[t]??t}_renderTripletGroup(t,e,i){let r=tt(this._doc,"div",{class:"hw-palette__group","data-natural-analog":t}),l=tt(this._doc,"div",{class:"hw-palette__group-header","data-testid":`palette-group-${t}`},[t]),s=tt(this._doc,"div",{class:"hw-triplet-chips","data-testid":"palette-triplet-favorites"});for(let t of e)s.appendChild(this._renderTripletChip(t,i));return r.appendChild(l),r.appendChild(s),r}_renderTripletChip(t,e){let i=ut(t.sugar,t.base,t.linker),l=e.getMonomerSet(r.BASE).get(t.base)??null,s=M(l,r.BASE,this._theme().colorTheme),o=this.isFavoriteTriplet(t.sugar,t.base,t.linker),n=void 0!==l?.name&&""!==l.name?`${i} — ${l.name}`:i,{root:a}=function(t,e){let i=!1!==e.showStar,r=tt(t,"span",{class:"hw-triplet-chip__star"},[e.favorite?"★":"☆"]),l=tt(t,"span",{class:"hw-triplet-chip__label"},[e.label]),s=["hw-triplet-chip"];e.favorite&&s.push("hw-triplet-chip--favorite");let o=i?[r,l]:[l];return{root:tt(t,"div",{class:s.join(" "),role:"button",tabindex:"0","aria-label":e.title,"data-sugar":e.sugar,"data-base":e.base,"data-linker":e.linker,"data-triplet":e.label,"data-testid":`palette-triplet-${e.label}`,title:e.title,style:`background:${e.background};color:${e.textColor};`},o),star:r}}(this._doc,{sugar:t.sugar,base:t.base,linker:t.linker,label:i,title:n,background:_(s.background),textColor:s.text,favorite:o,showStar:this._opts.allowFavorites});return this._wireTripletChip(a,t),a}_wireTripletChip(t,e){t.addEventListener("mouseenter",t=>{let i=t,r=it(this._doc,"palette-triplet-tooltip","hw-palette-tooltip hw-triplet-tooltip");(function(t,e,i){for(;null!==e.firstChild;)e.removeChild(e.firstChild);e.appendChild(tt(t,"div",{class:"hw-tooltip__symbol"},[i.title]));let r=tt(t,"div",{class:"hw-tooltip__triplet"});for(let e of i.parts){let l=tt(t,"div",{class:"hw-tooltip__triplet-part"});if(l.appendChild(tt(t,"div",{class:"hw-tooltip__triplet-role"},[`${e.role}: ${e.symbol}`])),void 0!==e.name&&""!==e.name&&e.name!==e.symbol&&l.appendChild(tt(t,"div",{class:"hw-tooltip__name"},[e.name])),void 0!==e.rdkitSvg&&null!==e.rdkitSvg&&""!==e.rdkitSvg){let r={class:"hw-tooltip__rdkit"};void 0!==i.rdkitTestid&&(r["data-testid"]=i.rdkitTestid);let s=tt(t,"div",r);s.innerHTML=e.rdkitSvg,l.appendChild(s)}r.appendChild(l)}e.appendChild(r),void 0!==i.hint&&""!==i.hint&&e.appendChild(tt(t,"div",{class:"hw-tooltip__hint"},[i.hint]))})(this._doc,r,{title:ut(e.sugar,e.base,e.linker),parts:this._tripletTooltipParts(e),hint:"Click to add this triplet",rdkitTestid:"palette-triplet-tooltip-rdkit-svg"}),lt(r,"number"==typeof i.clientX?i.clientX:0,"number"==typeof i.clientY?i.clientY:0)}),t.addEventListener("mouseleave",()=>{st(this._doc.body.querySelector('[data-testid="palette-triplet-tooltip"]'))}),t.addEventListener("click",t=>{let i=t.target;if(this._opts.allowFavorites&&!0===i?.classList?.contains("hw-triplet-chip__star"))return this.setFavoriteTriplet(e.sugar,e.base,e.linker,!this.isFavoriteTriplet(e.sugar,e.base,e.linker)),void t.stopPropagation();this._editor.placeRnaTriplet(e.sugar,e.base,e.linker)}),t.addEventListener("keydown",t=>{let i=t;("Enter"===i.key||" "===i.key)&&this._editor.placeRnaTriplet(e.sugar,e.base,e.linker)})}_buildRnaDefaultChips(e){let i=this._pickSymbol(e.getMonomerSet(r.SUGAR),["r","R"]),l=this._pickSymbol(e.getMonomerSet(r.LINKER),["p","P"]),s=e.getMonomerSet(r.BASE);if(null===i||null===l)return null;let o=t._DEFAULT_TRIPLET_BASES.filter(t=>s.has(t));if(0===o.length)return null;let n=tt(this._doc,"div",{class:"hw-triplet-chips hw-triplet-chips--defaults","data-testid":"rna-default-triplets"});for(let t of o)n.appendChild(this._renderTripletChip({sugar:i,base:t,linker:l},e));return n}_tripletTooltipParts(t){let e=this._editor.getService().monomerLib,i=(t,i,r)=>{let l=e.getMonomerSet(i).get(r)??null;return{role:t,symbol:r,...void 0!==l?.name?{name:l.name}:{},rdkitSvg:null===l?null:this._paletteRdkitSvg(l)}};return[i("Sugar",r.SUGAR,t.sugar),i("Base",r.BASE,t.base),i("Linker",r.LINKER,t.linker)]}_pickSymbol(t,e){for(let i of e)if(t.has(i))return i;let i=t.keys().next();return!0===i.done?null:i.value}_restoreRnaSelection(){let t=this._pendingRnaSelection;if(this._pendingRnaSelection=null,null===t||null===this._rnaBuilder)return;let e=this._editor.getService().monomerLib;""!==t.sugar&&e.getMonomerSet(r.SUGAR).has(t.sugar)&&this._rnaBuilder.setField("sugar",t.sugar),""!==t.base&&e.getMonomerSet(r.BASE).has(t.base)&&this._rnaBuilder.setField("base",t.base),""!==t.linker&&e.getMonomerSet(r.LINKER).has(t.linker)&&this._rnaBuilder.setField("linker",t.linker)}_resolveFavoriteMonomers(t){let e=[];for(let i of this._favorites){let r=this._findMonomer(t,i);null!==r&&e.push(r)}return e}_findMonomer(t,e){for(let i of t.getPolymerTypes()){let r=t.getMonomer(i,e);if(null!==r)return r}return null}_buildPolymerPane(t,e,i,r){let s=e,o=this._monomersForPolymer(s,i);if(0===o.length)return;if(s===l.RNA){this._rnaBuilder=new mt(t,this._editor,{documentImpl:this._doc,paletteHooks:this._buildPaletteFilterHooks(),favoriteHooks:this._opts.allowFavorites?{isFavoriteTriplet:(t,e,i)=>this.isFavoriteTriplet(t,e,i),toggleFavoriteTriplet:(t,e,i)=>this.setFavoriteTriplet(t,e,i,!this.isFavoriteTriplet(t,e,i))}:null}),this._restoreRnaSelection();let e=this._buildRnaDefaultChips(i);null!==e&&t.appendChild(e);let r=this._groupRna(o);for(let[e,i]of r)0!==i.length&&t.appendChild(this._renderGroup(e,i));return}if(s===l.PEPTIDE&&this._opts.groupByNaturalAnalog){let e=this._groupByAnalog(o);for(let[i,r]of e){let e=""===i?"Other":i;t.appendChild(this._renderGroup(e,r))}return}let n=tt(this._doc,"div",{class:"hw-palette__group-tiles"}),a=this._editor.getNextAddSymbol(),h=this._sortByColor(o);for(let t of h){let e=this._biotype(t,s);n.appendChild(this._renderTile(t,e,a))}t.appendChild(n)}_renderGroup(t,e){let i=tt(this._doc,"div",{class:"hw-palette__group","data-natural-analog":t}),r=tt(this._doc,"div",{class:"hw-palette__group-header","data-testid":`palette-group-${t}`},[t]),l=tt(this._doc,"div",{class:"hw-palette__group-tiles"}),s=this._editor.getNextAddSymbol(),o=this._sortByColor(e);for(let t of o){let e=this._biotype(t,t.polymerType);l.appendChild(this._renderTile(t,e,s))}return i.appendChild(r),i.appendChild(l),i}_sortByColor(t){let e=this._theme(),i=t.map((t,i)=>{let r=function(t){let e=a(t);if(null===e)return{h:0,s:0,l:0};let[i,r,l]=u(e[0],e[1],e[2]);return{h:i,s:r,l}}(M(t,this._biotype(t,t.polymerType),e.colorTheme).background),l=0===r.s?1:0;return{m:t,idx:i,h:r.h,s:r.s,l:r.l,isGrey:l}});return i.sort((t,e)=>t.isGrey!==e.isGrey?t.isGrey-e.isGrey:t.h!==e.h?t.h-e.h:t.s!==e.s?t.s-e.s:t.l!==e.l?t.l-e.l:t.idx-e.idx),i.map(t=>t.m)}_monomersForPolymer(t,e){let i=e.getMonomerSymbolsByType(t),r=[];for(let l of i){let i=e.getMonomer(t,l);null!==i&&r.push(i)}return r.sort((t,e)=>t.symbol.localeCompare(e.symbol)),r}_groupByAnalog(t){let e=new Map;for(let i of t){let t=i.naturalAnalog??"",r=e.get(t);void 0===r&&(r=[],e.set(t,r)),r.push(i)}let i=[],r=Array.from(e.keys()).sort((t,e)=>""===t&&""!==e?1:""===e&&""!==t?-1:t.localeCompare(e));for(let t of r)i.push([t,e.get(t)]);return new Map(i)}_groupRna(t){let e=[],i=[],l=[],s=[];for(let o of t){let t=$(o);t===r.SUGAR?e.push(o):t===r.BASE?i.push(o):t===r.LINKER?l.push(o):s.push(o)}let o=new Map;return o.set("Backbones",e),o.set("Bases",i),o.set("Linkers",l),s.length>0&&o.set("Other",s),o}_renderTile(t,e,i){let r=this._favorites.has(t.symbol),l=null!==i&&i.symbol===t.symbol&&i.biotype===e,{root:s,star:o}=function(t,e){let i=M(e.monomer,e.biotype,e.theme.colorTheme),r=_(i.background),l=i.text,s=function(t,e){let i=b(t),r=b(e);return(Math.max(i,r)+.05)/(Math.min(i,r)+.05)}(l,r)<5,o=e.monomer.symbol,n=function(t){return t<=3?14:t<=6?11:t<=9?9:8}(o.length),a=`font-size:${n}px;${o.length>=10?"line-height:1.1;letter-spacing:-0.02em;":""}white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:80px;display:inline-block;`,h=tt(t,"span",{class:"hw-palette__star"},[e.favorite?"★":"☆"]),d=tt(t,"span",{class:"hw-palette__label",style:a},[o]),u=["hw-palette__tile"];e.primed&&u.push("hw-palette__tile--primed"),e.favorite&&u.push("hw-palette__tile--favorite"),s&&u.push("hw-palette__tile--low-contrast");let p=void 0!==e.monomer.name?`${o} — ${e.monomer.name}`:o,c=`background:${r};color:${l};width:100%;min-width:48px;padding:4px 6px;height:40px;box-sizing:border-box;overflow:hidden;text-overflow:ellipsis;`;return{root:tt(t,"div",{class:u.join(" "),draggable:"true",role:"button","aria-pressed":e.primed?"true":"false","aria-label":p,"data-symbol":o,"data-biotype":e.biotype,"data-bg":r,"data-raw-bg":i.background,"data-testid":`palette-tile-${o}`,title:p,style:c},[h,d]),star:h}}(this._doc,{monomer:t,biotype:e,theme:this._theme(),favorite:r,primed:l});return this._wireTile(s,o,t,e),s}_rdkit(){let t=this._editor.getService().options?.rdkitModule;return t??null}_paletteRdkitSvg(e){let i=e.smiles;if(void 0===i||""===i)return null;let r=this._rdkit();if(null===r)return null;let l=`${e.polymerType}:${e.symbol}`;if(this._paletteRdkitCache.has(l))return this._paletteRdkitCache.get(l)??null;let s=et(r,i,220,140);if(this._paletteRdkitCache.size>=t._PALETTE_RDKIT_CACHE_LIMIT){let t=this._paletteRdkitCache.keys().next().value;void 0!==t&&this._paletteRdkitCache.delete(t)}return this._paletteRdkitCache.set(l,s),s}_wireTile(t,e,i,r){t.addEventListener("mouseenter",t=>{let e=t,r=it(this._doc,"palette-tooltip","hw-palette-tooltip");rt(this._doc,r,{symbol:i.symbol,name:i.name??"",rdkitSvg:this._paletteRdkitSvg(i),rdkitTestid:"palette-tooltip-rdkit-svg"}),lt(r,"number"==typeof e.clientX?e.clientX:0,"number"==typeof e.clientY?e.clientY:0)}),t.addEventListener("mouseleave",()=>{st(this._doc.body.querySelector('[data-testid="palette-tooltip"]'))}),t.addEventListener("click",t=>{let e=t.target;if(this._opts.allowFavorites&&void 0!==e&&!0===e?.classList?.contains("hw-palette__star"))return this.setFavorite(i.symbol,!this._favorites.has(i.symbol)),void t.stopPropagation();if(null!==this._activeBiotypeFilter&&this._activeBiotypeFilter===r){let e=this._pickResolver;return this._teardownPickMode(),e?.(i.symbol),this._scrollActivePaneToTop(),void t.stopPropagation()}let l=this._editor.getSelection();if(l.atoms.size>0){let e=this._editor.getMol(),s=[];for(let t of l.atoms){let i=e.atoms.find(e=>e.id===t);void 0!==i&&s.push(i)}return s.length>0&&s.every(t=>t.biotype===r)?(this._editor.replaceMonomers(s,i.symbol),void t.stopPropagation()):(this._editor.fire("editor:status",{message:`Cannot bulk-replace ${s.length} selected atom(s) with ${i.symbol}: selection contains incompatible biotypes for ${r}.`,severity:"warn",durationMs:3e3}),void t.stopPropagation())}let s=this._editor.getNextAddSymbol();if(null!==s&&s.symbol===i.symbol&&s.biotype===r)return this._editor.setNextAddSymbol(null),void this._updatePrimedClasses();this._editor.setNextAddSymbol(i.symbol,r),this._updatePrimedClasses()}),t.addEventListener("dragstart",t=>{let e=t.dataTransfer;if(null!=e)try{e.setData("application/x-hwe-monomer",JSON.stringify({symbol:i.symbol,biotype:r})),e.effectAllowed="copy"}catch{}st(this._doc.body.querySelector('[data-testid="palette-tooltip"]')),this._editor.startPaletteDrag(i.symbol,r)})}_biotype(t,e){let i=$(t);if(null!==i)return i;switch(e){case l.PEPTIDE:return r.AA;case l.RNA:return r.SUGAR;case l.CHEM:return r.CHEM;case l.BLOB:return r.BLOB;default:return r.CHEM}}_theme(){let t=this._editor;return"function"==typeof t._currentTheme?t._currentTheme():this._editor.getService().theme}_applyFilter(){let t=this._filter,e=this._activeBiotypeFilter,i=this.element.querySelector(`.hw-palette__pane[data-tab="${this._activeTab}"]`),r=(i??this.element).querySelectorAll(".hw-palette__tile");for(let i=0;i<r.length;i++){let l=r[i],s=(l.getAttribute("data-symbol")??"").toLowerCase(),o=(l.getAttribute("title")??"").toLowerCase(),n=l.getAttribute("data-biotype")??"",a=(""===t||s.indexOf(t)>=0||o.indexOf(t)>=0)&&(null===e||n===e);l.style.display=a?"":"none"}let l=(i??this.element).querySelectorAll(".hw-triplet-chip");for(let i=0;i<l.length;i++){let r=l[i],s=[r.getAttribute("data-triplet")??"",r.getAttribute("data-sugar")??"",r.getAttribute("data-base")??"",r.getAttribute("data-linker")??""].join(" ").toLowerCase(),o=(""===t||s.indexOf(t)>=0)&&null===e;r.style.display=o?"":"none"}let s=(i??this.element).querySelectorAll(".hw-palette__group");for(let t=0;t<s.length;t++){let e=s[t],i=e.querySelectorAll(".hw-palette__tile, .hw-triplet-chip"),r=!1;for(let t=0;t<i.length;t++)if("none"!==i[t].style.display){r=!0;break}r?(e.removeAttribute("hidden"),e.removeAttribute("data-section-empty")):(e.setAttribute("hidden",""),e.setAttribute("data-section-empty","true"))}}_updatePrimedClasses(){let t=this._editor.getNextAddSymbol(),e=this.element.querySelectorAll(".hw-palette__tile");for(let i=0;i<e.length;i++){let r=e[i],l=r.getAttribute("data-symbol")??"",s=r.getAttribute("data-biotype")??"",o=null!==t&&t.symbol===l&&t.biotype===s,n=(r.getAttribute("class")??"").split(/\s+/).filter(t=>"hw-palette__tile--primed"!==t).join(" ");r.setAttribute("class",o?`${n} hw-palette__tile--primed`:n),r.setAttribute("aria-pressed",o?"true":"false")}}_applyActiveTabClasses(){let t=this.element.querySelectorAll(".hw-palette__tab");for(let e=0;e<t.length;e++){let i=t[e],r=i.getAttribute("data-tab")??"";i.setAttribute("aria-selected",r===this._activeTab?"true":"false")}let e=this.element.querySelectorAll(".hw-palette__pane");for(let t=0;t<e.length;t++){let i=e[t];(i.getAttribute("data-tab")??"")===this._activeTab?i.removeAttribute("hidden"):i.setAttribute("hidden","")}}_localStorage(){if(!this._opts.allowFavorites)return null;let t=this._doc.defaultView;if(null==t)return null;try{return t.localStorage??null}catch{return null}}_resolveInitialTab(t){if(void 0!==t&&St.includes(t))return t;let e=this._localStorage();if(null!==e)try{let t=e.getItem(Tt);if(null!==t&&St.includes(t))return t}catch{}return kt}_persistActiveTab(){let t=this._localStorage();if(null!==t)try{t.setItem(Tt,this._activeTab)}catch{}}_loadFavorites(){let t=this._localStorage();if(null!==t){try{let e=t.getItem(Ct);if(null!==e&&""!==e){let t=JSON.parse(e),i=this._extractSymbols(t);for(let t of i)this._favorites.add(t);for(let e of this._extractTriplets(t))this._favoriteTriplets.push(e);return}}catch{}try{let e=t.getItem("hwe.palette.favorites");if(null===e||""===e)return;let i=JSON.parse(e);if(Array.isArray(i)){for(let t of i){if("string"!=typeof t)continue;let e=t.indexOf("|"),i=e>=0?t.slice(e+1):t;""!==i&&this._favorites.add(i)}this._saveFavorites()}}catch{}}}_extractSymbols(t){if(Array.isArray(t)){let e=[];for(let i of t)"string"==typeof i&&e.push(i);return e}if(null!==t&&"object"==typeof t){let e=t;if(Array.isArray(e.symbols)){let t=[];for(let i of e.symbols)"string"==typeof i&&t.push(i);return t}}return[]}_extractTriplets(t){if(null===t||"object"!=typeof t)return[];let e=t;if(!Array.isArray(e.triplets))return[];let i=[];for(let t of e.triplets){if(null===t||"object"!=typeof t)continue;let e=t;"string"==typeof e.sugar&&"string"==typeof e.base&&"string"==typeof e.linker&&i.push({sugar:e.sugar,base:e.base,linker:e.linker})}return i}_saveFavorites(){let t=this._localStorage();if(null!==t)try{let e={symbols:Array.from(this._favorites)};this._favoriteTriplets.length>0&&(e.triplets=this._favoriteTriplets.map(t=>({...t}))),t.setItem(Ct,JSON.stringify(e))}catch{}}};xt._DEFAULT_TRIPLET_BASES=["A","C","G","U","T"],xt._PALETTE_RDKIT_CACHE_LIMIT=256;new Set([l.PEPTIDE,l.RNA,l.CHEM,l.BLOB]),new Set(["Backbone","Branch","Terminal","Undefined"])}}]);
|
|
2
|
-
//# sourceMappingURL=657.js.map
|