jbrowse-plugin-graphgenomeviewer 7.2.0 → 7.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/dist/chunks/GbzBaseSyntenyAdapter-FXMGIM7Z.js +2 -0
  2. package/dist/chunks/{GbzBaseSyntenyAdapter-NB6WBBZH.js.map → GbzBaseSyntenyAdapter-FXMGIM7Z.js.map} +3 -3
  3. package/dist/chunks/{GraphGenomeView-4O5F5I37.js → GraphGenomeView-WJ3FIDY2.js} +2 -2
  4. package/dist/chunks/{GraphTrackSettingsDialog-WZEJAF7F.js → GraphTrackSettingsDialog-ZW7ALMDV.js} +2 -2
  5. package/dist/chunks/{HighlightColorDialog-SRT2FPXP.js → HighlightColorDialog-VBZRUKD5.js} +2 -2
  6. package/dist/chunks/{LinearGraphDisplay-Z33PVCJL.js → LinearGraphDisplay-SPOPTJEN.js} +2 -2
  7. package/dist/chunks/MinigraphBubbleAdapter-QCOMFPLL.js +2 -0
  8. package/dist/chunks/{MinigraphBubbleAdapter-HDLUZ6YF.js.map → MinigraphBubbleAdapter-QCOMFPLL.js.map} +1 -1
  9. package/dist/chunks/RgfaTabixAdapter-O3NMNRZ2.js +2 -0
  10. package/dist/chunks/RgfaTabixAdapter-O3NMNRZ2.js.map +7 -0
  11. package/dist/chunks/WalkTabixSyntenyAdapter-7VDCNSFD.js +2 -0
  12. package/dist/chunks/WalkTabixSyntenyAdapter-7VDCNSFD.js.map +7 -0
  13. package/dist/chunks/chunk-2M4XYSLG.js +2 -0
  14. package/dist/chunks/chunk-2M4XYSLG.js.map +7 -0
  15. package/dist/chunks/{chunk-JLGPQO5L.js → chunk-2O3YVA2I.js} +2 -2
  16. package/dist/chunks/{chunk-CWNJR5XB.js → chunk-44CJ2N3N.js} +1 -1
  17. package/dist/chunks/{chunk-CWNJR5XB.js.map → chunk-44CJ2N3N.js.map} +1 -1
  18. package/dist/chunks/chunk-6KUHGRHU.js +2 -0
  19. package/dist/chunks/chunk-6KUHGRHU.js.map +7 -0
  20. package/dist/chunks/chunk-6MUBJVBG.js +2 -0
  21. package/dist/chunks/chunk-6MUBJVBG.js.map +7 -0
  22. package/dist/chunks/{chunk-GUXZESDR.js → chunk-7HWHWPRW.js} +1 -1
  23. package/dist/chunks/{chunk-GUXZESDR.js.map → chunk-7HWHWPRW.js.map} +1 -1
  24. package/dist/chunks/chunk-B2EP6FOQ.js +3 -0
  25. package/dist/chunks/chunk-B2EP6FOQ.js.map +7 -0
  26. package/dist/chunks/{chunk-44HZPYGC.js → chunk-BXRTG7FU.js} +2 -2
  27. package/dist/chunks/{chunk-44HZPYGC.js.map → chunk-BXRTG7FU.js.map} +1 -1
  28. package/dist/chunks/{chunk-HLKZCTQ3.js → chunk-DBPEUVUC.js} +1 -1
  29. package/dist/chunks/{chunk-HLKZCTQ3.js.map → chunk-DBPEUVUC.js.map} +1 -1
  30. package/dist/chunks/{chunk-FME624X3.js → chunk-DUR437TH.js} +2 -2
  31. package/dist/chunks/{chunk-FME624X3.js.map → chunk-DUR437TH.js.map} +1 -1
  32. package/dist/chunks/{chunk-6WA6WF6A.js → chunk-FIRQAKMX.js} +1 -1
  33. package/dist/chunks/{chunk-6WA6WF6A.js.map → chunk-FIRQAKMX.js.map} +1 -1
  34. package/dist/chunks/chunk-JCAZTNYG.js +2 -0
  35. package/dist/chunks/chunk-JCAZTNYG.js.map +7 -0
  36. package/dist/chunks/chunk-N74HGPAW.js +3 -0
  37. package/dist/chunks/chunk-N74HGPAW.js.map +7 -0
  38. package/dist/chunks/chunk-PEDWEPNK.js +2 -0
  39. package/dist/chunks/chunk-PEDWEPNK.js.map +7 -0
  40. package/dist/chunks/chunk-PYQG3JHP.js +3 -0
  41. package/dist/chunks/chunk-PYQG3JHP.js.map +7 -0
  42. package/dist/chunks/chunk-RFDSEB2X.js +4 -0
  43. package/dist/chunks/chunk-RFDSEB2X.js.map +7 -0
  44. package/dist/chunks/{chunk-O7Y7LYN6.js → chunk-RW775LQN.js} +2 -2
  45. package/dist/chunks/{chunk-O7Y7LYN6.js.map → chunk-RW775LQN.js.map} +1 -1
  46. package/dist/chunks/{chunk-N4WBX2OS.js → chunk-VQ77X5QU.js} +2 -2
  47. package/dist/chunks/{chunk-N4WBX2OS.js.map → chunk-VQ77X5QU.js.map} +1 -1
  48. package/dist/chunks/{chunk-LXCMWL7B.js → chunk-WUSKVEA6.js} +2 -2
  49. package/dist/chunks/{chunk-LXCMWL7B.js.map → chunk-WUSKVEA6.js.map} +1 -1
  50. package/dist/chunks/{chunk-ZNT7TQLN.js → chunk-YKSUKPYY.js} +2 -2
  51. package/dist/chunks/chunk-YKSUKPYY.js.map +7 -0
  52. package/dist/chunks/{renderSvg-RRWCAEGF.js → renderSvg-WD6YDV2I.js} +2 -2
  53. package/dist/jbrowse-plugin-graphgenomeviewer.esm.js +4 -4
  54. package/dist/jbrowse-plugin-graphgenomeviewer.esm.js.map +4 -4
  55. package/package.json +3 -3
  56. package/src/GbzBaseSyntenyAdapter/GbzBaseSyntenyAdapter.test.ts +2 -2
  57. package/src/GbzBaseSyntenyAdapter/GbzBaseSyntenyAdapter.ts +1 -1
  58. package/src/GetSubgraph.ts +1 -1
  59. package/src/GraphGenomeView/genes/genes.test.ts +20 -2
  60. package/src/GraphGenomeView/legendSections.test.ts +1 -1
  61. package/src/GraphGenomeView/legendSections.ts +1 -7
  62. package/src/GraphGenomeView/model.test.ts +1 -2
  63. package/src/GraphGenomeView/pane/graphViews.ts +24 -35
  64. package/src/GraphGenomeView/pane/loadActions.ts +4 -3
  65. package/src/GraphGenomeView/pane/paneBase.ts +1 -1
  66. package/src/GraphGenomeView/subgraphLoad.test.ts +41 -1
  67. package/src/GraphGenomeView/walkRowsCut.ts +10 -44
  68. package/src/RgfaTabixAdapter/RgfaTabixAdapter.test.ts +23 -4
  69. package/src/RgfaTabixAdapter/RgfaTabixAdapter.ts +2 -3
  70. package/src/RgfaTabixAdapter/bubbleTier.test.ts +1 -1
  71. package/src/RgfaTabixAdapter/test_data/walks3_inversion.GRCh38.walks.bed.gz +0 -0
  72. package/src/RgfaTabixAdapter/test_data/walks3_inversion.GRCh38.walks.bed.gz.tbi +0 -0
  73. package/src/RgfaTabixAdapter/walkCut.ts +20 -0
  74. package/src/RgfaTabixAdapter/walkFiles.test.ts +2 -2
  75. package/src/RgfaTabixAdapter/walkReader.ts +1 -1
  76. package/src/WalkTabixSyntenyAdapter/WalkTabixSyntenyAdapter.test.ts +77 -1
  77. package/src/WalkTabixSyntenyAdapter/WalkTabixSyntenyAdapter.ts +2 -2
  78. package/src/WalkTabixSyntenyAdapter/walkLanes.ts +55 -18
  79. package/src/version.ts +1 -1
  80. package/dist/chunks/GbzBaseSyntenyAdapter-NB6WBBZH.js +0 -2
  81. package/dist/chunks/MinigraphBubbleAdapter-HDLUZ6YF.js +0 -2
  82. package/dist/chunks/RgfaTabixAdapter-XZRTWQMZ.js +0 -3
  83. package/dist/chunks/RgfaTabixAdapter-XZRTWQMZ.js.map +0 -7
  84. package/dist/chunks/WalkTabixSyntenyAdapter-WBHOZLAN.js +0 -2
  85. package/dist/chunks/WalkTabixSyntenyAdapter-WBHOZLAN.js.map +0 -7
  86. package/dist/chunks/chunk-BWP3XYKD.js +0 -2
  87. package/dist/chunks/chunk-BWP3XYKD.js.map +0 -7
  88. package/dist/chunks/chunk-EDSIYH4H.js +0 -2
  89. package/dist/chunks/chunk-EDSIYH4H.js.map +0 -7
  90. package/dist/chunks/chunk-III4GT4G.js +0 -2
  91. package/dist/chunks/chunk-III4GT4G.js.map +0 -7
  92. package/dist/chunks/chunk-N5GYTUIL.js +0 -3
  93. package/dist/chunks/chunk-N5GYTUIL.js.map +0 -7
  94. package/dist/chunks/chunk-PA4HKAUJ.js +0 -2
  95. package/dist/chunks/chunk-PA4HKAUJ.js.map +0 -7
  96. package/dist/chunks/chunk-PFAHNHMM.js +0 -2
  97. package/dist/chunks/chunk-PFAHNHMM.js.map +0 -7
  98. package/dist/chunks/chunk-UFQTIWSN.js +0 -4
  99. package/dist/chunks/chunk-UFQTIWSN.js.map +0 -7
  100. package/dist/chunks/chunk-VDHDEEMF.js +0 -2
  101. package/dist/chunks/chunk-VDHDEEMF.js.map +0 -7
  102. package/dist/chunks/chunk-WGVATZLM.js +0 -3
  103. package/dist/chunks/chunk-WGVATZLM.js.map +0 -7
  104. package/dist/chunks/chunk-ZNT7TQLN.js.map +0 -7
  105. package/src/RgfaTabixAdapter/rgfaBed.test.ts +0 -254
  106. package/src/RgfaTabixAdapter/rgfaBed.ts +0 -314
  107. package/src/RgfaTabixAdapter/rgfaCut.ts +0 -139
  108. package/src/RgfaTabixAdapter/walkRowRuns.test.ts +0 -192
  109. package/src/RgfaTabixAdapter/walkRowRuns.ts +0 -520
  110. /package/dist/chunks/{GraphGenomeView-4O5F5I37.js.map → GraphGenomeView-WJ3FIDY2.js.map} +0 -0
  111. /package/dist/chunks/{GraphTrackSettingsDialog-WZEJAF7F.js.map → GraphTrackSettingsDialog-ZW7ALMDV.js.map} +0 -0
  112. /package/dist/chunks/{HighlightColorDialog-SRT2FPXP.js.map → HighlightColorDialog-VBZRUKD5.js.map} +0 -0
  113. /package/dist/chunks/{LinearGraphDisplay-Z33PVCJL.js.map → LinearGraphDisplay-SPOPTJEN.js.map} +0 -0
  114. /package/dist/chunks/{chunk-JLGPQO5L.js.map → chunk-2O3YVA2I.js.map} +0 -0
  115. /package/dist/chunks/{renderSvg-RRWCAEGF.js.map → renderSvg-WD6YDV2I.js.map} +0 -0
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../node_modules/.pnpm/@jbrowse+bandage-core@11.0.0/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-TGUFT6KK.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@11.0.0/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-3PZSBNLI.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@11.0.0/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-CKUVEHSS.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@11.0.0/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-OPPVSPEF.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@11.0.0/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-VPE4AYP7.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@11.0.0/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-5I3K4R2G.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@11.0.0/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-FFHJGWDK.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@11.0.0/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-3XSRT7RQ.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@11.0.0/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-KDU4EF66.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@11.0.0/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-RNYPCQZ3.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@11.0.0/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-AI5PTOSV.js", "host:@jbrowse/render-core/RenderLifecycleMixin", "../../src/GraphGenomeView/lenientEnum.ts", "../../src/GraphGenomeView/pane/paneBase.ts", "../../node_modules/.pnpm/@jbrowse+bandage-core@11.0.0/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-V4YML3GR.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@11.0.0/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-RBCE2OQH.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@11.0.0/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-EJRJAAN7.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@11.0.0/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-3VCKBSML.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@11.0.0/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-OMUPUB4J.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@11.0.0/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-PSCSZSVK.js", "host:mobx", "../../node_modules/.pnpm/@jbrowse+bandage-core@11.0.0/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-A7H753BA.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@11.0.0/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-H2H4Y3TV.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@11.0.0/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-XZ6PQBU6.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@11.0.0/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-A4JDEUAI.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@11.0.0/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-HSVFCA2J.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@11.0.0/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-2ZT7ZF7A.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@11.0.0/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-CIDSF47D.js", "../../node_modules/.pnpm/@jbrowse+tubemap-core@2.0.1/node_modules/@jbrowse/tubemap-core/src/groupBy.ts", "../../node_modules/.pnpm/@jbrowse+tubemap-core@2.0.1/node_modules/@jbrowse/tubemap-core/src/panSN.ts", "../../node_modules/.pnpm/@jbrowse+tubemap-core@2.0.1/node_modules/@jbrowse/tubemap-core/src/layout.ts", "../../node_modules/.pnpm/@jbrowse+tubemap-core@2.0.1/node_modules/@jbrowse/tubemap-core/src/geometry.ts", "../../node_modules/.pnpm/@jbrowse+bandage-core@11.0.0/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-PK5QQOMN.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@11.0.0/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-EY2ZGSCP.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@11.0.0/node_modules/@jbrowse/bandage-core/dist/tubeMap/deviations.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@11.0.0/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-MYDHU2UV.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@11.0.0/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-BX4AUMZE.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@11.0.0/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-L5IETLWP.js", "host:@jbrowse/core/util/groupKeys", "../../src/GraphGenomeView/walkRowGroups.ts", "../../node_modules/.pnpm/@jbrowse+bandage-core@11.0.0/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-3GLG3ZLE.js", "../../src/GraphGenomeView/tubeMapPanels.ts", "../../node_modules/.pnpm/@jbrowse+bandage-core@11.0.0/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-JSUCGZ6K.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@11.0.0/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-D4ZFRBB4.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@11.0.0/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-6EOB6ANX.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@11.0.0/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-3UST3ZQE.js", "../../src/GraphGenomeView/repeats/walkCalls.ts", "../../src/GraphGenomeView/trackedDpr.ts"],
4
- "sourcesContent": ["import {\n panSNFields\n} from \"./chunk-4XWZNPQ2.js\";\n\n// src/facetGrid.ts\nvar FACET_GAP_PX = 8;\nvar FACET_TITLE_PX = 34;\nvar FACET_PAD_PX = 12;\nvar MIN_FACET_PANEL_PX = 60;\nfunction facetGrid({\n count,\n bounds,\n pixelRows,\n width,\n room,\n columns\n}) {\n function tile(across) {\n const rows = Math.ceil(count / across);\n const panelWidth = Math.floor(\n (width - (across - 1) * FACET_GAP_PX) / across\n );\n const panelRoom = (room - rows * FACET_TITLE_PX - (rows - 1) * FACET_GAP_PX) / rows;\n const fitX = (panelWidth - 2 * FACET_PAD_PX) / bounds.w;\n const fitY = bounds.h > 0 ? (panelRoom - 2 * FACET_PAD_PX) / bounds.h : Infinity;\n const scale = pixelRows ? fitX : Math.min(fitX, fitY);\n const drawn = pixelRows ? bounds.h : bounds.h * scale;\n const height = Math.floor(\n Math.max(\n MIN_FACET_PANEL_PX,\n Math.min(drawn + 2 * FACET_PAD_PX, panelRoom)\n )\n );\n return {\n columns: across,\n width: panelWidth,\n height,\n scale,\n total: rows * (height + FACET_TITLE_PX) + (rows - 1) * FACET_GAP_PX\n };\n }\n if (columns !== void 0) {\n return tile(Math.max(1, Math.min(count, Math.round(columns))));\n }\n let best = tile(1);\n for (let across = 2; across <= count; across++) {\n const grid = tile(across);\n if (grid.scale > best.scale) {\n best = grid;\n }\n }\n return best;\n}\nvar FACET_FIELDS = [\n { value: \"\", label: \"None\", description: \"Every lifted walk in one drawing\" },\n {\n value: \"walk\",\n label: \"A panel per walk\",\n description: \"One panel per lifted walk, side by side\"\n },\n {\n value: \"sample\",\n label: \"A row per sample\",\n description: \"A row per sample, a column per haplotype\"\n }\n];\nfunction facetSettingOf(facet) {\n const raw = typeof facet === \"string\" ? { field: facet } : facet ?? {};\n const field = raw.field === \"walk\" || raw.field === \"sample\" ? raw.field : \"\";\n return {\n field,\n domain: [...raw.domain ?? []],\n ...raw.columns === void 0 ? {} : { columns: raw.columns }\n };\n}\nfunction domainFirst(names, domain) {\n const rank = new Map(domain.map((name, i) => [name, i]));\n const listed = (name) => rank.get(name) ?? domain.length;\n return names.map((name, i) => ({ name, i })).sort((a, b) => listed(a.name) - listed(b.name) || a.i - b.i).map(({ name }) => name);\n}\nfunction facetCells(names, by, domain = []) {\n const wrapOrder = domainFirst(names, domain);\n const wrap = {\n columns: void 0,\n count: names.length,\n cells: names.map((name) => wrapOrder.indexOf(name))\n };\n if (by === \"walk\") {\n return wrap;\n }\n const places = names.map((name) => {\n const fields = panSNFields(name);\n return fields && Number.isInteger(fields.haplotype) && fields.haplotype >= 0 ? { sample: fields.sample, column: Math.max(0, fields.haplotype - 1) } : void 0;\n });\n const rows = domainFirst(\n [...new Set(places.flatMap((p) => p ? [p.sample] : []))],\n domain\n );\n const columns = Math.max(1, ...places.map((p) => p ? p.column + 1 : 1));\n const cells = places.map(\n (p) => p ? rows.indexOf(p.sample) * columns + p.column : -1\n );\n return cells.includes(-1) || new Set(cells).size < cells.length ? wrap : { columns, count: rows.length * columns, cells };\n}\n\nexport {\n FACET_GAP_PX,\n FACET_TITLE_PX,\n FACET_PAD_PX,\n facetGrid,\n FACET_FIELDS,\n facetSettingOf,\n facetCells\n};\n", "import {\n isBackbone\n} from \"./chunk-RJWPJCIB.js\";\n\n// src/layout/orientToReference.ts\nfunction orientToReference(graph, positions) {\n const backbone = graph.nodes.filter(\n (node) => isBackbone(node) && (positions[node.id]?.length ?? 0) > 0\n );\n if (backbone.length < 2) {\n return positions;\n }\n const points = backbone.map((node) => {\n const segments = positions[node.id];\n const mid = segments[Math.floor(segments.length / 2)];\n return {\n x: mid.x,\n y: mid.y,\n r: node.stable.start + node.length / 2,\n w: node.length\n };\n });\n const weight = points.reduce((sum, p) => sum + p.w, 0);\n if (weight === 0) {\n return positions;\n }\n const cx = points.reduce((sum, p) => sum + p.x * p.w, 0) / weight;\n const cy = points.reduce((sum, p) => sum + p.y * p.w, 0) / weight;\n const cr = points.reduce((sum, p) => sum + p.r * p.w, 0) / weight;\n let sxr = 0;\n let syr = 0;\n for (const p of points) {\n sxr += p.w * (p.x - cx) * (p.r - cr);\n syr += p.w * (p.y - cy) * (p.r - cr);\n }\n const angle = -Math.atan2(syr, sxr);\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n const out = {};\n for (const [id, segments] of Object.entries(positions)) {\n out[id] = segments.map((p) => {\n const x = p.x - cx;\n const y = p.y - cy;\n return { x: cx + c * x - s * y, y: cy + s * x + c * y };\n });\n }\n let below = 0;\n let above = 0;\n for (const node of graph.nodes) {\n if (isBackbone(node)) {\n continue;\n }\n for (const p of out[node.id] ?? []) {\n if (p.y > cy) {\n below++;\n } else {\n above++;\n }\n }\n }\n if (above > below) {\n for (const segments of Object.values(out)) {\n for (const p of segments) {\n p.y = 2 * cy - p.y;\n }\n }\n }\n return out;\n}\n\nexport {\n orientToReference\n};\n", "import {\n buildNeighbors\n} from \"./chunk-VX656OAZ.js\";\nimport {\n drawnNodeLength\n} from \"./chunk-34BOZKIE.js\";\nimport {\n isBackbone\n} from \"./chunk-RJWPJCIB.js\";\n\n// src/layout/referenceSeeds.ts\nvar LANE_GAP = 30;\nfunction referenceSeeds(graph, scaling) {\n const { opts } = scaling;\n const drawn = new Map(\n scaling.nodes.map((node) => [node.id, drawnNodeLength(opts, node.length)])\n );\n const drawnOf = (id) => drawn.get(id) ?? opts.minimumNodeLength;\n const backbone = graph.nodes.filter(isBackbone).sort((a, b) => a.stable.start - b.stable.start);\n const seeds = /* @__PURE__ */ new Map();\n let x = 0;\n for (const node of backbone) {\n seeds.set(node.id, { x, y: 0 });\n x += drawnOf(node.id) + opts.edgeLength;\n }\n const adjacent = buildNeighbors(graph);\n const depth = new Map(backbone.map((node) => [node.id, 0]));\n const queue = backbone.map((node) => node.id);\n for (const id of queue) {\n const at = seeds.get(id);\n const next = depth.get(id) + 1;\n for (const neighbour of adjacent.get(id) ?? []) {\n if (depth.has(neighbour)) {\n continue;\n }\n depth.set(neighbour, next);\n seeds.set(neighbour, { x: at.x + drawnOf(id) / 2, y: LANE_GAP * next });\n queue.push(neighbour);\n }\n }\n let unreached = 0;\n for (const node of graph.nodes) {\n if (!seeds.has(node.id)) {\n seeds.set(node.id, {\n x: unreached++ * x / graph.nodes.length,\n y: LANE_GAP * 3\n });\n }\n }\n return seeds;\n}\nfunction seededNodes(graph, scaling) {\n const seeds = referenceSeeds(graph, scaling);\n return scaling.nodes.map((node) => ({ ...node, ...seeds.get(node.id) }));\n}\n\nexport {\n referenceSeeds,\n seededNodes\n};\n", "// src/layout/smoothChains.ts\nvar STEP_TURN = Math.PI / 24;\nfunction turnAt(line, i) {\n const a = line[i - 1];\n const b = line[i];\n const c = line[i + 1];\n if (!a || !c) {\n return 0;\n }\n const t = Math.abs(\n Math.atan2(c.y - b.y, c.x - b.x) - Math.atan2(b.y - a.y, b.x - a.x)\n );\n return t > Math.PI ? 2 * Math.PI - t : t;\n}\nfunction centripetal(p0, p1, p2, p3, u) {\n const knot = (a, b) => Math.max(Math.hypot(b.x - a.x, b.y - a.y) ** 0.5, 1e-9);\n const t1 = knot(p0, p1);\n const t2 = t1 + knot(p1, p2);\n const t3 = t2 + knot(p2, p3);\n const t = t1 + u * (t2 - t1);\n const lerp = (a, b, ta, tb) => {\n const f = (t - ta) / (tb - ta);\n return { x: a.x + (b.x - a.x) * f, y: a.y + (b.y - a.y) * f };\n };\n const a1 = lerp(p0, p1, 0, t1);\n const a2 = lerp(p1, p2, t1, t2);\n const a3 = lerp(p2, p3, t2, t3);\n return lerp(lerp(a1, a2, 0, t2), lerp(a2, a3, t1, t3), t1, t2);\n}\nvar reflect = (p, about) => ({\n x: 2 * about.x - p.x,\n y: 2 * about.y - p.y\n});\nfunction smoothChain(line) {\n if (line.length < 3) {\n return line;\n }\n const out = [line[0]];\n for (let i = 0; i + 1 < line.length; i++) {\n const p1 = line[i];\n const p2 = line[i + 1];\n const steps = Math.ceil(\n Math.max(turnAt(line, i), turnAt(line, i + 1)) / STEP_TURN\n );\n const p0 = line[i - 1] ?? reflect(p2, p1);\n const p3 = line[i + 2] ?? reflect(p1, p2);\n for (let s = 1; s < steps; s++) {\n out.push(centripetal(p0, p1, p2, p3, s / steps));\n }\n out.push(p2);\n }\n return out;\n}\n\nexport {\n smoothChain\n};\n", "// src/layout/deletionRoutes.ts\nimport { ROUTE_ID } from \"@jbrowse/graph-stress-layout\";\nvar ROUTE_FRACTION = 0.5;\nfunction withDeletionRoutes(graph, deletions, dropped = /* @__PURE__ */ new Set()) {\n const routes = new Map(\n deletions.map((d) => [d.edgeIndex, `${ROUTE_ID}${d.edgeIndex}`])\n );\n const edges = [];\n graph.edges.forEach((edge, ei) => {\n const id = routes.get(ei);\n if (dropped.has(ei)) {\n return;\n }\n if (id === void 0) {\n edges.push(edge);\n } else {\n const { fromStrand, toStrand } = edge;\n edges.push(\n { from: edge.from, to: id, ...fromStrand ? { fromStrand } : {} },\n { from: id, to: edge.to, ...toStrand ? { toStrand } : {} }\n );\n }\n });\n return {\n graph: {\n ...graph,\n nodes: [\n ...graph.nodes,\n ...[...routes.values()].map((id) => ({\n id,\n name: id,\n length: 0,\n depth: 0\n }))\n ],\n edges\n },\n routes,\n ids: new Set(routes.values())\n };\n}\nfunction routeNodes(graph, deletions, routes, drawnOf, opts) {\n const lengths = new Map(graph.nodes.map((n) => [n.id, n.length]));\n return deletions.map((d) => {\n const skipped = d.bypassed.reduce(\n (sum, id2) => sum + (lengths.get(id2) ?? 0),\n 0\n );\n const drawn = Math.max(\n opts.minimumNodeLength,\n drawnOf(skipped) * ROUTE_FRACTION\n );\n const id = routes.get(d.edgeIndex);\n return {\n id,\n name: id,\n length: Math.round(drawn * 1e6 / opts.nodeLengthPerMegabase),\n depth: 0\n };\n });\n}\nfunction takeRoutes(positions, routes) {\n const nodePositions = { ...positions };\n const deletionRoutes = {};\n for (const [edgeIndex, id] of routes) {\n const route = nodePositions[id];\n delete nodePositions[id];\n if (route?.length) {\n deletionRoutes[edgeIndex] = route;\n }\n }\n return { nodePositions, deletionRoutes };\n}\n\nexport {\n withDeletionRoutes,\n routeNodes,\n takeRoutes\n};\n", "// src/gfa-core/gfaParser.ts\nfunction parseTag(tag, tags) {\n const nameEnd = tag.indexOf(\":\");\n const typeEnd = tag.indexOf(\":\", nameEnd + 1);\n if (nameEnd !== -1 && typeEnd !== -1) {\n const name = tag.slice(0, nameEnd);\n const type = tag.slice(nameEnd + 1, typeEnd);\n const val = tag.slice(typeEnd + 1);\n if (type === \"i\" || type === \"f\") {\n tags[name] = +val;\n } else if (type === \"Z\") {\n tags[name] = val;\n }\n }\n}\nfunction parseTags(fields) {\n const tags = {};\n for (const field of fields) {\n parseTag(field, tags);\n }\n return tags;\n}\nfunction stableCoordinate(node) {\n const { SN, SO, SR } = node.tags;\n return typeof SN === \"string\" && typeof SO === \"number\" && typeof SR === \"number\" ? { refName: SN, start: SO, rank: SR } : void 0;\n}\nvar GT = 62;\nvar LT = 60;\nfunction parseWalkBody(body) {\n const segments = [];\n let strand = \"+\";\n let start = 0;\n function push(end) {\n if (end > start) {\n segments.push({ id: body.slice(start, end), strand });\n }\n }\n for (let i = 0; i < body.length; i++) {\n const ch = body.charCodeAt(i);\n if (ch === GT || ch === LT) {\n push(i);\n strand = ch === GT ? \"+\" : \"-\";\n start = i + 1;\n }\n }\n push(body.length);\n return segments;\n}\nfunction parseGFA(file) {\n const graph = {\n nodes: [],\n links: [],\n paths: [],\n walks: [],\n header: [],\n id: \"\"\n };\n for (const rawLine of file.split(\"\\n\")) {\n const line = rawLine.endsWith(\"\\r\") ? rawLine.slice(0, -1) : rawLine;\n const type = line.split(\"\t\", 1)[0];\n if (type === \"H\") {\n const [, ...rest] = line.split(\"\t\");\n graph.header.push(parseTags(rest));\n } else if (type === \"S\") {\n const [, name, ...rest] = line.split(\"\t\");\n let len;\n let seq;\n let tagfields;\n let gfa1 = false;\n const first = rest[0] ?? \"*\";\n if (/^\\d+$/.test(first)) {\n len = +first;\n seq = rest[1] ?? \"*\";\n tagfields = rest.slice(2);\n } else {\n gfa1 = true;\n seq = first;\n len = seq === \"*\" ? 0 : seq.length;\n tagfields = rest.slice(1);\n }\n const tags = parseTags(tagfields);\n if (gfa1 && \"LN\" in tags) {\n len = +tags.LN;\n }\n graph.nodes.push({ id: name, length: len, sequence: seq, tags });\n } else if (type === \"E\") {\n const [, , source, target, , , , , cigar, ...rest] = line.split(\"\t\");\n if (source && target) {\n graph.links.push({\n source: source.slice(0, -1),\n target: target.slice(0, -1),\n strand1: source.at(-1),\n strand2: target.at(-1),\n cigar: cigar ?? \"*\",\n tags: parseTags(rest)\n });\n }\n } else if (type === \"L\") {\n const [, source, strand1, target, strand2, cigar, ...rest] = line.split(\"\t\");\n if (source && target && strand2) {\n graph.links.push({\n source,\n target,\n strand1,\n strand2,\n cigar: cigar ?? \"*\",\n tags: parseTags(rest)\n });\n }\n } else if (type === \"W\") {\n const [, sample, hap, contig, start, end, body, ...rest] = line.split(\"\t\");\n if (sample && hap && contig && start && end && body) {\n graph.walks.push({\n sample,\n haplotype: +hap,\n contig,\n start: start === \"*\" ? -1 : +start,\n end: end === \"*\" ? -1 : +end,\n segments: parseWalkBody(body),\n tags: parseTags(rest)\n });\n }\n } else if (type === \"P\") {\n const [, name, path, ...rest] = line.split(\"\t\");\n if (name && path) {\n graph.paths.push({ name, path, rest });\n }\n }\n }\n return graph;\n}\n\nexport {\n stableCoordinate,\n parseGFA\n};\n", "import {\n stableCoordinate\n} from \"./chunk-5I3K4R2G.js\";\nimport {\n pathOrigin,\n surveyPaths\n} from \"./chunk-B5X2RLJG.js\";\nimport {\n walkStopFields\n} from \"./chunk-EIY2SKD3.js\";\n\n// src/gfa/gfaConverter.ts\nfunction surveySegments(gfaGraph, pathSteps) {\n const canonical = /* @__PURE__ */ new Map();\n const traversals = /* @__PURE__ */ new Map();\n function claim(id, strand) {\n if (!canonical.has(id)) {\n canonical.set(id, strand);\n }\n }\n function traverse(id, strand) {\n const seen = traversals.get(id);\n if (seen === void 0) {\n claim(id, strand);\n }\n traversals.set(id, (seen ?? 0) + 1);\n }\n for (const link of gfaGraph.links) {\n claim(link.source, link.strand1 === \"-\" ? \"-\" : \"+\");\n claim(link.target, link.strand2 === \"-\" ? \"-\" : \"+\");\n }\n for (const { steps } of pathSteps) {\n for (const step of steps) {\n traverse(step.id, step.strand);\n }\n }\n for (const walk of gfaGraph.walks) {\n for (const step of walk.segments) {\n traverse(step.id, step.strand);\n }\n }\n return { canonical, traversals };\n}\nvar walkStart = (w) => w.start === -1 ? 0 : w.start;\nfunction stepsOfPath(p) {\n return {\n ...pathOrigin(p.name),\n steps: p.path.split(\",\").map((segment) => ({\n id: segment.slice(0, -1),\n strand: segment.endsWith(\"-\") ? \"-\" : \"+\"\n }))\n };\n}\nfunction anchorablePaths(gfaGraph, pathSteps) {\n return [\n ...pathSteps,\n ...gfaGraph.walks.map((w) => ({\n name: `${w.sample}#${w.haplotype}#${w.contig}`,\n start: walkStart(w),\n steps: w.segments\n }))\n ];\n}\nfunction carriedSamples(gfaNode) {\n const sm = gfaNode.tags.SM;\n if (typeof sm !== \"string\") {\n return void 0;\n }\n const samples = sm.split(\",\").map((s) => s.trim()).filter(Boolean);\n return samples.length > 0 ? samples : void 0;\n}\nvar positive = (v) => typeof v === \"number\" && v > 0 ? v : void 0;\nfunction statedDepth({ tags, length }) {\n const count = positive(tags.RC) ?? positive(tags.FC) ?? positive(tags.KC);\n return positive(tags.dp) ?? positive(tags.DP) ?? (count !== void 0 && length > 0 ? count / length : void 0);\n}\nfunction makeNode(gfaNode, strand, depth) {\n return {\n id: `${gfaNode.id}${strand}`,\n name: gfaNode.id,\n length: gfaNode.length,\n depth,\n stable: stableCoordinate(gfaNode),\n samples: carriedSamples(gfaNode)\n };\n}\nfunction convertGFAToGraph(gfaGraph, name = \"Imported GFA\") {\n const nodes = [];\n const edges = [];\n const pathSteps = gfaGraph.paths.map(stepsOfPath);\n const { canonical, traversals } = surveySegments(gfaGraph, pathSteps);\n const nodeIds = /* @__PURE__ */ new Map();\n const nodeId = (segmentId) => {\n let id = nodeIds.get(segmentId);\n if (id === void 0) {\n id = `${segmentId}${canonical.get(segmentId) ?? \"+\"}`;\n nodeIds.set(segmentId, id);\n }\n return id;\n };\n const lengths = /* @__PURE__ */ new Map();\n for (const gfaNode of gfaGraph.nodes) {\n if (lengths.has(gfaNode.id)) {\n continue;\n }\n lengths.set(gfaNode.id, gfaNode.length);\n const depth = statedDepth(gfaNode) ?? Math.max(traversals.get(gfaNode.id) ?? 1, 1);\n nodes.push(makeNode(gfaNode, canonical.get(gfaNode.id) ?? \"+\", depth));\n }\n for (const link of gfaGraph.links) {\n edges.push({\n from: nodeId(link.source),\n to: nodeId(link.target),\n fromStrand: link.strand1 === \"-\" ? \"-\" : \"+\",\n toStrand: link.strand2 === \"-\" ? \"-\" : \"+\"\n });\n }\n const paths = [];\n const pathsByPair = /* @__PURE__ */ new Map();\n const pairPaths = (a, b) => pathsByPair.get(a)?.get(b);\n function addPair(a, b, set) {\n let to = pathsByPair.get(a);\n if (!to) {\n to = /* @__PURE__ */ new Map();\n pathsByPair.set(a, to);\n }\n to.set(b, set);\n }\n const edgePaths = edges.map((edge) => {\n let set = pairPaths(edge.from, edge.to);\n if (!set) {\n set = /* @__PURE__ */ new Set();\n addPair(edge.from, edge.to, set);\n addPair(edge.to, edge.from, set);\n }\n return set;\n });\n function recordPathEdges(nodeIds2, name2) {\n for (let i = 0; i < nodeIds2.length - 1; i++) {\n pairPaths(nodeIds2[i], nodeIds2[i + 1])?.add(name2);\n }\n }\n gfaGraph.paths.forEach(({ name: name2 }, i) => {\n const { start, steps } = pathSteps[i];\n const nodeIds2 = steps.map((step) => nodeId(step.id));\n paths.push({ name: name2, nodeIds: nodeIds2, start });\n recordPathEdges(nodeIds2, name2);\n });\n for (const walk of gfaGraph.walks) {\n const nodeIds2 = walk.segments.map((seg) => nodeId(seg.id));\n const name2 = `${walk.sample}#${walk.haplotype}#${walk.contig}`;\n paths.push({\n name: name2,\n nodeIds: nodeIds2,\n start: walkStart(walk),\n sample: walk.sample,\n haplotype: walk.haplotype,\n contig: walk.contig,\n ...walkStopFields(walk.tags)\n });\n recordPathEdges(nodeIds2, name2);\n }\n edges.forEach((edge, i) => {\n const pathIds = edgePaths[i];\n if (pathIds.size > 0) {\n edge.pathIds = [...pathIds];\n }\n });\n const anchoring = gfaGraph.paths.length > 0 || gfaGraph.walks.length > 0 ? surveyPaths(\n anchorablePaths(gfaGraph, pathSteps),\n (id) => lengths.get(id) ?? 0\n ) : void 0;\n return {\n name,\n nodes,\n edges,\n paths: paths.length > 0 ? paths : void 0,\n anchorPaths: anchoring?.anchorPaths,\n pathVisits: anchoring?.pathVisits,\n // rGFA's own tags win wherever they are present; pathAnchoring only ever\n // fills in for a graph that carries none.\n anchoredBy: nodes.some((n) => n.stable) ? \"tags\" : void 0\n };\n}\n\nexport {\n convertGFAToGraph\n};\n", "import {\n stopAt,\n stopFields,\n walkStopTags\n} from \"./chunk-EIY2SKD3.js\";\nimport {\n PathVisits\n} from \"./chunk-ZPZ7GNBT.js\";\nimport {\n panSNFields,\n panSNSample\n} from \"./chunk-4XWZNPQ2.js\";\n\n// src/gfa/graphTables.ts\nfunction pLineName(name, start, end) {\n return start === 0 ? name : `${name}:${start}-${end}`;\n}\nfunction namesByList(lists, names, listCount, pathNames) {\n const starts = new Int32Array(listCount + 1);\n for (const list of lists) {\n starts[list + 1]++;\n }\n for (let i = 0; i < listCount; i++) {\n starts[i + 1] += starts[i];\n }\n const fill = starts.slice(0, listCount);\n const grouped = new Int32Array(lists.length);\n lists.forEach((list, i) => {\n grouped[fill[list]++] = names[i];\n });\n const listed = new Int32Array(pathNames.length).fill(-1);\n return Array.from({ length: listCount }, (_, list) => {\n const out = [];\n for (let i = starts[list]; i < starts[list + 1]; i++) {\n const k = grouped[i];\n if (listed[k] !== list) {\n listed[k] = list;\n out.push(pathNames[k]);\n }\n }\n return out;\n });\n}\nfunction graphFromTables({ nodes: n, links: l, walks: w }, name = \"Imported GFA\") {\n const count = n.names.length;\n const declared = n.lengths.length;\n const canonical = new Uint8Array(count);\n const claim = (node, reversed) => {\n if (canonical[node] === 0) {\n canonical[node] = reversed ? 2 : 1;\n }\n };\n for (let i = 0; i < l.from.length; i++) {\n claim(l.from[i], l.strands[i] & 1);\n claim(l.to[i], l.strands[i] & 2);\n }\n const drawnWalks = [];\n for (let p = 0; p < w.names.length; p++) {\n if (w.offsets[p + 1] > w.offsets[p]) {\n drawnWalks.push(p);\n }\n }\n const traversals = new Int32Array(count);\n for (const p of drawnWalks) {\n for (let s = w.offsets[p]; s < w.offsets[p + 1]; s++) {\n const node = w.steps[s];\n if (traversals[node] === 0) {\n claim(node, w.reversed[s]);\n }\n traversals[node]++;\n }\n }\n const ids = n.names.map(\n (segment, i) => `${segment}${canonical[i] === 2 ? \"-\" : \"+\"}`\n );\n const nodes = [];\n for (let i = 0; i < declared; i++) {\n const ref = n.refs[i];\n nodes.push({\n id: ids[i],\n name: n.names[i],\n length: n.lengths[i],\n depth: Math.max(traversals[i], 1),\n stable: ref < 0 ? void 0 : {\n refName: n.refNames[ref],\n start: n.starts[i],\n rank: n.ranks[i]\n },\n samples: void 0\n });\n }\n const edges = [];\n const neighbours = new Array(count);\n const pairList = (a, b) => {\n const near = neighbours[a];\n if (near) {\n for (let j = 0; j < near.length; j += 2) {\n if (near[j] === b) {\n return near[j + 1];\n }\n }\n }\n return void 0;\n };\n const addPair = (a, b, list) => {\n const near = neighbours[a];\n if (near) {\n near.push(b, list);\n } else {\n neighbours[a] = [b, list];\n }\n };\n const edgeLists = [];\n let lists = 0;\n for (let i = 0; i < l.from.length; i++) {\n const a = l.from[i];\n const b = l.to[i];\n edges.push({\n from: ids[a],\n to: ids[b],\n fromStrand: l.strands[i] & 1 ? \"-\" : \"+\",\n toStrand: l.strands[i] & 2 ? \"-\" : \"+\"\n });\n let list = pairList(a, b);\n if (list === void 0) {\n list = lists++;\n addPair(a, b, list);\n addPair(b, a, list);\n }\n edgeLists.push(list);\n }\n const adjacency = new Int32Array(count + 1);\n for (let a = 0; a < count; a++) {\n adjacency[a + 1] = adjacency[a] + (neighbours[a]?.length ?? 0) / 2;\n }\n const adjacentNode = new Int32Array(adjacency[count]);\n const adjacentList = new Int32Array(adjacency[count]);\n neighbours.forEach((near, a) => {\n for (let j = 0; j < near.length; j += 2) {\n adjacentNode[adjacency[a] + j / 2] = near[j];\n adjacentList[adjacency[a] + j / 2] = near[j + 1];\n }\n });\n const listOf = (a, b) => {\n for (let j = adjacency[a]; j < adjacency[a + 1]; j++) {\n if (adjacentNode[j] === b) {\n return adjacentList[j];\n }\n }\n return -1;\n };\n const nameIndex = /* @__PURE__ */ new Map();\n const pathNames = [];\n const crossedList = new Int32Array(w.offsets[w.names.length] ?? 0);\n const crossedName = new Int32Array(crossedList.length);\n let crossings = 0;\n const lastWalk = new Int32Array(lists).fill(-1);\n const paths = [];\n const anchorPaths = [];\n const totalSteps = w.offsets[w.names.length] ?? 0;\n const visitPath = new Int32Array(totalSteps);\n const visitStart = new Float64Array(totalSteps);\n const visitReversed = new Uint8Array(totalSteps);\n const fill = new Int32Array(count).fill(-1);\n const visitOrder = [];\n const blocks = [0];\n const pathSamples = [];\n const edgeNameIndex = /* @__PURE__ */ new Map();\n const edgeNames = [];\n for (const p of drawnWalks) {\n const walkName = w.names[p];\n const fields = panSNFields(walkName);\n const start = w.starts[p];\n const visitName = fields ? `${fields.sample}#${fields.haplotype}#${fields.contig}` : walkName;\n const pathName = fields ? visitName : pLineName(walkName, start, w.ends[p]);\n let named = nameIndex.get(visitName);\n if (named === void 0) {\n named = pathNames.length;\n nameIndex.set(visitName, named);\n pathNames.push(visitName);\n pathSamples.push(panSNSample(visitName));\n }\n let edgeNamed = edgeNameIndex.get(pathName);\n if (edgeNamed === void 0) {\n edgeNamed = edgeNames.length;\n edgeNameIndex.set(pathName, edgeNamed);\n edgeNames.push(pathName);\n }\n const visitSample = pathSamples[named];\n const first = w.offsets[p];\n const nodeIds = new Array(w.offsets[p + 1] - first);\n let pos = start;\n let prev = -1;\n for (let s = first; s < w.offsets[p + 1]; s++) {\n const node = w.steps[s];\n nodeIds[s - first] = ids[node];\n if (fill[node] === -1) {\n fill[node] = blocks.at(-1);\n blocks.push(fill[node] + traversals[node]);\n visitOrder.push(node);\n }\n const at = fill[node]++;\n visitPath[at] = named;\n visitStart[at] = pos;\n visitReversed[at] = w.reversed[s];\n pos += node < declared ? n.lengths[node] : 0;\n if (prev >= 0) {\n const list = listOf(prev, node);\n if (list >= 0 && lastWalk[list] !== p) {\n lastWalk[list] = p;\n crossedList[crossings] = list;\n crossedName[crossings++] = edgeNamed;\n }\n }\n prev = node;\n }\n paths.push({\n name: pathName,\n nodeIds,\n start,\n ...fields,\n ...fields ? stopFields(\n w.before && stopAt(w.before, p),\n w.after && stopAt(w.after, p)\n ) : {}\n });\n anchorPaths.push({\n name: visitName,\n sample: visitSample,\n start,\n length: pos - start\n });\n }\n const listNames = namesByList(\n crossedList.subarray(0, crossings),\n crossedName,\n lists,\n edgeNames\n );\n edges.forEach((edge, i) => {\n const names = listNames[edgeLists[i]];\n if (names.length > 0) {\n edge.pathIds = names;\n }\n });\n const walked = drawnWalks.length > 0;\n return {\n name,\n nodes,\n edges,\n paths: walked ? paths : void 0,\n anchorPaths: walked ? anchorPaths : void 0,\n pathVisits: walked ? new PathVisits({\n segments: visitOrder.map((node) => n.names[node]),\n offsets: Int32Array.from(blocks),\n path: visitPath.subarray(0, blocks.at(-1)),\n start: visitStart.subarray(0, blocks.at(-1)),\n reversed: visitReversed.subarray(0, blocks.at(-1)),\n paths: pathNames,\n samples: pathSamples\n }) : void 0,\n anchoredBy: nodes.some((node) => node.stable) ? \"tags\" : void 0\n };\n}\nfunction graphTablesGFA({ nodes, links, walks }) {\n const { names } = nodes;\n const lines = [\"H\tVN:Z:1.1\"];\n for (let i = 0; i < nodes.lengths.length; i++) {\n const ref = nodes.refs[i];\n const stable = ref < 0 ? \"\" : `\tSN:Z:${nodes.refNames[ref]}\tSO:i:${nodes.starts[i]}\tSR:i:${nodes.ranks[i]}`;\n lines.push(`S\t${names[i]}\t*\tLN:i:${nodes.lengths[i]}${stable}`);\n }\n for (let i = 0; i < links.from.length; i++) {\n const strands = links.strands[i];\n lines.push(\n `L\t${names[links.from[i]]}\t${strands & 1 ? \"-\" : \"+\"}\t${names[links.to[i]]}\t${strands & 2 ? \"-\" : \"+\"}\t0M`\n );\n }\n for (let p = 0; p < walks.names.length; p++) {\n const name = walks.names[p];\n const fields = panSNFields(name);\n const start = walks.starts[p];\n const end = walks.ends[p];\n const steps = [];\n for (let s = walks.offsets[p]; s < walks.offsets[p + 1]; s++) {\n steps.push([names[walks.steps[s]], walks.reversed[s]]);\n }\n lines.push(\n fields ? `W\t${fields.sample}\t${fields.haplotype}\t${fields.contig}\t${start}\t${end}\t${steps.map(([id, rev]) => (rev ? \"<\" : \">\") + id).join(\"\")}${walkStopTags(walks, p)}` : `P\t${pLineName(name, start, end)}\t${steps.map(([id, rev]) => id + (rev ? \"-\" : \"+\")).join(\",\")}\t*`\n );\n }\n return lines.join(\"\\n\");\n}\n\nexport {\n graphFromTables,\n graphTablesGFA\n};\n", "import {\n orientToReference\n} from \"./chunk-3PZSBNLI.js\";\nimport {\n seededNodes\n} from \"./chunk-CKUVEHSS.js\";\nimport {\n smoothChain\n} from \"./chunk-OPPVSPEF.js\";\nimport {\n routeNodes,\n takeRoutes,\n withDeletionRoutes\n} from \"./chunk-VPE4AYP7.js\";\nimport {\n convertGFAToGraph\n} from \"./chunk-FFHJGWDK.js\";\nimport {\n parseGFA\n} from \"./chunk-5I3K4R2G.js\";\nimport {\n graphFromTables\n} from \"./chunk-3XSRT7RQ.js\";\nimport {\n anchorGraph\n} from \"./chunk-B5X2RLJG.js\";\nimport {\n gfaTables\n} from \"./chunk-DZR37KXT.js\";\nimport {\n mergeRuns,\n splitRuns\n} from \"./chunk-BZFOFC4D.js\";\nimport {\n spreadFor\n} from \"./chunk-HKYXWZQS.js\";\nimport {\n drawnLengthOf,\n drawnNodeLength,\n layoutScaling\n} from \"./chunk-34BOZKIE.js\";\nimport {\n deletionDrawing,\n deletionEdges\n} from \"./chunk-CGMSKIEO.js\";\nimport {\n isBackbone\n} from \"./chunk-RJWPJCIB.js\";\n\n// src/pipeline.ts\nfunction graphOf(source, name) {\n if (typeof source !== \"string\") {\n return graphFromTables(source, name);\n }\n const tables = gfaTables(source);\n return tables ? graphFromTables(tables, name) : convertGFAToGraph(parseGFA(source), name);\n}\nfunction loadGraph(source, name, opts = {}) {\n const graph = anchorGraph(graphOf(source, name), opts.referencePath);\n if (graph.nodes.length === 0) {\n throw new Error(`No graph segments in ${name}`);\n }\n if (opts.maxNodes !== void 0 && graph.nodes.length > opts.maxNodes) {\n throw new Error(\n `Graph too large to draw: ${graph.nodes.length.toLocaleString()} nodes (limit ${opts.maxNodes.toLocaleString()}). Zoom in to a smaller region, or raise maxGraphNodes on this view.`\n );\n }\n return graph;\n}\nvar ENGINE_DEFAULTS = {\n engine: \"fmmm\",\n quality: 2,\n linearLayout: false,\n bubbleSpread: \"auto\",\n spacing: 1,\n componentSeparation: 1,\n showDeletionEdges: true\n};\nfunction engineSettingsOf(s = {}) {\n return {\n engine: s.engine ?? ENGINE_DEFAULTS.engine,\n quality: s.quality ?? ENGINE_DEFAULTS.quality,\n linearLayout: s.linearLayout ?? ENGINE_DEFAULTS.linearLayout,\n bubbleSpread: s.bubbleSpread ?? ENGINE_DEFAULTS.bubbleSpread,\n spacing: s.spacing ?? ENGINE_DEFAULTS.spacing,\n componentSeparation: s.componentSeparation ?? ENGINE_DEFAULTS.componentSeparation,\n showDeletionEdges: s.showDeletionEdges ?? ENGINE_DEFAULTS.showDeletionEdges\n };\n}\nvar COMPONENT_SEPARATION = 15;\nfunction engineRequest(graph, scaling, settings) {\n const anchored = graph.nodes.some(isBackbone);\n const s = engineSettingsOf(settings);\n const spaced = {\n ...scaling,\n opts: {\n ...scaling.opts,\n edgeLength: scaling.opts.edgeLength * s.spacing\n }\n };\n return {\n graph: {\n nodes: anchored ? seededNodes(graph, spaced) : spaced.nodes,\n edges: graph.edges\n },\n options: {\n quality: s.quality,\n linearLayout: s.linearLayout,\n ...spaced.opts,\n componentSeparation: COMPONENT_SEPARATION * s.componentSeparation,\n ...anchored ? { rotateComponents: false } : {},\n engine: s.engine\n }\n };\n}\nfunction engineKey(graph, settings) {\n const anchored = graph.nodes.some(isBackbone);\n return [\n ...Object.values(engineSettingsOf(settings)),\n anchored,\n graph.referencePath ?? \"\"\n ].join(\"|\");\n}\nasync function forceLayout(graph, settings, engine) {\n const spread = spreadFor(settings.bubbleSpread);\n const { shown: deletions, hidden: dropped } = deletionDrawing(\n graph,\n deletionEdges(graph),\n settings.showDeletionEdges !== false\n );\n const routed = withDeletionRoutes(graph, deletions, dropped);\n const merged = mergeRuns(routed.graph, routed.ids);\n const runs = {\n ...merged.graph,\n nodes: merged.graph.nodes.filter((n) => !routed.ids.has(n.id))\n };\n const engineScaling = layoutScaling(runs, spread);\n const { result, duration } = await engine(\n engineRequest(\n merged.graph,\n {\n ...engineScaling,\n nodes: [\n ...engineScaling.nodes,\n ...routeNodes(\n graph,\n deletions,\n routed.routes,\n drawnLengthOf(runs, spread),\n engineScaling.opts\n )\n ]\n },\n settings\n )\n );\n const scaling = layoutScaling(graph, spread);\n const drawn = new Map(\n scaling.nodes.map((n) => [n.id, drawnNodeLength(scaling.opts, n.length)])\n );\n const smoothed = Object.fromEntries(\n Object.entries(result.nodePositions).map(([id, line]) => [\n id,\n smoothChain(line)\n ])\n );\n const positions = splitRuns(smoothed, merged.runs, (id) => drawn.get(id) ?? 0);\n const { nodePositions, deletionRoutes } = takeRoutes(\n graph.nodes.some(isBackbone) ? orientToReference(graph, positions) : positions,\n routed.routes\n );\n return {\n result: {\n ...result,\n nodePositions,\n stranded: true,\n ...deletions.length ? { deletionRoutes, extent: layoutExtent(deletionRoutes) } : {}\n },\n duration\n };\n}\nfunction layoutExtent(nodePositions) {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (const segments of Object.values(nodePositions)) {\n for (const seg of segments) {\n minX = Math.min(minX, seg.x);\n minY = Math.min(minY, seg.y);\n maxX = Math.max(maxX, seg.x);\n maxY = Math.max(maxY, seg.y);\n }\n }\n return { minX, minY, maxX, maxY };\n}\nvar FIT_PADDING = 40;\nvar MIN_ZOOM = 1e-6;\nvar MAX_ZOOM = 100;\nfunction clampZoom(zoom) {\n return Math.max(MIN_ZOOM, Math.min(MAX_ZOOM, zoom));\n}\nfunction fittedTranslateY(bounds, usableHeight, yScale, padTop = FIT_PADDING) {\n const leftoverY = usableHeight - bounds.h * yScale;\n return padTop - bounds.minY * yScale + Math.max(0, leftoverY) / 2;\n}\nfunction fitTransform(bounds, paneWidth, paneHeight, pixelRows, {\n minScale = 0,\n padLeft = FIT_PADDING,\n padTop = FIT_PADDING,\n padRight = FIT_PADDING,\n padBottom = FIT_PADDING\n} = {}) {\n const usableWidth = paneWidth - padLeft - padRight;\n const usableHeight = paneHeight - padTop - padBottom;\n if (usableWidth <= 0 || usableHeight <= 0 || !(bounds.w > 0 || !pixelRows && bounds.h > 0)) {\n return void 0;\n }\n const fitX = bounds.w > 0 ? usableWidth / bounds.w : Infinity;\n const fitY = bounds.h > 0 ? usableHeight / bounds.h : Infinity;\n const scale = clampZoom(\n Math.max(minScale, pixelRows ? fitX : Math.min(fitX, fitY))\n );\n const leftoverX = usableWidth - bounds.w * scale;\n return {\n scale,\n translateX: padLeft - bounds.minX * scale + Math.max(0, leftoverX) / 2,\n translateY: fittedTranslateY(\n bounds,\n usableHeight,\n pixelRows ? 1 : scale,\n padTop\n )\n };\n}\nfunction drawingBounds(layout, opts = {}) {\n let { minX, minY, maxX, maxY } = layoutExtent(layout.nodePositions);\n const { region } = opts;\n if (layout.referenceAxis && region && region.end > region.start) {\n minX = region.start;\n maxX = region.end;\n }\n const extent = opts.extent ?? layout.extent;\n if (extent) {\n minX = Math.min(minX, extent.minX ?? minX);\n minY = Math.min(minY, extent.minY ?? minY);\n maxX = Math.max(maxX, extent.maxX ?? maxX);\n maxY = Math.max(maxY, extent.maxY ?? maxY);\n }\n return { minX, minY, w: maxX - minX, h: maxY - minY };\n}\n\nexport {\n loadGraph,\n ENGINE_DEFAULTS,\n engineSettingsOf,\n engineRequest,\n engineKey,\n forceLayout,\n layoutExtent,\n FIT_PADDING,\n clampZoom,\n fittedTranslateY,\n fitTransform,\n drawingBounds\n};\n", "import {\n engineKey,\n forceLayout\n} from \"./chunk-KDU4EF66.js\";\n\n// src/layout/forceCache.ts\nvar DEFAULT_SIZE = 4;\nfunction createForceLayoutCache(size = DEFAULT_SIZE) {\n const caches = /* @__PURE__ */ new WeakMap();\n const cacheOf = (graph) => {\n let cache = caches.get(graph);\n if (!cache) {\n cache = /* @__PURE__ */ new Map();\n caches.set(graph, cache);\n }\n return cache;\n };\n return {\n layout(graph, settings, engine) {\n const cache = cacheOf(graph);\n const key = engineKey(graph, settings);\n const hit = cache.get(key);\n if (hit) {\n return hit.run;\n }\n if (cache.size >= size) {\n cache.delete(cache.keys().next().value);\n }\n const started = performance.now();\n const entry = {\n run: forceLayout(graph, settings, engine).then((r) => {\n entry.done = r.result;\n return { ...r, duration: r.duration || performance.now() - started };\n })\n };\n entry.run.catch(() => {\n if (cache.get(key) === entry) {\n cache.delete(key);\n }\n });\n cache.set(key, entry);\n return entry.run;\n },\n ready(graph, settings) {\n return caches.get(graph)?.get(engineKey(graph, settings))?.done;\n },\n inherit(from, to) {\n const cache = caches.get(from);\n if (cache && from !== to) {\n caches.set(to, cache);\n }\n }\n };\n}\n\nexport {\n createForceLayoutCache\n};\n", "import {\n clampZoom\n} from \"./chunk-KDU4EF66.js\";\n\n// src/viewport.ts\nfunction axisScaleOf(scale, pixelRows) {\n return { scaleX: scale, scaleY: pixelRows ? 1 : scale, pixelRows };\n}\nfunction viewportOf(t, axis, width, height) {\n return {\n minX: -t.translateX / axis.scaleX,\n minY: -t.translateY / axis.scaleY,\n maxX: (width - t.translateX) / axis.scaleX,\n maxY: (height - t.translateY) / axis.scaleY\n };\n}\nfunction padded(v, panes) {\n const w = (v.maxX - v.minX) * panes;\n const h = (v.maxY - v.minY) * panes;\n return {\n minX: v.minX - w,\n minY: v.minY - h,\n maxX: v.maxX + w,\n maxY: v.maxY + h\n };\n}\nfunction contains(outer, inner) {\n return inner.minX >= outer.minX && inner.maxX <= outer.maxX && inner.minY >= outer.minY && inner.maxY <= outer.maxY;\n}\nfunction zoomAbout(t, factor, centerX, centerY, pixelRows) {\n const scale = clampZoom(t.scale * factor);\n const ratio = scale / t.scale;\n return {\n scale,\n translateX: centerX - (centerX - t.translateX) * ratio,\n translateY: pixelRows ? t.translateY : centerY - (centerY - t.translateY) * ratio\n };\n}\nfunction screenToLayout(x, y, t, axis) {\n return {\n x: (x - t.translateX) / axis.scaleX,\n y: (y - t.translateY) / axis.scaleY\n };\n}\n\nexport {\n axisScaleOf,\n viewportOf,\n padded,\n contains,\n zoomAbout,\n screenToLayout\n};\n", "const host = JBrowseExports[\"@jbrowse/render-core/RenderLifecycleMixin\"]\nconst read = name =>\n host != null && name in Object(host)\n ? host[name]\n : Object.assign(\n function () {\n throw new Error(\n \"This JBrowse does not provide '\" + name + \"' from '\" + \"@jbrowse/render-core/RenderLifecycleMixin\" + \"' to plugins: GraphGenomeView was built for a different JBrowse version, so update the plugin or JBrowse\",\n )\n },\n { jbrowseHostMissing: name },\n )\nexport const RenderLifecycleMixin = /* @__PURE__ */ read(\"RenderLifecycleMixin\")\nexport default host && host.__esModule ? host.default : host", "import { types } from '@jbrowse/mobx-state-tree'\n\n// Persisted choices that read a value outside `values` as unset. A plain\n// `types.enumeration` throws on one, so a session saved by a build that had an\n// option this one dropped failed to load at all; here it opens on the default.\nfunction knownOrUnset<T extends string>(values: readonly T[]) {\n return (value: string | undefined) =>\n values.includes(value as T) ? (value as T) : undefined\n}\n\nexport function lenientMaybeEnum<T extends string>(values: T[]) {\n return types.snapshotProcessor(types.maybe(types.enumeration(values)), {\n preProcessor: knownOrUnset(values),\n })\n}\n\nexport function lenientOptionalEnum<T extends string>(\n values: T[],\n fallback: T,\n) {\n return types.snapshotProcessor(\n types.optional(types.enumeration(values), fallback),\n { preProcessor: knownOrUnset(values) },\n )\n}\n", "import { lazy } from 'react'\n\nimport { BUBBLE_SPREAD_VALUES } from '@jbrowse/bandage-core/bubbleSpreads'\nimport { createForceLayoutCache } from '@jbrowse/bandage-core/layout/forceCache'\nimport { LAYOUT_ENGINE_VALUES } from '@jbrowse/bandage-core/layoutEngines'\nimport { viewportOf } from '@jbrowse/bandage-core/viewport'\nimport { types } from '@jbrowse/mobx-state-tree'\nimport { RenderLifecycleMixin } from '@jbrowse/render-core/RenderLifecycleMixin'\n\nimport { SEGMENTS_SUFFIX } from '../../locationName.ts'\nimport { lenientOptionalEnum } from '../lenientEnum'\n\nimport type { MorphEntering } from './morph'\nimport type { SubgraphRegion } from '../../GetSubgraph'\nimport type { WalkCut } from '../../RgfaTabixAdapter/walkRowRuns.ts'\nimport type { RepeatArray } from '../repeats/repeatFeatures'\nimport type { PaneLayout } from '../tubeMapPanels'\nimport type { SampleRow } from '../walkRowGroups'\nimport type { MinigraphBubble } from '@jbrowse/bandage-core/bubbles/bubbleLine'\nimport type { GeneModel } from '@jbrowse/bandage-core/genes/genePins'\nimport type { LayoutModeValue } from '@jbrowse/bandage-core/layoutModes'\nimport type { Bounds } from '@jbrowse/bandage-core/pipeline'\nimport type { RenderBatch } from '@jbrowse/bandage-core/renderer/types'\nimport type { TubeMapMismatch } from '@jbrowse/bandage-core/tubeMap/mismatches'\nimport type { Graph } from '@jbrowse/bandage-core/types'\nimport type { AxisScale } from '@jbrowse/bandage-core/util/geometry'\nimport type { WalkLayer } from '@jbrowse/bandage-core/walkEncoding'\nimport type { Feature } from '@jbrowse/core/util'\nimport type { FileLocation } from '@jbrowse/core/util/types'\n\n// Ceiling on the pane, and what it falls back to before there is a layout to\n// size against. A roughly square drawing (FMMM) hits this and keeps the\n// scrollable pane it has always had.\nexport const MAX_CANVAS_HEIGHT = 600\n// Floor, so a window holding only backbone \u2014 one row, no height at all \u2014 still\n// leaves room to hover a node and read its tooltip.\nexport const MIN_CANVAS_HEIGHT = 160\n// The pane's background, as the renderer clears to it and as CSS. It stays\n// white under a dark theme, because Bandage's deletion edges, the deletion\n// labels and the gene ink are near-black.\nexport const PAPER: [number, number, number, number] = [1, 1, 1, 1]\nexport const PAPER_CSS = 'rgb(255, 255, 255)'\n// The thinnest a fit draws a tube map's tubes\nexport const MIN_FIT_TUBE_PX = 5\n\nexport const TUBE_MAP_MODES = new Set<string>(['tubemap', 'tubemapref'])\n\n// the tube the pointer is on, by track id, and the mismatch mark under it\nexport interface HoveredTube {\n track: number\n mismatch?: TubeMapMismatch\n}\n\nexport const ChooseSamplesDialog = lazy(\n () => import('../components/ChooseSamplesDialog'),\n)\nexport const ChooseWalksDialog = lazy(\n () => import('../components/ChooseWalksDialog'),\n)\nexport const HighlightColorDialog = lazy(\n () => import('../components/HighlightColorDialog'),\n)\n\n// Past this many walks the Haplotypes menu lists only the lifted ones and offers a\n// searchable picker\nexport const WALK_MENU_ITEMS = 12\n\n// The sizes a tube map folds variants under. MICB's 22 kb cut draws 475\n// columns whole, 34 under 3 bp and one under 50, where only its structural\n// variants would stand: human windows are mostly SNPs.\nexport const TUBE_MAP_FOLDS = [\n { bp: 0, label: 'None' },\n { bp: 3, label: 'Under 3 bp' },\n { bp: 10, label: 'Under 10 bp' },\n { bp: 50, label: 'Under 50 bp, leaving structural variants' },\n { bp: 1000, label: 'Under 1 kb' },\n]\n\n// The rGFA index prefix an adapter config names, from either spelling the\n// config schema accepts: the `uri` shorthand or an explicit segments location.\nexport function bubblePrefix(adapterConfig: Record<string, unknown>) {\n if (typeof adapterConfig.uri === 'string') {\n return adapterConfig.uri\n }\n const segments = adapterConfig.segmentsLocation as\n { uri?: string } | undefined\n const uri = segments?.uri\n return typeof uri === 'string' && uri.endsWith(SEGMENTS_SUFFIX)\n ? uri.slice(0, -SEGMENTS_SUFFIX.length)\n : undefined\n}\nexport const HOVER_BRIGHTEN = 1.15\nexport const SELECT_BRIGHTEN = 1.6\nexport const VIEWPORT_DEBOUNCE_MS = 150\nexport const VIEWPORT_PANES_BUILT = 1\n// How many walk rows read their haplotype's genes, the first rows down\nexport const WALK_GENE_ROWS = 40\n\n// What the canvas draws under the tube map, whose ink is all TubeMapOverlay's\nexport type TubeMapRoutes = 'each' | 'grouped' | 'bundled'\n\nexport const TUBE_MAP_ROUTES: { value: TubeMapRoutes; label: string }[] = [\n { value: 'each', label: 'A tube per haplotype' },\n { value: 'grouped', label: 'A tube per haplotype, grouped by route' },\n { value: 'bundled', label: 'A tube per route' },\n]\n\nexport const EMPTY_BATCH: RenderBatch = {\n nodeStrokes: [],\n nodeStrokeRuns: new Map(),\n arrows: [],\n arrowRuns: new Map(),\n edgeCurves: [],\n edgeCurveRuns: new Map(),\n}\n\n// MobX tracks every observable read while a computed or autorun runs, so\n// passing values here registers them as dependencies without otherwise using\n// them.\nexport function dependOn(..._values: unknown[]) {}\n\n// Hard size cap for the single-mode graph view. Past it the view declines with a\n// \"zoom in\" message rather than switching to a degraded rendering mode \u2014 one mode\n// only, since the large-region case is a linear synteny view, not a graph.\n//\n// This bounds the *fetch*, and it is the only cap that can be applied before one\n// happens. It is a poor proxy for cost, because cost tracks node count, so the\n// number is chosen against the density of the graphs it can actually guard: a\n// region is fetched through `getSubgraph`, and the rGFA cut is what this number\n// was chosen against (the GBZ cut is base-level and has its own `nodeLimit`,\n// which trips long before 5 Mb). Both measured rGFAs are sparse, and at 5 Mb\n// both land at or under the ~2k nodes that redraw in under 10 ms (see agent-docs/reference/GRAPH_SCALE_AND_LOD.md):\n//\n// HPRC MC GRCh38 ~7,000 bp/segment whole 4.9 Mb MHC 1,173 nodes\n// ecoli minigraph 3,078 bp/segment whole 4.6 Mb genome 2,415 nodes\n//\n// Fetch cost does not scale with the window either: against the hosted HPRC\n// index a 4.9 Mb links query and a 100 kb one both cost ~1.3 s, being dominated\n// by HTTP setup. FMMM is the slowest consumer at this size and stays tolerable,\n// ~0.1-3 s for ~1k nodes depending on layout quality (bandage-layout-js), and it\n// runs off the main thread.\n//\n// A dense graph is what this cannot protect against, because bp per node varies\n// by orders of magnitude between graph types \u2014 a base-level pggb graph runs ~17\n// bp/node, where 5 Mb would be hundreds of thousands. Such a graph has no region\n// query to reach this check with today, and the node budget below is the cap that\n// catches it if one ever does.\nexport const MAX_GRAPH_REGION_BP = 5_000_000\n\n// The cap in a message, in the unit that reads: `5 Mb`, not `5000 kb`.\nexport function formatSpanBp(bp: number) {\n return bp >= 1_000_000\n ? `${+(bp / 1_000_000).toFixed(1)} Mb`\n : `${Math.round(bp / 1000)} kb`\n}\n\n// What the view will actually draw, checked once the graph is parsed and so\n// applying to a whole-file import as much as to a subgraph fetch. Measured on\n// bubble-chain graphs: ~1-2k nodes redraws in under 10 ms, 10k takes ~43 ms of\n// geometry and ~125k canvas draw calls per frame (single-digit fps while\n// panning), and 100k needs 632 ms and 75 MB of vertex buffers. So this is set\n// where the tab stops being usable rather than where it stops being smooth, and\n// it is a view prop rather than a constant so a session can raise it \u2014 the same\n// escape hatch strangepg gives with `-T N`.\nexport const DEFAULT_MAX_GRAPH_NODES = 20_000\n\n// the last segment of a file's path, its query dropped, or a blob's own name\nexport function fileName(location: FileLocation) {\n const path =\n 'uri' in location\n ? location.uri.split(/[?#]/)[0]!\n : 'localPath' in location\n ? location.localPath\n : 'name' in location\n ? location.name\n : ''\n return path.split(/[\\\\/]/).at(-1) ?? ''\n}\n\n// A url bandage-figure can read again, or undefined for a local file\nexport function uriOf(location: FileLocation | undefined) {\n return location && 'uri' in location && location.uri\n ? new URL(location.uri, location.baseUri ?? window.location.href).href\n : undefined\n}\n\ntype ViewportOwner = 'fit' | 'user' | 'host'\n\ninterface BuiltViewport {\n scale: number\n bounds: Bounds\n viewportDirty: number\n}\n\nexport function geometryPainted(model: {\n viewportRebuildPending: boolean\n viewportDirty: number\n builtViewport?: BuiltViewport\n paintedViewport?: BuiltViewport\n}) {\n return (\n model.builtViewport !== undefined &&\n model.paintedViewport === model.builtViewport &&\n model.builtViewport.viewportDirty === model.viewportDirty &&\n !model.viewportRebuildPending\n )\n}\n\n// What the pane shows, in layout units: what each panel shows while faceted\nexport function paneViewportOf(model: {\n translateX: number\n translateY: number\n axisScale: AxisScale\n viewBox: { width: number; height: number }\n}): Bounds {\n const { width, height } = model.viewBox\n return viewportOf(model, model.axisScale, width, height)\n}\n\n// Force layouts already computed for a graph, keyed by the view props the\n// engine reads. Every layout mode is local and costs a millisecond except this\n// one, which is seconds: measured on the committed engine, a 1,201-node bubble\n// chain is 0.6 s proportional, 4.3 s at 'Wide bubbles' and 3.4 s at the highest\n// quality.\n//\n// Worth keeping because a session revisits the same layout. The two drawings\n// answer different questions and the README's own figure is one subgraph in\n// both, so Anchored <-> Force is a round trip a reader makes repeatedly \u2014 and\n// picking a reference path calls `recomputeLayout` whether or not the current\n// mode reads it, which in force mode was a multi-second re-run of an identical\n// layout.\n// Both are hits. The cache itself is core's, which BandageJS keeps too.\nexport const forceLayouts = createForceLayoutCache()\n\nexport const paneBase = types\n .compose(\n 'GraphPane',\n RenderLifecycleMixin(),\n types.model({\n // FMMM's iteration budget, 0-4, the same scale Bandage's own settings\n // dialog exposes: 3+1 iterations at 0, 15+10 at 1, 30+20 at 2, 60+40 at\n // 3, 120+60 at 4 (BandageNG layout/graphlayoutworker.cpp).\n //\n // 2 because that is what the engine we vendor ships as its default\n // (`graphLayoutQuality = IntSetting(2, 0, 4)`, program/settings.cpp).\n // Cost at the sizes this view draws is milliseconds, and the header\n // states the layout time.\n layoutQuality: types.optional(types.number, 2),\n // Which engine draws the force layout: Bandage's FMMM, or the stress\n // layout, which reads the reference straight. See LAYOUT_ENGINES.\n layoutEngine: lenientOptionalEnum(LAYOUT_ENGINE_VALUES, 'fmmm'),\n linearLayout: types.optional(types.boolean, false),\n // How far the force layout opens a bubble, which on a variation graph is\n // the difference between a legible drawing and a rope. See\n // BUBBLE_SPREADS; no effect on the reference-anchored layouts, which\n // place a node from its coordinates rather than from a force sim.\n bubbleSpread: lenientOptionalEnum(BUBBLE_SPREAD_VALUES, 'auto'),\n // Variants under this many bp fold into the reference before a tube map\n // is laid out, each kept as a tick on its walk's tube (coarsen.ts); 0\n // draws every one\n tubeMapFold: types.optional(types.number, 0),\n // A tube per haplotype, or a tube per route the haplotypes take, as\n // wide as how many take it (bundleRoutes)\n tubeMapRoutes: lenientOptionalEnum<TubeMapRoutes>(\n ['each', 'grouped', 'bundled'],\n 'each',\n ),\n // A sample table column whose values colour the tubes, the reference\n // charcoal; empty colours them by role\n tubeMapColorBy: types.optional(types.string, ''),\n // Which track the genes come from; empty picks the assembly's\n // annotation track (pickGeneTrack).\n geneTrackId: types.optional(types.string, ''),\n // Which track the walk rows read tandem repeat arrays from; empty\n // picks a track whose name says repeats (pickRepeatTrack).\n repeatTrackId: types.optional(types.string, ''),\n // The array the walk rows measure between and tile by, as\n // RepeatArray.key; empty measures the whole window untiled.\n repeatKey: types.optional(types.string, ''),\n // Walks lifted out of the drawing, each a layer with a lane of its own\n // and the rest fading, coloured by the encoding it states or by the\n // default one. See walkEncoding.ts. Empty lifts none.\n walkLayers: types.optional(types.frozen<WalkLayer[]>(), []),\n // Which of a general GFA's paths the anchored layouts put on x. A path\n // GFA's names are arbitrary and none of them is marked as the\n // reference, so this is a choice; empty means \"infer\", which is the\n // assembly a subgraph was cut against, and the first path in the file\n // for a whole-file import. No effect on an rGFA, whose segments carry\n // their own coordinates. See pathAnchoring.ts.\n referencePath: types.optional(types.string, ''),\n // Whether the toolbar spells out `fetch 12371ms \u00B7 layout 4ms \u00B7 geom 9ms`.\n // Off by default because it was in the toolbar of every published graph\n // figure, where a machine's fetch time is noise a reader has to skip\n // past. The numbers themselves are always on the element as `data-*`\n // attributes, which is what browser tests assert against, so hiding the\n // text costs no coverage.\n showPerf: types.optional(types.boolean, false),\n connectorThickness: types.optional(types.number, 2),\n scale: types.optional(types.number, 1),\n translateX: types.optional(types.number, 0),\n translateY: types.optional(types.number, 0),\n // Ceiling on the drawing pane, in css px, for a session or a figure that\n // wants a shorter one than the drawing asks for. Unset means the built-in\n // MAX_CANVAS_HEIGHT, which is what every existing session gets.\n //\n // Why this is a knob rather than a smaller default: the pane is as tall\n // as the drawing's own aspect ratio (see canvasHeight), which is right \u2014\n // a graph that is twice as tall as it is wide should not be squeezed\n // into a strip. But one very long node in a cut of short ones makes that\n // aspect ratio all arc: the HPRC CHM13 figure draws a 142 kb allele\n // among sub-kb backbone segments, pins the 600 px ceiling and spends\n // most of it on the loop, with the chain squashed along the bottom edge.\n // Lowering the ceiling there scales the whole drawing down, which is\n // exactly the trade that figure wants and the wrong default for a graph\n // whose height is carrying information.\n paneHeight: types.maybe(types.number),\n // Raise to draw a bigger graph than the default budget allows; see\n // DEFAULT_MAX_GRAPH_NODES for what the numbers cost.\n maxGraphNodes: types.optional(types.number, DEFAULT_MAX_GRAPH_NODES),\n // the linear view a graph of its own is paired with for the hover sync\n connectedViewId: types.maybe(types.string),\n // The bp ceiling on a fine cut, a proxy for node count that only\n // holds at fine granularity; `maxGraphNodes` counts what came back.\n maxRegionBp: types.optional(types.number, MAX_GRAPH_REGION_BP),\n // How far the cut follows links past the region's own segments. At\n // 0 a detour that leaves the backbone before the window and rejoins\n // after it arrives as a fragment, since its interior is indexed only\n // under its own sequence, so one bubble draws as two unrelated\n // insertions. A hop follows alleles only, so it never walks the\n // backbone out of the window.\n subgraphContext: types.optional(types.number, 1),\n // the haplotypes a GBZ or walk-indexed cut is for; unset is\n // trackHaplotypes\n subgraphHaplotypes: types.maybe(types.frozen<string[]>()),\n }),\n )\n .volatile(() => ({\n graph: undefined as Graph | undefined,\n // a walk-rows cut's tables and runs, which draw the rows in place of the\n // graph's walks\n walkCut: undefined as WalkCut | undefined,\n // the reference window the graph on screen was cut for, set with it\n graphRegion: undefined as SubgraphRegion | undefined,\n // The walk the track's graph lies on for the region's assembly, which\n // the track's config declares; x starts along it unless the user chose\n // another. Undefined for an rGFA, whose backbone is fixed, and for a\n // graph with no region.\n loadedReferencePath: undefined as string | undefined,\n layoutResult: undefined as PaneLayout | undefined,\n // the mode that drew layoutResult: force where the chosen one could not\n drawnLayoutMode: undefined as LayoutModeValue | undefined,\n // what the legends in the pane's top-right corner measure, so no label\n // is placed under them\n legendSize: { width: 0, height: 0 },\n // The bubble index rows over the cut window, when the source track has\n // one beside its segments. Undefined for a graph with no index, whose\n // bubbles are `derivedBubbles` instead.\n indexBubbles: undefined as MinigraphBubble[] | undefined,\n // the size under which the graph on screen has variants folded into the\n // reference, by this cut or by the tier it was cut from\n foldedBelowBp: undefined as number | undefined,\n // the gene track's features over the cut window, read once per cut\n geneTrackFeatures: undefined as Feature[] | undefined,\n // each walk row's genes, read from its haplotype's own assembly, by walk\n // name\n walkGeneFeatures: undefined as Map<string, GeneModel[]> | undefined,\n // the source track's samples TSV, which walk rows group by\n walkRowSampleTable: undefined as SampleRow[] | undefined,\n // the tandem repeat arrays over the cut window, from the repeat track\n repeatArrays: undefined as RepeatArray[] | undefined,\n // the layout mode the drawing was last laid out for, so a change from the\n // menu is not laid out a second time by the reaction that catches the rest\n handledLayoutMode: undefined as LayoutModeValue | undefined,\n // The bubbles opened in place, outermost first, each inside the one before\n // it. The drawing keeps the innermost in colour and greys the rest.\n openBubbles: [] as MinigraphBubble[],\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n error: undefined as unknown,\n isLoading: false,\n loadCanceled: false,\n statusMessage: '',\n hoveredNode: null as string | null,\n // where on the pane the pointer hovered it, when the canvas set it\n hoveredAt: null as { x: number; y: number } | null,\n hoveredTube: null as HoveredTube | null,\n // the tube map panel the pointer is over, while the map is split\n hoveredPanel: null as number | null,\n // the walks of the per-sample lane row the linear view's pointer is on\n hoveredRowWalks: [] as string[],\n // the bubble whose label the pointer is on\n hoveredBubble: null as MinigraphBubble | null,\n // whether the pointer is over this pane, whose own hit test then says\n // what it is on\n pointerInPane: false,\n // the strip point the pointer is over, which lights its node above\n stripHover: null as { row: string; offset: number } | null,\n // the walk row the pointer is on, by walk name\n hoveredWalkRow: null as string | null,\n hoveredEdge: null as number | null,\n selectedNode: null as string | null,\n viewportDirty: 0,\n // Bumped when the layout's positions are mutated IN PLACE, which only a\n // node drag does. Separate from `viewportDirty` because that one also\n // fires on pan and zoom, and the things keyed off this \u2014 the two hit\n // indexes and the label placement's per-layout caches \u2014 do not depend on\n // the transform at all. Rebuilding a 12k-edge hit index because the user\n // panned cost ~14 ms of the first mousemove after every gesture.\n positionsVersion: 0,\n // what a morph under way is fading in\n morphEntering: undefined as MorphEntering | undefined,\n // The batch the canvas holds, which the hover layer lights over it\n drawnBatch: EMPTY_BATCH,\n // The zoom and the window the current batch was built for; a pan that\n // stays inside it needs no rebuild.\n builtViewport: undefined as BuiltViewport | undefined,\n // The builtViewport whose batch is on the canvas\n paintedViewport: undefined as BuiltViewport | undefined,\n draggingNode: null as string | null,\n // Dragging the background rather than a node. Lives here beside\n // draggingNode instead of in a component ref+state pair, so the two\n // mutually exclusive drag modes are one piece of state read from one place.\n isPanning: false,\n // Who places the view. 'fit' refits it to every new layout, 'user' leaves\n // it where a gesture or a restored session put it, and 'host' takes x\n // from the linear view the pane sits in. Not derived from\n // `isDefaultViewport`, which zoomToFit itself invalidates on its first\n // run \u2014 that made the fit fire once against not-yet-measured dimensions\n // and then never re-fit.\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n viewportOwner: 'fit' as ViewportOwner,\n viewportDirtyTimer: undefined as ReturnType<typeof setTimeout> | undefined,\n // 0 is never a live rAF handle, so it doubles as \"nothing pending\"\n positionsDirtyFrame: 0,\n // Performance instrumentation, surfaced in GraphStats for browser tests\n // to assert against budgets. `fetchMs` is the GetSubgraph RPC round-trip,\n // `layoutMs` the last layout's compute time in any mode (near zero on a\n // cache hit), `geometryMs` the main-thread buildGeometry pass and\n // `geometryStrokeCount` the node strokes it produced.\n lastFetchMs: undefined as number | undefined,\n // how many of the cut's reads the tube map was handed, of how many\n readsShown: undefined as { shown: number; total: number } | undefined,\n lastLayoutMs: undefined as number | undefined,\n lastGeometryMs: undefined as number | undefined,\n lastGeometryStrokeCount: undefined as number | undefined,\n viewportRebuildPending: false,\n }))\n", "// src/renderer/svgCanvas.ts\nvar n = (v) => +v.toFixed(1);\nvar alpha = (v) => +v.toFixed(3);\nfunction paint(css) {\n const m = /^rgba?\\(([^,]+),([^,]+),([^,)]+)(?:,([^)]+))?\\)$/.exec(\n css.replaceAll(\" \", \"\")\n );\n if (!m) {\n return { color: css, opacity: 1 };\n }\n const opacity = m[4] === void 0 ? 1 : Number(m[4]);\n return { color: `rgb(${m[1]},${m[2]},${m[3]})`, opacity };\n}\nfunction paintAttrs(kind, css) {\n const { color, opacity } = paint(css);\n return `${kind}=\"${color}\"${opacity < 1 ? ` ${kind}-opacity=\"${alpha(opacity)}\"` : \"\"}`;\n}\nvar DOT_PX = 0.5;\nvar DOT_CELL_PX = 0.25;\nfunction svgCanvas(width, height) {\n const out = [];\n let subpaths = [];\n const start = (x, y) => {\n const s = { d: `M${n(x)} ${n(y)}`, segments: 0, x0: x, x1: x, y0: y, y1: y };\n subpaths.push(s);\n return s;\n };\n const reach = (points) => {\n const s = subpaths.at(-1) ?? start(points[0], points[1]);\n for (let i = 0; i < points.length; i += 2) {\n s.x0 = Math.min(s.x0, points[i]);\n s.x1 = Math.max(s.x1, points[i]);\n s.y0 = Math.min(s.y0, points[i + 1]);\n s.y1 = Math.max(s.y1, points[i + 1]);\n }\n s.segments++;\n return s;\n };\n const pathData = (dots) => {\n const seen = /* @__PURE__ */ new Set();\n return subpaths.map((s) => {\n if (!dots || s.x1 - s.x0 >= DOT_PX || s.y1 - s.y0 >= DOT_PX) {\n return s.d;\n }\n const x = (s.x0 + s.x1) / 2;\n const y = (s.y0 + s.y1) / 2;\n const cell = `${Math.round(x / DOT_CELL_PX)} ${Math.round(y / DOT_CELL_PX)}`;\n if (s.segments === 0 || seen.has(cell)) {\n return \"\";\n }\n seen.add(cell);\n return `M${n(x)} ${n(y)}h0`;\n }).join(\"\");\n };\n const ctx = {\n canvas: void 0,\n fillStyle: \"#000\",\n strokeStyle: \"#000\",\n lineWidth: 1,\n lineCap: \"butt\",\n lineJoin: \"miter\",\n beginPath() {\n subpaths = [];\n },\n moveTo(x, y) {\n start(x, y);\n },\n lineTo(x, y) {\n reach([x, y]).d += `L${n(x)} ${n(y)}`;\n },\n bezierCurveTo(cx0, cy0, cx1, cy1, x, y) {\n reach([cx0, cy0, cx1, cy1, x, y]).d += `C${n(cx0)} ${n(cy0)} ${n(cx1)} ${n(cy1)} ${n(x)} ${n(y)}`;\n },\n closePath() {\n const s = subpaths.at(-1);\n if (s) {\n s.d += \"Z\";\n }\n },\n stroke() {\n const d = pathData(ctx.lineCap !== \"butt\");\n if (d) {\n out.push(\n `<path d=\"${d}\" fill=\"none\" ${paintAttrs(\"stroke\", ctx.strokeStyle)} stroke-width=\"${n(ctx.lineWidth)}\" stroke-linecap=\"${ctx.lineCap}\" stroke-linejoin=\"${ctx.lineJoin}\"/>`\n );\n }\n },\n fill() {\n const d = pathData(false);\n if (d) {\n out.push(`<path d=\"${d}\" ${paintAttrs(\"fill\", ctx.fillStyle)}/>`);\n }\n },\n // the renderer only ever clears the whole canvas\n clearRect() {\n out.length = 0;\n },\n fillRect(x, y, w, h) {\n out.push(\n `<rect x=\"${n(x)}\" y=\"${n(y)}\" width=\"${n(w)}\" height=\"${n(h)}\" ${paintAttrs(\"fill\", ctx.fillStyle)}/>`\n );\n }\n };\n const canvas = {\n width,\n height,\n style: {},\n getContext: () => ctx\n };\n ctx.canvas = canvas;\n return {\n canvas,\n // the drawing so far, as SVG elements in canvas pixels\n markup: () => out.join(\"\")\n };\n}\n\nexport {\n svgCanvas\n};\n", "// src/renderer/canvas.ts\nvar MAX_DPR = 2;\nvar MAX_CANVAS_DIM_PX = 8192;\nfunction getDpr(width = 0, height = 0) {\n const dpr = typeof devicePixelRatio === \"undefined\" ? 1 : Math.min(devicePixelRatio, MAX_DPR);\n return Math.min(dpr, MAX_CANVAS_DIM_PX / Math.max(width, height, 1));\n}\nfunction syncCanvasSize(canvas, width, height) {\n const dpr = getDpr(width, height);\n const pw = Math.round(width * dpr);\n const ph = Math.round(height * dpr);\n if (canvas.width !== pw || canvas.height !== ph) {\n canvas.width = pw;\n canvas.height = ph;\n }\n const cssWidth = `${width}px`;\n const cssHeight = `${height}px`;\n if (canvas.style.width !== cssWidth) {\n canvas.style.width = cssWidth;\n }\n if (canvas.style.height !== cssHeight) {\n canvas.style.height = cssHeight;\n }\n return dpr;\n}\n\nexport {\n MAX_DPR,\n MAX_CANVAS_DIM_PX,\n getDpr,\n syncCanvasSize\n};\n", "import {\n getDpr,\n syncCanvasSize\n} from \"./chunk-RBCE2OQH.js\";\nimport {\n abgrToCssRgba,\n brightenAbgr,\n normalizedRgbToCssRgba\n} from \"./chunk-G2FD7S3C.js\";\n\n// src/renderer/Canvas2DRenderer.ts\nvar Canvas2DRenderer = class {\n constructor(canvas) {\n this.transform = null;\n this.batch = null;\n this.nodeHighlights = /* @__PURE__ */ new Map();\n this.highlightedEdge = null;\n this.highlightFactor = 1;\n this.fit = 1;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n throw new Error(\"Canvas 2D context not available\");\n }\n this.canvas = canvas;\n this.ctx = ctx;\n }\n setErrorHandler(_handler) {\n }\n releaseOffscreenTargets() {\n }\n // A host builds its transform at `getDpr()`. Where syncCanvasSize had to\n // shrink the ratio to stay under MAX_CANVAS_DIM_PX, `fit` shrinks the\n // transform to match, so the picture still fills the css box.\n resize(width, height) {\n this.fit = syncCanvasSize(this.canvas, width, height) / getDpr();\n }\n uploadGeometry(batch) {\n this.batch = batch;\n this.highlightedEdge = null;\n }\n setNodeHighlights(factors) {\n this.nodeHighlights = factors;\n }\n setEdgeHighlight(edgeIndex, factor) {\n this.highlightedEdge = edgeIndex;\n this.highlightFactor = factor;\n }\n updateTransform(transform) {\n this.transform = transform;\n }\n fitted() {\n const t = this.transform;\n const k = this.fit;\n return !t || k === 1 ? t : {\n ...t,\n scaleX: t.scaleX * k,\n scaleY: t.scaleY * k,\n translateX: t.translateX * k,\n translateY: t.translateY * k,\n dpr: t.dpr * k\n };\n }\n render(clearColor) {\n const t = this.fitted();\n if (!t) {\n return;\n }\n const ctx = this.ctx;\n const { width, height } = ctx.canvas;\n if (clearColor[3] < 1) {\n ctx.clearRect(0, 0, width, height);\n }\n ctx.fillStyle = normalizedRgbToCssRgba(\n [clearColor[0], clearColor[1], clearColor[2]],\n clearColor[3]\n );\n ctx.fillRect(0, 0, width, height);\n const batch = this.batch;\n if (!batch) {\n return;\n }\n ctx.lineCap = \"round\";\n ctx.lineJoin = \"round\";\n const factor = this.highlightFactor;\n const edgeRun = this.edgeRun(batch.edgeCurveRuns);\n for (const { color, items } of groupByPaint(batch.edgeCurves, (e, i) => ({\n color: inRun(edgeRun, i) ? brightenAbgr(e.color, factor) : e.color,\n weight: e.thickness,\n last: inRun(edgeRun, i)\n }))) {\n this.strokeCurves(items, color, t);\n }\n const lifted = this.liftedStrokes(batch);\n for (const { color, items } of groupByPaint(batch.nodeStrokes, (s, i) => {\n const f = lifted.get(i);\n return {\n color: f === void 0 ? s.color : brightenAbgr(s.color, f),\n weight: s.thickness,\n last: f !== void 0\n };\n })) {\n this.strokeNodes(items, color, t);\n }\n const arrowRun = this.edgeRun(batch.arrowRuns);\n for (const { color, items } of groupByPaint(batch.arrows, (a, i) => ({\n color: inRun(arrowRun, i) ? brightenAbgr(a.color, factor) : a.color,\n weight: 0,\n last: inRun(arrowRun, i)\n }))) {\n this.fillArrows(items, color, t);\n }\n }\n // Only what the highlights lift, over a transparent clear, for a hover layer\n // stacked on a canvas that drew the batch without them: a pointer move then\n // repaints one node or edge rather than the whole drawing\n renderHighlights() {\n const ctx = this.ctx;\n ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\n const batch = this.batch;\n const t = this.fitted();\n if (!t || !batch) {\n return;\n }\n ctx.lineCap = \"round\";\n ctx.lineJoin = \"round\";\n const factor = this.highlightFactor;\n const curves = runItems(batch.edgeCurves, this.edgeRun(batch.edgeCurveRuns));\n for (const { color, items } of groupByPaint(curves, (e) => ({\n color: brightenAbgr(e.color, factor),\n weight: e.thickness,\n last: false\n }))) {\n this.strokeCurves(items, color, t);\n }\n const lifted = [...this.liftedStrokes(batch)];\n for (const { color, items } of groupByPaint(lifted, ([i, f]) => ({\n color: brightenAbgr(batch.nodeStrokes[i].color, f),\n weight: batch.nodeStrokes[i].thickness,\n last: false\n }))) {\n this.strokeNodes(\n items.map(([i]) => batch.nodeStrokes[i]),\n color,\n t\n );\n }\n const arrows = runItems(batch.arrows, this.edgeRun(batch.arrowRuns));\n for (const { color, items } of groupByPaint(arrows, (a) => ({\n color: brightenAbgr(a.color, factor),\n weight: 0,\n last: false\n }))) {\n this.fillArrows(items, color, t);\n }\n }\n edgeRun(runs) {\n return this.highlightedEdge === null ? void 0 : runs.get(this.highlightedEdge);\n }\n // stroke index -> brighten factor, for the nodes the model lifted\n liftedStrokes(batch) {\n const lifted = /* @__PURE__ */ new Map();\n for (const [nodeId, factor] of this.nodeHighlights) {\n const run = batch.nodeStrokeRuns.get(nodeId);\n if (run) {\n for (let i = run.start; i < run.start + run.count; i++) {\n lifted.set(i, factor);\n }\n }\n }\n return lifted;\n }\n strokeCurves(items, color, t) {\n const ctx = this.ctx;\n ctx.strokeStyle = abgrToCssRgba(color);\n ctx.lineWidth = items[0].thickness * 2 * t.dpr;\n ctx.beginPath();\n for (const e of items) {\n const first = e.curves[0];\n ctx.moveTo(\n first.x0 * t.scaleX + t.translateX,\n first.y0 * t.scaleY + t.translateY\n );\n for (const c of e.curves) {\n ctx.bezierCurveTo(\n c.cx0 * t.scaleX + t.translateX,\n c.cy0 * t.scaleY + t.translateY,\n c.cx1 * t.scaleX + t.translateX,\n c.cy1 * t.scaleY + t.translateY,\n c.x1 * t.scaleX + t.translateX,\n c.y1 * t.scaleY + t.translateY\n );\n }\n }\n ctx.stroke();\n }\n strokeNodes(items, color, t) {\n const ctx = this.ctx;\n ctx.strokeStyle = abgrToCssRgba(color);\n ctx.lineWidth = items[0].thickness * 2 * t.dpr;\n ctx.beginPath();\n for (const s of items) {\n const p0 = s.points[0];\n ctx.moveTo(p0.x * t.scaleX + t.translateX, p0.y * t.scaleY + t.translateY);\n for (let i = 1, l = s.points.length; i < l; i++) {\n const p = s.points[i];\n ctx.lineTo(p.x * t.scaleX + t.translateX, p.y * t.scaleY + t.translateY);\n }\n }\n ctx.stroke();\n }\n fillArrows(items, color, t) {\n const ctx = this.ctx;\n ctx.fillStyle = abgrToCssRgba(color);\n ctx.beginPath();\n for (const a of items) {\n const [tip, left, notch, right] = arrowheadOutline(a, t);\n ctx.moveTo(tip.x, tip.y);\n ctx.lineTo(left.x, left.y);\n ctx.lineTo(notch.x, notch.y);\n ctx.lineTo(right.x, right.y);\n ctx.closePath();\n }\n ctx.fill();\n }\n dispose() {\n this.batch = null;\n this.nodeHighlights = /* @__PURE__ */ new Map();\n this.highlightedEdge = null;\n }\n};\nvar ARROW_NOTCH = 0.25;\nfunction arrowheadOutline(a, t) {\n const ux = Math.cos(a.angle);\n const uy = Math.sin(a.angle);\n const tipX = a.x * t.scaleX + t.translateX;\n const tipY = a.y * t.scaleY + t.translateY;\n const length = a.length * t.dpr;\n const halfWidth = a.halfWidth * t.dpr;\n const backX = tipX - ux * length;\n const backY = tipY - uy * length;\n const notchBack = length * (1 - ARROW_NOTCH);\n return [\n { x: tipX, y: tipY },\n { x: backX - uy * halfWidth, y: backY + ux * halfWidth },\n { x: tipX - ux * notchBack, y: tipY - uy * notchBack },\n { x: backX + uy * halfWidth, y: backY - ux * halfWidth }\n ];\n}\nfunction runItems(items, run) {\n return run ? items.slice(run.start, run.start + run.count) : [];\n}\nfunction inRun(run, i) {\n return run !== void 0 && i >= run.start && i < run.start + run.count;\n}\nfunction groupByPaint(items, paintOf) {\n const groups = /* @__PURE__ */ new Map();\n const deferred = /* @__PURE__ */ new Map();\n for (let i = 0, l = items.length; i < l; i++) {\n const item = items[i];\n const { color, weight, last } = paintOf(item, i);\n const into = last ? deferred : groups;\n const key = `${color}:${weight}`;\n const group = into.get(key);\n if (group) {\n group.items.push(item);\n } else {\n into.set(key, { color, items: [item] });\n }\n }\n return [...groups.values(), ...deferred.values()];\n}\n\nexport {\n Canvas2DRenderer,\n arrowheadOutline\n};\n", "import {\n baseEdgeCurves\n} from \"./chunk-WA5WNP6V.js\";\nimport {\n curveBounds,\n pathRibbonOffsets\n} from \"./chunk-UBQSRCWR.js\";\n\n// src/util/SpatialIndex.ts\nvar FALLBACK_CELL_SIZE = 50;\nfunction meanExtentCellSize(extentTotal, count) {\n return count > 0 ? Math.max(1, extentTotal / count) : FALLBACK_CELL_SIZE;\n}\nfunction rowPitchOf(boxes) {\n const distinct = /* @__PURE__ */ new Set();\n let min = Infinity;\n let max = -Infinity;\n for (const box of boxes) {\n distinct.add(box.minY);\n min = Math.min(min, box.minY);\n max = Math.max(max, box.minY);\n }\n return distinct.size > 1 ? (max - min) / (distinct.size - 1) : void 0;\n}\nfunction cellSizeFrom(boxes, extentX, extentY) {\n const x = meanExtentCellSize(extentX, boxes.length);\n return {\n x,\n y: extentY > 0 ? meanExtentCellSize(extentY, boxes.length) : rowPitchOf(boxes) ?? x\n };\n}\nfunction resolveCellSize(given, boxes, extentX, extentY) {\n return given === void 0 ? cellSizeFrom(boxes, extentX, extentY) : typeof given === \"number\" ? { x: given, y: given } : given;\n}\nfunction getOrCreateCell(cells, cx, cy) {\n let row = cells.get(cx);\n if (!row) {\n row = /* @__PURE__ */ new Map();\n cells.set(cx, row);\n }\n let cell = row.get(cy);\n if (!cell) {\n cell = [];\n row.set(cy, cell);\n }\n return cell;\n}\nfunction addToGrid(cells, cellSize, minX, minY, maxX, maxY, entry) {\n const cx0 = Math.floor(minX / cellSize.x);\n const cx1 = Math.floor(maxX / cellSize.x);\n const cy0 = Math.floor(minY / cellSize.y);\n const cy1 = Math.floor(maxY / cellSize.y);\n for (let cx = cx0; cx <= cx1; cx++) {\n for (let cy = cy0; cy <= cy1; cy++) {\n getOrCreateCell(cells, cx, cy).push(entry);\n }\n }\n}\nfunction queryGrid(cells, cellSize, x, y, radiusX, radiusY) {\n const cx0 = Math.floor((x - radiusX) / cellSize.x);\n const cx1 = Math.floor((x + radiusX) / cellSize.x);\n const cy0 = Math.floor((y - radiusY) / cellSize.y);\n const cy1 = Math.floor((y + radiusY) / cellSize.y);\n const results = [];\n const seen = /* @__PURE__ */ new Set();\n for (let cx = cx0; cx <= cx1; cx++) {\n const row = cells.get(cx);\n if (row) {\n for (let cy = cy0; cy <= cy1; cy++) {\n const cell = row.get(cy);\n if (cell) {\n for (const entry of cell) {\n if (!seen.has(entry)) {\n seen.add(entry);\n results.push(entry);\n }\n }\n }\n }\n }\n }\n return results;\n}\nvar SpatialIndex = class {\n constructor(nodePositions, cellSize) {\n this.cells = /* @__PURE__ */ new Map();\n const boxes = [];\n let extentX = 0;\n let extentY = 0;\n for (const [nodeId, segments] of Object.entries(nodePositions)) {\n for (let i = 0; i < segments.length - 1; i++) {\n const seg = segments[i];\n const next = segments[i + 1];\n const minX = Math.min(seg.x, next.x);\n const minY = Math.min(seg.y, next.y);\n const maxX = Math.max(seg.x, next.x);\n const maxY = Math.max(seg.y, next.y);\n extentX += maxX - minX;\n extentY += maxY - minY;\n boxes.push({ entry: { nodeId, segmentIdx: i }, minX, minY, maxX, maxY });\n }\n }\n this.cellSize = resolveCellSize(cellSize, boxes, extentX, extentY);\n for (const b of boxes) {\n addToGrid(\n this.cells,\n this.cellSize,\n b.minX,\n b.minY,\n b.maxX,\n b.maxY,\n b.entry\n );\n }\n }\n query(x, y, radiusX, radiusY = radiusX) {\n return queryGrid(this.cells, this.cellSize, x, y, radiusX, radiusY);\n }\n};\nvar EdgeSpatialIndex = class {\n constructor(nodePositions, graph, drawPaths, axis, deletions, version = 0, routes, stranded = false) {\n this.cells = /* @__PURE__ */ new Map();\n this.edgeCurves = baseEdgeCurves(\n nodePositions,\n graph,\n axis,\n deletions,\n version,\n routes,\n stranded\n );\n const boxes = [];\n let extentX = 0;\n let extentY = 0;\n for (let ei = 0; ei < graph.edges.length; ei++) {\n const edge = graph.edges[ei];\n const fromSegments = nodePositions[edge.from];\n const toSegments = nodePositions[edge.to];\n const curves = this.edgeCurves.get(ei);\n if (fromSegments?.length && toSegments?.length && curves) {\n let { minX, minY, maxX, maxY } = curveBounds(curves);\n const numPaths = edge.pathIds?.length ?? 0;\n if (drawPaths && numPaths > 0) {\n let padX = 0;\n let padY = 0;\n for (const o of pathRibbonOffsets(\n fromSegments,\n toSegments,\n numPaths,\n axis\n )) {\n padX = Math.max(padX, Math.abs(o.x));\n padY = Math.max(padY, Math.abs(o.y));\n }\n minX -= padX;\n minY -= padY;\n maxX += padX;\n maxY += padY;\n }\n extentX += maxX - minX;\n extentY += maxY - minY;\n boxes.push({ ei, minX, minY, maxX, maxY });\n }\n }\n this.cellSize = cellSizeFrom(boxes, extentX, extentY);\n for (const b of boxes) {\n addToGrid(this.cells, this.cellSize, b.minX, b.minY, b.maxX, b.maxY, b.ei);\n }\n }\n getCurves(ei) {\n return this.edgeCurves.get(ei);\n }\n query(x, y, radiusX, radiusY = radiusX) {\n return queryGrid(this.cells, this.cellSize, x, y, radiusX, radiusY);\n }\n};\n\nexport {\n SpatialIndex,\n EdgeSpatialIndex\n};\n", "import {\n EdgeSpatialIndex,\n SpatialIndex\n} from \"./chunk-3VCKBSML.js\";\nimport {\n weakMemo\n} from \"./chunk-HMXCN6PG.js\";\nimport {\n pathRibbonOffsets,\n translateCurves,\n yToXOf\n} from \"./chunk-UBQSRCWR.js\";\n\n// src/util/hitDetection.ts\nfunction distanceToSegment(px, py, x1, y1, x2, y2) {\n const dx = x2 - x1;\n const dy = y2 - y1;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) {\n return Math.hypot(px - x1, py - y1);\n }\n const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\nfunction distanceToCubicBezier(px, py, c) {\n let minDist = Infinity;\n const samples = 20;\n let lastX = c.x0;\n let lastY = c.y0;\n for (let i = 1; i <= samples; i++) {\n const t = i / samples;\n const u = 1 - t;\n const bx = u * u * u * c.x0 + 3 * u * u * t * c.cx0 + 3 * u * t * t * c.cx1 + t * t * t * c.x1;\n const by = u * u * u * c.y0 + 3 * u * u * t * c.cy0 + 3 * u * t * t * c.cy1 + t * t * t * c.y1;\n minDist = Math.min(minDist, distanceToSegment(px, py, lastX, lastY, bx, by));\n lastX = bx;\n lastY = by;\n }\n return minDist;\n}\nfunction distanceToEdgeCurves(px, py, curves, yToX = 1) {\n let minDist = Infinity;\n for (const c of curves) {\n const d = distanceToCubicBezier(\n px,\n py,\n yToX === 1 ? c : {\n x0: c.x0,\n y0: c.y0 * yToX,\n cx0: c.cx0,\n cy0: c.cy0 * yToX,\n cx1: c.cx1,\n cy1: c.cy1 * yToX,\n x1: c.x1,\n y1: c.y1 * yToX\n }\n );\n if (d < minDist) {\n minDist = d;\n }\n }\n return minDist;\n}\nvar nodeCache = weakMemo();\nfunction getSpatialIndex(nodePositions, version) {\n return nodeCache(\n nodePositions,\n [version],\n () => new SpatialIndex(nodePositions)\n );\n}\nvar edgeCache = weakMemo();\nfunction getEdgeSpatialIndex(nodePositions, graph, drawPaths, axis, version, deletions, routes, stranded = false) {\n return edgeCache(\n nodePositions,\n [\n graph,\n drawPaths,\n axis.scaleX,\n axis.scaleY,\n version,\n deletions,\n routes,\n stranded\n ],\n () => new EdgeSpatialIndex(\n nodePositions,\n graph,\n drawPaths,\n axis,\n deletions,\n version,\n routes,\n stranded\n )\n );\n}\nvar MIN_NODE_REACH_PX = 5;\nfunction findHoveredNode(nodePositions, graphX, graphY, axis, version = 0, ink) {\n const yToX = yToXOf(axis);\n const index = getSpatialIndex(nodePositions, version);\n const reach = (px) => Math.max(MIN_NODE_REACH_PX, px) / axis.scaleX;\n const queryReach = reach(ink?.maxHalfWidthPx ?? 0);\n const candidates = index.query(graphX, graphY, queryReach, queryReach / yToX);\n let hovered = null;\n let best = Infinity;\n for (const { nodeId, segmentIdx } of candidates) {\n const segments = nodePositions[nodeId];\n const dist = distanceToSegment(\n graphX,\n graphY * yToX,\n segments[segmentIdx].x,\n segments[segmentIdx].y * yToX,\n segments[segmentIdx + 1].x,\n segments[segmentIdx + 1].y * yToX\n );\n if (dist < best && dist < reach(ink?.halfWidthPx(nodeId) ?? 0)) {\n best = dist;\n hovered = nodeId;\n }\n }\n return hovered;\n}\nfunction segmentMeetsBox(a, b, box) {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n let t0 = 0;\n let t1 = 1;\n for (const [p, q] of [\n [-dx, a.x - box.x0],\n [dx, box.x1 - a.x],\n [-dy, a.y - box.y0],\n [dy, box.y1 - a.y]\n ]) {\n if (p === 0) {\n if (q < 0) {\n return false;\n }\n } else if (p < 0) {\n t0 = Math.max(t0, q / p);\n } else {\n t1 = Math.min(t1, q / p);\n }\n }\n return t0 <= t1;\n}\nfunction nodesUnderBox(nodePositions, t, version = 0) {\n const index = getSpatialIndex(nodePositions, version);\n const screen = (p) => ({\n x: p.x * t.scaleX + t.translateX,\n y: p.y * t.scaleY + t.translateY\n });\n return (box) => {\n const hits = /* @__PURE__ */ new Set();\n const candidates = index.query(\n ((box.x0 + box.x1) / 2 - t.translateX) / t.scaleX,\n ((box.y0 + box.y1) / 2 - t.translateY) / t.scaleY,\n Math.abs((box.x1 - box.x0) / 2 / t.scaleX),\n Math.abs((box.y1 - box.y0) / 2 / t.scaleY)\n );\n for (const { nodeId, segmentIdx } of candidates) {\n const line = nodePositions[nodeId];\n if (!hits.has(nodeId) && segmentMeetsBox(\n screen(line[segmentIdx]),\n screen(line[segmentIdx + 1]),\n box\n )) {\n hits.add(nodeId);\n }\n }\n return hits;\n };\n}\nfunction findHoveredEdge(nodePositions, graph, graphX, graphY, axis, drawPaths, version = 0, deletions, hiddenEdges, deletionRoutes, stranded = false) {\n const yToX = yToXOf(axis);\n const edgeThreshold = 10 / axis.scaleX;\n const edgeIndex = getEdgeSpatialIndex(\n nodePositions,\n graph,\n drawPaths,\n axis,\n version,\n deletions,\n deletionRoutes,\n stranded\n );\n const candidates = edgeIndex.query(\n graphX,\n graphY,\n edgeThreshold,\n edgeThreshold / yToX\n );\n let hovered = null;\n let best = edgeThreshold;\n for (const edgeIdx of candidates) {\n const edge = graph.edges[edgeIdx];\n const fromSegments = nodePositions[edge.from];\n const toSegments = nodePositions[edge.to];\n if (!fromSegments?.length || !toSegments?.length || hiddenEdges?.has(edgeIdx)) {\n continue;\n }\n const numPaths = edge.pathIds?.length ?? 0;\n const baseCurves = edgeIndex.getCurves(edgeIdx);\n if (!baseCurves) {\n continue;\n }\n let dist;\n if (!drawPaths || numPaths === 0) {\n dist = distanceToEdgeCurves(graphX, graphY * yToX, baseCurves, yToX);\n } else {\n let minDist = Infinity;\n for (const offset of pathRibbonOffsets(\n fromSegments,\n toSegments,\n numPaths,\n axis\n )) {\n const curves = offset.x === 0 && offset.y === 0 ? baseCurves : translateCurves(baseCurves, offset.x, offset.y);\n const d = distanceToEdgeCurves(graphX, graphY * yToX, curves, yToX);\n if (d < minDist) {\n minDist = d;\n }\n }\n dist = minDist;\n }\n if (dist < best) {\n best = dist;\n hovered = edgeIdx;\n }\n }\n return hovered;\n}\n\nexport {\n distanceToSegment,\n distanceToCubicBezier,\n findHoveredNode,\n nodesUnderBox,\n findHoveredEdge\n};\n", "import {\n nodesUnderBox\n} from \"./chunk-OMUPUB4J.js\";\nimport {\n graphLabels,\n rowLabelBox\n} from \"./chunk-PFRQBCGC.js\";\nimport {\n LABEL_CHAR_PX,\n LABEL_PAD,\n LABEL_PX,\n occupancy,\n placeLabels\n} from \"./chunk-AB35TJST.js\";\n\n// src/labelLayout.ts\nvar HALO_FACTOR = 3.4;\nvar LEGEND_INSET_PX = 6;\nvar GENE_PIN_DROP_PX = 18;\nvar GENE_STACK = 2;\nvar BUBBLE_STACK = 3;\nvar TOPMOST_BASELINE = LABEL_PX + LABEL_PAD;\nfunction geneCoverageNote(pin) {\n const length = pin.gene.end - pin.gene.start;\n if (pin.covered >= 0.98) {\n return void 0;\n }\n const [per, unit] = length >= 1e6 ? [1e6, \"Mb\"] : length >= 1e3 ? [1e3, \"kb\"] : [1, \"bp\"];\n const amount = (bp) => +(bp / per).toFixed(per === 1 ? 0 : 1);\n return `${amount(pin.covered * length)} of ${amount(length)} ${unit}`;\n}\nfunction geneLabelCandidates(pins, screen, contigThickness, nodesUnder) {\n const ink = contigThickness / 2;\n return byExtent(pins, (pin) => pin.gene.end - pin.gene.start).map((pin) => {\n const { x, y } = screen(pin.at);\n const note = geneCoverageNote(pin);\n return {\n item: pin,\n x,\n y: y + contigThickness + GENE_PIN_DROP_PX,\n text: note ? `${pin.gene.name} \\xB7 ${note}` : pin.gene.name,\n fallback: note ? `${pin.gene.name} \\u2026` : void 0,\n stack: GENE_STACK,\n fits: (box) => [\n ...nodesUnder({\n x0: box.x0 - ink,\n x1: box.x1 + ink,\n y0: box.y0 - ink,\n y1: box.y1 + ink\n })\n ].every((id) => pin.nodeIds.has(id))\n };\n });\n}\nfunction byExtent(items, extent) {\n return [...items].sort((a, b) => extent(b) - extent(a));\n}\nfunction layoutLabels(m) {\n const { paneWidth: width, canvasHeight: height, translateX, translateY } = m;\n const { scaleX, scaleY } = m.axisScale;\n const frame = { width, height };\n const screen = (p) => ({\n x: p.x * scaleX + translateX,\n y: p.y * scaleY + translateY\n });\n const reserved = m.drawnRowLabels.map(\n ({ label, y }) => rowLabelBox(label, y * scaleY + translateY)\n );\n const stripPx = m.referenceStripZonePx ?? 0;\n if (stripPx > 0) {\n reserved.push({ x0: 0, x1: width, y0: 0, y1: stripPx });\n }\n if (m.legendSize.width > 0) {\n reserved.push({\n x0: width - LEGEND_INSET_PX - m.legendSize.width,\n x1: width,\n y0: 0,\n y1: stripPx + LEGEND_INSET_PX + m.legendSize.height\n });\n }\n if (m.poppedFrom) {\n reserved.push({\n x0: 0,\n x1: 60 + m.poppedFrom.label.length * LABEL_CHAR_PX * 1.2,\n y0: 0,\n y1: 44\n });\n }\n const take = occupancy(frame, reserved);\n const onRows = m.drawnRowLabels.length > 0;\n const rowsTop = onRows ? Math.min(...m.drawnRowLabels.map((r) => r.y)) : Infinity;\n const halo = m.contigThickness * HALO_FACTOR;\n const above = (h, gap) => {\n const { x, y } = screen({\n x: h.labelAt.x,\n y: Math.min(h.labelAt.y, rowsTop)\n });\n const baseline = y - halo / 2 - gap;\n return { x, y: onRows ? Math.max(baseline, TOPMOST_BASELINE) : baseline };\n };\n const byBubble = byExtent(\n m.bubbleHalos.filter((h) => !h.tick),\n (h) => h.whole ? -1 : h.members\n );\n const bubbles = placeLabels(\n byBubble.map((h) => ({\n item: h,\n ...above(h, 6),\n text: h.label,\n // `0 bp\u201311 kb superbubble` where `\u2026, 1198 segments, 5 routes` does not fit\n fallback: h.label.includes(\",\") ? h.label.split(\",\")[0] : void 0,\n stack: BUBBLE_STACK\n })),\n frame,\n take\n );\n const ticks = m.bubbleHalos.filter((h) => h.tick && !h.whole).map((h) => ({ item: h, ...above(h, 2) })).filter((t) => t.x >= 0 && t.x <= width && t.y >= 0 && t.y <= height);\n const genes = placeLabels(\n geneLabelCandidates(\n m.genePins,\n screen,\n m.contigThickness,\n nodesUnderBox(\n m.nodePositions ?? {},\n { scaleX, scaleY, translateX, translateY },\n m.positionsVersion\n )\n ),\n frame,\n take\n );\n const sizes = m.nodePositions && m.labelsNodeSizes ? graphLabels({\n nodePositions: m.nodePositions,\n nodeLengths: m.nodeLengths,\n deletions: m.deletions,\n deletionRoutes: m.deletionRoutes,\n stranded: m.stranded,\n alleleDeletions: m.alleleDeletions,\n axis: m.axisScale,\n translateX,\n translateY,\n width,\n height,\n version: m.positionsVersion,\n take\n }) : [];\n return {\n bubbles,\n ticks,\n genes,\n sizes\n };\n}\n\nexport {\n HALO_FACTOR,\n LEGEND_INSET_PX,\n geneCoverageNote,\n geneLabelCandidates,\n layoutLabels\n};\n", "const host = JBrowseExports[\"mobx\"]\nconst read = name =>\n host != null && name in Object(host)\n ? host[name]\n : Object.assign(\n function () {\n throw new Error(\n \"This JBrowse does not provide '\" + name + \"' from '\" + \"mobx\" + \"' to plugins: GraphGenomeView was built for a different JBrowse version, so update the plugin or JBrowse\",\n )\n },\n { jbrowseHostMissing: name },\n )\nexport const $mobx = /* @__PURE__ */ read(\"$mobx\")\nexport const FlowCancellationError = /* @__PURE__ */ read(\"FlowCancellationError\")\nexport const ObservableMap = /* @__PURE__ */ read(\"ObservableMap\")\nexport const ObservableSet = /* @__PURE__ */ read(\"ObservableSet\")\nexport const Reaction = /* @__PURE__ */ read(\"Reaction\")\nexport const _allowStateChanges = /* @__PURE__ */ read(\"_allowStateChanges\")\nexport const _allowStateChangesInsideComputed = /* @__PURE__ */ read(\"_allowStateChangesInsideComputed\")\nexport const _allowStateReadsEnd = /* @__PURE__ */ read(\"_allowStateReadsEnd\")\nexport const _allowStateReadsStart = /* @__PURE__ */ read(\"_allowStateReadsStart\")\nexport const _autoAction = /* @__PURE__ */ read(\"_autoAction\")\nexport const _autoActionBound = /* @__PURE__ */ read(\"_autoActionBound\")\nexport const _endAction = /* @__PURE__ */ read(\"_endAction\")\nexport const _getAdministration = /* @__PURE__ */ read(\"_getAdministration\")\nexport const _getGlobalState = /* @__PURE__ */ read(\"_getGlobalState\")\nexport const _interceptReads = /* @__PURE__ */ read(\"_interceptReads\")\nexport const _isComputingDerivation = /* @__PURE__ */ read(\"_isComputingDerivation\")\nexport const _resetGlobalState = /* @__PURE__ */ read(\"_resetGlobalState\")\nexport const _startAction = /* @__PURE__ */ read(\"_startAction\")\nexport const action = /* @__PURE__ */ read(\"action\")\nexport const actionBound = /* @__PURE__ */ read(\"actionBound\")\nexport const autorun = /* @__PURE__ */ read(\"autorun\")\nexport const compareDefault = /* @__PURE__ */ read(\"compareDefault\")\nexport const compareIdentity = /* @__PURE__ */ read(\"compareIdentity\")\nexport const compareShallow = /* @__PURE__ */ read(\"compareShallow\")\nexport const compareStructural = /* @__PURE__ */ read(\"compareStructural\")\nexport const computed = /* @__PURE__ */ read(\"computed\")\nexport const computedStruct = /* @__PURE__ */ read(\"computedStruct\")\nexport const configure = /* @__PURE__ */ read(\"configure\")\nexport const createAtom = /* @__PURE__ */ read(\"createAtom\")\nexport const defineProperty = /* @__PURE__ */ read(\"defineProperty\")\nexport const entries = /* @__PURE__ */ read(\"entries\")\nexport const extendObservable = /* @__PURE__ */ read(\"extendObservable\")\nexport const flow = /* @__PURE__ */ read(\"flow\")\nexport const flowBound = /* @__PURE__ */ read(\"flowBound\")\nexport const flowResult = /* @__PURE__ */ read(\"flowResult\")\nexport const get = /* @__PURE__ */ read(\"get\")\nexport const getAtom = /* @__PURE__ */ read(\"getAtom\")\nexport const getDebugName = /* @__PURE__ */ read(\"getDebugName\")\nexport const getDependencyTree = /* @__PURE__ */ read(\"getDependencyTree\")\nexport const getObserverTree = /* @__PURE__ */ read(\"getObserverTree\")\nexport const has = /* @__PURE__ */ read(\"has\")\nexport const intercept = /* @__PURE__ */ read(\"intercept\")\nexport const isAction = /* @__PURE__ */ read(\"isAction\")\nexport const isBoxedObservable = /* @__PURE__ */ read(\"isBoxedObservable\")\nexport const isComputed = /* @__PURE__ */ read(\"isComputed\")\nexport const isComputedProp = /* @__PURE__ */ read(\"isComputedProp\")\nexport const isFlow = /* @__PURE__ */ read(\"isFlow\")\nexport const isFlowCancellationError = /* @__PURE__ */ read(\"isFlowCancellationError\")\nexport const isObservable = /* @__PURE__ */ read(\"isObservable\")\nexport const isObservableArray = /* @__PURE__ */ read(\"isObservableArray\")\nexport const isObservableMap = /* @__PURE__ */ read(\"isObservableMap\")\nexport const isObservableObject = /* @__PURE__ */ read(\"isObservableObject\")\nexport const isObservableProp = /* @__PURE__ */ read(\"isObservableProp\")\nexport const isObservableSet = /* @__PURE__ */ read(\"isObservableSet\")\nexport const keys = /* @__PURE__ */ read(\"keys\")\nexport const makeAutoObservable = /* @__PURE__ */ read(\"makeAutoObservable\")\nexport const makeObservable = /* @__PURE__ */ read(\"makeObservable\")\nexport const observable = /* @__PURE__ */ read(\"observable\")\nexport const observableDeep = /* @__PURE__ */ read(\"observableDeep\")\nexport const observableRef = /* @__PURE__ */ read(\"observableRef\")\nexport const observableShallow = /* @__PURE__ */ read(\"observableShallow\")\nexport const observableStruct = /* @__PURE__ */ read(\"observableStruct\")\nexport const observe = /* @__PURE__ */ read(\"observe\")\nexport const onBecomeObserved = /* @__PURE__ */ read(\"onBecomeObserved\")\nexport const onBecomeUnobserved = /* @__PURE__ */ read(\"onBecomeUnobserved\")\nexport const onReactionError = /* @__PURE__ */ read(\"onReactionError\")\nexport const override = /* @__PURE__ */ read(\"override\")\nexport const ownKeys = /* @__PURE__ */ read(\"ownKeys\")\nexport const reaction = /* @__PURE__ */ read(\"reaction\")\nexport const remove = /* @__PURE__ */ read(\"remove\")\nexport const runInAction = /* @__PURE__ */ read(\"runInAction\")\nexport const set = /* @__PURE__ */ read(\"set\")\nexport const spy = /* @__PURE__ */ read(\"spy\")\nexport const toJS = /* @__PURE__ */ read(\"toJS\")\nexport const transaction = /* @__PURE__ */ read(\"transaction\")\nexport const untracked = /* @__PURE__ */ read(\"untracked\")\nexport const values = /* @__PURE__ */ read(\"values\")\nexport const when = /* @__PURE__ */ read(\"when\")\nexport default host && host.__esModule ? host.default : host", "import {\n parseCs\n} from \"./chunk-C44YRP5F.js\";\n\n// src/tubeMap/reads.ts\nfunction canonicalStrand(node) {\n return node.id.endsWith(\"-\") ? \"-\" : \"+\";\n}\nfunction stepName(node, strand) {\n return strand === canonicalStrand(node) ? node.id : `-${node.id}`;\n}\nfunction stepStarts(lengths, total) {\n const starts = lengths.map(() => void 0);\n let head = 0;\n let i = 0;\n for (; i < lengths.length && lengths[i] !== void 0; i++) {\n starts[i] = head;\n head += lengths[i];\n }\n let tail = total;\n for (let j = lengths.length - 1; j > i && lengths[j] !== void 0; j--) {\n tail -= lengths[j];\n starts[j] = tail;\n }\n return starts;\n}\nfunction mismatchesByStep(record, lengths) {\n const byStep = record.path.map(() => []);\n if (record.cs === void 0) {\n return byStep;\n }\n const starts = stepStarts(lengths, record.pathLength);\n const known = starts.flatMap((start, s) => start === void 0 ? [] : [s]);\n const startOf = (k) => starts[known[k]];\n const endOf = (k) => startOf(k) + lengths[known[k]];\n let first = 0;\n const stepAt = (pos2) => {\n while (first < known.length && endOf(first) < pos2) {\n first++;\n }\n for (let k = first; k < known.length && startOf(k) <= pos2; k++) {\n const end = endOf(k);\n if (pos2 < end) {\n return { s: known[k], local: pos2 - startOf(k), room: end - pos2 };\n }\n }\n return void 0;\n };\n const unplacedFrom = (pos2) => {\n for (let k = first; k < known.length; k++) {\n if (startOf(k) > pos2) {\n return startOf(k) - pos2;\n }\n }\n return Infinity;\n };\n const add = (s, mismatch) => {\n const list = byStep[s];\n const last = list.at(-1);\n if (mismatch.type === \"substitution\" && last?.type === \"substitution\" && last.pos + last.seq.length === mismatch.pos) {\n last.seq += mismatch.seq;\n } else {\n list.push(mismatch);\n }\n };\n let pos = record.pathStart;\n for (const op of parseCs(record.cs)) {\n if (op.op === \"match\") {\n pos += op.length;\n } else if (op.op === \"substitution\") {\n const at = stepAt(pos);\n if (at) {\n add(at.s, { type: \"substitution\", pos: at.local, seq: op.seq });\n }\n pos += 1;\n } else if (op.op === \"insertion\") {\n const at = pos > record.pathStart && pos < record.pathEnd ? stepAt(pos) : void 0;\n if (at) {\n add(at.s, { type: \"insertion\", pos: at.local, seq: op.seq });\n }\n } else {\n let left = op.length;\n while (left > 0) {\n const at = stepAt(pos);\n const take = Math.min(left, at ? at.room : unplacedFrom(pos));\n if (at) {\n add(at.s, { type: \"deletion\", pos: at.local, length: take });\n }\n pos += take;\n left -= take;\n }\n }\n }\n return byStep;\n}\nfunction tubeMapReads(graph, records, firstId) {\n const nodeByName = new Map(graph.nodes.map((n) => [n.name, n]));\n const reads = [];\n for (const record of records) {\n const nodes = record.path.map((step) => nodeByName.get(step.name));\n const kept = nodes.flatMap((node, i) => node ? [i] : []);\n const first = kept[0];\n const last = kept.at(-1);\n if (first !== void 0 && last !== void 0) {\n const mismatches = mismatchesByStep(\n record,\n nodes.map((n) => n?.length)\n );\n const names = kept.map((i) => stepName(nodes[i], record.path[i].strand));\n const lastLength = nodes[last].length;\n reads.push({\n id: firstId + reads.length,\n name: record.name,\n type: \"read\",\n sourceTrackID: 1,\n sequence: names,\n sequenceNew: kept.map((i, k) => ({\n nodeName: names[k],\n mismatches: mismatches[i]\n })),\n firstNodeOffset: first === 0 ? record.pathStart : 0,\n finalNodeCoverLength: last === record.path.length - 1 ? lastLength - (record.pathLength - record.pathEnd) : lastLength,\n // 255 is GAF's missing MAPQ\n mapping_quality: record.mappingQuality === 255 ? void 0 : record.mappingQuality,\n is_secondary: record.secondary,\n is_reverse: record.strand === \"-\"\n });\n }\n }\n return reads;\n}\nvar FORWARD_READ_COLORS = [\"#6baed6\", \"#4292c6\", \"#2171b5\", \"#08519c\"];\nvar REVERSE_READ_COLORS = [\"#fb6a4a\", \"#ef3b2c\", \"#cb181d\", \"#a50f15\"];\nfunction readColor(read) {\n const colors = read.is_reverse ? REVERSE_READ_COLORS : FORWARD_READ_COLORS;\n return colors[read.id % colors.length];\n}\n\nexport {\n canonicalStrand,\n stepName,\n tubeMapReads,\n FORWARD_READ_COLORS,\n REVERSE_READ_COLORS,\n readColor\n};\n", "// src/el.ts\nfunction el(tag, attrs = {}, ...children) {\n return {\n tag,\n attrs,\n children: children.filter((c) => !!c || c === \"\")\n };\n}\nfunction escapeText(s) {\n return s.replaceAll(\"&\", \"&amp;\").replaceAll(\"<\", \"&lt;\").replaceAll(\">\", \"&gt;\");\n}\nfunction escapeAttr(s) {\n return escapeText(s).replaceAll('\"', \"&quot;\");\n}\nfunction serializeEl(node) {\n if (typeof node === \"string\") {\n return escapeText(node);\n }\n const attrs = Object.entries(node.attrs).filter(([, v]) => v !== void 0).map(([k, v]) => ` ${k}=\"${escapeAttr(String(v))}\"`).join(\"\");\n return `<${node.tag}${attrs}>${node.children.map(serializeEl).join(\"\")}</${node.tag}>`;\n}\n\nexport {\n el,\n escapeAttr,\n serializeEl\n};\n", "import {\n el\n} from \"./chunk-H2H4Y3TV.js\";\nimport {\n REFERENCE_RAMP_ALT_CSS\n} from \"./chunk-SWCULW6S.js\";\nimport {\n RAMP_GRADIENT_CSS,\n RAMP_GRADIENT_STOPS,\n rampHueCss,\n rampStops\n} from \"./chunk-GQZVR5DW.js\";\nimport {\n GAP_CAUSE_TEXT,\n OUTSIDE_TEXT\n} from \"./chunk-EIY2SKD3.js\";\nimport {\n LABEL_CHAR_PX\n} from \"./chunk-AB35TJST.js\";\nimport {\n ROW_HEIGHT_PX\n} from \"./chunk-CPMHA4W5.js\";\nimport {\n panSNContig\n} from \"./chunk-4XWZNPQ2.js\";\n\n// src/layout/walkRowDraw.ts\nvar ON_REFERENCE = \"#2f8fd6\";\nvar OFF_REFERENCE = \"#8e3fbf\";\nvar OUTSIDE_CUT = \"#bdbdbd\";\nvar MISSING_INK = \"#8a8a8a\";\nvar UNKNOWN_GAP = \"#e2e2e2\";\nvar GENE_INK = \"#1c1c22\";\nvar BAR_PX = 12;\nvar GAP_PX = 4;\nvar MISSING_PX = 1;\nvar LABELLED_ROW_PX = 12;\nvar MIN_TILED_BAR_PX = 6;\nvar MIN_TILE_PX = 3;\nfunction kb(bp) {\n return `${(bp / 1e3).toFixed(bp < 1e4 ? 1 : 0)} kb`;\n}\nfunction signedLength(delta) {\n const size = Math.abs(delta);\n return `${delta > 0 ? \"+\" : \"\\u2212\"}${size < 1e3 ? `${size} bp` : kb(size)}`;\n}\nfunction units(bp, unit) {\n return unit ? ` \\u2248 ${Math.round(bp / unit)} units` : \"\";\n}\nvar near = ({ refName, start }) => `${panSNContig(refName)}:${start < 1e6 ? `${Math.round(start / 1e3)} kb` : `${(start / 1e6).toFixed(1)} Mb`}`;\nfunction gapsText(gapBp, runs) {\n const gaps = (runs ?? []).filter((r) => r.gap);\n if (gapBp <= 0) {\n return \"\";\n }\n if (!gaps.some((g) => g.cause)) {\n return ` \\xB7 ${kb(gapBp)} ${OUTSIDE_TEXT}`;\n }\n const bpOf = (cause) => gaps.filter((g) => g.cause === cause).reduce((sum, g) => sum + g.bp, 0);\n const places = [\n ...new Set(gaps.flatMap((g) => g.chunk ? [near(g.chunk)] : []))\n ];\n const parts = [\n [bpOf(\"missing\"), GAP_CAUSE_TEXT.missing],\n [\n bpOf(\"elsewhere\"),\n `on nodes filed near ${places[0]}${places.length > 1 ? ` and ${places.length - 1} more place${places.length > 2 ? \"s\" : \"\"}` : \"\"}`\n ],\n [bpOf(\"unknown\"), GAP_CAUSE_TEXT.unknown],\n [bpOf(void 0), OUTSIDE_TEXT]\n ];\n return parts.filter(([bp]) => bp > 0).map(([bp, text]) => ` \\xB7 ${kb(bp)} ${text}`).join(\"\");\n}\nfunction walkRowReadout(row, reference, unit, call) {\n const { bp, gapBp, complete, stop } = row;\n if (!reference) {\n return `${kb(bp)}${units(bp, unit)}`;\n }\n const outside = gapsText(gapBp, row.runs);\n const called = call ? ` \\xB7 called ${kb(call.bp)}${call.spanningReads === 0 ? \" \\xB7 no spanning read\" : \"\"}` : \"\";\n if (complete) {\n const delta = bp - reference.bp;\n const against = delta === 0 ? \"\" : ` (${signedLength(delta)})`;\n return `${kb(bp)}${units(bp, unit)}${against}${outside}${called}`;\n }\n const region = unit ? \"repeat\" : \"window\";\n if (stop?.contigEnds && bp === 0) {\n const where = stop.shortBp > 0 ? `${kb(stop.shortBp)} before` : \"at\";\n return `contig ends ${where} the ${region}${called}`;\n }\n const why = !stop ? \"partial walk\" : stop.contigEnds ? `contig ends inside the ${region}` : \"does not rejoin the reference within the extracted subgraph\";\n return `\\u2265 ${kb(bp)}${units(bp, unit)} \\xB7 ${why}${outside}${called}`;\n}\nfunction readoutPlacement(text, endX, width) {\n const x = endX + 6;\n const fits = x + text.length * LABEL_CHAR_PX < width;\n return fits ? { x, anchor: \"start\", halo: false } : { x: endX - 6, anchor: \"end\", halo: true };\n}\nfunction unitTicks(bp, unit, pxPerBp) {\n if (unit * pxPerBp < MIN_TILE_PX) {\n return [];\n }\n const ticks = [];\n for (let k = unit; k < bp; k += unit) {\n ticks.push(k);\n }\n return ticks;\n}\nfunction gapStyle(cause) {\n return cause === \"missing\" ? { fill: MISSING_INK, px: MISSING_PX, label: GAP_CAUSE_TEXT.missing } : cause === \"unknown\" ? { fill: UNKNOWN_GAP, px: GAP_PX, label: GAP_CAUSE_TEXT.unknown } : { fill: OUTSIDE_CUT, px: GAP_PX, label: OUTSIDE_TEXT };\n}\nfunction runPaint(run, ramp) {\n if (run.gap) {\n return { fill: gapStyle(run.cause).fill };\n }\n if (!ramp) {\n return { fill: run.onReference ? ON_REFERENCE : OFF_REFERENCE };\n }\n if (run.referenceStart === void 0) {\n return { fill: REFERENCE_RAMP_ALT_CSS };\n }\n const stops = rampStops({ ...run, start: run.referenceStart }, ramp);\n return stops.length === 1 ? { fill: rampHueCss(stops[0]) } : { stops: stops.map(rampHueCss) };\n}\nfunction alongRow(axis, start, end) {\n return axis.reversed ? { start: axis.start - end, end: axis.start - start } : { start: start - axis.start, end: end - axis.start };\n}\nfunction rowSpan(axis, bp) {\n return axis.reversed ? { start: axis.start - bp, end: axis.start } : { start: axis.start, end: axis.start + bp };\n}\nfunction genesOnRow(row, genes) {\n const contig = row.axis?.contig;\n return genes.filter(\n (g) => g.refName === contig || g.refName.endsWith(`#${contig}`)\n );\n}\nfunction placeRowGenes(rows, byRow) {\n const placed = /* @__PURE__ */ new Map();\n for (const row of rows) {\n const genes = byRow.get(row.name);\n if (!row.axis || !genes) {\n continue;\n }\n const axis = row.axis;\n const clip = ({ start, end }) => ({\n start: Math.max(0, start),\n end: Math.min(row.bp, end)\n });\n placed.set(\n row.name,\n genes.map((g) => ({\n name: g.name,\n ...clip(alongRow(axis, g.start, g.end)),\n exons: g.exons.map((e) => clip(alongRow(axis, e.start, e.end))).filter((e) => e.end > e.start)\n })).filter((g) => g.end > g.start).sort((a, b) => a.start - b.start)\n );\n }\n return placed;\n}\nvar GENE_FONT_PX = 9;\nvar GENE_CHAR_PX = 5.2;\nvar MIN_LETTERED_BAR_PX = 8;\nvar genePad = (rowPx, barPx) => Math.min(2, (rowPx - barPx) / 2 - 1);\nfunction boxesGenes(rowPx, barPx) {\n return genePad(rowPx, barPx) >= 1;\n}\nfunction rowGeneBoxes(genes, X, y, { rowPx = ROW_HEIGHT_PX, barPx = BAR_PX } = {}) {\n if (!boxesGenes(rowPx, barPx)) {\n return [];\n }\n const pad = genePad(rowPx, barPx);\n const boxes = genes.map((g) => {\n const x = X(g.start);\n return {\n g,\n x,\n w: Math.max(2, X(g.end) - x)\n };\n });\n const taken = [];\n const named = new Set(\n (barPx >= MIN_LETTERED_BAR_PX ? [...boxes] : []).sort((a, b) => a.w - b.w).filter(({ g, x, w }) => {\n const half = g.name.length * GENE_CHAR_PX / 2;\n const at = [x + w / 2 - half, x + w / 2 + half];\n if (2 * half > w + 6 || taken.some(([a, b]) => at[0] < b + 2 && at[1] > a - 2)) {\n return false;\n }\n taken.push(at);\n return true;\n })\n );\n return boxes.map((box) => ({\n name: box.g.name,\n x: box.x,\n y: y - barPx / 2 - pad,\n w: box.w,\n h: barPx + 2 * pad,\n exons: box.g.exons.map((e) => ({\n x: X(e.start),\n w: Math.max(1, X(e.end) - X(e.start))\n })),\n label: named.has(box) ? { x: box.x + box.w / 2, y: y + 3, size: GENE_FONT_PX } : void 0\n }));\n}\nvar rowsText = (n) => `${n} row${n === 1 ? \"\" : \"s\"}`;\nfunction walkRowsKey(bars, o = {}) {\n const entries = [\n {\n swatch: o.ramp ? { kind: \"bar\", fill: o.rampCss ?? RAMP_GRADIENT_CSS, ramp: true } : { kind: \"bar\", fill: ON_REFERENCE },\n label: `on ${bars.reference.label}'s path`\n },\n {\n swatch: {\n kind: \"bar\",\n fill: o.ramp ? REFERENCE_RAMP_ALT_CSS : OFF_REFERENCE\n },\n label: `off ${bars.reference.label}'s path`\n }\n ];\n const gaps = [bars.reference, ...bars.rows].flatMap(\n (row) => row.runs.filter((run) => run.gap)\n );\n const labels = new Set(gaps.map((run) => gapStyle(run.cause).label));\n for (const cause of [void 0, \"missing\", \"unknown\"]) {\n const { fill, px, label } = gapStyle(cause);\n if (labels.has(label)) {\n entries.push({ swatch: { kind: \"gap\", fill, px }, label });\n }\n }\n if (o.genes?.crowded) {\n entries.push({\n swatch: { kind: \"gene\" },\n label: \"genes left out: too many rows to box them in\",\n note: true\n });\n } else if (o.genes) {\n entries.push({\n swatch: { kind: \"gene\" },\n label: \"gene\"\n });\n if (o.genes.untracked) {\n entries.push({\n swatch: { kind: \"gene\" },\n label: `no gene track for ${rowsText(o.genes.untracked)}`,\n note: true\n });\n }\n if (o.genes.unplaced) {\n entries.push({\n swatch: { kind: \"gene\" },\n label: `no contig coordinates for ${rowsText(o.genes.unplaced)}`,\n note: true\n });\n }\n if (o.genes.unread) {\n entries.push({\n swatch: { kind: \"gene\" },\n label: `genes not read for the last ${rowsText(o.genes.unread)}`,\n note: true\n });\n }\n }\n return entries;\n}\nvar CALL_TICK = \"#111\";\nvar UNBACKED_TICK = \"#9e9e9e\";\nvar DISAGREES = \"#c62828\";\nfunction callTickInk(call) {\n return call.agrees === false ? DISAGREES : call.spanningReads === 0 ? UNBACKED_TICK : CALL_TICK;\n}\nfunction walkRowsKeyTree(entries, x, y, idPrefix = \"walk-key\") {\n let at = 0;\n const parts = entries.flatMap((e, i) => {\n const rampId = `${idPrefix}-ramp-${i}`;\n const ramp = !e.note && e.swatch.kind === \"bar\" && e.swatch.ramp ? el(\n \"linearGradient\",\n { id: rampId },\n ...RAMP_GRADIENT_STOPS.map(\n (s) => el(\"stop\", { offset: s.offset, \"stop-color\": s.color })\n )\n ) : void 0;\n const swatch = e.note ? void 0 : e.swatch.kind === \"gene\" ? el(\"rect\", {\n x: at,\n y: 5,\n width: 18,\n height: 8,\n fill: \"none\",\n stroke: GENE_INK,\n \"stroke-width\": 1.5\n }) : el(\"rect\", {\n x: at,\n y: e.swatch.kind === \"gap\" ? 9 - e.swatch.px / 2 : 5,\n width: 18,\n height: e.swatch.kind === \"gap\" ? e.swatch.px : 8,\n rx: 2,\n fill: ramp ? `url(#${rampId})` : e.swatch.fill\n });\n const text = el(\n \"text\",\n {\n x: e.note ? at : at + 23,\n y: 13,\n \"font-style\": e.note ? \"italic\" : void 0,\n fill: e.note ? \"#666\" : void 0\n },\n e.label\n );\n at += (e.note ? 0 : 23) + e.label.length * LABEL_CHAR_PX + 16;\n return [ramp, swatch, text].filter((p) => p !== void 0);\n });\n return {\n width: at,\n tree: el(\n \"g\",\n {\n transform: `translate(${x} ${y})`,\n \"font-family\": \"Helvetica, Arial, sans-serif\",\n \"font-size\": 11\n },\n ...parts\n )\n };\n}\nfunction rowPitch(count, room, minRowPx = 0) {\n const fit = room / Math.max(1, count);\n const rowPx = Math.max(\n minRowPx,\n Math.min(ROW_HEIGHT_PX, fit >= 1 ? Math.floor(fit) : fit)\n );\n return {\n rowPx,\n barPx: rowPx <= 3 ? rowPx : Math.max(3, Math.round(rowPx * 0.6)),\n labelled: rowPx >= LABELLED_ROW_PX,\n readouts: rowPx >= LABELLED_ROW_PX\n };\n}\nfunction coalesceRuns(runs, pxPerBp) {\n const minBp = 1 / pxPerBp;\n const out = [];\n let bucket = [];\n const flush = () => {\n if (bucket.length === 0) {\n return;\n }\n if (bucket.length === 1) {\n out.push(bucket[0]);\n } else {\n let on = 0;\n let off = 0;\n for (const r of bucket) {\n if (r.onReference) {\n on += r.bp;\n } else {\n off += r.bp;\n }\n }\n const onReference = on >= off;\n const lead = bucket.find((r) => r.onReference === onReference);\n out.push({\n start: bucket[0].start,\n bp: on + off,\n onReference,\n referenceStart: onReference ? lead.referenceStart : void 0,\n ...lead.reversed ? { reversed: true } : {}\n });\n }\n bucket = [];\n };\n let held = 0;\n for (const run of runs) {\n if (run.gap || run.bp >= minBp) {\n flush();\n held = 0;\n out.push(run);\n continue;\n }\n bucket.push(run);\n held += run.bp;\n if (held >= minBp) {\n flush();\n held = 0;\n }\n }\n flush();\n return out;\n}\nfunction geneTree(box, y, barPx) {\n return el(\n \"g\",\n { class: \"row-gene\", \"data-testid\": \"graph-walk-gene\" },\n el(\"title\", {}, box.name),\n ...box.exons.map(\n (e) => el(\"rect\", {\n x: e.x,\n y: y - barPx / 2,\n width: e.w,\n height: barPx,\n fill: GENE_INK,\n opacity: 0.35\n })\n ),\n el(\"rect\", {\n x: box.x,\n y: box.y,\n width: box.w,\n height: box.h,\n fill: \"none\",\n stroke: GENE_INK,\n \"stroke-width\": 1.5\n }),\n box.label && el(\n \"text\",\n {\n x: box.label.x,\n y: box.label.y,\n \"font-family\": \"sans-serif\",\n \"font-size\": box.label.size,\n \"font-weight\": 600,\n \"text-anchor\": \"middle\",\n fill: GENE_INK,\n stroke: \"white\",\n \"stroke-width\": 2.5,\n \"paint-order\": \"stroke\"\n },\n box.name\n )\n );\n}\nfunction walkRowsTree(bars, frame, o = {}) {\n const X = (bp) => bp * frame.scaleX + frame.translateX;\n const rowPx = frame.rowPx ?? ROW_HEIGHT_PX;\n const barPx = frame.barPx ?? BAR_PX;\n const overhang = Math.min(3, Math.max(0, (rowPx - barPx) / 2));\n const Y = (row) => row * rowPx * frame.scaleY + frame.translateY;\n const { origin, unit, reference, rows } = bars;\n const along = (offset) => X(origin + offset);\n const prefix = o.idPrefix ?? \"walkrow\";\n const rowTree = (row, i) => {\n const y = Y(i);\n if (y < -barPx || y > frame.height + barPx) {\n return void 0;\n }\n const drawn = frame.bars === false ? [] : row.runs;\n const runs = coalesceRuns(drawn, frame.scaleX).flatMap((run) => {\n const paint = runPaint(run, o.ramp);\n const h = run.gap ? Math.min(gapStyle(run.cause).px, barPx) : barPx;\n const id = `${prefix}-${i}-${run.start}`;\n const rect = el(\"rect\", {\n x: along(run.start),\n y: y - h / 2,\n width: Math.max(1, run.bp * frame.scaleX),\n height: h,\n fill: \"stops\" in paint ? `url(#${id})` : paint.fill\n });\n return \"stops\" in paint ? [\n el(\n \"linearGradient\",\n { id },\n ...paint.stops.map(\n (color, k) => el(\"stop\", {\n offset: k / (paint.stops.length - 1),\n \"stop-color\": color\n })\n )\n ),\n rect\n ] : [rect];\n });\n const ticks = unit && barPx >= MIN_TILED_BAR_PX ? unitTicks(row.bp, unit, frame.scaleX).map(\n (k) => el(\"line\", {\n x1: along(k),\n x2: along(k),\n y1: y - barPx / 2,\n y2: y + barPx / 2,\n stroke: \"white\",\n \"stroke-width\": 1\n })\n ) : [];\n const { call } = row;\n const text = walkRowReadout(\n row,\n i === 0 ? void 0 : reference,\n unit,\n call\n );\n const at = readoutPlacement(text, along(row.bp), frame.width);\n const readouts = frame.readouts ?? true;\n return el(\n \"g\",\n {\n \"data-testid\": i === 0 ? \"graph-walk-reference\" : \"graph-walk-row\"\n },\n ...runs,\n ...ticks,\n ...rowGeneBoxes(o.rowGenes?.get(row.name) ?? [], along, y, {\n rowPx,\n barPx\n }).map((box) => geneTree(box, y, barPx)),\n call && el(\"rect\", {\n \"data-testid\": \"graph-walk-call\",\n x: along(call.bp) - 1,\n y: y - barPx / 2 - overhang,\n width: 2,\n height: barPx + 2 * overhang,\n fill: callTickInk(call)\n }),\n readouts && el(\n \"text\",\n {\n x: at.x,\n y: y + 4,\n \"font-family\": \"sans-serif\",\n \"font-size\": 11,\n fill: call?.agrees === false ? DISAGREES : \"#333\",\n stroke: at.halo ? \"white\" : void 0,\n \"stroke-width\": at.halo ? 3 : void 0,\n \"paint-order\": \"stroke\",\n \"text-anchor\": at.anchor\n },\n text\n )\n );\n };\n return el(\"g\", {}, ...[reference, ...rows].map(rowTree));\n}\n\nexport {\n ON_REFERENCE,\n OFF_REFERENCE,\n OUTSIDE_CUT,\n MISSING_INK,\n UNKNOWN_GAP,\n GENE_INK,\n BAR_PX,\n GAP_PX,\n MISSING_PX,\n LABELLED_ROW_PX,\n walkRowReadout,\n readoutPlacement,\n unitTicks,\n gapStyle,\n runPaint,\n alongRow,\n rowSpan,\n genesOnRow,\n placeRowGenes,\n boxesGenes,\n rowGeneBoxes,\n walkRowsKey,\n CALL_TICK,\n UNBACKED_TICK,\n DISAGREES,\n callTickInk,\n walkRowsKeyTree,\n rowPitch,\n coalesceRuns,\n walkRowsTree\n};\n", "import {\n SATURATED_PATH_COUNT\n} from \"./chunk-FX4RDMDN.js\";\nimport {\n formatBp\n} from \"./chunk-PFRQBCGC.js\";\n\n// src/bubbles/classifyBubble.ts\nvar REPEAT_GROWTH = 10;\nfunction coveringRepeat(b, repeats) {\n const span = b.end - b.start;\n const growth = b.longestAlleleLength - b.shortestAlleleLength;\n return repeats.find(\n (r) => growth <= REPEAT_GROWTH * (r.end - r.start) && (span === 0 ? r.start <= b.start && b.start <= r.end : Math.min(b.end, r.end) - Math.max(b.start, r.start) >= span / 2)\n );\n}\nvar SUPERBUBBLE_SEGMENTS = 40;\nfunction formatBpRange(shortest, longest) {\n const low = formatBp(shortest);\n const high = formatBp(longest);\n const unit = high.slice(high.indexOf(\" \"));\n return low.endsWith(unit) ? `${low.slice(0, -unit.length)}\\u2013${high}` : `${low}\\u2013${high}`;\n}\nfunction routes(count) {\n if (count >= SATURATED_PATH_COUNT) {\n return \"\\u22652.1B routes\";\n }\n if (count >= 1e5) {\n return `${(count / 1e3).toFixed(0)}k routes`;\n }\n return `${count} routes`;\n}\nfunction classifyBubble(b, repeats = []) {\n const c = classifyShape(b, repeats);\n return b.partial ? { ...c, label: `${c.label}, partial` } : c;\n}\nfunction classifyShape(b, repeats) {\n const refSpan = b.end - b.start;\n const {\n shortestAlleleLength: shortest,\n longestAlleleLength: longest,\n pathCount,\n segmentCount,\n inversion\n } = b;\n const range = formatBpRange(shortest, longest);\n if (segmentCount >= SUPERBUBBLE_SEGMENTS) {\n return {\n kind: \"superbubble\",\n label: `${range} superbubble, ${segmentCount} segments, ${routes(pathCount)}${inversion ? \", inv\" : \"\"}`\n };\n }\n if (inversion) {\n return { kind: \"inversion\", label: `${formatBp(longest)} inv` };\n }\n if (b.offReference) {\n return shortest === longest ? sameLength(shortest) : { kind: \"complex\", label: `${range}, ${routes(pathCount)}` };\n }\n const repeat = longest !== shortest ? coveringRepeat(b, repeats) : void 0;\n if (repeat) {\n const name = repeat.name ? ` (${repeat.name})` : \"\";\n return {\n kind: \"repeat\",\n label: `${range} repeat array${name}, ${routes(pathCount)}`\n };\n }\n const alleles = pathCount > 2 ? `, ${pathCount} alleles` : \"\";\n if (shortest === longest && shortest === refSpan) {\n return sameLength(refSpan);\n }\n if (refSpan === 0 || shortest === refSpan) {\n return {\n kind: \"insertion\",\n label: `\\u2264${formatBp(longest - refSpan)} ins${alleles}`\n };\n }\n if (longest === refSpan) {\n return {\n kind: \"deletion\",\n label: `${formatBp(refSpan - shortest)} del${alleles}`\n };\n }\n return {\n kind: \"complex\",\n label: `${formatBp(refSpan)} ref \\u2192 ${range}, ${pathCount} alleles`\n };\n}\nfunction sameLength(bp) {\n return bp <= 1 ? { kind: \"snp\", label: \"SNP\" } : { kind: \"substitution\", label: `${formatBp(bp)} sub` };\n}\nvar BUBBLE_KIND_COLORS = {\n snp: \"#5b6b7a\",\n substitution: \"#5b6b7a\",\n insertion: \"#2f8fd6\",\n deletion: \"#c94040\",\n inversion: \"#e07b00\",\n repeat: \"#8e3fbf\",\n superbubble: \"#8e3fbf\",\n complex: \"#8e3fbf\"\n};\nvar BUBBLE_KIND_NAMES = {\n snp: \"SNP\",\n substitution: \"substitution\",\n insertion: \"insertion\",\n deletion: \"deletion\",\n inversion: \"inversion\",\n repeat: \"repeat array\",\n superbubble: \"superbubble\",\n complex: \"site\"\n};\nfunction bubbleSegmentIds(b) {\n return b.segments.split(\",\").filter(Boolean);\n}\n\nexport {\n classifyBubble,\n BUBBLE_KIND_COLORS,\n BUBBLE_KIND_NAMES,\n bubbleSegmentIds\n};\n", "import {\n formatBp\n} from \"./chunk-PFRQBCGC.js\";\nimport {\n pushTo\n} from \"./chunk-BSOZW3FC.js\";\nimport {\n isBackbone\n} from \"./chunk-RJWPJCIB.js\";\nimport {\n partitionPoint\n} from \"./chunk-HOAIOEI7.js\";\n\n// src/tubeMap/axis.ts\nfunction referenceBoxes({\n graph,\n layout\n}) {\n const nodeById = new Map(graph.nodes.map((n) => [n.id, n]));\n const byRefName = /* @__PURE__ */ new Map();\n layout.nodes.forEach((node, index) => {\n const graphNode = nodeById.get(node.name);\n if (node.order >= 0 && graphNode && isBackbone(graphNode)) {\n const { refName, start } = graphNode.stable;\n pushTo(byRefName, refName, {\n name: node.name,\n index,\n bp0: start,\n bp1: start + graphNode.length,\n x0: node.x,\n x1: node.x + node.pixelWidth\n });\n }\n });\n for (const boxes of byRefName.values()) {\n boxes.sort((a, b) => a.bp0 - b.bp0);\n }\n return byRefName;\n}\nfunction tubeX(boxes, bp, isEnd = false) {\n const i = partitionPoint(\n boxes.length - 1,\n (j) => isEnd ? boxes[j].bp1 < bp : boxes[j].bp1 <= bp\n );\n return boxX(boxes[i], bp);\n}\nfunction boxX(box, bp) {\n const span = box.bp1 - box.bp0;\n return bp <= box.bp0 || span <= 0 ? box.x0 : box.x0 + (Math.min(bp, box.bp1) - box.bp0) / span * (box.x1 - box.x0);\n}\nfunction tubeSpan(boxes, start, end) {\n const a = tubeX(boxes, start);\n const b = tubeX(boxes, end, true);\n return { x0: Math.min(a, b), x1: Math.max(a, b) };\n}\nfunction rulerBoxes(byRefName) {\n let best;\n for (const boxes of byRefName.values()) {\n if (!best || boxes.length > best.length) {\n best = boxes;\n }\n }\n return best;\n}\nvar TICK_PX = 5;\nvar LABEL_GAP_PX = 10;\nvar TARGET_TICK_PX = 110;\nvar MIN_BRACKET_PX = 3;\nfunction rulerInk(darkMode) {\n return darkMode ? \"#b0b0b8\" : \"#55555c\";\n}\nfunction niceStep(raw) {\n const pow = 10 ** Math.floor(Math.log10(raw));\n const m = raw / pow;\n return (m <= 1 ? 1 : m <= 2 ? 2 : m <= 5 ? 5 : 10) * pow;\n}\nfunction placeLabels(candidates) {\n const placed = [];\n for (const a of candidates) {\n if (placed.every(\n (b) => Math.abs(a.at - b.at) >= (a.width + b.width) / 2 + LABEL_GAP_PX\n )) {\n placed.push(a);\n }\n }\n return placed.map(({ text, at }) => ({ text, at }));\n}\nfunction scaleMarks(boxes, x, width, measure) {\n const first = boxes[0];\n const last = boxes.at(-1);\n if (!first || !last) {\n return void 0;\n }\n const from = x(first.x0);\n const to = x(last.x1);\n const bpSpan = last.bp1 - first.bp0;\n if (to <= from || bpSpan <= 0) {\n return void 0;\n }\n const step = niceStep(bpSpan / (to - from) * TARGET_TICK_PX);\n const ticks = [];\n const positions = [];\n for (let bp = Math.ceil(first.bp0 / step) * step; bp <= last.bp1; bp += step) {\n const sx = Math.round(x(tubeX(boxes, bp))) + 0.5;\n if (sx >= 0 && sx <= width) {\n ticks.push(sx);\n const text = bp.toLocaleString(\"en-US\");\n positions.push({ text, at: sx, width: measure(text) });\n }\n }\n return {\n spans: [{ x0: from, x1: to }],\n ticks,\n labels: placeLabels(positions)\n };\n}\nfunction boxMarks(boxes, x, width, measure) {\n const shown = boxes.map((box) => ({ box, s0: x(box.x0), s1: x(box.x1) })).filter(({ s0, s1 }) => s1 >= 0 && s0 <= width);\n const first = shown[0];\n const last = shown.at(-1);\n if (!first || !last) {\n return void 0;\n }\n const label = (text, at) => ({\n text,\n at,\n width: measure(text)\n });\n const position = (bp, at) => label(bp.toLocaleString(\"en-US\"), at);\n const spans = [];\n const ticks = [];\n const lengths = [];\n const boundaries = [];\n for (const { box, s0, s1 } of shown) {\n spans.push({ x0: s0, x1: s1 });\n ticks.push(Math.round(s0) + 0.5);\n if (s1 - s0 >= MIN_BRACKET_PX) {\n ticks.push(Math.round(s1) + 0.5);\n }\n const length = label(formatBp(box.bp1 - box.bp0), (s0 + s1) / 2);\n if (length.width <= s1 - s0) {\n lengths.push(length);\n }\n if (box !== first.box) {\n boundaries.push(position(box.bp0, s0));\n }\n }\n const ends = [\n position(first.box.bp0, first.s0),\n position(last.box.bp1, last.s1)\n ];\n return {\n spans,\n ticks,\n labels: placeLabels([...ends, ...lengths, ...boundaries])\n };\n}\nfunction rulerMarks(boxes, x, width, measure, referenceAxis = false) {\n return (referenceAxis ? scaleMarks : boxMarks)(boxes, x, width, measure);\n}\nfunction drawTubeMapRuler(ctx, boxes, frame, top, referenceAxis = false) {\n const { x, width, darkMode } = frame;\n ctx.font = \"10px sans-serif\";\n const marks = rulerMarks(\n boxes,\n x,\n width,\n (text) => ctx.measureText(text).width,\n referenceAxis\n );\n if (!marks) {\n return;\n }\n const ink = rulerInk(darkMode);\n const y = top + 0.5;\n ctx.strokeStyle = ink;\n ctx.fillStyle = ink;\n ctx.lineWidth = 1;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"top\";\n ctx.beginPath();\n for (const { x0, x1 } of marks.spans) {\n ctx.moveTo(Math.max(0, x0), y);\n ctx.lineTo(Math.min(width, x1), y);\n }\n for (const sx of marks.ticks) {\n ctx.moveTo(sx, top);\n ctx.lineTo(sx, top + TICK_PX);\n }\n ctx.stroke();\n for (const { text, at } of marks.labels) {\n ctx.fillText(text, at, top + TICK_PX + 2);\n }\n}\n\nexport {\n referenceBoxes,\n tubeX,\n boxX,\n tubeSpan,\n rulerBoxes,\n rulerInk,\n rulerMarks,\n drawTubeMapRuler\n};\n", "// src/tubeMap/connectors.ts\nfunction tubeMapConnectors(boxes, bpToScreen, tubeToScreen, width) {\n const out = [];\n for (const box of boxes) {\n const bottom0 = tubeToScreen(box.x0);\n const bottom1 = tubeToScreen(box.x1);\n if (bottom1 >= 0 && bottom0 <= width) {\n out.push({\n node: box.name,\n top0: bpToScreen(box.bp0),\n top1: bpToScreen(box.bp1),\n bottom0,\n bottom1\n });\n }\n }\n return out;\n}\nvar HIT_SLOP_PX = 3;\nfunction connectorAt(connectors, zoneBottom, sx, sy) {\n if (zoneBottom <= 0 || sy < 0 || sy > zoneBottom) {\n return void 0;\n }\n const t = sy / zoneBottom;\n let hit;\n let best = HIT_SLOP_PX;\n for (const c of connectors) {\n const a = c.top0 + (c.bottom0 - c.top0) * t;\n const b = c.top1 + (c.bottom1 - c.top1) * t;\n const dist = Math.max(0, Math.min(a, b) - sx, sx - Math.max(a, b));\n if (dist < best) {\n best = dist;\n hit = c.node;\n }\n }\n return hit;\n}\nfunction band(ctx, c, bottom) {\n ctx.moveTo(c.top0, 0);\n ctx.lineTo(c.top1, 0);\n ctx.lineTo(c.bottom1, bottom);\n ctx.lineTo(c.bottom0, bottom);\n ctx.closePath();\n}\nfunction sides(ctx, c, bottom) {\n ctx.moveTo(c.top0, 0);\n ctx.lineTo(c.bottom0, bottom);\n ctx.moveTo(c.top1, 0);\n ctx.lineTo(c.bottom1, bottom);\n}\nfunction drawTubeMapConnectors(ctx, connectors, bottom, {\n highlightNode,\n darkMode\n}) {\n if (bottom <= 0 || connectors.length === 0) {\n return;\n }\n const ink = darkMode ? \"255,255,255\" : \"0,0,0\";\n ctx.beginPath();\n for (const c of connectors) {\n band(ctx, c, bottom);\n }\n ctx.fillStyle = `rgba(${ink},0.07)`;\n ctx.fill();\n ctx.beginPath();\n for (const c of connectors) {\n sides(ctx, c, bottom);\n }\n ctx.strokeStyle = `rgba(${ink},0.35)`;\n ctx.lineWidth = 0.5;\n ctx.stroke();\n drawLitConnector(ctx, connectors, bottom, highlightNode);\n}\nfunction drawLitConnector(ctx, connectors, bottom, node) {\n const lit = bottom > 0 && node ? connectors.find((c) => c.node === node) : void 0;\n if (lit) {\n ctx.beginPath();\n band(ctx, lit, bottom);\n ctx.fillStyle = \"rgba(255,192,203,0.5)\";\n ctx.fill();\n ctx.beginPath();\n sides(ctx, lit, bottom);\n ctx.strokeStyle = \"#ff0000\";\n ctx.lineWidth = 1;\n ctx.stroke();\n }\n}\n\nexport {\n tubeMapConnectors,\n connectorAt,\n drawTubeMapConnectors,\n drawLitConnector\n};\n", "import {\n pathOrigin\n} from \"./chunk-B5X2RLJG.js\";\nimport {\n gapParts\n} from \"./chunk-EIY2SKD3.js\";\nimport {\n groupBy\n} from \"./chunk-BSOZW3FC.js\";\nimport {\n panSNContig,\n panSNSample\n} from \"./chunk-4XWZNPQ2.js\";\n\n// src/layout/walkRows.ts\nfunction sampleOf(path) {\n return path.sample ?? panSNSample(path.name);\n}\nfunction labelOf(path) {\n return path.haplotype !== void 0 && path.sample !== void 0 ? `${path.sample}#${path.haplotype}` : sampleOf(path);\n}\nvar NodeTable = class {\n constructor(graph) {\n this.index = /* @__PURE__ */ new Map();\n this.lengths = [];\n this.onReference = new Uint8Array(0);\n this.referenceStart = new Float64Array(0);\n this.referenceEnd = new Float64Array(0);\n for (const node of graph.nodes) {\n this.lengths[this.indexOf(node.id)] = node.length;\n }\n }\n indexOf(id) {\n let i = this.index.get(id);\n if (i === void 0) {\n i = this.lengths.length;\n this.index.set(id, i);\n this.lengths.push(0);\n }\n return i;\n }\n nodesOf(path) {\n const nodes = new Int32Array(path.nodeIds.length);\n path.nodeIds.forEach((id, k) => {\n nodes[k] = this.indexOf(id);\n });\n return nodes;\n }\n spanAt(steps, k) {\n const node = k >= 0 && k < steps.length ? steps[k] : -1;\n return node >= 0 && this.onReference[node] ? { start: this.referenceStart[node], end: this.referenceEnd[node] } : void 0;\n }\n};\nfunction stepsOf(pieces, table) {\n const out = [];\n const gaps = [];\n let end;\n let previous;\n for (const piece of pieces) {\n if (end !== void 0 && piece.start !== void 0 && piece.start > end) {\n gaps.push(gapParts(piece.start - end, previous?.after, piece.before));\n out.push(-gaps.length);\n }\n let bp = 0;\n for (const node of piece.nodes) {\n out.push(node);\n bp += table.lengths[node];\n }\n end = piece.start === void 0 ? void 0 : piece.start + bp;\n previous = piece;\n }\n return { steps: Float64Array.from(out), gaps };\n}\nfunction stepSpan(pieces, table, k) {\n let end;\n let at = 0;\n let found;\n for (const piece of pieces) {\n if (piece.start === void 0 || end !== void 0 && piece.start < end) {\n return void 0;\n }\n if (end !== void 0 && piece.start > end) {\n if (at++ === k) {\n found = { start: end, end: piece.start };\n }\n }\n let pos = piece.start;\n for (const node of piece.nodes) {\n const len = table.lengths[node];\n if (at++ === k) {\n found = { start: pos, end: pos + len };\n }\n pos += len;\n }\n end = pos;\n }\n return found;\n}\nfunction sliceBetween(steps, table, region, flanked = true) {\n if (!region || !flanked) {\n return { ids: steps, complete: true, from: -1, to: -1 };\n }\n const { onReference, referenceStart, referenceEnd } = table;\n let i0 = -1;\n let i1 = -1;\n let bestEnd = -Infinity;\n let bestStart = Infinity;\n for (let i = 0; i < steps.length; i++) {\n const node = steps[i];\n if (node >= 0 && onReference[node]) {\n const end2 = referenceEnd[node];\n const start = referenceStart[node];\n if (end2 <= region.start && end2 > bestEnd) {\n bestEnd = end2;\n i0 = i;\n }\n if (start >= region.end && start < bestStart) {\n bestStart = start;\n i1 = i;\n }\n }\n }\n if (i0 >= 0 && i1 >= 0) {\n const ids2 = steps.slice(Math.min(i0, i1) + 1, Math.max(i0, i1));\n return {\n ids: i0 < i1 ? ids2 : ids2.reverse(),\n complete: true,\n from: i0,\n to: i1\n };\n }\n const spanAt = (k) => table.spanAt(steps, k);\n const flank = i0 >= 0 ? i0 : i1;\n let near = -1;\n for (let d = 1; flank >= 0 && near < 0 && d < steps.length; d++) {\n near = [flank - d, flank + d].find((j) => spanAt(j) !== void 0) ?? -1;\n }\n if (near < 0) {\n return { ids: steps, complete: false, from: -1, to: -1 };\n }\n const forward = near > flank === spanAt(near).start > spanAt(flank).start;\n const after = forward === (flank === i0);\n const ids = after ? steps.slice(flank + 1) : steps.slice(0, flank).reverse();\n const last = ids.length > 0 ? ids.length - 1 : -1;\n const end = last < 0 ? spanAt(flank) : spanAt(after ? flank + 1 + last : 0);\n const stop = {\n contigEnds: end !== void 0,\n shortBp: !end ? 0 : Math.max(0, region.start - end.end, end.start - region.end)\n };\n return {\n ids,\n complete: false,\n from: flank,\n to: after ? steps.length : -1,\n stop\n };\n}\nfunction filterSamples(rows, samples) {\n return samples ? rows.filter((r) => samples.includes(r.sample)).sort(\n (a, b) => samples.indexOf(a.sample) - samples.indexOf(b.sample) || a.label.localeCompare(b.label)\n ) : rows;\n}\nfunction referenceWalkName(graph) {\n const names = (graph.paths ?? []).map((p) => pathOrigin(p.name).name);\n if (graph.referencePath !== void 0 && names.includes(graph.referencePath)) {\n return graph.referencePath;\n }\n const rankZero = new Set(\n graph.nodes.flatMap((n) => n.stable?.rank === 0 ? [n.stable.refName] : [])\n );\n return names.find((n) => rankZero.has(n)) ?? names[0];\n}\nfunction walkRows(graph, region, unit) {\n const paths = graph.paths ?? [];\n const nameOf = (p) => pathOrigin(p.name).name;\n const referenceName = referenceWalkName(graph);\n const referencePieces = paths.filter((p) => nameOf(p) === referenceName).sort((a, b) => (a.start ?? 0) - (b.start ?? 0));\n const first = referencePieces[0];\n const others = paths.filter((p) => !referencePieces.includes(p));\n if (!first || others.length === 0) {\n return void 0;\n }\n const walks = groupBy(others, nameOf);\n const table = new NodeTable(graph);\n const referenceStart = first.start ?? 0;\n const cut = region && region.end > region.start ? region : void 0;\n const referenceNodes = referencePieces.map((piece) => table.nodesOf(piece));\n const nodeCount = table.lengths.length;\n table.onReference = new Uint8Array(nodeCount);\n table.referenceStart = new Float64Array(nodeCount);\n table.referenceEnd = new Float64Array(nodeCount);\n let reachesBefore = false;\n let reachesAfter = false;\n for (const [p, piece] of referencePieces.entries()) {\n let pos = piece.start ?? 0;\n for (const node of referenceNodes[p]) {\n const len = table.lengths[node];\n if (!table.onReference[node]) {\n table.onReference[node] = 1;\n table.referenceStart[node] = pos;\n table.referenceEnd[node] = pos + len;\n reachesBefore ||= cut !== void 0 && pos + len <= cut.start;\n reachesAfter ||= cut !== void 0 && pos >= cut.end;\n }\n pos += len;\n }\n }\n const flanked = cut === void 0 || reachesBefore && reachesAfter;\n const rowOf = (paths2, nodes) => {\n const path = paths2[0];\n const pieces = paths2.map((piece, p) => ({\n start: piece.start,\n nodes: nodes?.[p] ?? table.nodesOf(piece),\n before: piece.before,\n after: piece.after\n })).sort((a, b) => (a.start ?? 0) - (b.start ?? 0));\n const { steps, gaps } = stepsOf(pieces, table);\n const { ids, complete, from, to, stop } = sliceBetween(\n steps,\n table,\n cut,\n flanked\n );\n const contig = path.contig ?? panSNContig(pathOrigin(path.name).name);\n const axisSpan = stepSpan(pieces, table, from < 0 ? 0 : from);\n const axis = !axisSpan ? void 0 : from < 0 ? { contig, start: axisSpan.start, reversed: false } : from < to ? { contig, start: axisSpan.end, reversed: false } : { contig, start: axisSpan.start, reversed: true };\n const { lengths, onReference, referenceStart: referenceStart2, referenceEnd } = table;\n const runs = [];\n let last;\n let bp = 0;\n let offReferenceBp = 0;\n let gapBp = 0;\n let step = 0;\n const backwards = from >= 0 && from > to;\n for (const node of ids) {\n if (node < 0) {\n const parts = gaps[-node - 1];\n for (const { bp: partBp, ...why } of backwards ? [...parts].reverse() : parts) {\n last = {\n start: bp,\n bp: partBp,\n onReference: false,\n gap: true,\n ...why\n };\n runs.push(last);\n bp += partBp;\n gapBp += partBp;\n }\n step = 0;\n continue;\n }\n const len = lengths[node];\n const on = onReference[node] === 1;\n const at = last?.referenceStart;\n const forward = on && at !== void 0 && step >= 0 && at + last.bp === referenceStart2[node];\n const backward = on && at !== void 0 && step <= 0 && referenceEnd[node] === at;\n if (!on && last && !last.onReference && !last.gap) {\n last.bp += len;\n } else if (forward || backward) {\n last.bp += len;\n if (!forward) {\n last.referenceStart = referenceStart2[node];\n last.reversed = true;\n }\n step = forward ? 1 : -1;\n } else {\n last = {\n start: bp,\n bp: len,\n onReference: on,\n referenceStart: on ? referenceStart2[node] : void 0\n };\n runs.push(last);\n step = 0;\n }\n bp += len;\n if (!on) {\n offReferenceBp += len;\n }\n }\n return {\n name: path.name,\n label: labelOf(path),\n sample: sampleOf(path),\n haplotype: path.haplotype,\n bp,\n offReferenceBp,\n gapBp,\n complete,\n stop,\n runs,\n axis\n };\n };\n const origin = cut ? cut.start : referenceStart;\n return {\n origin,\n unit,\n reference: rowOf(referencePieces, referenceNodes),\n rows: [...walks.values()].map((paths2) => rowOf(paths2)).sort(\n (a, b) => Number(b.complete) - Number(a.complete) || b.bp - a.bp || a.label.localeCompare(b.label)\n )\n };\n}\n\nexport {\n filterSamples,\n referenceWalkName,\n walkRows\n};\n", "export function groupBy<T, K>(\n items: readonly T[],\n key: (item: T) => K,\n): Map<K, T[]> {\n const groups = new Map<K, T[]>()\n for (const item of items) {\n const k = key(item)\n const group = groups.get(k)\n if (group === undefined) {\n groups.set(k, [item])\n } else {\n group.push(item)\n }\n }\n return groups\n}\n", "// A PanSN path name: sample#haplotype#contig, sometimes with further\n// #-separated fields such as a fragment offset after the contig.\n// https://github.com/pangenome/PanSN-spec\nexport interface PanSNName {\n sample: string\n haplotype: number\n contig: string\n}\n\n// gbz-base names a generic reference `_gbwt_ref#0#contig` and a haplotype the\n// GBWT kept no metadata for `unknown#N#contig`; neither names a sample.\nconst NOT_SAMPLES = new Set(['_gbwt_ref', 'unknown'])\n\n// The sample, haplotype and contig of a PanSN name, or undefined for any other\n// name: fewer than three fields, an empty sample or contig, a haplotype that\n// isn't a whole number, or a placeholder sample.\nexport function parsePanSN(name: string | undefined): PanSNName | undefined {\n const [sample, haplotype, contig] = name?.split('#') ?? []\n if (\n sample === undefined ||\n sample === '' ||\n NOT_SAMPLES.has(sample) ||\n haplotype === undefined ||\n !/^\\d+$/.test(haplotype) ||\n contig === undefined ||\n contig === ''\n ) {\n return undefined\n }\n return { sample, haplotype: Number(haplotype), contig }\n}\n", "// The tube map layout, from input nodes and tracks to drawable shapes. Ported\n// from the original sequenceTubeMap JS, where it shared one module with the d3\n// drawing. It runs in two phases, each on a fresh LayoutState: layoutTopology\n// merges, orders, orients and sizes the nodes and fixes their x, and\n// placeTubeMap stacks a chosen set of tracks and reads on that topology.\nimport { groupBy } from './groupBy.ts'\nimport { parsePanSN } from './panSN.ts'\n\nimport type {\n HaplotypeShare,\n ImageBounds,\n InputNode,\n InputTrack,\n LayoutNode,\n Mismatch,\n Node,\n ReadSequenceEntry,\n Segment,\n Track,\n TrackShapes,\n TrackType,\n} from './types.ts'\n\n// Node and Track declare some fields that not every entry gets: layout places\n// only the nodes a track or read reaches, and a normal read has no width until\n// assignReadsToNodes.\ntype MaybeUnset<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>\ntype MaybeUnplacedNode = MaybeUnset<LayoutNode, 'x' | 'y'>\n\nexport type NodeWidthOption = 'normal' | 'compressed' | 'small' | 'fixed'\n\n// The fields of a placed track a renderer colors it by. Shapes carry only the\n// track's id, so a renderer can recolor without laying out again.\nexport interface ColorableTrack {\n id: number\n sourceTrackID: number\n type?: TrackType\n name?: string\n mapping_quality?: number\n is_reverse?: boolean\n haplotypeShare?: HaplotypeShare\n}\n\nexport type LayerData = 'haplotypes' | 'reads'\n\n// A track set placement draws, and the stat it runs first. `coarsen` turns\n// the set into one band per edge; banded haplotypes keep the reference's lane.\nexport interface Layer {\n data: LayerData\n stat?: 'coarsen'\n}\n\n// The options a topology fixes. trackWidth, the layers and ignoreStrand leave\n// node order alone, but the topology measures x from placing every track and\n// read under them.\nexport interface TopologyOptions {\n mergeNodes?: boolean\n showReads?: boolean\n // Shorthand for `layers` when those are unset: band the reads, or the\n // haplotypes when no reads were loaded\n coarsenedReadView?: boolean\n // The haplotypes draw first and the reads stack under them, each data under\n // the stat of its first layer here\n layers?: readonly Layer[]\n ignoreStrand?: boolean\n // normal: width is sequence length, at `charWidth` per base\n // compressed: log2 of sequence length\n // small: 1% of sequence length\n // fixed: every node one width\n nodeWidthOption?: NodeWidthOption\n charWidth?: number\n // a haplotype tube's width in layout px, where no `freq` scales it\n trackWidth?: number\n // how `freq` widens a tube: log grows slowly, as sequenceTubeMap draws vg's\n // frequencies; linear makes a walk standing for n haplotypes n tubes wide,\n // so widths compare as counts\n freqWidth?: 'log' | 'linear'\n}\n\nexport const READ_FACET_FIELDS = ['read_group', 'sample_name'] as const\nexport type ReadFacetBy = (typeof READ_FACET_FIELDS)[number]\n// A read field, or the sample in the haplotypes' PanSN names\nexport const FACET_FIELDS = [...READ_FACET_FIELDS, 'haplotype_sample'] as const\nexport type FacetBy = (typeof FACET_FIELDS)[number]\n\n// One panel's subset. A read facet keeps every haplotype and the reads whose\n// `by` field is `key`, or that lack one when `key` is null. A haplotype facet\n// keeps the reference and no reads, plus the haplotypes of sample `key`, or\n// those with no PanSN sample when `key` is null; its `reads` panel keeps the\n// reference and the reads.\nexport interface ReadFacet {\n by: ReadFacetBy\n key: string | null\n}\nexport type HaplotypeFacet =\n | { by: 'haplotype_sample'; key: string | null }\n | { by: 'haplotype_sample'; reads: true }\nexport type Facet = ReadFacet | HaplotypeFacet\n\n// Which of a topology's tracks and reads a placement draws\nexport interface PlacementOptions {\n mappingQualityCutoff?: number\n focusReadNames?: string[] | null\n facet?: Facet | undefined\n}\n\nexport interface FacetOptions extends PlacementOptions {\n // One panel per value of this field\n facetBy?: FacetBy | null\n}\n\nexport interface LayoutOptions extends TopologyOptions, PlacementOptions {}\n\nexport type CoarsenedUnit = 'read' | 'haplotype'\n\n// A coarsened band's count of contributing reads or haplotypes and its label,\n// keyed by the band's synthetic track id, unique across layers\nexport interface CoarsenedEdgeMeta {\n count: number\n label: string\n}\n\n// What a layer's coarsening drew as bands, how many reads or haplotypes it\n// banded (counting a deduplicated walk `freq` times), and whether any band\n// runs reverse-strand\nexport interface Coarsening {\n unit: CoarsenedUnit\n total: number\n reverse: boolean\n}\n\n// Each layer that drew bands, by its data\nexport type Coarsenings = Partial<Record<LayerData, Coarsening>>\n\nexport interface TubeMapLayout {\n // 1-indexed with a hole at 0: a signed index\n // is an oriented visit, and 0 has no sign\n nodes: LayoutNode[]\n // the haplotype tracks and placed reads together, sorted by where each\n // first meets the others, which is the order their shapes were made in\n tracks: Track[]\n // the placed reads alone\n reads: Track[]\n nodeMap: ReadonlyMap<string, number>\n shapes: TrackShapes\n bounds: ImageBounds\n maxOrder: number\n // the name of the track that carries a coordinate for the ruler\n trackForRuler: string | undefined\n coarsenedEdgeMeta: Map<number, CoarsenedEdgeMeta>\n coarsened: Coarsenings\n}\n\n// A node before placement gives it a y and the reads through it\nexport type TopologyNode = Omit<\n LayoutNode,\n 'y' | 'contentHeight' | 'incomingReads' | 'outgoingReads' | 'internalReads'\n>\n\n// A haplotype or read before placement gives it a width and lanes\nexport type TopologyTrack = Omit<Track, 'path' | 'width'>\n\n// What every placement of one input shares: the merged, ordered and oriented\n// nodes with their widths and x positions, and the oriented haplotypes and\n// reads. A placement reads it and never changes it.\nexport interface TubeMapTopology {\n options: Required<TopologyOptions>\n // 1-indexed with a hole at 0, like TubeMapLayout.nodes. A node no track or\n // read reaches has order UNREACHABLE_ORDER and no x.\n nodes: readonly TopologyNode[]\n // the visible haplotypes, track 0 read left to right\n tracks: readonly TopologyTrack[]\n // every primary alignment that shares a node with a track, unfiltered\n reads: readonly TopologyTrack[]\n nodeMap: ReadonlyMap<string, number>\n maxOrder: number\n trackForRuler: string | undefined\n}\n\ntype LayoutConfig = Required<TopologyOptions>\n\n// sequenceTubeMap's character width. The compressed, small and fixed node\n// widths always scale by it and ignore `charWidth`.\nconst DEFAULT_CHAR_WIDTH = 8.401\n\n// The coarsened view bands haplotypes only when no reads were loaded, not when\n// a filter hides them all\nfunction layersFrom(\n { layers, coarsenedReadView = false, showReads = true }: TopologyOptions,\n hasReads: boolean,\n): readonly Layer[] {\n if (layers !== undefined) {\n return layers\n }\n const coarsen = coarsenedReadView && showReads\n const stat = (banded: boolean): Pick<Layer, 'stat'> =>\n banded ? { stat: 'coarsen' } : {}\n return [\n { data: 'haplotypes', ...stat(coarsen && !hasReads) },\n { data: 'reads', ...stat(coarsen && hasReads) },\n ]\n}\n\nfunction statOf(layers: readonly Layer[], data: LayerData) {\n return layers.find(layer => layer.data === data)?.stat\n}\n\nfunction configFrom(options: TopologyOptions, hasReads: boolean): LayoutConfig {\n return {\n mergeNodes: options.mergeNodes ?? true,\n showReads: options.showReads ?? true,\n coarsenedReadView: options.coarsenedReadView ?? false,\n layers: layersFrom(options, hasReads),\n ignoreStrand: options.ignoreStrand ?? false,\n nodeWidthOption: options.nodeWidthOption ?? 'normal',\n charWidth: options.charWidth ?? DEFAULT_CHAR_WIDTH,\n trackWidth: options.trackWidth ?? 15,\n freqWidth: options.freqWidth ?? 'log',\n }\n}\n\n// One track's segment in an order slot, and where its lane would ideally go\ninterface SegmentAssignment {\n trackID: number\n segmentID: number\n idealLane?: number | undefined\n idealY?: number | null | undefined\n}\n\n// The segments of one order slot that visit one node, or a single segment\n// passing or turning in a gap when `node` is null\ninterface NodeAssignment {\n node: number | null\n tracks: SegmentAssignment[]\n idealLane?: number | undefined\n}\n\nfunction emptyTrackShapes(): TrackShapes {\n return {\n rectangles: [],\n curves: [],\n corners: [],\n verticalRectangles: [],\n }\n}\n\n// The working state of one topology or placement, shared by its passes.\ninterface LayoutState {\n config: LayoutConfig\n // Sparse like TubeMapLayout.nodes, but forEach, map and sort skip the hole\n // and noUncheckedIndexedAccess already types indexed reads as possibly\n // undefined, so only for...of would ever see it.\n nodes: LayoutNode[]\n // Each track's `path` lists the Segments to draw, in order along the path.\n tracks: Track[]\n // Reads have a `path` too, but stack vertically by a different system.\n reads: Track[]\n nodeMap: ReadonlyMap<string, number>\n nodesPerOrder: number[][]\n // generateNodeOrder's scratch, by node index; undefined until assigned.\n nodeOrders: (number | undefined)[]\n // Lane assignments for tracks (not reads), one list per order slot.\n assignments: NodeAssignment[][]\n extraLeft: number[]\n extraRight: number[]\n // horizontal order of the rightmost node\n maxOrder: number\n shapes: TrackShapes\n trackForRuler: string | undefined\n coarsenedEdgeMeta: Map<number, CoarsenedEdgeMeta>\n}\n\nfunction emptyState(config: LayoutConfig): LayoutState {\n return {\n config,\n nodes: [],\n tracks: [],\n reads: [],\n nodeMap: new Map(),\n nodesPerOrder: [],\n nodeOrders: [],\n assignments: [],\n extraLeft: [],\n extraRight: [],\n maxOrder: -1,\n shapes: emptyTrackShapes(),\n trackForRuler: undefined,\n coarsenedEdgeMeta: new Map(),\n }\n}\n\n// placeTubeMap(layoutTopology(...), options). Undefined when nothing visible\n// is left to draw.\nexport function layoutTubeMap(\n inputNodes: readonly InputNode[],\n inputTracks: readonly InputTrack[],\n inputReads: readonly InputTrack[] = [],\n options: LayoutOptions = {},\n): TubeMapLayout | undefined {\n const topology = layoutTopology(inputNodes, inputTracks, inputReads, options)\n return topology && placeTubeMap(topology, options)\n}\n\n// Each topology's placement of every track and read, which fixed its x\nconst measurements = new WeakMap<TubeMapTopology, TubeMapLayout>()\n\n// Merge, order and orient the nodes under the visible `inputTracks` and, when\n// `showReads`, every primary alignment in `inputReads`, then size them and\n// fix their x positions. Undefined when nothing visible is left to draw.\n// Neither input is modified. Track 0 is the reference the layout straightens.\n// The x gaps between order slots make room for the tracks' turns and slopes,\n// so the topology takes its x positions from placing every track and read.\nexport function layoutTopology(\n inputNodes: readonly InputNode[],\n inputTracks: readonly InputTrack[],\n inputReads: readonly InputTrack[] = [],\n options: TopologyOptions = {},\n): TubeMapTopology | undefined {\n const topology = arrangeTopology(inputNodes, inputTracks, inputReads, options)\n if (topology === undefined) {\n return undefined\n }\n const everything = place(topology, topology.tracks, topology.reads, 'measure')\n everything.nodes.forEach((node, i) => {\n if (node.order >= 0) {\n topology.nodes[i]!.x = node.x\n }\n })\n measurements.set(topology, everything)\n return topology\n}\n\n// Lay out the haplotypes and reads `options` keep at the topology's x\n// positions, stacking each read under the nodes it visits. When they keep\n// everything, this returns the placement layoutTopology measured x from, the\n// same object on every such call.\nexport function placeTubeMap(\n topology: TubeMapTopology,\n options: PlacementOptions = {},\n): TubeMapLayout {\n return placeSubset(\n topology,\n selectTracks(topology, options.facet),\n selectReads(topology, options),\n )\n}\n\nfunction placeSubset(\n topology: TubeMapTopology,\n tracks: readonly TopologyTrack[],\n reads: readonly TopologyTrack[],\n bandIdBase?: BandIdBase,\n): TubeMapLayout {\n const measured = measurements.get(topology)\n return measured !== undefined &&\n tracks.length === topology.tracks.length &&\n reads.length === topology.reads.length\n ? measured\n : place(topology, tracks, reads, 'topology', bandIdBase)\n}\n\nfunction arrangeTopology(\n inputNodes: readonly InputNode[],\n inputTracks: readonly InputTrack[],\n inputReads: readonly InputTrack[],\n options: TopologyOptions,\n): TubeMapTopology | undefined {\n const state = emptyState(configFrom(options, inputReads.length > 0))\n\n if (inputNodes.length === 0 || inputTracks.length === 0) {\n return undefined\n }\n\n // Boundary promotion: layout passes below populate the Node/Track fields\n // (width, order, x/y, path, indexSequence, etc.) before any reader runs.\n //\n // Nodes are referenced in inputs by internal `name` attribute and not by\n // index. Internally in e.g. a path's indexSequence we need to reference\n // nodes by *signed* index, so index 0 can never be used: budge everything\n // down and leave a hole (rather than an `undefined` entry) at 0, which we\n // won't iterate over. Made after the copy, because not every structuredClone\n // keeps a hole.\n structuredClone(inputNodes).forEach((node, i) => {\n node.seq ??= ''\n node.sequenceLength ??= node.seq.length\n state.nodes[i + 1] = node as LayoutNode\n })\n state.tracks = structuredClone(inputTracks) as Track[]\n // Secondary alignments never draw, so drop them before the deep copy, the\n // most expensive step in a redraw.\n state.reads = state.config.showReads\n ? (structuredClone(\n inputReads.filter(read => read.is_secondary !== true),\n ) as Track[])\n : []\n\n for (let i = state.tracks.length - 1; i >= 0; i -= 1) {\n const t = state.tracks[i]!\n t.type ??= 'haplotype'\n if (t.hidden === true) {\n state.tracks.splice(i, 1)\n continue\n }\n if (t.indexOfFirstBase !== undefined) {\n state.trackForRuler = t.name\n }\n }\n if (state.tracks.length === 0) {\n return undefined\n }\n\n // Run against the visible tracks only, so hiding the reference doesn't leave\n // the layout straightened around a track that is no longer drawn.\n straightenTrack(state, 0)\n\n state.nodeMap = generateNodeMap(state)\n generateTrackIndexSequences(state, state.tracks)\n generateTrackIndexSequences(state, state.reads)\n generateNodeWidth(state)\n\n if (state.config.mergeNodes) {\n generateNodeSuccessors(state)\n generateNodeOrder(state)\n reverseReversedReads(state)\n mergeNodes(state)\n state.nodeMap = generateNodeMap(state)\n generateNodeWidth(state)\n generateTrackIndexSequences(state, state.tracks)\n generateTrackIndexSequences(state, state.reads)\n }\n\n generateNodeSuccessors(state)\n generateNodeDegree(state)\n generateNodeOrder(state)\n\n // can cause problems when there is a reversed single track node\n // OTOH, can solve problems with complex inversion patterns\n switchNodeOrientation(state)\n generateNodeOrder(state)\n reverseReversedReads(state)\n generateTrackIndexSequences(state, state.reads)\n\n return {\n options: state.config,\n nodes: state.nodes,\n tracks: state.tracks,\n reads: state.reads,\n nodeMap: state.nodeMap,\n maxOrder: getMaxOrder(state),\n trackForRuler: state.trackForRuler,\n }\n}\n\nfunction selectReads(\n topology: TubeMapTopology,\n { mappingQualityCutoff = 0, focusReadNames = null, facet }: PlacementOptions,\n): readonly TopologyTrack[] {\n const focus = focusReadNames ? new Set(focusReadNames) : null\n return topology.reads.filter(\n read =>\n (read.mapping_quality ?? 0) >= mappingQualityCutoff &&\n (focus === null || (read.name !== undefined && focus.has(read.name))) &&\n (facet === undefined || facetHoldsRead(facet, read)),\n )\n}\n\n// Whether a panel of `facet` draws this read when the read filters keep it\nexport function facetHoldsRead(\n facet: Facet,\n read: Pick<TopologyTrack, ReadFacetBy>,\n): boolean {\n return facet.by === 'haplotype_sample'\n ? 'reads' in facet\n : (read[facet.by] ?? null) === facet.key\n}\n\n// What every haplotype panel keeps: track 0, which the topology straightened,\n// and the track carrying the ruler's coordinates, when that is another\nfunction references(topology: TubeMapTopology): Set<TopologyTrack> {\n return new Set(\n topology.tracks.filter(\n (track, i) => i === 0 || track.name === topology.trackForRuler,\n ),\n )\n}\n\nfunction selectTracks(\n topology: TubeMapTopology,\n facet: Facet | undefined,\n): readonly TopologyTrack[] {\n if (facet?.by !== 'haplotype_sample') {\n return topology.tracks\n }\n const kept = references(topology)\n return topology.tracks.filter(\n track =>\n kept.has(track) || (!('reads' in facet) && sampleOf(track) === facet.key),\n )\n}\n\nfunction sampleOf(track: TopologyTrack): string | null {\n return parsePanSN(track.name)?.sample ?? null\n}\n\n// The haplotypes among `tracks` beside the reference, a PanSN haplotype\n// counted once however many walks it makes through the window\nfunction haplotypeCount(\n topology: TubeMapTopology,\n tracks: readonly TopologyTrack[],\n): number {\n const skip = references(topology)\n return new Set(\n tracks.flatMap(track => {\n if (skip.has(track)) {\n return []\n }\n const name = parsePanSN(track.name)\n return [name ? `${name.sample}#${name.haplotype}` : track]\n }),\n ).size\n}\n\n// A facet and the haplotypes and reads it draws\nexport interface FacetSubset<F extends Facet = Facet> {\n facet: F\n tracks: readonly TopologyTrack[]\n reads: readonly TopologyTrack[]\n}\n\n// Group `items` by key: in sort order, the null key last\nfunction sortedGroups<T>(\n items: readonly T[],\n keyOf: (item: T) => string | null,\n): [string | null, T[]][] {\n return [...groupBy(items, keyOf)].sort(([a], [b]) =>\n a === null || b === null\n ? Number(a === null) - Number(b === null)\n : a.localeCompare(b, undefined, { numeric: true }),\n )\n}\n\n// Split the reads `options` keep by their `by` field: one subset per value,\n// in sort order with the reads lacking one last, and none left empty. Every\n// subset keeps every haplotype.\nexport function facetReads(\n topology: TubeMapTopology,\n by: ReadFacetBy,\n options: PlacementOptions = {},\n): FacetSubset<ReadFacet>[] {\n return sortedGroups(\n selectReads(topology, { ...options, facet: undefined }),\n read => read[by] ?? null,\n ).map(([key, reads]) => ({\n facet: { by, key },\n tracks: topology.tracks,\n reads,\n }))\n}\n\n// Split the haplotypes beside the reference by the sample in their PanSN\n// names: one subset per sample, in sort order, then one for the haplotypes\n// with no PanSN name, each holding the reference too and no reads. The reads\n// `options` keep, when any, go in a last subset with the reference alone. No\n// haplotype beside the reference leaves nothing to split.\nexport function facetHaplotypes(\n topology: TubeMapTopology,\n options: PlacementOptions = {},\n): FacetSubset<HaplotypeFacet>[] {\n const kept = references(topology)\n const samples = sortedGroups(\n topology.tracks.filter(track => !kept.has(track)),\n sampleOf,\n )\n if (samples.length === 0) {\n return []\n }\n const ofSample = samples.map(([key]) => {\n const facet: HaplotypeFacet = { by: 'haplotype_sample', key }\n return { facet, tracks: selectTracks(topology, facet), reads: [] }\n })\n const facet: HaplotypeFacet = { by: 'haplotype_sample', reads: true }\n const reads = selectReads(topology, { ...options, facet })\n return reads.length === 0\n ? ofSample\n : [...ofSample, { facet, tracks: selectTracks(topology, facet), reads }]\n}\n\n// One placement in a stack of them. Its layout keeps its own coordinates;\n// `offsetY` moves it into the stack.\nexport interface FacetPanel {\n // undefined for the one panel of an unfaceted view\n facet?: Facet\n readCount: number\n // beside the reference, a PanSN haplotype counted once\n haplotypeCount: number\n layout: TubeMapLayout\n offsetY: number\n}\n\nexport interface FacetedLayout {\n panels: FacetPanel[]\n // every panel and its label, in stack coordinates\n bounds: ImageBounds\n}\n\n// Room above each faceted panel for its label, and between one panel and the\n// next label\nexport const FACET_LABEL_HEIGHT = 30\nexport const FACET_GAP = 40\n\n// Place the topology once per facet and stack the placements top to bottom,\n// the first where an unfaceted placement would draw. Every panel takes the\n// topology's x, so the panels line up in x. Band ids run on from one panel to\n// the next where panels band different tracks: the reads under a read facet,\n// the haplotypes under a haplotype facet, whose bands then take their share\n// of the panel's haplotypes. Without `facetBy`, or with nothing to split, this\n// is one panel of placeTubeMap's layout.\nexport function placeFacets(\n topology: TubeMapTopology,\n options: FacetOptions = {},\n): FacetedLayout {\n const { facetBy, ...placement } = options\n const subsets =\n facetBy === undefined || facetBy === null\n ? []\n : facetBy === 'haplotype_sample'\n ? facetHaplotypes(topology, placement)\n : facetReads(topology, facetBy, placement)\n if (subsets.length === 0) {\n const layout = placeTubeMap(topology, placement)\n return {\n panels: [\n {\n layout,\n readCount: layout.reads.length,\n haplotypeCount: haplotypeCount(topology, topology.tracks),\n offsetY: 0,\n },\n ],\n bounds: layout.bounds,\n }\n }\n const banded: LayerData =\n facetBy === 'haplotype_sample' ? 'haplotypes' : 'reads'\n let nextBandId: number | undefined\n let bottom = 0\n const panels = subsets.map(({ facet, tracks, reads }, i) => {\n const layout = placeSubset(\n topology,\n tracks,\n reads,\n nextBandId === undefined ? undefined : { [banded]: nextBandId },\n )\n for (const id of layout.coarsenedEdgeMeta.keys()) {\n if (nextBandId === undefined || id >= nextBandId) {\n nextBandId = id + 1\n }\n }\n const offsetY =\n i === 0 ? 0 : bottom + FACET_GAP + FACET_LABEL_HEIGHT - layout.bounds.minY\n bottom = offsetY + layout.bounds.maxY\n return {\n facet,\n readCount: reads.length,\n haplotypeCount: haplotypeCount(topology, tracks),\n layout,\n offsetY,\n }\n })\n return {\n panels,\n bounds: {\n minX: Math.min(...panels.map(p => p.layout.bounds.minX)),\n maxX: Math.max(...panels.map(p => p.layout.bounds.maxX)),\n minY: panels[0]!.layout.bounds.minY - FACET_LABEL_HEIGHT,\n maxY: bottom,\n },\n }\n}\n\n// The first id each layer's bands take\ntype BandIdBase = Partial<Record<LayerData, number>>\n\n// Place copies of the topology's nodes and the given tracks and reads,\n// measuring x from them or taking the topology's. Haplotype bands take ids\n// from COARSENED_ID_BASE and read bands straight after, unless `bandIdBase`\n// says otherwise.\nfunction place(\n topology: TubeMapTopology,\n tracks: readonly TopologyTrack[],\n reads: readonly TopologyTrack[],\n x: 'measure' | 'topology',\n bandIdBase: BandIdBase = {},\n): TubeMapLayout {\n const state = emptyState(topology.options)\n topology.nodes.forEach((node, i) => {\n state.nodes[i] = { ...node } as LayoutNode\n })\n state.tracks = tracks.map(track => ({ ...track }) as Track)\n state.reads = reads.map(read => ({ ...read }) as Track)\n state.nodeMap = topology.nodeMap\n state.maxOrder = topology.maxOrder\n state.trackForRuler = topology.trackForRuler\n\n // Banded haplotypes leave the reference its lane and join the reads'\n // overlay, above the reads, before calculateTrackWidth and\n // generateLaneAssignment see the tracks.\n const { layers, ignoreStrand } = state.config\n const haplotypeBandIdBase = bandIdBase.haplotypes ?? COARSENED_ID_BASE\n const haplotypeBands =\n statOf(layers, 'haplotypes') === 'coarsen'\n ? bandHaplotypes(state, haplotypeBandIdBase)\n : undefined\n if (haplotypeBands !== undefined) {\n state.tracks = [haplotypeBands.ref]\n }\n\n calculateTrackWidth(state)\n generateLaneAssignment(state)\n // also places the nodes that only filtered-out reads visit\n generateReadOnlyNodeAttributes(state)\n\n // A band crosses exactly two nodes, so placeReads and the shapes handle it\n // like any read, and node heights grow with the edge count rather than the\n // read or haplotype count.\n const readBands =\n statOf(layers, 'reads') === 'coarsen' && state.reads.length > 0\n ? buildCoarsenedSyntheticBands(\n state,\n state.reads,\n 'read',\n bandIdBase.reads ??\n haplotypeBandIdBase + (haplotypeBands?.bands.length ?? 0),\n )\n : undefined\n if (readBands !== undefined) {\n state.reads = readBands.bands\n }\n const coarsened: Coarsenings = {}\n for (const [data, unit, banding] of [\n ['haplotypes', 'haplotype', haplotypeBands],\n ['reads', 'read', readBands],\n ] as const) {\n if (banding !== undefined) {\n reverseReversedReads(state, banding.bands)\n generateTrackIndexSequences(state, banding.bands)\n coarsened[data] = {\n unit,\n total: banding.total,\n reverse: !ignoreStrand && banding.bands.some(b => b.is_reverse),\n }\n }\n }\n if (haplotypeBands !== undefined) {\n state.reads = haplotypeBands.bands.concat(state.reads)\n }\n\n placeReads(state)\n state.tracks = state.tracks.concat(state.reads)\n\n if (x === 'measure') {\n generateNodeXCoords(state)\n }\n\n generateSVGShapesFromPath(state)\n return {\n nodes: state.nodes,\n tracks: state.tracks,\n reads: state.reads,\n nodeMap: state.nodeMap,\n shapes: state.shapes,\n bounds: getImageDimensions(state),\n maxOrder: state.maxOrder,\n trackForRuler: state.trackForRuler,\n coarsenedEdgeMeta: state.coarsenedEdgeMeta,\n coarsened,\n }\n}\n\n// Return true if the given name names a reverse strand node, and false otherwise.\nexport function isReverse(nodeName: string): boolean {\n return nodeName.startsWith('-')\n}\n\n// Get the forward version of a node name, which may be either forward or backward (negative)\nexport function forward(nodeName: string): string {\n return isReverse(nodeName) ? nodeName.substring(1) : nodeName\n}\n\n// Get the reverse version of a node name, which may be either forward or backward (negative)\nexport function reverse(nodeName: string): string {\n return isReverse(nodeName) ? nodeName : `-${nodeName}`\n}\n\n// Get the opposite orientation node name for the given node.\nexport function flip(nodeName: string): string {\n return isReverse(nodeName) ? forward(nodeName) : reverse(nodeName)\n}\n\n// Whether a signed node index visits its node forward. Index 0 is never a\n// node, so no visit is -0.\nexport function isForwardIndex(n: number): boolean {\n return n > 0\n}\n\n// Turn around every node the given track visits in reverse before it visits\n// it forward, so that track reads left to right, and flip every track's and\n// read's visits to those nodes to match, as switchNodeOrientationForPaths\n// does for the nodes it switches.\nfunction straightenTrack(state: LayoutState, index: number): void {\n const nodesToInvert = new Set<string>()\n const visitedForward = new Set<string>()\n for (const visit of state.tracks[index]!.sequence) {\n if (!isReverse(visit)) {\n visitedForward.add(visit)\n } else if (!visitedForward.has(forward(visit))) {\n nodesToInvert.add(forward(visit))\n }\n }\n if (nodesToInvert.size === 0) {\n return\n }\n\n for (const { sequence } of [...state.tracks, ...state.reads]) {\n for (let j = 0; j < sequence.length; j += 1) {\n if (nodesToInvert.has(forward(sequence[j]!))) {\n sequence[j] = flip(sequence[j]!)\n }\n }\n }\n\n state.nodes.forEach(node => {\n if (nodesToInvert.has(node.name)) {\n node.seq = getReverseComplement(node.seq)\n }\n })\n}\n\n// generates attributes (node.y, node.contentHeight) for nodes without tracks, only reads\nfunction generateReadOnlyNodeAttributes(state: LayoutState): void {\n state.nodesPerOrder = Array.from({ length: state.maxOrder + 1 }, () => [])\n\n const orderY = new Map<number, number>()\n state.nodes.forEach((node: MaybeUnplacedNode) => {\n if (node.y !== undefined) {\n setMapToMax(orderY, node.order, node.y + node.contentHeight)\n }\n })\n\n // for order values where there is no node with haplotypes, orderY is calculated via tracks\n state.tracks.forEach(track => {\n if (track.type === 'haplotype') {\n track.path.forEach(step => {\n setMapToMax(orderY, step.order, (step.y ?? 0) + track.width)\n })\n }\n })\n\n state.nodes.forEach((node: MaybeUnplacedNode, i) => {\n if (node.order >= 0 && node.y === undefined) {\n node.y = (orderY.get(node.order) ?? 0) + 25\n node.contentHeight = 0\n state.nodesPerOrder[node.order]!.push(i)\n }\n })\n}\n\nfunction setMapToMax<K>(map: Map<K, number>, key: K, value: number): void {\n const existing = map.get(key)\n if (existing === undefined) {\n map.set(key, value)\n } else {\n map.set(key, Math.max(existing, value))\n }\n}\n\nexport const READ_WIDTH = 7\n\n// add info about reads to nodes (incoming, outgoing and internal reads)\nfunction assignReadsToNodes(state: LayoutState): void {\n state.nodes.forEach(node => {\n node.incomingReads = []\n node.outgoingReads = []\n node.internalReads = []\n })\n state.reads.forEach((read: MaybeUnset<Track, 'width'>, idx) => {\n // coarsened bands arrive sized by their crossing count\n if (read.width === undefined || read.width === 0) {\n read.width = READ_WIDTH\n }\n read.path.forEach((segment, pathIdx) => {\n if (segment.node === null) {\n return\n }\n const node = state.nodes[segment.node]!\n if (read.path.length === 1) {\n node.internalReads.push(idx)\n } else if (pathIdx === 0) {\n node.outgoingReads.push([idx, pathIdx])\n } else {\n node.incomingReads.push([idx, pathIdx])\n }\n })\n })\n}\n\n// calculate paths (incl. correct y coordinate) for all reads\nfunction placeReads(state: LayoutState): void {\n state.reads.forEach(read => {\n read.path = basicPath(state, read)\n })\n assignReadsToNodes(state)\n\n // placed nodes by order, then by y-coordinate\n const sortedNodes = state.nodes.filter(node => node.order >= 0)\n sortedNodes.sort(compareNodesByOrder)\n\n // One set per layer and source track: haplotype bands, then each read file\n const sets = new Map<\n string,\n { layer: number; source: number; reads: Set<number> }\n >()\n for (let i = 0; i < state.reads.length; i++) {\n const read = state.reads[i]!\n const layer = read.haplotypeShare === undefined ? 1 : 0\n const source = read.sourceTrackID\n const key = `${layer}:${source}`\n const set = sets.get(key)\n if (set === undefined) {\n sets.set(key, { layer, source, reads: new Set([i]) })\n } else {\n set.reads.add(i)\n }\n }\n const orderedSets = [...sets.values()].sort(\n (a, b) => a.layer - b.layer || a.source - b.source,\n )\n\n // A margin sets each set apart from the one above it\n const topMargin = orderedSets.length > 1 ? READ_WIDTH : 0\n sortedNodes.forEach(node => {\n for (const { reads } of orderedSets) {\n placeReadSet(state, reads, node, topMargin)\n }\n })\n\n // place read segments which are without node\n const bottomY = calculateBottomY(state)\n const elementsWithoutNode: ElementWithoutNode[] = []\n state.reads.forEach((read, idx) => {\n // The nearest node visit before and after each segment. A read starts and\n // ends on a node, so only its first and last segments lack one.\n const prevSegment: (Segment | undefined)[] = []\n const nextSegment: (Segment | undefined)[] = []\n let visit: Segment | undefined\n read.path.forEach((seg, i) => {\n prevSegment[i] = visit\n if (seg.node !== null) {\n visit = seg\n }\n })\n visit = undefined\n for (let i = read.path.length - 1; i >= 0; i -= 1) {\n nextSegment[i] = visit\n if (read.path[i]!.node !== null) {\n visit = read.path[i]\n }\n }\n\n read.path.forEach((element, pathIdx) => {\n if (element.y === undefined) {\n const previousVisitToNode = prevSegment[pathIdx]\n const nextVisitToNode = nextSegment[pathIdx]\n\n // Specifically referring to segments between a cycle that's traversing from right to left\n const betweenCycleReverseTraversal = Boolean(\n // A segment can be between a cycle if it there are nodes on both sides\n nextVisitToNode &&\n previousVisitToNode &&\n // A segment is between a cycle if the next node it visits is behind the previous node it visited\n (previousVisitToNode.order > nextVisitToNode.order ||\n // A segment can also be between a cycle if it's visiting the same node it just visited in the same direction\n (nextVisitToNode.order === previousVisitToNode.order &&\n nextVisitToNode.isForward === previousVisitToNode.isForward)),\n )\n\n element.betweenCycleReverseTraversal = betweenCycleReverseTraversal\n\n elementsWithoutNode.push({\n readIndex: idx,\n pathIndex: pathIdx,\n previousY: previousVisitToNode?.y,\n previousNode: previousVisitToNode?.node,\n })\n }\n })\n })\n\n elementsWithoutNode.sort((a, b) => compareNoNodeReads(state, a, b))\n elementsWithoutNode.forEach(element => {\n const read = state.reads[element.readIndex]!\n const segment = read.path[element.pathIndex]!\n segment.y = bottomY[segment.order]!\n bottomY[segment.order]! += read.width\n })\n}\n\n// Place a particular collection of reads, identified by a list of read\n// numbers, into the given node at the right Y coordinates. All reads in all\n// nodes above it, and no reads in any nodes below it, are already placed.\n// Makes the given node bigger if needed and moves other nodes down if needed.\n// If topMargin is set, applies that amount of spacing down from whatever is above the reads.\nfunction placeReadSet(\n state: LayoutState,\n toPlace: Set<number>,\n node: LayoutNode,\n topMargin: number,\n): void {\n // Get arrays of the read entry/exit/internal-ness records we want to work on\n let incomingReads = node.incomingReads.filter(([readID]) =>\n toPlace.has(readID),\n )\n const outgoingReads = node.outgoingReads.filter(([readID]) =>\n toPlace.has(readID),\n )\n const internalReads = node.internalReads.filter(readID => toPlace.has(readID))\n\n // Only actually use the top margin if we have any reads on the node.\n if (\n incomingReads.length === 0 &&\n outgoingReads.length === 0 &&\n internalReads.length === 0\n ) {\n topMargin = 0\n }\n\n // twice the margin, as sequenceTubeMap spaces them, keeps reads out of the\n // lanes beside them\n const startY = node.y + node.contentHeight + topMargin * 2\n\n // Sort incoming reads by how far back along each path its last placed\n // segment is (decisionStep: the smallest k >= 1 where path[pathIdx - k].y\n // is set, or pathIdx + 1 when none is) and then by that segment's y\n const incomingKeys = incomingReads.map(entry => {\n const [readID, pathIdx] = entry\n const path = state.reads[readID]!.path\n let decisionStep = pathIdx + 1\n let foundY: number | undefined\n for (let k = 1; k <= pathIdx; k++) {\n const y = path[pathIdx - k]?.y\n if (y !== undefined) {\n decisionStep = k\n foundY = y\n break\n }\n }\n return { entry, decisionStep, y: foundY }\n })\n incomingKeys.sort(compareIncomingReadKeys)\n incomingReads = incomingKeys.map(k => k.entry)\n\n let currentY = startY\n const occupiedUntil = new Map<number, number>()\n incomingReads.forEach(readElement => {\n const read = state.reads[readElement[0]]!\n read.path[readElement[1]]!.y = currentY\n setOccupiedUntil(occupiedUntil, read, readElement[1], currentY, node)\n currentY += read.width\n })\n let maxY = currentY\n\n outgoingReads.sort((a, b) =>\n compareReadOutgoingSegmentsByGoingTo(state, a, b),\n )\n\n const occupiedFrom = new Map<number, number>()\n currentY = startY\n outgoingReads.forEach(readElement => {\n const read = state.reads[readElement[0]]!\n const firstNodeOffset = read.firstNodeOffset ?? 0\n read.path[readElement[1]]!.y = currentY\n occupiedFrom.set(currentY, firstNodeOffset)\n // a read that starts the base after an incoming one ends shares its lane,\n // which lets coarsened bands through a 1 bp node share one\n const occUntil = occupiedUntil.get(currentY)\n if (occUntil === undefined || occUntil + 1 <= firstNodeOffset) {\n currentY += read.width\n maxY = Math.max(maxY, currentY)\n } else {\n // otherwise push down incoming reads to make place for outgoing Read\n occupiedUntil.set(currentY, 0)\n incomingReads.forEach(incReadElementIndices => {\n const incRead = state.reads[incReadElementIndices[0]]!\n const incReadPathElement = incRead.path[incReadElementIndices[1]]!\n if (\n incReadPathElement.y !== undefined &&\n incReadPathElement.y >= currentY\n ) {\n incReadPathElement.y += read.width\n setOccupiedUntil(\n occupiedUntil,\n incRead,\n incReadElementIndices[1],\n incReadPathElement.y,\n node,\n )\n }\n })\n currentY += read.width\n maxY += read.width\n }\n })\n\n internalReads.sort((a, b) => compareInternalReads(state, a, b))\n\n internalReads.forEach(readIdx => {\n const currentRead = state.reads[readIdx]!\n const firstNodeOffset = currentRead.firstNodeOffset ?? 0\n const finalNodeCoverLength = currentRead.finalNodeCoverLength ?? 0\n currentY = startY\n while (\n firstNodeOffset < (occupiedUntil.get(currentY) ?? -Infinity) + 2 ||\n finalNodeCoverLength > (occupiedFrom.get(currentY) ?? Infinity) - 3\n ) {\n currentY += currentRead.width\n }\n currentRead.path[0]!.y = currentY\n occupiedUntil.set(currentY, finalNodeCoverLength)\n maxY = Math.max(maxY, currentY)\n })\n\n // adjust node height and move other nodes vertically down\n const heightIncrease = maxY - node.y - node.contentHeight\n node.contentHeight += heightIncrease\n adjustVertically3(state, node, heightIncrease)\n}\n\n// The decorated sort key for one incoming read segment; see the comment in\n// placeReadSet for how it is derived\ninterface IncomingReadKey {\n decisionStep: number\n y: number | undefined\n}\n\n// Smaller decisionStep wins. On a tie, entries that walked off the front of the\n// path (no defined y) sort first and tie with each other; otherwise compare y.\nfunction compareIncomingReadKeys(\n a: IncomingReadKey,\n b: IncomingReadKey,\n): number {\n if (a.decisionStep !== b.decisionStep) {\n return a.decisionStep - b.decisionStep\n }\n if (a.y === undefined || b.y === undefined) {\n return (a.y === undefined ? 0 : 1) - (b.y === undefined ? 0 : 1)\n }\n return a.y - b.y\n}\n\n// keeps track of where reads end within nodes\nfunction setOccupiedUntil(\n map: Map<number, number>,\n read: Track,\n pathIndex: number,\n y: number,\n node: Node,\n): void {\n map.set(\n y,\n pathIndex === read.path.length - 1\n ? (read.finalNodeCoverLength ?? 0)\n : node.sequenceLength,\n )\n}\n\ninterface ElementWithoutNode {\n readIndex: number\n pathIndex: number\n previousY: number | undefined\n previousNode: number | null | undefined\n}\n\n// compare read segments which are outside of nodes to sort them in a good horizontal\n// and then vertical display order.\nfunction compareNoNodeReads(\n state: LayoutState,\n a: ElementWithoutNode,\n b: ElementWithoutNode,\n): number {\n const readA = state.reads[a.readIndex]!\n const readB = state.reads[b.readIndex]!\n const segmentA = readA.path[a.pathIndex]!\n const segmentB = readB.path[b.pathIndex]!\n // Sort by order by segments\n if (segmentA.order !== segmentB.order) {\n return segmentA.order - segmentB.order\n }\n // Sort by reads' source track\n if (readA.sourceTrackID !== readB.sourceTrackID) {\n return readA.sourceTrackID - readB.sourceTrackID\n }\n // Sort by order of previous node\n if (a.previousNode && b.previousNode) {\n const prevNodeA = state.nodes[a.previousNode]\n const prevNodeB = state.nodes[b.previousNode]\n if (prevNodeA && prevNodeB && prevNodeA.order !== prevNodeB.order) {\n return prevNodeA.order - prevNodeB.order\n }\n }\n // Segments on the reverse-going part of a cycle go below the rest, in\n // reverse order, so a loop that starts on the outside stays there and rolls\n // up in order with the other loops.\n const aPrev = a.previousY ?? 0\n const bPrev = b.previousY ?? 0\n const aReverse = segmentA.betweenCycleReverseTraversal === true\n const bReverse = segmentB.betweenCycleReverseTraversal === true\n if (aReverse !== bReverse) {\n return aReverse ? 1 : -1\n }\n return aReverse ? bPrev - aPrev : aPrev - bPrev\n}\n\n// Order reads leaving a node by the y of each one's last placed segment, else\n// by the node where their paths part, else by where each starts and ends\nfunction compareReadOutgoingSegmentsByGoingTo(\n state: LayoutState,\n [readIndexA, pathIndexA]: [number, number],\n [readIndexB, pathIndexB]: [number, number],\n): number {\n const readA = state.reads[readIndexA]!\n const readB = state.reads[readIndexB]!\n const lastYA = readA.path.findLast(seg => seg.y !== undefined)?.y\n const lastYB = readB.path.findLast(seg => seg.y !== undefined)?.y\n if (lastYA !== undefined && lastYB !== undefined) {\n return lastYA - lastYB\n }\n\n const nodeAt = (read: Track, i: number) => {\n const node = read.path[i]?.node\n return node === null || node === undefined\n ? null\n : (state.nodes[node] ?? null)\n }\n const nextVisit = (read: Track, i: number) => {\n let next = i + 1\n while (read.path[next]?.node === null) {\n next += 1\n }\n return next\n }\n let nodeA = nodeAt(readA, pathIndexA)\n let nodeB = nodeAt(readB, pathIndexB)\n while (nodeA !== null && nodeA === nodeB) {\n pathIndexA = nextVisit(readA, pathIndexA)\n pathIndexB = nextVisit(readB, pathIndexB)\n nodeA = nodeAt(readA, pathIndexA)\n nodeB = nodeAt(readB, pathIndexB)\n }\n if (nodeA !== null && nodeB !== null) {\n return compareNodesByOrder(nodeA, nodeB)\n }\n if (nodeA !== null || nodeB !== null) {\n return nodeA === null ? -1 : 1\n }\n return (\n (readA.firstNodeOffset ?? 0) - (readB.firstNodeOffset ?? 0) ||\n (readA.finalNodeCoverLength ?? 0) - (readB.finalNodeCoverLength ?? 0)\n )\n}\n\n// Compare tracks based on ordering at their first convergence\nfunction compareTrackByInitialOrdering(trackA: Track, trackB: Track): number {\n // Find the first node where the two tracks converge, sort by layer.\n const pathA = trackA.path\n const pathB = trackB.path\n\n let AIndex = 0\n let BIndex = 0\n while (AIndex < pathA.length && BIndex < pathB.length) {\n const a = pathA[AIndex]!\n const b = pathB[BIndex]!\n const trackAOrder = a.order\n const trackBOrder = b.order\n if (trackAOrder === trackBOrder && a.node && b.node) {\n return (b.y ?? 0) - (a.y ?? 0)\n } else if (trackAOrder < trackBOrder) {\n AIndex += 1\n } else if (trackAOrder > trackBOrder) {\n BIndex += 1\n } else {\n // Orders are equal but are traversing out of nodes\n AIndex += 1\n BIndex += 1\n }\n }\n\n // Tracks do not converge, keep the same ordering\n return 0\n}\n\n// compare 2 reads which are completely within a single node\nfunction compareInternalReads(\n state: LayoutState,\n idxA: number,\n idxB: number,\n): number {\n const a = state.reads[idxA]!\n const b = state.reads[idxB]!\n return (\n (a.firstNodeOffset ?? 0) - (b.firstNodeOffset ?? 0) ||\n (a.finalNodeCoverLength ?? 0) - (b.finalNodeCoverLength ?? 0)\n )\n}\n\n// determine biggest y-coordinate for each order-value\nfunction calculateBottomY(state: LayoutState): number[] {\n const bottomY = new Array<number>(state.maxOrder + 1).fill(0)\n\n state.nodes.forEach((node: MaybeUnplacedNode) => {\n if (node.y !== undefined) {\n bottomY[node.order] = Math.max(\n bottomY[node.order]!,\n node.y + node.contentHeight + 20,\n )\n }\n })\n\n state.tracks.forEach(track => {\n track.path.forEach(element => {\n bottomY[element.order] = Math.max(\n bottomY[element.order]!,\n (element.y ?? 0) + track.width,\n )\n })\n })\n return bottomY\n}\n\n// The segments a track draws, in order: one per node visit, plus one per\n// order slot it passes or turns around in without visiting a node. They carry\n// no lanes or coordinates yet.\nfunction basicPath(state: LayoutState, track: Track): Segment[] {\n const path: Segment[] = []\n const pass = (order: number, isForward: boolean): void => {\n path.push({ order, isForward, node: null })\n }\n const visit = (order: number, isForward: boolean, node: number): void => {\n path.push({ order, isForward, node })\n }\n\n let currentNodeIndex = Math.abs(track.indexSequence[0]!)\n let currentNodeIsForward = isForwardIndex(track.indexSequence[0]!)\n let currentNode = state.nodes[currentNodeIndex]!\n visit(currentNode.order, currentNodeIsForward, currentNodeIndex)\n\n for (let i = 1; i < track.sequence.length; i += 1) {\n const previousNode = currentNode\n const previousNodeIsForward = currentNodeIsForward\n currentNodeIndex = Math.abs(track.indexSequence[i]!)\n currentNodeIsForward = isForwardIndex(track.indexSequence[i]!)\n currentNode = state.nodes[currentNodeIndex]!\n const { order } = currentNode\n\n if (order > previousNode.order) {\n if (!previousNodeIsForward) {\n pass(previousNode.order, true)\n }\n for (let j = previousNode.order + 1; j < order; j += 1) {\n pass(j, true)\n }\n if (!currentNodeIsForward) {\n pass(order, true)\n }\n } else if (order < previousNode.order) {\n if (previousNodeIsForward) {\n pass(previousNode.order, false)\n }\n for (let j = previousNode.order - 1; j > order; j -= 1) {\n pass(j, false)\n }\n if (currentNodeIsForward) {\n pass(order, false)\n }\n } else if (currentNodeIsForward === previousNodeIsForward) {\n pass(order, !currentNodeIsForward)\n }\n visit(order, currentNodeIsForward, currentNodeIndex)\n }\n return path\n}\n\n// Turn each read that visits only reverse nodes around to visit them forward\nfunction reverseReversedReads(\n state: LayoutState,\n reads: readonly Track[] = state.reads,\n): void {\n reads.forEach(read => {\n if (!read.sequence.every(isReverse)) {\n return\n }\n // each turn flips the strand, since a later node switch can turn a read\n // back and a read can arrive already flagged reverse\n read.is_reverse = read.is_reverse !== true\n read.sequence = read.sequence.toReversed().map(forward)\n if (read.sequenceNew !== undefined) {\n read.sequenceNew = read.sequenceNew.toReversed()\n }\n for (const entry of read.sequenceNew ?? []) {\n entry.nodeName = forward(entry.nodeName)\n const { sequenceLength } = nodeByName(state, entry.nodeName)\n entry.mismatches = entry.mismatches.map(mm =>\n mirroredMismatch(mm, sequenceLength),\n )\n }\n\n const firstOffset = read.firstNodeOffset ?? 0\n const firstLen = nodeByName(state, read.sequence[0]!).sequenceLength\n const lastLen = nodeByName(state, read.sequence.at(-1)!).sequenceLength\n read.firstNodeOffset = firstLen - (read.finalNodeCoverLength ?? 0)\n read.finalNodeCoverLength = lastLen - firstOffset\n })\n}\n\n// A mismatch on the opposite strand: its position counted from the node's\n// other end and its bases reverse-complemented. The pivot is sequenceLength,\n// not node.width, because positions count bases.\nexport function mirroredMismatch(\n mm: Mismatch,\n sequenceLength: number,\n): Mismatch {\n const span =\n mm.type === 'insertion'\n ? 0\n : mm.type === 'deletion'\n ? (mm.length ?? 0)\n : (mm.seq?.length ?? 0)\n return {\n ...mm,\n pos: sequenceLength - mm.pos - span,\n ...(mm.seq !== undefined && { seq: getReverseComplement(mm.seq) }),\n }\n}\n\nconst COMPLEMENT: Record<string, string> = { A: 'T', T: 'A', C: 'G', G: 'C' }\n\nfunction getReverseComplement(s: string): string {\n let result = ''\n for (let i = s.length - 1; i >= 0; i -= 1) {\n result += COMPLEMENT[s.charAt(i)] ?? 'N'\n }\n return result\n}\n\n// for each track: generate sequence of node indices from seq. of node names.\n// Tracks revisit the same names, so each name resolves once per call.\nfunction generateTrackIndexSequences(\n state: LayoutState,\n tracksOrReads: Track[],\n): void {\n const signedIndexOf = new Map<string, number>()\n tracksOrReads.forEach(track => {\n track.indexSequence = track.sequence.map(nodeName => {\n let signed = signedIndexOf.get(nodeName)\n if (signed === undefined) {\n const index = state.nodeMap.get(forward(nodeName))\n if (index === undefined) {\n throw new Error(\n `Track ${track.name ?? track.id} visits unknown node ${nodeName}`,\n )\n }\n signed = isReverse(nodeName) ? -index : index\n signedIndexOf.set(nodeName, signed)\n }\n return signed\n })\n })\n}\n\n// Tracks enter and leave a node this far outside it horizontally\nconst NODE_HORIZONTAL_SLACK = 20\n\n// The box around every node outline and track shape. A turnaround's corners\n// reach no further out than its vertical rectangles, so the rectangles and\n// curves stand in for them.\nfunction getImageDimensions(state: LayoutState): ImageBounds {\n const bounds: ImageBounds = {\n minX: Infinity,\n maxX: -Infinity,\n minY: Infinity,\n maxY: -Infinity,\n }\n\n const { rectangles, verticalRectangles, curves } = state.shapes\n for (const shapes of [rectangles, verticalRectangles, curves]) {\n for (const { xStart, xEnd } of shapes) {\n bounds.minX = Math.min(bounds.minX, xStart, xEnd)\n bounds.maxX = Math.max(bounds.maxX, xStart, xEnd)\n }\n }\n\n state.nodes.forEach((node: MaybeUnplacedNode) => {\n if (node.x !== undefined) {\n bounds.minX = Math.min(bounds.minX, node.x - 9)\n bounds.maxX = Math.max(\n bounds.maxX,\n node.x + NODE_HORIZONTAL_SLACK + node.pixelWidth,\n )\n }\n if (node.y !== undefined) {\n bounds.minY = Math.min(bounds.minY, node.y - 10)\n bounds.maxY = Math.max(bounds.maxY, node.y + node.contentHeight + 10)\n }\n })\n\n state.tracks.forEach(track => {\n track.path.forEach(segment => {\n const y = segment.y ?? 0\n bounds.maxY = Math.max(bounds.maxY, y + track.width)\n bounds.minY = Math.min(bounds.minY, y)\n })\n })\n\n return bounds\n}\n\n// Resolve a (possibly reverse-oriented) node name to its layout node. Every\n// caller runs after generateNodeMap, so a miss is a programming error.\nfunction nodeByName(state: LayoutState, nodeName: string): LayoutNode {\n const index = state.nodeMap.get(forward(nodeName))\n const node = index === undefined ? undefined : state.nodes[index]\n if (node === undefined) {\n throw new Error(`Unknown node ${nodeName}`)\n }\n return node\n}\n\n// map node names to node indices\nfunction generateNodeMap(state: LayoutState): Map<string, number> {\n const nodeMap = new Map<string, number>()\n state.nodes.forEach((node, index) => {\n nodeMap.set(node.name, index)\n })\n return nodeMap\n}\n\n// adds a successor-array to each node containing the indices of the nodes coming directly after the current node\nfunction generateNodeSuccessors(state: LayoutState): void {\n const successorSets: Set<number>[] = state.nodes.map(() => new Set())\n const predecessorSets: Set<number>[] = state.nodes.map(() => new Set())\n\n const addEdges = (track: Track): void => {\n for (let i = 0; i < track.indexSequence.length - 1; i += 1) {\n const current = Math.abs(track.indexSequence[i]!)\n const follower = Math.abs(track.indexSequence[i + 1]!)\n successorSets[current]!.add(follower)\n predecessorSets[follower]!.add(current)\n }\n }\n\n state.tracks.forEach(addEdges)\n state.reads.forEach(addEdges)\n\n state.nodes.forEach((node, i) => {\n node.successors = Array.from(successorSets[i]!)\n node.predecessors = Array.from(predecessorSets[i]!)\n })\n}\n\nfunction generateNodeOrderOfSingleTrack(\n state: LayoutState,\n sequence: number[],\n): void {\n let forwardOrder = 0\n let backwardOrder = 0\n let minOrder = 0\n\n sequence.forEach(nodeIndex => {\n const idx = Math.abs(nodeIndex)\n if (nodeIndex < 0) {\n const order = (state.nodeOrders[idx] ??= backwardOrder)\n if (order < minOrder) {\n minOrder = order\n }\n forwardOrder = order\n backwardOrder = order - 1\n } else {\n const order = (state.nodeOrders[idx] ??= forwardOrder)\n forwardOrder = order + 1\n backwardOrder = order\n }\n })\n if (minOrder < 0) {\n increaseOrderForAllNodes(state, -minOrder)\n }\n}\n\n// calculate the order-value of nodes contained in sequence which are to the left of the first node which already has an order-value\nfunction generateNodeOrderTrackBeginning(\n state: LayoutState,\n sequence: number[],\n): number | null {\n let anchorIndex = 0\n let minOrder = 0\n\n while (\n anchorIndex < sequence.length &&\n state.nodeOrders[Math.abs(sequence[anchorIndex]!)] === undefined\n ) {\n anchorIndex += 1 // anchor = first node in common with existing graph\n }\n if (anchorIndex >= sequence.length) {\n return null\n }\n\n const anchorSeqVal = sequence[anchorIndex]!\n let currentOrder: number\n let increment: number\n if (anchorSeqVal >= 0) {\n currentOrder = state.nodeOrders[anchorSeqVal]! - 1\n increment = -1\n } else {\n currentOrder = state.nodeOrders[-anchorSeqVal]! + 1\n increment = 1\n }\n\n for (let j = anchorIndex - 1; j >= 0; j -= 1) {\n // assign order to nodes which are left of anchor node\n const idx = Math.abs(sequence[j]!)\n if (state.nodeOrders[idx] === undefined) {\n state.nodeOrders[idx] = currentOrder\n minOrder = Math.min(minOrder, currentOrder)\n currentOrder += increment\n }\n }\n\n if (minOrder < 0) {\n increaseOrderForAllNodes(state, -minOrder)\n }\n return anchorIndex\n}\n\n// Sentinel order for nodes no track or read reaches.\nexport const UNREACHABLE_ORDER = -1\n\n// Replace every unassigned entry, holes included, with UNREACHABLE_ORDER\nfunction fillUnassignedOrders(\n orders: readonly (number | undefined)[],\n): number[] {\n return Array.from(orders, order => order ?? UNREACHABLE_ORDER)\n}\n\n// increaseOrderForSuccessors can move every node off an order, and\n// generateSVGShapesFromPath has no x for a lane change at an empty order, so\n// the used orders are renumbered 0, 1, 2, ...\nfunction compactOrders(orders: readonly number[]): number[] {\n const used = [...new Set(orders.filter(order => order >= 0))].sort(\n (a, b) => a - b,\n )\n const rank = new Map(used.map((order, i) => [order, i]))\n return orders.map(order => rank.get(order) ?? order)\n}\n\n// generate global sequence of nodes from left to right, starting with first track and adding other tracks sequentially\nfunction generateNodeOrder(state: LayoutState): void {\n let modifiedSequence: number[]\n let currentOrder: number\n let rightIndex: number | null\n let leftIndex: number\n let minOrder = 0\n const tracksAndReads = state.tracks.concat(state.reads)\n const reachability: ReachabilityScratch = {\n stamp: new Int32Array(state.nodes.length),\n generation: 0,\n }\n\n // fill() makes the array dense: `new Array(n)` alone is all holes, which\n // forEach skips, so neither the sentinel pass nor the copy-back below ran.\n state.nodeOrders = new Array<number | undefined>(state.nodes.length).fill(\n undefined,\n )\n // Widened to Node, whose order is optional, to clear the previous run's orders\n state.nodes.forEach((node: Node) => {\n node.order = undefined\n })\n\n generateNodeOrderOfSingleTrack(state, state.tracks[0]!.indexSequence)\n\n for (let i = 1; i < tracksAndReads.length; i += 1) {\n rightIndex = generateNodeOrderTrackBeginning(\n state,\n tracksAndReads[i]!.indexSequence,\n )\n if (rightIndex === null) {\n if (i < state.tracks.length) {\n generateNodeOrderOfSingleTrack(state, tracksAndReads[i]!.indexSequence)\n } else {\n tracksAndReads.splice(i, 1)\n state.reads.splice(i - state.tracks.length, 1)\n i -= 1\n }\n continue\n }\n modifiedSequence = uninvert(tracksAndReads[i]!.indexSequence)\n\n while (rightIndex < modifiedSequence.length) {\n // move right until the end of the sequence\n leftIndex = rightIndex\n rightIndex += 1\n while (\n rightIndex < modifiedSequence.length &&\n state.nodeOrders[modifiedSequence[rightIndex]!] === undefined\n ) {\n rightIndex += 1\n }\n\n if (rightIndex < modifiedSequence.length) {\n // middle segment between two anchors\n currentOrder = state.nodeOrders[modifiedSequence[leftIndex]!]! + 1\n for (let j = leftIndex + 1; j < rightIndex; j += 1) {\n state.nodeOrders[modifiedSequence[j]!] = currentOrder\n currentOrder += 1\n }\n\n if (\n state.nodeOrders[modifiedSequence[rightIndex]!]! >\n state.nodeOrders[modifiedSequence[leftIndex]!]!\n ) {\n if (state.nodeOrders[modifiedSequence[rightIndex]!]! < currentOrder) {\n increaseOrderForSuccessors(\n state,\n modifiedSequence[rightIndex]!,\n modifiedSequence[rightIndex - 1]!,\n currentOrder,\n )\n }\n } else {\n if (\n tracksAndReads[i]!.indexSequence[rightIndex]! >= 0 &&\n !isSuccessor(\n state,\n modifiedSequence[rightIndex]!,\n modifiedSequence[leftIndex]!,\n reachability,\n )\n ) {\n // no real reversal\n increaseOrderForSuccessors(\n state,\n modifiedSequence[rightIndex]!,\n modifiedSequence[rightIndex - 1]!,\n currentOrder,\n )\n } else {\n // real reversal\n if (\n tracksAndReads[i]!.indexSequence[leftIndex]! < 0 ||\n (state.nodes[modifiedSequence[leftIndex + 1]!]!.degree < 2 &&\n state.nodeOrders[modifiedSequence[rightIndex]!]! <\n state.nodeOrders[modifiedSequence[leftIndex]!]!)\n ) {\n currentOrder = state.nodeOrders[modifiedSequence[leftIndex]!]! - 1\n for (let j = leftIndex + 1; j < rightIndex; j += 1) {\n state.nodeOrders[modifiedSequence[j]!] = currentOrder\n minOrder = Math.min(minOrder, currentOrder)\n currentOrder -= 1\n }\n }\n }\n }\n } else {\n // right segment to the right of last anchor\n if (tracksAndReads[i]!.indexSequence[leftIndex]! >= 0) {\n // elongate towards the right\n currentOrder = state.nodeOrders[modifiedSequence[leftIndex]!]! + 1\n for (let j = leftIndex + 1; j < modifiedSequence.length; j += 1) {\n const idx = modifiedSequence[j]!\n if (state.nodeOrders[idx] === undefined) {\n state.nodeOrders[idx] = currentOrder\n currentOrder += 1\n }\n }\n } else {\n // elongate towards the left\n currentOrder = state.nodeOrders[modifiedSequence[leftIndex]!]! - 1\n for (let j = leftIndex + 1; j < modifiedSequence.length; j += 1) {\n const idx = modifiedSequence[j]!\n if (state.nodeOrders[idx] === undefined) {\n state.nodeOrders[idx] = currentOrder\n minOrder = Math.min(minOrder, currentOrder)\n currentOrder -= 1\n }\n }\n }\n }\n }\n }\n\n if (minOrder < 0) {\n increaseOrderForAllNodes(state, -minOrder)\n }\n\n // Nodes unreachable from any track get UNREACHABLE_ORDER so every node ends\n // up with a defined order; downstream code uses `order >= 0` to skip them.\n state.nodeOrders = compactOrders(fillUnassignedOrders(state.nodeOrders))\n state.nodes.forEach((node, i) => {\n node.order = state.nodeOrders[i]!\n })\n}\n\n// Reusable visited-set for the reachability searches in generateNodeOrder.\n// Stamping with a generation counter avoids reallocating (and re-zeroing) an\n// array of nodes.length booleans on every call.\ninterface ReachabilityScratch {\n stamp: Int32Array\n generation: number\n}\n\nfunction isSuccessor(\n state: LayoutState,\n first: number,\n second: number,\n scratch: ReachabilityScratch,\n): boolean {\n scratch.generation += 1\n const { stamp, generation } = scratch\n const stack: number[] = [first]\n stamp[first] = generation\n while (stack.length > 0) {\n const current = stack.pop()!\n if (current === second) {\n return true\n }\n for (const childIndex of state.nodes[current]!.successors) {\n if (stamp[childIndex] !== generation) {\n stamp[childIndex] = generation\n stack.push(childIndex)\n }\n }\n }\n return false\n}\n\n// get order number of the rightmost node\nfunction getMaxOrder(state: LayoutState): number {\n let max = -1\n state.nodeOrders.forEach(order => {\n if (order !== undefined && order > max) {\n max = order\n }\n })\n return max\n}\n\n// generates sequence keeping the order but switching all reversed (negative) nodes to forward nodes\nfunction uninvert(sequence: number[]): number[] {\n return sequence.map(v => Math.abs(v))\n}\n\n// increases the order-value of all nodes by amount\nfunction increaseOrderForAllNodes(state: LayoutState, amount: number): void {\n state.nodeOrders.forEach((order, i) => {\n if (order !== undefined) {\n state.nodeOrders[i] = order + amount\n }\n })\n}\n\n// increases the order-value for currentNode and (if necessary) successor nodes recursively\nfunction increaseOrderForSuccessors(\n state: LayoutState,\n startingNode: number,\n tabuNode: number,\n newOrder: number,\n): void {\n const increasedOrders = new Map<number, number>()\n // Walked with a head pointer rather than shift(), which is O(length) per pop.\n const queue: [number, number][] = [[startingNode, newOrder]]\n let head = 0\n\n while (head < queue.length) {\n const [currentNode, currentOrder] = queue[head]!\n head += 1\n const currentNodeOrder = state.nodeOrders[currentNode]\n\n if (currentNodeOrder !== undefined && currentNodeOrder < currentOrder) {\n if ((increasedOrders.get(currentNode) ?? -Infinity) < currentOrder) {\n increasedOrders.set(currentNode, currentOrder)\n state.nodes[currentNode]!.successors.forEach(successor => {\n if (\n state.nodeOrders[successor]! > currentNodeOrder &&\n successor !== tabuNode\n ) {\n // only increase order of successors to the right of currentNode\n queue.push([successor, currentOrder + 1])\n }\n })\n if (currentNode !== startingNode) {\n state.nodes[currentNode]!.predecessors.forEach(predecessor => {\n if (\n state.nodeOrders[predecessor]! > currentNodeOrder &&\n predecessor !== tabuNode\n ) {\n // only increase order of predecessors to the right of currentNode\n queue.push([predecessor, currentOrder + 1])\n }\n })\n }\n }\n }\n }\n\n increasedOrders.forEach((value, key) => {\n state.nodeOrders[key] = value\n })\n}\n\n// calculates the node degree: the number of tracks passing through the node / the node height\nfunction generateNodeDegree(state: LayoutState): void {\n state.nodes.forEach(node => {\n node.tracks = []\n })\n\n state.tracks.forEach(track => {\n track.indexSequence.forEach(nodeIndex => {\n state.nodes[Math.abs(nodeIndex)]!.tracks.push(track.id)\n })\n })\n\n state.nodes.forEach(node => {\n node.degree = node.tracks.length\n })\n}\n\n// Orient the nodes to suit the tracks and reads\nfunction switchNodeOrientation(state: LayoutState): void {\n switchNodeOrientationForPaths(\n state,\n [...state.tracks.slice(1), ...state.reads],\n state.tracks[0]!,\n )\n}\n\n// If more of the given paths pass through a specific node in reverse direction than in\n// regular direction, switch its orientation. Nodes the pivot path visits\n// forward keep theirs. Processes all paths' nodes in place, reading each\n// visit's node from its indexSequence, which must match its sequence.\nfunction switchNodeOrientationForPaths(\n state: LayoutState,\n paths: Track[],\n pivotPath: Track,\n): void {\n const scores = new Int32Array(state.nodes.length)\n const onPivot = new Uint8Array(state.nodes.length)\n for (const nodeName of pivotPath.sequence) {\n const index = isReverse(nodeName) ? undefined : state.nodeMap.get(nodeName)\n if (index !== undefined) {\n onPivot[index] = 1\n }\n }\n\n for (const path of paths) {\n const { sequence, indexSequence } = path\n const last = indexSequence.length - 1\n for (let j = 0; j <= last; j += 1) {\n const index = Math.abs(indexSequence[j]!)\n if (onPivot[index] === 1) {\n continue\n }\n const order = state.nodes[index]!.order\n const prevOrder =\n j > 0 ? state.nodes[Math.abs(indexSequence[j - 1]!)]!.order : undefined\n const nextOrder =\n j < last\n ? state.nodes[Math.abs(indexSequence[j + 1]!)]!.order\n : undefined\n // A reverse visit votes for switching when the path runs left to right\n // through the node, and against when it runs right to left.\n const vote = isReverse(sequence[j]!) ? 1 : -1\n if (\n (prevOrder === undefined || prevOrder < order) &&\n (nextOrder === undefined || order < nextOrder)\n ) {\n scores[index]! += vote\n }\n if (\n (prevOrder === undefined || prevOrder > order) &&\n (nextOrder === undefined || order > nextOrder)\n ) {\n scores[index]! -= vote\n }\n }\n }\n\n for (const path of paths) {\n const { sequence, indexSequence } = path\n for (let j = 0; j < indexSequence.length; j += 1) {\n if (scores[Math.abs(indexSequence[j]!)]! > 0) {\n sequence[j] = flip(sequence[j]!)\n indexSequence[j] = -indexSequence[j]!\n }\n }\n }\n\n state.nodes.forEach((node, index) => {\n if (scores[index]! > 0) {\n node.seq = getReverseComplement(node.seq)\n node.switched = true\n }\n })\n}\n\n// calculates the concrete values for the nodes' x-coordinates\nfunction generateNodeXCoords(state: LayoutState): void {\n let currentX = 0\n let nextX = 20\n let currentOrder = -1\n const sortedNodes = state.nodes.slice()\n sortedNodes.sort(compareNodesByOrder)\n const extra = calculateExtraSpace(state)\n\n sortedNodes.forEach(node => {\n if (node.order >= 0) {\n if (node.order > currentOrder) {\n currentOrder = node.order\n currentX = nextX + 10 * extra[node.order]!\n }\n node.x = currentX\n nextX = Math.max(nextX, currentX + 40 + node.pixelWidth)\n }\n })\n}\n\n// A lane change rising or falling this many px or less keeps sequenceTubeMap's\n// slope; one rising further turns steeper\nconst RISE_KNEE = 35\n\n// The extra space, in units of 10 px, that a gap takes for a track rising or\n// falling `rise` px across it. Past RISE_KNEE it grows with the square root of\n// the rise, so a long jump steepens its curve more than it widens the column.\nfunction riseExtra(rise: number): number {\n return rise <= RISE_KNEE\n ? rise / 17.5\n : (RISE_KNEE / 17.5) * Math.sqrt(rise / RISE_KNEE)\n}\n\n// calculates additional horizontal space needed between two nodes\n// two neighboring nodes have to be moved further apart if there is a lot going on in between them\n// -> edges turning to vertical orientation should not overlap\nfunction calculateExtraSpace(state: LayoutState): number[] {\n const slots = state.maxOrder + 1\n const leftSideEdges = new Array<number>(slots).fill(0)\n const rightSideEdges = new Array<number>(slots).fill(0)\n const fallAngleAdjustment = new Array<number>(slots).fill(0)\n const extra: number[] = []\n\n state.tracks.forEach(track => {\n for (let i = 1; i < track.path.length; i += 1) {\n const seg = track.path[i]!\n const prevSeg = track.path[i - 1]!\n // Track is going to the same node, account for space taken up by edges looping around\n if (seg.order === prevSeg.order) {\n // repeat or translocation\n if (seg.isForward) {\n leftSideEdges[seg.order]! += 1\n } else {\n rightSideEdges[seg.order]! += 1\n }\n } else {\n // TODO: Extra space should also be accounted when there are too many tracks curving at the nodes\n fallAngleAdjustment[seg.order] = Math.max(\n riseExtra(Math.abs((seg.y ?? 0) - (prevSeg.y ?? 0))),\n fallAngleAdjustment[seg.order]!,\n )\n }\n }\n })\n\n extra.push(Math.max(0, leftSideEdges[0]! - 1))\n for (let i = 1; i <= state.maxOrder; i += 1) {\n // Extra space uses space needed for edges(tracks looping), or space needed to limit rise/fall angle, whichever is larger\n extra.push(\n Math.max(\n Math.max(0, leftSideEdges[i]! - 1) +\n Math.max(0, rightSideEdges[i - 1]! - 1),\n fallAngleAdjustment[i]!,\n ),\n )\n }\n return extra\n}\n\n// Gather each order slot's segments, those visiting one node together, then\n// sweep left to right giving every segment a lane\nfunction generateLaneAssignment(state: LayoutState): void {\n state.assignments = Array.from({ length: state.maxOrder + 1 }, () => [])\n const byNode = new Map<number, NodeAssignment>()\n state.tracks.forEach((track, trackID) => {\n track.path = basicPath(state, track)\n track.path.forEach(({ order, node }, segmentID) => {\n const segment: SegmentAssignment = { trackID, segmentID }\n const existing = node === null ? undefined : byNode.get(node)\n if (existing === undefined) {\n const assignment: NodeAssignment = { node, tracks: [segment] }\n state.assignments[order]!.push(assignment)\n if (node !== null) {\n byNode.set(node, assignment)\n }\n } else {\n existing.tracks.push(segment)\n }\n })\n })\n\n for (let i = 0; i <= state.maxOrder; i += 1) {\n generateSingleLaneAssignment(state, state.assignments[i]!, i)\n }\n}\n\n// looks at assignment and sets idealY and idealLane by looking at where the tracks come from\nfunction getIdealLanesAndCoords(\n state: LayoutState,\n assignment: NodeAssignment[],\n order: number,\n): void {\n assignment.forEach(node => {\n let laneSum = 0\n node.tracks.forEach(track => {\n const from = segmentToTheLeft(\n state.tracks[track.trackID]!.path,\n track.segmentID,\n order - 1,\n )\n track.idealLane = from === undefined ? track.trackID : from.lane\n track.idealY = from === undefined ? null : from.y\n laneSum += track.idealLane!\n })\n node.idealLane = laneSum / node.tracks.length\n })\n}\n\n// The segment a track's lane follows in from order slot `leftOrder`: its\n// neighbor on either side there, else its last earlier visit to it\nfunction segmentToTheLeft(\n path: readonly Segment[],\n segmentID: number,\n leftOrder: number,\n): Segment | undefined {\n if (segmentID === 0) {\n return undefined\n }\n if (path[segmentID - 1]!.order === leftOrder) {\n return path[segmentID - 1]\n }\n if (path[segmentID + 1]?.order === leftOrder) {\n return path[segmentID + 1]\n }\n return path.slice(0, segmentID).findLast(seg => seg.order === leftOrder)\n}\n\n// assigns the optimal lanes for a single horizontal position (=order)\n// first an ideal lane is calculated for each track (which is ~ the lane of its predecessor)\n// then the nodes are sorted by their average ideal lane\n// and the whole construct is then moved up or down if necessary\nfunction generateSingleLaneAssignment(\n state: LayoutState,\n assignment: NodeAssignment[],\n order: number,\n): void {\n let currentLane = 0\n const potentialAdjustmentValues = new Set<number>()\n let currentY = 20\n let prevNameIsNull = false\n let prevTrack = -1\n\n getIdealLanesAndCoords(state, assignment, order)\n assignment.sort(compareByIdealLane)\n\n assignment.forEach(node => {\n const placed = node.node === null ? undefined : state.nodes[node.node]!\n if (placed !== undefined) {\n if (prevNameIsNull) {\n currentY -= 10\n }\n placed.y = currentY\n placed.contentHeight = 0\n prevNameIsNull = false\n } else {\n if (prevNameIsNull) {\n currentY -= 25\n } else if (currentY > 20) {\n currentY -= 10\n }\n prevNameIsNull = true\n }\n\n node.tracks.sort(compareByIdealLane)\n node.tracks.forEach(track => {\n const { path, width } = state.tracks[track.trackID]!\n if (\n track.trackID === prevTrack &&\n placed === undefined &&\n prevNameIsNull\n ) {\n currentY += 10\n }\n path[track.segmentID]!.lane = currentLane\n path[track.segmentID]!.y = currentY\n if (typeof track.idealY === 'number') {\n potentialAdjustmentValues.add(track.idealY - currentY)\n }\n currentLane += 1\n currentY += width\n if (placed !== undefined) {\n placed.contentHeight += width\n }\n prevTrack = track.trackID\n })\n currentY += 25\n })\n\n adjustVertically(state, assignment, potentialAdjustmentValues)\n}\n\n// moves all tracks at a single horizontal location (=order) up/down to minimize lane changes\nfunction adjustVertically(\n state: LayoutState,\n assignment: NodeAssignment[],\n potentialAdjustmentValues: Set<number>,\n): void {\n let verticalAdjustment = 0\n let minAdjustmentCost = Number.MAX_SAFE_INTEGER\n\n potentialAdjustmentValues.forEach(moveBy => {\n const cost = getVerticalAdjustmentCost(state, assignment, moveBy)\n if (cost < minAdjustmentCost) {\n minAdjustmentCost = cost\n verticalAdjustment = moveBy\n }\n })\n\n assignment.forEach(node => {\n if (node.node !== null) {\n state.nodes[node.node]!.y += verticalAdjustment\n }\n node.tracks.forEach(track => {\n const seg = state.tracks[track.trackID]!.path[track.segmentID]!\n seg.y = seg.y! + verticalAdjustment\n })\n })\n}\n\n// Budge down all nodes and out-of-node tracks below this node by this amount\nfunction adjustVertically3(\n state: LayoutState,\n node: LayoutNode,\n adjustBy: number,\n): void {\n if (node.order < 0 || state.assignments[node.order] === undefined) {\n return\n }\n state.assignments[node.order]!.forEach(assignmentNode => {\n if (assignmentNode.node !== null) {\n const aNode = state.nodes[assignmentNode.node]!\n if (aNode !== node && aNode.y > node.y) {\n aNode.y += adjustBy\n assignmentNode.tracks.forEach(track => {\n const seg = state.tracks[track.trackID]!.path[track.segmentID]!\n seg.y = seg.y! + adjustBy\n })\n }\n } else {\n // track-segment not within a node\n assignmentNode.tracks.forEach(track => {\n const seg = state.tracks[track.trackID]!.path[track.segmentID]!\n if (seg.y! >= node.y) {\n seg.y = seg.y! + adjustBy\n }\n })\n }\n })\n state.nodesPerOrder[node.order]!.forEach(nodeIndex => {\n const other = state.nodes[nodeIndex]!\n if (other !== node && other.y > node.y) {\n other.y += adjustBy\n }\n })\n}\n\n// calculates cost of vertical adjustment as vertical distance * width of track\nfunction getVerticalAdjustmentCost(\n state: LayoutState,\n assignment: NodeAssignment[],\n moveBy: number,\n): number {\n let result = 0\n assignment.forEach(node => {\n node.tracks.forEach(track => {\n const { type, path, width } = state.tracks[track.trackID]!\n if (typeof track.idealY === 'number' && type !== 'read') {\n result +=\n Math.abs(track.idealY - moveBy - path[track.segmentID]!.y!) * width\n }\n })\n })\n return result\n}\n\nfunction compareByIdealLane(\n a: { idealLane?: number | undefined },\n b: { idealLane?: number | undefined },\n): number {\n if (a.idealLane === undefined || b.idealLane === undefined) {\n return Number(a.idealLane === undefined) - Number(b.idealLane === undefined)\n }\n return a.idealLane - b.idealLane\n}\n\nfunction compareNodesByOrder(\n a: MaybeUnplacedNode,\n b: MaybeUnplacedNode,\n): number {\n if (a.order !== b.order) {\n return a.order - b.order\n }\n if (a.y !== undefined && b.y !== undefined) {\n return a.y - b.y\n }\n return 0\n}\n\nfunction calculateTrackWidth(state: LayoutState): void {\n const NARROW_WIDTH = 4\n const WIDE_WIDTH = state.config.trackWidth\n\n if (state.config.freqWidth === 'linear') {\n for (const track of state.tracks) {\n track.width =\n track.type === 'read'\n ? NARROW_WIDTH\n : Math.max(1, Math.round(track.freq ?? 1)) * WIDE_WIDTH\n }\n return\n }\n\n for (const track of state.tracks) {\n track.width =\n track.freq !== undefined\n ? Math.round((Math.log(Math.max(track.freq, 1)) + 1) * NARROW_WIDTH)\n : track.type === 'read'\n ? NARROW_WIDTH\n : WIDE_WIDTH\n }\n\n // freqs of 0 and 1 all draw narrow, which means vg gave no real frequencies\n if (state.tracks.every(track => track.width === NARROW_WIDTH)) {\n state.tracks.forEach(track => {\n if (track.freq !== undefined) {\n track.width = WIDE_WIDTH\n }\n })\n }\n}\n\n// The x of base `base` of a read's visit, counted from the node's left end\n// on a forward visit and from its right end on a reverse one\nfunction readBaseX(state: LayoutState, seg: Segment, base: number): number {\n const node = state.nodes[seg.node!]!\n return clampedXCoordinateOfBaseWithinNode(\n node,\n seg.isForward ? base : node.sequenceLength - base,\n )\n}\n\n// returns the x coordinate (in pixels) of (the left side) of the given base\n// position within the given node, or null if the position is past its end\nexport function getXCoordinateOfBaseWithinNode(\n node: Node,\n base: number,\n): number | null {\n if (base > node.sequenceLength) {\n return null\n } // equality is allowed\n return clampedXCoordinateOfBaseWithinNode(node, base)\n}\n\n// Same, but a base outside the node maps to the nearest node edge. Callers that\n// have to produce a coordinate no matter what use this: falling back to 0 would\n// put the shape at the far left of the whole image instead.\nexport function clampedXCoordinateOfBaseWithinNode(\n node: Node,\n base: number,\n): number {\n const [nodeLeftX, nodeRightX] = nodePixelCoordinatesInX(node)\n if (node.sequenceLength === 0) {\n return nodeLeftX\n }\n const clamped = Math.min(Math.max(base, 0), node.sequenceLength)\n return nodeLeftX + (clamped / node.sequenceLength) * (nodeRightX - nodeLeftX)\n}\n\n// transforms the info in the tracks' path attribute into actual coordinates\n// and saves them in shapes.rectangles and shapes.curves\nfunction generateSVGShapesFromPath(state: LayoutState): void {\n state.extraLeft = new Array<number>(state.maxOrder + 1).fill(0)\n state.extraRight = new Array<number>(state.maxOrder + 1).fill(0)\n\n // generate x coords where each order starts and ends\n const orderStartX: number[] = []\n const orderEndX: number[] = []\n state.nodes.forEach((node: MaybeUnplacedNode) => {\n if (node.x !== undefined) {\n orderStartX[node.order] = node.x\n orderEndX[node.order] = Math.max(\n orderEndX[node.order] ?? -Infinity,\n node.x + node.pixelWidth,\n )\n }\n })\n\n const reference = state.tracks[0]\n\n // Helps generation of verticalRectangles, correct increments of extraRight and extraLeft\n state.tracks.sort(compareTrackByInitialOrdering)\n\n state.tracks.forEach(track => {\n const { id, name, type, width, path } = track\n const rectangle = (xStart: number, xEnd: number, yStart: number): void => {\n state.shapes.rectangles.push({\n xStart: Math.min(xStart, xEnd),\n yStart,\n xEnd: Math.max(xStart, xEnd),\n yEnd: yStart + width - 1,\n id,\n name,\n type,\n })\n }\n const exitX = (seg: Segment) =>\n seg.isForward ? orderEndX[seg.order]! : orderStartX[seg.order]!\n\n const first = path[0]!\n let yStart = first.y!\n let xStart =\n type === 'read'\n ? readBaseX(state, first, track.firstNodeOffset ?? 0)\n : first.isForward\n ? orderStartX[first.order]! - 20\n : orderEndX[first.order]! + 20\n\n for (let i = 1; i < path.length; i += 1) {\n const prev = path[i - 1]!\n const seg = path[i]!\n if (seg.y === yStart) {\n continue\n }\n const xEnd = exitX(prev)\n if (xEnd !== xStart) {\n rectangle(xStart, xEnd, yStart)\n }\n const yEnd = seg.y!\n const step = seg.order - prev.order\n if (step === 1 || step === -1) {\n const xNext =\n step === 1 ? orderStartX[seg.order]! : orderEndX[seg.order]!\n state.shapes.curves.push({\n xStart: step === 1 ? xEnd : xEnd + 1,\n yStart,\n xEnd: step === 1 ? xNext + 1 : xNext,\n yEnd,\n width,\n id,\n name,\n type,\n nodeStart: prev.node,\n nodeEnd: seg.node,\n orderStart: prev.order,\n orderEnd: seg.order,\n ...(track === reference ? { reference: true } : {}),\n })\n xStart = xNext\n } else {\n generateTurnaround(\n state,\n track,\n prev.isForward ? 1 : -1,\n xEnd,\n yStart,\n yEnd,\n seg.order,\n )\n xStart = xEnd\n }\n yStart = yEnd\n }\n\n const last = path[path.length - 1]!\n const xEnd =\n type === 'read'\n ? readBaseX(state, last, track.finalNodeCoverLength ?? 0)\n : exitX(last) + (last.isForward ? 20 : -20)\n rectangle(xStart, xEnd, yStart)\n })\n}\n\n// Sankey-mode synthesis: one synthetic \"read\" per (srcSigned \u2192 dstSigned) edge,\n// fed through the normal placeReads/generateSVGShapesFromPath pipeline so the\n// band gets the same lane assignment, loop topology and bezier shape as a real\n// read. A read band takes its source's palette; a haplotype band carries its\n// share of the haplotypes for the colorer to shade by.\n//\n// Synthetic-track ids live above this base so they don't collide with real\n// track ids and so click/hover handlers can show count info instead of the\n// per-read info dialog.\nconst COARSENED_ID_BASE = 1_000_000_000\nexport const isCoarsenedId = (id: number) => id >= COARSENED_ID_BASE\n\n// Build one synthetic read per (srcSigned \u2192 dstSigned) edge in `source`\n// (real reads, or the alt haplotype tracks). The synthetic reads replace the\n// real ones BEFORE placeReads runs, so:\n// \u2022 placeReads sees N_edges reads instead of N_reads (huge node-height win),\n// \u2022 each band gets a lane and an \"right-down-left-up-right\" loop topology\n// for free (placeReads handles reversals and out-of-order jumps),\n// \u2022 generateSVGShapesFromPath emits exactly one TrackCurve per band using\n// the same bezier as a real read \u2014 no special draw path needed.\n//\n// The synthetic track's `sequence` is just the two signed node names. After\n// generateTrackIndexSequences runs, indexSequence is set and the rest of the\n// layout follows.\nfunction buildCoarsenedSyntheticBands(\n state: LayoutState,\n source: Track[],\n unit: CoarsenedUnit,\n firstId: number,\n): { bands: Track[]; total: number } {\n // Aggregate by signed-edge key. Preserve orientation so e.g. (+A\u2192+B) and\n // (-B\u2192-A) stack as separate bands \u2014 they're different visual flows.\n interface EdgeAgg {\n sSigned: number\n dSigned: number\n sName: string\n dName: string\n // distinct walks, so a walk that loops back over an edge, or crosses it\n // both ways under ignoreStrand, counts once\n count: number\n // every crossing, loops included, which is what sizes the band\n crossings: number\n sourceTrackID: number\n lastSource: number\n }\n const edges = new Map<number, EdgeAgg>()\n let total = 0\n // One number per signed edge: signed indices run from -span to span.\n const span = state.nodes.length\n const edgeKey = (s: number, d: number): number =>\n (s + span) * (2 * span + 1) + d + span\n // When ignoring strand, (+A\u2192+B) and (-B\u2192-A) refer to the same underlying\n // graph connection, so both collapse into the smaller of their two keys;\n // whichever orientation is seen first determines the visual band direction.\n const ignoreStrand = state.config.ignoreStrand\n for (const [sourceIndex, item] of source.entries()) {\n // a deduplicated walk stands for `freq` identical haplotypes\n const weight = Math.max(item.freq ?? 1, 1)\n total += weight\n const seq = item.indexSequence\n if (seq.length < 2) {\n continue\n }\n for (let i = 0; i < seq.length - 1; i += 1) {\n const sSigned = seq[i]!\n const dSigned = seq[i + 1]!\n const srcNode = state.nodes[Math.abs(sSigned)]!\n const dstNode = state.nodes[Math.abs(dSigned)]!\n const key = ignoreStrand\n ? Math.min(edgeKey(sSigned, dSigned), edgeKey(-dSigned, -sSigned))\n : edgeKey(sSigned, dSigned)\n const existing = edges.get(key)\n if (existing === undefined) {\n edges.set(key, {\n sSigned,\n dSigned,\n sName: sSigned < 0 ? `-${srcNode.name}` : srcNode.name,\n dName: dSigned < 0 ? `-${dstNode.name}` : dstNode.name,\n count: weight,\n crossings: weight,\n sourceTrackID: item.sourceTrackID,\n lastSource: sourceIndex,\n })\n } else {\n existing.crossings += weight\n if (existing.lastSource !== sourceIndex) {\n existing.count += weight\n existing.lastSource = sourceIndex\n }\n }\n }\n }\n\n // Square-root scaling on crossings gives heavy edges visible weight without\n // letting one massive edge dwarf everything else. Min stays near READ_WIDTH\n // so single-read edges still look like a normal read; max is generous so\n // hot edges read as obvious \"highways.\"\n let maxEdgeCount = 0\n for (const e of edges.values()) {\n if (e.crossings > maxEdgeCount) {\n maxEdgeCount = e.crossings\n }\n }\n const BAND_MIN_WIDTH = READ_WIDTH\n const BAND_MAX_WIDTH = 60\n const widthForCount = (c: number): number => {\n if (maxEdgeCount <= 1) {\n return BAND_MIN_WIDTH\n }\n return (\n BAND_MIN_WIDTH +\n (BAND_MAX_WIDTH - BAND_MIN_WIDTH) * Math.sqrt(c / maxEdgeCount)\n )\n }\n\n const synthetic: Track[] = []\n let i = 0\n for (const edge of edges.values()) {\n const id = firstId + i\n const share =\n unit === 'haplotype' ? { count: edge.count, total } : undefined\n const shareText = share === undefined ? '' : ` (${formatShare(share)})`\n const crossingsText =\n edge.crossings === edge.count\n ? ''\n : `, ${edge.crossings.toLocaleString()} crossings`\n const label = `${edge.count.toLocaleString()} ${unit}${edge.count === 1 ? '' : 's'}${shareText}${crossingsText}: Node ${edge.sName} \u2192 Node ${edge.dName}`\n state.coarsenedEdgeMeta.set(id, { count: edge.count, label })\n // Place each synthetic band so it touches *only* its endpoint nodes' edges:\n // \u2022 firstNodeOffset = src.sequenceLength \u2192 curve exits at src's right\n // pixel edge, no rectangle drawn inside src.\n // \u2022 finalNodeCoverLength = 0 \u2192 curve enters at dst's left pixel edge,\n // no rectangle drawn inside dst.\n // The crucial side effect is in placeReadSet's conflict check: at any\n // node B with an incoming edge (A\u2192B) and an outgoing edge (B\u2192C), the\n // incoming's finalNodeCoverLength=0 and the outgoing's firstNodeOffset=\n // B.length leave them with no horizontal overlap, so they share a single\n // lane. Node heights collapse from ~(N_in + N_out) lanes down to\n // ~max(N_in, N_out) lanes.\n //\n // Note: reverseReversedReads will swap firstNodeOffset/finalNodeCoverLength\n // for fully-reverse synthetics. The math works out: pre-flip values of\n // (srcLen, 0) become post-flip (newSrcLen, 0), which is the same pattern\n // \u2014 bands stay edge-only regardless of orientation.\n const srcLen = state.nodes[Math.abs(edge.sSigned)]!.sequenceLength\n synthetic.push({\n id,\n sourceTrackID: edge.sourceTrackID,\n type: 'read',\n // Human-readable so the name surfaces sensibly in any UI that uses it\n // (right-click \u2192 add to group, etc.) \u2014 and so trackTooltipText fallback\n // shows something meaningful.\n name: label,\n sequence: [edge.sName, edge.dName],\n indexSequence: [],\n path: [],\n // assignReadsToNodes keeps a width already set\n width: widthForCount(edge.crossings),\n firstNodeOffset: srcLen,\n finalNodeCoverLength: 0,\n sequenceNew: [\n { nodeName: edge.sName, mismatches: [] },\n { nodeName: edge.dName, mismatches: [] },\n ],\n mapping_quality: 0,\n is_secondary: false,\n sample_name: null,\n read_group: null,\n score: edge.count,\n haplotypeShare: share,\n })\n i += 1\n }\n\n return { bands: synthetic, total }\n}\n\n// Band every haplotype but the reference, which keeps its lane and the ruler.\n// Undefined when no alternate crosses an edge: a haplotype that stays on one\n// node makes no band, and its node would get no y from the read overlay.\nfunction bandHaplotypes(\n state: LayoutState,\n firstId: number,\n): { ref: Track; bands: Track[]; total: number } | undefined {\n const rulerIndex =\n state.trackForRuler === undefined\n ? -1\n : state.tracks.findIndex(t => t.name === state.trackForRuler)\n const refIndex = rulerIndex === -1 ? 0 : rulerIndex\n const ref = state.tracks[refIndex]!\n // A deduplicated reference walk also stands for the haplotypes identical to\n // it through the window; those belong in the bands, not the reference lane.\n const refDuplicates = (ref.freq ?? 1) - 1\n const refSigns = firstVisitSigns(state, ref)\n const altHaplotypes = state.tracks\n .filter((_, i) => i !== refIndex)\n .map(walk => orientedLike(refSigns, walk))\n if (refDuplicates > 0) {\n altHaplotypes.push({ ...ref, freq: refDuplicates })\n }\n if (altHaplotypes.length === 0) {\n return undefined\n }\n const { bands, total } = buildCoarsenedSyntheticBands(\n state,\n altHaplotypes,\n 'haplotype',\n firstId,\n )\n return bands.length > 0 ? { ref, bands, total } : undefined\n}\n\n// A graph can store a walk in either orientation, so a haplotype can arrive\n// back to front relative to the reference. Banded that way, one allele splits\n// into a forward and a reverse band. Turn a walk around when it runs against\n// the reference on most of the nodes they share.\nfunction orientedLike(refSigns: Int8Array, walk: Track): Track {\n let agreement = 0\n for (const visit of walk.indexSequence) {\n const sign = refSigns[Math.abs(visit)]\n if (sign !== undefined && sign !== 0) {\n agreement += sign === Math.sign(visit) ? 1 : -1\n }\n }\n return agreement >= 0\n ? walk\n : {\n ...walk,\n sequence: walk.sequence.map(flip).reverse(),\n indexSequence: walk.indexSequence.map(visit => -visit).reverse(),\n }\n}\n\n// The sign of `ref`'s first visit to each node index, 0 where it never visits.\nfunction firstVisitSigns(state: LayoutState, ref: Track): Int8Array {\n const signs = new Int8Array(state.nodes.length)\n for (const visit of ref.indexSequence) {\n const node = Math.abs(visit)\n if (signs[node] === 0) {\n signs[node] = Math.sign(visit)\n }\n }\n return signs\n}\n\nfunction formatShare({ count, total }: HaplotypeShare): string {\n const share = count / total\n if (share < 0.01) {\n return '<1%'\n }\n if (share > 0.99 && count < total) {\n return '>99%'\n }\n return `${Math.round(share * 100)}%`\n}\n\nconst MIN_BEND_WIDTH = 7\n\n// Emit the vertical rectangles + rounded corners for a track turning around at\n// one end of an order slot. The two directions are mirror images of each other:\n// a forward-to-reverse turn bulges out to the right of the node and consumes an\n// `extraRight` slot, a reverse-to-forward turn bulges out to the left and\n// consumes an `extraLeft` slot. `dir` is +1 for right, -1 for left.\nfunction generateTurnaround(\n state: LayoutState,\n { width: trackWidth, id: trackID, name: trackName, type }: Track,\n dir: 1 | -1,\n x: number,\n yStart: number,\n yEnd: number,\n order: number,\n): void {\n const extra = dir === 1 ? state.extraRight : state.extraLeft\n const offset = 10 * extra[order]!\n // The turn's apex, and the outward direction from it.\n const apex = x + dir * (offset + 5)\n const radius = MIN_BEND_WIDTH\n const stem = Math.min(MIN_BEND_WIDTH, trackWidth)\n const yTop = Math.min(yStart, yEnd)\n const yBottom = Math.max(yStart, yEnd)\n // The incoming/outgoing stubs run from the node's edge out to the apex. The\n // one-pixel asymmetry between the two directions is carried over verbatim\n // from the original pair of functions.\n const stubNear = dir === 1 ? x : apex - 1\n const stubFar = dir === 1 ? apex : x\n\n const horizontal = (segTop: number): void => {\n state.shapes.verticalRectangles.push({\n xStart: stubNear,\n yStart: segTop,\n xEnd: stubFar,\n yEnd: segTop + trackWidth - 1,\n id: trackID,\n name: trackName,\n type,\n })\n }\n // elongate the incoming and outgoing rectangles a bit past the node\n horizontal(yStart)\n state.shapes.verticalRectangles.push({\n xStart: dir === 1 ? apex + radius : apex - radius - stem,\n yStart: yTop + trackWidth + radius - 1,\n xEnd: dir === 1 ? apex + radius + stem - 1 : apex - radius - 1,\n yEnd: yBottom - radius + 1,\n id: trackID,\n name: trackName,\n type,\n })\n horizontal(yEnd)\n\n const inner = apex + dir * radius\n const outer = apex + dir * (radius + stem)\n\n // bottom 90 degree bend\n let d = `M ${apex} ${yBottom}`\n d += ` Q ${inner} ${yBottom} ${inner} ${yBottom - radius}`\n d += ` H ${outer}`\n d += ` Q ${outer} ${yBottom + trackWidth} ${apex} ${yBottom + trackWidth}`\n d += ' Z '\n state.shapes.corners.push({ path: d, id: trackID, name: trackName, type })\n\n // top 90 degree bend\n d = `M ${apex} ${yTop}`\n d += ` Q ${outer} ${yTop} ${outer} ${yTop + trackWidth + radius}`\n d += ` H ${inner}`\n d += ` Q ${inner} ${yTop + trackWidth} ${apex} ${yTop + trackWidth}`\n d += ' Z '\n state.shapes.corners.push({ path: d, id: trackID, name: trackName, type })\n extra[order]! += 1\n}\n\n// The x extent of a node's bases: pixelWidth, plus about half a character\n// each side under nodeWidthOption 'normal'\nexport function nodePixelCoordinatesInX(node: Node): [number, number] {\n const nodeLeftX = node.x - 4\n const nodeRightX = node.x + node.pixelWidth + 4\n return [nodeLeftX, nodeRightX]\n}\n\n// calculate node widths depending on sequence lengths and chosen calculation method\nfunction generateNodeWidth(state: LayoutState): void {\n switch (state.config.nodeWidthOption) {\n case 'compressed':\n state.nodes.forEach(node => {\n node.width = 1 + Math.log2(Math.max(node.sequenceLength, 1))\n node.pixelWidth = Math.round((node.width - 1) * DEFAULT_CHAR_WIDTH)\n })\n break\n case 'small':\n state.nodes.forEach(node => {\n node.width = node.sequenceLength / 100\n node.pixelWidth = Math.max(\n Math.round((node.width - 1) * DEFAULT_CHAR_WIDTH),\n 0,\n )\n })\n break\n case 'fixed':\n state.nodes.forEach(node => {\n node.width = 10\n node.pixelWidth = Math.round(node.width * DEFAULT_CHAR_WIDTH)\n })\n break\n case 'normal': {\n // The label draws a base per character from x - 4, in a monospace font\n // whose character width the caller measures. pixelWidth runs from the\n // first character to the last, so the outline, 9 px wider each side,\n // holds the whole label, and nodePixelCoordinatesInX's half character\n // each side puts base i under letter i.\n const charWidth = state.config.charWidth\n state.nodes.forEach(node => {\n node.width = node.sequenceLength\n node.pixelWidth = Math.round(\n charWidth * Math.max(node.sequenceLength - 1, 0),\n )\n })\n break\n }\n default:\n throw new Error(`${state.config.nodeWidthOption} not implemented`)\n }\n}\n\n// A node's distinct neighbors on one side, kept only as far as mergeNodes\n// needs them: none, exactly one, or several. A neighbor is a signed node index,\n// or TRACK_END where a haplotype starts or stops.\ninterface Neighbors {\n first: Int32Array\n count: Uint8Array\n}\n\nconst TRACK_END = 0\n\nfunction noNeighbors(nodeCount: number): Neighbors {\n return { first: new Int32Array(nodeCount), count: new Uint8Array(nodeCount) }\n}\n\nfunction addNeighbor(\n neighbors: Neighbors,\n index: number,\n neighbor: number,\n): void {\n const count = neighbors.count[index]!\n if (count === 0) {\n neighbors.first[index] = neighbor\n neighbors.count[index] = 1\n } else if (count === 1 && neighbors.first[index] !== neighbor) {\n neighbors.count[index] = 2\n }\n}\n\n// The index of a node's one neighbor on this side, or 0 when it has none,\n// several, or a track end.\nfunction soleNeighbor(neighbors: Neighbors, index: number): number {\n return neighbors.count[index] === 1 ? Math.abs(neighbors.first[index]!) : 0\n}\n\n// remove redundant nodes\n// two nodes A and B can be merged if all tracks leaving A go directly into B\n// and all tracks entering B come directly from A\n// (plus no inversions involved)\nfunction mergeNodes(state: LayoutState): void {\n const pred = noNeighbors(state.nodes.length)\n const succ = noNeighbors(state.nodes.length)\n const signedIndexOf = new Map<string, number>()\n const visit = (nodeName: string): number => {\n let signed = signedIndexOf.get(nodeName)\n if (signed === undefined) {\n const index = state.nodeMap.get(forward(nodeName))!\n signed = isReverse(nodeName) ? -index : index\n signedIndexOf.set(nodeName, signed)\n }\n return signed\n }\n\n const tracksAndReads = state.tracks.concat(state.reads)\n\n // A reverse visit on either side adds both orientations of the neighbor, so\n // no merge happens across an inversion.\n tracksAndReads.forEach(track => {\n const { sequence } = track\n const isHaplotype = track.type === 'haplotype'\n const last = sequence.length - 1\n let previous = TRACK_END\n let current = last >= 0 ? visit(sequence[0]!) : TRACK_END\n for (let i = 0; i <= last; i += 1) {\n const next = i < last ? visit(sequence[i + 1]!) : TRACK_END\n if (current > 0) {\n if (i > 0) {\n addNeighbor(pred, current, previous)\n if (previous < 0) {\n addNeighbor(pred, current, -previous)\n }\n } else if (isHaplotype) {\n addNeighbor(pred, current, TRACK_END)\n }\n if (i < last) {\n addNeighbor(succ, current, next)\n if (next < 0) {\n addNeighbor(succ, current, -next)\n }\n } else if (isHaplotype) {\n addNeighbor(succ, current, TRACK_END)\n }\n } else {\n const index = -current\n if (i > 0) {\n addNeighbor(succ, index, -previous)\n if (previous > 0) {\n addNeighbor(succ, index, previous)\n }\n } else if (isHaplotype) {\n addNeighbor(succ, index, TRACK_END)\n }\n if (i < last) {\n addNeighbor(pred, index, -next)\n if (next > 0) {\n addNeighbor(pred, index, next)\n }\n } else if (isHaplotype) {\n addNeighbor(pred, index, TRACK_END)\n }\n }\n previous = current\n current = next\n }\n })\n\n const absorbed = new Uint8Array(state.nodes.length)\n state.nodes.forEach((_, i) => {\n if (mergeableWithPred(i, pred, succ)) {\n absorbed[i] = 1\n }\n })\n\n // Merge each run into its first node, noting the node every run member\n // merges into and where the member's bases start and end within it.\n const origin = new Int32Array(state.nodes.length)\n const start = new Float64Array(state.nodes.length)\n const end = new Float64Array(state.nodes.length)\n state.nodes.forEach((node, head) => {\n if (absorbed[head] === 1) {\n return\n }\n origin[head] = head\n end[head] = node.sequenceLength\n for (let donor = head; mergeableWithSucc(donor, pred, succ);) {\n donor = soleNeighbor(succ, donor)\n origin[donor] = head\n start[donor] = node.sequenceLength\n node.sequenceLength += state.nodes[donor]!.sequenceLength\n node.seq += state.nodes[donor]!.seq\n end[donor] = node.sequenceLength\n }\n })\n\n // A read's offsets and mismatch positions count along the strand it visits\n // a node on: from the left end of a forward visit, the right end of a\n // reverse one. A forward visit to an absorbed node folds into the visit\n // before it, a reverse one into the visit after it.\n state.reads.forEach(read => {\n const { sequence } = read\n const entries =\n read.sequenceNew ??\n sequence.map(nodeName => ({ nodeName, mismatches: [] as Mismatch[] }))\n const shift = (nodeName: string): number => {\n const index = Math.abs(visit(nodeName))\n return isReverse(nodeName)\n ? state.nodes[origin[index]!]!.sequenceLength - end[index]!\n : start[index]!\n }\n const last = sequence.length - 1\n read.firstNodeOffset = (read.firstNodeOffset ?? 0) + shift(sequence[0]!)\n read.finalNodeCoverLength =\n (read.finalNodeCoverLength ?? 0) + shift(sequence[last]!)\n\n const mergedSequence: string[] = []\n const mergedEntries: ReadSequenceEntry[] = []\n let carried: Mismatch[] = []\n sequence.forEach((nodeName, i) => {\n const index = Math.abs(visit(nodeName))\n const { mismatches } = entries[i]!\n const by = shift(nodeName)\n mismatches.forEach(mismatch => {\n mismatch.pos += by\n })\n if (absorbed[index] === 1 && !isReverse(nodeName) && i > 0) {\n mergedEntries.at(-1)!.mismatches.push(...mismatches)\n } else if (absorbed[index] === 1 && isReverse(nodeName) && i < last) {\n carried.push(...mismatches)\n } else {\n const name = state.nodes[origin[index]!]!.name\n const merged = isReverse(nodeName) ? reverse(name) : name\n mergedSequence.push(merged)\n mergedEntries.push({\n nodeName: merged,\n mismatches: carried.concat(mismatches),\n })\n carried = []\n }\n })\n read.sequence = mergedSequence\n if (read.sequenceNew !== undefined) {\n read.sequenceNew = mergedEntries\n }\n })\n\n state.tracks.forEach(track => {\n const { sequence } = track\n let kept = 0\n for (const nodeName of sequence) {\n if (absorbed[Math.abs(visit(nodeName))] === 0) {\n sequence[kept] = nodeName\n kept += 1\n }\n }\n sequence.length = kept\n })\n\n let kept = 1\n for (let i = 1; i < state.nodes.length; i += 1) {\n if (absorbed[i] === 0) {\n state.nodes[kept] = state.nodes[i]!\n kept += 1\n }\n }\n state.nodes.length = kept\n}\n\nfunction mergeableWithPred(\n index: number,\n pred: Neighbors,\n succ: Neighbors,\n): boolean {\n const predecessor = soleNeighbor(pred, index)\n return predecessor !== 0 && soleNeighbor(succ, predecessor) !== 0\n}\n\nfunction mergeableWithSucc(\n index: number,\n pred: Neighbors,\n succ: Neighbors,\n): boolean {\n const successor = soleNeighbor(succ, index)\n return successor !== 0 && soleNeighbor(pred, successor) !== 0\n}\n", "// SVG path data for the shapes a layout leaves as coordinates: a curve's\n// ribbon and a node's rounded outline. Both are strings so the same geometry\n// draws as an SVG `d` attribute or, through Path2D, on a canvas, and\n// flattenPath turns either into points for a renderer that fills polygons.\nimport { groupBy } from './groupBy.ts'\n\nimport type { Node, TrackCurve, TrackType } from './types.ts'\n\nfunction compareCurvesByXYStartValue(a: TrackCurve, b: TrackCurve): number {\n return b.xStart - a.xStart || a.yStart - b.yStart\n}\n\n// Where a curve leaves and enters: a node, or a gap at an order slot\nfunction curveEnds(curve: TrackCurve): [number, number, number, number] {\n return [\n curve.nodeStart ?? -1,\n curve.nodeEnd ?? -1,\n curve.nodeStart === null ? curve.orderStart : -1,\n curve.nodeEnd === null ? curve.orderEnd : -1,\n ]\n}\n\nfunction compareTuples(a: readonly number[], b: readonly number[]): number {\n for (let i = 0; i < a.length; i += 1) {\n const d = a[i]! - b[i]!\n if (d !== 0) {\n return d\n }\n }\n return 0\n}\n\n// Where a cubic with both control points at one x is steepest, it is 3/4 of\n// the way from the ends' mean x to that control x\nconst STEEP_SHARE = 0.75\n// The most of a gap a group's steep stretch may spread over, so its edges keep\n// some of the turn\nconst MAX_SPREAD = 0.8\n\n// How far apart, as shares of the gap, each curve of a group puts its top and\n// bottom edges' control points. A ribbon whose edges turn at one x is only as\n// thick across as its width times the cosine of its slope, which on a steep\n// lane change is a hairline; with its outer edge turning late and its inner\n// edge early, its steep stretch keeps its width, or as much as the gap allows.\n// A shallow curve needs none. The reference takes what it needs first, so its\n// line stays legible where a wide tube shares its gap. Groups of more than five\n// keep at least sequenceTubeMap's 0.4 in all, which stops their curves\n// crossing at one x.\nfunction spreads(group: readonly TrackCurve[], gapWidth: number) {\n const first = group[0]!\n const span = Math.min(Math.abs(first.xEnd - first.xStart), gapWidth)\n if (span === 0) {\n return group.map(() => 0)\n }\n const floor = group.length > 5 ? 0.4 / group.length : 0\n const wanted = group.map(c => {\n const rise = Math.abs(c.yEnd - c.yStart)\n const across =\n (rise / Math.hypot(rise, span)) *\n Math.min(c.width, MAX_SPREAD * STEEP_SHARE * span)\n return Math.max(floor, across / (STEEP_SHARE * span))\n })\n const sum = (pick: (c: TrackCurve) => boolean) =>\n wanted.reduce((total, w, i) => total + (pick(group[i]!) ? w : 0), 0)\n const reference = sum(c => c.reference === true)\n const others = sum(c => c.reference !== true)\n const referenceScale = reference > MAX_SPREAD ? MAX_SPREAD / reference : 1\n const room = MAX_SPREAD - reference * referenceScale\n const othersScale = others > room ? room / others : 1\n return wanted.map(\n (w, i) => w * (group[i]!.reference ? referenceScale : othersScale),\n )\n}\n\nexport interface CurvePathOptions {\n // The most px a gap between columns draws across, where the drawing squeezes\n // the layout's x, as a reference axis does; a curve's steepness is judged at\n // that width\n gapWidth?: number\n}\n\n// The curves of one track type in draw order, each with its `path` set. Curves\n// between the same pair of nodes, or gaps, form a group whose control points\n// fan out top to bottom, so a bundle of tracks changing lanes together stays\n// parallel rather than crossing at one x, and each curve's bottom edge is the\n// next one's top edge.\nexport function curvePaths(\n curves: readonly TrackCurve[],\n type: TrackType | undefined,\n { gapWidth = Infinity }: CurvePathOptions = {},\n): TrackCurve[] {\n const groupedCurves = groupBy(\n curves.filter(curve => curve.type === type),\n curve => curveEnds(curve).join(','),\n )\n\n groupedCurves.forEach(curveGroup => {\n curveGroup.sort(compareCurvesByXYStartValue)\n const spread = spreads(curveGroup, gapWidth)\n // share of the gap at which a boundary between the group's tubes turns,\n // for a curve that rises; one that falls turns at its complement\n let adjustValue = 0.5 - spread.reduce((sum, s) => sum + s, 0) / 2\n\n curveGroup.forEach((curve, i) => {\n const at = (share: number) =>\n curve.xStart +\n (curve.xEnd - curve.xStart) *\n (curve.yStart < curve.yEnd ? 1 - share : share)\n const xAdjusted = at(adjustValue)\n adjustValue += spread[i]!\n // the bottom edge, on the way back, parallel to the next curve's top\n const xNextAdjusted = at(adjustValue)\n let d = `M ${curve.xStart} ${curve.yStart}`\n d += ` C ${xAdjusted} ${curve.yStart} ${xAdjusted} ${curve.yEnd} ${curve.xEnd} ${curve.yEnd}`\n d += ` V ${curve.yEnd + curve.width}`\n d += ` C ${xNextAdjusted} ${curve.yEnd + curve.width} ${xNextAdjusted} ${\n curve.yStart + curve.width\n } ${curve.xStart} ${curve.yStart + curve.width}`\n d += ' Z'\n curve.path = d\n })\n })\n\n // One flat list ordered by group, then by the within-group sort\n return [...groupedCurves.values()]\n .sort((a, b) => compareTuples(curveEnds(a[0]!), curveEnds(b[0]!)))\n .flat()\n}\n\n// The outline that path data from curvePaths, nodeOutlinePath or a corner\n// traces, as points, for a renderer that fills polygons rather than paths.\n// Each B\u00E9zier becomes `steps` straight pieces; the closing Z adds no point.\nexport function flattenPath(d: string, steps = 16): [number, number][] {\n const tokens = d.match(/[A-Za-z]|-?(?:\\d+\\.?\\d*|\\.\\d+)(?:e[-+]?\\d+)?/g) ?? []\n const points: [number, number][] = []\n let x = 0\n let y = 0\n let i = 0\n const num = () => Number(tokens[i++])\n while (i < tokens.length) {\n const command = tokens[i++]\n if (command === 'M' || command === 'L') {\n x = num()\n y = num()\n points.push([x, y])\n } else if (command === 'H') {\n x = num()\n points.push([x, y])\n } else if (command === 'V') {\n y = num()\n points.push([x, y])\n } else if (command === 'C') {\n const [x1, y1, x2, y2, x3, y3] = [\n num(),\n num(),\n num(),\n num(),\n num(),\n num(),\n ]\n for (let s = 1; s <= steps; s += 1) {\n const t = s / steps\n const u = 1 - t\n const a = u * u * u\n const b = 3 * u * u * t\n const c = 3 * u * t * t\n const e = t * t * t\n points.push([\n a * x + b * x1 + c * x2 + e * x3,\n a * y + b * y1 + c * y2 + e * y3,\n ])\n }\n x = x3\n y = y3\n } else if (command === 'Q') {\n const [x1, y1, x2, y2] = [num(), num(), num(), num()]\n for (let s = 1; s <= steps; s += 1) {\n const t = s / steps\n const u = 1 - t\n points.push([\n u * u * x + 2 * u * t * x1 + t * t * x2,\n u * u * y + 2 * u * t * y1 + t * t * y2,\n ])\n }\n x = x2\n y = y2\n } else if (command !== 'Z') {\n throw new Error(`flattenPath: unsupported path command ${command}`)\n }\n }\n return points\n}\n\n// A node's outline: a rounded box 9 units outside the node's x extent and its\n// content height, the tracks through it inside.\nexport function nodeOutlinePath(node: Node): string {\n // top left arc\n let d = `M ${node.x - 9} ${node.y} Q ${node.x - 9} ${node.y - 9} ${\n node.x\n } ${node.y - 9}`\n let x = node.x\n let y = node.y - 9\n\n // top straight\n if (node.width > 1) {\n x += node.pixelWidth\n d += ` L ${x} ${y}`\n }\n\n // top right arc\n d += ` Q ${x + 9} ${y} ${x + 9} ${y + 9}`\n x += 9\n y += 9\n\n // right straight\n if (node.contentHeight > 0) {\n y += node.contentHeight\n d += ` L ${x} ${y}`\n }\n\n // bottom right arc\n d += ` Q ${x} ${y + 9} ${x - 9} ${y + 9}`\n x -= 9\n y += 9\n\n // bottom straight\n if (node.width > 1) {\n x -= node.pixelWidth\n d += ` L ${x} ${y}`\n }\n\n // bottom left arc\n d += ` Q ${x - 9} ${y} ${x - 9} ${y - 9}`\n x -= 9\n y -= 9\n\n // left straight\n if (node.contentHeight > 0) {\n y -= node.contentHeight\n d += ` L ${x} ${y}`\n }\n return d\n}\n", "import {\n canonicalStrand,\n stepName,\n tubeMapReads\n} from \"./chunk-A7H753BA.js\";\nimport {\n referenceWalkName\n} from \"./chunk-CIDSF47D.js\";\nimport {\n pathCssColor,\n pathGreyCssColor\n} from \"./chunk-3GP3KT5L.js\";\nimport {\n pathOrigin\n} from \"./chunk-B5X2RLJG.js\";\nimport {\n ownStrand,\n strandSides\n} from \"./chunk-UBQSRCWR.js\";\nimport {\n groupBy\n} from \"./chunk-BSOZW3FC.js\";\nimport {\n isBackbone\n} from \"./chunk-RJWPJCIB.js\";\n\n// src/layout/tubeMapLayout.ts\nimport { forward, isReverse, layoutTubeMap } from \"@jbrowse/tubemap-core\";\nfunction pathSteps(graph) {\n const nodeById = new Map(graph.nodes.map((n) => [n.id, n]));\n const visits = graph.pathVisits;\n const next = visits?.replay();\n return (graph.paths ?? []).map((path) => {\n const walk = visits?.pathIndex(pathOrigin(path.name).name) ?? -1;\n return path.nodeIds.flatMap((id) => {\n const node = nodeById.get(id);\n if (!node) {\n return [];\n }\n const at = visits && next ? next(visits.slot(node.name), walk) : -1;\n return [\n { node, strand: at >= 0 ? visits.strand(at) : canonicalStrand(node) }\n ];\n });\n });\n}\nfunction tubeMapTracks(graph) {\n const steps = pathSteps(graph);\n const tracks = (graph.paths ?? []).flatMap((path, index) => {\n const sequence = steps[index].map((s) => stepName(s.node, s.strand));\n return sequence.length > 0 ? [\n {\n id: index,\n name: path.name,\n sequence,\n sourceTrackID: 0,\n type: \"haplotype\",\n ...path.members ? { freq: path.members.length } : {}\n }\n ] : [];\n });\n const name = referenceWalkName(graph);\n const reference = tracks.findIndex((t) => pathOrigin(t.name).name === name);\n if (reference > 0) {\n tracks.unshift(...tracks.splice(reference, 1));\n }\n return tracks;\n}\nfunction tubeMapNodes(graph) {\n return graph.nodes.map((n) => ({\n name: n.id,\n seq: \"\",\n sequenceLength: Math.max(1, n.length)\n }));\n}\nfunction hasTubeMapPaths(graph) {\n return (graph.paths?.length ?? 0) > 0;\n}\nvar STACK_PX = 600;\nvar MIN_TUBE_PX = 3;\nvar MAX_TUBE_PX = 15;\nfunction tubeWidth(trackCount) {\n return Math.max(\n MIN_TUBE_PX,\n Math.min(MAX_TUBE_PX, Math.floor(STACK_PX / Math.max(1, trackCount)))\n );\n}\nfunction straightened(first) {\n const flipped = /* @__PURE__ */ new Set();\n const forwards = /* @__PURE__ */ new Set();\n for (const step of first?.sequence ?? []) {\n if (!isReverse(step)) {\n forwards.add(step);\n } else if (!forwards.has(forward(step))) {\n flipped.add(forward(step));\n }\n }\n return flipped;\n}\nfunction mergedRuns(graph, layout, walks) {\n const flipped = straightened(walks[0]);\n const before = /* @__PURE__ */ new Map();\n for (const { sequence, is_secondary } of walks) {\n if (!is_secondary) {\n sequence.forEach((step, i) => {\n const id = forward(step);\n const against = isReverse(step) !== flipped.has(id);\n const neighbour = against ? sequence[i + 1] : sequence[i - 1];\n if (!layout.nodeMap.has(id) && neighbour !== void 0) {\n before.set(id, forward(neighbour));\n }\n });\n }\n }\n const lengthOf = new Map(graph.nodes.map((n) => [n.id, Math.max(1, n.length)]));\n const after = new Map([...before].map(([node, prev]) => [prev, node]));\n const members = /* @__PURE__ */ new Map();\n for (const head of after.keys()) {\n const index = layout.nodeMap.get(head);\n if (index !== void 0) {\n const run = [head];\n for (let n = after.get(head); n !== void 0; n = after.get(n)) {\n run.push(n);\n }\n const bp = run.reduce((sum, id) => sum + (lengthOf.get(id) ?? 0), 0);\n if (bp === layout.nodes[index].sequenceLength) {\n members.set(head, run);\n }\n }\n }\n return { members, flipped };\n}\nvar opposite = { start: \"end\", end: \"start\" };\nvar otherStrand = { \"+\": \"-\", \"-\": \"+\" };\nfunction boxGraph(graph, { members, flipped }) {\n if (members.size === 0) {\n return graph;\n }\n const nodeById = new Map(graph.nodes.map((n) => [n.id, n]));\n const boxOf = /* @__PURE__ */ new Map();\n const inner = /* @__PURE__ */ new Set();\n const drawn = (id, side) => flipped.has(id) ? opposite[side] : side;\n for (const [box, run] of members) {\n run.forEach((id, i) => {\n boxOf.set(id, box);\n const next = run[i + 1];\n if (next !== void 0) {\n inner.add(`${id}:${drawn(id, \"end\")}\t${next}:${drawn(next, \"start\")}`);\n }\n });\n }\n const absorbed = new Set(\n [...boxOf].filter(([id, box]) => id !== box).map(([id]) => id)\n );\n const nodes = graph.nodes.flatMap((node) => {\n const run = members.get(node.id);\n if (!run) {\n return absorbed.has(node.id) ? [] : [node];\n }\n const parts = run.map((id) => nodeById.get(id));\n const starts = parts.flatMap((p) => p.stable ? [p.stable.start] : []);\n return [\n {\n ...node,\n length: parts.reduce((sum, p) => sum + p.length, 0),\n stable: node.stable && { ...node.stable, start: Math.min(...starts) }\n }\n ];\n });\n const leaving = (id, box, side) => drawn(box, drawn(id, side)) === \"end\" ? ownStrand(box) : otherStrand[ownStrand(box)];\n const edges = graph.edges.flatMap((edge) => {\n const sides = strandSides(edge);\n const from = `${edge.from}:${sides.from}`;\n const to = `${edge.to}:${sides.to}`;\n if (inner.has(`${from}\t${to}`) || inner.has(`${to}\t${from}`)) {\n return [];\n }\n const fromBox = boxOf.get(edge.from);\n const toBox = boxOf.get(edge.to);\n return [\n {\n ...edge,\n ...fromBox === void 0 ? {} : {\n from: fromBox,\n fromStrand: leaving(edge.from, fromBox, sides.from)\n },\n ...toBox === void 0 ? {} : {\n to: toBox,\n toStrand: otherStrand[leaving(edge.to, toBox, sides.to)]\n }\n }\n ];\n });\n const absorbedNames = new Set(\n [...absorbed].map((id) => nodeById.get(id)?.name ?? id)\n );\n return {\n ...graph,\n nodes,\n edges,\n paths: graph.paths?.map((path) => ({\n ...path,\n nodeIds: path.nodeIds.filter((id) => !absorbed.has(id))\n })),\n pathVisits: graph.pathVisits?.filter(\n () => true,\n (segment) => !absorbedNames.has(segment)\n )\n };\n}\nfunction runTubeMap(graph) {\n const paths = graph.paths ?? [];\n const tracks = tubeMapTracks(graph);\n const reads = graph.reads ? tubeMapReads(graph, graph.reads, paths.length) : [];\n const tubeColor = reads.length > 0 ? pathGreyCssColor : pathCssColor;\n const pathColors = paths.map((_, i) => tubeColor(i, paths.length));\n const bundled = paths.some((p) => p.members);\n const walks = paths.reduce((n, p) => n + (p.members?.length ?? 1), 0);\n const layout = layoutTubeMap(tubeMapNodes(graph), tracks, reads, {\n nodeWidthOption: \"compressed\",\n trackWidth: tubeWidth(bundled ? walks : tracks.length),\n ...bundled ? { freqWidth: \"linear\" } : {}\n });\n if (!layout) {\n return void 0;\n }\n const runs = mergedRuns(graph, layout, [...tracks, ...reads]);\n return {\n layout,\n pathColors,\n members: runs.members,\n graph: boxGraph(graph, runs)\n };\n}\nfunction drawnNodes(layout) {\n const nodes = [];\n layout.nodes.forEach((node) => {\n if (node.order >= 0) {\n nodes.push(node);\n }\n });\n return nodes;\n}\nfunction centreline(node, yOffset, x0, x1) {\n const y = node.y + node.contentHeight / 2 - yOffset;\n return [\n { x: x0, y },\n { x: x1, y }\n ];\n}\nfunction extentOf(layout, yOffset) {\n return {\n minY: layout.bounds.minY - yOffset,\n maxY: layout.bounds.maxY - yOffset\n };\n}\nfunction tubeMapLayout(graph) {\n const run = hasTubeMapPaths(graph) ? runTubeMap(graph) : void 0;\n if (!run) {\n return void 0;\n }\n const { layout, ...drawing } = run;\n const yOffset = layout.bounds.minY;\n const nodePositions = {};\n for (const node of drawnNodes(layout)) {\n nodePositions[node.name] = centreline(\n node,\n yOffset,\n node.x,\n node.x + node.pixelWidth\n );\n }\n const { minY, maxY } = extentOf(layout, yOffset);\n return {\n nodePositions,\n tubeMap: { layout, yOffset, ...drawing },\n extent: {\n minX: layout.bounds.minX,\n maxX: layout.bounds.maxX,\n minY,\n maxY\n }\n };\n}\nfunction tubeMapColumns(graph, layout) {\n const nodeById = new Map(graph.nodes.map((n) => [n.id, n]));\n const byOrder = groupBy(drawnNodes(layout), (node) => node.order);\n const columns = [];\n let end = -Infinity;\n for (const order of [...byOrder.keys()].sort((a, b) => a - b)) {\n const nodes = byOrder.get(order);\n let bp0 = Infinity;\n let bp1 = -Infinity;\n for (const node of nodes) {\n const graphNode = nodeById.get(node.name);\n if (graphNode && isBackbone(graphNode)) {\n bp0 = Math.min(bp0, graphNode.stable.start);\n bp1 = Math.max(bp1, graphNode.stable.start + graphNode.length);\n }\n }\n if (bp0 === Infinity) {\n bp0 = bp1 = end;\n }\n if (bp0 < end) {\n bp0 = end;\n bp1 = Math.max(end, bp1);\n }\n end = Math.max(end, bp1);\n columns.push({\n order,\n x0: Math.min(...nodes.map((n) => n.x)),\n x1: Math.max(...nodes.map((n) => n.x + n.pixelWidth)),\n bp0,\n bp1\n });\n }\n const first = columns.find((c) => c.bp0 !== -Infinity);\n for (const column of columns) {\n if (column.bp0 === -Infinity) {\n column.bp0 = column.bp1 = first?.bp0 ?? 0;\n }\n }\n return columns;\n}\nfunction hasTubeMapBackbone(graph) {\n return hasTubeMapPaths(graph) && graph.nodes.some(isBackbone);\n}\nfunction tubeMapReferenceLayout(graph) {\n const run = hasTubeMapBackbone(graph) ? runTubeMap(graph) : void 0;\n if (!run) {\n return void 0;\n }\n const { layout, ...drawing } = run;\n const columns = tubeMapColumns(drawing.graph, layout);\n const byOrder = new Map(columns.map((c) => [c.order, c]));\n const yOffset = layout.bounds.minY;\n const nodePositions = {};\n for (const node of drawnNodes(layout)) {\n const column = byOrder.get(node.order);\n nodePositions[node.name] = centreline(node, yOffset, column.bp0, column.bp1);\n }\n return {\n nodePositions,\n tubeMap: { layout, yOffset, columns, ...drawing },\n referenceAxis: true,\n pixelRows: true,\n extent: extentOf(layout, yOffset)\n };\n}\n\nexport {\n pathSteps,\n tubeMapTracks,\n hasTubeMapPaths,\n tubeMapLayout,\n hasTubeMapBackbone,\n tubeMapReferenceLayout\n};\n", "import {\n pathSteps\n} from \"./chunk-PK5QQOMN.js\";\nimport {\n pathOrigin\n} from \"./chunk-B5X2RLJG.js\";\nimport {\n PathVisitsBuilder\n} from \"./chunk-ZPZ7GNBT.js\";\nimport {\n isBackbone\n} from \"./chunk-RJWPJCIB.js\";\nimport {\n partitionPoint\n} from \"./chunk-HOAIOEI7.js\";\n\n// src/tubeMap/coarsen.ts\nfunction readWalk(path, steps) {\n const runs = [];\n const open = () => ({ a: -Infinity, b: Infinity, detour: [], bp: 0 });\n const gaps = [open()];\n for (const { node, strand } of steps) {\n const gap = gaps.at(-1);\n const last = runs.at(-1);\n if (isBackbone(node)) {\n const start = node.stable.start;\n const end = start + node.length;\n const inverted = strand !== (node.stable.strand ?? \"+\");\n const joins = last !== void 0 && gap.detour.length === 0;\n if (joins && !last.inverted && !inverted && last.end === start) {\n last.end = end;\n } else if (joins && last.inverted && inverted && last.start === end) {\n last.start = start;\n } else {\n runs.push({ start, end, inverted });\n gaps.push(open());\n }\n } else {\n gap.detour.push({ node, strand });\n gap.bp += node.length;\n }\n }\n runs.forEach((run, i) => {\n gaps[i].b = run.start;\n gaps[i + 1].a = run.end;\n });\n return { path, runs, gaps };\n}\nfunction isSmall(gap, sigma) {\n return Number.isFinite(gap.a) && Number.isFinite(gap.b) && gap.b >= gap.a && Math.max(gap.b - gap.a, gap.bp) < sigma;\n}\nfunction strictlyInside(cuts, a, b) {\n const i = partitionPoint(cuts.length, (j) => cuts[j] <= a);\n return i < cuts.length && cuts[i] < b;\n}\nfunction referenceGaps(backbone) {\n const cuts = /* @__PURE__ */ new Map();\n for (let i = 1; i < backbone.length; i++) {\n const prev = backbone[i - 1];\n const node = backbone[i];\n const end = prev.stable.start + prev.length;\n if (end !== node.stable.start) {\n cuts.set(end, \"reference-gap\");\n cuts.set(node.stable.start, \"reference-gap\");\n }\n }\n return cuts;\n}\nfunction findCuts(walks, sigma, cuts) {\n const cut = (bp, cause) => {\n if (Number.isFinite(bp) && !cuts.has(bp)) {\n cuts.set(bp, cause);\n }\n };\n for (const { runs, gaps } of walks) {\n const first = runs[0];\n const last = runs.at(-1);\n if (first && last) {\n cut(first.start, \"walk-end\");\n cut(last.end, \"walk-end\");\n }\n for (const run of runs) {\n if (run.inverted && run.end - run.start >= sigma) {\n cut(run.start, \"inversion\");\n cut(run.end, \"inversion\");\n }\n }\n for (const gap of gaps) {\n if (gap.b < gap.a) {\n cut(gap.a, \"backward\");\n cut(gap.b, \"backward\");\n } else if (!isSmall(gap, sigma)) {\n cut(gap.a, \"variant\");\n cut(gap.b, \"variant\");\n }\n }\n }\n const spans = walks.flatMap(({ runs, gaps }) => [\n ...gaps.filter((g) => isSmall(g, sigma)).map((g) => [g.a, g.b]),\n ...runs.filter((r) => r.inverted && r.end - r.start < sigma).map((r) => [r.start, r.end])\n ]);\n for (let changed = true; changed; ) {\n changed = false;\n const sorted = [...cuts.keys()].sort((x, y) => x - y);\n for (const [a, b] of spans) {\n if (strictlyInside(sorted, a, b)) {\n changed ||= !cuts.has(a) || !cuts.has(b);\n cut(a, \"overlap\");\n cut(b, \"overlap\");\n }\n }\n }\n return cuts;\n}\nfunction mergeReference(backbone, cuts) {\n const merged = [];\n let group = [];\n const close = () => {\n const first = group[0];\n const last = group.at(-1);\n if (first && last) {\n const bp0 = first.stable.start;\n const bp1 = last.stable.start + last.length;\n const name = `${bp0}-${bp1}`;\n merged.push({\n node: {\n id: `${name}+`,\n name,\n length: bp1 - bp0,\n depth: 0,\n stable: {\n refName: first.stable.refName,\n start: bp0,\n rank: 0,\n strand: \"+\"\n }\n },\n members: group\n });\n }\n group = [];\n };\n for (const node of backbone) {\n if (cuts.has(node.stable.start)) {\n close();\n }\n group.push(node);\n }\n close();\n return merged;\n}\nfunction lastAtMost(items, key, x) {\n return Math.max(0, partitionPoint(items.length, (i) => key(items[i]) <= x) - 1);\n}\nfunction coarsenTubeMap(graph, sigma) {\n const backbone = graph.nodes.filter(isBackbone).sort((a, b) => a.stable.start - b.stable.start);\n const paths = graph.paths ?? [];\n if (backbone.length === 0 || paths.length === 0) {\n return void 0;\n }\n const stepsOf = pathSteps(graph);\n const walks = paths.map((p, i) => readWalk(p, stepsOf[i]));\n const cuts = findCuts(walks, sigma, referenceGaps(backbone));\n const sortedCuts = [...cuts.keys()].sort((x, y) => x - y);\n const merged = mergeReference(backbone, cuts);\n const mergedAt = (bp) => lastAtMost(merged, (m) => m.node.stable.start, bp);\n const members = /* @__PURE__ */ new Map();\n const coarseOf = /* @__PURE__ */ new Map();\n for (const m of merged) {\n members.set(\n m.node.id,\n m.members.map((n) => n.id)\n );\n for (const n of m.members) {\n coarseOf.set(n.id, m.node.id);\n }\n }\n const routes = /* @__PURE__ */ new Map();\n const routeFor = (gap) => {\n const key = `${gap.a}\t${gap.b}\t${gap.detour.map((s) => s.node.id + s.strand).join(\",\")}`;\n let node = routes.get(key);\n if (!node) {\n const name = `r${routes.size}`;\n node = {\n id: `${name}+`,\n name,\n length: gap.bp,\n depth: 0,\n stable: {\n refName: backbone[0].stable.refName,\n start: Number.isFinite(gap.a) ? gap.a : gap.b,\n rank: 1,\n strand: \"+\"\n }\n };\n routes.set(key, node);\n members.set(\n node.id,\n gap.detour.map((s) => s.node.id)\n );\n for (const s of gap.detour) {\n if (!coarseOf.has(s.node.id)) {\n coarseOf.set(s.node.id, node.id);\n }\n }\n }\n return node;\n };\n const deviations = /* @__PURE__ */ new Map();\n const coarsePaths = [];\n const pathVisits = new PathVisitsBuilder();\n const edges = /* @__PURE__ */ new Map();\n const depth = /* @__PURE__ */ new Map();\n for (const { path, runs, gaps } of walks) {\n const steps = [];\n const devs = [];\n let continuing = false;\n const append = (node, strand) => {\n const last = steps.at(-1);\n if (!(continuing && last?.node === node && last.strand === strand)) {\n steps.push({ node, strand });\n }\n continuing = true;\n };\n const structural = (gap) => {\n continuing = false;\n if (gap.detour.length > 0) {\n append(routeFor(gap), \"+\");\n continuing = false;\n }\n };\n const fold = (gap) => {\n if (gap.bp > 0 || gap.b > gap.a) {\n devs.push({ start: gap.a, end: gap.b, bp: gap.bp });\n }\n const home = merged[mergedAt(gap.b > gap.a ? gap.a : gap.a - 1)];\n for (const s of gap.detour) {\n if (!coarseOf.has(s.node.id)) {\n coarseOf.set(s.node.id, home.node.id);\n members.get(home.node.id).push(s.node.id);\n }\n }\n };\n runs.forEach((run, i) => {\n const gap = gaps[i];\n if (isSmall(gap, sigma) && !strictlyInside(sortedCuts, gap.a, gap.b)) {\n fold(gap);\n } else {\n structural(gap);\n }\n const i0 = mergedAt(run.start);\n const i1 = mergedAt(run.end - 1);\n const small = run.end - run.start < sigma;\n if (run.inverted && !small) {\n continuing = false;\n for (let j = i1; j >= i0; j--) {\n append(merged[j].node, \"-\");\n }\n continuing = false;\n } else {\n if (run.inverted) {\n devs.push({\n start: run.start,\n end: run.end,\n bp: run.end - run.start,\n inverted: true\n });\n }\n for (let j = i0; j <= i1; j++) {\n append(merged[j].node, \"+\");\n }\n }\n });\n structural(gaps.at(-1));\n const visitName = pathOrigin(path.name).name;\n let pos = 0;\n steps.forEach(({ node, strand }, i) => {\n depth.set(node.id, (depth.get(node.id) ?? 0) + 1);\n pathVisits.add(\n node.name,\n visitName,\n path.sample ?? visitName,\n pos,\n strand === \"-\"\n );\n pos += node.length;\n const next = steps[i + 1];\n if (next) {\n const key = `${node.id}${strand}\t${next.node.id}${next.strand}`;\n const edge = edges.get(key);\n if (edge) {\n edge.pathIds.push(path.name);\n } else {\n edges.set(key, {\n from: node.id,\n to: next.node.id,\n fromStrand: strand,\n toStrand: next.strand,\n pathIds: [path.name]\n });\n }\n }\n });\n coarsePaths.push({ ...path, nodeIds: steps.map((s) => s.node.id) });\n deviations.set(path.name, devs);\n }\n const nodes = [...merged.map((m) => m.node), ...routes.values()].filter((n) => depth.has(n.id)).map((n) => ({ ...n, depth: depth.get(n.id) }));\n return {\n graph: {\n ...graph,\n nodes,\n edges: [...edges.values()],\n paths: coarsePaths,\n pathVisits: pathVisits.build(),\n reads: void 0\n },\n members,\n coarseOf,\n deviations,\n cuts\n };\n}\n\nexport {\n lastAtMost,\n coarsenTubeMap\n};\n", "import {\n lastAtMost\n} from \"../chunks/chunk-EY2ZGSCP.js\";\nimport {\n boxX,\n referenceBoxes\n} from \"../chunks/chunk-HSVFCA2J.js\";\nimport \"../chunks/chunk-PK5QQOMN.js\";\nimport \"../chunks/chunk-A7H753BA.js\";\nimport \"../chunks/chunk-C44YRP5F.js\";\nimport \"../chunks/chunk-CIDSF47D.js\";\nimport \"../chunks/chunk-3GP3KT5L.js\";\nimport {\n pathOrigin\n} from \"../chunks/chunk-B5X2RLJG.js\";\nimport \"../chunks/chunk-EIY2SKD3.js\";\nimport \"../chunks/chunk-ZPZ7GNBT.js\";\nimport \"../chunks/chunk-PFRQBCGC.js\";\nimport \"../chunks/chunk-HMXCN6PG.js\";\nimport \"../chunks/chunk-AB35TJST.js\";\nimport \"../chunks/chunk-BZFOFC4D.js\";\nimport \"../chunks/chunk-CGMSKIEO.js\";\nimport \"../chunks/chunk-UBQSRCWR.js\";\nimport \"../chunks/chunk-CPMHA4W5.js\";\nimport {\n pushTo\n} from \"../chunks/chunk-BSOZW3FC.js\";\nimport \"../chunks/chunk-RJWPJCIB.js\";\nimport \"../chunks/chunk-HOAIOEI7.js\";\nimport \"../chunks/chunk-4XWZNPQ2.js\";\n\n// src/tubeMap/deviations.ts\nfunction boxAt(boxes, bp, visited) {\n const lo = lastAtMost(boxes, (box) => box.bp0, bp);\n return [boxes[lo], boxes[lo - 1]].find(\n (box) => box && visited.has(box.index) && box.bp0 <= bp && bp <= box.bp1\n );\n}\nfunction deviationsByPath(graph, deviations) {\n const byWalk = /* @__PURE__ */ new Map();\n for (const [name, devs] of deviations) {\n for (const d of devs) {\n pushTo(byWalk, pathOrigin(name).name, d);\n }\n }\n const byPath = /* @__PURE__ */ new Map();\n for (const path of graph.paths ?? []) {\n if (path.members) {\n const union = /* @__PURE__ */ new Map();\n for (const d of path.members.flatMap((m) => byWalk.get(m) ?? [])) {\n union.set(`${d.start}-${d.end}`, d);\n }\n byPath.set(path.name, [...union.values()]);\n } else {\n byPath.set(path.name, deviations.get(path.name) ?? []);\n }\n }\n return byPath;\n}\nfunction deviationMarks(drawing, deviations) {\n const { graph, layout } = drawing;\n const boxes = [...referenceBoxes(drawing).values()].flat().sort((a, b) => a.bp0 - b.bp0);\n const byPath = deviationsByPath(graph, deviations);\n const marks = [];\n for (const track of layout.tracks) {\n const devs = track.name ? byPath.get(track.name) : void 0;\n if (devs?.length) {\n const visited = /* @__PURE__ */ new Map();\n for (const segment of track.path) {\n if (segment.node !== null && segment.y !== void 0 && !visited.has(segment.node)) {\n visited.set(segment.node, segment.y);\n }\n }\n for (const d of devs) {\n const box = boxAt(boxes, d.start, visited);\n if (box) {\n marks.push({\n x0: boxX(box, d.start),\n x1: boxX(box, d.end),\n y: visited.get(box.index),\n height: track.width\n });\n }\n }\n }\n }\n return marks;\n}\nfunction deviationInk(darkMode) {\n return darkMode ? \"rgba(255,255,255,0.9)\" : \"rgba(0,0,0,0.8)\";\n}\nfunction drawDeviationMarks(ctx, marks, { x, y, width, darkMode }) {\n if (marks.length === 0) {\n return;\n }\n ctx.fillStyle = deviationInk(darkMode);\n ctx.beginPath();\n for (const m of marks) {\n const left = x(m.x0);\n const right = Math.max(x(m.x1), left + 1);\n if (right >= 0 && left <= width) {\n const top = y(m.y);\n ctx.rect(left, top, right - left, y(m.y + m.height) - top);\n }\n }\n ctx.fill();\n}\nexport {\n deviationInk,\n deviationMarks,\n drawDeviationMarks\n};\n", "import {\n partitionPoint\n} from \"./chunk-HOAIOEI7.js\";\n\n// src/tubeMap/warp.ts\nvar MAX_GAP_PX = 24;\nvar MAX_GAP_SHARE = 0.5;\nvar isReal = (c) => c.bp1 > c.bp0;\nfunction referenceKnots(columns, bpToScreen) {\n const real = columns.filter(isReal);\n if (real.length === 0) {\n const first = columns[0];\n return first ? [{ tx: first.x0, sx: bpToScreen(first.bp0) }] : [];\n }\n const tx = [];\n const target = [];\n const gap = [];\n real.forEach((c, i) => {\n tx.push(c.x0, c.x1);\n target.push(bpToScreen(c.bp0), bpToScreen(c.bp1));\n gap.push(i === 0 ? 0 : Math.min(c.x0 - real[i - 1].x1, MAX_GAP_PX), 0);\n });\n const span = target.at(-1) - target[0];\n const demand = gap.reduce((a, b) => a + b, 0);\n const scale = demand > 0 ? Math.min(1, MAX_GAP_SHARE * span / demand) : 1;\n return spread(target, gap, scale).map((sx, k) => ({ tx: tx[k], sx }));\n}\nfunction spread(target, gap, scale) {\n const offset = [];\n let sum = 0;\n for (const g of gap) {\n sum += g * scale;\n offset.push(sum);\n }\n const blocks = [];\n target.forEach((t, k) => {\n let block = { mean: t - offset[k], n: 1 };\n let last = blocks.at(-1);\n while (last && last.mean >= block.mean) {\n blocks.pop();\n const n = last.n + block.n;\n block = { mean: (last.mean * last.n + block.mean * block.n) / n, n };\n last = blocks.at(-1);\n }\n blocks.push(block);\n });\n return blocks.flatMap((b) => Array(b.n).fill(b.mean)).map((q, k) => q + offset[k]);\n}\nfunction warpX(knots, tx) {\n const n = knots.length;\n if (n === 0) {\n return tx;\n }\n const first = knots[0];\n const last = knots[n - 1];\n if (tx <= first.tx) {\n return first.sx + (tx - first.tx);\n }\n if (tx >= last.tx) {\n return last.sx + (tx - last.tx);\n }\n const hi = 1 + partitionPoint(n - 2, (i) => knots[i + 1].tx <= tx);\n const a = knots[hi - 1];\n const b = knots[hi];\n const span = b.tx - a.tx;\n return span > 0 ? a.sx + (tx - a.tx) / span * (b.sx - a.sx) : a.sx;\n}\n\nexport {\n MAX_GAP_PX,\n referenceKnots,\n warpX\n};\n", "// src/tubeMap/mismatches.ts\nimport {\n forward,\n getXCoordinateOfBaseWithinNode,\n mirroredMismatch\n} from \"@jbrowse/tubemap-core\";\nfunction readMismatches(read, layout) {\n const marks = [];\n const entries = read.sequenceNew ?? [];\n const visits = read.path.filter((segment) => segment.node !== null);\n entries.forEach((entry, i) => {\n const nodeIndex = layout.nodeMap.get(forward(entry.nodeName));\n const node = nodeIndex === void 0 ? void 0 : layout.nodes[nodeIndex];\n const visit = visits[i];\n if (node && visit?.y !== void 0) {\n const base = { readId: read.id, y: visit.y, height: read.width };\n const at = (pos) => getXCoordinateOfBaseWithinNode(node, pos);\n for (const edit of entry.mismatches) {\n const mm = visit.isForward ? edit : mirroredMismatch(edit, node.sequenceLength);\n const x0 = at(mm.pos);\n if (x0 !== null) {\n if (mm.type === \"insertion\") {\n marks.push({ ...base, kind: \"insertion\", x: x0, seq: mm.seq });\n } else if (mm.type === \"deletion\" && mm.length !== void 0) {\n const x1 = at(mm.pos + mm.length);\n if (x1 !== null) {\n marks.push({\n ...base,\n kind: \"deletion\",\n x0,\n x1,\n length: mm.length\n });\n }\n } else if (mm.type === \"substitution\" && mm.seq !== void 0) {\n const x1 = at(mm.pos + mm.seq.length);\n if (x1 !== null) {\n marks.push({ ...base, kind: \"substitution\", x0, x1, seq: mm.seq });\n }\n }\n }\n }\n }\n });\n return marks;\n}\nfunction tubeMapMismatches(layout) {\n return layout.reads.flatMap((read) => readMismatches(read, layout));\n}\n\nexport {\n tubeMapMismatches\n};\n", "import {\n MAX_GAP_PX\n} from \"./chunk-MYDHU2UV.js\";\nimport {\n tubeMapMismatches\n} from \"./chunk-BX4AUMZE.js\";\nimport {\n readColor\n} from \"./chunk-A7H753BA.js\";\nimport {\n referenceWalkName\n} from \"./chunk-CIDSF47D.js\";\nimport {\n pathOrigin\n} from \"./chunk-B5X2RLJG.js\";\nimport {\n pushTo\n} from \"./chunk-BSOZW3FC.js\";\n\n// src/tubeMap/draw.ts\nimport { curvePaths, flattenPath, nodeOutlinePath } from \"@jbrowse/tubemap-core\";\nfunction parsePath(d) {\n const tokens = d.trim().split(/[\\s,]+/);\n const commands = [];\n let i = 0;\n const num = () => Number(tokens[i++]);\n while (i < tokens.length) {\n const op = tokens[i++];\n if (op === \"M\" || op === \"L\") {\n commands.push({ op, x: num(), y: num() });\n } else if (op === \"H\") {\n commands.push({ op, x: num() });\n } else if (op === \"V\") {\n commands.push({ op, y: num() });\n } else if (op === \"Q\") {\n commands.push({ op, x1: num(), y1: num(), x: num(), y: num() });\n } else if (op === \"C\") {\n commands.push({\n op,\n x1: num(),\n y1: num(),\n x2: num(),\n y2: num(),\n x: num(),\n y: num()\n });\n } else if (op === \"Z\") {\n commands.push({ op });\n }\n }\n return commands;\n}\nfunction extentOf(commands) {\n let x0 = Infinity;\n let x1 = -Infinity;\n for (const c of commands) {\n if (\"x\" in c) {\n x0 = Math.min(x0, c.x);\n x1 = Math.max(x1, c.x);\n }\n if (\"x1\" in c) {\n x0 = Math.min(x0, c.x1);\n x1 = Math.max(x1, c.x1);\n }\n }\n return { x0, x1 };\n}\nfunction shapeOf(d, color, id, haplotype, reference) {\n const commands = parsePath(d);\n return {\n commands,\n outline: flattenPath(d, 12),\n color,\n id,\n haplotype,\n reference,\n ...extentOf(commands)\n };\n}\nfunction trackColors(layout, pathColors) {\n return new Map(\n layout.tracks.map((track) => [\n track.id,\n track.type === \"read\" ? readColor(track) : pathColors[track.id]\n ])\n );\n}\nfunction layerOf(layout, type, colors, referenceIds, gapWidth) {\n const { shapes } = layout;\n const haplotype = type === \"haplotype\";\n const colorOf = (s) => colors.get(s.id);\n const isReference = (s) => haplotype && referenceIds.has(s.id);\n const rects = [...shapes.rectangles, ...shapes.verticalRectangles].filter((r) => r.type === type).map((r) => ({\n color: colorOf(r),\n id: r.id,\n haplotype,\n reference: isReference(r),\n x0: r.xStart,\n x1: r.xEnd + 1,\n y0: r.yStart,\n y1: r.yEnd + 1\n }));\n const curves = curvePaths(shapes.curves, type, { gapWidth }).map(\n (c) => shapeOf(c.path, colorOf(c), c.id, haplotype, isReference(c))\n );\n const corners = shapes.corners.filter((c) => c.type === type).map((c) => shapeOf(c.path, colorOf(c), c.id, haplotype, isReference(c)));\n return { rects, shapes: [...curves, ...corners] };\n}\nfunction referenceTrackIds(graph) {\n const ids = /* @__PURE__ */ new Set();\n const name = graph && referenceWalkName(graph);\n graph?.paths?.forEach((path, i) => {\n if (pathOrigin(path.name).name === name) {\n ids.add(i);\n }\n });\n return ids;\n}\nfunction tubeMapPicture({\n layout,\n pathColors,\n graph,\n columns\n}) {\n const colors = trackColors(layout, pathColors);\n const referenceIds = referenceTrackIds(graph);\n const gapWidth = columns ? MAX_GAP_PX : void 0;\n const nodes = [];\n layout.nodes.forEach((node) => {\n if (node.order >= 0) {\n const commands = parsePath(nodeOutlinePath(node));\n nodes.push({ name: node.name, commands, ...extentOf(commands) });\n }\n });\n return {\n bounds: layout.bounds,\n layers: [\n layerOf(layout, \"haplotype\", colors, referenceIds, gapWidth),\n layerOf(layout, \"read\", colors, referenceIds, gapWidth)\n ],\n nodes,\n mismatches: tubeMapMismatches(layout)\n };\n}\nfunction trace(ctx, commands, x, y) {\n let cx = 0;\n let cy = 0;\n for (const c of commands) {\n switch (c.op) {\n case \"M\":\n cx = c.x;\n cy = c.y;\n ctx.moveTo(x(cx), y(cy));\n break;\n case \"L\":\n cx = c.x;\n cy = c.y;\n ctx.lineTo(x(cx), y(cy));\n break;\n case \"H\":\n cx = c.x;\n ctx.lineTo(x(cx), y(cy));\n break;\n case \"V\":\n cy = c.y;\n ctx.lineTo(x(cx), y(cy));\n break;\n case \"Q\":\n cx = c.x;\n cy = c.y;\n ctx.quadraticCurveTo(x(c.x1), y(c.y1), x(cx), y(cy));\n break;\n case \"C\":\n cx = c.x;\n cy = c.y;\n ctx.bezierCurveTo(x(c.x1), y(c.y1), x(c.x2), y(c.y2), x(cx), y(cy));\n break;\n case \"Z\":\n ctx.closePath();\n break;\n }\n }\n}\nfunction fillByColor(ctx, items, visible, colorOf, addTo) {\n const byColor = /* @__PURE__ */ new Map();\n for (const item of items) {\n if (visible(item)) {\n pushTo(byColor, colorOf(item), item);\n }\n }\n for (const list of byColor.values()) {\n ctx.fillStyle = colorOf(list[0]);\n ctx.beginPath();\n for (const item of list) {\n addTo(item);\n }\n ctx.fill();\n }\n}\nvar FULL_OUTLINE_PX = 12;\nvar MIN_OUTLINE_ALPHA = 0.15;\nfunction outlineAlpha(screenWidth) {\n return Math.max(MIN_OUTLINE_ALPHA, Math.min(1, screenWidth / FULL_OUTLINE_PX));\n}\nvar NODE_TINT_ALPHA = 0.55;\nfunction drawTubeMap(ctx, picture, frame) {\n const { x, y, width } = frame;\n const visible = (item) => x(item.x1) >= 0 && x(item.x0) <= width;\n const colorOf = (item) => item.haplotype && frame.tubeColors?.[item.id] || item.color;\n ctx.globalAlpha = 1;\n for (const layer of picture.layers) {\n for (const reference of [false, true]) {\n const inPass = (item) => item.reference === reference;\n fillByColor(\n ctx,\n layer.rects,\n (r) => inPass(r) && visible(r),\n colorOf,\n (r) => {\n const left = x(r.x0);\n const top = y(r.y0);\n ctx.rect(left, top, x(r.x1) - left, y(r.y1) - top);\n }\n );\n fillByColor(\n ctx,\n layer.shapes,\n (s) => inPass(s) && visible(s),\n colorOf,\n (s) => {\n trace(ctx, s.commands, x, y);\n }\n );\n }\n }\n const stroke = frame.darkMode ? \"#d0d0d0\" : \"#000000\";\n const fill = frame.darkMode ? \"rgba(40,40,40,0.4)\" : \"rgba(255,255,255,0.4)\";\n ctx.lineWidth = outlineWidth(frame);\n for (const node of picture.nodes) {\n if (visible(node) && node.name !== frame.highlightNode) {\n ctx.beginPath();\n trace(ctx, node.commands, x, y);\n const tint = frame.nodeColors?.get(node.name);\n ctx.fillStyle = tint ?? fill;\n ctx.strokeStyle = stroke;\n ctx.globalAlpha = tint ? NODE_TINT_ALPHA : 1;\n ctx.fill();\n ctx.globalAlpha = outlineAlpha(x(node.x1) - x(node.x0));\n ctx.stroke();\n ctx.globalAlpha = 1;\n }\n }\n drawTubeMapHighlight(ctx, picture, frame);\n drawMismatches(ctx, picture.mismatches, frame);\n}\nfunction outlineWidth(frame) {\n return 2 * Math.max(0.25, Math.min(1, frame.yScale));\n}\nfunction drawTubeMapHighlight(ctx, picture, frame) {\n const node = frame.highlightNode ? picture.nodes.find((n) => n.name === frame.highlightNode) : void 0;\n if (node) {\n ctx.beginPath();\n trace(ctx, node.commands, frame.x, frame.y);\n ctx.globalAlpha = 1;\n ctx.lineWidth = outlineWidth(frame);\n ctx.fillStyle = \"rgba(255,192,203,0.5)\";\n ctx.strokeStyle = \"#ff0000\";\n ctx.fill();\n ctx.stroke();\n }\n}\nvar MISMATCH_FONT_PX = 12;\nvar MIN_MISMATCH_FONT_PX = 6;\nfunction mismatchesLegible(yScale) {\n return MISMATCH_FONT_PX * yScale >= MIN_MISMATCH_FONT_PX;\n}\nfunction mismatchOnScreen(m, { x, width }) {\n const [x0, x1] = m.kind === \"insertion\" ? [m.x, m.x] : [m.x0, m.x1];\n return x(x1) >= 0 && x(x0) <= width;\n}\nfunction drawMismatches(ctx, marks, frame) {\n const { x, y, yScale, darkMode } = frame;\n if (!mismatchesLegible(yScale) || marks.length === 0) {\n return;\n }\n const fontPx = MISMATCH_FONT_PX * yScale;\n ctx.fillStyle = \"grey\";\n ctx.beginPath();\n for (const m of marks) {\n if (m.kind === \"deletion\" && mismatchOnScreen(m, frame)) {\n const left = x(m.x0);\n const top = y(m.y);\n ctx.rect(left, top, x(m.x1) - left, y(m.y + m.height) - top);\n }\n }\n ctx.fill();\n ctx.font = `${fontPx}px monospace`;\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"alphabetic\";\n ctx.fillStyle = darkMode ? \"#ffffff\" : \"#000000\";\n for (const m of marks) {\n if (!mismatchOnScreen(m, frame)) {\n continue;\n }\n if (m.kind === \"substitution\") {\n ctx.fillText(m.seq, x(m.x0) + 1, y(m.y + m.height));\n } else if (m.kind === \"insertion\") {\n ctx.fillText(\"*\", x(m.x) - 3, y(m.y + m.height));\n }\n }\n}\nfunction inside(points, sx, sy) {\n let hit = false;\n for (let i = 0, j = points.length - 1; i < points.length; j = i++) {\n const [xi, yi] = points[i];\n const [xj, yj] = points[j];\n if (yi > sy !== yj > sy && sx < (xj - xi) * (sy - yi) / (yj - yi) + xi) {\n hit = !hit;\n }\n }\n return hit;\n}\nfunction tubeMapTrackAt(picture, { x, y }, sx, sy) {\n for (let l = picture.layers.length - 1; l >= 0; l--) {\n const { rects, shapes } = picture.layers[l];\n for (const reference of [true, false]) {\n for (const r of rects) {\n if (r.reference === reference && x(r.x0) <= sx && sx <= x(r.x1) && y(r.y0) <= sy && sy <= y(r.y1)) {\n return r.id;\n }\n }\n for (const s of shapes) {\n if (s.reference === reference && x(s.x0) <= sx && sx <= x(s.x1) && inside(\n s.outline.map(([px, py]) => [x(px), y(py)]),\n sx,\n sy\n )) {\n return s.id;\n }\n }\n }\n }\n return void 0;\n}\nvar INSERTION_SLOP_PX = 4;\nfunction tubeMapMismatchAt(picture, frame, sx, sy) {\n const { x, y, yScale } = frame;\n return mismatchesLegible(yScale) ? picture.mismatches.find(\n (m) => y(m.y) <= sy && sy <= y(m.y + m.height) && (m.kind === \"insertion\" ? Math.abs(x(m.x) - sx) <= INSERTION_SLOP_PX : x(m.x0) <= sx && sx <= x(m.x1))\n ) : void 0;\n}\n\nexport {\n parsePath,\n trackColors,\n tubeMapPicture,\n drawTubeMap,\n drawTubeMapHighlight,\n mismatchesLegible,\n mismatchOnScreen,\n tubeMapTrackAt,\n tubeMapMismatchAt\n};\n", "const host = JBrowseExports[\"@jbrowse/core/util/groupKeys\"]\nconst read = name =>\n host != null && name in Object(host)\n ? host[name]\n : Object.assign(\n function () {\n throw new Error(\n \"This JBrowse does not provide '\" + name + \"' from '\" + \"@jbrowse/core/util/groupKeys\" + \"' to plugins: GraphGenomeView was built for a different JBrowse version, so update the plugin or JBrowse\",\n )\n },\n { jbrowseHostMissing: name },\n )\nexport const MAX_GROUPS = /* @__PURE__ */ read(\"MAX_GROUPS\")\nexport const OVERFLOW_GROUP_KEY = /* @__PURE__ */ read(\"OVERFLOW_GROUP_KEY\")\nexport const capGroupKeys = /* @__PURE__ */ read(\"capGroupKeys\")\nexport const carryGroupDomain = /* @__PURE__ */ read(\"carryGroupDomain\")\nexport const compareGroupKeys = /* @__PURE__ */ read(\"compareGroupKeys\")\nexport const groupKeyComparator = /* @__PURE__ */ read(\"groupKeyComparator\")\nexport const groupKeySpaceOf = /* @__PURE__ */ read(\"groupKeySpaceOf\")\nexport const overflowLabel = /* @__PURE__ */ read(\"overflowLabel\")\nexport const valueText = /* @__PURE__ */ read(\"valueText\")\nexport default host && host.__esModule ? host.default : host", "import { walkRowsTree } from '@jbrowse/bandage-core/layout/walkRowDraw'\nimport { groupKeyComparator } from '@jbrowse/core/util/groupKeys'\n\nimport type { El } from '@jbrowse/bandage-core/el'\nimport type {\n WalkRowsFrame,\n WalkRowsWithCalls,\n} from '@jbrowse/bandage-core/layout/walkRowDraw'\n\n// Walk rows stacked into one section per value of a sample table's column,\n// as jbrowse-plugin-tandem-repeat's \"Group by\u2026\" stacks its alleles. Placement\n// here, not in bandage-core's walkRowsTree, which puts row i at i * rowPx.\n\n// One row of a samples TSV: the sample's name and a value per column\nexport type SampleRow = { name: string } & Record<string, string>\n\nexport interface WalkRowGroupBy {\n field: string\n domain?: string[]\n}\n\nexport interface WalkRowSection {\n // '' for the rows with no value\n key: string\n title: string\n // index of the section's first row among the reference row and the rows\n first: number\n count: number\n}\n\nexport const SECTION_HEADER_PX = 16\n\n// A samples TSV as core's samplesTsv reads one: a header row, the sample's\n// name in the first column, the first row of a repeated name kept. Hosts\n// re-export that module only from v5.0.0-beta.11, so it is read here.\nexport function parseSamplesTsv(text: string): SampleRow[] {\n const [head = '', ...lines] = text.split(/\\r\\n|\\r|\\n/)\n const columns = head.split('\\t').slice(1)\n const rows = new Map<string, SampleRow>()\n for (const line of lines) {\n if (!line) {\n continue\n }\n const [name = '', ...values] = line.split('\\t')\n if (name && !rows.has(name)) {\n rows.set(name, {\n ...Object.fromEntries(columns.map((c, i) => [c, values[i] ?? ''])),\n name,\n })\n }\n }\n return [...rows.values()]\n}\n\nexport function metadataColumns(rows: SampleRow[] | undefined) {\n const columns = new Set<string>()\n for (const row of rows ?? []) {\n for (const key of Object.keys(row)) {\n if (key !== 'name') {\n columns.add(key)\n }\n }\n }\n return [...columns]\n}\n\n// The setting as a snapshot may hold it: a bare field name, or the object\nexport function groupByOf(value: unknown): WalkRowGroupBy | undefined {\n if (typeof value === 'string') {\n return value ? { field: value } : undefined\n }\n const { field, domain } = (value ?? {}) as Record<string, unknown>\n if (typeof field !== 'string' || !field) {\n return undefined\n }\n return Array.isArray(domain)\n ? { field, domain: domain.filter(d => typeof d === 'string') }\n : { field }\n}\n\nexport function plural(n: number, noun: string) {\n return `${n} ${noun}${n === 1 ? '' : 's'}`\n}\n\n// A walk's value in a column: its haplotype's row (`HG00097#1`), else its\n// sample's (`HG00097`), else ''\nexport function columnValueOf(field: string, table: SampleRow[]) {\n const valueOf = new Map(table.map(row => [row.name, row[field] ?? '']))\n return (haplotype: string, sample: string) =>\n valueOf.get(haplotype) || valueOf.get(sample) || ''\n}\n\n// Items grouped by their value in a column, each group in the order its items\n// came in, the groups in the order a JBrowse Group by sorts them, and each\n// titled with its value and how many distinct `noun`s its items are\nexport function groupsByColumn<T>(\n items: readonly T[],\n valueOf: (item: T) => string,\n { field, domain }: { field: string; domain?: readonly string[] },\n noun: string,\n nounOf: (item: T) => string,\n) {\n const groups = new Map<string, T[]>()\n for (const item of items) {\n const key = valueOf(item)\n const group = groups.get(key)\n if (group) {\n group.push(item)\n } else {\n groups.set(key, [item])\n }\n }\n return [...groups.keys()].sort(groupKeyComparator(domain)).map(key => {\n const members = groups.get(key)!\n const n = new Set(members.map(nounOf)).size\n return {\n key,\n members,\n title: `${key || `${field}: none`} \u00B7 ${plural(n, noun)}`,\n }\n })\n}\n\n// The rows reordered section by section; rows with no value stack last\nexport function groupWalkRows<R extends { sample: string; label: string }>(\n rows: R[],\n table: SampleRow[],\n groupBy: WalkRowGroupBy,\n) {\n const valueOf = columnValueOf(groupBy.field, table)\n const groups = groupsByColumn(\n rows,\n row => valueOf(row.label, row.sample),\n groupBy,\n 'haplotype',\n row => row.label,\n )\n let first = 1\n const sections: WalkRowSection[] = groups.map(({ key, members, title }) => {\n const section = { key, title, first, count: members.length }\n first += members.length\n return section\n })\n return {\n rows: groups.flatMap(g => g.members),\n sections,\n }\n}\n\n// Where rows and section headers sit, in px down from the reference row's\n// centre, at one row pitch shared by every section: a header strip above\n// each section's first row pushes every row after it down\nexport function sectionPlacement(sections: WalkRowSection[], rowPx: number) {\n const sectionOf = (i: number) => {\n let k = -1\n while (k + 1 < sections.length && sections[k + 1]!.first <= i) {\n k++\n }\n return k\n }\n const rowY = (i: number) => i * rowPx + (sectionOf(i) + 1) * SECTION_HEADER_PX\n return {\n rowY,\n headers: sections.map((s, k) => ({\n ...s,\n top: (s.first - 0.5) * rowPx + k * SECTION_HEADER_PX,\n })),\n headersPx: sections.length * SECTION_HEADER_PX,\n // the row whose centre is nearest y\n rowAt(y: number, rows: number) {\n let best = 0\n for (let k = -1; k < sections.length; k++) {\n const lo = k < 0 ? 0 : sections[k]!.first\n const hi =\n k < 0\n ? Math.min(rows, sections[0]?.first ?? rows)\n : lo + sections[k]!.count\n const shift = (k + 1) * SECTION_HEADER_PX\n const i = Math.min(\n hi - 1,\n Math.max(lo, Math.round((y - shift) / rowPx)),\n )\n if (Math.abs(rowY(i) - y) < Math.abs(rowY(best) - y)) {\n best = i\n }\n }\n return best\n },\n }\n}\n\n// The rows' trees, a section at a time while grouped. walkRowsTree puts its\n// i-th row at i * rowPx below its reference row and draws that row too, so\n// each section is drawn shifted down to its place with its reference row\n// dropped.\nexport function walkRowTrees(\n bars: WalkRowsWithCalls,\n sections: WalkRowSection[],\n rowY: (i: number) => number,\n frame: WalkRowsFrame & { rowPx: number },\n o: Parameters<typeof walkRowsTree>[2] & { idPrefix: string },\n): El[] {\n if (sections.length === 0) {\n return [walkRowsTree(bars, frame, o)]\n }\n return [\n walkRowsTree({ ...bars, rows: [] }, frame, o),\n ...sections.flatMap((section, k) => {\n const tree = walkRowsTree(\n {\n ...bars,\n rows: bars.rows.slice(\n section.first - 1,\n section.first - 1 + section.count,\n ),\n },\n {\n ...frame,\n translateY:\n frame.translateY +\n (rowY(section.first) - frame.rowPx) * frame.scaleY,\n },\n { ...o, idPrefix: `${o.idPrefix}-s${k}` },\n )\n return tree.children.filter(\n (c): c is El =>\n typeof c !== 'string' &&\n c.attrs['data-testid'] !== 'graph-walk-reference',\n )\n }),\n ]\n}\n", "import {\n buildNeighbors\n} from \"./chunk-VX656OAZ.js\";\nimport {\n REFERENCE_RANK,\n isAnchored\n} from \"./chunk-RJWPJCIB.js\";\n\n// src/alleleProjection/projectAlleles.ts\nfunction collectRun(seed, byId, adj, claimed) {\n const members = [];\n const anchors = [];\n const queue = [seed];\n claimed.add(seed);\n while (queue.length > 0) {\n const id = queue.pop();\n const node = byId.get(id);\n if (node) {\n members.push(node);\n for (const neighborId of adj.get(id) ?? []) {\n const neighbor = byId.get(neighborId);\n if (neighbor) {\n if (neighbor.stable.rank === REFERENCE_RANK) {\n anchors.push(neighbor);\n } else if (!claimed.has(neighborId)) {\n claimed.add(neighborId);\n queue.push(neighborId);\n }\n }\n }\n }\n }\n return { members, anchors };\n}\nfunction anchorSpan(anchors) {\n const refNames = new Set(anchors.map((a) => a.stable.refName));\n if (refNames.size !== 1 || anchors.length < 2) {\n return void 0;\n }\n const sorted = [...anchors].sort((a, b) => a.stable.start - b.stable.start);\n const first = sorted[0];\n const last = sorted.at(-1);\n const start = first.stable.start + first.length;\n const end = last.stable.start;\n return end >= start ? { start, end, entry: first } : void 0;\n}\nfunction runDistances(members, entry, adj) {\n const byId = new Map(members.map((m) => [m.id, m]));\n const dist = /* @__PURE__ */ new Map();\n const queue = [];\n for (const neighborId of adj.get(entry.id) ?? []) {\n if (byId.has(neighborId)) {\n dist.set(neighborId, 0);\n queue.push(neighborId);\n }\n }\n if (queue.length === 0) {\n for (const member of members) {\n dist.set(member.id, 0);\n queue.push(member.id);\n }\n }\n for (const id of queue) {\n const reach = dist.get(id) + byId.get(id).length;\n for (const neighborId of adj.get(id) ?? []) {\n if (byId.has(neighborId)) {\n const known = dist.get(neighborId);\n if (known === void 0 || reach < known) {\n dist.set(neighborId, reach);\n queue.push(neighborId);\n }\n }\n }\n }\n return dist;\n}\nfunction runOffsets(members, entry, adj) {\n const dist = runDistances(members, entry, adj);\n const ordered = [...members].sort((a, b) => dist.get(a.id) - dist.get(b.id));\n const rank = new Map(ordered.map((m, i) => [m.id, i]));\n const byId = new Map(members.map((m) => [m.id, m]));\n const offsets = /* @__PURE__ */ new Map();\n for (const [i, member] of ordered.entries()) {\n let offset = 0;\n for (const neighborId of adj.get(member.id) ?? []) {\n const neighbor = byId.get(neighborId);\n if (neighbor && rank.get(neighborId) < i) {\n offset = Math.max(offset, offsets.get(neighborId) + neighbor.length);\n }\n }\n offsets.set(member.id, offset);\n }\n return { offsets, ordered };\n}\nfunction projectAlleles(graph) {\n const byId = new Map(\n graph.nodes.filter(isAnchored).map((n) => [n.id, n])\n );\n const adj = buildNeighbors(graph);\n const claimed = /* @__PURE__ */ new Set();\n const alleles = [];\n for (const node of byId.values()) {\n if (node.stable.rank !== REFERENCE_RANK && !claimed.has(node.id)) {\n const { members, anchors } = collectRun(node.id, byId, adj, claimed);\n const span = anchorSpan(anchors);\n if (span) {\n const { offsets, ordered } = runOffsets(members, span.entry, adj);\n alleles.push({\n start: span.start,\n refSpan: span.end - span.start,\n nodeIds: ordered.map((m) => m.id),\n nodeOffsets: ordered.map((m) => offsets.get(m.id)),\n pathLength: ordered.reduce(\n (max, m) => Math.max(max, offsets.get(m.id) + m.length),\n 0\n )\n });\n }\n }\n }\n return alleles.sort((a, b) => a.start - b.start);\n}\n\nexport {\n projectAlleles\n};\n", "import { parsePanSN } from '@jbrowse/bandage-core/alleleProjection/projectAlleles'\nimport { formatBp } from '@jbrowse/bandage-core/graphLabels'\nimport { pathOrigin } from '@jbrowse/bandage-core/pathAnchoring'\nimport { drawTubeMapHighlight } from '@jbrowse/bandage-core/tubeMap/draw'\nimport { groupKeyComparator } from '@jbrowse/core/util/groupKeys'\n\nimport { columnValueOf, groupsByColumn, plural } from './walkRowGroups'\n\nimport type { SampleRow } from './walkRowGroups'\nimport type { FacetBy } from '@jbrowse/bandage-core/facetGrid'\nimport type { TubeMapDrawing } from '@jbrowse/bandage-core/layout/tubeMapLayout'\nimport type { TubeMapPicture } from '@jbrowse/bandage-core/tubeMap/draw'\nimport type { TubeMapTransform } from '@jbrowse/bandage-core/tubeMap/frame'\nimport type { Graph, LayoutResult } from '@jbrowse/bandage-core/types'\n\n// A tube map split into small multiples: a panel per sample, or per walk, each\n// the reference and that group's walks laid out alone, stacked down the pane.\n// On the reference axis every panel's columns sit at their bp, so a box lines\n// up across the panels and with the linear view's tracks.\n\n// px above each panel, which its title takes\nexport const PANEL_GAP = 28\nexport const PANEL_REFERENCE_TUBE = '#4d4d4d'\nexport const PANEL_TUBE = '#5b8cc4'\nexport const PANEL_TUBES = [PANEL_TUBE, '#82abd9']\n// greys beside boxes tinted by the node scheme, so no tube shares a box's hue\nexport const TINTED_TUBES = ['#8c8c8c', '#adadad']\nexport const PANEL_TITLE_FONT = '12px sans-serif'\n\nexport const TUBE_MAP_PANELS: { field: '' | FacetBy; label: string }[] = [\n { field: '', label: 'None' },\n { field: 'sample', label: 'A panel per sample' },\n { field: 'walk', label: 'A panel per haplotype' },\n]\n\n// How the walks split: by sample or walk, the groups the domain names first\n// and the rest in the graph's order, or by a sample table column, its values\n// in the order a JBrowse Group by sorts them\nexport type TubeMapPanelSplit =\n | { by: FacetBy; domain?: readonly string[] }\n | { by: 'column'; field: string; table: SampleRow[]; domain?: string[] }\n\nexport interface TubeMapPanelGroup {\n key: string\n // the graph's own path names, pieces of one walk included\n paths: string[]\n // a column's value names a group of samples, and says how many\n label?: string\n}\n\nexport interface TubeMapPanel extends TubeMapPanelGroup {\n result: LayoutResult & { tubeMap: TubeMapDrawing }\n // where the panel's drawing starts down the stack, in tube px\n top: number\n height: number\n}\n\n// a pane's layout: a tube map split into panels carries them, and the stack's\n// extent and node positions in place of the whole map's\nexport type PaneLayout = LayoutResult & { tubeMapPanels?: TubeMapPanel[] }\n\nconst walkOf = (name: string) => pathOrigin(name).name\n\n// A tube coloured by its role where no key could name a hue per walk: the\n// reference charcoal and the haplotypes blue, or grey beside tinted boxes,\n// neighbours alternating two shades so each stays countable in a bundle\nexport function roleTubeColors(\n paths: readonly { name: string }[],\n reference: string | undefined,\n tubes = PANEL_TUBES,\n) {\n let haplotype = 0\n return paths.map(p =>\n walkOf(p.name) === reference\n ? PANEL_REFERENCE_TUBE\n : tubes[haplotype++ % tubes.length]!,\n )\n}\n\n// a categorical palette for a column's values, a hue each in sorted order\nconst VALUE_TUBES = [\n '#4e79a7',\n '#f28e2b',\n '#59a14f',\n '#e15759',\n '#b07aa1',\n '#76b7b2',\n '#edc948',\n '#9c755f',\n '#ff9da7',\n '#bab0ac',\n]\nexport const NO_VALUE_TUBE = '#c8c8c8'\n\n// Each of a column's values its hue, in the order a JBrowse Group by sorts\n// them; a value past the palette, or none, is grey\nexport function valueTubePalette(values: Iterable<string>) {\n const sorted = [...new Set(values)]\n .filter(v => v !== '')\n .sort(groupKeyComparator())\n return new Map(sorted.map((v, i) => [v, VALUE_TUBES[i] ?? NO_VALUE_TUBE]))\n}\n\n// The reference charcoal and each walk, or the bundle it stands for, in its\n// value's hue\nexport function valueTubeColors(\n paths: readonly { name: string; members?: string[] }[],\n reference: string | undefined,\n valueOf: (walk: string) => string,\n palette: ReadonlyMap<string, string>,\n) {\n return paths.map(p => {\n const walk = walkOf(p.name)\n return walk === reference\n ? PANEL_REFERENCE_TUBE\n : (palette.get(valueOf(p.members?.[0] ?? walk)) ?? NO_VALUE_TUBE)\n })\n}\n\n// A PanSN walk's value in a column\nexport function columnKeyOf(field: string, table: SampleRow[]) {\n const valueOf = columnValueOf(field, table)\n return (walk: string) => {\n const { sample, haplotype } = parsePanSN(walk)\n return valueOf(`${sample}#${haplotype}`, sample)\n }\n}\n\n// Each non-reference walk's group\nexport function tubeMapPanelGroups(\n graph: Graph,\n split: TubeMapPanelSplit,\n): TubeMapPanelGroup[] {\n const names = (graph.paths ?? [])\n .map(p => p.name)\n .filter(name => walkOf(name) !== graph.referencePath)\n if (split.by === 'column') {\n const keyOf = columnKeyOf(split.field, split.table)\n return groupsByColumn(\n names,\n name => keyOf(walkOf(name)),\n split,\n 'sample',\n name => parsePanSN(walkOf(name)).sample,\n ).map(({ key, members, title }) => ({ key, paths: members, label: title }))\n }\n const keyOf =\n split.by === 'sample'\n ? (walk: string) => parsePanSN(walk).sample\n : (walk: string) => walk\n const groups = new Map<string, string[]>()\n for (const name of names) {\n const key = keyOf(walkOf(name))\n const list = groups.get(key)\n if (list) {\n list.push(name)\n } else {\n groups.set(key, [name])\n }\n }\n const domain = split.domain ?? []\n const rank = new Map(domain.map((key, i) => [key, i]))\n const listed = (key: string) => rank.get(key) ?? domain.length\n return [...groups]\n .map(([key, paths], i) => ({ key, paths, i }))\n .sort((a, b) => listed(a.key) - listed(b.key) || a.i - b.i)\n .map(({ key, paths }) => ({ key, paths }))\n}\n\n// The box a panel draws a node of the laid graph in: the node itself, or the\n// merged run holding it\nexport function boxOf(drawing: TubeMapDrawing, node: string) {\n if (drawing.graph.nodes.some(n => n.id === node)) {\n return node\n }\n for (const [box, members] of drawing.members) {\n if (members.includes(node)) {\n return box\n }\n }\n return undefined\n}\n\n// The member of a merged run under pane x `sx`, a run drawn from `left` to\n// `right` across its members' bp, so a panel's count is of the bp the pointer\n// is on, not of the whole run. Undefined when no member has a span.\nexport function memberAt(\n members: readonly string[],\n spanOf: (id: string) => { start: number; end: number } | undefined,\n left: number,\n right: number,\n sx: number,\n) {\n const spans = members.flatMap(id => {\n const span = spanOf(id)\n return span ? [{ id, ...span }] : []\n })\n if (spans.length === 0) {\n return undefined\n }\n const start = Math.min(...spans.map(s => s.start))\n const end = Math.max(...spans.map(s => s.end))\n const share = right > left ? (sx - left) / (right - left) : 0\n const bp = start + Math.min(1, Math.max(0, share)) * (end - start)\n const distance = (s: { start: number; end: number }) =>\n bp < s.start ? s.start - bp : bp >= s.end ? bp - s.end + 1 : 0\n return spans.reduce((a, b) => (distance(b) < distance(a) ? b : a)).id\n}\n\n// How many of a panel's walks pass through `box`, of how many it holds, a\n// bundle counting each walk it stands for\nexport function walksThrough(graph: Graph, box: string) {\n const all = new Set<string>()\n const here = new Set<string>()\n for (const p of graph.paths ?? []) {\n const walk = walkOf(p.name)\n if (walk !== graph.referencePath) {\n for (const member of p.members ?? [walk]) {\n all.add(member)\n if (p.nodeIds.includes(box)) {\n here.add(member)\n }\n }\n }\n }\n return { here: here.size, of: all.size }\n}\n\nconst COUNT_FONT = 'bold 11px sans-serif'\nconst MIN_COUNT_RUN_PX = 80\nconst MIN_COUNT_TUBE_PX = 9\n\n// Each bundle's count on its tube, along every straight run wide and tall\n// enough to hold it, so the count stands where its route parts from others\nexport function drawBundleCounts(\n ctx: CanvasRenderingContext2D,\n picture: TubeMapPicture,\n graph: Graph,\n { x, y, width }: TubeMapTransform & { width: number },\n) {\n const paths = graph.paths ?? []\n if (!paths.some(p => p.members)) {\n return\n }\n const counts = new Map<number, number>()\n paths.forEach((p, i) => {\n if (walkOf(p.name) !== graph.referencePath) {\n counts.set(i, p.members?.length ?? 1)\n }\n })\n ctx.font = COUNT_FONT\n ctx.textAlign = 'left'\n ctx.textBaseline = 'middle'\n ctx.fillStyle = '#0b1f3a'\n for (const r of picture.layers[0]?.rects ?? []) {\n const n = counts.get(r.id)\n const left = Math.max(0, x(r.x0))\n const right = Math.min(width, x(r.x1))\n const top = y(r.y0)\n const bottom = y(r.y1)\n if (\n n !== undefined &&\n right - left >= MIN_COUNT_RUN_PX &&\n bottom - top >= MIN_COUNT_TUBE_PX\n ) {\n ctx.fillText(`\u00D7${n}`, left + 4, (top + bottom) / 2)\n }\n }\n}\n\nconst LENGTH_FONT = '10px sans-serif'\nconst MIN_LENGTH_LABEL_BP = 1000\n\n// Each box of a reference-axis map whose sequence the axis squeezes narrower\n// than its length's label, labelled beside it: off the reference a 33 kb\n// module draws a few px wide, as a SNP's box does. Boxes of one length\n// stacked in a column share a label, \"each\", at the lowest, where the stack\n// has room; a label that would overlap one already drawn is left out.\nexport function drawSqueezedLengths(\n ctx: CanvasRenderingContext2D,\n drawing: TubeMapDrawing,\n { x, y, width }: TubeMapTransform & { width: number },\n) {\n if (!drawing.columns) {\n return\n }\n const lengthOf = new Map(drawing.graph.nodes.map(n => [n.id, n.length]))\n ctx.font = LENGTH_FONT\n const stacks = new Map<\n string,\n { text: string; right: number; mid: number; count: number }\n >()\n // sparse, so forEach, which skips its holes\n drawing.layout.nodes.forEach(node => {\n const bp = lengthOf.get(node.name) ?? 0\n const left = x(node.x)\n const right = x(node.x + node.pixelWidth)\n const text = formatBp(bp)\n if (\n node.order >= 0 &&\n bp >= MIN_LENGTH_LABEL_BP &&\n right - left < ctx.measureText(text).width\n ) {\n const mid = (y(node.y) + y(node.y + node.contentHeight)) / 2\n const key = `${Math.round(right)}:${text}`\n const stack = stacks.get(key)\n if (stack) {\n stack.count++\n stack.mid = Math.max(stack.mid, mid)\n } else {\n stacks.set(key, { text, right, mid, count: 1 })\n }\n }\n })\n ctx.textAlign = 'left'\n ctx.textBaseline = 'middle'\n ctx.lineJoin = 'round'\n ctx.lineWidth = 3\n ctx.strokeStyle = 'rgba(255,255,255,0.9)'\n ctx.fillStyle = 'rgba(0,0,0,0.75)'\n const drawn: { x0: number; x1: number; y0: number; y1: number }[] = []\n for (const { text, right, mid, count } of stacks.values()) {\n const label = count > 1 ? `${text} each` : text\n const box = {\n x0: right + 3,\n x1: right + 3 + ctx.measureText(label).width,\n y0: mid - 6,\n y1: mid + 6,\n }\n if (\n box.x1 <= width &&\n !drawn.some(\n d => d.x0 < box.x1 && box.x0 < d.x1 && d.y0 < box.y1 && box.y0 < d.y1,\n )\n ) {\n drawn.push(box)\n ctx.strokeText(label, box.x0, mid)\n ctx.fillText(label, box.x0, mid)\n }\n }\n}\n\ninterface PanelOnScreen {\n picture: TubeMapPicture\n frame: TubeMapTransform\n label: string\n titleTop: number\n top: number\n}\n\n// The hovered box in each panel that draws it, and beside each title how many\n// of that panel's haplotypes pass through it. On the hover layer, so a hover\n// repaints no tube.\nexport function paintPanelHover(\n ctx: CanvasRenderingContext2D,\n panels: PanelOnScreen[],\n hover: ({ box: string; here: number; of: number } | undefined)[] | undefined,\n { width, lit }: { width: number; lit: boolean },\n) {\n panels.forEach((p, i) => {\n const hit = hover?.[i]\n if (!hit) {\n return\n }\n if (lit) {\n drawTubeMapHighlight(ctx, p.picture, {\n ...p.frame,\n width,\n highlightNode: hit.box,\n })\n }\n ctx.font = PANEL_TITLE_FONT\n ctx.textAlign = 'left'\n ctx.textBaseline = 'top'\n ctx.fillStyle = '#c00000'\n ctx.fillText(\n ` \u00B7 ${hit.here} of ${plural(hit.of, 'haplotype')} here`,\n 6 + ctx.measureText(p.label).width,\n p.titleTop + 4,\n )\n })\n}\n\n// The reference and `paths` alone: the nodes they visit and the links between\n// them, without reads, which name no sample\nexport function graphOfPaths(graph: Graph, paths: readonly string[]): Graph {\n const kept = new Set(paths)\n const keptPaths = (graph.paths ?? []).filter(\n p => kept.has(p.name) || walkOf(p.name) === graph.referencePath,\n )\n const walks = new Set(keptPaths.map(p => walkOf(p.name)))\n const nodeIds = new Set(keptPaths.flatMap(p => p.nodeIds))\n const nodes = graph.nodes.filter(n => nodeIds.has(n.id))\n const names = new Set(nodes.map(n => n.name))\n const pathVisits = graph.pathVisits?.filter(\n path => walks.has(path),\n segment => names.has(segment),\n )\n return {\n ...graph,\n nodes,\n edges: graph.edges.filter(e => nodeIds.has(e.from) && nodeIds.has(e.to)),\n paths: keptPaths,\n anchorPaths: graph.anchorPaths?.filter(p => walks.has(p.name)),\n pathVisits,\n reads: undefined,\n }\n}\n\n// `whole` with each group's own tube map stacked in its place, a title's gap\n// above each, or `whole` alone when fewer than two groups draw\nexport function withTubeMapPanels(\n whole: LayoutResult,\n laidOut: (TubeMapPanelGroup & { result: LayoutResult | undefined })[],\n): PaneLayout {\n const panels: TubeMapPanel[] = []\n const nodePositions: LayoutResult['nodePositions'] = {}\n let y = 0\n let minX = Infinity\n let maxX = -Infinity\n for (const { key, paths, label, result } of laidOut) {\n const tubeMap = result?.tubeMap\n const extent = result?.extent\n if (tubeMap && extent) {\n const top = y + PANEL_GAP\n const height = (extent.maxY ?? 0) - (extent.minY ?? 0)\n panels.push({\n key,\n paths,\n label,\n result: { ...result, tubeMap },\n top,\n height,\n })\n const dy = top - (extent.minY ?? 0)\n for (const [id, segments] of Object.entries(result.nodePositions)) {\n nodePositions[id] = segments.map(s => ({ x: s.x, y: s.y + dy }))\n }\n y = top + height\n minX = Math.min(minX, extent.minX ?? minX)\n maxX = Math.max(maxX, extent.maxX ?? maxX)\n }\n }\n return panels.length > 1\n ? {\n ...whole,\n nodePositions,\n extent: {\n ...(minX <= maxX ? { minX, maxX } : {}),\n minY: 0,\n maxY: y,\n },\n tubeMapPanels: panels,\n }\n : whole\n}\n", "import {\n el\n} from \"./chunk-H2H4Y3TV.js\";\n\n// src/genes/exonOutline.ts\nvar EXON_COLOR = \"#daa520\";\nvar EXON_GAP_PX = 1;\nvar EXON_LINE_PX = 2;\nvar MIN_LANE_PX = 4;\nfunction exonStretches(pins, halfWidthPx, lift, pathOf = (d) => d) {\n const inkPx = (nodeId) => {\n const own = halfWidthPx(nodeId) * 2;\n return lift?.nodeIds.has(nodeId) ? Math.max(own, lift.walks.length * MIN_LANE_PX) : own;\n };\n return pins.flatMap(\n (pin) => pin.exonsByNode.map(({ nodeId, d }) => ({\n key: `${pin.gene.name}-${pin.gene.start}-${nodeId}`,\n d: pathOf(d),\n inner: inkPx(nodeId) + 2 * EXON_GAP_PX\n }))\n );\n}\nfunction exonOutlineTree(stretches, o) {\n if (stretches.length === 0) {\n return void 0;\n }\n const stroke = (s, color, width) => el(\"path\", {\n d: s.d,\n fill: \"none\",\n stroke: color,\n \"stroke-width\": width,\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n \"vector-effect\": o.transform ? \"non-scaling-stroke\" : void 0\n });\n return el(\n \"g\",\n {},\n el(\n \"mask\",\n {\n id: o.id,\n maskUnits: \"userSpaceOnUse\",\n x: 0,\n y: 0,\n width: o.width,\n height: o.height\n },\n el(\n \"g\",\n { transform: o.transform },\n ...stretches.map((s) => stroke(s, \"#fff\", s.inner + 2 * EXON_LINE_PX)),\n ...stretches.map((s) => stroke(s, \"#000\", s.inner))\n )\n ),\n el(\"rect\", {\n width: o.width,\n height: o.height,\n fill: EXON_COLOR,\n mask: `url(#${o.id})`\n })\n );\n}\n\nexport {\n EXON_COLOR,\n exonStretches,\n exonOutlineTree\n};\n", "import {\n GAP_CAUSE_TEXT,\n OUTSIDE_TEXT\n} from \"./chunk-EIY2SKD3.js\";\nimport {\n formatBp,\n groupDigits\n} from \"./chunk-PFRQBCGC.js\";\n\n// src/walkKey.ts\nfunction rangeText(contig, start, end) {\n const s = Math.round(start);\n const e = Math.round(end);\n return `${contig ? `${contig}:` : \"\"}${groupDigits(s)}-${groupDigits(e)} (${formatBp(e - s)})`;\n}\nfunction walkKey(walk, reference) {\n const { field } = walk.encoding;\n const own = walk.range ? rangeText(walk.range.contig, walk.range.start, walk.range.end) : void 0;\n const scale = field === \"progress\" ? own : field === \"reference\" && reference ? rangeText(reference.name, reference.start, reference.end) : void 0;\n const spanned = walk.range ? walk.range.end - walk.range.start : walk.bp;\n const outside = spanned - walk.bp - walk.missingBp - walk.unknownBp;\n const gaps = [\n [walk.missingBp, GAP_CAUSE_TEXT.missing],\n [walk.unknownBp, GAP_CAUSE_TEXT.unknown],\n [outside, OUTSIDE_TEXT]\n ];\n return {\n delta: walk.referenceBp === void 0 || spanned === walk.referenceBp ? \"\" : ` ${spanned > walk.referenceBp ? \"+\" : \"\\u2212\"}${formatBp(Math.abs(spanned - walk.referenceBp))}`,\n gaps: gaps.filter(([bp]) => bp > 0).map(([bp, text]) => `, ${formatBp(bp)} ${text}`).join(\"\"),\n reversed: walk.reversedBp > 0 ? `, ${formatBp(walk.reversedBp)} reversed` : \"\",\n shades: field !== \"walk\",\n scale,\n hover: scale === own ? void 0 : own\n };\n}\nfunction walkPosition(walk, nodeId, length) {\n const progress = walk.progress.get(nodeId);\n const range = walk.range;\n if (progress === void 0 || !range) {\n return void 0;\n }\n const start = Math.round(\n range.start + progress * (range.end - range.start) - length / 2\n );\n return `${range.contig}:${groupDigits(start)}-${groupDigits(start + length)}`;\n}\n\nexport {\n rangeText,\n walkKey,\n walkPosition\n};\n", "import {\n tubeSpan\n} from \"./chunk-HSVFCA2J.js\";\n\n// src/tubeMap/genes.ts\nfunction tubeMapGenes(byRefName, genes) {\n const out = [];\n for (const gene of genes) {\n const boxes = byRefName.get(gene.refName);\n const first = boxes?.[0];\n const last = boxes?.at(-1);\n if (!boxes || !first || !last) {\n continue;\n }\n const start = Math.max(gene.start, first.bp0);\n const end = Math.min(gene.end, last.bp1);\n if (end <= start) {\n continue;\n }\n out.push({\n gene,\n ...tubeSpan(boxes, start, end),\n exons: gene.exons.filter((e) => e.end > start && e.start < end).map(\n (e) => tubeSpan(boxes, Math.max(e.start, start), Math.min(e.end, end))\n )\n });\n }\n return out;\n}\nvar GENE_ROW_PX = 22;\nvar MAX_GENE_ROWS = 4;\nvar EXON_PX = 8;\nvar NAME_FONT = \"11px sans-serif\";\nvar NAME_GAP_PX = 8;\nfunction tubeMapGeneRows(genes) {\n const edges = genes.flatMap((g) => [\n { x: g.x0, step: 1 },\n { x: g.x1, step: -1 }\n ]).sort((a, b) => a.x - b.x || a.step - b.step);\n let depth = 0;\n let most = 0;\n for (const { step } of edges) {\n depth += step;\n most = Math.max(most, depth);\n }\n return Math.min(MAX_GENE_ROWS, most);\n}\nfunction drawTubeMapGenes(ctx, genes, frame, bottom, top = 0) {\n const { x, width, darkMode } = frame;\n const rows = Math.max(1, Math.floor((bottom - top) / GENE_ROW_PX));\n const rowEnds = [];\n const ink = darkMode ? \"#e0e0e6\" : \"#1c1c22\";\n ctx.font = NAME_FONT;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"alphabetic\";\n ctx.fillStyle = ink;\n ctx.strokeStyle = ink;\n ctx.lineWidth = 1;\n const placed = genes.map((g) => ({ g, s0: x(g.x0), s1: x(g.x1) })).filter(({ s0, s1 }) => s1 >= 0 && s0 <= width).sort((a, b) => a.s0 - b.s0);\n for (const { g, s0, s1 } of placed) {\n const arrow = g.gene.strand > 0 ? \" \\u2192\" : g.gene.strand < 0 ? \"\\u2190 \" : \"\";\n const label = g.gene.strand < 0 ? `${arrow}${g.gene.name}` : `${g.gene.name}${arrow}`;\n const mid = (Math.max(s0, 0) + Math.min(s1, width)) / 2;\n const half = ctx.measureText(label).width / 2;\n const left = Math.min(s0, mid - half);\n const right = Math.max(s1, mid + half);\n let row = rowEnds.findIndex((end) => end + NAME_GAP_PX <= left);\n if (row === -1) {\n row = Math.min(rowEnds.length, rows - 1);\n }\n rowEnds[row] = Math.max(rowEnds[row] ?? -Infinity, right);\n const glyphY = bottom - row * GENE_ROW_PX - EXON_PX / 2;\n ctx.beginPath();\n ctx.moveTo(s0, glyphY + 0.5);\n ctx.lineTo(s1, glyphY + 0.5);\n ctx.stroke();\n for (const e of g.exons) {\n const e0 = x(e.x0);\n ctx.fillRect(e0, glyphY - EXON_PX / 2, Math.max(1, x(e.x1) - e0), EXON_PX);\n }\n ctx.fillText(label, mid, glyphY - EXON_PX / 2 - 2);\n }\n}\n\nexport {\n tubeMapGenes,\n GENE_ROW_PX,\n tubeMapGeneRows,\n drawTubeMapGenes\n};\n", "import {\n LIFT_BACKDROP_CSS,\n computeColorSchemeRange,\n getNodeColor\n} from \"./chunk-SWCULW6S.js\";\nimport {\n abgrToCssRgba\n} from \"./chunk-G2FD7S3C.js\";\nimport {\n isBackbone\n} from \"./chunk-RJWPJCIB.js\";\n\n// src/referenceStrip.ts\nvar REFERENCE_STRIP_PX = 12;\nvar REFERENCE_STRIP_ZONE_PX = REFERENCE_STRIP_PX + 8;\nvar OVERHANG_PX = 8;\nvar OVERHANG_CAP_PX = OVERHANG_PX + 3;\nvar MIN_STAGGER_PX = 12;\nfunction referenceStripBlocks(graph, {\n colorScheme,\n referenceRamp,\n walks\n}) {\n const range = computeColorSchemeRange(graph, referenceRamp);\n const out = [];\n graph.nodes.forEach((node, index) => {\n if (isBackbone(node)) {\n const colors = walks ? walks.map((w) => {\n const lane = w.colors.get(node.id);\n return lane === void 0 ? LIFT_BACKDROP_CSS : abgrToCssRgba(lane);\n }) : [abgrToCssRgba(getNodeColor(node, index, colorScheme, range))];\n out.push({\n node: node.id,\n bp0: node.stable.start,\n bp1: node.stable.start + node.length,\n colors,\n faded: colors.includes(LIFT_BACKDROP_CSS)\n });\n }\n });\n return out.sort((a, b) => a.bp0 - b.bp0);\n}\nfunction span(frame, bp0, bp1) {\n const a = bp0 * frame.scale + frame.translateX;\n const b = bp1 * frame.scale + frame.translateX;\n return a < b ? [a, b] : [b, a];\n}\nvar HIT_SLOP_PX = 2;\nfunction stripOverhang(blocks, frame, width) {\n const a = -frame.translateX / frame.scale;\n const b = (width - frame.translateX) / frame.scale;\n const lo = Math.min(a, b);\n const hi = Math.max(a, b);\n let below = 0;\n let above = 0;\n for (const block of blocks) {\n below += Math.max(0, Math.min(block.bp1, lo) - block.bp0);\n above += Math.max(0, block.bp1 - Math.max(block.bp0, hi));\n }\n return frame.scale >= 0 ? { left: Math.round(below), right: Math.round(above) } : { left: Math.round(above), right: Math.round(below) };\n}\nfunction stripBlockAt(blocks, frame, sx, sy) {\n if (sy < 0 || sy > REFERENCE_STRIP_PX + HIT_SLOP_PX) {\n return void 0;\n }\n let hit;\n let best = HIT_SLOP_PX;\n for (const b of blocks) {\n const [x0, x1] = span(frame, b.bp0, b.bp1);\n const dist = Math.max(0, x0 - sx, sx - x1);\n if (dist <= best) {\n best = dist;\n hit = b.node;\n }\n }\n return hit;\n}\nfunction nodeAnchor(segments, toScreen) {\n const p = segments?.[Math.floor(segments.length / 2)];\n return p ? toScreen(p) : void 0;\n}\nfunction stripPixels(blocks, frame, width, dpr) {\n const placed = blocks.map((b) => {\n const [x0, x1] = span(frame, b.bp0, b.bp1);\n const px0 = Math.round(x0 * dpr);\n return {\n colors: b.colors,\n x0,\n px0,\n px1: Math.max(Math.round(x1 * dpr), px0 + 1)\n };\n }).filter((b) => b.px1 > 0 && b.px0 < width * dpr).sort((a, b) => a.x0 - b.x0);\n const out = [];\n let claimed = -Infinity;\n const tierEnds = [-Infinity, -Infinity];\n for (const { colors, px0, px1 } of placed) {\n const start = Math.max(px0, claimed);\n if (px1 > start) {\n const tier = tierEnds[0] < start ? 0 : 1;\n tierEnds[tier] = px1;\n out.push({ colors, x0: start / dpr, x1: px1 / dpr, tier });\n claimed = px1;\n }\n }\n const covered = out.length > 0 ? out.at(-1).x1 - out[0].x0 : 0;\n return covered >= out.length * MIN_STAGGER_PX ? out : out.map(({ tier: _, ...b }) => b);\n}\nfunction drawOverhang(ctx, edgeX, inward, ink) {\n const capX = inward > 0 ? edgeX : edgeX - OVERHANG_CAP_PX;\n ctx.clearRect(capX, 0, OVERHANG_CAP_PX, REFERENCE_STRIP_PX);\n const tipX = edgeX + inward;\n const baseX = tipX + inward * OVERHANG_PX;\n ctx.beginPath();\n ctx.moveTo(tipX, REFERENCE_STRIP_PX / 2);\n ctx.lineTo(baseX, 0);\n ctx.lineTo(baseX, REFERENCE_STRIP_PX);\n ctx.closePath();\n ctx.fillStyle = ink;\n ctx.fill();\n}\nfunction rowEdge(row, rows, dpr) {\n return Math.round(row * REFERENCE_STRIP_PX * dpr / rows) / dpr;\n}\nfunction drawReferenceStrip(ctx, blocks, frame, {\n width,\n lit,\n darkMode,\n dpr = 1\n}) {\n const ink = darkMode ? \"#ffffff\" : \"#18181c\";\n ctx.clearRect(0, 0, width, REFERENCE_STRIP_ZONE_PX);\n for (const b of stripPixels(blocks, frame, width, dpr)) {\n const { tier } = b;\n const staggered = tier !== void 0 && b.colors.length === 1;\n const rows = staggered ? 2 : b.colors.length;\n b.colors.forEach((color, i) => {\n const row = staggered ? tier : i;\n const y0 = rowEdge(row, rows, dpr);\n ctx.fillStyle = color;\n ctx.fillRect(b.x0, y0, b.x1 - b.x0, rowEdge(row + 1, rows, dpr) - y0);\n });\n }\n const overhang = stripOverhang(blocks, frame, width);\n if (overhang.left > 0) {\n drawOverhang(ctx, 0, 1, ink);\n }\n if (overhang.right > 0) {\n drawOverhang(ctx, width, -1, ink);\n }\n if (lit) {\n const [x0, x1] = span(frame, lit.start, lit.end);\n const w = Math.max(x1 - x0, 3);\n const left = (x0 + x1) / 2 - w / 2;\n ctx.strokeStyle = ink;\n ctx.lineWidth = 1.5;\n ctx.strokeRect(left, 0.75, w, REFERENCE_STRIP_PX - 1.5);\n if (lit.anchor) {\n ctx.beginPath();\n ctx.moveTo(left + w / 2, REFERENCE_STRIP_PX);\n ctx.lineTo(lit.anchor.x, lit.anchor.y);\n ctx.lineWidth = 1;\n ctx.stroke();\n }\n }\n}\n\nexport {\n REFERENCE_STRIP_PX,\n REFERENCE_STRIP_ZONE_PX,\n referenceStripBlocks,\n stripOverhang,\n stripBlockAt,\n nodeAnchor,\n stripPixels,\n drawReferenceStrip\n};\n", "import type { RepeatCall } from './repeatFeatures'\n\n// Which genotyped allele belongs to which haplotype walk. A VCF states a\n// sample's alleles in genotype order, which is the genotyper's own order and\n// carries no correspondence to the assembly's haplotype numbering \u2014 TRGTdb's\n// ABCA7 record, for one, lists them shortest first. So the walks and the\n// alleles are paired by length instead: the pairing whose total difference is\n// smallest, which for lengths on a line is the non-crossing one.\n//\n// A walk that does not reach both flanking reference nodes is measured whole\n// rather than across the array, and an allele no read spanned is a copy of the\n// one that was called. Neither states a length for this array, so they pair\n// last and take no verdict \u2014 pairing them first let a walk that stops inside\n// the array take the allele that fit one spanning it, and the spanning walk\n// then read as a disagreement.\n\ninterface WalkCall extends RepeatCall {\n // undefined where the walk and the allele are not both measurements\n agrees?: boolean\n}\n\n// Every walk/call pair over the 94 HPRC samples TRGT genotyped at the ABCA7\n// VNTR is either within 8% of its allele or more than 14% from it, so any\n// threshold across that gap separates them the same way.\nexport const CALL_TOLERANCE = 0.1\n\nfunction agrees(walkBp: number, callBp: number) {\n return Math.abs(callBp - walkBp) <= CALL_TOLERANCE * Math.max(walkBp, callBp)\n}\n\n// Pair two ascending lists of lengths, leaving out the surplus of whichever is\n// longer. `out[i]` is the index in `calls` that `walks[i]` took.\nfunction nearest(walks: number[], calls: number[]) {\n const W = walks.length\n const C = calls.length\n const cost = Array.from({ length: W + 1 }, () => new Array(C + 1).fill(0))\n const paired = Array.from({ length: W + 1 }, () =>\n new Array<boolean>(C + 1).fill(false),\n )\n for (let i = W - 1; i >= 0; i--) {\n for (let j = C - 1; j >= 0; j--) {\n const together = Math.abs(walks[i]! - calls[j]!) + cost[i + 1]![j + 1]!\n const dropWalk = W - i > C - j ? cost[i + 1]![j]! : Infinity\n const dropCall = C - j > W - i ? cost[i]![j + 1]! : Infinity\n cost[i]![j] = Math.min(together, dropWalk, dropCall)\n paired[i]![j] = cost[i]![j] === together\n }\n }\n const out = new Array<number | undefined>(W).fill(undefined)\n for (let i = 0, j = 0; i < W && j < C;) {\n if (paired[i]![j]) {\n out[i++] = j++\n } else if (W - i > C - j) {\n i++\n } else {\n j++\n }\n }\n return out\n}\n\nfunction byLength<T>(items: T[], bp: (item: T) => number) {\n return items\n .map((item, i) => ({ item, i }))\n .sort((a, b) => bp(a.item) - bp(b.item))\n}\n\nconst backed = (call: RepeatCall) => call.spanningReads !== 0\n\nfunction scored(row: { bp: number; complete: boolean }, call: RepeatCall) {\n return {\n ...call,\n agrees: row.complete && backed(call) ? agrees(row.bp, call.bp) : undefined,\n }\n}\n\n// A phased genotype names its walk's haplotype outright, though a contig\n// break can give that haplotype two walks. Within a haplotype, and among the\n// unphased alleles, pairing goes by length: the walks that span the array\n// against the alleles reads spanned, then everything else against what those\n// two left. That decides the ambiguous cases on merit: which walk takes the\n// one allele a lone spanning read supports, and which allele a walk that stops\n// inside the array is drawn against.\nfunction pairSample<\n R extends { bp: number; complete: boolean; haplotype?: number },\n>(rows: R[], calls: RepeatCall[]) {\n const out = new Map<number, WalkCall>()\n const taken = new Set<RepeatCall>()\n const ranked = byLength(rows, r => r.bp)\n const pair = (pool: typeof ranked, group: RepeatCall[]) => {\n const stages = [\n [pool.filter(r => r.item.complete), group.filter(backed)],\n [pool, group],\n ] as const\n for (const [walks, alleles] of stages) {\n const free = walks.filter(r => !out.has(r.i))\n const open = byLength(\n alleles.filter(call => !taken.has(call)),\n call => call.bp,\n )\n nearest(\n free.map(r => r.item.bp),\n open.map(c => c.item.bp),\n ).forEach((pick, k) => {\n if (pick !== undefined) {\n const row = free[k]!\n const call = open[pick]!.item\n taken.add(call)\n out.set(row.i, scored(row.item, call))\n }\n })\n }\n }\n for (const haplotype of new Set(calls.flatMap(c => c.haplotype ?? []))) {\n pair(\n ranked.filter(r => r.item.haplotype === haplotype),\n calls.filter(c => c.haplotype === haplotype),\n )\n }\n pair(\n ranked,\n calls.filter(c => c.haplotype === undefined),\n )\n return out\n}\n\nexport function withCalls<\n R extends {\n sample: string\n bp: number\n complete: boolean\n haplotype?: number\n },\n>(rows: R[], calls: Record<string, RepeatCall[]> | undefined) {\n if (!calls) {\n return rows as (R & { call?: WalkCall })[]\n }\n const paired = new Map<R, WalkCall>()\n const bySample = new Map<string, R[]>()\n for (const row of rows) {\n const group = bySample.get(row.sample)\n if (group) {\n group.push(row)\n } else {\n bySample.set(row.sample, [row])\n }\n }\n for (const [sample, group] of bySample) {\n const called = calls[sample]\n if (called) {\n for (const [i, call] of pairSample(group, called)) {\n paired.set(group[i]!, call)\n }\n }\n }\n return rows.map(row => ({ ...row, call: paired.get(row) }))\n}\n", "import { getDpr } from '@jbrowse/bandage-core/renderer/canvas'\nimport { observable, runInAction } from 'mobx'\n\nconst ratio = observable.box(\n typeof devicePixelRatio === 'undefined' ? 1 : devicePixelRatio,\n)\n\n// A resolution query matches one ratio, so each change re-arms it for the next\nfunction watch() {\n matchMedia(`(resolution: ${devicePixelRatio}dppx)`).addEventListener(\n 'change',\n () => {\n runInAction(() => {\n ratio.set(devicePixelRatio)\n })\n watch()\n },\n { once: true },\n )\n}\n\nif (typeof matchMedia === 'function') {\n watch()\n}\n\n// getDpr() that an autorun or computed re-runs on: a browser zoom or a move to\n// another monitor changes the ratio with no event MobX would otherwise see.\n// Code painting a 2D context directly passes the canvas size, as\n// syncCanvasSize does; a Renderer's transform omits it and the renderer fits.\nexport function trackedDpr(width = 0, height = 0) {\n ratio.get()\n return getDpr(width, height)\n}\n"],
5
- "mappings": "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",
6
- "names": ["FACET_GAP_PX", "FACET_TITLE_PX", "FACET_PAD_PX", "MIN_FACET_PANEL_PX", "facetGrid", "count", "bounds", "pixelRows", "width", "room", "columns", "tile", "across", "rows", "panelWidth", "panelRoom", "fitX", "fitY", "scale", "drawn", "height", "best", "grid", "FACET_FIELDS", "facetSettingOf", "facet", "raw", "domainFirst", "names", "domain", "rank", "name", "i", "listed", "a", "b", "facetCells", "by", "wrapOrder", "wrap", "places", "fields", "panSNFields", "p", "cells", "orientToReference", "graph", "positions", "backbone", "node", "isBackbone", "points", "segments", "mid", "weight", "sum", "p", "cx", "cy", "cr", "sxr", "syr", "angle", "c", "s", "out", "id", "x", "y", "below", "above", "LANE_GAP", "referenceSeeds", "graph", "scaling", "opts", "drawn", "node", "drawnNodeLength", "drawnOf", "id", "backbone", "isBackbone", "a", "b", "seeds", "x", "adjacent", "buildNeighbors", "depth", "queue", "at", "next", "neighbour", "unreached", "seededNodes", "STEP_TURN", "turnAt", "line", "i", "a", "b", "c", "t", "centripetal", "p0", "p1", "p2", "p3", "u", "knot", "t1", "t2", "t3", "lerp", "ta", "tb", "f", "a1", "a2", "a3", "reflect", "p", "about", "smoothChain", "out", "steps", "s", "ROUTE_FRACTION", "withDeletionRoutes", "graph", "deletions", "dropped", "routes", "d", "ROUTE_ID", "edges", "edge", "ei", "id", "fromStrand", "toStrand", "routeNodes", "drawnOf", "opts", "lengths", "n", "skipped", "sum", "id2", "drawn", "takeRoutes", "positions", "nodePositions", "deletionRoutes", "edgeIndex", "route", "parseTag", "tag", "tags", "nameEnd", "typeEnd", "name", "type", "val", "parseTags", "fields", "field", "stableCoordinate", "node", "SN", "SO", "SR", "GT", "LT", "parseWalkBody", "body", "segments", "strand", "start", "push", "end", "i", "ch", "parseGFA", "file", "graph", "rawLine", "line", "rest", "len", "seq", "tagfields", "gfa1", "first", "source", "target", "cigar", "strand1", "strand2", "sample", "hap", "contig", "path", "surveySegments", "gfaGraph", "pathSteps", "canonical", "traversals", "claim", "id", "strand", "traverse", "seen", "link", "steps", "step", "walk", "walkStart", "w", "stepsOfPath", "p", "pathOrigin", "segment", "anchorablePaths", "carriedSamples", "gfaNode", "sm", "samples", "s", "positive", "v", "statedDepth", "tags", "length", "count", "makeNode", "depth", "stableCoordinate", "convertGFAToGraph", "name", "nodes", "edges", "nodeIds", "nodeId", "segmentId", "lengths", "paths", "pathsByPair", "pairPaths", "a", "b", "addPair", "set", "to", "edgePaths", "edge", "recordPathEdges", "nodeIds2", "name2", "i", "start", "seg", "walkStopFields", "pathIds", "anchoring", "surveyPaths", "n", "pLineName", "name", "start", "end", "namesByList", "lists", "names", "listCount", "pathNames", "starts", "list", "i", "fill", "grouped", "listed", "_", "out", "k", "graphFromTables", "n", "l", "w", "count", "declared", "canonical", "claim", "node", "reversed", "drawnWalks", "p", "traversals", "s", "ids", "segment", "nodes", "ref", "edges", "neighbours", "pairList", "a", "b", "near", "j", "addPair", "edgeLists", "adjacency", "adjacentNode", "adjacentList", "listOf", "nameIndex", "crossedList", "crossedName", "crossings", "lastWalk", "paths", "anchorPaths", "totalSteps", "visitPath", "visitStart", "visitReversed", "visitOrder", "blocks", "pathSamples", "edgeNameIndex", "edgeNames", "walkName", "fields", "panSNFields", "visitName", "pathName", "named", "panSNSample", "edgeNamed", "visitSample", "first", "nodeIds", "pos", "prev", "at", "stopFields", "stopAt", "listNames", "edge", "walked", "PathVisits", "graphOf", "source", "name", "graphFromTables", "tables", "gfaTables", "convertGFAToGraph", "parseGFA", "loadGraph", "opts", "graph", "anchorGraph", "ENGINE_DEFAULTS", "engineSettingsOf", "s", "COMPONENT_SEPARATION", "engineRequest", "scaling", "settings", "anchored", "isBackbone", "spaced", "seededNodes", "engineKey", "forceLayout", "engine", "spread", "spreadFor", "deletions", "dropped", "deletionDrawing", "deletionEdges", "routed", "withDeletionRoutes", "merged", "mergeRuns", "runs", "n", "engineScaling", "layoutScaling", "result", "duration", "routeNodes", "drawnLengthOf", "drawn", "drawnNodeLength", "smoothed", "id", "line", "smoothChain", "positions", "splitRuns", "nodePositions", "deletionRoutes", "takeRoutes", "orientToReference", "layoutExtent", "minX", "minY", "maxX", "maxY", "segments", "seg", "FIT_PADDING", "MIN_ZOOM", "MAX_ZOOM", "clampZoom", "zoom", "fittedTranslateY", "bounds", "usableHeight", "yScale", "padTop", "leftoverY", "fitTransform", "paneWidth", "paneHeight", "pixelRows", "minScale", "padLeft", "padRight", "padBottom", "usableWidth", "fitX", "fitY", "scale", "leftoverX", "drawingBounds", "layout", "region", "extent", "DEFAULT_SIZE", "createForceLayoutCache", "size", "caches", "cacheOf", "graph", "cache", "settings", "engine", "key", "engineKey", "hit", "started", "entry", "forceLayout", "r", "from", "to", "axisScaleOf", "scale", "pixelRows", "viewportOf", "t", "axis", "width", "height", "padded", "v", "panes", "w", "h", "contains", "outer", "inner", "zoomAbout", "factor", "centerX", "centerY", "clampZoom", "ratio", "screenToLayout", "x", "y", "host", "read", "name", "RenderLifecycleMixin", "RenderLifecycleMixin_default", "knownOrUnset", "values", "value", "lenientMaybeEnum", "types", "lenientOptionalEnum", "fallback", "MAX_CANVAS_HEIGHT", "MIN_CANVAS_HEIGHT", "PAPER", "PAPER_CSS", "MIN_FIT_TUBE_PX", "TUBE_MAP_MODES", "ChooseSamplesDialog", "lazy", "ChooseWalksDialog", "HighlightColorDialog", "WALK_MENU_ITEMS", "TUBE_MAP_FOLDS", "bubblePrefix", "adapterConfig", "uri", "SEGMENTS_SUFFIX", "HOVER_BRIGHTEN", "SELECT_BRIGHTEN", "VIEWPORT_DEBOUNCE_MS", "VIEWPORT_PANES_BUILT", "WALK_GENE_ROWS", "TUBE_MAP_ROUTES", "EMPTY_BATCH", "dependOn", "_values", "MAX_GRAPH_REGION_BP", "formatSpanBp", "bp", "DEFAULT_MAX_GRAPH_NODES", "fileName", "location", "uriOf", "geometryPainted", "model", "paneViewportOf", "width", "height", "viewportOf", "forceLayouts", "createForceLayoutCache", "paneBase", "types", "RenderLifecycleMixin", "lenientOptionalEnum", "LAYOUT_ENGINE_VALUES", "BUBBLE_SPREAD_VALUES", "n", "v", "alpha", "paint", "css", "m", "opacity", "paintAttrs", "kind", "color", "DOT_PX", "DOT_CELL_PX", "svgCanvas", "width", "height", "out", "subpaths", "start", "x", "y", "s", "reach", "points", "i", "pathData", "dots", "seen", "cell", "ctx", "cx0", "cy0", "cx1", "cy1", "d", "w", "h", "canvas", "MAX_DPR", "MAX_CANVAS_DIM_PX", "getDpr", "width", "height", "dpr", "syncCanvasSize", "canvas", "pw", "ph", "cssWidth", "cssHeight", "Canvas2DRenderer", "canvas", "ctx", "_handler", "width", "height", "syncCanvasSize", "getDpr", "batch", "factors", "edgeIndex", "factor", "transform", "t", "k", "clearColor", "normalizedRgbToCssRgba", "edgeRun", "color", "items", "groupByPaint", "e", "i", "inRun", "brightenAbgr", "lifted", "s", "f", "arrowRun", "a", "curves", "runItems", "arrows", "runs", "nodeId", "run", "abgrToCssRgba", "first", "c", "p0", "l", "p", "tip", "left", "notch", "right", "arrowheadOutline", "ARROW_NOTCH", "ux", "uy", "tipX", "tipY", "length", "halfWidth", "backX", "backY", "notchBack", "paintOf", "groups", "deferred", "item", "weight", "last", "into", "key", "group", "FALLBACK_CELL_SIZE", "meanExtentCellSize", "extentTotal", "count", "rowPitchOf", "boxes", "distinct", "min", "max", "box", "cellSizeFrom", "extentX", "extentY", "x", "resolveCellSize", "given", "getOrCreateCell", "cells", "cx", "cy", "row", "cell", "addToGrid", "cellSize", "minX", "minY", "maxX", "maxY", "entry", "cx0", "cx1", "cy0", "cy1", "queryGrid", "y", "radiusX", "radiusY", "results", "seen", "SpatialIndex", "nodePositions", "nodeId", "segments", "seg", "next", "b", "EdgeSpatialIndex", "graph", "drawPaths", "axis", "deletions", "version", "routes", "stranded", "baseEdgeCurves", "ei", "edge", "fromSegments", "toSegments", "curves", "curveBounds", "numPaths", "padX", "padY", "o", "pathRibbonOffsets", "distanceToSegment", "px", "py", "x1", "y1", "x2", "y2", "dx", "dy", "lenSq", "t", "distanceToCubicBezier", "c", "minDist", "samples", "lastX", "lastY", "u", "bx", "by", "distanceToEdgeCurves", "curves", "yToX", "d", "nodeCache", "weakMemo", "getSpatialIndex", "nodePositions", "version", "SpatialIndex", "edgeCache", "getEdgeSpatialIndex", "graph", "drawPaths", "axis", "deletions", "routes", "stranded", "EdgeSpatialIndex", "MIN_NODE_REACH_PX", "findHoveredNode", "graphX", "graphY", "ink", "yToXOf", "index", "reach", "queryReach", "candidates", "hovered", "best", "nodeId", "segmentIdx", "segments", "dist", "segmentMeetsBox", "a", "b", "box", "t0", "t1", "p", "q", "nodesUnderBox", "screen", "hits", "line", "findHoveredEdge", "hiddenEdges", "deletionRoutes", "edgeThreshold", "edgeIndex", "edgeIdx", "edge", "fromSegments", "toSegments", "numPaths", "baseCurves", "offset", "pathRibbonOffsets", "translateCurves", "HALO_FACTOR", "LEGEND_INSET_PX", "GENE_PIN_DROP_PX", "GENE_STACK", "BUBBLE_STACK", "TOPMOST_BASELINE", "LABEL_PX", "LABEL_PAD", "geneCoverageNote", "pin", "length", "per", "unit", "amount", "bp", "geneLabelCandidates", "pins", "screen", "contigThickness", "nodesUnder", "ink", "byExtent", "x", "y", "note", "box", "id", "items", "extent", "a", "b", "layoutLabels", "m", "width", "height", "translateX", "translateY", "scaleX", "scaleY", "frame", "p", "reserved", "label", "rowLabelBox", "stripPx", "LABEL_CHAR_PX", "take", "occupancy", "onRows", "rowsTop", "r", "halo", "above", "h", "gap", "baseline", "byBubble", "bubbles", "placeLabels", "ticks", "t", "genes", "nodesUnderBox", "sizes", "graphLabels", "host", "read", "name", "autorun", "read", "computed", "read", "observable", "read", "reaction", "read", "runInAction", "read", "untracked", "read", "mobx_default", "host", "canonicalStrand", "node", "stepName", "strand", "stepStarts", "lengths", "total", "starts", "head", "i", "tail", "j", "mismatchesByStep", "record", "byStep", "known", "start", "s", "startOf", "k", "endOf", "first", "stepAt", "pos2", "end", "unplacedFrom", "add", "mismatch", "list", "last", "pos", "op", "parseCs", "at", "left", "take", "tubeMapReads", "graph", "records", "firstId", "nodeByName", "n", "reads", "nodes", "step", "kept", "mismatches", "names", "lastLength", "FORWARD_READ_COLORS", "REVERSE_READ_COLORS", "readColor", "read", "colors", "el", "tag", "attrs", "children", "c", "escapeText", "s", "escapeAttr", "serializeEl", "node", "v", "k", "ON_REFERENCE", "OFF_REFERENCE", "OUTSIDE_CUT", "MISSING_INK", "UNKNOWN_GAP", "GENE_INK", "BAR_PX", "GAP_PX", "MISSING_PX", "LABELLED_ROW_PX", "MIN_TILED_BAR_PX", "MIN_TILE_PX", "kb", "bp", "signedLength", "delta", "size", "units", "unit", "near", "refName", "start", "panSNContig", "gapsText", "gapBp", "runs", "gaps", "r", "g", "OUTSIDE_TEXT", "bpOf", "cause", "sum", "places", "GAP_CAUSE_TEXT", "text", "walkRowReadout", "row", "reference", "call", "complete", "stop", "outside", "called", "against", "region", "why", "readoutPlacement", "endX", "width", "x", "LABEL_CHAR_PX", "unitTicks", "pxPerBp", "ticks", "k", "gapStyle", "runPaint", "run", "ramp", "REFERENCE_RAMP_ALT_CSS", "stops", "rampStops", "rampHueCss", "alongRow", "axis", "end", "rowSpan", "placeRowGenes", "rows", "byRow", "placed", "row", "genes", "axis", "clip", "start", "end", "g", "alongRow", "e", "a", "b", "GENE_FONT_PX", "GENE_CHAR_PX", "MIN_LETTERED_BAR_PX", "genePad", "rowPx", "barPx", "boxesGenes", "rowGeneBoxes", "X", "y", "ROW_HEIGHT_PX", "BAR_PX", "pad", "boxes", "x", "taken", "named", "w", "half", "at", "box", "rowsText", "n", "walkRowsKey", "bars", "o", "entries", "RAMP_GRADIENT_CSS", "ON_REFERENCE", "REFERENCE_RAMP_ALT_CSS", "OFF_REFERENCE", "gaps", "run", "labels", "gapStyle", "cause", "fill", "px", "label", "CALL_TICK", "UNBACKED_TICK", "DISAGREES", "callTickInk", "call", "walkRowsKeyTree", "idPrefix", "parts", "rampId", "ramp", "el", "RAMP_GRADIENT_STOPS", "s", "swatch", "GENE_INK", "text", "LABEL_CHAR_PX", "p", "rowPitch", "count", "room", "minRowPx", "fit", "LABELLED_ROW_PX", "coalesceRuns", "runs", "pxPerBp", "minBp", "out", "bucket", "flush", "on", "off", "r", "onReference", "lead", "held", "geneTree", "walkRowsTree", "frame", "bp", "overhang", "Y", "origin", "unit", "reference", "along", "offset", "prefix", "rowTree", "i", "drawn", "paint", "runPaint", "h", "id", "rect", "color", "k", "ticks", "MIN_TILED_BAR_PX", "unitTicks", "walkRowReadout", "readoutPlacement", "readouts", "REPEAT_GROWTH", "coveringRepeat", "b", "repeats", "span", "growth", "SUPERBUBBLE_SEGMENTS", "formatBpRange", "shortest", "longest", "low", "formatBp", "high", "unit", "routes", "count", "SATURATED_PATH_COUNT", "classifyBubble", "c", "classifyShape", "refSpan", "pathCount", "segmentCount", "inversion", "range", "sameLength", "repeat", "name", "alleles", "bp", "BUBBLE_KIND_COLORS", "BUBBLE_KIND_NAMES", "bubbleSegmentIds", "referenceBoxes", "graph", "layout", "nodeById", "n", "byRefName", "node", "index", "graphNode", "isBackbone", "refName", "start", "pushTo", "boxes", "a", "b", "tubeX", "bp", "isEnd", "i", "partitionPoint", "j", "boxX", "box", "span", "tubeSpan", "end", "rulerBoxes", "best", "TICK_PX", "LABEL_GAP_PX", "TARGET_TICK_PX", "MIN_BRACKET_PX", "rulerInk", "darkMode", "niceStep", "raw", "pow", "m", "placeLabels", "candidates", "placed", "text", "at", "scaleMarks", "x", "width", "measure", "first", "last", "from", "to", "bpSpan", "step", "ticks", "positions", "sx", "boxMarks", "shown", "s0", "s1", "label", "position", "spans", "lengths", "boundaries", "length", "formatBp", "ends", "rulerMarks", "referenceAxis", "drawTubeMapRuler", "ctx", "frame", "top", "marks", "ink", "y", "x0", "x1", "tubeMapConnectors", "boxes", "bpToScreen", "tubeToScreen", "width", "out", "box", "bottom0", "bottom1", "HIT_SLOP_PX", "connectorAt", "connectors", "zoneBottom", "sx", "sy", "t", "hit", "best", "c", "a", "b", "dist", "band", "ctx", "bottom", "sides", "drawTubeMapConnectors", "highlightNode", "darkMode", "ink", "drawLitConnector", "node", "lit", "sampleOf", "path", "panSNSample", "labelOf", "NodeTable", "graph", "node", "id", "i", "nodes", "k", "steps", "stepsOf", "pieces", "table", "out", "gaps", "end", "previous", "piece", "gapParts", "bp", "stepSpan", "at", "found", "pos", "len", "sliceBetween", "region", "flanked", "onReference", "referenceStart", "referenceEnd", "i0", "i1", "bestEnd", "bestStart", "end2", "start", "ids2", "spanAt", "flank", "near", "d", "j", "after", "ids", "last", "stop", "filterSamples", "rows", "samples", "r", "a", "b", "referenceWalkName", "names", "p", "pathOrigin", "rankZero", "n", "walkRows", "unit", "paths", "nameOf", "referenceName", "referencePieces", "first", "others", "walks", "groupBy", "cut", "referenceNodes", "nodeCount", "reachesBefore", "reachesAfter", "rowOf", "paths2", "complete", "from", "to", "contig", "panSNContig", "axisSpan", "axis", "lengths", "referenceStart2", "runs", "offReferenceBp", "gapBp", "step", "backwards", "parts", "partBp", "why", "on", "forward", "backward", "groupBy", "items", "key", "groups", "item", "k", "group", "NOT_SAMPLES", "parsePanSN", "name", "sample", "haplotype", "contig", "READ_FACET_FIELDS", "FACET_FIELDS", "DEFAULT_CHAR_WIDTH", "layersFrom", "layers", "coarsenedReadView", "showReads", "hasReads", "coarsen", "stat", "banded", "statOf", "data", "layer", "configFrom", "options", "emptyTrackShapes", "emptyState", "config", "layoutTubeMap", "inputNodes", "inputTracks", "inputReads", "topology", "layoutTopology", "placeTubeMap", "measurements", "arrangeTopology", "everything", "place", "node", "placeSubset", "selectTracks", "selectReads", "tracks", "reads", "bandIdBase", "measured", "state", "i", "read", "t", "straightenTrack", "generateNodeMap", "generateTrackIndexSequences", "generateNodeWidth", "generateNodeSuccessors", "generateNodeOrder", "reverseReversedReads", "mergeNodes", "generateNodeDegree", "switchNodeOrientation", "getMaxOrder", "mappingQualityCutoff", "focusReadNames", "facet", "focus", "facetHoldsRead", "references", "track", "kept", "sampleOf", "parsePanSN", "place", "topology", "tracks", "reads", "x", "bandIdBase", "state", "emptyState", "node", "i", "track", "read", "layers", "ignoreStrand", "haplotypeBandIdBase", "COARSENED_ID_BASE", "haplotypeBands", "statOf", "bandHaplotypes", "calculateTrackWidth", "generateLaneAssignment", "generateReadOnlyNodeAttributes", "readBands", "buildCoarsenedSyntheticBands", "coarsened", "data", "unit", "banding", "reverseReversedReads", "generateTrackIndexSequences", "b", "placeReads", "generateNodeXCoords", "generateSVGShapesFromPath", "getImageDimensions", "isReverse", "nodeName", "forward", "reverse", "flip", "isForwardIndex", "n", "straightenTrack", "index", "nodesToInvert", "visitedForward", "visit", "sequence", "j", "getReverseComplement", "orderY", "setMapToMax", "step", "map", "key", "value", "existing", "READ_WIDTH", "assignReadsToNodes", "idx", "segment", "pathIdx", "basicPath", "sortedNodes", "compareNodesByOrder", "sets", "layer", "source", "set", "orderedSets", "a", "topMargin", "placeReadSet", "bottomY", "calculateBottomY", "elementsWithoutNode", "prevSegment", "nextSegment", "seg", "element", "previousVisitToNode", "nextVisitToNode", "betweenCycleReverseTraversal", "compareNoNodeReads", "toPlace", "incomingReads", "readID", "outgoingReads", "internalReads", "startY", "incomingKeys", "entry", "path", "decisionStep", "foundY", "k", "y", "compareIncomingReadKeys", "currentY", "occupiedUntil", "readElement", "setOccupiedUntil", "maxY", "compareReadOutgoingSegmentsByGoingTo", "occupiedFrom", "firstNodeOffset", "occUntil", "incReadElementIndices", "incRead", "incReadPathElement", "compareInternalReads", "readIdx", "currentRead", "finalNodeCoverLength", "heightIncrease", "adjustVertically3", "pathIndex", "readA", "readB", "segmentA", "segmentB", "prevNodeA", "prevNodeB", "aPrev", "bPrev", "aReverse", "bReverse", "readIndexA", "pathIndexA", "readIndexB", "pathIndexB", "lastYA", "lastYB", "nodeAt", "nextVisit", "next", "nodeA", "nodeB", "compareTrackByInitialOrdering", "trackA", "trackB", "pathA", "pathB", "AIndex", "BIndex", "trackAOrder", "trackBOrder", "idxA", "idxB", "pass", "order", "isForward", "currentNodeIndex", "currentNodeIsForward", "currentNode", "previousNode", "previousNodeIsForward", "sequenceLength", "nodeByName", "mm", "mirroredMismatch", "firstOffset", "firstLen", "lastLen", "span", "COMPLEMENT", "s", "result", "tracksOrReads", "signedIndexOf", "signed", "NODE_HORIZONTAL_SLACK", "bounds", "rectangles", "verticalRectangles", "curves", "shapes", "xStart", "xEnd", "generateNodeMap", "nodeMap", "generateNodeSuccessors", "successorSets", "predecessorSets", "addEdges", "current", "follower", "generateNodeOrderOfSingleTrack", "forwardOrder", "backwardOrder", "minOrder", "nodeIndex", "increaseOrderForAllNodes", "generateNodeOrderTrackBeginning", "anchorIndex", "anchorSeqVal", "currentOrder", "increment", "UNREACHABLE_ORDER", "fillUnassignedOrders", "orders", "compactOrders", "used", "rank", "generateNodeOrder", "modifiedSequence", "rightIndex", "leftIndex", "tracksAndReads", "reachability", "uninvert", "increaseOrderForSuccessors", "isSuccessor", "first", "second", "scratch", "stamp", "generation", "stack", "childIndex", "getMaxOrder", "max", "v", "amount", "startingNode", "tabuNode", "newOrder", "increasedOrders", "queue", "head", "currentNodeOrder", "successor", "predecessor", "generateNodeDegree", "switchNodeOrientation", "switchNodeOrientationForPaths", "paths", "pivotPath", "scores", "onPivot", "indexSequence", "last", "prevOrder", "nextOrder", "vote", "currentX", "nextX", "extra", "calculateExtraSpace", "RISE_KNEE", "riseExtra", "rise", "slots", "leftSideEdges", "rightSideEdges", "fallAngleAdjustment", "prevSeg", "byNode", "trackID", "segmentID", "assignment", "generateSingleLaneAssignment", "getIdealLanesAndCoords", "laneSum", "from", "segmentToTheLeft", "leftOrder", "currentLane", "potentialAdjustmentValues", "prevNameIsNull", "prevTrack", "compareByIdealLane", "placed", "width", "adjustVertically", "verticalAdjustment", "minAdjustmentCost", "moveBy", "cost", "getVerticalAdjustmentCost", "adjustBy", "assignmentNode", "aNode", "other", "type", "WIDE_WIDTH", "readBaseX", "base", "clampedXCoordinateOfBaseWithinNode", "getXCoordinateOfBaseWithinNode", "nodeLeftX", "nodeRightX", "nodePixelCoordinatesInX", "clamped", "orderStartX", "orderEndX", "reference", "id", "name", "rectangle", "yStart", "exitX", "prev", "yEnd", "xNext", "generateTurnaround", "buildCoarsenedSyntheticBands", "state", "source", "unit", "firstId", "edges", "total", "span", "edgeKey", "s", "d", "ignoreStrand", "sourceIndex", "item", "weight", "seq", "i", "sSigned", "dSigned", "srcNode", "dstNode", "key", "existing", "maxEdgeCount", "e", "BAND_MIN_WIDTH", "READ_WIDTH", "BAND_MAX_WIDTH", "widthForCount", "c", "synthetic", "edge", "id", "share", "shareText", "formatShare", "crossingsText", "label", "srcLen", "bandHaplotypes", "rulerIndex", "t", "refIndex", "ref", "refDuplicates", "refSigns", "firstVisitSigns", "altHaplotypes", "_", "walk", "orientedLike", "bands", "agreement", "visit", "sign", "flip", "signs", "node", "count", "MIN_BEND_WIDTH", "generateTurnaround", "trackWidth", "trackID", "trackName", "type", "dir", "x", "yStart", "yEnd", "order", "extra", "offset", "apex", "radius", "stem", "yTop", "yBottom", "stubNear", "stubFar", "horizontal", "segTop", "inner", "outer", "nodePixelCoordinatesInX", "nodeLeftX", "nodeRightX", "generateNodeWidth", "DEFAULT_CHAR_WIDTH", "charWidth", "TRACK_END", "noNeighbors", "nodeCount", "addNeighbor", "neighbors", "index", "neighbor", "soleNeighbor", "mergeNodes", "pred", "succ", "signedIndexOf", "nodeName", "signed", "forward", "isReverse", "track", "sequence", "isHaplotype", "last", "previous", "current", "next", "absorbed", "mergeableWithPred", "origin", "start", "end", "head", "donor", "mergeableWithSucc", "read", "entries", "shift", "mergedSequence", "mergedEntries", "carried", "mismatches", "by", "mismatch", "name", "merged", "reverse", "kept", "predecessor", "successor", "compareCurvesByXYStartValue", "a", "b", "curveEnds", "curve", "compareTuples", "i", "d", "STEEP_SHARE", "MAX_SPREAD", "spreads", "group", "gapWidth", "first", "span", "floor", "wanted", "c", "rise", "across", "sum", "pick", "total", "w", "reference", "others", "referenceScale", "room", "othersScale", "curvePaths", "curves", "type", "groupedCurves", "groupBy", "curveGroup", "spread", "adjustValue", "s", "at", "share", "xAdjusted", "xNextAdjusted", "flattenPath", "steps", "tokens", "points", "x", "y", "num", "command", "x1", "y1", "x2", "y2", "x3", "y3", "t", "u", "e", "nodeOutlinePath", "node", "pathSteps", "graph", "nodeById", "n", "visits", "next", "path", "walk", "pathOrigin", "id", "node", "at", "canonicalStrand", "tubeMapTracks", "steps", "tracks", "index", "sequence", "s", "stepName", "name", "referenceWalkName", "reference", "t", "tubeMapNodes", "hasTubeMapPaths", "STACK_PX", "MIN_TUBE_PX", "MAX_TUBE_PX", "tubeWidth", "trackCount", "straightened", "first", "flipped", "forwards", "step", "isReverse", "forward", "mergedRuns", "layout", "walks", "before", "is_secondary", "i", "neighbour", "lengthOf", "after", "prev", "members", "head", "run", "sum", "opposite", "otherStrand", "boxGraph", "boxOf", "inner", "drawn", "side", "box", "absorbed", "nodes", "parts", "starts", "p", "leaving", "ownStrand", "edges", "edge", "sides", "strandSides", "from", "to", "fromBox", "toBox", "absorbedNames", "segment", "runTubeMap", "paths", "reads", "tubeMapReads", "tubeColor", "pathGreyCssColor", "pathCssColor", "pathColors", "_", "bundled", "layoutTubeMap", "runs", "drawnNodes", "centreline", "yOffset", "x0", "x1", "y", "extentOf", "tubeMapLayout", "drawing", "nodePositions", "minY", "maxY", "tubeMapColumns", "byOrder", "groupBy", "columns", "end", "order", "a", "b", "bp0", "bp1", "graphNode", "isBackbone", "c", "column", "hasTubeMapBackbone", "tubeMapReferenceLayout", "readWalk", "path", "steps", "runs", "open", "gaps", "node", "strand", "gap", "last", "isBackbone", "start", "end", "inverted", "joins", "run", "i", "isSmall", "sigma", "strictlyInside", "cuts", "a", "b", "partitionPoint", "j", "referenceGaps", "backbone", "prev", "findCuts", "walks", "cut", "bp", "cause", "first", "spans", "g", "r", "changed", "sorted", "x", "y", "mergeReference", "merged", "group", "close", "bp0", "bp1", "name", "lastAtMost", "items", "key", "coarsenTubeMap", "graph", "paths", "stepsOf", "pathSteps", "p", "sortedCuts", "mergedAt", "m", "members", "coarseOf", "n", "routes", "routeFor", "s", "deviations", "coarsePaths", "pathVisits", "PathVisitsBuilder", "edges", "depth", "devs", "continuing", "append", "structural", "fold", "home", "i0", "i1", "small", "visitName", "pathOrigin", "pos", "next", "edge", "nodes", "boxAt", "boxes", "bp", "visited", "lo", "lastAtMost", "box", "deviationsByPath", "graph", "deviations", "byWalk", "name", "devs", "d", "pushTo", "pathOrigin", "byPath", "path", "union", "m", "deviationMarks", "drawing", "layout", "referenceBoxes", "a", "b", "marks", "track", "segment", "boxX", "deviationInk", "darkMode", "drawDeviationMarks", "ctx", "x", "y", "width", "left", "right", "top", "MAX_GAP_PX", "MAX_GAP_SHARE", "isReal", "c", "referenceKnots", "columns", "bpToScreen", "real", "first", "tx", "target", "gap", "i", "span", "demand", "a", "b", "scale", "spread", "sx", "k", "offset", "sum", "g", "blocks", "t", "block", "last", "n", "q", "warpX", "knots", "hi", "partitionPoint", "readMismatches", "read", "layout", "marks", "entries", "visits", "segment", "entry", "i", "nodeIndex", "forward", "node", "visit", "base", "at", "pos", "getXCoordinateOfBaseWithinNode", "edit", "mm", "mirroredMismatch", "x0", "x1", "tubeMapMismatches", "parsePath", "d", "tokens", "commands", "i", "num", "op", "extentOf", "x0", "x1", "c", "shapeOf", "color", "id", "haplotype", "reference", "flattenPath", "trackColors", "layout", "pathColors", "track", "readColor", "layerOf", "type", "colors", "referenceIds", "gapWidth", "shapes", "colorOf", "s", "isReference", "rects", "r", "curves", "curvePaths", "corners", "referenceTrackIds", "graph", "ids", "name", "referenceWalkName", "path", "pathOrigin", "tubeMapPicture", "columns", "MAX_GAP_PX", "nodes", "node", "nodeOutlinePath", "tubeMapMismatches", "trace", "ctx", "x", "y", "cx", "cy", "fillByColor", "items", "visible", "addTo", "byColor", "item", "pushTo", "list", "FULL_OUTLINE_PX", "MIN_OUTLINE_ALPHA", "outlineAlpha", "screenWidth", "NODE_TINT_ALPHA", "drawTubeMap", "picture", "frame", "width", "layer", "inPass", "left", "top", "stroke", "fill", "outlineWidth", "tint", "drawTubeMapHighlight", "drawMismatches", "n", "MISMATCH_FONT_PX", "MIN_MISMATCH_FONT_PX", "mismatchesLegible", "yScale", "mismatchOnScreen", "m", "marks", "darkMode", "fontPx", "inside", "points", "sx", "sy", "hit", "j", "xi", "yi", "xj", "yj", "tubeMapTrackAt", "l", "px", "py", "INSERTION_SLOP_PX", "tubeMapMismatchAt", "host", "read", "name", "groupKeyComparator", "read", "groupKeys_default", "host", "SECTION_HEADER_PX", "parseSamplesTsv", "text", "head", "lines", "columns", "rows", "line", "name", "values", "i", "metadataColumns", "row", "key", "groupByOf", "value", "field", "domain", "d", "plural", "n", "noun", "columnValueOf", "table", "valueOf", "haplotype", "sample", "groupsByColumn", "items", "nounOf", "groups", "item", "group", "groupKeyComparator", "members", "groupWalkRows", "groupBy", "first", "sections", "title", "section", "g", "sectionPlacement", "rowPx", "sectionOf", "k", "rowY", "s", "y", "best", "lo", "hi", "shift", "walkRowTrees", "bars", "frame", "o", "walkRowsTree", "collectRun", "seed", "byId", "adj", "claimed", "members", "anchors", "queue", "id", "node", "neighborId", "neighbor", "REFERENCE_RANK", "anchorSpan", "a", "sorted", "b", "first", "last", "start", "end", "runDistances", "entry", "m", "dist", "member", "reach", "known", "runOffsets", "ordered", "rank", "i", "offsets", "offset", "projectAlleles", "graph", "isAnchored", "n", "buildNeighbors", "alleles", "span", "max", "PANEL_GAP", "PANEL_REFERENCE_TUBE", "PANEL_TUBE", "PANEL_TUBES", "TINTED_TUBES", "PANEL_TITLE_FONT", "TUBE_MAP_PANELS", "walkOf", "name", "pathOrigin", "roleTubeColors", "paths", "reference", "tubes", "haplotype", "p", "VALUE_TUBES", "NO_VALUE_TUBE", "valueTubePalette", "values", "sorted", "v", "groupKeyComparator", "i", "valueTubeColors", "valueOf", "palette", "walk", "columnKeyOf", "field", "table", "columnValueOf", "sample", "parsePanSN", "tubeMapPanelGroups", "graph", "split", "names", "keyOf", "groupsByColumn", "key", "members", "title", "groups", "list", "domain", "rank", "listed", "a", "b", "boxOf", "drawing", "node", "box", "memberAt", "spanOf", "left", "right", "sx", "spans", "id", "span", "start", "s", "end", "share", "bp", "distance", "walksThrough", "all", "here", "member", "COUNT_FONT", "MIN_COUNT_RUN_PX", "MIN_COUNT_TUBE_PX", "drawBundleCounts", "ctx", "picture", "x", "y", "width", "counts", "r", "n", "top", "bottom", "LENGTH_FONT", "MIN_LENGTH_LABEL_BP", "drawSqueezedLengths", "lengthOf", "stacks", "text", "formatBp", "mid", "stack", "drawn", "count", "label", "d", "paintPanelHover", "panels", "hover", "lit", "hit", "drawTubeMapHighlight", "plural", "graphOfPaths", "kept", "keptPaths", "walks", "nodeIds", "nodes", "pathVisits", "path", "segment", "e", "withTubeMapPanels", "whole", "laidOut", "nodePositions", "minX", "maxX", "result", "tubeMap", "extent", "height", "dy", "segments", "EXON_COLOR", "EXON_GAP_PX", "EXON_LINE_PX", "MIN_LANE_PX", "exonStretches", "pins", "halfWidthPx", "lift", "pathOf", "d", "inkPx", "nodeId", "own", "pin", "exonOutlineTree", "stretches", "o", "stroke", "s", "color", "width", "el", "rangeText", "contig", "start", "end", "s", "e", "groupDigits", "formatBp", "walkKey", "walk", "reference", "field", "own", "scale", "spanned", "outside", "gaps", "GAP_CAUSE_TEXT", "OUTSIDE_TEXT", "bp", "text", "walkPosition", "nodeId", "length", "progress", "range", "tubeMapGenes", "byRefName", "genes", "out", "gene", "boxes", "first", "last", "start", "end", "tubeSpan", "e", "GENE_ROW_PX", "MAX_GENE_ROWS", "EXON_PX", "NAME_FONT", "NAME_GAP_PX", "tubeMapGeneRows", "edges", "g", "a", "b", "depth", "most", "step", "drawTubeMapGenes", "ctx", "frame", "bottom", "top", "x", "width", "darkMode", "rows", "rowEnds", "ink", "placed", "s0", "s1", "arrow", "label", "mid", "half", "left", "right", "row", "glyphY", "e0", "REFERENCE_STRIP_PX", "REFERENCE_STRIP_ZONE_PX", "OVERHANG_PX", "OVERHANG_CAP_PX", "MIN_STAGGER_PX", "referenceStripBlocks", "graph", "colorScheme", "referenceRamp", "walks", "range", "computeColorSchemeRange", "out", "node", "index", "isBackbone", "colors", "w", "lane", "LIFT_BACKDROP_CSS", "abgrToCssRgba", "getNodeColor", "b", "span", "frame", "bp0", "bp1", "a", "HIT_SLOP_PX", "stripOverhang", "blocks", "width", "lo", "hi", "below", "above", "block", "stripBlockAt", "sx", "sy", "hit", "best", "x0", "x1", "dist", "nodeAnchor", "segments", "toScreen", "p", "stripPixels", "dpr", "placed", "px0", "claimed", "tierEnds", "px1", "start", "tier", "_", "drawOverhang", "ctx", "edgeX", "inward", "ink", "capX", "tipX", "baseX", "rowEdge", "row", "rows", "drawReferenceStrip", "lit", "darkMode", "staggered", "color", "i", "y0", "overhang", "left", "agrees", "walkBp", "callBp", "nearest", "walks", "calls", "W", "C", "cost", "paired", "j", "together", "dropWalk", "dropCall", "out", "byLength", "items", "bp", "item", "i", "a", "b", "backed", "call", "scored", "row", "pairSample", "rows", "taken", "ranked", "r", "pair", "pool", "group", "stages", "alleles", "free", "open", "c", "pick", "k", "haplotype", "withCalls", "bySample", "sample", "called", "ratio", "observable", "watch", "runInAction", "trackedDpr", "width", "height", "getDpr"]
7
- }