@jbrowse/bandage-core 8.1.0 → 8.2.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.
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  walkRows
3
- } from "./chunk-SZNZ2T6D.js";
3
+ } from "./chunk-MAUEPAMG.js";
4
4
  import {
5
5
  ROW_HEIGHT_PX
6
6
  } from "./chunk-CPMHA4W5.js";
@@ -1,5 +1,5 @@
1
1
  // src/version.ts
2
- var version = "8.1.0";
2
+ var version = "8.2.0";
3
3
 
4
4
  export {
5
5
  version
@@ -14,7 +14,7 @@ import {
14
14
  } from "./chunk-HNQPEMYE.js";
15
15
  import {
16
16
  walkRowLayout
17
- } from "./chunk-MP7LXLWV.js";
17
+ } from "./chunk-3C5UXR2U.js";
18
18
  import {
19
19
  isBackbone,
20
20
  isOffReference
@@ -8,12 +8,12 @@ import {
8
8
  stripGeneGaps,
9
9
  walkStripFrame,
10
10
  walkStripLabelsTree
11
- } from "./chunk-O2ANJQVH.js";
11
+ } from "./chunk-WDTXW7T2.js";
12
12
  import {
13
13
  walkRowsKey,
14
14
  walkRowsKeyTree,
15
15
  walkRowsTree
16
- } from "./chunk-V3MD3IZB.js";
16
+ } from "./chunk-MIW3HYPE.js";
17
17
  import {
18
18
  Canvas2DRenderer
19
19
  } from "./chunk-2WNBVB55.js";
@@ -42,14 +42,14 @@ import {
42
42
  } from "./chunk-HBEKUQO4.js";
43
43
  import {
44
44
  version
45
- } from "./chunk-T4SQ5QGM.js";
45
+ } from "./chunk-3FXPFVKJ.js";
46
46
  import {
47
47
  axisScaleOf
48
48
  } from "./chunk-TL4B342F.js";
49
49
  import {
50
50
  walkRowLabels,
51
51
  walkRowsExtent
52
- } from "./chunk-MP7LXLWV.js";
52
+ } from "./chunk-3C5UXR2U.js";
53
53
  import {
54
54
  nodeInk
55
55
  } from "./chunk-PBENCR5L.js";
@@ -53,12 +53,16 @@ function sliceBetween(steps, span, region, flanked = true) {
53
53
  if (!region || !flanked) {
54
54
  return { ids: steps, complete: true, from: -1, to: -1 };
55
55
  }
56
+ const spanAt = (i) => {
57
+ const id = steps[i];
58
+ return typeof id === "string" ? span.get(id) : void 0;
59
+ };
56
60
  let i0 = -1;
57
61
  let i1 = -1;
58
62
  let bestEnd = -Infinity;
59
63
  let bestStart = Infinity;
60
- steps.forEach((id, i) => {
61
- const s = typeof id === "string" ? span.get(id) : void 0;
64
+ steps.forEach((_, i) => {
65
+ const s = spanAt(i);
62
66
  if (s) {
63
67
  if (s.end <= region.start && s.end > bestEnd) {
64
68
  bestEnd = s.end;
@@ -70,15 +74,38 @@ function sliceBetween(steps, span, region, flanked = true) {
70
74
  }
71
75
  }
72
76
  });
73
- if (i0 < 0 || i1 < 0) {
77
+ if (i0 >= 0 && i1 >= 0) {
78
+ const ids2 = steps.slice(Math.min(i0, i1) + 1, Math.max(i0, i1));
79
+ return {
80
+ ids: i0 < i1 ? ids2 : ids2.reverse(),
81
+ complete: true,
82
+ from: i0,
83
+ to: i1
84
+ };
85
+ }
86
+ const flank = i0 >= 0 ? i0 : i1;
87
+ let near = -1;
88
+ for (let d = 1; flank >= 0 && near < 0 && d < steps.length; d++) {
89
+ near = [flank - d, flank + d].find((j) => spanAt(j) !== void 0) ?? -1;
90
+ }
91
+ if (near < 0) {
74
92
  return { ids: steps, complete: false, from: -1, to: -1 };
75
93
  }
76
- const ids = steps.slice(Math.min(i0, i1) + 1, Math.max(i0, i1));
94
+ const forward = near > flank === spanAt(near).start > spanAt(flank).start;
95
+ const after = forward === (flank === i0);
96
+ const ids = after ? steps.slice(flank + 1) : steps.slice(0, flank).reverse();
97
+ const last = ids.length > 0 ? ids.length - 1 : -1;
98
+ const end = last < 0 ? spanAt(flank) : spanAt(after ? flank + 1 + last : 0);
99
+ const stop = {
100
+ contigEnds: end !== void 0,
101
+ shortBp: !end ? 0 : Math.max(0, region.start - end.end, end.start - region.end)
102
+ };
77
103
  return {
78
- ids: i0 < i1 ? ids : ids.reverse(),
79
- complete: true,
80
- from: i0,
81
- to: i1
104
+ ids,
105
+ complete: false,
106
+ from: flank,
107
+ to: after ? steps.length : -1,
108
+ stop
82
109
  };
83
110
  }
84
111
  function filterSamples(rows, samples) {
@@ -117,7 +144,7 @@ function walkRows(graph, region, unit) {
117
144
  const rowOf = (pieces) => {
118
145
  const path = pieces[0];
119
146
  const ordered = [...pieces].sort((a, b) => (a.start ?? 0) - (b.start ?? 0));
120
- const { ids, complete, from, to } = sliceBetween(
147
+ const { ids, complete, from, to, stop } = sliceBetween(
121
148
  stepsOf(ordered, lengthOf),
122
149
  span,
123
150
  cut,
@@ -177,6 +204,7 @@ function walkRows(graph, region, unit) {
177
204
  offReferenceBp,
178
205
  gapBp,
179
206
  complete,
207
+ stop,
180
208
  runs,
181
209
  axis
182
210
  };
@@ -34,15 +34,24 @@ function units(bp, unit) {
34
34
  return unit ? ` \u2248 ${Math.round(bp / unit)} units` : "";
35
35
  }
36
36
  function walkRowReadout(row, reference, unit, call) {
37
- const { bp, gapBp, complete } = row;
37
+ const { bp, gapBp, complete, stop } = row;
38
38
  if (!reference) {
39
39
  return `${kb(bp)}${units(bp, unit)}`;
40
40
  }
41
- const delta = bp - reference.bp;
42
- const against = delta === 0 ? "" : ` (${delta > 0 ? "+" : "\u2212"}${kb(Math.abs(delta))})`;
43
41
  const outside = gapBp > 0 ? ` \xB7 ${kb(gapBp)} outside the cut` : "";
44
42
  const called = call ? ` \xB7 called ${kb(call.bp)}${call.spanningReads === 0 ? " \xB7 no spanning read" : ""}` : "";
45
- return `${kb(bp)}${units(bp, unit)}${against}${outside}${complete ? "" : " \xB7 partial walk"}${called}`;
43
+ if (complete) {
44
+ const delta = bp - reference.bp;
45
+ const against = delta === 0 ? "" : ` (${delta > 0 ? "+" : "\u2212"}${kb(Math.abs(delta))})`;
46
+ return `${kb(bp)}${units(bp, unit)}${against}${outside}${called}`;
47
+ }
48
+ const region = unit ? "repeat" : "window";
49
+ if (stop?.contigEnds && bp === 0) {
50
+ const where = stop.shortBp > 0 ? `${kb(stop.shortBp)} before` : "at";
51
+ return `contig ends ${where} the ${region}${called}`;
52
+ }
53
+ const why = !stop ? "partial walk" : stop.contigEnds ? `contig ends inside the ${region}` : "does not rejoin the reference within the cut";
54
+ return `\u2265 ${kb(bp)}${units(bp, unit)} \xB7 ${why}${outside}${called}`;
46
55
  }
47
56
  function readoutPlacement(text, endX, width) {
48
57
  const x = endX + 6;
@@ -2,7 +2,7 @@ import {
2
2
  alongRow,
3
3
  boxesGenes,
4
4
  rowPitch
5
- } from "./chunk-V3MD3IZB.js";
5
+ } from "./chunk-MIW3HYPE.js";
6
6
  import {
7
7
  LABEL_CHAR_PX
8
8
  } from "./chunk-AB35TJST.js";
@@ -7,7 +7,7 @@ import {
7
7
  import {
8
8
  LAYOUT_MODES,
9
9
  layoutModeByValue
10
- } from "../chunks/chunk-3PYY7OIP.js";
10
+ } from "../chunks/chunk-CF62U3QS.js";
11
11
  import "../chunks/chunk-W2I4DOL4.js";
12
12
  import "../chunks/chunk-TEDQJPMI.js";
13
13
  import "../chunks/chunk-LOEA5IHZ.js";
@@ -35,14 +35,14 @@ import "../chunks/chunk-LYJ4US66.js";
35
35
  import "../chunks/chunk-7XHHVYG7.js";
36
36
  import {
37
37
  figureSvg
38
- } from "../chunks/chunk-DYYIHN3P.js";
38
+ } from "../chunks/chunk-DE4UFDUZ.js";
39
39
  import "../chunks/chunk-LOCJN3BZ.js";
40
40
  import "../chunks/chunk-47DYCZOK.js";
41
- import "../chunks/chunk-O2ANJQVH.js";
41
+ import "../chunks/chunk-WDTXW7T2.js";
42
42
  import {
43
43
  genesOnRow,
44
44
  placeRowGenes
45
- } from "../chunks/chunk-V3MD3IZB.js";
45
+ } from "../chunks/chunk-MIW3HYPE.js";
46
46
  import "../chunks/chunk-2WNBVB55.js";
47
47
  import "../chunks/chunk-4BYTEJGW.js";
48
48
  import "../chunks/chunk-3S3YVOJ7.js";
@@ -53,13 +53,13 @@ import "../chunks/chunk-2LQ5BWT7.js";
53
53
  import "../chunks/chunk-6ZNQJ5ZD.js";
54
54
  import "../chunks/chunk-HBEKUQO4.js";
55
55
  import "../chunks/chunk-G2FD7S3C.js";
56
- import "../chunks/chunk-T4SQ5QGM.js";
56
+ import "../chunks/chunk-3FXPFVKJ.js";
57
57
  import "../chunks/chunk-TL4B342F.js";
58
- import "../chunks/chunk-MP7LXLWV.js";
58
+ import "../chunks/chunk-3C5UXR2U.js";
59
59
  import {
60
60
  filterSamples,
61
61
  walkRows
62
- } from "../chunks/chunk-SZNZ2T6D.js";
62
+ } from "../chunks/chunk-MAUEPAMG.js";
63
63
  import "../chunks/chunk-PBENCR5L.js";
64
64
  import "../chunks/chunk-7GBL7SJY.js";
65
65
  import {
package/dist/figure.js CHANGED
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  figureSvg
3
- } from "./chunks/chunk-DYYIHN3P.js";
3
+ } from "./chunks/chunk-DE4UFDUZ.js";
4
4
  import "./chunks/chunk-LOCJN3BZ.js";
5
5
  import "./chunks/chunk-47DYCZOK.js";
6
- import "./chunks/chunk-O2ANJQVH.js";
7
- import "./chunks/chunk-V3MD3IZB.js";
6
+ import "./chunks/chunk-WDTXW7T2.js";
7
+ import "./chunks/chunk-MIW3HYPE.js";
8
8
  import "./chunks/chunk-2WNBVB55.js";
9
9
  import "./chunks/chunk-4BYTEJGW.js";
10
10
  import "./chunks/chunk-3S3YVOJ7.js";
@@ -15,10 +15,10 @@ import "./chunks/chunk-2LQ5BWT7.js";
15
15
  import "./chunks/chunk-6ZNQJ5ZD.js";
16
16
  import "./chunks/chunk-HBEKUQO4.js";
17
17
  import "./chunks/chunk-G2FD7S3C.js";
18
- import "./chunks/chunk-T4SQ5QGM.js";
18
+ import "./chunks/chunk-3FXPFVKJ.js";
19
19
  import "./chunks/chunk-TL4B342F.js";
20
- import "./chunks/chunk-MP7LXLWV.js";
21
- import "./chunks/chunk-SZNZ2T6D.js";
20
+ import "./chunks/chunk-3C5UXR2U.js";
21
+ import "./chunks/chunk-MAUEPAMG.js";
22
22
  import "./chunks/chunk-PBENCR5L.js";
23
23
  import "./chunks/chunk-7GBL7SJY.js";
24
24
  import "./chunks/chunk-RAKOB6IV.js";
package/dist/index.js CHANGED
@@ -69,7 +69,7 @@ import {
69
69
  LAYOUT_MODES,
70
70
  layoutModeByValue,
71
71
  modeUsesLayoutEngine
72
- } from "./chunks/chunk-3PYY7OIP.js";
72
+ } from "./chunks/chunk-CF62U3QS.js";
73
73
  import "./chunks/chunk-W2I4DOL4.js";
74
74
  import "./chunks/chunk-TEDQJPMI.js";
75
75
  import "./chunks/chunk-LOEA5IHZ.js";
@@ -112,7 +112,7 @@ import {
112
112
  } from "./chunks/chunk-7XHHVYG7.js";
113
113
  import {
114
114
  figureSvg
115
- } from "./chunks/chunk-DYYIHN3P.js";
115
+ } from "./chunks/chunk-DE4UFDUZ.js";
116
116
  import {
117
117
  layoutGeometryInputs
118
118
  } from "./chunks/chunk-LOCJN3BZ.js";
@@ -130,7 +130,7 @@ import {
130
130
  walkStripApplies,
131
131
  walkStripFrame,
132
132
  walkStripLabelsTree
133
- } from "./chunks/chunk-O2ANJQVH.js";
133
+ } from "./chunks/chunk-WDTXW7T2.js";
134
134
  import {
135
135
  BAR_PX,
136
136
  CALL_TICK,
@@ -157,7 +157,7 @@ import {
157
157
  walkRowsKey,
158
158
  walkRowsKeyTree,
159
159
  walkRowsTree
160
- } from "./chunks/chunk-V3MD3IZB.js";
160
+ } from "./chunks/chunk-MIW3HYPE.js";
161
161
  import {
162
162
  Canvas2DRenderer
163
163
  } from "./chunks/chunk-2WNBVB55.js";
@@ -204,7 +204,7 @@ import {
204
204
  import "./chunks/chunk-G2FD7S3C.js";
205
205
  import {
206
206
  version
207
- } from "./chunks/chunk-T4SQ5QGM.js";
207
+ } from "./chunks/chunk-3FXPFVKJ.js";
208
208
  import {
209
209
  axisScaleOf,
210
210
  contains,
@@ -216,11 +216,11 @@ import {
216
216
  import {
217
217
  walkRowLabels,
218
218
  walkRowsExtent
219
- } from "./chunks/chunk-MP7LXLWV.js";
219
+ } from "./chunks/chunk-3C5UXR2U.js";
220
220
  import {
221
221
  filterSamples,
222
222
  walkRows
223
- } from "./chunks/chunk-SZNZ2T6D.js";
223
+ } from "./chunks/chunk-MAUEPAMG.js";
224
224
  import {
225
225
  NODE_WIDTHS,
226
226
  maxNodeWidthPx,
@@ -26,7 +26,7 @@ import {
26
26
  walkRowsKey,
27
27
  walkRowsKeyTree,
28
28
  walkRowsTree
29
- } from "../chunks/chunk-V3MD3IZB.js";
29
+ } from "../chunks/chunk-MIW3HYPE.js";
30
30
  import "../chunks/chunk-6ZNQJ5ZD.js";
31
31
  import "../chunks/chunk-HBEKUQO4.js";
32
32
  import "../chunks/chunk-G2FD7S3C.js";
@@ -2,8 +2,8 @@ import {
2
2
  walkRowLabels,
3
3
  walkRowLayout,
4
4
  walkRowsExtent
5
- } from "../chunks/chunk-MP7LXLWV.js";
6
- import "../chunks/chunk-SZNZ2T6D.js";
5
+ } from "../chunks/chunk-3C5UXR2U.js";
6
+ import "../chunks/chunk-MAUEPAMG.js";
7
7
  import "../chunks/chunk-ST2IBUAN.js";
8
8
  import "../chunks/chunk-BPLIXMH7.js";
9
9
  import "../chunks/chunk-CPMHA4W5.js";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  filterSamples,
3
3
  walkRows
4
- } from "../chunks/chunk-SZNZ2T6D.js";
4
+ } from "../chunks/chunk-MAUEPAMG.js";
5
5
  import "../chunks/chunk-ST2IBUAN.js";
6
6
  import "../chunks/chunk-BPLIXMH7.js";
7
7
  import "../chunks/chunk-FYQWPEEY.js";
@@ -9,10 +9,10 @@ import {
9
9
  walkStripApplies,
10
10
  walkStripFrame,
11
11
  walkStripLabelsTree
12
- } from "../chunks/chunk-O2ANJQVH.js";
12
+ } from "../chunks/chunk-WDTXW7T2.js";
13
13
  import {
14
14
  LABELLED_ROW_PX
15
- } from "../chunks/chunk-V3MD3IZB.js";
15
+ } from "../chunks/chunk-MIW3HYPE.js";
16
16
  import "../chunks/chunk-6ZNQJ5ZD.js";
17
17
  import "../chunks/chunk-HBEKUQO4.js";
18
18
  import "../chunks/chunk-G2FD7S3C.js";
@@ -4,7 +4,7 @@ import {
4
4
  LAYOUT_MODE_VALUES,
5
5
  layoutModeByValue,
6
6
  modeUsesLayoutEngine
7
- } from "./chunks/chunk-3PYY7OIP.js";
7
+ } from "./chunks/chunk-CF62U3QS.js";
8
8
  import "./chunks/chunk-W2I4DOL4.js";
9
9
  import "./chunks/chunk-TEDQJPMI.js";
10
10
  import "./chunks/chunk-LOEA5IHZ.js";
@@ -13,8 +13,8 @@ import "./chunks/chunk-TZFWUT2C.js";
13
13
  import "./chunks/chunk-C44YRP5F.js";
14
14
  import "./chunks/chunk-RVS2QCOX.js";
15
15
  import "./chunks/chunk-HNQPEMYE.js";
16
- import "./chunks/chunk-MP7LXLWV.js";
17
- import "./chunks/chunk-SZNZ2T6D.js";
16
+ import "./chunks/chunk-3C5UXR2U.js";
17
+ import "./chunks/chunk-MAUEPAMG.js";
18
18
  import "./chunks/chunk-7GBL7SJY.js";
19
19
  import "./chunks/chunk-3ZZSX5HN.js";
20
20
  import "./chunks/chunk-AB35TJST.js";
@@ -68,7 +68,7 @@ export { BUBBLE_KIND_COLORS, BUBBLE_KIND_NAMES, bubbleSegmentIds, classifyBubble
68
68
  export { bubbleSubgraph } from './bubbles/popBubble.js';
69
69
  export type { MinigraphBubble } from './bubbles/bubbleLine.js';
70
70
  export { filterSamples, walkRows } from './layout/walkRows.js';
71
- export type { WalkAxis, WalkRow, WalkRows, WalkRun } from './layout/walkRows.js';
71
+ export type { WalkAxis, WalkRow, WalkRows, WalkRun, WalkStop, } from './layout/walkRows.js';
72
72
  export { BAR_PX as WALK_BAR_PX, CALL_TICK as WALK_CALL_TICK, DISAGREES as WALK_DISAGREES, GAP_PX as WALK_GAP_PX, GENE_INK as WALK_GENE_INK, OFF_REFERENCE as WALK_OFF_REFERENCE, ON_REFERENCE as WALK_ON_REFERENCE, OUTSIDE_CUT as WALK_OUTSIDE_CUT, UNBACKED_TICK as WALK_UNBACKED_TICK, alongRow, callTickInk, coalesceRuns, genesOnRow, placeRowGenes, readoutPlacement, rowGeneBoxes, rowPitch, rowSpan, runPaint, unitTicks, walkRowReadout, walkRowsKey, walkRowsKeyTree, walkRowsTree, } from './layout/walkRowDraw.js';
73
73
  export type { GeneBox, GeneGaps, KeyEntry, KeySwatch, ReadoutCall, RowGene, RowPitch, WalkRowsFrame, WalkRowsWithCalls, } from './layout/walkRowDraw.js';
74
74
  export { LABELLED_ROW_PX, WALK_STRIP_CEILING_PX, segmentAt, stripGeneGaps, stripMarks, stripRowAt, walkMarksTree, walkStripFrame, walkStripLabelsTree, } from './layout/walkStrip.js';
@@ -14,7 +14,7 @@ export interface ReadoutCall {
14
14
  spanningReads?: number;
15
15
  agrees?: boolean;
16
16
  }
17
- export declare function walkRowReadout(row: Pick<WalkRow, 'bp' | 'gapBp' | 'complete'>, reference: Pick<WalkRow, 'bp'> | undefined, unit?: number, call?: ReadoutCall): string;
17
+ export declare function walkRowReadout(row: Pick<WalkRow, 'bp' | 'gapBp' | 'complete' | 'stop'>, reference: Pick<WalkRow, 'bp'> | undefined, unit?: number, call?: ReadoutCall): string;
18
18
  export declare function readoutPlacement(text: string, endX: number, width: number): {
19
19
  x: number;
20
20
  anchor: "start";
@@ -12,6 +12,10 @@ export interface WalkAxis {
12
12
  start: number;
13
13
  reversed: boolean;
14
14
  }
15
+ export interface WalkStop {
16
+ contigEnds: boolean;
17
+ shortBp: number;
18
+ }
15
19
  export interface WalkRow {
16
20
  name: string;
17
21
  label: string;
@@ -21,6 +25,7 @@ export interface WalkRow {
21
25
  offReferenceBp: number;
22
26
  gapBp: number;
23
27
  complete: boolean;
28
+ stop?: WalkStop;
24
29
  runs: WalkRun[];
25
30
  axis?: WalkAxis;
26
31
  }
@@ -1 +1 @@
1
- export declare const version = "8.1.0";
1
+ export declare const version = "8.2.0";
package/dist/version.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  version
3
- } from "./chunks/chunk-T4SQ5QGM.js";
3
+ } from "./chunks/chunk-3FXPFVKJ.js";
4
4
  export {
5
5
  version
6
6
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jbrowse/bandage-core",
3
- "version": "8.1.0",
3
+ "version": "8.2.0",
4
4
  "description": "Pangenome graph layout and drawing with no host: GFA in, the Bandage force-directed engine and reference-anchored layouts, a Canvas2D renderer, hit testing and labels out",
5
5
  "license": "GPL-3.0-or-later",
6
6
  "repository": {