jbrowse-plugin-graphgenomeviewer 9.0.0 → 9.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/AddTrackWorkflow-VKX2F7EK.js +2 -0
- package/dist/chunks/AddTrackWorkflow-VKX2F7EK.js.map +7 -0
- package/dist/chunks/GbzBaseSyntenyAdapter-HN5P4AGF.js +2 -0
- package/dist/chunks/{GbzBaseSyntenyAdapter-YUT5RT7G.js.map → GbzBaseSyntenyAdapter-HN5P4AGF.js.map} +3 -3
- package/dist/chunks/{GraphGenomeView-XFKLX3VQ.js → GraphGenomeView-GB6W6UZ4.js} +2 -2
- package/dist/chunks/{GraphTrackSettingsDialog-KOYYI2XH.js → GraphTrackSettingsDialog-P2XQATEX.js} +2 -2
- package/dist/chunks/HighlightColorDialog-6EOFDJDZ.js +2 -0
- package/dist/chunks/{HighlightColorDialog-F4IARMEO.js.map → HighlightColorDialog-6EOFDJDZ.js.map} +3 -3
- package/dist/chunks/LinearGraphDisplay-DHDMNOW4.js +2 -0
- package/dist/chunks/MinigraphBubbleAdapter-K2D7CW3M.js +2 -0
- package/dist/chunks/MinigraphBubbleAdapter-K2D7CW3M.js.map +7 -0
- package/dist/chunks/RgfaTabixAdapter-PF2RC3RZ.js +2 -0
- package/dist/chunks/{RgfaTabixAdapter-7QKNUHKX.js.map → RgfaTabixAdapter-PF2RC3RZ.js.map} +1 -1
- package/dist/chunks/WalkFormsAdapter-E5VINQZN.js +2 -0
- package/dist/chunks/WalkFormsAdapter-E5VINQZN.js.map +7 -0
- package/dist/chunks/{WalkTabixSyntenyAdapter-KI7ESKKP.js → WalkTabixSyntenyAdapter-AQ56UH4Y.js} +2 -2
- package/dist/chunks/{WalkTabixSyntenyAdapter-KI7ESKKP.js.map → WalkTabixSyntenyAdapter-AQ56UH4Y.js.map} +3 -3
- package/dist/chunks/{chunk-3HSJ7SAT.js → chunk-2CSE6SGH.js} +2 -2
- package/dist/chunks/{chunk-3HSJ7SAT.js.map → chunk-2CSE6SGH.js.map} +1 -1
- package/dist/chunks/chunk-3ETSJ4Z2.js +3 -0
- package/dist/chunks/chunk-3ETSJ4Z2.js.map +7 -0
- package/dist/chunks/{chunk-Y4TLRGAC.js → chunk-57DOGFYN.js} +2 -2
- package/dist/chunks/{chunk-47UWMS4O.js → chunk-5YY3OGK6.js} +2 -2
- package/dist/chunks/chunk-CRMC2DTD.js +4 -0
- package/dist/chunks/chunk-CRMC2DTD.js.map +7 -0
- package/dist/chunks/chunk-EGZZ3ADM.js +2 -0
- package/dist/chunks/chunk-EGZZ3ADM.js.map +7 -0
- package/dist/chunks/{chunk-P76SUZFP.js → chunk-EPSEVFYY.js} +4 -4
- package/dist/chunks/chunk-EPSEVFYY.js.map +7 -0
- package/dist/chunks/{chunk-OSEQDKL3.js → chunk-GH6WRWYC.js} +1 -1
- package/dist/chunks/{chunk-OSEQDKL3.js.map → chunk-GH6WRWYC.js.map} +1 -1
- package/dist/chunks/chunk-HHWF6AVX.js +2 -0
- package/dist/chunks/{chunk-SXMUGZXP.js.map → chunk-HHWF6AVX.js.map} +3 -3
- package/dist/chunks/{chunk-LQSOJR7D.js → chunk-I6NW3VGS.js} +2 -2
- package/dist/chunks/{chunk-LQSOJR7D.js.map → chunk-I6NW3VGS.js.map} +3 -3
- package/dist/chunks/chunk-IAB4ZGCR.js +3 -0
- package/dist/chunks/chunk-IAB4ZGCR.js.map +7 -0
- package/dist/chunks/{chunk-VAWAASUT.js → chunk-MSAVT4CG.js} +1 -1
- package/dist/chunks/{chunk-VAWAASUT.js.map → chunk-MSAVT4CG.js.map} +1 -1
- package/dist/chunks/chunk-NIGOHOFJ.js +6 -0
- package/dist/chunks/chunk-NIGOHOFJ.js.map +7 -0
- package/dist/chunks/{chunk-I2XBA4H7.js → chunk-OTHDGBEZ.js} +2 -2
- package/dist/chunks/{chunk-I2XBA4H7.js.map → chunk-OTHDGBEZ.js.map} +2 -2
- package/dist/chunks/{chunk-MPUAUZSJ.js → chunk-P5SI66S3.js} +1 -1
- package/dist/chunks/{chunk-MPUAUZSJ.js.map → chunk-P5SI66S3.js.map} +1 -1
- package/dist/chunks/{chunk-HFBUC6GF.js → chunk-RYM2UTLL.js} +2 -2
- package/dist/chunks/{chunk-HFBUC6GF.js.map → chunk-RYM2UTLL.js.map} +2 -2
- package/dist/chunks/chunk-T5X4OJJ2.js +2 -0
- package/dist/chunks/{chunk-7PVPO366.js.map → chunk-T5X4OJJ2.js.map} +4 -4
- package/dist/chunks/chunk-UH3LQSHA.js +2 -0
- package/dist/chunks/chunk-UH3LQSHA.js.map +7 -0
- package/dist/chunks/{chunk-N4ZFGZDN.js → chunk-ULWTJWXX.js} +2 -2
- package/dist/chunks/{chunk-N4ZFGZDN.js.map → chunk-ULWTJWXX.js.map} +1 -1
- package/dist/chunks/chunk-VPKTQAAQ.js +3 -0
- package/dist/chunks/chunk-VPKTQAAQ.js.map +7 -0
- package/dist/chunks/chunk-WCFLR4AJ.js +2 -0
- package/dist/chunks/{chunk-TLUGH4VW.js.map → chunk-WCFLR4AJ.js.map} +1 -1
- package/dist/chunks/{chunk-FLKXKTS2.js → chunk-WKD7ALOU.js} +2 -2
- package/dist/chunks/{chunk-FLKXKTS2.js.map → chunk-WKD7ALOU.js.map} +2 -2
- package/dist/chunks/{chunk-AQSLN3RH.js → chunk-XZU7RJUH.js} +2 -2
- package/dist/chunks/{chunk-AQSLN3RH.js.map → chunk-XZU7RJUH.js.map} +1 -1
- package/dist/chunks/chunk-ZN2NTCLU.js +2 -0
- package/dist/chunks/chunk-ZN2NTCLU.js.map +7 -0
- package/dist/chunks/{renderSvg-DLJTA2B3.js → renderSvg-CZH4IATB.js} +2 -2
- package/dist/jbrowse-plugin-graphgenomeviewer.esm.js +5 -5
- package/dist/jbrowse-plugin-graphgenomeviewer.esm.js.map +4 -4
- package/package.json +3 -3
- package/src/GetSubgraph.ts +5 -0
- package/src/GraphAddTrackWorkflow/AddTrackWorkflow.test.tsx +36 -1
- package/src/GraphAddTrackWorkflow/AddTrackWorkflow.tsx +10 -3
- package/src/GraphAddTrackWorkflow/buildTrackConfig.test.ts +40 -0
- package/src/GraphAddTrackWorkflow/buildTrackConfig.ts +10 -2
- package/src/GraphAddTrackWorkflow/index.ts +4 -0
- package/src/GraphAddTrackWorkflow/walkReference.test.ts +22 -0
- package/src/GraphAddTrackWorkflow/walkReference.ts +26 -0
- package/src/GraphComputeLayout.test.ts +16 -0
- package/src/GraphComputeLayout.ts +3 -1
- package/src/GraphGenomeView/components/ElTree.tsx +37 -7
- package/src/GraphGenomeView/components/GenePins.tsx +6 -8
- package/src/GraphGenomeView/components/GraphCanvas.tsx +9 -6
- package/src/GraphGenomeView/components/HighlightColorDialog.tsx +8 -2
- package/src/GraphGenomeView/components/LabelLayer.tsx +5 -2
- package/src/GraphGenomeView/components/PaneLayer.tsx +15 -0
- package/src/GraphGenomeView/components/WalkRowsOverlay.test.tsx +73 -0
- package/src/GraphGenomeView/components/WalkRowsOverlay.tsx +119 -49
- package/src/GraphGenomeView/components/WalkStrip.tsx +5 -0
- package/src/GraphGenomeView/components/usePaneGestures.test.tsx +16 -0
- package/src/GraphGenomeView/components/usePaneGestures.ts +48 -40
- package/src/GraphGenomeView/model.test.ts +164 -1
- package/src/GraphGenomeView/pane/fitViews.ts +3 -1
- package/src/GraphGenomeView/pane/launchActions.ts +2 -4
- package/src/GraphGenomeView/pane/loadActions.ts +109 -37
- package/src/GraphGenomeView/pane/renderingActions.ts +23 -10
- package/src/GraphGenomeView/repeats/walkCalls.ts +3 -1
- package/src/GraphGenomeView/subgraphLoad.test.ts +37 -0
- package/src/GraphGenomeView/viewModel.ts +1 -1
- package/src/GraphGenomeView/walkRowGroups.test.ts +103 -0
- package/src/GraphGenomeView/walkRowGroups.ts +37 -1
- package/src/LinearGraphDisplay/model.ts +6 -2
- package/src/MinigraphBubbleAdapter/MinigraphBubbleAdapter.ts +1 -1
- package/src/RgfaTabixAdapter/walkFiles.test.ts +1 -1
- package/src/RgfaTabixAdapter/walkReader.ts +1 -5
- package/src/WalkFormsAdapter/WalkFormsAdapter.test.ts +40 -1
- package/src/WalkFormsAdapter/WalkFormsAdapter.ts +74 -44
- package/src/WalkFormsAdapter/configSchema.ts +11 -0
- package/src/WalkFormsAdapter/formsMenu.test.ts +54 -7
- package/src/WalkFormsAdapter/formsMenu.ts +40 -16
- package/src/WalkFormsAdapter/formsMenuHost.test.ts +11 -6
- package/src/WalkTabixSyntenyAdapter/WalkTabixSyntenyAdapter.test.ts +6 -0
- package/src/WalkTabixSyntenyAdapter/WalkTabixSyntenyAdapter.ts +1 -1
- package/src/adapterImplementing.ts +11 -6
- package/src/graphTrackDefaults/graphTrackDefaults.test.ts +31 -0
- package/src/graphTrackDefaults/index.ts +24 -18
- package/src/hoverSync/graphViewHighlights.ts +2 -2
- package/src/hoverSync/lgvHover.test.ts +1 -1
- package/src/hoverSync/lgvHover.ts +7 -3
- package/src/isRecord.ts +4 -0
- package/src/launchFromGraph/linearViewTarget.ts +2 -4
- package/src/launchFromGraph/syntenyTracks.ts +5 -2
- package/src/locationName.test.ts +20 -0
- package/src/locationName.ts +10 -8
- package/src/panSNAliases/index.ts +4 -3
- package/src/panSNTabix.test.ts +4 -0
- package/src/panSNTabix.ts +25 -7
- package/src/version.ts +1 -1
- package/dist/chunks/AddTrackWorkflow-3PX4I4DX.js +0 -2
- package/dist/chunks/AddTrackWorkflow-3PX4I4DX.js.map +0 -7
- package/dist/chunks/GbzBaseSyntenyAdapter-YUT5RT7G.js +0 -2
- package/dist/chunks/HighlightColorDialog-F4IARMEO.js +0 -2
- package/dist/chunks/LinearGraphDisplay-BZ44C6S3.js +0 -2
- package/dist/chunks/MinigraphBubbleAdapter-2KIWDIY7.js +0 -2
- package/dist/chunks/MinigraphBubbleAdapter-2KIWDIY7.js.map +0 -7
- package/dist/chunks/RgfaTabixAdapter-7QKNUHKX.js +0 -2
- package/dist/chunks/WalkFormsAdapter-5NDOULY6.js +0 -2
- package/dist/chunks/WalkFormsAdapter-5NDOULY6.js.map +0 -7
- package/dist/chunks/chunk-42VF2CSA.js +0 -4
- package/dist/chunks/chunk-42VF2CSA.js.map +0 -7
- package/dist/chunks/chunk-7PVPO366.js +0 -2
- package/dist/chunks/chunk-AXUXLPO3.js +0 -6
- package/dist/chunks/chunk-AXUXLPO3.js.map +0 -7
- package/dist/chunks/chunk-CJ4VON23.js +0 -2
- package/dist/chunks/chunk-CJ4VON23.js.map +0 -7
- package/dist/chunks/chunk-D6TY2QEG.js +0 -2
- package/dist/chunks/chunk-D6TY2QEG.js.map +0 -7
- package/dist/chunks/chunk-KIURR66K.js +0 -3
- package/dist/chunks/chunk-KIURR66K.js.map +0 -7
- package/dist/chunks/chunk-M6YSANSW.js +0 -2
- package/dist/chunks/chunk-M6YSANSW.js.map +0 -7
- package/dist/chunks/chunk-P76SUZFP.js.map +0 -7
- package/dist/chunks/chunk-R34FRICP.js +0 -4
- package/dist/chunks/chunk-R34FRICP.js.map +0 -7
- package/dist/chunks/chunk-SXMUGZXP.js +0 -2
- package/dist/chunks/chunk-TLUGH4VW.js +0 -2
- package/dist/chunks/chunk-ZXJRZKWF.js +0 -2
- package/dist/chunks/chunk-ZXJRZKWF.js.map +0 -7
- /package/dist/chunks/{GraphGenomeView-XFKLX3VQ.js.map → GraphGenomeView-GB6W6UZ4.js.map} +0 -0
- /package/dist/chunks/{GraphTrackSettingsDialog-KOYYI2XH.js.map → GraphTrackSettingsDialog-P2XQATEX.js.map} +0 -0
- /package/dist/chunks/{LinearGraphDisplay-BZ44C6S3.js.map → LinearGraphDisplay-DHDMNOW4.js.map} +0 -0
- /package/dist/chunks/{chunk-Y4TLRGAC.js.map → chunk-57DOGFYN.js.map} +0 -0
- /package/dist/chunks/{chunk-47UWMS4O.js.map → chunk-5YY3OGK6.js.map} +0 -0
- /package/dist/chunks/{renderSvg-DLJTA2B3.js.map → renderSvg-CZH4IATB.js.map} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/WalkTabixSyntenyAdapter/walkLanes.ts", "../../src/WalkTabixSyntenyAdapter/WalkTabixSyntenyAdapter.ts"],
|
|
4
|
-
"sourcesContent": ["import { weightedLcs } from '@gmod/gbz-base/lcs'\nimport { pairAlignments, pairCigar } from '@gmod/gbz-base/pairAlignment'\nimport { panSNContig } from '@jbrowse/bandage-core/pansn'\n\nimport SyntenyFeature from '../synteny/SyntenyFeature.ts'\nimport { matchFeature } from '../synteny/matchFeature.ts'\n\nimport type { PairChain, PairEdit } from '@gmod/gbz-base/pairAlignment'\nimport type {\n WalkDeparture,\n WalkFragment,\n WalkNode,\n} from '@jbrowse/graph-walks'\n\n// The longest bubble with equal bases on both sides that is written as\n// mismatches; a longer one stays an insertion and a deletion\nconst BALANCED_BUBBLE_MAX_BP = 50\n\n/**\n * A chain's edits with each short balanced bubble as `X`. The walks carry no\n * bases, so two walks differ wherever they leave a shared node, and a SNP is\n * one base inserted and one deleted until it is read as the mismatch it is.\n */\nexport function bubblesAsMismatches(edits: PairEdit[]) {\n const out: PairEdit[] = []\n for (let i = 0; i < edits.length; i++) {\n const [op, len] = edits[i]!\n const [nextOp, nextLen] = edits[i + 1] ?? []\n if (\n len === nextLen &&\n len <= BALANCED_BUBBLE_MAX_BP &&\n ((op === 'I' && nextOp === 'D') || (op === 'D' && nextOp === 'I'))\n ) {\n out.push(['X', len])\n i++\n } else {\n out.push([op, len])\n }\n }\n return out\n}\n\n// A walk's steps as the handles gbz-base reads, 2 * id + reversed\nfunction handlesOf(fragment: WalkFragment) {\n return Array.from(fragment.ids, (id, i) => 2 * id + fragment.rev[i]!)\n}\n\nfunction nodeLength(nodes: Map<number, WalkNode>, id: number) {\n const node = nodes.get(id)\n return node === undefined ? 0 : node.end - node.start\n}\n\n/**\n * Aligns one walk fragment to another on the nodes both visit, from node\n * lengths alone: the fragments' steps as the handles gbz-base's chainer reads,\n * and a stand-in sequence of each node's length.\n */\nexport function walkAligner(nodes: Map<number, WalkNode>) {\n const standIn = new Map<number, string>()\n const sequenceOf = (id: number) => {\n const length = nodeLength(nodes, id)\n let sequence = standIn.get(length)\n if (sequence === undefined) {\n sequence = 'N'.repeat(length)\n standIn.set(length, sequence)\n }\n return sequence\n }\n const handles = new Map<WalkFragment, number[]>()\n const cachedHandles = (fragment: WalkFragment) => {\n let steps = handles.get(fragment)\n if (steps === undefined) {\n steps = handlesOf(fragment)\n handles.set(fragment, steps)\n }\n return steps\n }\n return (query: WalkFragment, target: WalkFragment) =>\n pairAlignments({\n query: cachedHandles(query),\n target: cachedHandles(target),\n sequenceOf,\n bases: false,\n })\n}\n\n// The fewest bases on shared nodes a record against the reference keeps,\n// gbz-base's floor for a pair record\nconst MIN_MATCH_BP = 100\n\nfunction appendEdit(edits: PairEdit[], op: PairEdit[0], len: number) {\n const last = edits.at(-1)\n if (len > 0) {\n if (last?.[0] === op) {\n last[1] += len\n } else {\n edits.push([op, len])\n }\n }\n}\n\n/**\n * Aligns a haplotype's walk fragment to the reference's as gbz-base aligns a\n * walk to its reference path: the heaviest common subsequence of their steps,\n * each node weighing its length, read in whichever direction shares more. A\n * pair chain leaves out every node either walk passes twice, which is the\n * whole of a collapsed copy-number array (amylase, KIV-2); the subsequence\n * matches one pass over it, and the other copies are insertions.\n */\nexport function referenceAligner(nodes: Map<number, WalkNode>) {\n const lengthOf = (handle: number) => nodeLength(nodes, handle >> 1)\n const offsets = (handles: number[]) => {\n const out = new Float64Array(handles.length + 1)\n handles.forEach((handle, i) => {\n out[i + 1] = out[i]! + lengthOf(handle)\n })\n return out\n }\n\n return (query: WalkFragment, target: WalkFragment): PairChain[] => {\n const ref = handlesOf(target)\n const hap = handlesOf(query)\n const [same, sameWeight] = weightedLcs(hap, ref, lengthOf)\n const [turned, turnedWeight] = weightedLcs(\n hap.map(handle => handle ^ 1).reverse(),\n ref,\n lengthOf,\n )\n const reverse = turnedWeight > sameWeight\n const pairs = reverse ? turned : same\n const sharedBases = Math.max(sameWeight, turnedWeight)\n if (sharedBases < MIN_MATCH_BP) {\n return []\n }\n const refAt = offsets(ref)\n const hapAt = offsets(hap)\n // a pair's haplotype step, counted along the haplotype\n const stepOf = (k: number) =>\n reverse ? hap.length - 1 - pairs[k]![0] : pairs[k]![0]\n const edits: PairEdit[] = []\n pairs.forEach(([, r], k) => {\n if (k > 0) {\n const [lo, hi] = [stepOf(k - 1), stepOf(k)].sort((x, y) => x - y)\n appendEdit(edits, 'I', hapAt[hi!]! - hapAt[lo! + 1]!)\n appendEdit(edits, 'D', refAt[r]! - refAt[pairs[k - 1]![1] + 1]!)\n }\n appendEdit(edits, '=', lengthOf(ref[r]!))\n })\n const [lo, hi] = [stepOf(0), stepOf(pairs.length - 1)].sort((x, y) => x - y)\n return [\n {\n queryStart: hapAt[lo!]!,\n queryEnd: hapAt[hi! + 1]!,\n targetStart: refAt[pairs[0]![1]]!,\n targetEnd: refAt[pairs.at(-1)![1] + 1]!,\n strand: reverse ? '-' : '+',\n edits,\n sharedBases,\n },\n ]\n }\n}\n\n// Each node a walk visits once, with the direction it passes it\nfunction singleVisits(fragment: WalkFragment) {\n const rev = new Map<number, number>()\n const twice = new Set<number>()\n fragment.ids.forEach((id, i) => {\n if (rev.has(id)) {\n twice.add(id)\n } else {\n rev.set(id, fragment.rev[i]!)\n }\n })\n for (const id of twice) {\n rev.delete(id)\n }\n return rev\n}\n\n// The bases on singly visited nodes two walks pass the same way and the\n// opposite way\nfunction directionShares(nodes: Map<number, WalkNode>) {\n const visits = new Map<WalkFragment, Map<number, number>>()\n const visitsOf = (fragment: WalkFragment) => {\n let found = visits.get(fragment)\n if (found === undefined) {\n found = singleVisits(fragment)\n visits.set(fragment, found)\n }\n return found\n }\n return (query: WalkFragment, target: WalkFragment) => {\n const theirs = visitsOf(target)\n let same = 0\n let opposite = 0\n for (const [id, rev] of visitsOf(query)) {\n const other = theirs.get(id)\n if (other === rev) {\n same += nodeLength(nodes, id)\n } else if (other !== undefined) {\n opposite += nodeLength(nodes, id)\n }\n }\n return { same, opposite }\n }\n}\n\n/**\n * Aligns one lane's walk fragment to another's. The weighted subsequence\n * (`referenceAligner`) is the fast route and matches through copy-number\n * arrays, but it reads one direction per pair, so an inversion between the\n * lanes comes out as an insertion beside a deletion. A pair sharing 100 bp\n * (MIN_MATCH_BP) or more of singly visited nodes in each direction goes to\n * pair chaining (`walkAligner`) instead, which answers the inverted stretch as\n * a reverse-strand record of its own. Chaining leaves out every node a walk\n * passes twice, so counting singly visited nodes misses no inversion it could\n * draw.\n */\nexport function lanePairAligner(nodes: Map<number, WalkNode>) {\n const subsequence = referenceAligner(nodes)\n const chained = walkAligner(nodes)\n const shares = directionShares(nodes)\n return (query: WalkFragment, target: WalkFragment) => {\n const { same, opposite } = shares(query, target)\n return same >= MIN_MATCH_BP && opposite >= MIN_MATCH_BP\n ? chained(query, target)\n : subsequence(query, target)\n }\n}\n\n// The multi-way display's SPLIT_AT_GAP_BP, under which a turned stretch names\n// no inversion there\nconst TURNED_MIN_BP = 10_000\n\n/**\n * Aligns a haplotype's walk fragment to the reference's as `referenceAligner`\n * does, then adds the stretches it reads the other way. A walk sharing\n * TURNED_MIN_BP or more of singly visited nodes in each direction is chained\n * too, and the chained records on the strand the subsequence did not take are\n * its turned stretches. The subsequence record stays, so a copy-number array,\n * which chaining leaves out, still matches one pass alike in every lane.\n */\nexport function anchorAligner(nodes: Map<number, WalkNode>) {\n const subsequence = referenceAligner(nodes)\n const chained = walkAligner(nodes)\n const shares = directionShares(nodes)\n return (query: WalkFragment, target: WalkFragment) => {\n const records = subsequence(query, target)\n const taken = records[0]?.strand\n const { same, opposite } = shares(query, target)\n return taken === undefined || Math.min(same, opposite) < TURNED_MIN_BP\n ? records\n : [\n ...records,\n ...chained(query, target).filter(chain => chain.strand !== taken),\n ]\n }\n}\n\n/**\n * One record of a walk aligned to another, with its short balanced bubbles as\n * mismatches\n */\nexport function chainFeature({\n chain,\n target,\n query,\n assemblyName,\n refName,\n mateAssemblyName,\n}: {\n chain: PairChain\n target: WalkFragment\n query: WalkFragment\n assemblyName: string\n refName: string\n mateAssemblyName: string\n}) {\n const edits = bubblesAsMismatches(chain.edits)\n return matchFeature({\n target: {\n name: target.name,\n assemblyName,\n refName,\n start: target.hapStart + chain.targetStart,\n end: target.hapStart + chain.targetEnd,\n },\n query: {\n name: query.name,\n assemblyName: mateAssemblyName,\n refName: panSNContig(query.name),\n start: query.hapStart + chain.queryStart,\n end: query.hapStart + chain.queryEnd,\n },\n strand: chain.strand,\n cigar: pairCigar(edits),\n matches: edits.reduce((sum, [op, n]) => sum + (op === '=' ? n : 0), 0),\n columns: edits.reduce((sum, [, n]) => sum + n, 0),\n })\n}\n\n/**\n * Whether a walk's fragment steps on the reference inside the window: on a\n * node of `refName` overlapping it\n */\nexport function stepsInWindow(\n fragment: WalkFragment,\n nodes: Map<number, WalkNode>,\n refName: string,\n window: { start: number; end: number },\n) {\n return Array.from(fragment.ids).some(id => {\n const node = nodes.get(id)\n return (\n node?.rank === 0 &&\n node.refName === refName &&\n node.start < window.end &&\n node.end > window.start\n )\n })\n}\n\n/** Whether the reference between a departure's ends covers the whole window */\nexport function departureSpans(\n { leavePos, rejoinPos }: WalkDeparture,\n window: { start: number; end: number },\n) {\n return (\n Math.min(leavePos, rejoinPos) <= window.start &&\n Math.max(leavePos, rejoinPos) >= window.end\n )\n}\n\n/**\n * A haplotype whose departure from the reference spans the whole window, as\n * the record a multi-way display lifts out as a deletion: `spansWindow`, the\n * reference between the departure's ends whole so its length heads the lane,\n * and the haplotype's own sequence between them as its mate, a point where\n * it has none. The record runs the way the walk rejoins the reference, and\n * carries no CIGAR and no identity, so no ramp or identity filter reads it\n * as an alignment.\n */\nexport function departureFeature({\n departure,\n refName,\n assemblyName,\n mateAssemblyName,\n}: {\n departure: WalkDeparture\n refName: string\n assemblyName: string\n mateAssemblyName: string\n}) {\n const { name, hapStart, ownBp, leavePos, rejoinPos, rejoinReversed } =\n departure\n const id = `${name}:${hapStart}:${leavePos}:departure`\n return new SyntenyFeature({\n uniqueId: id,\n assemblyName,\n refName,\n start: Math.min(leavePos, rejoinPos),\n end: Math.max(leavePos, rejoinPos),\n type: 'departure',\n strand: rejoinReversed ? -1 : 1,\n syntenyId: id,\n spansWindow: true,\n mate: {\n refName: panSNContig(name),\n start: hapStart,\n end: hapStart + ownBp,\n assemblyName: mateAssemblyName,\n },\n })\n}\n", "import {\n assemblyByPanSNPrefix,\n panSNContig,\n panSNHaplotype,\n panSNMatchesPrefix,\n panSNSample,\n resolvePanSNPrefix,\n} from '@jbrowse/bandage-core/pansn'\nimport { updateStatus } from '@jbrowse/core/util'\nimport { ObservableCreate } from '@jbrowse/core/util/rxjs'\nimport { walksKept } from '@jbrowse/graph-walks'\n\nimport {\n anchorAligner,\n chainFeature,\n departureFeature,\n departureSpans,\n lanePairAligner,\n stepsInWindow,\n} from './walkLanes.ts'\nimport { WalkIndex } from '../RgfaTabixAdapter/walkReader.ts'\nimport { PanSNRefNames, openWalkReader } from '../panSNTabix.ts'\nimport { ComparativeAdapterBase } from '../synteny/ComparativeAdapterBase.ts'\nimport {\n laneAssemblyName,\n lanePairsStatus,\n requestedPairs,\n} from '../synteny/lanePairs.ts'\nimport { laneZoomNotice } from '../synteny/laneZoomNotice.ts'\n\nimport type { WalkTabixSyntenyAdapterConfig } from './configSchema.ts'\nimport type { SubgraphAdapterOptions } from '../GetSubgraph.ts'\nimport type { LaneFeatureOptions, LanePair } from '../synteny/lanePairs.ts'\nimport type { BaseOptions } from '@jbrowse/core/data_adapters/BaseAdapter'\nimport type { Feature } from '@jbrowse/core/util'\nimport type { Region } from '@jbrowse/core/util/types'\n\nconst haplotypeOf = ({ name }: { name: string }) => panSNHaplotype(name) ?? name\n\nexport default class WalkTabixSyntenyAdapter extends ComparativeAdapterBase<WalkTabixSyntenyAdapterConfig> {\n private readonly walks: WalkIndex = new WalkIndex(openWalkReader(this), this)\n private readonly refNames: PanSNRefNames = new PanSNRefNames(\n this.walks.source,\n this,\n )\n\n private get anchor() {\n const anchor = this.getConf('assemblyNames')[0]\n if (anchor === undefined) {\n throw new Error(\n 'WalkTabixSyntenyAdapter needs assemblyNames: its first entry is the assembly the reference sample is loaded as',\n )\n }\n return anchor\n }\n\n /**\n * The haplotypes the walk file's header names, `sample#haplotype` in byte\n * order, or undefined when it names none\n */\n async getHaplotypeNames(opts: BaseOptions = {}) {\n return this.walks.haplotypeNames(opts)\n }\n\n /**\n * `lanes` is every haplotype the header names but the anchor's own,\n * declared up front so the display can offer the whole graph's haplotypes\n * before a fetch has placed any of them\n */\n async getHeader(opts: BaseOptions = {}) {\n const { haplotypes } = await this.walks.reader.header(opts)\n const { anchor } = this\n const anchorPrefix = resolvePanSNPrefix(this, anchor)\n const asmByPrefix = assemblyByPanSNPrefix(this)\n return {\n hasCoarseTier: false,\n anchorAssemblyName: anchor,\n lanes: haplotypes\n .filter(\n prefix =>\n prefix !== anchorPrefix && panSNSample(prefix) !== anchorPrefix,\n )\n .map(prefix => ({\n name: laneAssemblyName(asmByPrefix, prefix),\n label: prefix,\n group: panSNSample(prefix),\n })),\n }\n }\n\n // A lane's contigs are named only in its walk rows, so only the anchor's\n // are listed\n async getRefNames(opts: BaseOptions = {}) {\n const { assemblyName } = opts\n return assemblyName === undefined || assemblyName === this.anchor\n ? this.refNames.assemblyRefNames({ ...opts, assemblyName: this.anchor })\n : []\n }\n\n /**\n * The graph display's cut of the window, as RgfaTabixAdapter cuts a\n * walk-indexed graph: the reference walk first, then the walks `haplotypes`\n * asks for, and the nodes and links they visit\n */\n async getSubgraph(region: Region, opts: SubgraphAdapterOptions = {}) {\n const refName = await this.refNames.resolveForCut(region, {\n signal: opts.signal,\n })\n return this.walks.subgraph(refName, region, opts)\n }\n\n // The window's walks for the haplotypes named and the reference, with\n // every departure from the reference over it and no link read; a window\n // past a budget fails as a zoom-in notice for lanes. Named lanes come back\n // in full where the walk file abridged them: an abridged walk is two\n // reference steps, which drew 15 of the HPRC MHC launch's 32 lanes empty.\n private async laneWalks(\n refName: string,\n region: Region,\n prefixes: string[] | undefined,\n opts: LaneFeatureOptions,\n status: string,\n ) {\n const keep = walksKept(prefixes, refName)\n return updateStatus(status, opts.statusCallback, () =>\n this.walks.reader\n .cut(refName, region, {\n ...this.walks.budgets(),\n signal: opts.signal,\n keep,\n expand: keep,\n links: false,\n })\n .catch((error: unknown) => {\n throw laneZoomNotice(error, region.end - region.start)\n }),\n )\n }\n\n /**\n * One record per stretch a haplotype's walk shares with the reference's,\n * on the reference with the haplotype as its mate. A haplotype with no step\n * on the reference inside the window whose departure spans it is one\n * `spansWindow` record of the departure's stretch, its mate the haplotype's\n * own sequence between the departure's ends, a point where it has none.\n */\n private async anchorFeatures(\n refName: string,\n region: Region,\n opts: LaneFeatureOptions,\n ) {\n const wanted = opts.haplotypes?.length\n ? opts.haplotypes.map(lane => resolvePanSNPrefix(this, lane))\n : undefined\n const target = resolvePanSNPrefix(this, opts.targetAssemblyName)\n const prefixes =\n target === undefined\n ? wanted\n : wanted === undefined ||\n wanted.some(\n prefix =>\n panSNMatchesPrefix(target, prefix) ||\n panSNMatchesPrefix(prefix, target),\n )\n ? [target]\n : []\n if (prefixes?.length === 0) {\n return []\n }\n const { start, end } = region\n const status = `Reading walks ${region.refName}:${start.toLocaleString()}-${end.toLocaleString()}`\n const { graph, fragments, departures } = await this.laneWalks(\n refName,\n region,\n prefixes,\n opts,\n status,\n )\n // lanes come back in the order the fetch names them, which is the order\n // the display stacks lanes of equal weight in\n const rank = ({ name }: { name: string }) =>\n prefixes === undefined\n ? 0\n : prefixes.findIndex(prefix => panSNMatchesPrefix(name, prefix))\n const align = anchorAligner(graph.nodes)\n const asmByPrefix = assemblyByPanSNPrefix(this)\n const laneOf = (walk: { name: string }) =>\n laneAssemblyName(asmByPrefix, haplotypeOf(walk))\n const references = fragments.filter(f => f.name === refName)\n const walked = fragments\n .filter(fragment => fragment.name !== refName && rank(fragment) >= 0)\n .map(query => ({\n rank: rank(query),\n features: references.flatMap(reference =>\n align(query, reference).map(chain =>\n chainFeature({\n chain,\n target: reference,\n query,\n assemblyName: region.assemblyName,\n refName: region.refName,\n mateAssemblyName: laneOf(query),\n }),\n ),\n ),\n }))\n // NA19036#1 skips the IGL locus on one contig and walks it on another\n const walking = new Set(\n fragments\n .filter(fragment =>\n stepsInWindow(fragment, graph.nodes, refName, region),\n )\n .map(haplotypeOf),\n )\n const spanning = departures\n .filter(\n departure =>\n rank(departure) >= 0 &&\n !walking.has(haplotypeOf(departure)) &&\n departureSpans(departure, region),\n )\n .sort((a, b) => a.name.localeCompare(b.name))\n .map(departure => ({\n rank: rank(departure),\n features: [\n departureFeature({\n departure,\n refName: region.refName,\n assemblyName: region.assemblyName,\n mateAssemblyName: laneOf(departure),\n }),\n ],\n }))\n return [...walked, ...spanning]\n .sort((a, b) => a.rank - b.rank)\n .flatMap(lane => lane.features)\n }\n\n /**\n * Each pair's two lanes read out of the anchor window, all pairs in one\n * read, and each walk of a pair's query lane aligned to each walk of its\n * target lane. A pair's records sit on its query lane's contigs, the lane\n * the display draws on top.\n */\n private async pairFeatures(\n refName: string,\n region: Region,\n pairs: LanePair[],\n opts: LaneFeatureOptions,\n ) {\n const sides = pairs.map(pair => ({\n pair,\n featurePrefix: resolvePanSNPrefix(this, pair.queryAssemblyName),\n matePrefix: resolvePanSNPrefix(this, pair.targetAssemblyName),\n }))\n const { graph, fragments } = await this.laneWalks(\n refName,\n region,\n sides.flatMap(side => [side.featurePrefix, side.matePrefix]),\n opts,\n lanePairsStatus(pairs),\n )\n const align = lanePairAligner(graph.nodes)\n const walksOf = (prefix: string) =>\n fragments.filter(f => panSNMatchesPrefix(f.name, prefix))\n return sides.flatMap(({ pair, featurePrefix, matePrefix }) =>\n walksOf(featurePrefix).flatMap(target =>\n walksOf(matePrefix).flatMap(query =>\n align(query, target).map(chain =>\n chainFeature({\n chain,\n target,\n query,\n assemblyName: pair.queryAssemblyName,\n refName: panSNContig(target.name),\n mateAssemblyName: pair.targetAssemblyName,\n }),\n ),\n ),\n ),\n )\n }\n\n // The files are filed under the reference alone, so a window on a\n // haplotype lane has no answer: a lane pair is read inside the anchor's\n getFeatures(region: Region, opts: LaneFeatureOptions = {}) {\n return ObservableCreate<Feature>(async observer => {\n const refName =\n region.assemblyName === this.anchor\n ? await this.refNames.resolve(region, opts)\n : undefined\n if (refName !== undefined) {\n const pairs = requestedPairs(opts)\n const features =\n pairs.length > 0\n ? await this.pairFeatures(refName, region, pairs, opts)\n : await this.anchorFeatures(refName, region, opts)\n for (const feature of features) {\n observer.next(feature)\n }\n }\n observer.complete()\n }, opts.signal)\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["BALANCED_BUBBLE_MAX_BP", "bubblesAsMismatches", "edits", "out", "i", "op", "len", "nextOp", "nextLen", "handlesOf", "fragment", "id", "nodeLength", "nodes", "node", "walkAligner", "standIn", "sequenceOf", "length", "sequence", "handles", "cachedHandles", "steps", "query", "target", "pairAlignments", "MIN_MATCH_BP", "appendEdit", "last", "referenceAligner", "lengthOf", "handle", "offsets", "ref", "hap", "same", "sameWeight", "weightedLcs", "turned", "turnedWeight", "reverse", "pairs", "sharedBases", "refAt", "hapAt", "stepOf", "k", "r", "lo", "hi", "
|
|
4
|
+
"sourcesContent": ["import { weightedLcs } from '@gmod/gbz-base/lcs'\nimport { pairAlignments, pairCigar } from '@gmod/gbz-base/pairAlignment'\nimport { panSNContig } from '@jbrowse/bandage-core/pansn'\n\nimport SyntenyFeature from '../synteny/SyntenyFeature.ts'\nimport { matchFeature } from '../synteny/matchFeature.ts'\n\nimport type { PairChain, PairEdit } from '@gmod/gbz-base/pairAlignment'\nimport type {\n WalkDeparture,\n WalkFragment,\n WalkNode,\n} from '@jbrowse/graph-walks'\n\n// The longest bubble with equal bases on both sides that is written as\n// mismatches; a longer one stays an insertion and a deletion\nconst BALANCED_BUBBLE_MAX_BP = 50\n\n/**\n * A chain's edits with each short balanced bubble as `X`. The walks carry no\n * bases, so two walks differ wherever they leave a shared node, and a SNP is\n * one base inserted and one deleted until it is read as the mismatch it is.\n */\nexport function bubblesAsMismatches(edits: PairEdit[]) {\n const out: PairEdit[] = []\n for (let i = 0; i < edits.length; i++) {\n const [op, len] = edits[i]!\n const [nextOp, nextLen] = edits[i + 1] ?? []\n if (\n len === nextLen &&\n len <= BALANCED_BUBBLE_MAX_BP &&\n ((op === 'I' && nextOp === 'D') || (op === 'D' && nextOp === 'I'))\n ) {\n out.push(['X', len])\n i++\n } else {\n out.push([op, len])\n }\n }\n return out\n}\n\n// A walk's steps as the handles gbz-base reads, 2 * id + reversed\nfunction handlesOf(fragment: WalkFragment) {\n return Array.from(fragment.ids, (id, i) => 2 * id + fragment.rev[i]!)\n}\n\nfunction nodeLength(nodes: Map<number, WalkNode>, id: number) {\n const node = nodes.get(id)\n return node === undefined ? 0 : node.end - node.start\n}\n\n/**\n * Aligns one walk fragment to another on the nodes both visit, from node\n * lengths alone: the fragments' steps as the handles gbz-base's chainer reads,\n * and a stand-in sequence of each node's length.\n */\nexport function walkAligner(nodes: Map<number, WalkNode>) {\n const standIn = new Map<number, string>()\n const sequenceOf = (id: number) => {\n const length = nodeLength(nodes, id)\n let sequence = standIn.get(length)\n if (sequence === undefined) {\n sequence = 'N'.repeat(length)\n standIn.set(length, sequence)\n }\n return sequence\n }\n const handles = new Map<WalkFragment, number[]>()\n const cachedHandles = (fragment: WalkFragment) => {\n let steps = handles.get(fragment)\n if (steps === undefined) {\n steps = handlesOf(fragment)\n handles.set(fragment, steps)\n }\n return steps\n }\n return (query: WalkFragment, target: WalkFragment) =>\n pairAlignments({\n query: cachedHandles(query),\n target: cachedHandles(target),\n sequenceOf,\n bases: false,\n })\n}\n\n// The fewest bases on shared nodes a record against the reference keeps,\n// gbz-base's floor for a pair record\nconst MIN_MATCH_BP = 100\n\nfunction appendEdit(edits: PairEdit[], op: PairEdit[0], len: number) {\n const last = edits.at(-1)\n if (len > 0) {\n if (last?.[0] === op) {\n last[1] += len\n } else {\n edits.push([op, len])\n }\n }\n}\n\n/**\n * Aligns a haplotype's walk fragment to the reference's as gbz-base aligns a\n * walk to its reference path: the heaviest common subsequence of their steps,\n * each node weighing its length, read in whichever direction shares more. A\n * pair chain leaves out every node either walk passes twice, which is the\n * whole of a collapsed copy-number array (amylase, KIV-2); the subsequence\n * matches one pass over it, and the other copies are insertions.\n */\nexport function referenceAligner(nodes: Map<number, WalkNode>) {\n const lengthOf = (handle: number) => nodeLength(nodes, handle >> 1)\n const offsets = (handles: number[]) => {\n const out = new Float64Array(handles.length + 1)\n handles.forEach((handle, i) => {\n out[i + 1] = out[i]! + lengthOf(handle)\n })\n return out\n }\n\n return (query: WalkFragment, target: WalkFragment): PairChain[] => {\n const ref = handlesOf(target)\n const hap = handlesOf(query)\n const [same, sameWeight] = weightedLcs(hap, ref, lengthOf)\n const [turned, turnedWeight] = weightedLcs(\n hap.map(handle => handle ^ 1).reverse(),\n ref,\n lengthOf,\n )\n const reverse = turnedWeight > sameWeight\n const pairs = reverse ? turned : same\n const sharedBases = Math.max(sameWeight, turnedWeight)\n if (sharedBases < MIN_MATCH_BP) {\n return []\n }\n const refAt = offsets(ref)\n const hapAt = offsets(hap)\n // a pair's haplotype step, counted along the haplotype\n const stepOf = (k: number) =>\n reverse ? hap.length - 1 - pairs[k]![0] : pairs[k]![0]\n const edits: PairEdit[] = []\n pairs.forEach(([, r], k) => {\n if (k > 0) {\n const [lo, hi] = [stepOf(k - 1), stepOf(k)].sort((x, y) => x - y)\n appendEdit(edits, 'I', hapAt[hi!]! - hapAt[lo! + 1]!)\n appendEdit(edits, 'D', refAt[r]! - refAt[pairs[k - 1]![1] + 1]!)\n }\n appendEdit(edits, '=', lengthOf(ref[r]!))\n })\n const [lo, hi] = [stepOf(0), stepOf(pairs.length - 1)].sort((x, y) => x - y)\n return [\n {\n queryStart: hapAt[lo!]!,\n queryEnd: hapAt[hi! + 1]!,\n targetStart: refAt[pairs[0]![1]]!,\n targetEnd: refAt[pairs.at(-1)![1] + 1]!,\n strand: reverse ? '-' : '+',\n edits,\n sharedBases,\n },\n ]\n }\n}\n\n// Each node a walk visits once, with the direction it passes it\nfunction singleVisits(fragment: WalkFragment) {\n const rev = new Map<number, number>()\n const twice = new Set<number>()\n fragment.ids.forEach((id, i) => {\n if (rev.has(id)) {\n twice.add(id)\n } else {\n rev.set(id, fragment.rev[i]!)\n }\n })\n for (const id of twice) {\n rev.delete(id)\n }\n return rev\n}\n\n// The bases on singly visited nodes two walks pass the same way and the\n// opposite way\nfunction directionShares(nodes: Map<number, WalkNode>) {\n const visits = new Map<WalkFragment, Map<number, number>>()\n const visitsOf = (fragment: WalkFragment) => {\n let found = visits.get(fragment)\n if (found === undefined) {\n found = singleVisits(fragment)\n visits.set(fragment, found)\n }\n return found\n }\n return (query: WalkFragment, target: WalkFragment) => {\n const theirs = visitsOf(target)\n let same = 0\n let opposite = 0\n for (const [id, rev] of visitsOf(query)) {\n const other = theirs.get(id)\n if (other === rev) {\n same += nodeLength(nodes, id)\n } else if (other !== undefined) {\n opposite += nodeLength(nodes, id)\n }\n }\n return { same, opposite }\n }\n}\n\n/**\n * Aligns one lane's walk fragment to another's. The weighted subsequence\n * (`referenceAligner`) is the fast route and matches through copy-number\n * arrays, but it reads one direction per pair, so an inversion between the\n * lanes comes out as an insertion beside a deletion. A pair sharing 100 bp\n * (MIN_MATCH_BP) or more of singly visited nodes in each direction goes to\n * pair chaining (`walkAligner`) instead, which answers the inverted stretch as\n * a reverse-strand record of its own. Chaining leaves out every node a walk\n * passes twice, so counting singly visited nodes misses no inversion it could\n * draw.\n */\nexport function lanePairAligner(nodes: Map<number, WalkNode>) {\n const subsequence = referenceAligner(nodes)\n const chained = walkAligner(nodes)\n const shares = directionShares(nodes)\n return (query: WalkFragment, target: WalkFragment) => {\n const { same, opposite } = shares(query, target)\n return same >= MIN_MATCH_BP && opposite >= MIN_MATCH_BP\n ? chained(query, target)\n : subsequence(query, target)\n }\n}\n\n// The multi-way display's SPLIT_AT_GAP_BP, under which a turned stretch names\n// no inversion there\nconst TURNED_MIN_BP = 10_000\n\n/**\n * Aligns a haplotype's walk fragment to the reference's as `referenceAligner`\n * does, then adds the stretches it reads the other way. A walk sharing\n * TURNED_MIN_BP or more of singly visited nodes in each direction is chained\n * too, and the chained records on the strand the subsequence did not take are\n * its turned stretches. The subsequence record stays, so a copy-number array,\n * which chaining leaves out, still matches one pass alike in every lane.\n */\nexport function anchorAligner(nodes: Map<number, WalkNode>) {\n const subsequence = referenceAligner(nodes)\n const chained = walkAligner(nodes)\n const shares = directionShares(nodes)\n return (query: WalkFragment, target: WalkFragment) => {\n const records = subsequence(query, target)\n const taken = records[0]?.strand\n const { same, opposite } = shares(query, target)\n return taken === undefined || Math.min(same, opposite) < TURNED_MIN_BP\n ? records\n : [\n ...records,\n ...chained(query, target).filter(chain => chain.strand !== taken),\n ]\n }\n}\n\n/**\n * One record of a walk aligned to another, with its short balanced bubbles as\n * mismatches\n */\nexport function chainFeature({\n chain,\n target,\n query,\n assemblyName,\n refName,\n mateAssemblyName,\n}: {\n chain: PairChain\n target: WalkFragment\n query: WalkFragment\n assemblyName: string\n refName: string\n mateAssemblyName: string\n}) {\n const edits = bubblesAsMismatches(chain.edits)\n return matchFeature({\n target: {\n name: target.name,\n assemblyName,\n refName,\n start: target.hapStart + chain.targetStart,\n end: target.hapStart + chain.targetEnd,\n },\n query: {\n name: query.name,\n assemblyName: mateAssemblyName,\n refName: panSNContig(query.name),\n start: query.hapStart + chain.queryStart,\n end: query.hapStart + chain.queryEnd,\n },\n strand: chain.strand,\n cigar: pairCigar(edits),\n matches: edits.reduce((sum, [op, n]) => sum + (op === '=' ? n : 0), 0),\n columns: edits.reduce((sum, [, n]) => sum + n, 0),\n })\n}\n\n/**\n * Whether a walk's fragment steps on the reference inside the window: on a\n * node of `refName` overlapping it\n */\nexport function stepsInWindow(\n fragment: WalkFragment,\n nodes: Map<number, WalkNode>,\n refName: string,\n window: { start: number; end: number },\n) {\n return Array.from(fragment.ids).some(id => {\n const node = nodes.get(id)\n return (\n node?.rank === 0 &&\n node.refName === refName &&\n node.start < window.end &&\n node.end > window.start\n )\n })\n}\n\n/** Whether the reference between a departure's ends covers the whole window */\nexport function departureSpans(\n { leavePos, rejoinPos }: WalkDeparture,\n window: { start: number; end: number },\n) {\n return (\n Math.min(leavePos, rejoinPos) <= window.start &&\n Math.max(leavePos, rejoinPos) >= window.end\n )\n}\n\n/**\n * A haplotype whose departure from the reference spans the whole window, as\n * the record a multi-way display lifts out as a deletion: `spansWindow`, the\n * reference between the departure's ends whole so its length heads the lane,\n * and the haplotype's own sequence between them as its mate, a point where\n * it has none. The record runs the way the walk rejoins the reference, and\n * carries no CIGAR and no identity, so no ramp or identity filter reads it\n * as an alignment.\n */\nexport function departureFeature({\n departure,\n refName,\n assemblyName,\n mateAssemblyName,\n}: {\n departure: WalkDeparture\n refName: string\n assemblyName: string\n mateAssemblyName: string\n}) {\n const { name, hapStart, ownBp, leavePos, rejoinPos, rejoinReversed } =\n departure\n const id = `${name}:${hapStart}:${leavePos}:departure`\n return new SyntenyFeature({\n uniqueId: id,\n assemblyName,\n refName,\n start: Math.min(leavePos, rejoinPos),\n end: Math.max(leavePos, rejoinPos),\n type: 'departure',\n strand: rejoinReversed ? -1 : 1,\n syntenyId: id,\n spansWindow: true,\n mate: {\n refName: panSNContig(name),\n start: hapStart,\n end: hapStart + ownBp,\n assemblyName: mateAssemblyName,\n },\n })\n}\n", "import {\n assemblyByPanSNPrefix,\n panSNContig,\n panSNHaplotype,\n panSNMatchesPrefix,\n panSNSample,\n resolvePanSNPrefix,\n} from '@jbrowse/bandage-core/pansn'\nimport { updateStatus } from '@jbrowse/core/util'\nimport { ObservableCreate } from '@jbrowse/core/util/rxjs'\nimport { walksKept } from '@jbrowse/graph-walks'\n\nimport {\n anchorAligner,\n chainFeature,\n departureFeature,\n departureSpans,\n lanePairAligner,\n stepsInWindow,\n} from './walkLanes.ts'\nimport { WalkIndex } from '../RgfaTabixAdapter/walkReader.ts'\nimport { PanSNRefNames, openWalkReader } from '../panSNTabix.ts'\nimport { ComparativeAdapterBase } from '../synteny/ComparativeAdapterBase.ts'\nimport {\n laneAssemblyName,\n lanePairsStatus,\n requestedPairs,\n} from '../synteny/lanePairs.ts'\nimport { laneZoomNotice } from '../synteny/laneZoomNotice.ts'\n\nimport type { WalkTabixSyntenyAdapterConfig } from './configSchema.ts'\nimport type { SubgraphAdapterOptions } from '../GetSubgraph.ts'\nimport type { LaneFeatureOptions, LanePair } from '../synteny/lanePairs.ts'\nimport type { BaseOptions } from '@jbrowse/core/data_adapters/BaseAdapter'\nimport type { Feature } from '@jbrowse/core/util'\nimport type { Region } from '@jbrowse/core/util/types'\n\nconst haplotypeOf = ({ name }: { name: string }) => panSNHaplotype(name) ?? name\n\nexport default class WalkTabixSyntenyAdapter extends ComparativeAdapterBase<WalkTabixSyntenyAdapterConfig> {\n private readonly walks: WalkIndex = new WalkIndex(openWalkReader(this), this)\n private readonly refNames: PanSNRefNames = new PanSNRefNames(\n this.walks.source,\n this,\n )\n\n private get anchor() {\n const anchor = this.getConf('assemblyNames')[0]\n if (anchor === undefined) {\n throw new Error(\n 'WalkTabixSyntenyAdapter needs assemblyNames: its first entry is the assembly the reference sample is loaded as',\n )\n }\n return anchor\n }\n\n /**\n * The haplotypes the walk file's header names, `sample#haplotype` in byte\n * order, or undefined when it names none\n */\n async getHaplotypeNames(opts: BaseOptions = {}) {\n return this.walks.haplotypeNames(opts)\n }\n\n /**\n * `lanes` is every haplotype the header names but the anchor's own,\n * declared up front so the display can offer the whole graph's haplotypes\n * before a fetch has placed any of them\n */\n async getHeader(opts: BaseOptions = {}) {\n const { haplotypes } = await this.walks.reader.header(opts)\n const { anchor } = this\n const anchorPrefix = resolvePanSNPrefix(this, anchor)\n const asmByPrefix = assemblyByPanSNPrefix(this)\n return {\n hasCoarseTier: false,\n anchorAssemblyName: anchor,\n lanes: haplotypes\n .filter(\n prefix =>\n prefix !== anchorPrefix && panSNSample(prefix) !== anchorPrefix,\n )\n .map(prefix => ({\n name: laneAssemblyName(asmByPrefix, prefix),\n label: prefix,\n group: panSNSample(prefix),\n })),\n }\n }\n\n // A lane's contigs are named only in its walk rows, so only the anchor's\n // are listed\n async getRefNames(opts: BaseOptions = {}) {\n const { assemblyName } = opts\n return assemblyName === undefined || assemblyName === this.anchor\n ? this.refNames.assemblyRefNames({ ...opts, assemblyName: this.anchor })\n : []\n }\n\n /**\n * The graph display's cut of the window, as RgfaTabixAdapter cuts a\n * walk-indexed graph: the reference walk first, then the walks `haplotypes`\n * asks for, and the nodes and links they visit\n */\n async getSubgraph(region: Region, opts: SubgraphAdapterOptions = {}) {\n const refName = await this.refNames.resolveForCut(region, {\n signal: opts.signal,\n })\n return this.walks.subgraph(refName, region, opts)\n }\n\n // The window's walks for the haplotypes named and the reference, with\n // every departure from the reference over it and no link read; a window\n // past a budget fails as a zoom-in notice for lanes. Named lanes come back\n // in full where the walk file abridged them: an abridged walk is two\n // reference steps, which drew 15 of the HPRC MHC launch's 32 lanes empty.\n private async laneWalks(\n refName: string,\n region: Region,\n prefixes: string[] | undefined,\n opts: LaneFeatureOptions,\n status: string,\n ) {\n const keep = walksKept(prefixes, refName)\n return updateStatus(status, opts.statusCallback, () =>\n this.walks.reader\n .cut(refName, region, {\n ...this.walks.budgets(),\n signal: opts.signal,\n keep,\n expand: keep,\n links: false,\n })\n .catch((error: unknown) => {\n throw laneZoomNotice(error, region.end - region.start)\n }),\n )\n }\n\n /**\n * One record per stretch a haplotype's walk shares with the reference's,\n * on the reference with the haplotype as its mate. A haplotype with no step\n * on the reference inside the window whose departure spans it is one\n * `spansWindow` record of the departure's stretch, its mate the haplotype's\n * own sequence between the departure's ends, a point where it has none.\n */\n private async anchorFeatures(\n refName: string,\n region: Region,\n opts: LaneFeatureOptions,\n ) {\n const wanted = opts.haplotypes?.length\n ? opts.haplotypes.map(lane => resolvePanSNPrefix(this, lane))\n : undefined\n const target = resolvePanSNPrefix(this, opts.targetAssemblyName)\n const prefixes =\n target === undefined\n ? wanted\n : wanted === undefined ||\n wanted.some(\n prefix =>\n panSNMatchesPrefix(target, prefix) ||\n panSNMatchesPrefix(prefix, target),\n )\n ? [target]\n : []\n if (prefixes?.length === 0) {\n return []\n }\n const { start, end } = region\n const status = `Reading walks ${region.refName}:${start.toLocaleString()}-${end.toLocaleString()}`\n const { graph, fragments, departures } = await this.laneWalks(\n refName,\n region,\n prefixes,\n opts,\n status,\n )\n // lanes come back in the order the fetch names them, which is the order\n // the display stacks lanes of equal weight in\n const rank = ({ name }: { name: string }) =>\n prefixes === undefined\n ? 0\n : prefixes.findIndex(prefix => panSNMatchesPrefix(name, prefix))\n const align = anchorAligner(graph.nodes)\n const asmByPrefix = assemblyByPanSNPrefix(this)\n const laneOf = (walk: { name: string }) =>\n laneAssemblyName(asmByPrefix, haplotypeOf(walk))\n const references = fragments.filter(f => f.name === refName)\n const walked = fragments\n .filter(fragment => fragment.name !== refName && rank(fragment) >= 0)\n .map(query => ({\n rank: rank(query),\n features: references.flatMap(reference =>\n align(query, reference).map(chain =>\n chainFeature({\n chain,\n target: reference,\n query,\n assemblyName: region.assemblyName,\n refName: region.refName,\n mateAssemblyName: laneOf(query),\n }),\n ),\n ),\n }))\n // NA19036#1 skips the IGL locus on one contig and walks it on another\n const walking = new Set(\n fragments\n .filter(fragment =>\n stepsInWindow(fragment, graph.nodes, refName, region),\n )\n .map(haplotypeOf),\n )\n const spanning = departures\n .filter(\n departure =>\n rank(departure) >= 0 &&\n !walking.has(haplotypeOf(departure)) &&\n departureSpans(departure, region),\n )\n .sort((a, b) => a.name.localeCompare(b.name))\n .map(departure => ({\n rank: rank(departure),\n features: [\n departureFeature({\n departure,\n refName: region.refName,\n assemblyName: region.assemblyName,\n mateAssemblyName: laneOf(departure),\n }),\n ],\n }))\n return [...walked, ...spanning]\n .sort((a, b) => a.rank - b.rank)\n .flatMap(lane => lane.features)\n }\n\n /**\n * Each pair's two lanes read out of the anchor window, all pairs in one\n * read, and each walk of a pair's query lane aligned to each walk of its\n * target lane. A pair's records sit on its query lane's contigs, the lane\n * the display draws on top.\n */\n private async pairFeatures(\n refName: string,\n region: Region,\n pairs: LanePair[],\n opts: LaneFeatureOptions,\n ) {\n const sides = pairs.map(pair => ({\n pair,\n featurePrefix: resolvePanSNPrefix(this, pair.queryAssemblyName),\n matePrefix: resolvePanSNPrefix(this, pair.targetAssemblyName),\n }))\n const { graph, fragments } = await this.laneWalks(\n refName,\n region,\n sides.flatMap(side => [side.featurePrefix, side.matePrefix]),\n opts,\n lanePairsStatus(pairs),\n )\n const align = lanePairAligner(graph.nodes)\n const walksOf = (prefix: string) =>\n fragments.filter(f => panSNMatchesPrefix(f.name, prefix))\n return sides.flatMap(({ pair, featurePrefix, matePrefix }) =>\n walksOf(featurePrefix).flatMap(target =>\n walksOf(matePrefix).flatMap(query =>\n align(query, target).map(chain =>\n chainFeature({\n chain,\n target,\n query,\n assemblyName: pair.queryAssemblyName,\n refName: panSNContig(target.name),\n mateAssemblyName: pair.targetAssemblyName,\n }),\n ),\n ),\n ),\n )\n }\n\n // The files are filed under the reference alone, so a window on a\n // haplotype lane has no answer: a lane pair is read inside the anchor's\n getFeatures(region: Region, opts: LaneFeatureOptions = {}) {\n return ObservableCreate<Feature>(async observer => {\n const refName =\n region.assemblyName === this.anchor\n ? await this.refNames.resolveMapped(region, opts)\n : undefined\n if (refName !== undefined) {\n const pairs = requestedPairs(opts)\n const features =\n pairs.length > 0\n ? await this.pairFeatures(refName, region, pairs, opts)\n : await this.anchorFeatures(refName, region, opts)\n for (const feature of features) {\n observer.next(feature)\n }\n }\n observer.complete()\n }, opts.signal)\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["BALANCED_BUBBLE_MAX_BP", "bubblesAsMismatches", "edits", "out", "i", "op", "len", "nextOp", "nextLen", "handlesOf", "fragment", "id", "nodeLength", "nodes", "node", "walkAligner", "standIn", "sequenceOf", "length", "sequence", "handles", "cachedHandles", "steps", "query", "target", "pairAlignments", "MIN_MATCH_BP", "appendEdit", "last", "referenceAligner", "lengthOf", "handle", "offsets", "ref", "hap", "same", "sameWeight", "weightedLcs", "turned", "turnedWeight", "reverse", "pairs", "sharedBases", "refAt", "hapAt", "stepOf", "k", "r", "lo", "hi", "y", "x", "singleVisits", "rev", "twice", "directionShares", "visits", "visitsOf", "found", "theirs", "opposite", "other", "lanePairAligner", "subsequence", "chained", "shares", "TURNED_MIN_BP", "anchorAligner", "records", "taken", "chain", "chainFeature", "assemblyName", "refName", "mateAssemblyName", "matchFeature", "panSNContig", "pairCigar", "sum", "n", "stepsInWindow", "window", "departureSpans", "leavePos", "rejoinPos", "departureFeature", "departure", "name", "hapStart", "ownBp", "rejoinReversed", "SyntenyFeature", "haplotypeOf", "name", "panSNHaplotype", "WalkTabixSyntenyAdapter", "ComparativeAdapterBase", "WalkIndex", "openWalkReader", "PanSNRefNames", "anchor", "opts", "haplotypes", "anchorPrefix", "resolvePanSNPrefix", "asmByPrefix", "assemblyByPanSNPrefix", "prefix", "panSNSample", "laneAssemblyName", "assemblyName", "region", "refName", "prefixes", "status", "keep", "walksKept", "updateStatus", "error", "laneZoomNotice", "wanted", "lane", "target", "panSNMatchesPrefix", "start", "end", "graph", "fragments", "departures", "rank", "align", "anchorAligner", "laneOf", "walk", "references", "f", "walked", "fragment", "query", "reference", "chain", "chainFeature", "walking", "stepsInWindow", "spanning", "departure", "departureSpans", "a", "b", "departureFeature", "pairs", "sides", "pair", "side", "lanePairsStatus", "lanePairAligner", "walksOf", "featurePrefix", "matePrefix", "panSNContig", "ObservableCreate", "observer", "requestedPairs", "features", "feature"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as O,l as M,o as W,s as F}from"./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import{a as O,l as M,o as W,s as F}from"./chunk-ULWTJWXX.js";import{f as B}from"./chunk-P5SI66S3.js";import{K as f,Q as A,X as _}from"./chunk-I6NW3VGS.js";import{f as R}from"./chunk-J2PN6CG3.js";import{D as x,E,H as S,d as C,o as T,q as I,r as L,s as w,t as N,w as D,y as G,z as P}from"./chunk-WE7DQVXF.js";import{b as t,c as r,d as s}from"./chunk-DUU6T2I5.js";var k=[{value:0,label:"Fastest"},{value:1,label:"Fast"},{value:2,label:"Default"},{value:3,label:"Fine"},{value:4,label:"Best"}];var U=s(function({label:n,value:e,options:o,testId:p,size:h,sx:a,disabled:m,title:u,shown:b,onChange:H}){let y=R();return r(w,{size:h,sx:a,disabled:m,title:u,children:[t(D,{id:y,shrink:!0,children:n}),t(x,{labelId:y,value:e,label:n,notched:!0,displayEmpty:!0,"data-testid":p,renderValue:i=>b??o.find(Y=>Y.value===i)?.label??i,onChange:i=>{H(i.target.value)},children:o.map(i=>t(P,{value:i.value,disabled:i.disabled,title:i.disabled?void 0:i.description,children:t(G,{primary:i.label,secondary:i.disabled?i.description:void 0})},i.value))})]})});var g=F()({section:{marginBottom:24},group:{marginBottom:16},heading:{marginBottom:8}}),l=s(function({warn:n=!1,children:e}){return t(S,{variant:"caption",component:"div",color:n?"warning.main":"text.secondary",children:e})}),v=s(function({title:n,children:e}){let{classes:o}=g();return r("section",{className:o.group,children:[t(S,{variant:"subtitle1",className:o.heading,children:n}),e]})}),Q=s(function({label:n,checked:e,onChange:o,children:p}){let{classes:h}=g();return r("div",{className:h.section,children:[t(N,{control:t(E,{checked:e,onChange:a=>{o(a.target.checked)}}),label:n}),p]})}),d=s(function({children:n,...e}){let{classes:o}=g();return r("div",{className:o.section,children:[t(U,{sx:{minWidth:200},...e}),n]})}),$=[5e3,2e4,5e4,1e5];function q(c){return[...new Set([...$,c])].sort((n,e)=>n-e).map(n=>({value:String(n),label:n.toLocaleString()}))}var z=s(function({label:n,choices:e,stored:o,auto:p,testId:h,onChange:a,children:m}){return e.length>0?t(d,{label:n,value:e.some(u=>u.trackId===o)?o:"",options:[{value:"",label:`Automatic (${p?.name??"none"})`},...e.map(({trackId:u,name:b})=>({value:u,label:b}))],testId:h,onChange:a,children:m}):null}),K=s(function(n){let{model:e,onClose:o,children:p}=n,{classes:h}=g();return r(C,{open:!0,onClose:o,title:"Graph settings",children:[r(L,{children:[r(v,{title:"Subgraph",children:[p,t(d,{label:"Node limit",value:String(e.maxGraphNodes),options:q(e.maxGraphNodes),testId:"graph-node-limit-select",onChange:a=>{e.setMaxGraphNodes(Number(a))},children:t(l,{children:"The most nodes a layout draws; past it the graph is declined. Walk rows take no limit."})})]}),r(v,{title:"Drawing",children:[e.anchorPaths.length>1?t(d,{label:"Reference path",value:e.activeReferencePath??"",options:e.anchorPaths.map(({name:a})=>({value:a,label:a})),testId:"graph-reference-path-select",onChange:a=>{e.setReferencePath(a),e.recomputeLayout()},children:t(l,{children:"The path the anchored layouts place x along"})}):null,t(d,{label:"Node width",value:e.nodeWidth,options:A,testId:"graph-node-width-select",onChange:a=>{e.setNodeWidth(a)},children:t(l,{children:"Depth as width. In a cut with walks, depth is how many haplotypes carry the node."})}),t(d,{label:"Link width",value:e.linkWidth,options:_,testId:"graph-link-width-select",onChange:a=>{e.setLinkWidth(a)},children:t(l,{children:"Walks as width, so a common route reads heavy and a private one thin."})}),r(Q,{label:"Draw paths",checked:e.drawPaths,onChange:a=>{e.setLayer("paths",a)},children:[t(l,{children:"Color each node by the paths through it, one lane per path"}),e.drawPaths&&!e.effectiveDrawPaths?t(l,{warn:!0,children:e.pathCount>f?`Off: ${e.pathCount.toLocaleString()} paths is past the ${f} this can tell apart`:"Off: this graph states no paths"}):null]}),t(z,{label:"Gene track",choices:e.geneTrackChoices,stored:e.geneTrackId,auto:W(e.geneTrackChoices,""),testId:"graph-gene-track-select",onChange:a=>{e.setGeneTrackId(a)},children:t(l,{children:"Where genes on the backbone come from"})}),t(z,{label:"Repeat track",choices:e.repeatTrackChoices,stored:e.repeatTrackId,auto:M(e.repeatTrackChoices,""),testId:"graph-repeat-track-select",onChange:a=>{e.setRepeatTrackId(a)},children:t(l,{children:"The tandem repeat annotation walk rows measure and tile by"})})]}),r(v,{title:"Force-directed layout",children:[e.hasGraph&&!e.usesLayoutEngine?t("div",{className:h.section,children:t(l,{warn:!0,children:"No effect on the current layout until Layout is Force-directed"})}):null,t(d,{label:"Engine",value:e.chosenLayoutEngine,options:O,testId:"graph-layout-engine-select",onChange:a=>{e.setLayoutEngine(a)},children:t(l,{children:"Stress keeps the reference straight, so a zoom keeps the picture; FMMM lets the whole graph settle."})}),t(d,{label:"Layout quality",value:String(e.layoutQuality),options:k.map(a=>({value:String(a.value),label:a.label})),testId:"graph-layout-quality-select",onChange:a=>{e.setLayoutQuality(Number(a))},children:t(l,{children:"The engine's iteration budget; higher is slower"})}),t(d,{label:"Bubble spread",value:e.bubbleSpread,options:B,testId:"graph-bubble-spread-select",onChange:a=>{e.setBubbleSpread(a)},children:t(l,{children:"How far the layout opens a bubble"})}),e.chosenLayoutEngine==="stress"?null:t(Q,{label:"Linear layout",checked:e.linearLayout,onChange:a=>{e.setLinearLayout(a)},children:t(l,{children:"Keeps a chain of nodes on one line where it can"})})]})]}),t(I,{children:t(T,{variant:"contained",color:"primary",onClick:o,children:"Close"})})]})}),be=K;export{U as a,be as b};
|
|
2
|
+
//# sourceMappingURL=chunk-2CSE6SGH.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../node_modules/.pnpm/@jbrowse+bandage-core@13.1
|
|
3
|
+
"sources": ["../../node_modules/.pnpm/@jbrowse+bandage-core@13.3.1/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-K5SIJGAE.js", "../../src/GraphGenomeView/components/LabelledSelect.tsx", "../../src/GraphGenomeView/components/GraphSettingsDialog.tsx"],
|
|
4
4
|
"sourcesContent": ["// src/layoutQualities.ts\nvar LAYOUT_QUALITIES = [\n { value: 0, label: \"Fastest\" },\n { value: 1, label: \"Fast\" },\n { value: 2, label: \"Default\" },\n { value: 3, label: \"Fine\" },\n { value: 4, label: \"Best\" }\n];\n\nexport {\n LAYOUT_QUALITIES\n};\n", "import { useId } from 'react'\n\nimport {\n FormControl,\n InputLabel,\n ListItemText,\n MenuItem,\n Select,\n} from '@mui/material'\nimport { observer } from 'mobx-react'\n\nimport type { SxProps } from '@mui/material'\n\ninterface SelectOption<T extends string> {\n value: T\n label: string\n // an option's tooltip, and the reason under a disabled one, whose tooltip\n // cannot open\n description?: string\n disabled?: boolean\n}\n\n// One dropdown with its label tied to it, so a screen reader names the combobox\nexport default observer(function LabelledSelect<T extends string>({\n label,\n value,\n options,\n testId,\n size,\n sx,\n disabled,\n title,\n shown,\n onChange,\n}: {\n label: string\n value: T\n options: readonly SelectOption<T>[]\n testId?: string\n size?: 'small' | 'medium'\n sx?: SxProps\n disabled?: boolean\n title?: string\n // what the closed select reads, when not the picked option's label\n shown?: string\n onChange: (value: T) => void\n}) {\n const labelId = useId()\n return (\n <FormControl size={size} sx={sx} disabled={disabled} title={title}>\n <InputLabel id={labelId} shrink>\n {label}\n </InputLabel>\n <Select\n labelId={labelId}\n value={value}\n label={label}\n notched\n displayEmpty\n data-testid={testId}\n renderValue={picked =>\n shown ?? options.find(o => o.value === picked)?.label ?? picked\n }\n onChange={e => {\n onChange(e.target.value as T)\n }}\n >\n {options.map(o => (\n <MenuItem\n key={o.value}\n value={o.value}\n disabled={o.disabled}\n title={o.disabled ? undefined : o.description}\n >\n <ListItemText\n primary={o.label}\n secondary={o.disabled ? o.description : undefined}\n />\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n )\n})\n", "import type { ReactNode } from 'react'\n\nimport { BUBBLE_SPREADS } from '@jbrowse/bandage-core/bubbleSpreads'\nimport { EDGE_WIDTHS } from '@jbrowse/bandage-core/edgeWidths'\nimport { LAYOUT_ENGINES } from '@jbrowse/bandage-core/layoutEngines'\nimport { LAYOUT_QUALITIES } from '@jbrowse/bandage-core/layoutQualities'\nimport { NODE_WIDTHS } from '@jbrowse/bandage-core/nodeWidths'\nimport { MAX_PATH_COLORS } from '@jbrowse/bandage-core/pathColors'\nimport { Dialog } from '@jbrowse/core/ui'\nimport {\n Button,\n DialogActions,\n DialogContent,\n FormControlLabel,\n Switch,\n Typography,\n} from '@mui/material'\nimport { observer } from 'mobx-react'\nimport { makeStyles } from 'tss-react/mui'\n\nimport LabelledSelect from './LabelledSelect'\nimport { pickGeneTrack } from '../genes/geneFeatures'\nimport { pickRepeatTrack } from '../repeats/repeatFeatures'\n\nimport type { GraphPaneModel } from '../model'\n\nconst useStyles = makeStyles()({\n section: {\n marginBottom: 24,\n },\n group: {\n marginBottom: 16,\n },\n heading: {\n marginBottom: 8,\n },\n})\n\nconst Caption = observer(function Caption({\n warn = false,\n children,\n}: {\n warn?: boolean\n children: ReactNode\n}) {\n return (\n <Typography\n variant=\"caption\"\n component=\"div\"\n color={warn ? 'warning.main' : 'text.secondary'}\n >\n {children}\n </Typography>\n )\n})\n\nconst Group = observer(function Group({\n title,\n children,\n}: {\n title: string\n children: ReactNode\n}) {\n const { classes } = useStyles()\n return (\n <section className={classes.group}>\n <Typography variant=\"subtitle1\" className={classes.heading}>\n {title}\n </Typography>\n {children}\n </section>\n )\n})\n\nconst SettingSwitch = observer(function SettingSwitch({\n label,\n checked,\n onChange,\n children,\n}: {\n label: string\n checked: boolean\n onChange: (checked: boolean) => void\n children?: ReactNode\n}) {\n const { classes } = useStyles()\n return (\n <div className={classes.section}>\n <FormControlLabel\n control={\n <Switch\n checked={checked}\n onChange={e => {\n onChange(e.target.checked)\n }}\n />\n }\n label={label}\n />\n {children}\n </div>\n )\n})\n\n// one dropdown setting, at the dialog's width, and its caption\nconst SettingSelect = observer(function SettingSelect<T extends string>({\n children,\n ...props\n}: Omit<Parameters<typeof LabelledSelect<T>>[0], 'size' | 'sx'> & {\n children?: ReactNode\n}) {\n const { classes } = useStyles()\n return (\n <div className={classes.section}>\n <LabelledSelect sx={{ minWidth: 200 }} {...props} />\n {children}\n </div>\n )\n})\n\nconst NODE_LIMITS = [5000, 20_000, 50_000, 100_000]\n\n// the presets, with a limit a session states among them\nfunction nodeLimitOptions(current: number) {\n return [...new Set([...NODE_LIMITS, current])]\n .sort((a, b) => a - b)\n .map(limit => ({ value: String(limit), label: limit.toLocaleString() }))\n}\n\ninterface NamedTrack {\n trackId: string\n name: string\n}\n\n// '' leaves the pick to the heuristic, so a session can go back to it\nconst TrackPickSetting = observer(function TrackPickSetting({\n label,\n choices,\n stored,\n auto,\n testId,\n onChange,\n children,\n}: {\n label: string\n choices: NamedTrack[]\n stored: string\n auto: NamedTrack | undefined\n testId: string\n onChange: (trackId: string) => void\n children: ReactNode\n}) {\n return choices.length > 0 ? (\n <SettingSelect\n label={label}\n value={choices.some(t => t.trackId === stored) ? stored : ''}\n options={[\n { value: '', label: `Automatic (${auto?.name ?? 'none'})` },\n ...choices.map(({ trackId, name }) => ({\n value: trackId,\n label: name,\n })),\n ]}\n testId={testId}\n onChange={onChange}\n >\n {children}\n </SettingSelect>\n ) : null\n})\n\n// Toggles the menus already offer (halos, genes, color) stay out of here.\n// `children` is the host's own part of the subgraph group.\nconst GraphSettingsDialog = observer(function GraphSettingsDialog(props: {\n model: GraphPaneModel\n onClose: () => void\n children?: ReactNode\n}) {\n const { model, onClose, children } = props\n const { classes } = useStyles()\n\n return (\n <Dialog open onClose={onClose} title=\"Graph settings\">\n <DialogContent>\n <Group title=\"Subgraph\">\n {children}\n <SettingSelect\n label=\"Node limit\"\n value={String(model.maxGraphNodes)}\n options={nodeLimitOptions(model.maxGraphNodes)}\n testId=\"graph-node-limit-select\"\n onChange={limit => {\n model.setMaxGraphNodes(Number(limit))\n }}\n >\n <Caption>\n The most nodes a layout draws; past it the graph is declined. Walk\n rows take no limit.\n </Caption>\n </SettingSelect>\n </Group>\n\n <Group title=\"Drawing\">\n {model.anchorPaths.length > 1 ? (\n <SettingSelect\n label=\"Reference path\"\n value={model.activeReferencePath ?? ''}\n options={model.anchorPaths.map(({ name }) => ({\n value: name,\n label: name,\n }))}\n testId=\"graph-reference-path-select\"\n onChange={name => {\n model.setReferencePath(name)\n void model.recomputeLayout()\n }}\n >\n <Caption>The path the anchored layouts place x along</Caption>\n </SettingSelect>\n ) : null}\n\n <SettingSelect\n label=\"Node width\"\n value={model.nodeWidth}\n options={NODE_WIDTHS}\n testId=\"graph-node-width-select\"\n onChange={width => {\n model.setNodeWidth(width)\n }}\n >\n <Caption>\n Depth as width. In a cut with walks, depth is how many haplotypes\n carry the node.\n </Caption>\n </SettingSelect>\n\n <SettingSelect\n label=\"Link width\"\n value={model.linkWidth}\n options={EDGE_WIDTHS}\n testId=\"graph-link-width-select\"\n onChange={links => {\n model.setLinkWidth(links)\n }}\n >\n <Caption>\n Walks as width, so a common route reads heavy and a private one\n thin.\n </Caption>\n </SettingSelect>\n\n <SettingSwitch\n label=\"Draw paths\"\n checked={model.drawPaths}\n onChange={draw => {\n model.setLayer('paths', draw)\n }}\n >\n <Caption>\n Color each node by the paths through it, one lane per path\n </Caption>\n {model.drawPaths && !model.effectiveDrawPaths ? (\n <Caption warn>\n {model.pathCount > MAX_PATH_COLORS\n ? `Off: ${model.pathCount.toLocaleString()} paths is past the ${MAX_PATH_COLORS} this can tell apart`\n : 'Off: this graph states no paths'}\n </Caption>\n ) : null}\n </SettingSwitch>\n\n <TrackPickSetting\n label=\"Gene track\"\n choices={model.geneTrackChoices}\n stored={model.geneTrackId}\n auto={pickGeneTrack(model.geneTrackChoices, '')}\n testId=\"graph-gene-track-select\"\n onChange={trackId => {\n model.setGeneTrackId(trackId)\n }}\n >\n <Caption>Where genes on the backbone come from</Caption>\n </TrackPickSetting>\n\n <TrackPickSetting\n label=\"Repeat track\"\n choices={model.repeatTrackChoices}\n stored={model.repeatTrackId}\n auto={pickRepeatTrack(model.repeatTrackChoices, '')}\n testId=\"graph-repeat-track-select\"\n onChange={trackId => {\n model.setRepeatTrackId(trackId)\n }}\n >\n <Caption>\n The tandem repeat annotation walk rows measure and tile by\n </Caption>\n </TrackPickSetting>\n </Group>\n\n <Group title=\"Force-directed layout\">\n {model.hasGraph && !model.usesLayoutEngine ? (\n <div className={classes.section}>\n <Caption warn>\n No effect on the current layout until Layout is Force-directed\n </Caption>\n </div>\n ) : null}\n\n <SettingSelect\n label=\"Engine\"\n value={model.chosenLayoutEngine}\n options={LAYOUT_ENGINES}\n testId=\"graph-layout-engine-select\"\n onChange={engine => {\n model.setLayoutEngine(engine)\n }}\n >\n <Caption>\n Stress keeps the reference straight, so a zoom keeps the picture;\n FMMM lets the whole graph settle.\n </Caption>\n </SettingSelect>\n\n <SettingSelect\n label=\"Layout quality\"\n value={String(model.layoutQuality)}\n options={LAYOUT_QUALITIES.map(q => ({\n value: String(q.value),\n label: q.label,\n }))}\n testId=\"graph-layout-quality-select\"\n onChange={quality => {\n model.setLayoutQuality(Number(quality))\n }}\n >\n <Caption>\n The engine's iteration budget; higher is slower\n </Caption>\n </SettingSelect>\n\n <SettingSelect\n label=\"Bubble spread\"\n value={model.bubbleSpread}\n options={BUBBLE_SPREADS}\n testId=\"graph-bubble-spread-select\"\n onChange={spread => {\n model.setBubbleSpread(spread)\n }}\n >\n <Caption>How far the layout opens a bubble</Caption>\n </SettingSelect>\n\n {model.chosenLayoutEngine === 'stress' ? null : (\n <SettingSwitch\n label=\"Linear layout\"\n checked={model.linearLayout}\n onChange={linear => {\n model.setLinearLayout(linear)\n }}\n >\n <Caption>Keeps a chain of nodes on one line where it can</Caption>\n </SettingSwitch>\n )}\n </Group>\n </DialogContent>\n\n <DialogActions>\n <Button variant=\"contained\" color=\"primary\" onClick={onClose}>\n Close\n </Button>\n </DialogActions>\n </Dialog>\n )\n})\n\nexport default GraphSettingsDialog\n"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": ["LAYOUT_QUALITIES", "LabelledSelect_default", "observer", "label", "value", "options", "testId", "size", "sx", "disabled", "title", "shown", "onChange", "labelId", "useId", "jsxs", "FormControl", "jsx", "InputLabel", "Select", "picked", "o", "e", "MenuItem", "ListItemText", "useStyles", "makeStyles", "Caption", "observer", "warn", "children", "jsx", "Typography", "Group", "title", "classes", "jsxs", "SettingSwitch", "label", "checked", "onChange", "FormControlLabel", "Switch", "e", "SettingSelect", "props", "LabelledSelect_default", "NODE_LIMITS", "nodeLimitOptions", "current", "a", "b", "limit", "TrackPickSetting", "choices", "stored", "auto", "testId", "t", "trackId", "name", "GraphSettingsDialog", "model", "onClose", "Dialog", "DialogContent", "NODE_WIDTHS", "width", "EDGE_WIDTHS", "links", "draw", "MAX_PATH_COLORS", "pickGeneTrack", "pickRepeatTrack", "LAYOUT_ENGINES", "engine", "LAYOUT_QUALITIES", "q", "quality", "BUBBLE_SPREADS", "spread", "linear", "DialogActions", "Button", "GraphSettingsDialog_default"]
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{A as ro,B as so,a as Le,g as te,h as Mt,j as ne,k as vt,l as Zn,m as Jn,n as Qn,o as eo,p as De,r as qe,s as St,u as Et,v as kt,z as Tt}from"./chunk-RYM2UTLL.js";import{a as Gn,c as Ge,d as Rt,e as to,g as no,h as oo}from"./chunk-P5SI66S3.js";import{B as xt,C as yt,D as pe,E as L,F as wt,M as Kn,N as zn,a as Be,c as Wn,f as Yn,g as ee,h as Hn,i as pt,j as Xe,l as ht,m as Fe,n as we,o as mt,q as jn,r as gt,s as Un,t as Vn,z as bt}from"./chunk-I6NW3VGS.js";import{e as io}from"./chunk-MSAVT4CG.js";import{i as qn}from"./chunk-VPKTQAAQ.js";import{a as Nn,c as at,d as ct,e as Pn,f as $n,g as $e,h as q,i as ue,j as In,k as Ln,m as lt,n as Ie,o as Fn,p as Dn}from"./chunk-IAB4ZGCR.js";import{a as fe,c as _n,d as se,e as it,f as On,g as I,q as Cn,r as $,s as dt,v as ft,y as ut}from"./chunk-XZU7RJUH.js";import{e as E}from"./chunk-WKD7ALOU.js";import{a as Bn,b as Xn}from"./chunk-EGZZ3ADM.js";import{d as Pe,e as An,f as ye}from"./chunk-GH6WRWYC.js";import{c as Ce}from"./chunk-J2PN6CG3.js";var We=8,_t=34,Ye=12,Rs=60;function Ts({count:e,bounds:t,pixelRows:n,width:o,room:r,columns:s}){function i(l){let c=Math.ceil(e/l),f=Math.floor((o-(l-1)*We)/l),u=(r-c*_t-(c-1)*We)/c,d=(f-2*Ye)/t.w,p=t.h>0?(u-2*Ye)/t.h:1/0,h=n?d:Math.min(d,p),m=n?t.h:t.h*h,b=Math.floor(Math.max(Rs,Math.min(m+2*Ye,u)));return{columns:l,width:f,height:b,scale:h,total:c*(b+_t)+(c-1)*We}}if(s!==void 0)return i(Math.max(1,Math.min(e,Math.round(s))));let a=i(1);if(n)return a;for(let l=2;l<=e;l++){let c=i(l);c.scale>a.scale&&(a=c)}return a}var _s=[{value:"",label:"None",description:"Every lifted walk in one drawing"},{value:"walk",label:"A panel per walk",description:"One panel per lifted walk, side by side"},{value:"sample",label:"A row per sample",description:"A row per sample, a column per haplotype"}];function Os(e){let t=typeof e=="string"?{field:e}:e??{};return{field:t.field==="walk"||t.field==="sample"?t.field:"",sort:[...t.sort??t.domain??[]],...t.columns===void 0?{}:{columns:t.columns}}}function ao(e,t){let n=new Map(t.map((r,s)=>[r,s])),o=r=>n.get(r)??t.length;return e.map((r,s)=>({name:r,i:s})).sort((r,s)=>o(r.name)-o(s.name)||r.i-s.i).map(({name:r})=>r)}function As(e,t,n=[]){let o=ao(e,n),r={columns:void 0,count:e.length,cells:e.map(c=>o.indexOf(c))};if(t==="walk")return r;let s=e.map(c=>{let f=An(c);return f&&Number.isInteger(f.haplotype)&&f.haplotype>=0?{sample:f.sample,column:Math.max(0,f.haplotype-1)}:void 0}),i=ao([...new Set(s.flatMap(c=>c?[c.sample]:[]))],n),a=Math.max(1,...s.map(c=>c?c.column+1:1)),l=s.map(c=>c?i.indexOf(c.sample)*a+c.column:-1);return l.includes(-1)||new Set(l).size<l.length?r:{columns:a,count:i.length*a,cells:l}}var co=30;function Ns(e,t){let{opts:n}=t,o=new Map(t.nodes.map(d=>[d.id,Ge(n,d.length)])),r=d=>o.get(d)??n.minimumNodeLength,s=e.nodes.filter(I).sort((d,p)=>d.stable.start-p.stable.start),i=new Map,a=0;for(let d of s)i.set(d.id,{x:a,y:0}),a+=r(d.id)+n.edgeLength;let l=Le(e),c=new Map(s.map(d=>[d.id,0])),f=s.map(d=>d.id);for(let d of f){let p=i.get(d),h=c.get(d)+1;for(let m of l.get(d)??[])c.has(m)||(c.set(m,h),i.set(m,{x:p.x+r(d)/2,y:co*h}),f.push(m))}let u=0;for(let d of e.nodes)i.has(d.id)||i.set(d.id,{x:u++*a/e.nodes.length,y:co*3});return i}function lo(e,t){let n=Ns(e,t);return t.nodes.map(o=>({...o,...n.get(o.id)}))}var Ps=Math.PI/24;function fo(e,t){let n=e[t-1],o=e[t],r=e[t+1];if(!n||!r)return 0;let s=Math.abs(Math.atan2(r.y-o.y,r.x-o.x)-Math.atan2(o.y-n.y,o.x-n.x));return s>Math.PI?2*Math.PI-s:s}function $s(e,t,n,o,r){let s=(h,m)=>Math.max(Math.hypot(m.x-h.x,m.y-h.y)**.5,1e-9),i=s(e,t),a=i+s(t,n),l=a+s(n,o),c=i+r*(a-i),f=(h,m,b,g)=>{let w=(c-b)/(g-b);return{x:h.x+(m.x-h.x)*w,y:h.y+(m.y-h.y)*w}},u=f(e,t,0,i),d=f(t,n,i,a),p=f(n,o,a,l);return f(f(u,d,0,a),f(d,p,i,l),i,a)}var uo=(e,t)=>({x:2*t.x-e.x,y:2*t.y-e.y});function po(e){if(e.length<3)return e;let t=[e[0]];for(let n=0;n+1<e.length;n++){let o=e[n],r=e[n+1],s=Math.ceil(Math.max(fo(e,n),fo(e,n+1))/Ps),i=e[n-1]??uo(r,o),a=e[n+2]??uo(o,r);for(let l=1;l<s;l++)t.push($s(i,o,r,a,l/s));t.push(r)}return t}var Is=.5;function ho(e,t,n=new Set){let o=new Map(t.map(s=>[s.edgeIndex,`${Gn}${s.edgeIndex}`])),r=[];return e.edges.forEach((s,i)=>{let a=o.get(i);if(!n.has(i))if(a===void 0)r.push(s);else{let{fromStrand:l,toStrand:c}=s;r.push({from:s.from,to:a,...l?{fromStrand:l}:{}},{from:a,to:s.to,...c?{toStrand:c}:{}})}}),{graph:{...e,nodes:[...e.nodes,...[...o.values()].map(s=>({id:s,name:s,length:0,depth:0}))],edges:r},routes:o,ids:new Set(o.values())}}function mo(e,t,n,o,r,s){let i=new Map(e.nodes.map(f=>[f.id,f.length])),a=t.map(f=>Math.max(r.minimumNodeLength,o(f.bypassed.reduce((u,d)=>u+(i.get(d)??0),0))*Is)),l=a.reduce((f,u)=>f+u,0),c=l>s?s/l:1;return t.map((f,u)=>{let d=Math.max(r.minimumNodeLength,a[u]*c),p=n.get(f.edgeIndex);return{id:p,name:p,length:Math.round(d*1e6/r.nodeLengthPerMegabase),depth:0}})}function go(e,t){let n={...e},o={};for(let[r,s]of t){let i=n[s];delete n[s],i?.length&&(o[r]=i)}return{nodePositions:n,deletionRoutes:o}}function bo(e,t){let o=e.nodes.filter(I).filter(b=>(t[b.id]?.length??0)>0).flatMap(b=>{let g=t[b.id],w=g.length-1,M=ee(b.id)===(b.stable.strand??"+");return g.map((x,y)=>{let v=w===0?.5:y/w;return{x:x.x,y:x.y,r:b.stable.start+b.length*(M?v:1-v),w:b.length/g.length}})}),r=o.reduce((b,g)=>b+g.w,0);if(r===0)return t;let s=o.reduce((b,g)=>b+g.x*g.w,0)/r,i=o.reduce((b,g)=>b+g.y*g.w,0)/r,a=o.reduce((b,g)=>b+g.r*g.w,0)/r,l=0,c=0;for(let b of o)l+=b.w*(b.x-s)*(b.r-a),c+=b.w*(b.y-i)*(b.r-a);if(l===0&&c===0)return t;let f=-Math.atan2(c,l),u=Math.cos(f),d=Math.sin(f),p={};for(let[b,g]of Object.entries(t))p[b]=g.map(w=>{let M=w.x-s,x=w.y-i;return{x:s+u*M-d*x,y:i+d*M+u*x}});let h=0,m=0;for(let b of e.nodes)if(!I(b))for(let g of p[b.id]??[])g.y>i?h++:m++;if(m>h)for(let b of Object.values(p))for(let g of b)g.y=2*i-g.y;return p}function Cs(e,t){let n=e.indexOf(":"),o=e.indexOf(":",n+1);if(n!==-1&&o!==-1){let r=e.slice(0,n),s=e.slice(n+1,o),i=e.slice(o+1);s==="i"||s==="f"?t[r]=+i:s==="Z"&&(t[r]=i)}}function Me(e){let t={};for(let n of e)Cs(n,t);return t}function yo(e){let{SN:t,SO:n,SR:o}=e.tags;return typeof t=="string"&&typeof n=="number"&&typeof o=="number"?{refName:t,start:n,rank:o}:void 0}var xo=62,Ls=60;function Bs(e){let t=[],n="+",o=0;function r(s){s>o&&t.push({id:e.slice(o,s),strand:n})}for(let s=0;s<e.length;s++){let i=e.charCodeAt(s);(i===xo||i===Ls)&&(r(s),n=i===xo?"+":"-",o=s+1)}return r(e.length),t}function wo(e){let t={nodes:[],links:[],paths:[],walks:[],header:[],id:""};for(let n of e.split(`
|
|
2
|
+
`)){let o=n.endsWith("\r")?n.slice(0,-1):n,r=o.indexOf(" "),s=r===-1?o:o.slice(0,r);if(s==="H"){let[,...i]=o.split(" ");t.header.push(Me(i))}else if(s==="S"){let[,i,...a]=o.split(" "),l,c,f,u=!1,d=a[0]??"*";/^\d+$/.test(d)?(l=+d,c=a[1]??"*",f=a.slice(2)):(u=!0,c=d,l=c==="*"?0:c.length,f=a.slice(1));let p=Me(f);u&&"LN"in p&&(l=+p.LN),t.nodes.push({id:i,length:l,sequence:c,tags:p})}else if(s==="E"){let[,,i,a,,,,,l,...c]=o.split(" ");i&&a&&t.links.push({source:i.slice(0,-1),target:a.slice(0,-1),strand1:i.at(-1),strand2:a.at(-1),cigar:l??"*",tags:Me(c)})}else if(s==="L"){let[,i,a,l,c,f,...u]=o.split(" ");i&&l&&c&&t.links.push({source:i,target:l,strand1:a,strand2:c,cigar:f??"*",tags:Me(u)})}else if(s==="W"){let[,i,a,l,c,f,u,...d]=o.split(" ");i&&a&&l&&c&&f&&u&&t.walks.push({sample:i,haplotype:+a,contig:l,start:c==="*"?-1:+c,end:f==="*"?-1:+f,segments:Bs(u),tags:Me(d)})}else if(s==="P"){let[,i,a,...l]=o.split(" ");i&&a&&t.paths.push({name:i,path:a,rest:l})}}return t}function Xs(e,t){let n=new Map,o=new Map;function r(i,a){n.has(i)||n.set(i,a)}function s(i,a){let l=o.get(i);l===void 0&&r(i,a),o.set(i,(l??0)+1)}for(let i of e.links)r(i.source,i.strand1==="-"?"-":"+"),r(i.target,i.strand2==="-"?"-":"+");for(let{steps:i}of t)for(let a of i)s(a.id,a.strand);for(let i of e.walks)for(let a of i.segments)s(a.id,a.strand);return{canonical:n,traversals:o}}var Mo=e=>e.start===-1?0:e.start;function Fs(e){return{...$(e.name),steps:e.path.split(",").map(t=>({id:t.slice(0,-1),strand:t.endsWith("-")?"-":"+"}))}}function Ds(e,t){return[...t,...e.walks.map(n=>({name:`${n.sample}#${n.haplotype}#${n.contig}`,start:Mo(n),steps:n.segments}))]}function qs(e){let t=e.tags.SM;if(typeof t!="string")return;let n=t.split(",").map(o=>o.trim()).filter(Boolean);return n.length>0?n:void 0}var ve=e=>typeof e=="number"&&e>0?e:void 0;function Gs({tags:e,length:t}){let n=ve(e.RC)??ve(e.FC)??ve(e.KC);return ve(e.dp)??ve(e.DP)??(n!==void 0&&t>0?n/t:void 0)}function Ws(e,t,n){let o=e.tags.AF;return{id:`${e.id}${t}`,name:e.id,length:e.length,depth:n,...typeof o=="number"&&o>=0?{frequency:o}:{},stable:yo(e),samples:qs(e),...e.tags.mv===1?{moved:!0}:{}}}function vo(e,t="Imported GFA"){let n=[],o=[],r=e.paths.map(Fs),{canonical:s,traversals:i}=Xs(e,r),a=new Map,l=g=>{let w=a.get(g);return w===void 0&&(w=`${g}${s.get(g)??"+"}`,a.set(g,w)),w},c=new Map;for(let g of e.nodes){if(c.has(g.id))continue;c.set(g.id,g.length);let w=Gs(g)??Math.max(i.get(g.id)??1,1);n.push(Ws(g,s.get(g.id)??"+",w))}for(let g of e.links)o.push({from:l(g.source),to:l(g.target),fromStrand:g.strand1==="-"?"-":"+",toStrand:g.strand2==="-"?"-":"+"});let f=[],u=new Map,d=(g,w)=>u.get(g)?.get(w);function p(g,w,M){let x=u.get(g);x||(x=new Map,u.set(g,x)),x.set(w,M)}let h=o.map(g=>{let w=d(g.from,g.to);return w||(w=new Set,p(g.from,g.to,w),p(g.to,g.from,w)),w});function m(g,w){for(let M=0;M<g.length-1;M++)d(g[M],g[M+1])?.add(w)}e.paths.forEach(({name:g},w)=>{let{start:M,steps:x}=r[w],y=x.map(v=>l(v.id));f.push({name:g,nodeIds:y,start:M}),m(y,g)});for(let g of e.walks){let w=g.segments.map(x=>l(x.id)),M=`${g.sample}#${g.haplotype}#${g.contig}`;f.push({name:M,nodeIds:w,start:Mo(g),sample:g.sample,haplotype:g.haplotype,contig:g.contig}),m(w,M)}o.forEach((g,w)=>{let M=h[w];M.size>0&&(g.pathIds=[...M])});let b=e.paths.length>0||e.walks.length>0?dt(Ds(e,r),g=>c.get(g)??0):void 0;return{name:t,nodes:n,edges:o,paths:f.length>0?f:void 0,anchorPaths:b?.anchorPaths,pathVisits:b?.pathVisits,anchoredBy:n.some(g=>g.stable)?"tags":void 0}}function So(e){let t=e.paths??[],n=new Set,o=new Set;if(t.some(r=>r.abridged)){for(let{from:r,to:s}of e.edges)n.add(r),n.add(s);for(let r of t)if(r.abridged)for(let s of r.nodeIds)n.has(s)||o.add(s)}if(o.size>0){for(let r of t)if(!r.abridged)for(let s of r.nodeIds)o.delete(s)}return o.size===0?e:{...e,nodes:e.nodes.filter(r=>!o.has(r.id))}}function Ys(e,t){if(typeof e!="string")return lt(e,t);let n=Ln(e);return n?lt(n,t):vo(wo(e),t)}function Ld(e,t,n={}){let o=Ys(e,t);if(o.nodes.length===0)throw new Error(`No graph segments in ${t}`);if(n.maxNodes!==void 0&&o.nodes.length>n.maxNodes)throw new Error(`Graph too large to draw: ${o.nodes.length.toLocaleString()} nodes (limit ${n.maxNodes.toLocaleString()}). Zoom in to a smaller region, or raise maxGraphNodes on this view.`);return ft(o,n.referencePath)}var ie={engine:"fmmm",quality:2,linearLayout:!1,bubbleSpread:"auto",spacing:1,componentSeparation:1,showDeletionEdges:!0};function Eo(e={}){return{engine:e.engine??ie.engine,quality:e.quality??ie.quality,linearLayout:e.linearLayout??ie.linearLayout,bubbleSpread:e.bubbleSpread??ie.bubbleSpread,spacing:e.spacing??ie.spacing,componentSeparation:e.componentSeparation??ie.componentSeparation,showDeletionEdges:e.showDeletionEdges??ie.showDeletionEdges}}var Hs=15;function js(e,t,n){let o=e.nodes.some(I),r=Eo(n),s={...t,opts:{...t.opts,edgeLength:t.opts.edgeLength*r.spacing}};return{graph:{nodes:o?lo(e,s):s.nodes,edges:e.edges},options:{quality:r.quality,linearLayout:r.linearLayout,...s.opts,componentSeparation:Hs*r.componentSeparation,...o?{rotateComponents:!1}:{},engine:r.engine}}}function Ot(e,t){let n=e.nodes.some(I);return[...Object.values(Eo(t)),n,e.referencePath??""].join("|")}async function ko(e,t,n){let o=So(e),r=oo(t.bubbleSpread),{shown:s,hidden:i}=xt(o,bt(o),t.showDeletionEdges!==!1),a=ho(o,s,i),l=Un(a.graph,a.ids),c={...l.graph,nodes:l.graph.nodes.filter(x=>!a.ids.has(x.id))},f=Rt(c,r),u=to(c,r),{result:d,duration:p}=await n(js(l.graph,{...f,nodes:[...f.nodes,...mo(o,s,a.routes,u,f.opts,c.nodes.reduce((x,y)=>x+u(y.length),0))]},t)),h=Rt(o,r),m=new Map(h.nodes.map(x=>[x.id,Ge(h.opts,x.length)])),b=Object.fromEntries(Object.entries(d.nodePositions).map(([x,y])=>[x,po(y)])),g=Vn(b,l.runs,x=>m.get(x)??0),{nodePositions:w,deletionRoutes:M}=go(o.nodes.some(I)?bo(o,g):g,a.routes);return{result:{...d,nodePositions:w,stranded:!0,...s.length?{deletionRoutes:M,extent:Ro(M)}:{}},duration:p}}function Ro(e){let t=1/0,n=1/0,o=-1/0,r=-1/0;for(let s of Object.values(e))for(let i of s)t=Math.min(t,i.x),n=Math.min(n,i.y),o=Math.max(o,i.x),r=Math.max(r,i.y);return{minX:t,minY:n,maxX:o,maxY:r}}var Se=40,Us=1e-6,Vs=100;function At(e){return Math.max(Us,Math.min(Vs,e))}function Ks(e,t,n,o=Se){let r=t-e.h*n;return o-e.minY*n+Math.max(0,r)/2}function Bd(e,t,n,o,{minScale:r=0,padLeft:s=Se,padTop:i=Se,padRight:a=Se,padBottom:l=Se}={}){let c=t-s-a,f=n-i-l;if(c<=0||f<=0||!(e.w>0||!o&&e.h>0))return;let u=e.w>0?c/e.w:1/0,d=e.h>0?f/e.h:1/0,p=At(Math.max(r,o?u:Math.min(u,d))),h=c-e.w*p;return{scale:p,translateX:s-e.minX*p+Math.max(0,h)/2,translateY:Ks(e,f,o?1:p,i)}}function Xd(e,t={}){let{minX:n,minY:o,maxX:r,maxY:s}=Ro(e.nodePositions),{region:i}=t;e.referenceAxis&&i&&i.end>i.start&&(n=i.start,r=i.end);let a=t.extent??e.extent;return a&&(n=Math.min(n,a.minX??n),o=Math.min(o,a.minY??o),r=Math.max(r,a.maxX??r),s=Math.max(s,a.maxY??s)),{minX:n,minY:o,w:r-n,h:s-o}}var zs=4;function Nt(e=zs){let t=new WeakMap,n=o=>{let r=t.get(o);return r||(r=new Map,t.set(o,r)),r};return{layout(o,r,s){let i=n(o),a=Ot(o,r),l=i.get(a);if(l)return l.run;i.size>=e&&i.delete(i.keys().next().value);let c=performance.now(),f={run:ko(o,r,s).then(u=>(f.done=u.result,{...u,duration:u.duration||performance.now()-c}))};return f.run.catch(()=>{i.get(a)===f&&i.delete(a)}),i.set(a,f),f.run},ready(o,r){return t.get(o)?.get(Ot(o,r))?.done},inherit(o,r){let s=t.get(o);s&&o!==r&&t.set(r,s)}}}function Zs(e,t){return{scaleX:e,scaleY:t?1:e,pixelRows:t}}function Pt(e,t,n,o){return{minX:-e.translateX/t.scaleX,minY:-e.translateY/t.scaleY,maxX:(n-e.translateX)/t.scaleX,maxY:(o-e.translateY)/t.scaleY}}function Js(e,t){let n=(e.maxX-e.minX)*t,o=(e.maxY-e.minY)*t;return{minX:e.minX-n,minY:e.minY-o,maxX:e.maxX+n,maxY:e.maxY+o}}function Qs(e,t){return t.minX>=e.minX&&t.maxX<=e.maxX&&t.minY>=e.minY&&t.maxY<=e.maxY}function ei(e,t,n,o,r){let s=At(e.scale*t),i=s/e.scale;return{scale:s,translateX:n-(n-e.translateX)*i,translateY:r?e.translateY:o-(o-e.translateY)*i}}function ti(e,t,n,o){return{x:(e-n.translateX)/o.scaleX,y:(t-n.translateY)/o.scaleY}}var ae=JBrowseExports["@jbrowse/render-core/RenderLifecycleMixin"],ni=e=>ae!=null&&e in Object(ae)?ae[e]:Object.assign(function(){throw new Error("This JBrowse does not provide '"+e+"' from '@jbrowse/render-core/RenderLifecycleMixin' to plugins: GraphGenomeView was built for a different JBrowse version, so update the plugin or JBrowse")},{jbrowseHostMissing:e}),To=ni("RenderLifecycleMixin"),Hf=ae&&ae.__esModule?ae.default:ae;function _o(e){return t=>e.includes(t)?t:void 0}function Vf(e){return E.snapshotProcessor(E.maybe(E.enumeration(e)),{preProcessor:_o(e)})}function $t(e,t){return E.snapshotProcessor(E.optional(E.enumeration(e),t),{preProcessor:_o(e)})}var ru=600,su=160,iu=[1,1,1,1],au="rgb(255, 255, 255)",cu=5,lu=new Set(["tubemap","tubemapref"]),du=Ce(()=>import("./ChooseSamplesDialog-7RI573UO.js")),fu=Ce(()=>import("./ChooseWalksDialog-4LDYDQH2.js")),uu=Ce(()=>import("./HighlightColorDialog-6EOFDJDZ.js")),pu=12,hu=[{bp:0,label:"None"},{bp:3,label:"Under 3 bp"},{bp:10,label:"Under 10 bp"},{bp:50,label:"Under 50 bp, leaving structural variants"},{bp:1e3,label:"Under 1 kb"}];function mu(e){if(typeof e.uri=="string")return e.uri;for(let[t,n]of[["segmentsLocation",Bn],["graphLocation",Xn]]){let o=e[t]?.uri;if(typeof o=="string"&&o.endsWith(n))return o.slice(0,-n.length)}}var gu=1.15,bu=1.6,xu=150,yu=1,wu=40,Mu=40,vu=[{value:"each",label:"A tube per haplotype"},{value:"grouped",label:"A tube per haplotype, grouped by route"},{value:"bundled",label:"A tube per route"}],oi={nodeStrokes:[],nodeStrokeRuns:new Map,arrows:[],arrowRuns:new Map,edgeCurves:[],edgeCurveRuns:new Map};function Su(...e){}var ri=5e6;function Eu(e){return e>=1e6?`${+(e/1e6).toFixed(1)} Mb`:`${Math.round(e/1e3)} kb`}var si=2e4;function ku(e){return("uri"in e?e.uri.split(/[?#]/)[0]:"localPath"in e?e.localPath:"name"in e?e.name:"").split(/[\\/]/).at(-1)??""}function Ru(e){return e.builtViewport!==void 0&&e.paintedViewport===e.builtViewport&&e.builtViewport.viewportDirty===e.viewportDirty&&!e.viewportRebuildPending}function Tu(e){let{width:t,height:n}=e.viewBox;return Pt(e,e.axisScale,t,n)}var _u=Nt(),Ou=E.compose("GraphPane",To(),E.model({layoutQuality:E.optional(E.number,2),linearLayout:E.optional(E.boolean,!1),bubbleSpread:$t(no,"auto"),tubeMapFold:E.optional(E.number,0),tubeMapRoutes:$t(["each","grouped","bundled"],"each"),tubeMapColorBy:E.optional(E.string,""),geneTrackId:E.optional(E.string,""),repeatTrackId:E.optional(E.string,""),repeatKey:E.optional(E.string,""),walkLayers:E.optional(E.frozen(),[]),referencePath:E.optional(E.string,""),showPerf:E.optional(E.boolean,!1),connectorThickness:E.optional(E.number,2),scale:E.optional(E.number,1),translateX:E.optional(E.number,0),translateY:E.optional(E.number,0),paneHeight:E.maybe(E.number),maxGraphNodes:E.optional(E.number,si),connectedViewId:E.maybe(E.string),maxRegionBp:E.optional(E.number,ri),subgraphContext:E.optional(E.number,1),subgraphHaplotypes:E.maybe(E.frozen()),expandedWalks:E.optional(E.frozen(),[])})).volatile(()=>({graph:void 0,walkCut:void 0,graphRegion:void 0,loadedReferencePath:void 0,layoutResult:void 0,drawnLayoutMode:void 0,legendSize:{width:0,height:0},indexBubbles:void 0,foldedBelowBp:void 0,geneTrackFeatures:void 0,walkGeneFeatures:void 0,ownGeneFeatures:void 0,walkRowSampleTable:void 0,repeatArrays:void 0,handledLayoutMode:void 0,openBubbles:[],error:void 0,isLoading:!1,loadCanceled:!1,statusMessage:"",hoveredNode:null,hoveredAt:null,hoveredTube:null,hoveredPanel:null,hoveredRowWalks:[],hoveredBubble:null,pointerInPane:!1,stripHover:null,hoveredWalkRow:null,hoveredEdge:null,selectedNode:null,viewportDirty:0,positionsVersion:0,morphEntering:void 0,drawnBatch:oi,builtViewport:void 0,paintedViewport:void 0,draggingNode:null,isPanning:!1,viewportOwner:"fit",viewportDirtyTimer:void 0,positionsDirtyFrame:0,lastFetchMs:void 0,readsShown:void 0,lastLayoutMs:void 0,lastGeometryMs:void 0,lastGeometryStrokeCount:void 0,viewportRebuildPending:!1}));var B=e=>+e.toFixed(1),ii=e=>+e.toFixed(3);function ai(e){let t=/^rgba?\(([^,]+),([^,]+),([^,)]+)(?:,([^)]+))?\)$/.exec(e.replaceAll(" ",""));if(!t)return{color:e,opacity:1};let n=t[4]===void 0?1:Number(t[4]);return{color:`rgb(${t[1]},${t[2]},${t[3]})`,opacity:n}}function It(e,t){let{color:n,opacity:o}=ai(t);return`${e}="${n}"${o<1?` ${e}-opacity="${ii(o)}"`:""}`}var Oo=.5,Ao=.25;function Nu(e,t){let n=[],o=[],r=(c,f)=>{let u={d:`M${B(c)} ${B(f)}`,segments:0,x0:c,x1:c,y0:f,y1:f};return o.push(u),u},s=c=>{let f=o.at(-1)??r(c[0],c[1]);for(let u=0;u<c.length;u+=2)f.x0=Math.min(f.x0,c[u]),f.x1=Math.max(f.x1,c[u]),f.y0=Math.min(f.y0,c[u+1]),f.y1=Math.max(f.y1,c[u+1]);return f.segments++,f},i=c=>{let f=new Set;return o.map(u=>{if(!c||u.x1-u.x0>=Oo||u.y1-u.y0>=Oo)return u.d;let d=(u.x0+u.x1)/2,p=(u.y0+u.y1)/2,h=`${Math.round(d/Ao)} ${Math.round(p/Ao)}`;return u.segments===0||f.has(h)?"":(f.add(h),`M${B(d)} ${B(p)}h0`)}).join("")},a={canvas:void 0,fillStyle:"#000",strokeStyle:"#000",lineWidth:1,lineCap:"butt",lineJoin:"miter",beginPath(){o=[]},moveTo(c,f){r(c,f)},lineTo(c,f){s([c,f]).d+=`L${B(c)} ${B(f)}`},bezierCurveTo(c,f,u,d,p,h){s([c,f,u,d,p,h]).d+=`C${B(c)} ${B(f)} ${B(u)} ${B(d)} ${B(p)} ${B(h)}`},closePath(){let c=o.at(-1);c&&(c.d+="Z")},stroke(){let c=i(a.lineCap!=="butt");c&&n.push(`<path d="${c}" fill="none" ${It("stroke",a.strokeStyle)} stroke-width="${B(a.lineWidth)}" stroke-linecap="${a.lineCap}" stroke-linejoin="${a.lineJoin}"/>`)},fill(){let c=i(!1);c&&n.push(`<path d="${c}" ${It("fill",a.fillStyle)}/>`)},clearRect(){n.length=0},fillRect(c,f,u,d){n.push(`<rect x="${B(c)}" y="${B(f)}" width="${B(u)}" height="${B(d)}" ${It("fill",a.fillStyle)}/>`)}},l={width:e,height:t,style:{},getContext:()=>a};return a.canvas=l,{canvas:l,markup:()=>n.join("")}}var No=2,Po=8192;function he(e=0,t=0){let n=typeof devicePixelRatio>"u"?1:Math.min(devicePixelRatio,No);return Math.min(n,Po/Math.max(e,t,1))}function Ct(e,t,n){let o=he(t,n),r=Math.round(t*o),s=Math.round(n*o);(e.width!==r||e.height!==s)&&(e.width=r,e.height=s);let i=`${t}px`,a=`${n}px`;return e.style.width!==i&&(e.style.width=i),e.style.height!==a&&(e.style.height=a),o}var Lu=class{constructor(e){this.transform=null,this.batch=null,this.nodeHighlights=new Map,this.highlightedEdge=null,this.highlightFactor=1,this.fit=1,this.painted=null;let t=e.getContext("2d");if(!t)throw new Error("Canvas 2D context not available");this.canvas=e,this.ctx=t}setErrorHandler(e){}releaseOffscreenTargets(){}resize(e,t){this.fit=Ct(this.canvas,e,t)/he()}uploadGeometry(e){this.batch=e,this.highlightedEdge=null,this.painted=null}setNodeHighlights(e){this.nodeHighlights=e,this.painted=null}setEdgeHighlight(e,t){this.highlightedEdge=e,this.highlightFactor=t,this.painted=null}updateTransform(e){this.transform=e}fitted(){let e=this.transform,t=this.fit;return!e||t===1?e:{...e,scaleX:e.scaleX*t,scaleY:e.scaleY*t,translateX:e.translateX*t,translateY:e.translateY*t,dpr:e.dpr*t}}render(e){let t=this.fitted();if(!t)return;let n=this.ctx,{width:o,height:r}=n.canvas;e[3]<1&&n.clearRect(0,0,o,r),e[3]>0&&(n.fillStyle=Mt([e[0],e[1],e[2]],e[3]),n.fillRect(0,0,o,r));let s=this.batch;if(!s)return;n.lineCap="round",n.lineJoin="round";let{edges:i,nodes:a,arrows:l}=this.paintedGroups(s);for(let{color:c,items:f}of i)this.strokeCurves(f,c,t);for(let{color:c,items:f}of a)this.strokeNodes(f,c,t);for(let{color:c,items:f}of l)this.fillArrows(f,c,t)}paintedGroups(e){if(this.painted)return this.painted;let t=this.highlightFactor,n=this.edgeRun(e.edgeCurveRuns),o=this.edgeRun(e.arrowRuns),r=this.liftedStrokes(e);return this.painted={edges:me(e.edgeCurves,(s,i)=>({color:He(n,i)?ne(s.color,t):s.color,weight:s.thickness,last:He(n,i)})),nodes:me(e.nodeStrokes,(s,i)=>{let a=r.get(i);return{color:a===void 0?s.color:ne(s.color,a),weight:s.thickness,last:a!==void 0}}),arrows:me(e.arrows,(s,i)=>({color:He(o,i)?ne(s.color,t):s.color,weight:0,last:He(o,i)}))}}renderHighlights(){let e=this.ctx;e.clearRect(0,0,e.canvas.width,e.canvas.height);let t=this.batch,n=this.fitted();if(!n||!t)return;e.lineCap="round",e.lineJoin="round";let o=this.highlightFactor,r=$o(t.edgeCurves,this.edgeRun(t.edgeCurveRuns));for(let{color:a,items:l}of me(r,c=>({color:ne(c.color,o),weight:c.thickness,last:!1})))this.strokeCurves(l,a,n);let s=[...this.liftedStrokes(t)];for(let{color:a,items:l}of me(s,([c,f])=>({color:ne(t.nodeStrokes[c].color,f),weight:t.nodeStrokes[c].thickness,last:!1})))this.strokeNodes(l.map(([c])=>t.nodeStrokes[c]),a,n);let i=$o(t.arrows,this.edgeRun(t.arrowRuns));for(let{color:a,items:l}of me(i,c=>({color:ne(c.color,o),weight:0,last:!1})))this.fillArrows(l,a,n)}edgeRun(e){return this.highlightedEdge===null?void 0:e.get(this.highlightedEdge)}liftedStrokes(e){let t=new Map;for(let[n,o]of this.nodeHighlights){let r=e.nodeStrokeRuns.get(n);if(r)for(let s=r.start;s<r.start+r.count;s++)t.set(s,o)}return t}strokeCurves(e,t,n){let o=this.ctx;o.strokeStyle=te(t),o.lineWidth=e[0].thickness*2*n.dpr,o.beginPath();for(let r of e){let s=r.curves[0];o.moveTo(s.x0*n.scaleX+n.translateX,s.y0*n.scaleY+n.translateY);for(let i of r.curves)o.bezierCurveTo(i.cx0*n.scaleX+n.translateX,i.cy0*n.scaleY+n.translateY,i.cx1*n.scaleX+n.translateX,i.cy1*n.scaleY+n.translateY,i.x1*n.scaleX+n.translateX,i.y1*n.scaleY+n.translateY)}o.stroke()}strokeNodes(e,t,n){let o=this.ctx;o.strokeStyle=te(t),o.lineWidth=e[0].thickness*2*n.dpr,o.beginPath();for(let r of e){let s=r.points[0];o.moveTo(s.x*n.scaleX+n.translateX,s.y*n.scaleY+n.translateY);for(let i=1,a=r.points.length;i<a;i++){let l=r.points[i];o.lineTo(l.x*n.scaleX+n.translateX,l.y*n.scaleY+n.translateY)}}o.stroke()}fillArrows(e,t,n){let o=this.ctx;o.fillStyle=te(t),o.beginPath();for(let r of e){let[s,i,a,l]=li(r,n);o.moveTo(s.x,s.y),o.lineTo(i.x,i.y),o.lineTo(a.x,a.y),o.lineTo(l.x,l.y),o.closePath()}o.fill()}dispose(){this.batch=null,this.nodeHighlights=new Map,this.highlightedEdge=null,this.painted=null}},ci=.25;function li(e,t){let n=Math.cos(e.angle),o=Math.sin(e.angle),r=e.x*t.scaleX+t.translateX,s=e.y*t.scaleY+t.translateY,i=e.length*t.dpr,a=e.halfWidth*t.dpr,l=r-n*i,c=s-o*i,f=i*(1-ci);return[{x:r,y:s},{x:l-o*a,y:c+n*a},{x:r-n*f,y:s-o*f},{x:l+o*a,y:c-n*a}]}function $o(e,t){return t?e.slice(t.start,t.start+t.count):[]}function He(e,t){return e!==void 0&&t>=e.start&&t<e.start+e.count}function me(e,t){let n=new Map,o=new Map;for(let r=0,s=e.length;r<s;r++){let i=e[r],{color:a,weight:l,last:c}=t(i,r),f=c?o:n,u=`${a}:${l}`,d=f.get(u);d?d.items.push(i):f.set(u,{color:a,items:[i]})}return[...n.values(),...o.values()]}var Ee=3.4;var ke=6;function je(e,t){let{width:n,height:o}=t.legendSize;return e==="top-right"?{x0:t.paneWidth-ke-n,x1:t.paneWidth,y0:0,y1:(t.referenceStripZonePx??0)+ke+o}:{x0:0,x1:ke+n,y0:t.canvasHeight-ke-o,y1:t.canvasHeight}}function di(e,t,n){let o=t.x-e.x,r=t.y-e.y,s=0,i=1;for(let[a,l]of[[-o,e.x-n.x0],[o,n.x1-e.x],[-r,e.y-n.y0],[r,n.y1-e.y]])a===0?l<0&&(i=0):a<0?s=Math.max(s,l/a):i=Math.min(i,l/a);return Math.max(0,i-s)}function Io(e,t){let{scaleX:n,scaleY:o}=t.axisScale,r=t.contigThickness*Ee/2,s={x0:(e.x0-r-t.translateX)/n,x1:(e.x1+r-t.translateX)/n,y0:(e.y0-r-t.translateY)/o,y1:(e.y1+r-t.translateY)/o},i=0;for(let a of Object.values(t.nodePositions??{}))for(let l=1;l<a.length;l++){let c=a[l-1],f=a[l];c.x<s.x0&&f.x<s.x0||c.x>s.x1&&f.x>s.x1||c.y<s.y0&&f.y<s.y0||c.y>s.y1&&f.y>s.y1||(i+=di(c,f,s)*Math.hypot((f.x-c.x)*n,(f.y-c.y)*o))}return i}function qu(e){return e.legendSize.width>0&&e.drawnRowLabels.length===0&&e.labelsNodeSizes&&Io(je("top-right",e),e)>0&&Io(je("bottom-left",e),e)===0?"bottom-left":"top-right"}var fi=50;function Co(e,t){return t>0?Math.max(1,e/t):fi}function ui(e){let t=new Set,n=1/0,o=-1/0;for(let r of e)t.add(r.minY),n=Math.min(n,r.minY),o=Math.max(o,r.minY);return t.size>1?(o-n)/(t.size-1):void 0}function Lo(e,t,n){let o=Co(t,e.length);return{x:o,y:n>0?Co(n,e.length):ui(e)??o}}function pi(e,t,n,o){return e===void 0?Lo(t,n,o):typeof e=="number"?{x:e,y:e}:e}function hi(e,t,n){let o=e.get(t);o||(o=new Map,e.set(t,o));let r=o.get(n);return r||(r=[],o.set(n,r)),r}function Bo(e,t,n,o,r,s,i){let a=Math.floor(n/t.x),l=Math.floor(r/t.x),c=Math.floor(o/t.y),f=Math.floor(s/t.y);for(let u=a;u<=l;u++)for(let d=c;d<=f;d++)hi(e,u,d).push(i)}function Xo(e,t,n,o,r,s){let i=Math.floor((n-r)/t.x),a=Math.floor((n+r)/t.x),l=Math.floor((o-s)/t.y),c=Math.floor((o+s)/t.y),f=[],u=new Set;for(let d=i;d<=a;d++){let p=e.get(d);if(p)for(let h=l;h<=c;h++){let m=p.get(h);if(m)for(let b of m)u.has(b)||(u.add(b),f.push(b))}}return f}var Fo=class{constructor(e,t){this.cells=new Map;let n=[],o=0,r=0;for(let[s,i]of Object.entries(e))for(let a=0;a<i.length-1;a++){let l=i[a],c=i[a+1],f=Math.min(l.x,c.x),u=Math.min(l.y,c.y),d=Math.max(l.x,c.x),p=Math.max(l.y,c.y);o+=d-f,r+=p-u,n.push({entry:{nodeId:s,segmentIdx:a},minX:f,minY:u,maxX:d,maxY:p})}this.cellSize=pi(t,n,o,r);for(let s of n)Bo(this.cells,this.cellSize,s.minX,s.minY,s.maxX,s.maxY,s.entry)}query(e,t,n,o=n){return Xo(this.cells,this.cellSize,e,t,n,o)}},Do=class{constructor(e,t,n,o,r,s=0,i,a=!1){this.cells=new Map,this.edgeCurves=eo(e,t,o,r,s,i,a);let l=[],c=0,f=0;for(let u=0;u<t.edges.length;u++){let d=t.edges[u],p=e[d.from],h=e[d.to],m=this.edgeCurves.get(u);if(p?.length&&h?.length&&m){let{minX:b,minY:g,maxX:w,maxY:M}=Wn(m),x=d.pathIds?.length??0;if(n&&x>0){let y=0,v=0;for(let k of Xe(p,h,x,o))y=Math.max(y,Math.abs(k.x)),v=Math.max(v,Math.abs(k.y));b-=y,g-=v,w+=y,M+=v}c+=w-b,f+=M-g,l.push({ei:u,minX:b,minY:g,maxX:w,maxY:M})}}this.cellSize=Lo(l,c,f);for(let u of l)Bo(this.cells,this.cellSize,u.minX,u.minY,u.maxX,u.maxY,u.ei)}getCurves(e){return this.edgeCurves.get(e)}query(e,t,n,o=n){return Xo(this.cells,this.cellSize,e,t,n,o)}};function Go(e,t,n,o,r,s){let i=r-n,a=s-o,l=i*i+a*a;if(l===0)return Math.hypot(e-n,t-o);let c=Math.max(0,Math.min(1,((e-n)*i+(t-o)*a)/l));return Math.hypot(e-(n+c*i),t-(o+c*a))}function mi(e,t,n){let o=1/0,r=20,s=n.x0,i=n.y0;for(let a=1;a<=r;a++){let l=a/r,c=1-l,f=c*c*c*n.x0+3*c*c*l*n.cx0+3*c*l*l*n.cx1+l*l*l*n.x1,u=c*c*c*n.y0+3*c*c*l*n.cy0+3*c*l*l*n.cy1+l*l*l*n.y1;o=Math.min(o,Go(e,t,s,i,f,u)),s=f,i=u}return o}function qo(e,t,n,o=1){let r=1/0;for(let s of n){let i=mi(e,t,o===1?s:{x0:s.x0,y0:s.y0*o,cx0:s.cx0,cy0:s.cy0*o,cx1:s.cx1,cy1:s.cy1*o,x1:s.x1,y1:s.y1*o});i<r&&(r=i)}return r}var gi=ht();function Wo(e,t){return gi(e,[t],()=>new Fo(e))}var bi=ht();function xi(e,t,n,o,r,s,i,a=!1){return bi(e,[t,n,o.scaleX,o.scaleY,r,s,i,a],()=>new Do(e,t,n,o,s,r,i,a))}var yi=5;function Zu(e,t,n,o,r=0,s){let i=pt(o),a=Wo(e,r),l=p=>Math.max(yi,p)/o.scaleX,c=l(s?.maxHalfWidthPx??0),f=a.query(t,n,c,c/i),u=null,d=1/0;for(let{nodeId:p,segmentIdx:h}of f){let m=e[p],b=Go(t,n*i,m[h].x,m[h].y*i,m[h+1].x,m[h+1].y*i);b<d&&b<l(s?.halfWidthPx(p)??0)&&(d=b,u=p)}return u}function wi(e,t,n){let o=t.x-e.x,r=t.y-e.y,s=0,i=1;for(let[a,l]of[[-o,e.x-n.x0],[o,n.x1-e.x],[-r,e.y-n.y0],[r,n.y1-e.y]])if(a===0){if(l<0)return!1}else a<0?s=Math.max(s,l/a):i=Math.min(i,l/a);return s<=i}function Yo(e,t,n=0){let o=Wo(e,n),r=s=>({x:s.x*t.scaleX+t.translateX,y:s.y*t.scaleY+t.translateY});return s=>{let i=new Set,a=o.query(((s.x0+s.x1)/2-t.translateX)/t.scaleX,((s.y0+s.y1)/2-t.translateY)/t.scaleY,Math.abs((s.x1-s.x0)/2/t.scaleX),Math.abs((s.y1-s.y0)/2/t.scaleY));for(let{nodeId:l,segmentIdx:c}of a){let f=e[l];!i.has(l)&&wi(r(f[c]),r(f[c+1]),s)&&i.add(l)}return i}}function Ju(e,t,n,o,r,s,i=0,a,l,c,f=!1){let u=pt(r),d=10/r.scaleX,p=xi(e,t,s,r,i,a,c,f),h=p.query(n,o,d,d/u),m=null,b=d;for(let g of h){let w=t.edges[g],M=e[w.from],x=e[w.to];if(!M?.length||!x?.length||l?.has(g))continue;let y=w.pathIds?.length??0,v=p.getCurves(g);if(!v)continue;let k;if(!s||y===0)k=qo(n,o*u,v,u);else{let R=1/0;for(let A of Xe(M,x,y,r)){let G=A.x===0&&A.y===0?v:Yn(v,A.x,A.y),W=qo(n,o*u,G,u);W<R&&(R=W)}k=R}k<b&&(b=k,m=g)}return m}var Ho=18,Mi=2,vi=3,Si=Fe+mt;function jo(e){let t=e.gene.end-e.gene.start;if(e.covered>=.98)return;let[n,o]=t>=999500?[1e6,"Mb"]:t>=1e3?[1e3,"kb"]:[1,"bp"],r=s=>+(s/n).toFixed(n===1?0:1);return`${r(e.covered*t)} of ${r(t)} ${o}`}function Uo(e,t,n,o){let r=n/2;return Vo(e,s=>s.gene.end-s.gene.start).map(s=>{let{x:i,y:a}=t(s.at),l=jo(s);return{item:s,x:i,y:a+n+Ho,flipY:a-n-Ho+Fe,text:l?`${s.gene.name} \xB7 ${l}`:s.gene.name,fallback:l?`${s.gene.name} \u2026`:void 0,stack:Mi,fits:c=>[...o({x0:c.x0-r,x1:c.x1+r,y0:c.y0-r,y1:c.y1+r})].every(f=>s.nodeIds.has(f))}})}function Ei(e,t,n){return e.y>t?{y1:e.y-Fe-2,y2:t+n/2}:{y1:e.y+mt,y2:t-n/2}}function Vo(e,t){return[...e].sort((n,o)=>t(o)-t(n))}function ki(e){let{paneWidth:t,canvasHeight:n,translateX:o,translateY:r}=e,{scaleX:s,scaleY:i}=e.axisScale,a={width:t,height:n},l=y=>({x:y.x*s+o,y:y.y*i+r}),c=e.drawnRowLabels.map(({label:y,y:v})=>yt(y,v*i+r)),f=e.referenceStripZonePx??0;f>0&&c.push({x0:0,x1:t,y0:0,y1:f}),e.legendSize.width>0&&c.push(je(e.legendCorner??"top-right",e)),e.poppedFrom&&c.push({x0:0,x1:60+e.poppedFrom.label.length*we*1.2,y0:0,y1:44});let u=jn(a,c),d=e.drawnRowLabels.length>0,p=d?Math.min(...e.drawnRowLabels.map(y=>y.y)):1/0,h=e.contigThickness*Ee,m=(y,v)=>{let{x:k,y:R}=l({x:y.labelAt.x,y:Math.min(y.labelAt.y,p)}),A=R-h/2-v;return{x:k,y:d?Math.max(A,Si):A}},b=Vo(e.bubbleHalos.filter(y=>!y.tick),y=>y.whole?-1:y.members),g=gt(b.map(y=>({item:y,...m(y,6),text:y.label,fallback:y.label.includes(",")?y.label.split(",")[0]:void 0,stack:vi})),a,u),w=e.bubbleHalos.filter(y=>y.tick).map(y=>({item:y,...m(y,2)})).filter(y=>y.x>=0&&y.x<=t&&y.y>=0&&y.y<=n),M=gt(Uo(e.genePins,l,e.contigThickness,Yo(e.nodePositions??{},{scaleX:s,scaleY:i,translateX:o,translateY:r},e.positionsVersion)),a,u),x=e.nodePositions&&e.labelsNodeSizes?wt({nodePositions:e.nodePositions,nodeLengths:e.nodeLengths,deletions:e.deletions,deletionRoutes:e.deletionRoutes,stranded:e.stranded,alleleDeletions:e.alleleDeletions,axis:e.axisScale,translateX:o,translateY:r,width:t,height:n,version:e.positionsVersion,take:u}):[];return{bubbles:g,ticks:w,genes:M,sizes:x}}var ce=JBrowseExports.mobx,ge=e=>ce!=null&&e in Object(ce)?ce[e]:Object.assign(function(){throw new Error("This JBrowse does not provide '"+e+"' from 'mobx' to plugins: GraphGenomeView was built for a different JBrowse version, so update the plugin or JBrowse")},{jbrowseHostMissing:e});var Tp=ge("autorun");var _p=ge("computed");var Ko=ge("observable");var Op=ge("reaction");var zo=ge("runInAction");var Ap=ge("untracked");var Np=ce&&ce.__esModule?ce.default:ce;function Lt(e,t){return t===ee(e.id)?e.id:`-${e.id}`}function Ri(e,t){let n=e.map(()=>{}),o=0,r=0;for(;r<e.length&&e[r]!==void 0;r++)n[r]=o,o+=e[r];let s=t;for(let i=e.length-1;i>r&&e[i]!==void 0;i--)s-=e[i],n[i]=s;return n}function Ti(e,t){let n=e.path.map(()=>[]);if(e.cs===void 0)return n;let o=Ri(t,e.pathLength),r=o.flatMap((d,p)=>d===void 0?[]:[p]),s=d=>o[r[d]],i=d=>s(d)+t[r[d]],a=0,l=d=>{for(;a<r.length&&i(a)<d;)a++;for(let p=a;p<r.length&&s(p)<=d;p++){let h=i(p);if(d<h)return{s:r[p],local:d-s(p),room:h-d}}},c=d=>{for(let p=a;p<r.length;p++)if(s(p)>d)return s(p)-d;return 1/0},f=(d,p)=>{let h=n[d],m=h.at(-1);p.type==="substitution"&&m?.type==="substitution"&&m.pos+m.seq.length===p.pos?m.seq+=p.seq:h.push(p)},u=e.pathStart;for(let d of qn(e.cs))if(d.op==="match")u+=d.length;else if(d.op==="substitution"){let p=l(u);p&&f(p.s,{type:"substitution",pos:p.local,seq:d.seq}),u+=1}else if(d.op==="insertion"){let p=u>e.pathStart&&u<e.pathEnd?l(u):void 0;p&&f(p.s,{type:"insertion",pos:p.local,seq:d.seq})}else{let p=d.length;for(;p>0;){let h=l(u),m=Math.min(p,h?h.room:c(u));h&&f(h.s,{type:"deletion",pos:h.local,length:m}),u+=m,p-=m}}return n}function Zo(e,t,n){let o=new Map(e.nodes.map(s=>[s.name,s])),r=[];for(let s of t){let i=s.path.map(f=>o.get(f.name)),a=i.flatMap((f,u)=>f?[u]:[]),l=a[0],c=a.at(-1);if(l!==void 0&&c!==void 0){let f=Ti(s,i.map(p=>p?.length)),u=a.map(p=>Lt(i[p],s.path[p].strand)),d=i[c].length;r.push({id:n+r.length,name:s.name,type:"read",sourceTrackID:1,sequence:u,sequenceNew:a.map((p,h)=>({nodeName:u[h],mismatches:f[p]})),firstNodeOffset:l===0?s.pathStart:0,finalNodeCoverLength:c===s.path.length-1?d-(s.pathLength-s.pathEnd):d,mapping_quality:s.mappingQuality===255?void 0:s.mappingQuality,is_secondary:s.secondary,is_reverse:s.strand==="-"})}}return r}var _i=["#6baed6","#4292c6","#2171b5","#08519c"],Oi=["#fb6a4a","#ef3b2c","#cb181d","#a50f15"];function Jo(e){let t=e.is_reverse?Oi:_i;return t[e.id%t.length]}function P(e,t={},...n){return{tag:e,attrs:t,children:n.filter(o=>!!o||o==="")}}function Qo(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">")}function Ai(e){return Qo(e).replaceAll('"',""")}function Ni(e){if(typeof e=="string")return Qo(e);let t=Object.entries(e.attrs).filter(([,n])=>n!==void 0).map(([n,o])=>` ${n}="${Ai(String(o))}"`).join("");return`<${e.tag}${t}>${e.children.map(Ni).join("")}</${e.tag}>`}var Yt="#2f8fd6",Ht="#8e3fbf",Ft="#bdbdbd",Dt="#8a8a8a",qt="#e2e2e2",er="#d9a441",Te="#1c1c22",jt=12,Ue=4,Re=1,Gt=12,Pi=6,$i=3;function V(e){return`${(e/1e3).toFixed(e<1e4?1:0)} kb`}function Ii(e){let t=Math.abs(e);return`${e>0?"+":"\u2212"}${t<1e3?`${t} bp`:V(t)}`}function Bt(e,t){return t?` \u2248 ${Math.round(e/t)} units`:""}var tr=(e,t)=>`${e===void 0?"":`${Pe(e)}:`}${t<1e6?`${Math.round(t/1e3)} kb`:`${(t/1e6).toFixed(1)} Mb`}`;function Ci(e){return e<1e3?`${e}`:`${Math.round(e/1e3)} k`}function Li(e,t,n,o){if(e<=0)return"";let r=(t??[]).filter(u=>u.gap);if(!r.some(u=>u.cause))return` \xB7 ${V(e)} ${ue}`;let s=u=>r.filter(d=>d.cause===u).reduce((d,p)=>d+p.bp,0),i=r.filter(u=>u.cause==="mixed").reduce((u,d)=>u+(d.missingBp??0),0),a=u=>{let d=[...new Set(r.flatMap(p=>p.cause===u&&p.near!==void 0?[tr(o,p.near)]:[]))];return d.length===0?"":`${d[0]}${d.length>1?` and ${d.length-1} more place${d.length>2?"s":""}`:""}`},l=a("unread"),c=[[s("missing")+i,q.missing],[s("elsewhere"),`on nodes filed near ${a("elsewhere")}`],[s("own")+s("mixed")-i,q.own],[s("unread"),`${q.unread}${l?`, last seen near ${l}`:""}`],[s(void 0),ue]],f=s("abridged");return(f>0?` \xB7 ${Ci(n)} steps, ${V(f)} not loaded`:"")+c.filter(([u])=>u>0).map(([u,d])=>` \xB7 ${V(u)} ${d}`).join("")}function Bi(e,t){let n=[...e].sort((r,s)=>{let i=ct(r),a=ct(s);return a.end-a.start-(i.end-i.start)})[0],o=e.length-1;return n?[$n(n,t),...o>0?[`${o} more departure${o>1?"s":""}`]:[],...!at(n)&&e.some(at)?[$e]:[]].join(" \xB7 "):""}function Ve(e,t,n,o){let{bp:r,gapBp:s,complete:i,stop:a}=e;if(!t)return`${V(r)}${Bt(r,n)}`;let l=e.outsideRow?` \xB7 ${e.outsideRow.count} departure${e.outsideRow.count>1?"s":""} outside the row${e.outsideRow.stepsBp>0?`, ${V(e.outsideRow.stepsBp)} of its own in the graph`:""}`:"";if(e.stepless)return`${Bi(e.departures??[],t.sample)}${l}`;let c=`${Li(s,e.runs,e.abridgedSteps??0,t.name)}${e.placementChoice?` \xB7 ${$e}`:""}${l}`,f=o?` \xB7 called ${V(o.bp)}${o.spanningReads===0?" \xB7 no spanning read":""}`:"";if(i){let h=r-t.bp,m=h===0?"":` (${Ii(h)})`;return`${e.estimated?"\u2248 ":""}${V(r)}${Bt(r,n)}${m}${c}${f}`}let u=n?"repeat":"window";if(a?.contigEnds&&r===0)return`contig ends ${a.shortBp>0?`${V(a.shortBp)} before`:"at"} the ${u}${f}`;let d=a?a.contigEnds?`contig ends inside the ${u}`:a.goesOn?`goes on near ${tr(t.name,a.goesOn.near)}${a.goesOn.drawn?"":` \xB7 ${Pn(a.goesOn.departure.ownBp)} of its own`}`:"does not rejoin the reference within the extracted subgraph":"partial walk";return`${r===0?"":`\u2265 ${V(r)}${Bt(r,n)} \xB7 `}${d}${c}${f}`}function Ke(e,t,n){let o=t+6;return o+e.length*we<n?{x:o,anchor:"start",halo:!1}:{x:t-6,anchor:"end",halo:!0}}function ze(e){return e.runs.reduce((t,n)=>Math.max(t,n.start+n.bp),e.bp)}function nr(e,t,n){if(t*n<$i)return[];let o=[];for(let r=t;r<e;r+=t)o.push(r);return o}function _e(e){return e==="missing"?{fill:Dt,px:Re,label:q.missing}:e==="departure"?{fill:Dt,px:Re,label:q.departure}:e==="own"?{fill:qt,px:Ue,label:q.own}:e==="mixed"?{fill:qt,px:Re,label:q.mixed}:e==="unread"?{fill:Ft,px:Re,label:q.unread}:e==="abridged"?{fill:er,px:Ue,label:q.abridged}:{fill:Ft,px:Ue,label:ue}}function or(e,t){if(e.gap)return{fill:_e(e.cause).fill};if(!t)return{fill:e.onReference?Yt:Ht};if(e.referenceStart===void 0)return{fill:qe};let n=Zn({...e,start:e.referenceStart},t);return n.length===1?{fill:vt(n[0])}:{stops:n.map(vt)}}function Wt(e,t,n){return e.reversed?{start:e.start-n,end:e.start-t}:{start:t-e.start,end:n-e.start}}function Xi(e,t){return e.reversed?{start:e.start-t,end:e.start}:{start:e.start,end:e.start+t}}function Fi(e,t){let n=new Map;for(let o of e){let r=t.get(o.name);if(!o.axis||!r)continue;let s=o.axis,i=({start:a,end:l})=>({start:Math.max(0,a),end:Math.min(o.bp,l)});n.set(o.name,r.map(a=>({name:a.name,...i(Wt(s,a.start,a.end)),exons:a.exons.map(l=>i(Wt(s,l.start,l.end))).filter(l=>l.end>l.start)})).filter(a=>a.end>a.start).sort((a,l)=>a.start-l.start))}return n}var Di=9,qi=5.2,Gi=8,rr=(e,t)=>Math.min(2,(e-t)/2-1);function sr(e,t){return rr(e,t)>=1}function ir(e,t,n,{rowPx:o=Be,barPx:r=jt}={}){if(!sr(o,r))return[];let s=rr(o,r),i=e.map(c=>{let f=t(c.start);return{g:c,x:f,w:Math.max(2,t(c.end)-f)}}),a=[],l=new Set((r>=Gi?[...i]:[]).sort((c,f)=>c.w-f.w).filter(({g:c,x:f,w:u})=>{let d=c.name.length*qi/2,p=[f+u/2-d,f+u/2+d];return 2*d>u+6||a.some(([h,m])=>p[0]<m+2&&p[1]>h-2)?!1:(a.push(p),!0)}));return i.map(c=>({name:c.g.name,x:c.x,y:n-r/2-s,w:c.w,h:r+2*s,exons:c.g.exons.map(f=>({x:t(f.start),w:Math.max(1,t(f.end)-t(f.start))})),label:l.has(c)?{x:c.x+c.w/2,y:n+3,size:Di}:void 0}))}var Xt=e=>`${e} row${e===1?"":"s"}`;function Wi(e,t={}){let n=t.annotation??"gene",o=[{swatch:t.ramp?{kind:"bar",fill:t.rampCss??Qn,ramp:!0}:{kind:"bar",fill:Yt},label:`on ${e.reference.label}'s path`},{swatch:{kind:"bar",fill:t.ramp?qe:Ht},label:`off ${e.reference.label}'s path`}],r=[e.reference,...e.rows].flatMap(a=>a.runs.filter(l=>l.gap)),s=new Set(r.map(a=>_e(a.cause).label)),i=e.rows.some(a=>a.estimated);for(let a of[void 0,"missing","departure","own","mixed","unread","abridged"]){let{fill:l,px:c,label:f}=_e(a);s.has(f)&&o.push({swatch:{kind:"gap",fill:l,px:c},label:a==="abridged"&&i?`${f}; \u2248 length takes the reference's bp past the window`:f})}return[e.reference,...e.rows].some(a=>a.placementChoice)&&o.push({swatch:{kind:"gene"},label:`${$e}: the writer chose which pass of a node the reference passes more than once a step takes`,note:!0}),t.genes?.crowded?o.push({swatch:{kind:"gene"},label:`${n}s left out: too many rows to box them in`,note:!0}):t.genes&&(o.push({swatch:{kind:"gene"},label:n}),t.genes.untracked&&o.push({swatch:{kind:"gene"},label:`no ${n} track for ${Xt(t.genes.untracked)}`,note:!0}),t.genes.unplaced&&o.push({swatch:{kind:"gene"},label:`no contig coordinates for ${Xt(t.genes.unplaced)}`,note:!0}),t.genes.unread&&o.push({swatch:{kind:"gene"},label:`${n}s not read for the last ${Xt(t.genes.unread)}`,note:!0})),o}var ar="#111",cr="#9e9e9e",Ut="#c62828";function lr(e){return e.agrees===!1?Ut:e.spanningReads===0?cr:ar}function Yi(e,t,n,o="walk-key"){let r=0,s=e.flatMap((i,a)=>{let l=`${o}-ramp-${a}`,c=!i.note&&i.swatch.kind==="bar"&&i.swatch.ramp?P("linearGradient",{id:l},...Jn.map(d=>P("stop",{offset:d.offset,"stop-color":d.color}))):void 0,f=i.note?void 0:i.swatch.kind==="gene"?P("rect",{x:r,y:5,width:18,height:8,fill:"none",stroke:Te,"stroke-width":1.5}):P("rect",{x:r,y:i.swatch.kind==="gap"?9-i.swatch.px/2:5,width:18,height:i.swatch.kind==="gap"?i.swatch.px:8,rx:2,fill:c?`url(#${l})`:i.swatch.fill}),u=P("text",{x:i.note?r:r+23,y:13,"font-style":i.note?"italic":void 0,fill:i.note?"#666":void 0},i.label);return r+=(i.note?0:23)+i.label.length*we+16,[c,f,u].filter(d=>d!==void 0)});return{width:r,tree:P("g",{transform:`translate(${t} ${n})`,"font-family":"Helvetica, Arial, sans-serif","font-size":11},...s)}}function Hi(e,t,n=0){let o=t/Math.max(1,e),r=Math.max(n,Math.min(Be,o>=1?Math.floor(o):o));return{rowPx:r,barPx:r<=3?r:Math.max(3,Math.round(r*.6)),labelled:r>=Gt,readouts:r>=Gt}}function dr(e,t){let n=1/t,o=[],r=[],s=()=>{if(r.length!==0){if(r.length===1)o.push(r[0]);else{let a=0,l=0;for(let u of r)u.onReference?a+=u.bp:l+=u.bp;let c=a>=l,f=r.find(u=>u.onReference===c);o.push({start:r[0].start,bp:a+l,onReference:c,referenceStart:c?f.referenceStart:void 0,...f.reversed?{reversed:!0}:{}})}r=[]}},i=0;for(let a of e){if(a.gap||a.bp>=n){s(),i=0,o.push(a);continue}r.push(a),i+=a.bp,i>=n&&(s(),i=0)}return s(),o}function ji(e,t,n){return P("g",{class:"row-gene","data-testid":"graph-walk-gene"},P("title",{},e.name),...e.exons.map(o=>P("rect",{x:o.x,y:t-n/2,width:o.w,height:n,fill:Te,opacity:.35})),P("rect",{x:e.x,y:e.y,width:e.w,height:e.h,fill:"none",stroke:Te,"stroke-width":1.5}),e.label&&P("text",{x:e.label.x,y:e.label.y,"font-family":"sans-serif","font-size":e.label.size,"font-weight":600,"text-anchor":"middle",fill:Te,stroke:"white","stroke-width":2.5,"paint-order":"stroke"},e.name))}function Oe(e,t,n={}){let o=m=>m*t.scaleX+t.translateX,r=t.rowPx??Be,s=t.barPx??jt,i=Math.min(3,Math.max(0,(r-s)/2)),a=m=>m*r*t.scaleY+t.translateY,{origin:l,unit:c,reference:f,rows:u}=e,d=m=>o(l+m),p=n.idPrefix??"walkrow",h=(m,b)=>{let g=a(b);if(g<-s||g>t.height+s)return;let w=t.bars===!1?[]:m.runs,M=dr(w,t.scaleX).flatMap(R=>{let A=or(R,n.ramp),G=R.gap?Math.min(_e(R.cause).px,s):s,W=`${p}-${b}-${R.start}`,z=P("rect",{x:d(R.start),y:g-G/2,width:Math.max(1,R.bp*t.scaleX),height:G,fill:"stops"in A?`url(#${W})`:A.fill});return"stops"in A?[P("linearGradient",{id:W},...A.stops.map((oe,U)=>P("stop",{offset:U/(A.stops.length-1),"stop-color":oe}))),z]:[z]}),x=c&&s>=Pi?nr(m.bp,c,t.scaleX).map(R=>P("line",{x1:d(R),x2:d(R),y1:g-s/2,y2:g+s/2,stroke:"white","stroke-width":1})):[],{call:y}=m,v=t.readouts??!0?{text:Ve(m,b===0?void 0:f,c,y)}:void 0,k=v&&Ke(v.text,d(ze(m)),t.width);return P("g",{"data-testid":b===0?"graph-walk-reference":"graph-walk-row"},...M,...x,...ir(n.rowGenes?.get(m.name)??[],d,g,{rowPx:r,barPx:s}).map(R=>ji(R,g,s)),y&&P("rect",{"data-testid":"graph-walk-call",x:d(y.bp)-1,y:g-s/2-i,width:2,height:s+2*i,fill:lr(y)}),v&&k&&P("text",{x:k.x,y:g+4,"font-family":"sans-serif","font-size":11,fill:y?.agrees===!1?Ut:"#333",stroke:k.halo?"white":void 0,"stroke-width":k.halo?3:void 0,"paint-order":"stroke","text-anchor":k.anchor},v.text))};return P("g",{},...[f,...u].map(h))}var Ui=10;function Vi(e,t){let n=e.end-e.start,o=e.longestAlleleLength-e.shortestAlleleLength;return t.find(r=>o<=Ui*(r.end-r.start)&&(n===0?r.start<=e.start&&e.start<=r.end:Math.min(e.end,r.end)-Math.max(e.start,r.start)>=n/2))}var Ki=40;function zi(e,t){let n=L(e),o=L(t),r=o.slice(o.indexOf(" "));return n.endsWith(r)?`${n.slice(0,-r.length)}\u2013${o}`:`${n}\u2013${o}`}function Vt(e){return e>=io?"\u22652.1B routes":e>=1e5?`${(e/1e3).toFixed(0)}k routes`:`${e} routes`}function Zi(e,t=[]){let n=Ji(e,t);return e.partial?{...n,label:`${n.label}, partial`}:n}function Ji(e,t){let n=e.end-e.start,{shortestAlleleLength:o,longestAlleleLength:r,pathCount:s,segmentCount:i,inversion:a}=e,l=zi(o,r);if(i>=Ki)return{kind:"superbubble",label:`${l} superbubble, ${i} segments, ${Vt(s)}${a?", inv":""}`};if(a)return{kind:"inversion",label:`${L(r)} inv`};if(e.offReference)return o===r?fr(o):{kind:"complex",label:`${l}, ${Vt(s)}`};let c=r!==o?Vi(e,t):void 0;if(c){let u=c.name?` (${c.name})`:"";return{kind:"repeat",label:`${l} repeat array${u}, ${Vt(s)}`}}let f=s>2?`, ${s} alleles`:"";return o===r&&o===n?fr(n):n===0||o===n?{kind:"insertion",label:`\u2264${L(r-n)} ins${f}`}:r===n?{kind:"deletion",label:`${L(n-o)} del${f}`}:{kind:"complex",label:`${L(n)} ref \u2192 ${l}, ${s} alleles`}}function fr(e){return e<=1?{kind:"snp",label:"SNP"}:{kind:"substitution",label:`${L(e)} sub`}}var Qi={snp:"#5b6b7a",substitution:"#5b6b7a",insertion:"#2f8fd6",deletion:"#c94040",inversion:"#e07b00",repeat:"#8e3fbf",superbubble:"#8e3fbf",complex:"#8e3fbf"},ea={snp:"SNP",substitution:"substitution",insertion:"insertion",deletion:"deletion",inversion:"inversion",repeat:"repeat array",superbubble:"superbubble",complex:"site"};function ta(e){return e.segments.split(",").filter(Boolean)}function Kt({graph:e,layout:t}){let n=new Map(e.nodes.map(r=>[r.id,r])),o=new Map;t.nodes.forEach((r,s)=>{let i=n.get(r.name);if(r.order>=0&&i&&I(i)){let{refName:a,start:l}=i.stable;fe(o,a,{name:r.name,index:s,bp0:l,bp1:l+i.length,x0:r.x,x1:r.x+r.pixelWidth})}});for(let r of o.values())r.sort((s,i)=>s.bp0-i.bp0);return o}function Ze(e,t,n=!1){let o=se(e.length-1,r=>n?e[r].bp1<t:e[r].bp1<=t);return Ae(e[o],t)}function Ae(e,t){let n=e.bp1-e.bp0;return t<=e.bp0||n<=0?e.x0:e.x0+(Math.min(t,e.bp1)-e.bp0)/n*(e.x1-e.x0)}function Je(e,t,n){let o=Ze(e,t),r=Ze(e,n,!0);return{x0:Math.min(o,r),x1:Math.max(o,r)}}function na(e){let t;for(let n of e.values())(!t||n.length>t.length)&&(t=n);return t}var ur=5,oa=10,ra=110,sa=3;function pr(e){return e?"#b0b0b8":"#55555c"}function ia(e){let t=10**Math.floor(Math.log10(e)),n=e/t;return(n<=1?1:n<=2?2:n<=5?5:10)*t}function hr(e){let t=[];for(let n of e)t.every(o=>Math.abs(n.at-o.at)>=(n.width+o.width)/2+oa)&&t.push(n);return t.map(({text:n,at:o})=>({text:n,at:o}))}function aa(e,t,n,o){let r=e[0],s=e.at(-1);if(!r||!s)return;let i=t(r.x0),a=t(s.x1),l=s.bp1-r.bp0;if(a<=i||l<=0)return;let c=ia(l/(a-i)*ra),f=[],u=[];for(let d=Math.ceil(r.bp0/c)*c;d<=s.bp1;d+=c){let p=Math.round(t(Ze(e,d)))+.5;if(p>=0&&p<=n){f.push(p);let h=d.toLocaleString("en-US");u.push({text:h,at:p,width:o(h)})}}return{spans:[{x0:i,x1:a}],ticks:f,labels:hr(u)}}function ca(e,t,n,o){let r=e.map(h=>({box:h,s0:t(h.x0),s1:t(h.x1)})).filter(({s0:h,s1:m})=>m>=0&&h<=n),s=r[0],i=r.at(-1);if(!s||!i)return;let a=(h,m)=>({text:h,at:m,width:o(h)}),l=(h,m)=>a(h.toLocaleString("en-US"),m),c=[],f=[],u=[],d=[];for(let{box:h,s0:m,s1:b}of r){c.push({x0:m,x1:b}),f.push(Math.round(m)+.5),b-m>=sa&&f.push(Math.round(b)+.5);let g=a(L(h.bp1-h.bp0),(m+b)/2);g.width<=b-m&&u.push(g),h!==s.box&&d.push(l(h.bp0,m))}let p=[l(s.box.bp0,s.s0),l(i.box.bp1,i.s1)];return{spans:c,ticks:f,labels:hr([...p,...u,...d])}}function mr(e,t,n,o,r=!1){return(r?aa:ca)(e,t,n,o)}function la(e,t,n,o,r=!1){let{x:s,width:i,darkMode:a}=n;e.font="10px sans-serif";let l=mr(t,s,i,u=>e.measureText(u).width,r);if(!l)return;let c=pr(a),f=o+.5;e.strokeStyle=c,e.fillStyle=c,e.lineWidth=1,e.textAlign="center",e.textBaseline="top",e.beginPath();for(let{x0:u,x1:d}of l.spans)e.moveTo(Math.max(0,u),f),e.lineTo(Math.min(i,d),f);for(let u of l.ticks)e.moveTo(u,o),e.lineTo(u,o+ur);e.stroke();for(let{text:u,at:d}of l.labels)e.fillText(u,d,o+ur+2)}function da(e,t,n,o){let r=[];for(let s of e){let i=n(s.x0),a=n(s.x1);a>=0&&i<=o&&r.push({node:s.name,top0:t(s.bp0),top1:t(s.bp1),bottom0:i,bottom1:a})}return r}var fa=3;function ua(e,t,n,o){if(t<=0||o<0||o>t)return;let r=o/t,s,i=fa;for(let a of e){let l=a.top0+(a.bottom0-a.top0)*r,c=a.top1+(a.bottom1-a.top1)*r,f=Math.max(0,Math.min(l,c)-n,n-Math.max(l,c));f<i&&(i=f,s=a.node)}return s}function gr(e,t,n){e.moveTo(t.top0,0),e.lineTo(t.top1,0),e.lineTo(t.bottom1,n),e.lineTo(t.bottom0,n),e.closePath()}function br(e,t,n){e.moveTo(t.top0,0),e.lineTo(t.bottom0,n),e.moveTo(t.top1,0),e.lineTo(t.bottom1,n)}function pa(e,t,n,{highlightNode:o,darkMode:r}){if(n<=0||t.length===0)return;let s=r?"255,255,255":"0,0,0";e.beginPath();for(let i of t)gr(e,i,n);e.fillStyle=`rgba(${s},0.07)`,e.fill(),e.beginPath();for(let i of t)br(e,i,n);e.strokeStyle=`rgba(${s},0.35)`,e.lineWidth=.5,e.stroke(),xr(e,t,n,o)}function xr(e,t,n,o){let r=n>0&&o?t.find(s=>s.node===o):void 0;r&&(e.beginPath(),gr(e,r,n),e.fillStyle="rgba(255,192,203,0.5)",e.fill(),e.beginPath(),br(e,r,n),e.strokeStyle="#ff0000",e.lineWidth=1,e.stroke())}function yr(e,t){let n=new Map;for(let o of e){let r=t(o),s=n.get(r);s===void 0?n.set(r,[o]):s.push(o)}return n}var ha=new Set(["_gbwt_ref","unknown"]);function wr(e){let[t,n,o]=e?.split("#")??[];if(!(t===void 0||t===""||ha.has(t)||n===void 0||!/^\d+$/.test(n)||o===void 0||o===""))return{sample:t,haplotype:Number(n),contig:o}}var ma=["read_group","sample_name"],bm=[...ma,"haplotype_sample"],Qe=8.401;function ga({layers:e,coarsenedReadView:t=!1,showReads:n=!0},o){if(e!==void 0)return e;let r=t&&n,s=i=>i?{stat:"coarsen"}:{};return[{data:"haplotypes",...s(r&&!o)},{data:"reads",...s(r&&o)}]}function Mr(e,t){return e.find(n=>n.data===t)?.stat}function ba(e,t){return{mergeNodes:e.mergeNodes??!0,showReads:e.showReads??!0,coarsenedReadView:e.coarsenedReadView??!1,layers:ga(e,t),ignoreStrand:e.ignoreStrand??!1,nodeWidthOption:e.nodeWidthOption??"normal",charWidth:e.charWidth??Qe,trackWidth:e.trackWidth??15,freqWidth:e.freqWidth??"log"}}function xa(){return{rectangles:[],curves:[],corners:[],verticalRectangles:[]}}function Ir(e){return{config:e,nodes:[],tracks:[],reads:[],nodeMap:new Map,nodesPerOrder:[],nodeOrders:[],assignments:[],extraLeft:[],extraRight:[],maxOrder:-1,shapes:xa(),trackForRuler:void 0,coarsenedEdgeMeta:new Map}}function Cr(e,t,n=[],o={}){let r=ya(e,t,n,o);return r&&wa(r,o)}var Lr=new WeakMap;function ya(e,t,n=[],o={}){let r=va(e,t,n,o);if(r===void 0)return;let s=Br(r,r.tracks,r.reads,"measure");return s.nodes.forEach((i,a)=>{i.order>=0&&(r.nodes[a].x=i.x)}),Lr.set(r,s),r}function wa(e,t={}){return Ma(e,Ra(e,t.facet),Sa(e,t))}function Ma(e,t,n,o){let r=Lr.get(e);return r!==void 0&&t.length===e.tracks.length&&n.length===e.reads.length?r:Br(e,t,n,"topology",o)}function va(e,t,n,o){let r=Ir(ba(o,n.length>0));if(!(e.length===0||t.length===0)){structuredClone(e).forEach((s,i)=>{s.seq??="",s.sequenceLength??=s.seq.length,r.nodes[i+1]=s}),r.tracks=structuredClone(t),r.reads=r.config.showReads?structuredClone(n.filter(s=>s.is_secondary!==!0)):[];for(let s=r.tracks.length-1;s>=0;s-=1){let i=r.tracks[s];if(i.type??="haplotype",i.hidden===!0){r.tracks.splice(s,1);continue}i.indexOfFirstBase!==void 0&&(r.trackForRuler=i.name)}if(r.tracks.length!==0)return _a(r,0),r.nodeMap=kr(r),be(r,r.tracks),be(r,r.reads),Pr(r),r.config.mergeNodes&&(Rr(r),Zt(r),Qt(r),bc(r),r.nodeMap=kr(r),Pr(r),be(r,r.tracks),be(r,r.reads)),Rr(r),Ka(r),Zt(r),za(r),Zt(r),Qt(r),be(r,r.reads),{options:r.config,nodes:r.nodes,tracks:r.tracks,reads:r.reads,nodeMap:r.nodeMap,maxOrder:Ua(r),trackForRuler:r.trackForRuler}}}function Sa(e,{mappingQualityCutoff:t=0,focusReadNames:n=null,facet:o}){let r=n?new Set(n):null;return e.reads.filter(s=>(s.mapping_quality??0)>=t&&(r===null||s.name!==void 0&&r.has(s.name))&&(o===void 0||Ea(o,s)))}function Ea(e,t){return e.by==="haplotype_sample"?"reads"in e:(t[e.by]??null)===e.key}function ka(e){return new Set(e.tracks.filter((t,n)=>n===0||t.name===e.trackForRuler))}function Ra(e,t){if(t?.by!=="haplotype_sample")return e.tracks;let n=ka(e);return e.tracks.filter(o=>n.has(o)||!("reads"in t)&&Ta(o)===t.key)}function Ta(e){return wr(e.name)?.sample??null}function Br(e,t,n,o,r={}){let s=Ir(e.options);e.nodes.forEach((d,p)=>{s.nodes[p]={...d}}),s.tracks=t.map(d=>({...d})),s.reads=n.map(d=>({...d})),s.nodeMap=e.nodeMap,s.maxOrder=e.maxOrder,s.trackForRuler=e.trackForRuler;let{layers:i,ignoreStrand:a}=s.config,l=r.haplotypes??dc,c=Mr(i,"haplotypes")==="coarsen"?fc(s,l):void 0;c!==void 0&&(s.tracks=[c.ref]),cc(s),tc(s),Oa(s);let f=Mr(i,"reads")==="coarsen"&&s.reads.length>0?Gr(s,s.reads,"read",r.reads??l+(c?.bands.length??0)):void 0;f!==void 0&&(s.reads=f.bands);let u={};for(let[d,p,h]of[["haplotypes","haplotype",c],["reads","read",f]])h!==void 0&&(Qt(s,h.bands),be(s,h.bands),u[d]={unit:p,total:h.total,reverse:!a&&h.bands.some(m=>m.is_reverse)});return c!==void 0&&(s.reads=c.bands.concat(s.reads)),Na(s),s.tracks=s.tracks.concat(s.reads),o==="measure"&&Ja(s),lc(s),{nodes:s.nodes,tracks:s.tracks,reads:s.reads,nodeMap:s.nodeMap,shapes:s.shapes,bounds:qa(s),maxOrder:s.maxOrder,trackForRuler:s.trackForRuler,coarsenedEdgeMeta:s.coarsenedEdgeMeta,coarsened:u}}function X(e){return e.startsWith("-")}function F(e){return X(e)?e.substring(1):e}function Xr(e){return X(e)?e:`-${e}`}function en(e){return X(e)?F(e):Xr(e)}function vr(e){return e>0}function _a(e,t){let n=new Set,o=new Set;for(let r of e.tracks[t].sequence)X(r)?o.has(F(r))||n.add(F(r)):o.add(r);if(n.size!==0){for(let{sequence:r}of[...e.tracks,...e.reads])for(let s=0;s<r.length;s+=1)n.has(F(r[s]))&&(r[s]=en(r[s]));e.nodes.forEach(r=>{n.has(r.name)&&(r.seq=on(r.seq))})}}function Oa(e){e.nodesPerOrder=Array.from({length:e.maxOrder+1},()=>[]);let t=new Map;e.nodes.forEach(n=>{n.y!==void 0&&Sr(t,n.order,n.y+n.contentHeight)}),e.tracks.forEach(n=>{n.type==="haplotype"&&n.path.forEach(o=>{Sr(t,o.order,(o.y??0)+n.width)})}),e.nodes.forEach((n,o)=>{n.order>=0&&n.y===void 0&&(n.y=(t.get(n.order)??0)+25,n.contentHeight=0,e.nodesPerOrder[n.order].push(o))})}function Sr(e,t,n){let o=e.get(t);o===void 0?e.set(t,n):e.set(t,Math.max(o,n))}var tn=7;function Aa(e){e.nodes.forEach(t=>{t.incomingReads=[],t.outgoingReads=[],t.internalReads=[]}),e.reads.forEach((t,n)=>{(t.width===void 0||t.width===0)&&(t.width=tn),t.path.forEach((o,r)=>{if(o.node===null)return;let s=e.nodes[o.node];t.path.length===1?s.internalReads.push(n):r===0?s.outgoingReads.push([n,r]):s.incomingReads.push([n,r])})})}function Na(e){e.reads.forEach(a=>{a.path=Fr(e,a)}),Aa(e);let t=e.nodes.filter(a=>a.order>=0);t.sort(sn);let n=new Map;for(let a=0;a<e.reads.length;a++){let l=e.reads[a],c=l.haplotypeShare===void 0?1:0,f=l.sourceTrackID,u=`${c}:${f}`,d=n.get(u);d===void 0?n.set(u,{layer:c,source:f,reads:new Set([a])}):d.reads.add(a)}let o=[...n.values()].sort((a,l)=>a.layer-l.layer||a.source-l.source),r=o.length>1?tn:0;t.forEach(a=>{for(let{reads:l}of o)Pa(e,l,a,r)});let s=Xa(e),i=[];e.reads.forEach((a,l)=>{let c=[],f=[],u;a.path.forEach((d,p)=>{c[p]=u,d.node!==null&&(u=d)}),u=void 0;for(let d=a.path.length-1;d>=0;d-=1)f[d]=u,a.path[d].node!==null&&(u=a.path[d]);a.path.forEach((d,p)=>{if(d.y===void 0){let h=c[p],m=f[p],b=!!(m&&h&&(h.order>m.order||m.order===h.order&&m.isForward===h.isForward));d.betweenCycleReverseTraversal=b,i.push({readIndex:l,pathIndex:p,previousY:h?.y,previousNode:h?.node})}})}),i.sort((a,l)=>Ia(e,a,l)),i.forEach(a=>{let l=e.reads[a.readIndex],c=l.path[a.pathIndex];c.y=s[c.order],s[c.order]+=l.width})}function Pa(e,t,n,o){let r=n.incomingReads.filter(([h])=>t.has(h)),s=n.outgoingReads.filter(([h])=>t.has(h)),i=n.internalReads.filter(h=>t.has(h));r.length===0&&s.length===0&&i.length===0&&(o=0);let a=n.y+n.contentHeight+o*2,l=r.map(h=>{let[m,b]=h,g=e.reads[m].path,w=b+1,M;for(let x=1;x<=b;x++){let y=g[b-x]?.y;if(y!==void 0){w=x,M=y;break}}return{entry:h,decisionStep:w,y:M}});l.sort($a),r=l.map(h=>h.entry);let c=a,f=new Map;r.forEach(h=>{let m=e.reads[h[0]];m.path[h[1]].y=c,Er(f,m,h[1],c,n),c+=m.width});let u=c;s.sort((h,m)=>Ca(e,h,m));let d=new Map;c=a,s.forEach(h=>{let m=e.reads[h[0]],b=m.firstNodeOffset??0;m.path[h[1]].y=c,d.set(c,b);let g=f.get(c);g===void 0||g+1<=b?(c+=m.width,u=Math.max(u,c)):(f.set(c,0),r.forEach(w=>{let M=e.reads[w[0]],x=M.path[w[1]];x.y!==void 0&&x.y>=c&&(x.y+=m.width,Er(f,M,w[1],x.y,n))}),c+=m.width,u+=m.width)}),i.sort((h,m)=>Ba(e,h,m)),i.forEach(h=>{let m=e.reads[h],b=m.firstNodeOffset??0,g=m.finalNodeCoverLength??0;for(c=a;b<(f.get(c)??-1/0)+2||g>(d.get(c)??1/0)-3;)c+=m.width;m.path[0].y=c,f.set(c,g),u=Math.max(u,c)});let p=u-n.y-n.contentHeight;n.contentHeight+=p,ic(e,n,p)}function $a(e,t){return e.decisionStep!==t.decisionStep?e.decisionStep-t.decisionStep:e.y===void 0||t.y===void 0?(e.y===void 0?0:1)-(t.y===void 0?0:1):e.y-t.y}function Er(e,t,n,o,r){e.set(o,n===t.path.length-1?t.finalNodeCoverLength??0:r.sequenceLength)}function Ia(e,t,n){let o=e.reads[t.readIndex],r=e.reads[n.readIndex],s=o.path[t.pathIndex],i=r.path[n.pathIndex];if(s.order!==i.order)return s.order-i.order;if(o.sourceTrackID!==r.sourceTrackID)return o.sourceTrackID-r.sourceTrackID;if(t.previousNode&&n.previousNode){let u=e.nodes[t.previousNode],d=e.nodes[n.previousNode];if(u&&d&&u.order!==d.order)return u.order-d.order}let a=t.previousY??0,l=n.previousY??0,c=s.betweenCycleReverseTraversal===!0,f=i.betweenCycleReverseTraversal===!0;return c!==f?c?1:-1:c?l-a:a-l}function Ca(e,[t,n],[o,r]){let s=e.reads[t],i=e.reads[o],a=s.path.findLast(p=>p.y!==void 0)?.y,l=i.path.findLast(p=>p.y!==void 0)?.y;if(a!==void 0&&l!==void 0)return a-l;let c=(p,h)=>{let m=p.path[h]?.node;return m==null?null:e.nodes[m]??null},f=(p,h)=>{let m=h+1;for(;p.path[m]?.node===null;)m+=1;return m},u=c(s,n),d=c(i,r);for(;u!==null&&u===d;)n=f(s,n),r=f(i,r),u=c(s,n),d=c(i,r);return u!==null&&d!==null?sn(u,d):u!==null||d!==null?u===null?-1:1:(s.firstNodeOffset??0)-(i.firstNodeOffset??0)||(s.finalNodeCoverLength??0)-(i.finalNodeCoverLength??0)}function La(e,t){let n=e.path,o=t.path,r=0,s=0;for(;r<n.length&&s<o.length;){let i=n[r],a=o[s],l=i.order,c=a.order;if(l===c&&i.node&&a.node)return(a.y??0)-(i.y??0);l<c?r+=1:(l>c||(r+=1),s+=1)}return 0}function Ba(e,t,n){let o=e.reads[t],r=e.reads[n];return(o.firstNodeOffset??0)-(r.firstNodeOffset??0)||(o.finalNodeCoverLength??0)-(r.finalNodeCoverLength??0)}function Xa(e){let t=new Array(e.maxOrder+1).fill(0);return e.nodes.forEach(n=>{n.y!==void 0&&(t[n.order]=Math.max(t[n.order],n.y+n.contentHeight+20))}),e.tracks.forEach(n=>{n.path.forEach(o=>{t[o.order]=Math.max(t[o.order],(o.y??0)+n.width)})}),t}function Fr(e,t){let n=[],o=(l,c)=>{n.push({order:l,isForward:c,node:null})},r=(l,c,f)=>{n.push({order:l,isForward:c,node:f})},s=Math.abs(t.indexSequence[0]),i=vr(t.indexSequence[0]),a=e.nodes[s];r(a.order,i,s);for(let l=1;l<t.sequence.length;l+=1){let c=a,f=i;s=Math.abs(t.indexSequence[l]),i=vr(t.indexSequence[l]),a=e.nodes[s];let{order:u}=a;if(u>c.order){f||o(c.order,!0);for(let d=c.order+1;d<u;d+=1)o(d,!0);i||o(u,!0)}else if(u<c.order){f&&o(c.order,!1);for(let d=c.order-1;d>u;d-=1)o(d,!1);i&&o(u,!1)}else i===f&&o(u,!i);r(u,i,s)}return n}function Qt(e,t=e.reads){t.forEach(n=>{if(!n.sequence.every(X))return;n.is_reverse=n.is_reverse!==!0,n.sequence=n.sequence.toReversed().map(F),n.sequenceNew!==void 0&&(n.sequenceNew=n.sequenceNew.toReversed());for(let i of n.sequenceNew??[]){i.nodeName=F(i.nodeName);let{sequenceLength:a}=zt(e,i.nodeName);i.mismatches=i.mismatches.map(l=>nn(l,a))}let o=n.firstNodeOffset??0,r=zt(e,n.sequence[0]).sequenceLength,s=zt(e,n.sequence.at(-1)).sequenceLength;n.firstNodeOffset=r-(n.finalNodeCoverLength??0),n.finalNodeCoverLength=s-o})}function nn(e,t){let n=e.type==="insertion"?0:e.type==="deletion"?e.length??0:e.seq?.length??0;return{...e,pos:t-e.pos-n,...e.seq!==void 0&&{seq:on(e.seq)}}}var Fa={A:"T",T:"A",C:"G",G:"C"};function on(e){let t="";for(let n=e.length-1;n>=0;n-=1)t+=Fa[e.charAt(n)]??"N";return t}function be(e,t){let n=new Map;t.forEach(o=>{o.indexSequence=o.sequence.map(r=>{let s=n.get(r);if(s===void 0){let i=e.nodeMap.get(F(r));if(i===void 0)throw new Error(`Track ${o.name??o.id} visits unknown node ${r}`);s=X(r)?-i:i,n.set(r,s)}return s})})}var Da=20;function qa(e){let t={minX:1/0,maxX:-1/0,minY:1/0,maxY:-1/0},{rectangles:n,verticalRectangles:o,curves:r}=e.shapes;for(let s of[n,o,r])for(let{xStart:i,xEnd:a}of s)t.minX=Math.min(t.minX,i,a),t.maxX=Math.max(t.maxX,i,a);return e.nodes.forEach(s=>{s.x!==void 0&&(t.minX=Math.min(t.minX,s.x-9),t.maxX=Math.max(t.maxX,s.x+Da+s.pixelWidth)),s.y!==void 0&&(t.minY=Math.min(t.minY,s.y-10),t.maxY=Math.max(t.maxY,s.y+s.contentHeight+10))}),e.tracks.forEach(s=>{s.path.forEach(i=>{let a=i.y??0;t.maxY=Math.max(t.maxY,a+s.width),t.minY=Math.min(t.minY,a)})}),t}function zt(e,t){let n=e.nodeMap.get(F(t)),o=n===void 0?void 0:e.nodes[n];if(o===void 0)throw new Error(`Unknown node ${t}`);return o}function kr(e){let t=new Map;return e.nodes.forEach((n,o)=>{t.set(n.name,o)}),t}function Rr(e){let t=e.nodes.map(()=>new Set),n=e.nodes.map(()=>new Set),o=r=>{for(let s=0;s<r.indexSequence.length-1;s+=1){let i=Math.abs(r.indexSequence[s]),a=Math.abs(r.indexSequence[s+1]);t[i].add(a),n[a].add(i)}};e.tracks.forEach(o),e.reads.forEach(o),e.nodes.forEach((r,s)=>{r.successors=Array.from(t[s]),r.predecessors=Array.from(n[s])})}function Tr(e,t){let n=0,o=0,r=0;t.forEach(s=>{let i=Math.abs(s);if(s<0){let a=e.nodeOrders[i]??=o;a<r&&(r=a),n=a,o=a-1}else{let a=e.nodeOrders[i]??=n;n=a+1,o=a}}),r<0&&rn(e,-r)}function Ga(e,t){let n=0,o=0;for(;n<t.length&&e.nodeOrders[Math.abs(t[n])]===void 0;)n+=1;if(n>=t.length)return null;let r=t[n],s,i;r>=0?(s=e.nodeOrders[r]-1,i=-1):(s=e.nodeOrders[-r]+1,i=1);for(let a=n-1;a>=0;a-=1){let l=Math.abs(t[a]);e.nodeOrders[l]===void 0&&(e.nodeOrders[l]=s,o=Math.min(o,s),s+=i)}return o<0&&rn(e,-o),n}var Wa=-1;function Ya(e){return Array.from(e,t=>t??Wa)}function Ha(e){let t=[...new Set(e.filter(o=>o>=0))].sort((o,r)=>o-r),n=new Map(t.map((o,r)=>[o,r]));return e.map(o=>n.get(o)??o)}function Zt(e){let t,n,o,r,s=0,i=e.tracks.concat(e.reads),a={stamp:new Int32Array(e.nodes.length),generation:0};e.nodeOrders=new Array(e.nodes.length).fill(void 0),e.nodes.forEach(l=>{l.order=void 0}),Tr(e,e.tracks[0].indexSequence);for(let l=1;l<i.length;l+=1){if(o=Ga(e,i[l].indexSequence),o===null){l<e.tracks.length?Tr(e,i[l].indexSequence):(i.splice(l,1),e.reads.splice(l-e.tracks.length,1),l-=1);continue}for(t=Va(i[l].indexSequence);o<t.length;){for(r=o,o+=1;o<t.length&&e.nodeOrders[t[o]]===void 0;)o+=1;if(o<t.length){n=e.nodeOrders[t[r]]+1;for(let c=r+1;c<o;c+=1)e.nodeOrders[t[c]]=n,n+=1;if(e.nodeOrders[t[o]]>e.nodeOrders[t[r]])e.nodeOrders[t[o]]<n&&_r(e,t[o],t[o-1],n);else if(i[l].indexSequence[o]>=0&&!ja(e,t[o],t[r],a))_r(e,t[o],t[o-1],n);else if(i[l].indexSequence[r]<0||e.nodes[t[r+1]].degree<2&&e.nodeOrders[t[o]]<e.nodeOrders[t[r]]){n=e.nodeOrders[t[r]]-1;for(let c=r+1;c<o;c+=1)e.nodeOrders[t[c]]=n,s=Math.min(s,n),n-=1}}else if(i[l].indexSequence[r]>=0){n=e.nodeOrders[t[r]]+1;for(let c=r+1;c<t.length;c+=1){let f=t[c];e.nodeOrders[f]===void 0&&(e.nodeOrders[f]=n,n+=1)}}else{n=e.nodeOrders[t[r]]-1;for(let c=r+1;c<t.length;c+=1){let f=t[c];e.nodeOrders[f]===void 0&&(e.nodeOrders[f]=n,s=Math.min(s,n),n-=1)}}}}s<0&&rn(e,-s),e.nodeOrders=Ha(Ya(e.nodeOrders)),e.nodes.forEach((l,c)=>{l.order=e.nodeOrders[c]})}function ja(e,t,n,o){o.generation+=1;let{stamp:r,generation:s}=o,i=[t];for(r[t]=s;i.length>0;){let a=i.pop();if(a===n)return!0;for(let l of e.nodes[a].successors)r[l]!==s&&(r[l]=s,i.push(l))}return!1}function Ua(e){let t=-1;return e.nodeOrders.forEach(n=>{n!==void 0&&n>t&&(t=n)}),t}function Va(e){return e.map(t=>Math.abs(t))}function rn(e,t){e.nodeOrders.forEach((n,o)=>{n!==void 0&&(e.nodeOrders[o]=n+t)})}function _r(e,t,n,o){let r=new Map,s=[[t,o]],i=0;for(;i<s.length;){let[a,l]=s[i];i+=1;let c=e.nodeOrders[a];c!==void 0&&c<l&&(r.get(a)??-1/0)<l&&(r.set(a,l),e.nodes[a].successors.forEach(f=>{e.nodeOrders[f]>c&&f!==n&&s.push([f,l+1])}),a!==t&&e.nodes[a].predecessors.forEach(f=>{e.nodeOrders[f]>c&&f!==n&&s.push([f,l+1])}))}r.forEach((a,l)=>{e.nodeOrders[l]=a})}function Ka(e){e.nodes.forEach(t=>{t.tracks=[]}),e.tracks.forEach(t=>{t.indexSequence.forEach(n=>{e.nodes[Math.abs(n)].tracks.push(t.id)})}),e.nodes.forEach(t=>{t.degree=t.tracks.length})}function za(e){Za(e,[...e.tracks.slice(1),...e.reads],e.tracks[0])}function Za(e,t,n){let o=new Int32Array(e.nodes.length),r=new Uint8Array(e.nodes.length);for(let s of n.sequence){let i=X(s)?void 0:e.nodeMap.get(s);i!==void 0&&(r[i]=1)}for(let s of t){let{sequence:i,indexSequence:a}=s,l=a.length-1;for(let c=0;c<=l;c+=1){let f=Math.abs(a[c]);if(r[f]===1)continue;let u=e.nodes[f].order,d=c>0?e.nodes[Math.abs(a[c-1])].order:void 0,p=c<l?e.nodes[Math.abs(a[c+1])].order:void 0,h=X(i[c])?1:-1;(d===void 0||d<u)&&(p===void 0||u<p)&&(o[f]+=h),(d===void 0||d>u)&&(p===void 0||u>p)&&(o[f]-=h)}}for(let s of t){let{sequence:i,indexSequence:a}=s;for(let l=0;l<a.length;l+=1)o[Math.abs(a[l])]>0&&(i[l]=en(i[l]),a[l]=-a[l])}e.nodes.forEach((s,i)=>{o[i]>0&&(s.seq=on(s.seq),s.switched=!0)})}function Ja(e){let t=0,n=20,o=-1,r=e.nodes.slice();r.sort(sn);let s=ec(e);r.forEach(i=>{i.order>=0&&(i.order>o&&(o=i.order,t=n+10*s[i.order]),i.x=t,n=Math.max(n,t+40+i.pixelWidth))})}var Jt=35;function Qa(e){return e<=Jt?e/17.5:Jt/17.5*Math.sqrt(e/Jt)}function ec(e){let t=e.maxOrder+1,n=new Array(t).fill(0),o=new Array(t).fill(0),r=new Array(t).fill(0),s=[];e.tracks.forEach(i=>{for(let a=1;a<i.path.length;a+=1){let l=i.path[a],c=i.path[a-1];l.order===c.order?l.isForward?n[l.order]+=1:o[l.order]+=1:r[l.order]=Math.max(Qa(Math.abs((l.y??0)-(c.y??0))),r[l.order])}}),s.push(Math.max(0,n[0]-1));for(let i=1;i<=e.maxOrder;i+=1)s.push(Math.max(Math.max(0,n[i]-1)+Math.max(0,o[i-1]-1),r[i]));return s}function tc(e){e.assignments=Array.from({length:e.maxOrder+1},()=>[]);let t=new Map;e.tracks.forEach((n,o)=>{n.path=Fr(e,n),n.path.forEach(({order:r,node:s},i)=>{let a={trackID:o,segmentID:i},l=s===null?void 0:t.get(s);if(l===void 0){let c={node:s,tracks:[a]};e.assignments[r].push(c),s!==null&&t.set(s,c)}else l.tracks.push(a)})});for(let n=0;n<=e.maxOrder;n+=1)rc(e,e.assignments[n],n)}function nc(e,t,n){t.forEach(o=>{let r=0;o.tracks.forEach(s=>{let i=oc(e.tracks[s.trackID].path,s.segmentID,n-1);s.idealLane=i===void 0?s.trackID:i.lane,s.idealY=i===void 0?null:i.y,r+=s.idealLane}),o.idealLane=r/o.tracks.length})}function oc(e,t,n){if(t!==0)return e[t-1].order===n?e[t-1]:e[t+1]?.order===n?e[t+1]:e.slice(0,t).findLast(o=>o.order===n)}function rc(e,t,n){let o=0,r=new Set,s=20,i=!1,a=-1;nc(e,t,n),t.sort(Or),t.forEach(l=>{let c=l.node===null?void 0:e.nodes[l.node];c!==void 0?(i&&(s-=10),c.y=s,c.contentHeight=0,i=!1):(i?s-=25:s>20&&(s-=10),i=!0),l.tracks.sort(Or),l.tracks.forEach(f=>{let{path:u,width:d}=e.tracks[f.trackID];f.trackID===a&&c===void 0&&i&&(s+=10),u[f.segmentID].lane=o,u[f.segmentID].y=s,typeof f.idealY=="number"&&r.add(f.idealY-s),o+=1,s+=d,c!==void 0&&(c.contentHeight+=d),a=f.trackID}),s+=25}),sc(e,t,r)}function sc(e,t,n){let o=0,r=Number.MAX_SAFE_INTEGER;n.forEach(s=>{let i=ac(e,t,s);i<r&&(r=i,o=s)}),t.forEach(s=>{s.node!==null&&(e.nodes[s.node].y+=o),s.tracks.forEach(i=>{let a=e.tracks[i.trackID].path[i.segmentID];a.y=a.y+o})})}function ic(e,t,n){t.order<0||e.assignments[t.order]===void 0||(e.assignments[t.order].forEach(o=>{if(o.node!==null){let r=e.nodes[o.node];r!==t&&r.y>t.y&&(r.y+=n,o.tracks.forEach(s=>{let i=e.tracks[s.trackID].path[s.segmentID];i.y=i.y+n}))}else o.tracks.forEach(r=>{let s=e.tracks[r.trackID].path[r.segmentID];s.y>=t.y&&(s.y=s.y+n)})}),e.nodesPerOrder[t.order].forEach(o=>{let r=e.nodes[o];r!==t&&r.y>t.y&&(r.y+=n)}))}function ac(e,t,n){let o=0;return t.forEach(r=>{r.tracks.forEach(s=>{let{type:i,path:a,width:l}=e.tracks[s.trackID];typeof s.idealY=="number"&&i!=="read"&&(o+=Math.abs(s.idealY-n-a[s.segmentID].y)*l)})}),o}function Or(e,t){return e.idealLane===void 0||t.idealLane===void 0?+(e.idealLane===void 0)-+(t.idealLane===void 0):e.idealLane-t.idealLane}function sn(e,t){return e.order!==t.order?e.order-t.order:e.y!==void 0&&t.y!==void 0?e.y-t.y:0}function cc(e){let n=e.config.trackWidth;if(e.config.freqWidth==="linear"){for(let o of e.tracks)o.width=o.type==="read"?4:Math.max(1,Math.round(o.freq??1))*n;return}for(let o of e.tracks)o.width=o.freq!==void 0?Math.round((Math.log(Math.max(o.freq,1))+1)*4):o.type==="read"?4:n;e.tracks.every(o=>o.width===4)&&e.tracks.forEach(o=>{o.freq!==void 0&&(o.width=n)})}function Ar(e,t,n){let o=e.nodes[t.node];return qr(o,t.isForward?n:o.sequenceLength-n)}function Dr(e,t){return t>e.sequenceLength?null:qr(e,t)}function qr(e,t){let[n,o]=gc(e);if(e.sequenceLength===0)return n;let r=Math.min(Math.max(t,0),e.sequenceLength);return n+r/e.sequenceLength*(o-n)}function lc(e){e.extraLeft=new Array(e.maxOrder+1).fill(0),e.extraRight=new Array(e.maxOrder+1).fill(0);let t=[],n=[];e.nodes.forEach(r=>{r.x!==void 0&&(t[r.order]=r.x,n[r.order]=Math.max(n[r.order]??-1/0,r.x+r.pixelWidth))});let o=e.tracks[0];e.tracks.sort(La),e.tracks.forEach(r=>{let{id:s,name:i,type:a,width:l,path:c}=r,f=(g,w,M)=>{e.shapes.rectangles.push({xStart:Math.min(g,w),yStart:M,xEnd:Math.max(g,w),yEnd:M+l-1,id:s,name:i,type:a})},u=g=>g.isForward?n[g.order]:t[g.order],d=c[0],p=d.y,h=a==="read"?Ar(e,d,r.firstNodeOffset??0):d.isForward?t[d.order]-20:n[d.order]+20;for(let g=1;g<c.length;g+=1){let w=c[g-1],M=c[g];if(M.y===p)continue;let x=u(w);x!==h&&f(h,x,p);let y=M.y,v=M.order-w.order;if(v===1||v===-1){let k=v===1?t[M.order]:n[M.order];e.shapes.curves.push({xStart:v===1?x:x+1,yStart:p,xEnd:v===1?k+1:k,yEnd:y,width:l,id:s,name:i,type:a,nodeStart:w.node,nodeEnd:M.node,orderStart:w.order,orderEnd:M.order,...r===o?{reference:!0}:{}}),h=k}else mc(e,r,w.isForward?1:-1,x,p,y,M.order),h=x;p=y}let m=c[c.length-1],b=a==="read"?Ar(e,m,r.finalNodeCoverLength??0):u(m)+(m.isForward?20:-20);f(h,b,p)})}var dc=1e9;function Gr(e,t,n,o){let r=new Map,s=0,i=e.nodes.length,a=(m,b)=>(m+i)*(2*i+1)+b+i,l=e.config.ignoreStrand;for(let[m,b]of t.entries()){let g=Math.max(b.freq??1,1);s+=g;let w=b.indexSequence;if(!(w.length<2))for(let M=0;M<w.length-1;M+=1){let x=w[M],y=w[M+1],v=e.nodes[Math.abs(x)],k=e.nodes[Math.abs(y)],R=l?Math.min(a(x,y),a(-y,-x)):a(x,y),A=r.get(R);A===void 0?r.set(R,{sSigned:x,dSigned:y,sName:x<0?`-${v.name}`:v.name,dName:y<0?`-${k.name}`:k.name,count:g,crossings:g,sourceTrackID:b.sourceTrackID,lastSource:m}):(A.crossings+=g,A.lastSource!==m&&(A.count+=g,A.lastSource=m))}}let c=0;for(let m of r.values())m.crossings>c&&(c=m.crossings);let f=tn,u=60,d=m=>c<=1?f:f+(u-f)*Math.sqrt(m/c),p=[],h=0;for(let m of r.values()){let b=o+h,g=n==="haplotype"?{count:m.count,total:s}:void 0,w=g===void 0?"":` (${hc(g)})`,M=m.crossings===m.count?"":`, ${m.crossings.toLocaleString()} crossings`,x=`${m.count.toLocaleString()} ${n}${m.count===1?"":"s"}${w}${M}: Node ${m.sName} \u2192 Node ${m.dName}`;e.coarsenedEdgeMeta.set(b,{count:m.count,label:x});let y=e.nodes[Math.abs(m.sSigned)].sequenceLength;p.push({id:b,sourceTrackID:m.sourceTrackID,type:"read",name:x,sequence:[m.sName,m.dName],indexSequence:[],path:[],width:d(m.crossings),firstNodeOffset:y,finalNodeCoverLength:0,sequenceNew:[{nodeName:m.sName,mismatches:[]},{nodeName:m.dName,mismatches:[]}],mapping_quality:0,is_secondary:!1,sample_name:null,read_group:null,score:m.count,haplotypeShare:g}),h+=1}return{bands:p,total:s}}function fc(e,t){let n=e.trackForRuler===void 0?-1:e.tracks.findIndex(f=>f.name===e.trackForRuler),o=n===-1?0:n,r=e.tracks[o],s=(r.freq??1)-1,i=pc(e,r),a=e.tracks.filter((f,u)=>u!==o).map(f=>uc(i,f));if(s>0&&a.push({...r,freq:s}),a.length===0)return;let{bands:l,total:c}=Gr(e,a,"haplotype",t);return l.length>0?{ref:r,bands:l,total:c}:void 0}function uc(e,t){let n=0;for(let o of t.indexSequence){let r=e[Math.abs(o)];r!==void 0&&r!==0&&(n+=r===Math.sign(o)?1:-1)}return n>=0?t:{...t,sequence:t.sequence.map(en).reverse(),indexSequence:t.indexSequence.map(o=>-o).reverse()}}function pc(e,t){let n=new Int8Array(e.nodes.length);for(let o of t.indexSequence){let r=Math.abs(o);n[r]===0&&(n[r]=Math.sign(o))}return n}function hc({count:e,total:t}){let n=e/t;return n<.01?"<1%":n>.99&&e<t?">99%":`${Math.round(n*100)}%`}var Nr=7;function mc(e,{width:t,id:n,name:o,type:r},s,i,a,l,c){let f=s===1?e.extraRight:e.extraLeft,u=10*f[c],d=i+s*(u+5),p=Nr,h=Math.min(Nr,t),m=Math.min(a,l),b=Math.max(a,l),g=s===1?i:d-1,w=s===1?d:i,M=k=>{e.shapes.verticalRectangles.push({xStart:g,yStart:k,xEnd:w,yEnd:k+t-1,id:n,name:o,type:r})};M(a),e.shapes.verticalRectangles.push({xStart:s===1?d+p:d-p-h,yStart:m+t+p-1,xEnd:s===1?d+p+h-1:d-p-1,yEnd:b-p+1,id:n,name:o,type:r}),M(l);let x=d+s*p,y=d+s*(p+h),v=`M ${d} ${b}`;v+=` Q ${x} ${b} ${x} ${b-p}`,v+=` H ${y}`,v+=` Q ${y} ${b+t} ${d} ${b+t}`,v+=" Z ",e.shapes.corners.push({path:v,id:n,name:o,type:r}),v=`M ${d} ${m}`,v+=` Q ${y} ${m} ${y} ${m+t+p}`,v+=` H ${x}`,v+=` Q ${x} ${m+t} ${d} ${m+t}`,v+=" Z ",e.shapes.corners.push({path:v,id:n,name:o,type:r}),f[c]+=1}function gc(e){let t=e.x-4,n=e.x+e.pixelWidth+4;return[t,n]}function Pr(e){switch(e.config.nodeWidthOption){case"compressed":e.nodes.forEach(t=>{t.width=1+Math.log2(Math.max(t.sequenceLength,1)),t.pixelWidth=Math.round((t.width-1)*Qe)});break;case"small":e.nodes.forEach(t=>{t.width=t.sequenceLength/100,t.pixelWidth=Math.max(Math.round((t.width-1)*Qe),0)});break;case"fixed":e.nodes.forEach(t=>{t.width=10,t.pixelWidth=Math.round(t.width*Qe)});break;case"normal":{let t=e.config.charWidth;e.nodes.forEach(n=>{n.width=n.sequenceLength,n.pixelWidth=Math.round(t*Math.max(n.sequenceLength-1,0))});break}default:throw new Error(`${e.config.nodeWidthOption} not implemented`)}}var le=0;function $r(e){return{first:new Int32Array(e),count:new Uint8Array(e)}}function j(e,t,n){let o=e.count[t];o===0?(e.first[t]=n,e.count[t]=1):o===1&&e.first[t]!==n&&(e.count[t]=2)}function Ne(e,t){return e.count[t]===1?Math.abs(e.first[t]):0}function bc(e){let t=$r(e.nodes.length),n=$r(e.nodes.length),o=new Map,r=u=>{let d=o.get(u);if(d===void 0){let p=e.nodeMap.get(F(u));d=X(u)?-p:p,o.set(u,d)}return d};e.tracks.concat(e.reads).forEach(u=>{let{sequence:d}=u,p=u.type==="haplotype",h=d.length-1,m=le,b=h>=0?r(d[0]):le;for(let g=0;g<=h;g+=1){let w=g<h?r(d[g+1]):le;if(b>0)g>0?(j(t,b,m),m<0&&j(t,b,-m)):p&&j(t,b,le),g<h?(j(n,b,w),w<0&&j(n,b,-w)):p&&j(n,b,le);else{let M=-b;g>0?(j(n,M,-m),m>0&&j(n,M,m)):p&&j(n,M,le),g<h?(j(t,M,-w),w>0&&j(t,M,w)):p&&j(t,M,le)}m=b,b=w}});let i=new Uint8Array(e.nodes.length);e.nodes.forEach((u,d)=>{xc(d,t,n)&&(i[d]=1)});let a=new Int32Array(e.nodes.length),l=new Float64Array(e.nodes.length),c=new Float64Array(e.nodes.length);e.nodes.forEach((u,d)=>{if(i[d]!==1){a[d]=d,c[d]=u.sequenceLength;for(let p=d;yc(p,t,n);)p=Ne(n,p),a[p]=d,l[p]=u.sequenceLength,u.sequenceLength+=e.nodes[p].sequenceLength,u.seq+=e.nodes[p].seq,c[p]=u.sequenceLength}}),e.reads.forEach(u=>{let{sequence:d}=u,p=u.sequenceNew??d.map(M=>({nodeName:M,mismatches:[]})),h=M=>{let x=Math.abs(r(M));return X(M)?e.nodes[a[x]].sequenceLength-c[x]:l[x]},m=d.length-1;u.firstNodeOffset=(u.firstNodeOffset??0)+h(d[0]),u.finalNodeCoverLength=(u.finalNodeCoverLength??0)+h(d[m]);let b=[],g=[],w=[];d.forEach((M,x)=>{let y=Math.abs(r(M)),{mismatches:v}=p[x],k=h(M);if(v.forEach(R=>{R.pos+=k}),i[y]===1&&!X(M)&&x>0)g.at(-1).mismatches.push(...v);else if(i[y]===1&&X(M)&&x<m)w.push(...v);else{let R=e.nodes[a[y]].name,A=X(M)?Xr(R):R;b.push(A),g.push({nodeName:A,mismatches:w.concat(v)}),w=[]}}),u.sequence=b,u.sequenceNew!==void 0&&(u.sequenceNew=g)}),e.tracks.forEach(u=>{let{sequence:d}=u,p=0;for(let h of d)i[Math.abs(r(h))]===0&&(d[p]=h,p+=1);d.length=p});let f=1;for(let u=1;u<e.nodes.length;u+=1)i[u]===0&&(e.nodes[f]=e.nodes[u],f+=1);e.nodes.length=f}function xc(e,t,n){let o=Ne(t,e);return o!==0&&Ne(n,o)!==0}function yc(e,t,n){let o=Ne(n,e);return o!==0&&Ne(t,o)!==0}function wc(e,t){return t.xStart-e.xStart||e.yStart-t.yStart}function an(e){return[e.nodeStart??-1,e.nodeEnd??-1,e.nodeStart===null?e.orderStart:-1,e.nodeEnd===null?e.orderEnd:-1]}function Mc(e,t){for(let n=0;n<e.length;n+=1){let o=e[n]-t[n];if(o!==0)return o}return 0}var Wr=.75,et=.8;function vc(e,t){let n=e[0],o=Math.min(Math.abs(n.xEnd-n.xStart),t);if(o===0)return e.map(()=>0);let r=e.length>5?.4/e.length:0,s=e.map(d=>{let p=Math.abs(d.yEnd-d.yStart),h=p/Math.hypot(p,o)*Math.min(d.width,et*Wr*o);return Math.max(r,h/(Wr*o))}),i=d=>s.reduce((p,h,m)=>p+(d(e[m])?h:0),0),a=i(d=>d.reference===!0),l=i(d=>d.reference!==!0),c=a>et?et/a:1,f=et-a*c,u=l>f?f/l:1;return s.map((d,p)=>d*(e[p].reference?c:u))}function Yr(e,t,{gapWidth:n=1/0}={}){let o=yr(e.filter(r=>r.type===t),r=>an(r).join(","));return o.forEach(r=>{r.sort(wc);let s=vc(r,n),i=.5-s.reduce((a,l)=>a+l,0)/2;r.forEach((a,l)=>{let c=p=>a.xStart+(a.xEnd-a.xStart)*(a.yStart<a.yEnd?1-p:p),f=c(i);i+=s[l];let u=c(i),d=`M ${a.xStart} ${a.yStart}`;d+=` C ${f} ${a.yStart} ${f} ${a.yEnd} ${a.xEnd} ${a.yEnd}`,d+=` V ${a.yEnd+a.width}`,d+=` C ${u} ${a.yEnd+a.width} ${u} ${a.yStart+a.width} ${a.xStart} ${a.yStart+a.width}`,d+=" Z",a.path=d})}),[...o.values()].sort((r,s)=>Mc(an(r[0]),an(s[0]))).flat()}function Hr(e,t=16){let n=e.match(/[A-Za-z]|-?(?:\d+\.?\d*|\.\d+)(?:e[-+]?\d+)?/g)??[],o=[],r=0,s=0,i=0,a=()=>Number(n[i++]);for(;i<n.length;){let l=n[i++];if(l==="M"||l==="L")r=a(),s=a(),o.push([r,s]);else if(l==="H")r=a(),o.push([r,s]);else if(l==="V")s=a(),o.push([r,s]);else if(l==="C"){let[c,f,u,d,p,h]=[a(),a(),a(),a(),a(),a()];for(let m=1;m<=t;m+=1){let b=m/t,g=1-b,w=g*g*g,M=3*g*g*b,x=3*g*b*b,y=b*b*b;o.push([w*r+M*c+x*u+y*p,w*s+M*f+x*d+y*h])}r=p,s=h}else if(l==="Q"){let[c,f,u,d]=[a(),a(),a(),a()];for(let p=1;p<=t;p+=1){let h=p/t,m=1-h;o.push([m*m*r+2*m*h*c+h*h*u,m*m*s+2*m*h*f+h*h*d])}r=u,s=d}else if(l!=="Z")throw new Error(`flattenPath: unsupported path command ${l}`)}return o}function jr(e){let t=`M ${e.x-9} ${e.y} Q ${e.x-9} ${e.y-9} ${e.x} ${e.y-9}`,n=e.x,o=e.y-9;return e.width>1&&(n+=e.pixelWidth,t+=` L ${n} ${o}`),t+=` Q ${n+9} ${o} ${n+9} ${o+9}`,n+=9,o+=9,e.contentHeight>0&&(o+=e.contentHeight,t+=` L ${n} ${o}`),t+=` Q ${n} ${o+9} ${n-9} ${o+9}`,n-=9,o+=9,e.width>1&&(n-=e.pixelWidth,t+=` L ${n} ${o}`),t+=` Q ${n-9} ${o} ${n-9} ${o-9}`,n-=9,o-=9,e.contentHeight>0&&(o-=e.contentHeight,t+=` L ${n} ${o}`),t}function cn(e){let t=new Map(e.nodes.map(r=>[r.id,r])),n=e.pathVisits,o=n?.replay();return(e.paths??[]).map(r=>{let s=n?.pathIndex($(r.name).name)??-1;return r.nodeIds.flatMap(i=>{let a=t.get(i);if(!a)return[];let l=n&&o?o(n.slot(a.name),s):-1;return[{node:a,strand:l>=0?n.strand(l):ee(a.id)}]})})}function Sc(e){let t=cn(e),n=(e.paths??[]).flatMap((s,i)=>{let a=t[i].map(l=>Lt(l.node,l.strand));return a.length>0?[{id:i,name:s.name,sequence:a,sourceTrackID:0,type:"haplotype",...s.members?{freq:s.members.length}:{}}]:[]}),o=Ie(e),r=n.findIndex(s=>$(s.name).name===o);return r>0&&n.unshift(...n.splice(r,1)),n}function Ec(e){return e.nodes.map(t=>({name:t.id,seq:"",sequenceLength:Math.max(1,t.length)}))}function Vr(e){return(e.paths?.length??0)>0}var kc=600,Rc=3,Tc=15;function _c(e){return Math.max(Rc,Math.min(Tc,Math.floor(kc/Math.max(1,e))))}function Oc(e){let t=new Set,n=new Set;for(let o of e?.sequence??[])X(o)?n.has(F(o))||t.add(F(o)):n.add(o);return t}function Ac(e,t,n){let o=Oc(n[0]),r=new Map;for(let{sequence:l,is_secondary:c}of n)c||l.forEach((f,u)=>{let d=F(f),h=X(f)!==o.has(d)?l[u+1]:l[u-1];!t.nodeMap.has(d)&&h!==void 0&&r.set(d,F(h))});let s=new Map(e.nodes.map(l=>[l.id,Math.max(1,l.length)])),i=new Map([...r].map(([l,c])=>[c,l])),a=new Map;for(let l of i.keys()){let c=t.nodeMap.get(l);if(c!==void 0){let f=[l];for(let d=i.get(l);d!==void 0;d=i.get(d))f.push(d);f.reduce((d,p)=>d+(s.get(p)??0),0)===t.nodes[c].sequenceLength&&a.set(l,f)}}return{members:a,flipped:o}}var Nc={start:"end",end:"start"},Ur={"+":"-","-":"+"};function Pc(e,{members:t,flipped:n}){if(t.size===0)return e;let o=new Map(e.nodes.map(d=>[d.id,d])),r=new Map,s=new Set,i=(d,p)=>n.has(d)?Nc[p]:p;for(let[d,p]of t)p.forEach((h,m)=>{r.set(h,d);let b=p[m+1];b!==void 0&&s.add(`${h}:${i(h,"end")} ${b}:${i(b,"start")}`)});let a=new Set([...r].filter(([d,p])=>d!==p).map(([d])=>d)),l=e.nodes.flatMap(d=>{let p=t.get(d.id);if(!p)return a.has(d.id)?[]:[d];let h=p.map(b=>o.get(b)),m=h.flatMap(b=>b.stable?[b.stable.start]:[]);return[{...d,length:h.reduce((b,g)=>b+g.length,0),stable:d.stable&&{...d.stable,start:Math.min(...m)}}]}),c=(d,p,h)=>i(p,i(d,h))==="end"?ee(p):Ur[ee(p)],f=e.edges.flatMap(d=>{let p=Hn(d),h=`${d.from}:${p.from}`,m=`${d.to}:${p.to}`;if(s.has(`${h} ${m}`)||s.has(`${m} ${h}`))return[];let b=r.get(d.from),g=r.get(d.to);return[{...d,...b===void 0?{}:{from:b,fromStrand:c(d.from,b,p.from)},...g===void 0?{}:{to:g,toStrand:Ur[c(d.to,g,p.to)]}}]}),u=new Set([...a].map(d=>o.get(d)?.name??d));return{...e,nodes:l,edges:f,paths:e.paths?.map(d=>({...d,nodeIds:d.nodeIds.filter(p=>!a.has(p))})),pathVisits:e.pathVisits?.filter(()=>!0,d=>!u.has(d))}}function Kr(e){let t=e.paths??[],n=Sc(e),o=e.reads?Zo(e,e.reads,t.length):[],r=o.length>0?zn:Kn,s=t.map((f,u)=>r(u,t.length)),i=t.some(f=>f.members),a=t.reduce((f,u)=>f+(u.members?.length??1),0),l=Cr(Ec(e),n,o,{nodeWidthOption:"compressed",trackWidth:_c(i?a:n.length),...i?{freqWidth:"linear"}:{}});if(!l)return;let c=Ac(e,l,[...n,...o]);return{layout:l,pathColors:s,members:c.members,graph:Pc(e,c)}}function ln(e){let t=[];return e.nodes.forEach(n=>{n.order>=0&&t.push(n)}),t}function zr(e,t,n,o){let r=e.y+e.contentHeight/2-t;return[{x:n,y:r},{x:o,y:r}]}function Zr(e,t){return{minY:e.bounds.minY-t,maxY:e.bounds.maxY-t}}function Om(e){let t=Vr(e)?Kr(e):void 0;if(!t)return;let{layout:n,...o}=t,r=n.bounds.minY,s={};for(let l of ln(n))s[l.name]=zr(l,r,l.x,l.x+l.pixelWidth);let{minY:i,maxY:a}=Zr(n,r);return{nodePositions:s,tubeMap:{layout:n,yOffset:r,...o},extent:{minX:n.bounds.minX,maxX:n.bounds.maxX,minY:i,maxY:a}}}function $c(e,t){let n=new Map(e.nodes.map(a=>[a.id,a])),o=_n(ln(t),a=>a.order),r=[],s=-1/0;for(let a of[...o.keys()].sort((l,c)=>l-c)){let l=o.get(a),c=1/0,f=-1/0;for(let u of l){let d=n.get(u.name);d&&I(d)&&(c=Math.min(c,d.stable.start),f=Math.max(f,d.stable.start+d.length))}c===1/0&&(c=f=s),c<s&&(c=s,f=Math.max(s,f)),s=Math.max(s,f),r.push({order:a,x0:Math.min(...l.map(u=>u.x)),x1:Math.max(...l.map(u=>u.x+u.pixelWidth)),bp0:c,bp1:f})}let i=r.find(a=>a.bp0!==-1/0);for(let a of r)a.bp0===-1/0&&(a.bp0=a.bp1=i?.bp0??0);return r}function Ic(e){return Vr(e)&&e.nodes.some(I)}function Am(e){let t=Ic(e)?Kr(e):void 0;if(!t)return;let{layout:n,...o}=t,r=$c(o.graph,n),s=new Map(r.map(l=>[l.order,l])),i=n.bounds.minY,a={};for(let l of ln(n)){let c=s.get(l.order);a[l.name]=zr(l,i,c.bp0,c.bp1)}return{nodePositions:a,tubeMap:{layout:n,yOffset:i,columns:r,...o},referenceAxis:!0,pixelRows:!0,extent:Zr(n,i)}}function Cc(e,t){let n=[],o=()=>({a:-1/0,b:1/0,detour:[],bp:0}),r=[o()];for(let{node:s,strand:i}of t){let a=r.at(-1),l=n.at(-1);if(I(s)){let c=s.stable.start,f=c+s.length,u=i!==(s.stable.strand??"+"),d=l!==void 0&&a.detour.length===0;d&&!l.inverted&&!u&&l.end===c?l.end=f:d&&l.inverted&&u&&l.start===f?l.start=c:(n.push({start:c,end:f,inverted:u}),r.push(o()))}else a.detour.push({node:s,strand:i}),a.bp+=s.length}return n.forEach((s,i)=>{r[i].b=s.start,r[i+1].a=s.end}),{path:e,runs:n,gaps:r}}function dn(e,t){return Number.isFinite(e.a)&&Number.isFinite(e.b)&&e.b>=e.a&&Math.max(e.b-e.a,e.bp)<t}function Jr(e,t,n){let o=se(e.length,r=>e[r]<=t);return o<e.length&&e[o]<n}function Lc(e){let t=new Map;for(let n=1;n<e.length;n++){let o=e[n-1],r=e[n],s=o.stable.start+o.length;s!==r.stable.start&&(t.set(s,"reference-gap"),t.set(r.stable.start,"reference-gap"))}return t}function Bc(e,t,n){let o=(s,i)=>{Number.isFinite(s)&&!n.has(s)&&n.set(s,i)};for(let{runs:s,gaps:i}of e){let a=s[0],l=s.at(-1);a&&l&&(o(a.start,"walk-end"),o(l.end,"walk-end"));for(let c of s)c.inverted&&c.end-c.start>=t&&(o(c.start,"inversion"),o(c.end,"inversion"));for(let c of i)c.b<c.a?(o(c.a,"backward"),o(c.b,"backward")):dn(c,t)||(o(c.a,"variant"),o(c.b,"variant"))}let r=e.flatMap(({runs:s,gaps:i})=>[...i.filter(a=>dn(a,t)).map(a=>[a.a,a.b]),...s.filter(a=>a.inverted&&a.end-a.start<t).map(a=>[a.start,a.end])]);for(let s=!0;s;){s=!1;let i=[...n.keys()].sort((a,l)=>a-l);for(let[a,l]of r)Jr(i,a,l)&&(s||=!n.has(a)||!n.has(l),o(a,"overlap"),o(l,"overlap"))}return n}function Xc(e,t){let n=[],o=[],r=()=>{let s=o[0],i=o.at(-1);if(s&&i){let a=s.stable.start,l=i.stable.start+i.length,c=`${a}-${l}`;n.push({node:{id:`${c}+`,name:c,length:l-a,depth:0,stable:{refName:s.stable.refName,start:a,rank:0,strand:"+"}},members:o})}o=[]};for(let s of e)t.has(s.stable.start)&&r(),o.push(s);return r(),n}function fn(e,t,n){return Math.max(0,se(e.length,o=>t(e[o])<=n)-1)}function Bm(e,t){let n=e.nodes.filter(I).sort((x,y)=>x.stable.start-y.stable.start),o=e.paths??[];if(n.length===0||o.length===0)return;let r=cn(e),s=o.map((x,y)=>Cc(x,r[y])),i=Bc(s,t,Lc(n)),a=[...i.keys()].sort((x,y)=>x-y),l=Xc(n,i),c=x=>fn(l,y=>y.node.stable.start,x),f=new Map,u=new Map;for(let x of l){f.set(x.node.id,x.members.map(y=>y.id));for(let y of x.members)u.set(y.id,x.node.id)}let d=new Map,p=x=>{let y=`${x.a} ${x.b} ${x.detour.map(k=>k.node.id+k.strand).join(",")}`,v=d.get(y);if(!v){let k=`r${d.size}`;v={id:`${k}+`,name:k,length:x.bp,depth:0,stable:{refName:n[0].stable.refName,start:Number.isFinite(x.a)?x.a:x.b,rank:1,strand:"+"}},d.set(y,v),f.set(v.id,x.detour.map(R=>R.node.id));for(let R of x.detour)u.has(R.node.id)||u.set(R.node.id,v.id)}return v},h=new Map,m=[],b=new Cn,g=new Map,w=new Map;for(let{path:x,runs:y,gaps:v}of s){let k=[],R=[],A=!1,G=(T,D)=>{let C=k.at(-1);A&&C?.node===T&&C.strand===D||k.push({node:T,strand:D}),A=!0},W=T=>{A=!1,T.detour.length>0&&(G(p(T),"+"),A=!1)},z=T=>{(T.bp>0||T.b>T.a)&&R.push({start:T.a,end:T.b,bp:T.bp});let D=l[c(T.b>T.a?T.a:T.a-1)];for(let C of T.detour)u.has(C.node.id)||(u.set(C.node.id,D.node.id),f.get(D.node.id).push(C.node.id))};y.forEach((T,D)=>{let C=v[D];dn(C,t)&&!Jr(a,C.a,C.b)?z(C):W(C);let Y=c(T.start),Z=c(T.end-1),re=T.end-T.start<t;if(T.inverted&&!re){A=!1;for(let H=Z;H>=Y;H--)G(l[H].node,"-");A=!1}else{T.inverted&&R.push({start:T.start,end:T.end,bp:T.end-T.start,inverted:!0});for(let H=Y;H<=Z;H++)G(l[H].node,"+")}}),W(v.at(-1));let oe=$(x.name).name,U=0;k.forEach(({node:T,strand:D},C)=>{w.set(T.id,(w.get(T.id)??0)+1),b.add(T.name,oe,x.sample??oe,U,D==="-"),U+=T.length;let Y=k[C+1];if(Y){let Z=`${T.id}${D} ${Y.node.id}${Y.strand}`,re=g.get(Z);re?re.pathIds.push(x.name):g.set(Z,{from:T.id,to:Y.node.id,fromStrand:D,toStrand:Y.strand,pathIds:[x.name]})}}),m.push({...x,nodeIds:k.map(T=>T.node.id)}),h.set(x.name,R)}let M=[...l.map(x=>x.node),...d.values()].filter(x=>w.has(x.id)).map(x=>({...x,depth:w.get(x.id)}));return{graph:{...e,nodes:M,edges:[...g.values()],paths:m,pathVisits:b.build(),reads:void 0},members:f,coarseOf:u,deviations:h,cuts:i}}function Dm(e,t){return t?e.filter(n=>t.includes(n.sample)).sort((n,o)=>t.indexOf(n.sample)-t.indexOf(o.sample)||n.label.localeCompare(o.label)):e}function qm(e,t,n,o={}){let r=Fn(e,t,o);return r&&Dn(r,n)}function Fc(e,t,n){let o=fn(e,r=>r.bp0,t);return[e[o],e[o-1]].find(r=>r&&n.has(r.index)&&r.bp0<=t&&t<=r.bp1)}function Dc(e,t){let n=new Map;for(let[r,s]of t)for(let i of s)fe(n,$(r).name,i);let o=new Map;for(let r of e.paths??[])if(r.members){let s=new Map;for(let i of r.members.flatMap(a=>n.get(a)??[]))s.set(`${i.start}-${i.end}`,i);o.set(r.name,[...s.values()])}else o.set(r.name,t.get(r.name)??[]);return o}function pg(e,t){let{graph:n,layout:o}=e,r=[...Kt(e).values()].flat().sort((a,l)=>a.bp0-l.bp0),s=Dc(n,t),i=[];for(let a of o.tracks){let l=a.name?s.get(a.name):void 0;if(l?.length){let c=new Map;for(let f of a.path)f.node!==null&&f.y!==void 0&&!c.has(f.node)&&c.set(f.node,f.y);for(let f of l){let u=Fc(r,f.start,c);u&&i.push({x0:Ae(u,f.start),x1:Ae(u,f.end),y:c.get(u.index),height:a.width})}}}return i}function qc(e){return e?"rgba(255,255,255,0.9)":"rgba(0,0,0,0.8)"}function hg(e,t,{x:n,y:o,width:r,darkMode:s}){if(t.length!==0){e.fillStyle=qc(s),e.beginPath();for(let i of t){let a=n(i.x0),l=Math.max(n(i.x1),a+1);if(l>=0&&a<=r){let c=o(i.y);e.rect(a,c,l-a,o(i.y+i.height)-c)}}e.fill()}}var un=24,Gc=.5,Wc=e=>e.bp1>e.bp0;function bg(e,t){let n=e.filter(Wc);if(n.length===0){let c=e[0];return c?[{tx:c.x0,sx:t(c.bp0)}]:[]}let o=[],r=[],s=[];n.forEach((c,f)=>{o.push(c.x0,c.x1),r.push(t(c.bp0),t(c.bp1)),s.push(f===0?0:Math.min(c.x0-n[f-1].x1,un),0)});let i=r.at(-1)-r[0],a=s.reduce((c,f)=>c+f,0),l=a>0?Math.min(1,Gc*i/a):1;return Yc(r,s,l).map((c,f)=>({tx:o[f],sx:c}))}function Yc(e,t,n){let o=[],r=0;for(let i of t)r+=i*n,o.push(r);let s=[];return e.forEach((i,a)=>{let l={mean:i-o[a],n:1},c=s.at(-1);for(;c&&c.mean>=l.mean;){s.pop();let f=c.n+l.n;l={mean:(c.mean*c.n+l.mean*l.n)/f,n:f},c=s.at(-1)}s.push(l)}),s.flatMap(i=>Array(i.n).fill(i.mean)).map((i,a)=>i+o[a])}function xg(e,t){let n=e.length;if(n===0)return t;let o=e[0],r=e[n-1];if(t<=o.tx)return o.sx+(t-o.tx);if(t>=r.tx)return r.sx+(t-r.tx);let s=1+se(n-2,c=>e[c+1].tx<=t),i=e[s-1],a=e[s],l=a.tx-i.tx;return l>0?i.sx+(t-i.tx)/l*(a.sx-i.sx):i.sx}function Hc(e,t){let n=[],o=e.sequenceNew??[],r=e.path.filter(s=>s.node!==null);return o.forEach((s,i)=>{let a=t.nodeMap.get(F(s.nodeName)),l=a===void 0?void 0:t.nodes[a],c=r[i];if(l&&c?.y!==void 0){let f={readId:e.id,y:c.y,height:e.width},u=d=>Dr(l,d);for(let d of s.mismatches){let p=c.isForward?d:nn(d,l.sequenceLength),h=u(p.pos);if(h!==null){if(p.type==="insertion")n.push({...f,kind:"insertion",x:h,seq:p.seq});else if(p.type==="deletion"&&p.length!==void 0){let m=u(p.pos+p.length);m!==null&&n.push({...f,kind:"deletion",x0:h,x1:m,length:p.length})}else if(p.type==="substitution"&&p.seq!==void 0){let m=u(p.pos+p.seq.length);m!==null&&n.push({...f,kind:"substitution",x0:h,x1:m,seq:p.seq})}}}}}),n}function Qr(e){return e.reads.flatMap(t=>Hc(t,e))}function mn(e){let t=e.trim().split(/[\s,]+/),n=[],o=0,r=()=>Number(t[o++]);for(;o<t.length;){let s=t[o++];s==="M"||s==="L"?n.push({op:s,x:r(),y:r()}):s==="H"?n.push({op:s,x:r()}):s==="V"?n.push({op:s,y:r()}):s==="Q"?n.push({op:s,x1:r(),y1:r(),x:r(),y:r()}):s==="C"?n.push({op:s,x1:r(),y1:r(),x2:r(),y2:r(),x:r(),y:r()}):s==="Z"&&n.push({op:s})}return n}function os(e){let t=1/0,n=-1/0;for(let o of e)"x"in o&&(t=Math.min(t,o.x),n=Math.max(n,o.x)),"x1"in o&&(t=Math.min(t,o.x1),n=Math.max(n,o.x1));return{x0:t,x1:n}}function es(e,t,n,o,r){let s=mn(e);return{commands:s,outline:Hr(e,12),color:t,id:n,haplotype:o,reference:r,...os(s)}}function rs(e,t){return new Map(e.tracks.map(n=>[n.id,n.type==="read"?Jo(n):t[n.id]]))}function ts(e,t,n,o,r){let{shapes:s}=e,i=t==="haplotype",a=d=>n.get(d.id),l=d=>i&&o.has(d.id),c=[...s.rectangles,...s.verticalRectangles].filter(d=>d.type===t).map(d=>({color:a(d),id:d.id,haplotype:i,reference:l(d),x0:d.xStart,x1:d.xEnd+1,y0:d.yStart,y1:d.yEnd+1})),f=Yr(s.curves,t,{gapWidth:r}).map(d=>es(d.path,a(d),d.id,i,l(d))),u=s.corners.filter(d=>d.type===t).map(d=>es(d.path,a(d),d.id,i,l(d)));return{rects:c,shapes:[...f,...u]}}function jc(e){let t=new Set,n=e&&Ie(e);return e?.paths?.forEach((o,r)=>{$(o.name).name===n&&t.add(r)}),t}function Uc({layout:e,pathColors:t,graph:n,columns:o}){let r=rs(e,t),s=jc(n),i=o?un:void 0,a=[];return e.nodes.forEach(l=>{if(l.order>=0){let c=mn(jr(l));a.push({name:l.name,commands:c,...os(c)})}}),{bounds:e.bounds,layers:[ts(e,"haplotype",r,s,i),ts(e,"read",r,s,i)],nodes:a,mismatches:Qr(e)}}function pn(e,t,n,o){let r=0,s=0;for(let i of t)switch(i.op){case"M":r=i.x,s=i.y,e.moveTo(n(r),o(s));break;case"L":r=i.x,s=i.y,e.lineTo(n(r),o(s));break;case"H":r=i.x,e.lineTo(n(r),o(s));break;case"V":s=i.y,e.lineTo(n(r),o(s));break;case"Q":r=i.x,s=i.y,e.quadraticCurveTo(n(i.x1),o(i.y1),n(r),o(s));break;case"C":r=i.x,s=i.y,e.bezierCurveTo(n(i.x1),o(i.y1),n(i.x2),o(i.y2),n(r),o(s));break;case"Z":e.closePath();break}}function ns(e,t,n,o,r){let s=new Map;for(let i of t)n(i)&&fe(s,o(i),i);for(let i of s.values()){e.fillStyle=o(i[0]),e.beginPath();for(let a of i)r(a);e.fill()}}var Vc=12,Kc=.15;function zc(e){return Math.max(Kc,Math.min(1,e/Vc))}var Zc=.55;function Jc(e,t,n){let{x:o,y:r,width:s}=n,i=f=>o(f.x1)>=0&&o(f.x0)<=s,a=f=>f.haplotype&&n.tubeColors?.[f.id]||f.color;e.globalAlpha=1;for(let f of t.layers)for(let u of[!1,!0]){let d=p=>p.reference===u;ns(e,f.rects,p=>d(p)&&i(p),a,p=>{let h=o(p.x0),m=r(p.y0);e.rect(h,m,o(p.x1)-h,r(p.y1)-m)}),ns(e,f.shapes,p=>d(p)&&i(p),a,p=>{pn(e,p.commands,o,r)})}let l=n.darkMode?"#d0d0d0":"#000000",c=n.darkMode?"rgba(40,40,40,0.4)":"rgba(255,255,255,0.4)";e.lineWidth=ss(n);for(let f of t.nodes)if(i(f)&&f.name!==n.highlightNode){e.beginPath(),pn(e,f.commands,o,r);let u=n.nodeColors?.get(f.name);e.fillStyle=u??c,e.strokeStyle=l,e.globalAlpha=u?Zc:1,e.fill(),e.globalAlpha=zc(o(f.x1)-o(f.x0)),e.stroke(),e.globalAlpha=1}tt(e,t,n),el(e,t.mismatches,n)}function ss(e){return 2*Math.max(.25,Math.min(1,e.yScale))}function tt(e,t,n){let o=n.highlightNode?t.nodes.find(r=>r.name===n.highlightNode):void 0;o&&(e.beginPath(),pn(e,o.commands,n.x,n.y),e.globalAlpha=1,e.lineWidth=ss(n),e.fillStyle="rgba(255,192,203,0.5)",e.strokeStyle="#ff0000",e.fill(),e.stroke())}var is=12,Qc=6;function gn(e){return is*e>=Qc}function hn(e,{x:t,width:n}){let[o,r]=e.kind==="insertion"?[e.x,e.x]:[e.x0,e.x1];return t(r)>=0&&t(o)<=n}function el(e,t,n){let{x:o,y:r,yScale:s,darkMode:i}=n;if(!gn(s)||t.length===0)return;let a=is*s;e.fillStyle="grey",e.beginPath();for(let l of t)if(l.kind==="deletion"&&hn(l,n)){let c=o(l.x0),f=r(l.y);e.rect(c,f,o(l.x1)-c,r(l.y+l.height)-f)}e.fill(),e.font=`${a}px monospace`,e.textAlign="left",e.textBaseline="alphabetic",e.fillStyle=i?"#ffffff":"#000000";for(let l of t)hn(l,n)&&(l.kind==="substitution"?e.fillText(l.seq,o(l.x0)+1,r(l.y+l.height)):l.kind==="insertion"&&e.fillText("*",o(l.x)-3,r(l.y+l.height)))}function tl(e,t,n){let o=!1;for(let r=0,s=e.length-1;r<e.length;s=r++){let[i,a]=e[r],[l,c]=e[s];a>n!=c>n&&t<(l-i)*(n-a)/(c-a)+i&&(o=!o)}return o}function nl(e,{x:t,y:n},o,r){for(let s=e.layers.length-1;s>=0;s--){let{rects:i,shapes:a}=e.layers[s];for(let l of[!0,!1]){for(let c of i)if(c.reference===l&&t(c.x0)<=o&&o<=t(c.x1)&&n(c.y0)<=r&&r<=n(c.y1))return c.id;for(let c of a)if(c.reference===l&&t(c.x0)<=o&&o<=t(c.x1)&&tl(c.outline.map(([f,u])=>[t(f),n(u)]),o,r))return c.id}}}var ol=4;function rl(e,t,n,o){let{x:r,y:s,yScale:i}=t;return gn(i)?e.mismatches.find(a=>s(a.y)<=o&&o<=s(a.y+a.height)&&(a.kind==="insertion"?Math.abs(r(a.x)-n)<=ol:r(a.x0)<=n&&n<=r(a.x1))):void 0}var de=JBrowseExports["@jbrowse/core/util/groupKeys"],sl=e=>de!=null&&e in Object(de)?de[e]:Object.assign(function(){throw new Error("This JBrowse does not provide '"+e+"' from '@jbrowse/core/util/groupKeys' to plugins: GraphGenomeView was built for a different JBrowse version, so update the plugin or JBrowse")},{jbrowseHostMissing:e});var nt=sl("groupKeyComparator");var v0=de&&de.__esModule?de.default:de;var bn=16;function R0(e){let t=new Set;for(let n of e??[])for(let o of Object.keys(n))o!=="name"&&t.add(o);return[...t]}function T0(e){if(typeof e=="string")return e?{field:e}:void 0;let{field:t,sort:n,domain:o}=e??{};if(typeof t!="string"||!t)return;let r=n??o;return Array.isArray(r)?{field:t,sort:r.filter(s=>typeof s=="string")}:{field:t}}function xn(e,t){return`${e} ${t}${e===1?"":"s"}`}function yn(e,t){let n=new Map(t.map(o=>[o.name,o[e]??""]));return(o,r)=>n.get(o)||n.get(r)||""}function wn(e,t,{field:n,sort:o},r,s){let i=new Map;for(let a of e){let l=t(a),c=i.get(l);c?c.push(a):i.set(l,[a])}return[...i.keys()].sort(nt(o)).map(a=>{let l=i.get(a),c=new Set(l.map(s)).size;return{key:a,members:l,title:`${a||`${n}: none`} \xB7 ${xn(c,r)}`}})}function _0(e,t,n){let o=yn(n.field,t),r=wn(e,a=>o(a.label,a.sample),n,"haplotype",a=>a.label),s=1,i=r.map(({key:a,members:l,title:c})=>{let f={key:a,title:c,first:s,count:l.length};return s+=l.length,f});return{rows:r.flatMap(a=>a.members),sections:i}}var il=e=>e.length*bn;function al(e,t){return e.findLastIndex(n=>n.first<=t)}function O0(e,t){let n=o=>o*t+(al(e,o)+1)*bn;return{rowY:n,headers:e.map((o,r)=>({...o,top:(o.first-.5)*t+r*bn})),headersPx:il(e),blocks(o){return e.length?[{first:0,count:1,rowY:0},...e.map(r=>({first:r.first,count:r.count,rowY:n(r.first)}))]:[{first:0,count:o,rowY:0}]},rowAt(o,r){let s=0,i=r-1;for(;s<i;){let a=s+i>>1;n(a)<o?s=a+1:i=a}return s>0&&o-n(s-1)<=n(s)-o?s-1:s}}}function A0(e,t,n,o,r){return t.length===0?[Oe(e,o,r)]:[Oe({...e,rows:[]},o,r),...t.flatMap((s,i)=>Oe({...e,rows:e.rows.slice(s.first-1,s.first-1+s.count)},{...o,translateY:o.translateY+(n(s.first)-o.rowPx)*o.scaleY},{...r,idPrefix:`${r.idPrefix}-s${i}`}).children.filter(l=>typeof l!="string"&&l.attrs["data-testid"]!=="graph-walk-reference"))]}function N0(e,t,n){let{scaleX:o,scaleY:r,translateX:s,translateY:i,width:a,height:l,barPx:c}=n;return[e.reference,...e.rows].map((f,u)=>{let d=t(u)*r+i;return d<-c||d>l+c?"-":n.readouts??!0?Ke(Ve(f,u===0?void 0:e.reference,e.unit,f.call),(e.origin+ze(f))*o+s,a).anchor:"+"}).join(" ")}function cl(e,t,n,o){let r=[],s=[],i=[e];for(o.add(e);i.length>0;){let a=i.pop(),l=t.get(a);if(l){r.push(l);for(let c of n.get(a)??[]){let f=t.get(c);f&&(f.stable.rank===it?s.push(f):o.has(c)||(o.add(c),i.push(c)))}}}return{members:r,anchors:s}}function ll(e){if(new Set(e.map(a=>a.stable.refName)).size!==1||e.length<2)return;let n=[...e].sort((a,l)=>a.stable.start-l.stable.start),o=n[0],r=n.at(-1),s=o.stable.start+o.length,i=r.stable.start;return i>=s?{start:s,end:i,entry:o}:void 0}function dl(e,t,n){let o=new Map(e.map(i=>[i.id,i])),r=new Map,s=[];for(let i of n.get(t.id)??[])o.has(i)&&(r.set(i,0),s.push(i));if(s.length===0)for(let i of e)r.set(i.id,0),s.push(i.id);for(let i of s){let a=r.get(i)+o.get(i).length;for(let l of n.get(i)??[])if(o.has(l)){let c=r.get(l);(c===void 0||a<c)&&(r.set(l,a),s.push(l))}}return r}function fl(e,t,n){let o=dl(e,t,n),r=[...e].sort((l,c)=>o.get(l.id)-o.get(c.id)),s=new Map(r.map((l,c)=>[l.id,c])),i=new Map(e.map(l=>[l.id,l])),a=new Map;for(let[l,c]of r.entries()){let f=0;for(let u of n.get(c.id)??[]){let d=i.get(u);d&&s.get(u)<l&&(f=Math.max(f,a.get(u)+d.length))}a.set(c.id,f)}return{offsets:a,ordered:r}}function ul(e){let t=new Map(e.nodes.filter(On).map(s=>[s.id,s])),n=Le(e),o=new Set,r=[];for(let s of t.values())if(s.stable.rank!==it&&!o.has(s.id)){let{members:i,anchors:a}=cl(s.id,t,n,o),l=ll(a);if(l){let{offsets:c,ordered:f}=fl(i,l.entry,n);r.push({start:l.start,refSpan:l.end-l.start,nodeIds:f.map(u=>u.id),nodeOffsets:f.map(u=>c.get(u.id)),pathLength:f.reduce((u,d)=>Math.max(u,c.get(d.id)+d.length),0)})}}return r.sort((s,i)=>s.start-i.start)}var pl=28,as="#4d4d4d",hl="#5b8cc4",ml=[hl,"#82abd9"],ib=["#8c8c8c","#adadad"],gl="12px sans-serif",ab=[{field:"",label:"None"},{field:"sample",label:"A panel per sample"},{field:"walk",label:"A panel per haplotype"}],K=e=>$(e).name;function cb(e,t,n=ml){let o=0;return e.map(r=>K(r.name)===t?as:n[o++%n.length])}var bl=["#4e79a7","#f28e2b","#59a14f","#e15759","#b07aa1","#76b7b2","#edc948","#9c755f","#ff9da7","#bab0ac"],cs="#c8c8c8";function lb(e){let t=[...new Set(e)].filter(n=>n!=="").sort(nt());return new Map(t.map((n,o)=>[n,bl[o]??cs]))}function db(e,t,n,o){return e.map(r=>{let s=K(r.name);return s===t?as:o.get(n(r.members?.[0]??s))??cs})}function xl(e,t){let n=yn(e,t);return o=>{let{sample:r,haplotype:s}=ye(o);return n(`${r}#${s}`,r)}}function fb(e,t){let n=(e.paths??[]).map(l=>l.name).filter(l=>K(l)!==e.referencePath);if(t.by==="column"){let l=xl(t.field,t.table);return wn(n,c=>l(K(c)),t,"sample",c=>ye(K(c)).sample).map(({key:c,members:f,title:u})=>({key:c,paths:f,label:u}))}let o=t.by==="sample"?l=>ye(l).sample:l=>l,r=new Map;for(let l of n){let c=o(K(l)),f=r.get(c);f?f.push(l):r.set(c,[l])}let s=t.sort??[],i=new Map(s.map((l,c)=>[l,c])),a=l=>i.get(l)??s.length;return[...r].map(([l,c],f)=>({key:l,paths:c,i:f})).sort((l,c)=>a(l.key)-a(c.key)||l.i-c.i).map(({key:l,paths:c})=>({key:l,paths:c}))}function ub(e,t){if(e.graph.nodes.some(n=>n.id===t))return t;for(let[n,o]of e.members)if(o.includes(t))return n}function pb(e,t,n,o,r){let s=e.flatMap(u=>{let d=t(u);return d?[{id:u,...d}]:[]});if(s.length===0)return;let i=s.reduce((u,d)=>Math.min(u,d.start),1/0),a=s.reduce((u,d)=>Math.max(u,d.end),-1/0),l=o>n?(r-n)/(o-n):0,c=i+Math.min(1,Math.max(0,l))*(a-i),f=u=>c<u.start?u.start-c:c>=u.end?c-u.end+1:0;return s.reduce((u,d)=>f(d)<f(u)?d:u).id}function hb(e,t){let n=new Set,o=new Set;for(let r of e.paths??[]){let s=K(r.name);if(s!==e.referencePath){let i=r.nodeIds.includes(t);for(let a of r.members??[s])n.add(a),i&&o.add(a)}}return{here:o.size,of:n.size}}var yl="bold 11px sans-serif",wl=80,Ml=9;function mb(e,t,n,{x:o,y:r,width:s}){let i=n.paths??[];if(!i.some(l=>l.members))return;let a=new Map;i.forEach((l,c)=>{K(l.name)!==n.referencePath&&a.set(c,l.members?.length??1)}),e.font=yl,e.textAlign="left",e.textBaseline="middle",e.fillStyle="#0b1f3a";for(let l of t.layers[0]?.rects??[]){let c=a.get(l.id),f=Math.max(0,o(l.x0)),u=Math.min(s,o(l.x1)),d=r(l.y0),p=r(l.y1);c!==void 0&&u-f>=wl&&p-d>=Ml&&e.fillText(`\xD7${c}`,f+4,(d+p)/2)}}var vl="10px sans-serif",Sl=1e3;function gb(e,t,{x:n,y:o,width:r}){if(!t.columns)return;let s=new Map(t.graph.nodes.map(l=>[l.id,l.length]));e.font=vl;let i=new Map;t.layout.nodes.forEach(l=>{let c=s.get(l.name)??0,f=n(l.x),u=n(l.x+l.pixelWidth),d=L(c);if(l.order>=0&&c>=Sl&&u-f<e.measureText(d).width){let p=(o(l.y)+o(l.y+l.contentHeight))/2,h=`${Math.round(u)}:${d}`,m=i.get(h);m?(m.count++,m.mid=Math.max(m.mid,p)):i.set(h,{text:d,right:u,mid:p,count:1})}}),e.textAlign="left",e.textBaseline="middle",e.lineJoin="round",e.lineWidth=3,e.strokeStyle="rgba(255,255,255,0.9)",e.fillStyle="rgba(0,0,0,0.75)";let a=[];for(let{text:l,right:c,mid:f,count:u}of i.values()){let d=u>1?`${l} each`:l,p={x0:c+3,x1:c+3+e.measureText(d).width,y0:f-6,y1:f+6};p.x1<=r&&!a.some(h=>h.x0<p.x1&&p.x0<h.x1&&h.y0<p.y1&&p.y0<h.y1)&&(a.push(p),e.strokeText(d,p.x0,f),e.fillText(d,p.x0,f))}}function bb(e,t,n,{width:o,lit:r}){t.forEach((s,i)=>{let a=n?.[i];a&&(r&&tt(e,s.picture,{...s.frame,width:o,highlightNode:a.box}),e.font=gl,e.textAlign="left",e.textBaseline="top",e.fillStyle="#c00000",e.fillText(` \xB7 ${a.here} of ${xn(a.of,"haplotype")} here`,6+e.measureText(s.label).width,s.titleTop+4))})}function xb(e,t){let n=new Set(t),o=(e.paths??[]).filter(c=>n.has(c.name)||K(c.name)===e.referencePath),r=new Set(o.map(c=>K(c.name))),s=new Set(o.flatMap(c=>c.nodeIds)),i=e.nodes.filter(c=>s.has(c.id)),a=new Set(i.map(c=>c.name)),l=e.pathVisits?.filter(c=>r.has(c),c=>a.has(c));return{...e,nodes:i,edges:e.edges.filter(c=>s.has(c.from)&&s.has(c.to)),paths:o,anchorPaths:e.anchorPaths?.filter(c=>r.has(c.name)),pathVisits:l,reads:void 0}}function yb(e,t){let n=[],o={},r=0,s=1/0,i=-1/0;for(let{key:a,paths:l,label:c,result:f}of t){let u=f?.tubeMap,d=f?.extent;if(u&&d){let p=r+pl,h=(d.maxY??0)-(d.minY??0);n.push({key:a,paths:l,label:c,result:{...f,tubeMap:u},top:p,height:h});let m=p-(d.minY??0);for(let[b,g]of Object.entries(f.nodePositions))o[b]=g.map(w=>({x:w.x,y:w.y+m}));r=p+h,s=Math.min(s,d.minX??s),i=Math.max(i,d.maxX??i)}}return n.length>1?{...e,nodePositions:o,extent:{...s<=i?{minX:s,maxX:i}:{},minY:0,maxY:r},tubeMapPanels:n}:e}var El="#daa520",kl=1,Rl=2,Tl=4;function vb(e,t,n,o=r=>r){let r=s=>{let i=t(s)*2;return n?.nodeIds.has(s)?Math.max(i,n.walks.length*Tl):i};return e.flatMap(s=>s.exonsByNode.map(({nodeId:i,d:a})=>({key:`${s.gene.name}-${s.gene.start}-${i}`,d:o(a),inner:r(i)+2*kl})))}function Sb(e,t){if(e.length===0)return;let n=(o,r,s)=>P("path",{d:o.d,fill:"none",stroke:r,"stroke-width":s,"stroke-linecap":"round","stroke-linejoin":"round","vector-effect":t.transform?"non-scaling-stroke":void 0});return P("g",{},P("mask",{id:t.id,maskUnits:"userSpaceOnUse",x:0,y:0,width:t.width,height:t.height},P("g",{transform:t.transform},...e.map(o=>n(o,"#fff",o.inner+2*Rl)),...e.map(o=>n(o,"#000",o.inner)))),P("rect",{width:t.width,height:t.height,fill:El,mask:`url(#${t.id})`}))}function _l(e,t,n){let o=new Set;for(let s of e.paths??[])for(let i of s.nodeIds)o.add(i);let r=new Set([...t.names].map(s=>$(s).name));for(let s of e.gaps??[])if(!r.has($(s.name).name))for(let i of s.segments)for(let a of i.nodes)o.add(a);return e.nodes.every(s=>t.nodeIds.has(s.id)||o.has(s.id))?"only in other haplotypes":`nodes and links not on ${n}`}var ls=(e,t)=>!!e.referencePath&&$(t).name===e.referencePath;function Ol(e,t){let n=$(t).name;return(e.paths??[]).filter(o=>$(o.name).name===n).sort((o,r)=>(o.start??0)-(r.start??0))}var ds=e=>new Map(e.nodes.map(t=>[t.id,t]));function Al(e){let t=new Map;return e.edges.forEach((n,o)=>{t.set(`${n.from}>${n.to}`,o)}),{byId:ds(e),edgeAt:t}}function Nl(e,t,{byId:n,edgeAt:o}){let r=Ol(e,t),s=r[0],i=S=>n.get(S)?.length??0,a=S=>S.nodeIds.reduce((O,_)=>O+i(_),0),l=$(t).name,c=(e.gaps??[]).filter(S=>$(S.name).name===l),f=new Map(c.map(S=>[`${S.start} ${S.end}`,S])),u=S=>(S.start??0)+(S.abridged?.bp??a(S)),d=S=>S.segments.reduce((O,_)=>O+(_.kind==="steps"?_.nodes.reduce((N,J)=>N+i(J),0):_.bp),0),p=S=>{let O=r[S-1],_=r[S],N=O?.start!==void 0&&_?.start!==void 0?f.get(`${u(O)} ${_.start}`):void 0;return N&&d(N)===N.end-N.start?N:void 0},h=c.filter(S=>S.edge!==0&&d(S)===S.end-S.start),m=[...r.map((S,O)=>p(O)),...h].flatMap(S=>{let O=S?.start??0;return(S?.segments??[]).flatMap(_=>{let N=O;return O+=_.bp,_.kind==="steps"&&_.nodes.length>0?[{name:t,nodeIds:_.nodes,start:N}]:[]})}),b=[...r,...m].sort((S,O)=>(S.start??0)-(O.start??0)||u(S)-u(O)),g=b.reduce((S,O)=>S+a(O),0),w=S=>{let O=Math.min(...S.map(_=>_.start??1/0));return Number.isFinite(O)?{start:O,end:Math.max(...S.map(_=>(_.start??0)+a(_)))}:void 0};if(b.length===0)return;let M=w(b),x=M&&{contig:s?.contig??Pe($(t).name),...M},y=x?x.end-x.start:g,v=new Set,k=new Set,R=new Map,A=new Map,G=new Map,W=1,z=0,oe=new Set(m),U;for(let S of b){x&&(z=Math.max(z,(S.start??0)-x.start));let O=U!==void 0&&(oe.has(U)||oe.has(S))&&U.start!==void 0&&u(U)===S.start,_=U?.nodeIds.at(-1);S.nodeIds.forEach((N,J)=>{v.add(N);let xe=(G.get(N)??0)+1;G.set(N,xe),W=Math.max(W,xe);let rt=J>0?S.nodeIds[J-1]:O?_:void 0;if(rt!==void 0){let Tn=o.get(`${rt}>${N}`)??o.get(`${N}>${rt}`);Tn!==void 0&&k.add(Tn)}let kn=i(N),st=y>0?(z+kn/2)/y:0;R.has(N)||R.set(N,st);let Rn=A.get(N);Rn?Rn.push(st):A.set(N,[st]),z+=kn}),U=S}let T=Pl(e,t),D=0,C=0,Y=0,Z=0,re=S=>{let O=S.start;for(let _ of S.segments){let J=!M||O>=M.start&&O+_.bp<=M.end?_.bp:0,xe=_.kind==="own"?Math.min(_.missingBp,J):0;D+=xe,C+=_.kind==="own"?J-xe:0,Y+=_.kind==="read"?J:0,Z+=_.kind==="unread"?J:0,O+=_.bp}},H;r.forEach((S,O)=>{let _=p(O);if(_)re(_);else if(H!==void 0&&S.start!==void 0&&S.start>H)for(let N of In(H,S.start,{after:r[O-1].trimmedAfter,before:S.trimmedBefore},T))D+=N.cause==="missing"?N.bp:0,C+=N.cause==="own"?N.bp:0,Y+=N.cause===void 0?N.bp:0,Z+=N.cause==="elsewhere"?N.bp:0;H=S.start===void 0?void 0:S.start+a(S)}),h.forEach(re);let En=ls(e,t),ks=()=>{let S=En?[]:(e.paths??[]).filter(_=>ls(e,_.name));if(S.length===0)return;let O=w(S);return O?O.end-O.start:S.reduce((_,N)=>_+a(N),0)};return{name:t,reference:En,range:x,nodeIds:v,edgeIndexes:k,progress:R,passProgress:A,passes:G,mostPasses:W,route:b.map(S=>S.nodeIds),steps:b.reduce((S,O)=>S+O.nodeIds.length,0),bp:g,referenceBp:ks(),missingBp:D,ownBp:C,...c.length>0?{readBp:Y,unreadBp:Z}:{}}}function Pl(e,t){let n=e.departures,o=[];if(n)for(let r=0;r<n.names.length;r++)$(n.names[r]).name===t&&o.push(Nn(n,r));return o}function fs(e,t,n,o,r){let s=o.field==="progress"||!r?void 0:$l(e,t,n,r),i=new Map,a=new Map;for(let[l,c]of n.passProgress){let f=s?.get(l),u=c.map((d,p)=>so(o,s?f?.[p]:d));i.set(l,u[0]),a.set(l,u)}return{colors:i,passColors:a}}function $l(e,t,n,o){let r=ut(e),s=new Map;for(let i of n.route){let a=Number.NaN,l=Number.NaN;for(let c of i){let f=t.get(c),u=f&&St(f,o);if(f&&u!==void 0&&I(f)){let p=r(f),h=f.length,m=p[0];if(p.length>1&&!Number.isNaN(a)){let b=1/0;for(let g of p){let w=Math.min(Math.abs(g-a),Math.abs(g+h-a));w<b&&(m=g,b=w)}u=(m+h/2-o.start)/o.span}a=m+h===l?m:m+h,l=m}let d=s.get(c);d?d.push(u):s.set(c,[u])}}return s}function Il(e,t,n){let o=new Set,r=0,s=e.referencePath;if(!s||n.reference)return{reversed:o,bp:r};let i=e.pathVisits;if(!i)return{reversed:o,bp:r};let a=i.pathIndex($(n.name).name),l=i.pathIndex(s);for(let c of n.progress.keys()){let f=t.get(c),u=f?i.slot(f.name):-1,d=u<0?-1:i.firstBy(u,a),p=u<0?-1:i.firstBy(u,l);d>=0&&p>=0&&i.reversed[d]!==i.reversed[p]&&(o.add(c),r+=f.length)}return{reversed:o,bp:r}}function Cl(e,t,n){let o=Al(e),r=new Set,s=t.filter(c=>!r.has(c.walk)&&r.add(c.walk)).flatMap(c=>{let f=Nl(e,c.walk,o);return f?[{walk:f,layer:c}]:[]}).sort((c,f)=>Number(f.walk.reference)-Number(c.walk.reference));if(s.length===0)return;let i=0,a=ro(s.map(({walk:c,layer:f})=>Tt(f,c.reference,c.reference?0:i++,s.length===1))),l=s.map(({walk:c},f)=>{let u=a[f],{reversed:d,bp:p}=Il(e,o.byId,c);return{...c,encoding:u,...fs(e,o.byId,c,u,n),reversed:d,reversedBp:p}});return us(l,n)}var Ll={field:"progress",scheme:"red"};function Bl(e,t,n,o){let r=ds(e);return t.walks.map(s=>{let i=n.find(l=>l.walk===s.name)?.color,a=Tt({walk:s.name,color:{...Ll,...i}},s.reference,0);return us([{...s,encoding:a,...fs(e,r,s,a,o)}],o)})}function us(e,t){return{walks:e,referenceDomain:t?{start:t.start,end:t.start+t.span}:void 0,nodeIds:new Set(e.flatMap(n=>[...n.nodeIds])),edgeIndexes:new Set(e.flatMap(n=>[...n.edgeIndexes])),names:new Set(e.map(n=>n.name))}}function Mn(e,t,n){let o=Math.round(t),r=Math.round(n);return`${e?`${e}:`:""}${pe(o+1)}-${pe(r)} (${L(r-o)})`}function Xl(e,t){let{field:n}=e.encoding,o=e.range?Mn(e.range.contig,e.range.start,e.range.end):void 0,r=n==="progress"?o:n==="reference"&&t?Mn(t.name,t.start,t.end):void 0,s=e.range?e.range.end-e.range.start:e.bp,i=s-e.bp-e.missingBp-e.ownBp,a=e.readBp??i,l=[[e.missingBp,q.missing],[e.ownBp,q.own],[e.readBp===void 0?0:i-e.readBp,q.unread],[a,ue]];return{delta:e.referenceBp===void 0||s===e.referenceBp?"":` ${s>e.referenceBp?"+":"\u2212"}${L(Math.abs(s-e.referenceBp))}`,gaps:l.filter(([c])=>c>0).map(([c,f])=>`, ${L(c)} ${f}`).join(""),reversed:e.reversedBp>0?`, ${L(e.reversedBp)} reversed`:"",shades:n!=="walk",scale:r,hover:r===o?void 0:o}}function Fl(e,t,n){let o=e.progress.get(t),r=e.range;if(o===void 0||!r)return;let s=Math.round(r.start+o*(r.end-r.start)-n/2);return`${r.contig}:${pe(s+1)}-${pe(s+n)}`}function Dl(e,t){let n=[];for(let o of t){let r=e.get(o.refName),s=r?.[0],i=r?.at(-1);if(!r||!s||!i)continue;let a=Math.max(o.start,s.bp0),l=Math.min(o.end,i.bp1);l<=a||n.push({gene:o,...Je(r,a,l),exons:o.exons.filter(c=>c.end>a&&c.start<l).map(c=>Je(r,Math.max(c.start,a),Math.min(c.end,l)))})}return n}var vn=22,ql=4,ot=8,Gl="11px sans-serif",Wl=8;function Yl(e){let t=e.flatMap(r=>[{x:r.x0,step:1},{x:r.x1,step:-1}]).sort((r,s)=>r.x-s.x||r.step-s.step),n=0,o=0;for(let{step:r}of t)n+=r,o=Math.max(o,n);return Math.min(ql,o)}function Hl(e,t,n,o,r=0){let{x:s,width:i,darkMode:a}=n,l=Math.max(1,Math.floor((o-r)/vn)),c=[],f=a?"#e0e0e6":"#1c1c22";e.font=Gl,e.textAlign="center",e.textBaseline="alphabetic",e.fillStyle=f,e.strokeStyle=f,e.lineWidth=1;let u=t.map(d=>({g:d,s0:s(d.x0),s1:s(d.x1)})).filter(({s0:d,s1:p})=>p>=0&&d<=i).sort((d,p)=>d.s0-p.s0);for(let{g:d,s0:p,s1:h}of u){let m=d.gene.strand>0?" \u2192":d.gene.strand<0?"\u2190 ":"",b=d.gene.strand<0?`${m}${d.gene.name}`:`${d.gene.name}${m}`,g=(Math.max(p,0)+Math.min(h,i))/2,w=e.measureText(b).width/2,M=Math.min(p,g-w),x=Math.max(h,g+w),y=c.findIndex(k=>k+Wl<=M);y===-1&&(y=Math.min(c.length,l-1)),c[y]=Math.max(c[y]??-1/0,x);let v=o-y*vn-ot/2;e.beginPath(),e.moveTo(p,v+.5),e.lineTo(h,v+.5),e.stroke();for(let k of d.exons){let R=s(k.x0);e.fillRect(R,v-ot/2,Math.max(1,s(k.x1)-R),ot)}e.fillText(b,g,v-ot/2-2)}}var Q=12,bs=Q+8,xs=8,ps=xs+3,jl=12;function Ul(e,{colorScheme:t,referenceRamp:n,walks:o}){let r=Et(e,n),s=[];return e.nodes.forEach((i,a)=>{if(I(i)){let l=o?o.map(c=>{let f=c.colors.get(i.id);return f===void 0?De:te(f)}):[te(kt(i,a,t,r))];s.push({node:i.id,bp0:i.stable.start,bp1:i.stable.start+i.length,colors:l,faded:l.includes(De)})}}),s.sort((i,a)=>i.bp0-a.bp0)}function Sn(e,t,n){let o=t*e.scale+e.translateX,r=n*e.scale+e.translateX;return o<r?[o,r]:[r,o]}var hs=2;function ys(e,t,n){let o=-t.translateX/t.scale,r=(n-t.translateX)/t.scale,s=Math.min(o,r),i=Math.max(o,r),a=0,l=0;for(let c of e)a+=Math.max(0,Math.min(c.bp1,s)-c.bp0),l+=Math.max(0,c.bp1-Math.max(c.bp0,i));return t.scale>=0?{left:Math.round(a),right:Math.round(l)}:{left:Math.round(l),right:Math.round(a)}}function Vl(e,t,n,o){if(o<0||o>Q+hs)return;let r,s=hs;for(let i of e){let[a,l]=Sn(t,i.bp0,i.bp1),c=Math.max(0,a-n,n-l);c<=s&&(s=c,r=i.node)}return r}function Kl(e,t){let n=e?.[Math.floor(e.length/2)];return n?t(n):void 0}function ws(e,t,n,o){let r=e.map(c=>{let[f,u]=Sn(t,c.bp0,c.bp1),d=Math.round(f*o);return{colors:c.colors,x0:f,px0:d,px1:Math.max(Math.round(u*o),d+1)}}).filter(c=>c.px1>0&&c.px0<n*o).sort((c,f)=>c.x0-f.x0),s=[],i=-1/0,a=[-1/0,-1/0];for(let{colors:c,px0:f,px1:u}of r){let d=Math.max(f,i);if(u>d){let p=a[0]<d?0:1;a[p]=u,s.push({colors:c,x0:d/o,x1:u/o,tier:p}),i=u}}return(s.length>0?s.at(-1).x1-s[0].x0:0)>=s.length*jl?s:s.map(({tier:c,...f})=>f)}function ms(e,t,n,o){let r=n>0?t:t-ps;e.clearRect(r,0,ps,Q);let s=t+n,i=s+n*xs;e.beginPath(),e.moveTo(s,Q/2),e.lineTo(i,0),e.lineTo(i,Q),e.closePath(),e.fillStyle=o,e.fill()}function gs(e,t,n){return Math.round(e*Q*n/t)/n}function zl(e,t,n,{width:o,lit:r,darkMode:s,dpr:i=1}){let a=s?"#ffffff":"#18181c";e.clearRect(0,0,o,bs);for(let c of ws(t,n,o,i)){let{tier:f}=c,u=f!==void 0&&c.colors.length===1,d=u?2:c.colors.length;c.colors.forEach((p,h)=>{let m=u?f:h,b=gs(m,d,i);e.fillStyle=p,e.fillRect(c.x0,b,c.x1-c.x0,gs(m+1,d,i)-b)})}let l=ys(t,n,o);if(l.left>0&&ms(e,0,1,a),l.right>0&&ms(e,o,-1,a),r){let[c,f]=Sn(n,r.start,r.end),u=Math.max(f-c,3),d=(c+f)/2-u/2;e.strokeStyle=a,e.lineWidth=1.5,e.strokeRect(d,.75,u,Q-1.5),r.anchor&&(e.beginPath(),e.moveTo(d+u/2,Q),e.lineTo(r.anchor.x,r.anchor.y),e.lineWidth=1,e.stroke())}}function Zl(e,t){return Math.abs(t-e)<=.1*Math.max(e,t)}function Jl(e,t){let n=e.length,o=t.length,r=Array.from({length:n+1},()=>new Array(o+1).fill(0)),s=Array.from({length:n+1},()=>new Array(o+1).fill(!1));for(let a=n-1;a>=0;a--)for(let l=o-1;l>=0;l--){let c=Math.abs(e[a]-t[l])+r[a+1][l+1],f=n-a>o-l?r[a+1][l]:1/0,u=o-l>n-a?r[a][l+1]:1/0;r[a][l]=Math.min(c,f,u),s[a][l]=r[a][l]===c}let i=new Array(n).fill(void 0);for(let a=0,l=0;a<n&&l<o;)s[a][l]?i[a++]=l++:n-a>o-l?a++:l++;return i}function Ms(e,t){return e.map((n,o)=>({item:n,i:o})).sort((n,o)=>t(n.item)-t(o.item))}var vs=e=>e.spanningReads!==0;function Ql(e,t){return{...t,agrees:e.complete&&vs(t)?Zl(e.bp,t.bp):void 0}}function ed(e,t){let n=new Map,o=new Set,r=Ms(e,i=>i.bp),s=(i,a)=>{let l=[[i.filter(c=>c.item.complete),a.filter(vs)],[i,a]];for(let[c,f]of l){let u=c.filter(p=>!n.has(p.i)),d=Ms(f.filter(p=>!o.has(p)),p=>p.bp);Jl(u.map(p=>p.item.bp),d.map(p=>p.item.bp)).forEach((p,h)=>{if(p!==void 0){let m=u[h],b=d[p].item;o.add(b),n.set(m.i,Ql(m.item,b))}})}};for(let i of new Set(t.flatMap(a=>a.haplotype??[])))s(r.filter(a=>a.item.haplotype===i),t.filter(a=>a.haplotype===i));return s(r,t.filter(i=>i.haplotype===void 0)),n}function pw(e,t){if(!t)return e;let n=new Map,o=new Map;for(let r of e){let s=o.get(r.sample);s?s.push(r):o.set(r.sample,[r])}for(let[r,s]of o){let i=t[r];if(i)for(let[a,l]of ed(s,i))n.set(s[a],l)}return e.map(r=>({...r,call:n.get(r)}))}var Ss=Ko.box(typeof devicePixelRatio>"u"?1:devicePixelRatio);function Es(){matchMedia(`(resolution: ${devicePixelRatio}dppx)`).addEventListener("change",()=>{zo(()=>{Ss.set(devicePixelRatio)}),Es()},{once:!0})}typeof matchMedia=="function"&&Es();function yw(e=0,t=0){return Ss.get(),he(e,t)}export{Tp as a,_p as b,Op as c,zo as d,Ap as e,ul as f,_i as g,Oi as h,cn as i,Vr as j,Om as k,Ic as l,Am as m,Dm as n,qm as o,P as p,Ai as q,Ni as r,Te as s,jt as t,Ue as u,Re as v,Ve as w,ze as x,_e as y,or as z,Wt as A,Xi as B,Fi as C,sr as D,Wi as E,ar as F,cr as G,Ut as H,Yi as I,Hi as J,dr as K,Oe as L,So as M,Vf as N,$t as O,We as P,_t as Q,Ye as R,Ts as S,_s as T,Os as U,As as V,Ld as W,ie as X,Eo as Y,Se as Z,At as _,Ks as $,Bd as aa,Xd as ba,Zs as ca,Js as da,Qs as ea,ei as fa,ti as ga,ru as ha,su as ia,iu as ja,au as ka,cu as la,lu as ma,du as na,fu as oa,uu as pa,pu as qa,hu as ra,mu as sa,gu as ta,bu as ua,xu as va,yu as wa,wu as xa,Mu as ya,vu as za,oi as Aa,Su as Ba,Eu as Ca,ku as Da,Ru as Ea,Tu as Fa,_u as Ga,Ou as Ha,Zi as Ia,Qi as Ja,ea as Ka,ta as La,Bm as Ma,Kt as Na,na as Oa,pr as Pa,la as Qa,da as Ra,ua as Sa,pa as Ta,xr as Ua,pg as Va,qc as Wa,hg as Xa,bg as Ya,xg as Za,Uc as _a,Jc as $a,tt as ab,gn as bb,hn as cb,nl as db,rl as eb,bn as fb,R0 as gb,T0 as hb,_0 as ib,il as jb,al as kb,O0 as lb,A0 as mb,N0 as nb,pl as ob,as as pb,hl as qb,ib as rb,gl as sb,ab as tb,cb as ub,cs as vb,lb as wb,db as xb,xl as yb,fb as zb,ub as Ab,pb as Bb,hb as Cb,mb as Db,gb as Eb,bb as Fb,xb as Gb,yb as Hb,Nu as Ib,Ct as Jb,Lu as Kb,El as Lb,vb as Mb,Sb as Nb,Zu as Ob,Yo as Pb,Ju as Qb,Ee as Rb,ke as Sb,qu as Tb,jo as Ub,Uo as Vb,Ei as Wb,ki as Xb,_l as Yb,Cl as Zb,Bl as _b,Mn as $b,Xl as ac,Fl as bc,Dl as cc,vn as dc,Yl as ec,Hl as fc,bs as gc,Ul as hc,ys as ic,Vl as jc,Kl as kc,zl as lc,pw as mc,yw as nc};
|
|
3
|
+
//# sourceMappingURL=chunk-3ETSJ4Z2.js.map
|