@jbrowse/bandage-core 6.0.1 → 6.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. package/README.md +23 -7
  2. package/dist/alleleProjection/projectAlleles.js +10 -0
  3. package/dist/anchoredNodes.js +24 -0
  4. package/dist/bubbleSpreads.js +11 -0
  5. package/dist/bubbles/bubbleHalos.js +11 -0
  6. package/dist/bubbles/bubbleLine.js +14 -0
  7. package/dist/bubbles/bubblesFromGraph.js +10 -0
  8. package/dist/bubbles/classifyBubble.js +15 -0
  9. package/dist/bubbles/popBubble.js +9 -0
  10. package/dist/chunks/chunk-2CVHXFK7.js +530 -0
  11. package/dist/chunks/chunk-3S3YVOJ7.js +69 -0
  12. package/dist/chunks/chunk-47DYCZOK.js +115 -0
  13. package/dist/chunks/chunk-4EMPBO7S.js +117 -0
  14. package/dist/chunks/chunk-4S47XRYA.js +149 -0
  15. package/dist/chunks/chunk-5XQDMQXU.js +431 -0
  16. package/dist/chunks/chunk-6JEWNXCQ.js +90 -0
  17. package/dist/chunks/chunk-6SBUFFTB.js +97 -0
  18. package/dist/chunks/chunk-6SXMCK6I.js +476 -0
  19. package/dist/chunks/chunk-72N5DJHZ.js +155 -0
  20. package/dist/chunks/chunk-73RSLGZT.js +73 -0
  21. package/dist/chunks/chunk-7XHHVYG7.js +13 -0
  22. package/dist/chunks/chunk-AB35TJST.js +67 -0
  23. package/dist/chunks/chunk-BPLIXMH7.js +52 -0
  24. package/dist/chunks/chunk-BUBZ32IC.js +101 -0
  25. package/dist/chunks/chunk-BXEPA4KS.js +179 -0
  26. package/dist/chunks/chunk-C44YRP5F.js +85 -0
  27. package/dist/chunks/chunk-CDLPYR5O.js +135 -0
  28. package/dist/chunks/chunk-CJ2EE4AF.js +40 -0
  29. package/dist/chunks/chunk-CPMHA4W5.js +6 -0
  30. package/dist/chunks/chunk-CR7EGAFE.js +241 -0
  31. package/dist/chunks/chunk-CS3E4ETM.js +202 -0
  32. package/dist/chunks/chunk-CTSBC2O6.js +90 -0
  33. package/dist/chunks/chunk-D3M7SBKL.js +210 -0
  34. package/dist/chunks/chunk-DKOB2OPC.js +177 -0
  35. package/dist/chunks/chunk-EJ5OZTCK.js +52 -0
  36. package/dist/chunks/chunk-EK4HGYO7.js +174 -0
  37. package/dist/chunks/chunk-EPZORFTI.js +23 -0
  38. package/dist/chunks/chunk-ES2N6V56.js +83 -0
  39. package/dist/chunks/chunk-EZPBJPK6.js +54 -0
  40. package/dist/chunks/chunk-FYQWPEEY.js +65 -0
  41. package/dist/chunks/chunk-GGQRADFS.js +170 -0
  42. package/dist/chunks/chunk-GOY6REMT.js +43 -0
  43. package/dist/chunks/chunk-GQ2AOHU4.js +112 -0
  44. package/dist/chunks/chunk-HNQPEMYE.js +297 -0
  45. package/dist/chunks/chunk-IGVV37VI.js +60 -0
  46. package/dist/chunks/chunk-IO2PCPZI.js +218 -0
  47. package/dist/chunks/chunk-ISEI2FH3.js +108 -0
  48. package/dist/chunks/chunk-JKJWSY4V.js +32 -0
  49. package/dist/chunks/chunk-KQFOCDFY.js +73 -0
  50. package/dist/chunks/chunk-L3O7AWLI.js +52 -0
  51. package/dist/chunks/chunk-LLJUG2H7.js +6 -0
  52. package/dist/chunks/chunk-LOEA5IHZ.js +71 -0
  53. package/dist/chunks/chunk-LTUWJKHD.js +112 -0
  54. package/dist/chunks/chunk-MFKORG3F.js +44 -0
  55. package/dist/chunks/chunk-MI35EUIE.js +76 -0
  56. package/dist/chunks/chunk-MNUSQCLG.js +29 -0
  57. package/dist/chunks/chunk-MQJUG2D2.js +53 -0
  58. package/dist/chunks/chunk-MREQ7GIA.js +181 -0
  59. package/dist/chunks/chunk-N62KBLFC.js +326 -0
  60. package/dist/chunks/chunk-NNODIW4U.js +26 -0
  61. package/dist/chunks/chunk-PBENCR5L.js +60 -0
  62. package/dist/chunks/chunk-PCZ4PTYC.js +726 -0
  63. package/dist/chunks/chunk-PUG7LXDF.js +70 -0
  64. package/dist/chunks/chunk-QYBZZI5H.js +0 -0
  65. package/dist/chunks/chunk-R6ZUK4Y3.js +232 -0
  66. package/dist/chunks/chunk-RAKOB6IV.js +169 -0
  67. package/dist/chunks/chunk-ROF2R3RF.js +205 -0
  68. package/dist/chunks/chunk-RVS2QCOX.js +135 -0
  69. package/dist/chunks/chunk-ST2IBUAN.js +119 -0
  70. package/dist/chunks/chunk-SZNZ2T6D.js +198 -0
  71. package/dist/chunks/chunk-T43W7NKK.js +122 -0
  72. package/dist/chunks/chunk-TAMCZHLW.js +190 -0
  73. package/dist/chunks/chunk-TDQLINVI.js +16 -0
  74. package/dist/chunks/chunk-TEDQJPMI.js +131 -0
  75. package/dist/chunks/chunk-TZFWUT2C.js +66 -0
  76. package/dist/chunks/chunk-UVBGRJQX.js +50 -0
  77. package/dist/chunks/chunk-VHW7FDHU.js +42 -0
  78. package/dist/chunks/chunk-VZQ4FKLR.js +38 -0
  79. package/dist/chunks/chunk-WFX3MAKA.js +102 -0
  80. package/dist/chunks/chunk-WOO7QYKB.js +121 -0
  81. package/dist/chunks/chunk-WSIFAZU7.js +132 -0
  82. package/dist/chunks/chunk-X5L37W4J.js +82 -0
  83. package/dist/chunks/chunk-Y3IOTZJA.js +61 -0
  84. package/dist/chunks/chunk-YMSSF2RK.js +257 -0
  85. package/dist/cli/figure.js +84 -17
  86. package/dist/colorSchemes.js +10 -0
  87. package/dist/deletionEdges.js +13 -0
  88. package/dist/el.js +8 -0
  89. package/dist/facetGrid.js +16 -0
  90. package/dist/figure.js +51 -0
  91. package/dist/gaf/parseGaf.js +12 -0
  92. package/dist/gbzCut.js +19 -0
  93. package/dist/gbzJoin.js +6 -0
  94. package/dist/gbzWindow.js +28 -0
  95. package/dist/genes/exonOutline.js +11 -0
  96. package/dist/genes/geneFiles.js +14 -0
  97. package/dist/genes/genePins.js +10 -0
  98. package/dist/gfa/gfaConverter.js +11 -0
  99. package/dist/gfa-core/gfaParser.js +8 -0
  100. package/dist/gfa-core/index.js +9 -0
  101. package/dist/graphLabels.js +24 -0
  102. package/dist/index.js +262 -1407
  103. package/dist/labelLayout.js +24 -0
  104. package/dist/layout/anchoredLayout.js +11 -0
  105. package/dist/layout/deletionRoutes.js +10 -0
  106. package/dist/layout/drawnScale.js +22 -0
  107. package/dist/layout/mergeRuns.js +15 -0
  108. package/dist/layout/orderedLayout.js +12 -0
  109. package/dist/layout/orientToReference.js +7 -0
  110. package/dist/layout/placeOffReference.js +9 -0
  111. package/dist/layout/referenceSeeds.js +11 -0
  112. package/dist/layout/rowSpacing.js +6 -0
  113. package/dist/layout/sampleRowLayout.js +11 -0
  114. package/dist/layout/trimToWindow.js +99 -0
  115. package/dist/layout/tubeMapLayout.js +28 -0
  116. package/dist/layout/walkRowDraw.js +65 -0
  117. package/dist/layout/walkRowLayout.js +13 -0
  118. package/dist/layout/walkRows.js +11 -0
  119. package/dist/layout/walkStrip.js +40 -0
  120. package/dist/layoutModes.js +35 -0
  121. package/dist/loadBandage.js +6 -0
  122. package/dist/nodeWidths.js +18 -0
  123. package/dist/overlayLabels.js +18 -0
  124. package/dist/pansn.js +18 -0
  125. package/dist/pathAnchoring.js +18 -0
  126. package/dist/pathColors.js +31 -0
  127. package/dist/pipeline.js +40 -0
  128. package/dist/reference.js +24 -0
  129. package/dist/referenceRampCss.js +29 -0
  130. package/dist/referenceSpan.js +11 -0
  131. package/dist/referenceStrip.js +35 -0
  132. package/dist/renderer/Canvas2DRenderer.js +9 -0
  133. package/dist/renderer/GeometryBuilder.js +42 -0
  134. package/dist/renderer/colorBits.js +8 -0
  135. package/dist/renderer/recordingCanvas.js +44 -0
  136. package/dist/renderer/svgCanvas.js +6 -0
  137. package/dist/renderer/types.js +0 -0
  138. package/dist/tubeMap/axis.js +25 -0
  139. package/dist/tubeMap/coarsen.js +361 -0
  140. package/dist/tubeMap/connectors.js +13 -0
  141. package/dist/tubeMap/deviations.js +85 -0
  142. package/dist/tubeMap/draw.js +15 -0
  143. package/dist/tubeMap/frame.js +9 -0
  144. package/dist/tubeMap/genes.js +20 -0
  145. package/dist/tubeMap/mismatches.js +6 -0
  146. package/dist/tubeMap/nodeColors.js +21 -0
  147. package/dist/tubeMap/reads.js +17 -0
  148. package/dist/tubeMap/warp.js +8 -0
  149. package/dist/types/version.d.ts +1 -1
  150. package/dist/types.js +0 -0
  151. package/dist/util/SpatialIndex.js +13 -0
  152. package/dist/util/edgeCurves.js +10 -0
  153. package/dist/util/geometry.js +39 -0
  154. package/dist/util/hitDetection.js +20 -0
  155. package/dist/util/wheelZoom.js +6 -0
  156. package/dist/version.js +6 -0
  157. package/dist/viewport.js +33 -0
  158. package/dist/walkEncoding.js +39 -0
  159. package/dist/walkHighlight.js +26 -0
  160. package/dist/walkKey.js +17 -0
  161. package/package.json +38 -5
  162. package/dist/chunks/chunk-EXSFRX2F.js +0 -7400
@@ -0,0 +1,35 @@
1
+ import {
2
+ REFERENCE_STRIP_PX,
3
+ REFERENCE_STRIP_ZONE_PX,
4
+ drawReferenceStrip,
5
+ nodeAnchor,
6
+ referenceStripBlocks,
7
+ stripBlockAt,
8
+ stripOverhang,
9
+ stripPixels
10
+ } from "./chunks/chunk-EK4HGYO7.js";
11
+ import "./chunks/chunk-PCZ4PTYC.js";
12
+ import "./chunks/chunk-MNUSQCLG.js";
13
+ import "./chunks/chunk-Y3IOTZJA.js";
14
+ import "./chunks/chunk-X5L37W4J.js";
15
+ import "./chunks/chunk-ST2IBUAN.js";
16
+ import "./chunks/chunk-ES2N6V56.js";
17
+ import "./chunks/chunk-N62KBLFC.js";
18
+ import "./chunks/chunk-AB35TJST.js";
19
+ import "./chunks/chunk-TAMCZHLW.js";
20
+ import "./chunks/chunk-PBENCR5L.js";
21
+ import "./chunks/chunk-4EMPBO7S.js";
22
+ import "./chunks/chunk-2CVHXFK7.js";
23
+ import "./chunks/chunk-CPMHA4W5.js";
24
+ import "./chunks/chunk-BPLIXMH7.js";
25
+ import "./chunks/chunk-FYQWPEEY.js";
26
+ export {
27
+ REFERENCE_STRIP_PX,
28
+ REFERENCE_STRIP_ZONE_PX,
29
+ drawReferenceStrip,
30
+ nodeAnchor,
31
+ referenceStripBlocks,
32
+ stripBlockAt,
33
+ stripOverhang,
34
+ stripPixels
35
+ };
@@ -0,0 +1,9 @@
1
+ import {
2
+ Canvas2DRenderer,
3
+ arrowheadOutline
4
+ } from "../chunks/chunk-D3M7SBKL.js";
5
+ import "../chunks/chunk-MNUSQCLG.js";
6
+ export {
7
+ Canvas2DRenderer,
8
+ arrowheadOutline
9
+ };
@@ -0,0 +1,42 @@
1
+ import {
2
+ FADED_ALPHA,
3
+ LIFT_BACKDROP_COLOR,
4
+ LIFT_BACKDROP_CSS,
5
+ REFERENCE_RAMP_ALT_COLOR,
6
+ REFERENCE_RAMP_ALT_CSS,
7
+ REFERENCE_RAMP_MAX_HUE,
8
+ buildGeometry,
9
+ computeColorSchemeRange,
10
+ computeReferenceRamp,
11
+ endTangent,
12
+ getNodeColor,
13
+ hslToRgb
14
+ } from "../chunks/chunk-PCZ4PTYC.js";
15
+ import "../chunks/chunk-MNUSQCLG.js";
16
+ import "../chunks/chunk-Y3IOTZJA.js";
17
+ import "../chunks/chunk-X5L37W4J.js";
18
+ import "../chunks/chunk-ST2IBUAN.js";
19
+ import "../chunks/chunk-ES2N6V56.js";
20
+ import "../chunks/chunk-N62KBLFC.js";
21
+ import "../chunks/chunk-AB35TJST.js";
22
+ import "../chunks/chunk-TAMCZHLW.js";
23
+ import "../chunks/chunk-PBENCR5L.js";
24
+ import "../chunks/chunk-4EMPBO7S.js";
25
+ import "../chunks/chunk-2CVHXFK7.js";
26
+ import "../chunks/chunk-CPMHA4W5.js";
27
+ import "../chunks/chunk-BPLIXMH7.js";
28
+ import "../chunks/chunk-FYQWPEEY.js";
29
+ export {
30
+ FADED_ALPHA,
31
+ LIFT_BACKDROP_COLOR,
32
+ LIFT_BACKDROP_CSS,
33
+ REFERENCE_RAMP_ALT_COLOR,
34
+ REFERENCE_RAMP_ALT_CSS,
35
+ REFERENCE_RAMP_MAX_HUE,
36
+ buildGeometry,
37
+ computeColorSchemeRange,
38
+ computeReferenceRamp,
39
+ endTangent,
40
+ getNodeColor,
41
+ hslToRgb
42
+ };
@@ -0,0 +1,8 @@
1
+ import {
2
+ brightenAbgr,
3
+ fadeAbgr
4
+ } from "../chunks/chunk-MNUSQCLG.js";
5
+ export {
6
+ brightenAbgr,
7
+ fadeAbgr
8
+ };
@@ -0,0 +1,44 @@
1
+ // src/renderer/recordingCanvas.ts
2
+ function recordingCanvas() {
3
+ const strokes = [];
4
+ const fills = [];
5
+ const lineWidths = [];
6
+ const points = [];
7
+ const at = (x, y) => {
8
+ points.push({ x, y });
9
+ };
10
+ const ctx = {
11
+ canvas: { width: 800, height: 600, style: {} },
12
+ fillStyle: "",
13
+ strokeStyle: "",
14
+ lineWidth: 0,
15
+ lineCap: "",
16
+ lineJoin: "",
17
+ beginPath: () => {
18
+ },
19
+ moveTo: at,
20
+ lineTo: at,
21
+ closePath: () => {
22
+ },
23
+ bezierCurveTo: (cx0, cy0, cx1, cy1, x, y) => {
24
+ at(cx0, cy0);
25
+ at(cx1, cy1);
26
+ at(x, y);
27
+ },
28
+ fillRect: () => {
29
+ },
30
+ stroke: () => {
31
+ strokes.push(ctx.strokeStyle);
32
+ lineWidths.push(ctx.lineWidth);
33
+ },
34
+ fill: () => {
35
+ fills.push(ctx.fillStyle);
36
+ }
37
+ };
38
+ const canvas = document.createElement("canvas");
39
+ canvas.getContext = () => ctx;
40
+ return { canvas, strokes, fills, lineWidths, points };
41
+ }
42
+ export {
43
+ recordingCanvas
44
+ };
@@ -0,0 +1,6 @@
1
+ import {
2
+ svgCanvas
3
+ } from "../chunks/chunk-47DYCZOK.js";
4
+ export {
5
+ svgCanvas
6
+ };
File without changes
@@ -0,0 +1,25 @@
1
+ import {
2
+ drawTubeMapRuler,
3
+ referenceBoxes,
4
+ rulerBoxes,
5
+ rulerInk,
6
+ rulerMarks,
7
+ tubeSpan,
8
+ tubeX
9
+ } from "../chunks/chunk-CS3E4ETM.js";
10
+ import "../chunks/chunk-N62KBLFC.js";
11
+ import "../chunks/chunk-AB35TJST.js";
12
+ import "../chunks/chunk-TAMCZHLW.js";
13
+ import "../chunks/chunk-4EMPBO7S.js";
14
+ import "../chunks/chunk-2CVHXFK7.js";
15
+ import "../chunks/chunk-CPMHA4W5.js";
16
+ import "../chunks/chunk-FYQWPEEY.js";
17
+ export {
18
+ drawTubeMapRuler,
19
+ referenceBoxes,
20
+ rulerBoxes,
21
+ rulerInk,
22
+ rulerMarks,
23
+ tubeSpan,
24
+ tubeX
25
+ };
@@ -0,0 +1,361 @@
1
+ import {
2
+ visitStrands
3
+ } from "../chunks/chunk-R6ZUK4Y3.js";
4
+ import {
5
+ canonicalStrand
6
+ } from "../chunks/chunk-TEDQJPMI.js";
7
+ import "../chunks/chunk-C44YRP5F.js";
8
+ import "../chunks/chunk-X5L37W4J.js";
9
+ import {
10
+ pathOrigin
11
+ } from "../chunks/chunk-ST2IBUAN.js";
12
+ import "../chunks/chunk-N62KBLFC.js";
13
+ import "../chunks/chunk-AB35TJST.js";
14
+ import "../chunks/chunk-TAMCZHLW.js";
15
+ import "../chunks/chunk-4EMPBO7S.js";
16
+ import "../chunks/chunk-2CVHXFK7.js";
17
+ import "../chunks/chunk-CPMHA4W5.js";
18
+ import "../chunks/chunk-BPLIXMH7.js";
19
+ import {
20
+ isBackbone
21
+ } from "../chunks/chunk-FYQWPEEY.js";
22
+
23
+ // src/tubeMap/coarsen.ts
24
+ function readWalk(path, nodeById, strands) {
25
+ const visitName = pathOrigin(path.name).name;
26
+ const seen = /* @__PURE__ */ new Map();
27
+ const runs = [];
28
+ const open = () => ({ a: -Infinity, b: Infinity, detour: [], bp: 0 });
29
+ const gaps = [open()];
30
+ for (const id of path.nodeIds) {
31
+ const node = nodeById.get(id);
32
+ if (!node) {
33
+ continue;
34
+ }
35
+ const k = seen.get(node.name) ?? 0;
36
+ seen.set(node.name, k + 1);
37
+ const strand = strands.get(`${visitName} ${node.name}`)?.[k] ?? canonicalStrand(node);
38
+ const gap = gaps.at(-1);
39
+ const last = runs.at(-1);
40
+ if (isBackbone(node)) {
41
+ const start = node.stable.start;
42
+ const end = start + node.length;
43
+ const inverted = strand !== (node.stable.strand ?? "+");
44
+ const joins = last !== void 0 && gap.detour.length === 0;
45
+ if (joins && !last.inverted && !inverted && last.end === start) {
46
+ last.end = end;
47
+ } else if (joins && last.inverted && inverted && last.start === end) {
48
+ last.start = start;
49
+ } else {
50
+ runs.push({ start, end, inverted });
51
+ gaps.push(open());
52
+ }
53
+ } else {
54
+ gap.detour.push({ node, strand });
55
+ gap.bp += node.length;
56
+ }
57
+ }
58
+ runs.forEach((run, i) => {
59
+ gaps[i].b = run.start;
60
+ gaps[i + 1].a = run.end;
61
+ });
62
+ return { path, runs, gaps };
63
+ }
64
+ function isSmall(gap, sigma) {
65
+ return Number.isFinite(gap.a) && Number.isFinite(gap.b) && gap.b >= gap.a && Math.max(gap.b - gap.a, gap.bp) < sigma;
66
+ }
67
+ function strictlyInside(cuts, a, b) {
68
+ let lo = 0;
69
+ let hi = cuts.length;
70
+ while (lo < hi) {
71
+ const mid = lo + hi >> 1;
72
+ if (cuts[mid] <= a) {
73
+ lo = mid + 1;
74
+ } else {
75
+ hi = mid;
76
+ }
77
+ }
78
+ return lo < cuts.length && cuts[lo] < b;
79
+ }
80
+ function referenceGaps(backbone) {
81
+ const cuts = /* @__PURE__ */ new Map();
82
+ for (let i = 1; i < backbone.length; i++) {
83
+ const prev = backbone[i - 1];
84
+ const node = backbone[i];
85
+ const end = prev.stable.start + prev.length;
86
+ if (end !== node.stable.start) {
87
+ cuts.set(end, "reference-gap");
88
+ cuts.set(node.stable.start, "reference-gap");
89
+ }
90
+ }
91
+ return cuts;
92
+ }
93
+ function findCuts(walks, sigma, cuts) {
94
+ const cut = (bp, cause) => {
95
+ if (Number.isFinite(bp) && !cuts.has(bp)) {
96
+ cuts.set(bp, cause);
97
+ }
98
+ };
99
+ for (const { runs, gaps } of walks) {
100
+ const first = runs[0];
101
+ const last = runs.at(-1);
102
+ if (first && last) {
103
+ cut(first.start, "walk-end");
104
+ cut(last.end, "walk-end");
105
+ }
106
+ for (const run of runs) {
107
+ if (run.inverted && run.end - run.start >= sigma) {
108
+ cut(run.start, "inversion");
109
+ cut(run.end, "inversion");
110
+ }
111
+ }
112
+ for (const gap of gaps) {
113
+ if (gap.b < gap.a) {
114
+ cut(gap.a, "backward");
115
+ cut(gap.b, "backward");
116
+ } else if (!isSmall(gap, sigma)) {
117
+ cut(gap.a, "variant");
118
+ cut(gap.b, "variant");
119
+ }
120
+ }
121
+ }
122
+ for (let changed = true; changed; ) {
123
+ changed = false;
124
+ const sorted = [...cuts.keys()].sort((x, y) => x - y);
125
+ const spans = walks.flatMap(({ runs, gaps }) => [
126
+ ...gaps.filter((g) => isSmall(g, sigma)).map((g) => [g.a, g.b]),
127
+ ...runs.filter((r) => r.inverted && r.end - r.start < sigma).map((r) => [r.start, r.end])
128
+ ]);
129
+ for (const [a, b] of spans) {
130
+ if (strictlyInside(sorted, a, b)) {
131
+ changed ||= !cuts.has(a) || !cuts.has(b);
132
+ cut(a, "overlap");
133
+ cut(b, "overlap");
134
+ }
135
+ }
136
+ }
137
+ return cuts;
138
+ }
139
+ function mergeReference(backbone, cuts) {
140
+ const merged = [];
141
+ let group = [];
142
+ const close = () => {
143
+ const first = group[0];
144
+ const last = group.at(-1);
145
+ if (first && last) {
146
+ const bp0 = first.stable.start;
147
+ const bp1 = last.stable.start + last.length;
148
+ const name = `${bp0}-${bp1}`;
149
+ merged.push({
150
+ node: {
151
+ id: `${name}+`,
152
+ name,
153
+ length: bp1 - bp0,
154
+ depth: 0,
155
+ stable: {
156
+ refName: first.stable.refName,
157
+ start: bp0,
158
+ rank: 0,
159
+ strand: "+"
160
+ }
161
+ },
162
+ members: group
163
+ });
164
+ }
165
+ group = [];
166
+ };
167
+ for (const node of backbone) {
168
+ if (cuts.has(node.stable.start)) {
169
+ close();
170
+ }
171
+ group.push(node);
172
+ }
173
+ close();
174
+ return merged;
175
+ }
176
+ function coarsenTubeMap(graph, sigma) {
177
+ const backbone = graph.nodes.filter(isBackbone).sort((a, b) => a.stable.start - b.stable.start);
178
+ const paths = graph.paths ?? [];
179
+ if (backbone.length === 0 || paths.length === 0) {
180
+ return void 0;
181
+ }
182
+ const nodeById = new Map(graph.nodes.map((n) => [n.id, n]));
183
+ const strands = visitStrands(graph);
184
+ const walks = paths.map((p) => readWalk(p, nodeById, strands));
185
+ const cuts = findCuts(walks, sigma, referenceGaps(backbone));
186
+ const sortedCuts = [...cuts.keys()].sort((x, y) => x - y);
187
+ const merged = mergeReference(backbone, cuts);
188
+ const starts = merged.map((m) => m.node.stable.start);
189
+ const mergedAt = (bp) => {
190
+ let lo = 0;
191
+ let hi = starts.length - 1;
192
+ while (lo < hi) {
193
+ const mid = lo + hi + 1 >> 1;
194
+ if (starts[mid] <= bp) {
195
+ lo = mid;
196
+ } else {
197
+ hi = mid - 1;
198
+ }
199
+ }
200
+ return lo;
201
+ };
202
+ const members = /* @__PURE__ */ new Map();
203
+ const coarseOf = /* @__PURE__ */ new Map();
204
+ for (const m of merged) {
205
+ members.set(
206
+ m.node.id,
207
+ m.members.map((n) => n.id)
208
+ );
209
+ for (const n of m.members) {
210
+ coarseOf.set(n.id, m.node.id);
211
+ }
212
+ }
213
+ const routes = /* @__PURE__ */ new Map();
214
+ const routeFor = (gap) => {
215
+ const key = `${gap.a} ${gap.b} ${gap.detour.map((s) => s.node.id + s.strand).join(",")}`;
216
+ let node = routes.get(key);
217
+ if (!node) {
218
+ const name = `r${routes.size}`;
219
+ node = {
220
+ id: `${name}+`,
221
+ name,
222
+ length: gap.bp,
223
+ depth: 0,
224
+ stable: {
225
+ refName: backbone[0].stable.refName,
226
+ start: Number.isFinite(gap.a) ? gap.a : gap.b,
227
+ rank: 1,
228
+ strand: "+"
229
+ }
230
+ };
231
+ routes.set(key, node);
232
+ members.set(
233
+ node.id,
234
+ gap.detour.map((s) => s.node.id)
235
+ );
236
+ for (const s of gap.detour) {
237
+ if (!coarseOf.has(s.node.id)) {
238
+ coarseOf.set(s.node.id, node.id);
239
+ }
240
+ }
241
+ }
242
+ return node;
243
+ };
244
+ const deviations = /* @__PURE__ */ new Map();
245
+ const coarsePaths = [];
246
+ const pathVisits = /* @__PURE__ */ new Map();
247
+ const edges = /* @__PURE__ */ new Map();
248
+ const depth = /* @__PURE__ */ new Map();
249
+ for (const { path, runs, gaps } of walks) {
250
+ const steps = [];
251
+ const devs = [];
252
+ let continuing = false;
253
+ const append = (node, strand) => {
254
+ const last = steps.at(-1);
255
+ if (!(continuing && last?.node === node && last.strand === strand)) {
256
+ steps.push({ node, strand });
257
+ }
258
+ continuing = true;
259
+ };
260
+ const structural = (gap) => {
261
+ continuing = false;
262
+ if (gap.detour.length > 0) {
263
+ append(routeFor(gap), "+");
264
+ continuing = false;
265
+ }
266
+ };
267
+ const fold = (gap) => {
268
+ if (gap.bp > 0 || gap.b > gap.a) {
269
+ devs.push({ start: gap.a, end: gap.b, bp: gap.bp });
270
+ }
271
+ const home = merged[mergedAt(gap.b > gap.a ? gap.a : gap.a - 1)];
272
+ for (const s of gap.detour) {
273
+ if (!coarseOf.has(s.node.id)) {
274
+ coarseOf.set(s.node.id, home.node.id);
275
+ members.get(home.node.id).push(s.node.id);
276
+ }
277
+ }
278
+ };
279
+ runs.forEach((run, i) => {
280
+ const gap = gaps[i];
281
+ if (isSmall(gap, sigma) && !strictlyInside(sortedCuts, gap.a, gap.b)) {
282
+ fold(gap);
283
+ } else {
284
+ structural(gap);
285
+ }
286
+ const i0 = mergedAt(run.start);
287
+ const i1 = mergedAt(run.end - 1);
288
+ const small = run.end - run.start < sigma;
289
+ if (run.inverted && !small) {
290
+ continuing = false;
291
+ for (let j = i1; j >= i0; j--) {
292
+ append(merged[j].node, "-");
293
+ }
294
+ continuing = false;
295
+ } else {
296
+ if (run.inverted) {
297
+ devs.push({
298
+ start: run.start,
299
+ end: run.end,
300
+ bp: run.end - run.start,
301
+ inverted: true
302
+ });
303
+ }
304
+ for (let j = i0; j <= i1; j++) {
305
+ append(merged[j].node, "+");
306
+ }
307
+ }
308
+ });
309
+ structural(gaps.at(-1));
310
+ const visitName = pathOrigin(path.name).name;
311
+ let pos = 0;
312
+ steps.forEach(({ node, strand }, i) => {
313
+ depth.set(node.id, (depth.get(node.id) ?? 0) + 1);
314
+ const visits = pathVisits.get(node.name) ?? [];
315
+ visits.push({
316
+ path: visitName,
317
+ sample: path.sample ?? visitName,
318
+ start: pos,
319
+ strand
320
+ });
321
+ pathVisits.set(node.name, visits);
322
+ pos += node.length;
323
+ const next = steps[i + 1];
324
+ if (next) {
325
+ const key = `${node.id}${strand} ${next.node.id}${next.strand}`;
326
+ const edge = edges.get(key);
327
+ if (edge) {
328
+ edge.pathIds.push(path.name);
329
+ } else {
330
+ edges.set(key, {
331
+ from: node.id,
332
+ to: next.node.id,
333
+ fromStrand: strand,
334
+ toStrand: next.strand,
335
+ pathIds: [path.name]
336
+ });
337
+ }
338
+ }
339
+ });
340
+ coarsePaths.push({ ...path, nodeIds: steps.map((s) => s.node.id) });
341
+ deviations.set(path.name, devs);
342
+ }
343
+ const nodes = [...merged.map((m) => m.node), ...routes.values()].filter((n) => depth.has(n.id)).map((n) => ({ ...n, depth: depth.get(n.id) }));
344
+ return {
345
+ graph: {
346
+ ...graph,
347
+ nodes,
348
+ edges: [...edges.values()],
349
+ paths: coarsePaths,
350
+ pathVisits,
351
+ reads: void 0
352
+ },
353
+ members,
354
+ coarseOf,
355
+ deviations,
356
+ cuts
357
+ };
358
+ }
359
+ export {
360
+ coarsenTubeMap
361
+ };
@@ -0,0 +1,13 @@
1
+ import {
2
+ connectorAt,
3
+ drawTubeMapConnectors,
4
+ referenceNodes,
5
+ tubeMapConnectors
6
+ } from "../chunks/chunk-GQ2AOHU4.js";
7
+ import "../chunks/chunk-FYQWPEEY.js";
8
+ export {
9
+ connectorAt,
10
+ drawTubeMapConnectors,
11
+ referenceNodes,
12
+ tubeMapConnectors
13
+ };
@@ -0,0 +1,85 @@
1
+ import {
2
+ isBackbone
3
+ } from "../chunks/chunk-FYQWPEEY.js";
4
+
5
+ // src/tubeMap/deviations.ts
6
+ function boxesOf(graph, layout) {
7
+ const nodeById = new Map(graph.nodes.map((n) => [n.id, n]));
8
+ const boxes = [];
9
+ layout.nodes.forEach((node, index) => {
10
+ const g = nodeById.get(node.name);
11
+ if (node.order >= 0 && g && isBackbone(g)) {
12
+ const bp0 = g.stable.start;
13
+ boxes.push({ bp0, bp1: bp0 + node.sequenceLength, index, node });
14
+ }
15
+ });
16
+ return boxes.sort((a, b) => a.bp0 - b.bp0);
17
+ }
18
+ function boxAt(boxes, bp, visited) {
19
+ let lo = 0;
20
+ let hi = boxes.length - 1;
21
+ while (lo < hi) {
22
+ const mid = lo + hi + 1 >> 1;
23
+ if (boxes[mid].bp0 <= bp) {
24
+ lo = mid;
25
+ } else {
26
+ hi = mid - 1;
27
+ }
28
+ }
29
+ return [boxes[lo], boxes[lo - 1]].find(
30
+ (box) => box && visited.has(box.index) && box.bp0 <= bp && bp <= box.bp1
31
+ );
32
+ }
33
+ function deviationMarks(graph, layout, deviations) {
34
+ const boxes = boxesOf(graph, layout);
35
+ const marks = [];
36
+ for (const track of layout.tracks) {
37
+ const devs = track.name ? deviations.get(track.name) : void 0;
38
+ if (devs?.length) {
39
+ const visited = /* @__PURE__ */ new Map();
40
+ for (const segment of track.path) {
41
+ if (segment.node !== null && segment.y !== void 0 && !visited.has(segment.node)) {
42
+ visited.set(segment.node, segment.y);
43
+ }
44
+ }
45
+ for (const d of devs) {
46
+ const box = boxAt(boxes, d.start, visited);
47
+ if (box) {
48
+ const { node, bp0, bp1 } = box;
49
+ const at = (bp) => node.x + (Math.min(bp, bp1) - bp0) / (bp1 - bp0) * node.pixelWidth;
50
+ marks.push({
51
+ x0: at(d.start),
52
+ x1: at(d.end),
53
+ y: visited.get(box.index),
54
+ height: track.width
55
+ });
56
+ }
57
+ }
58
+ }
59
+ }
60
+ return marks;
61
+ }
62
+ function deviationInk(darkMode) {
63
+ return darkMode ? "rgba(255,255,255,0.9)" : "rgba(0,0,0,0.8)";
64
+ }
65
+ function drawDeviationMarks(ctx, marks, { x, y, width, darkMode }) {
66
+ if (marks.length === 0) {
67
+ return;
68
+ }
69
+ ctx.fillStyle = deviationInk(darkMode);
70
+ ctx.beginPath();
71
+ for (const m of marks) {
72
+ const left = x(m.x0);
73
+ const right = Math.max(x(m.x1), left + 1);
74
+ if (right >= 0 && left <= width) {
75
+ const top = y(m.y);
76
+ ctx.rect(left, top, right - left, y(m.y + m.height) - top);
77
+ }
78
+ }
79
+ ctx.fill();
80
+ }
81
+ export {
82
+ deviationInk,
83
+ deviationMarks,
84
+ drawDeviationMarks
85
+ };
@@ -0,0 +1,15 @@
1
+ import {
2
+ drawTubeMap,
3
+ mismatchOnScreen,
4
+ mismatchesLegible,
5
+ parsePath,
6
+ tubeMapPicture
7
+ } from "../chunks/chunk-CR7EGAFE.js";
8
+ import "../chunks/chunk-EJ5OZTCK.js";
9
+ export {
10
+ drawTubeMap,
11
+ mismatchOnScreen,
12
+ mismatchesLegible,
13
+ parsePath,
14
+ tubeMapPicture
15
+ };
@@ -0,0 +1,9 @@
1
+ import {
2
+ tubeMapFrame,
3
+ tubeMapNodeAt
4
+ } from "../chunks/chunk-VZQ4FKLR.js";
5
+ import "../chunks/chunk-KQFOCDFY.js";
6
+ export {
7
+ tubeMapFrame,
8
+ tubeMapNodeAt
9
+ };
@@ -0,0 +1,20 @@
1
+ import {
2
+ GENE_ROW_PX,
3
+ drawTubeMapGenes,
4
+ tubeMapGeneRows,
5
+ tubeMapGenes
6
+ } from "../chunks/chunk-CTSBC2O6.js";
7
+ import "../chunks/chunk-CS3E4ETM.js";
8
+ import "../chunks/chunk-N62KBLFC.js";
9
+ import "../chunks/chunk-AB35TJST.js";
10
+ import "../chunks/chunk-TAMCZHLW.js";
11
+ import "../chunks/chunk-4EMPBO7S.js";
12
+ import "../chunks/chunk-2CVHXFK7.js";
13
+ import "../chunks/chunk-CPMHA4W5.js";
14
+ import "../chunks/chunk-FYQWPEEY.js";
15
+ export {
16
+ GENE_ROW_PX,
17
+ drawTubeMapGenes,
18
+ tubeMapGeneRows,
19
+ tubeMapGenes
20
+ };
@@ -0,0 +1,6 @@
1
+ import {
2
+ tubeMapMismatches
3
+ } from "../chunks/chunk-EJ5OZTCK.js";
4
+ export {
5
+ tubeMapMismatches
6
+ };