@jbrowse/bandage-core 11.2.0 → 11.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.
- package/README.md +4 -2
- package/dist/chunks/{chunk-5GRF7PJX.js → chunk-3HGYGISG.js} +4 -4
- package/dist/chunks/{chunk-A7VSP7MQ.js → chunk-3LZ334X4.js} +1 -1
- package/dist/chunks/{chunk-QTDBOJJO.js → chunk-7O7EGTYG.js} +1 -1
- package/dist/chunks/{chunk-3XSRT7RQ.js → chunk-B5ARSBOH.js} +36 -30
- package/dist/chunks/{chunk-RNYPCQZ3.js → chunk-BXLLMWC3.js} +1 -1
- package/dist/chunks/{chunk-AI5PTOSV.js → chunk-CE6ZIKJX.js} +1 -1
- package/dist/chunks/{chunk-W6EXQDV5.js → chunk-EFD753MS.js} +1 -1
- package/dist/chunks/chunk-JDZ5GTZT.js +20 -0
- package/dist/chunks/chunk-M75QPZNJ.js +502 -0
- package/dist/chunks/{chunk-ZU54STUX.js → chunk-PNM6Z3IE.js} +1 -1
- package/dist/chunks/{chunk-KDU4EF66.js → chunk-REOWLPH4.js} +1 -1
- package/dist/chunks/{chunk-VWT3WZRQ.js → chunk-RNNYRNDU.js} +10 -10
- package/dist/chunks/{chunk-TREAOGDV.js → chunk-SLDCKMIP.js} +6 -6
- package/dist/chunks/{chunk-S2PUF4SX.js → chunk-T35BSLW5.js} +3 -3
- package/dist/chunks/{chunk-VQT3A57T.js → chunk-TEXAKEJX.js} +2 -2
- package/dist/chunks/{chunk-C2TAJTUO.js → chunk-TJOOHTJ6.js} +1 -1
- package/dist/chunks/{chunk-QR5XR5XL.js → chunk-TZLEHZVC.js} +8 -4
- package/dist/chunks/chunk-UFUSPK2A.js +227 -0
- package/dist/chunks/{chunk-WAST7UVB.js → chunk-XEWPWCML.js} +1 -1
- package/dist/cli/figure.js +16 -15
- package/dist/cli/fold.js +2 -2
- package/dist/figure.js +13 -12
- package/dist/figureData.js +12 -11
- package/dist/figureScene.js +7 -6
- package/dist/figureSettings.js +3 -3
- package/dist/gfa/graphTables.js +7 -3
- package/dist/index.js +47 -27
- package/dist/layout/forceCache.js +3 -3
- package/dist/layout/tubeMapLayout.js +4 -2
- package/dist/layout/walkRowLayout.js +6 -2
- package/dist/layout/walkRowLinks.js +12 -0
- package/dist/layout/walkRowRuns.js +20 -0
- package/dist/layout/walkRows.js +5 -2
- package/dist/layout/walkStrip.js +5 -3
- package/dist/layoutModes.js +6 -4
- package/dist/pipeline.js +2 -2
- package/dist/tubeMap/bundle.js +5 -3
- package/dist/tubeMap/coarsen.js +5 -3
- package/dist/tubeMap/deviations.js +5 -3
- package/dist/tubeMap/draw.js +5 -3
- package/dist/types/gfa/graphTables.d.ts +10 -1
- package/dist/types/index.d.ts +5 -1
- package/dist/types/layout/walkRowLayout.d.ts +4 -0
- package/dist/types/layout/walkRowLinks.d.ts +32 -0
- package/dist/types/layout/walkRowRuns.d.ts +56 -0
- package/dist/types/layout/walkRows.d.ts +2 -1
- package/dist/types/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/viewport.js +3 -3
- package/package.json +1 -1
- package/dist/chunks/chunk-5DHOFF4C.js +0 -322
|
@@ -0,0 +1,502 @@
|
|
|
1
|
+
import {
|
|
2
|
+
tableNodeIds,
|
|
3
|
+
tablePath
|
|
4
|
+
} from "./chunk-B5ARSBOH.js";
|
|
5
|
+
import {
|
|
6
|
+
pathOrigin
|
|
7
|
+
} from "./chunk-B5X2RLJG.js";
|
|
8
|
+
import {
|
|
9
|
+
gapParts
|
|
10
|
+
} from "./chunk-EIY2SKD3.js";
|
|
11
|
+
import {
|
|
12
|
+
groupBy
|
|
13
|
+
} from "./chunk-BSOZW3FC.js";
|
|
14
|
+
import {
|
|
15
|
+
panSNContig,
|
|
16
|
+
panSNSample
|
|
17
|
+
} from "./chunk-4XWZNPQ2.js";
|
|
18
|
+
|
|
19
|
+
// src/layout/walkRowRuns.ts
|
|
20
|
+
var RUN_ON_REFERENCE = 1;
|
|
21
|
+
var RUN_REVERSED = 2;
|
|
22
|
+
var RUN_GAP = 4;
|
|
23
|
+
var GAP_CAUSES = [void 0, "missing", "elsewhere", "unknown"];
|
|
24
|
+
var CAUSE_SHIFT = 3;
|
|
25
|
+
var causeFlags = (cause) => GAP_CAUSES.indexOf(cause) << CAUSE_SHIFT;
|
|
26
|
+
function referenceOf(names, referencePath, rankZero) {
|
|
27
|
+
return referencePath !== void 0 && names.includes(referencePath) ? referencePath : names.find((n) => rankZero.has(n)) ?? names[0];
|
|
28
|
+
}
|
|
29
|
+
function referenceWalkName(graph) {
|
|
30
|
+
return referenceOf(
|
|
31
|
+
(graph.paths ?? []).map((p) => pathOrigin(p.name).name),
|
|
32
|
+
graph.referencePath,
|
|
33
|
+
new Set(
|
|
34
|
+
graph.nodes.flatMap(
|
|
35
|
+
(n) => n.stable?.rank === 0 ? [n.stable.refName] : []
|
|
36
|
+
)
|
|
37
|
+
)
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
function graphPieces(graph) {
|
|
41
|
+
const index = /* @__PURE__ */ new Map();
|
|
42
|
+
const names = [];
|
|
43
|
+
const lengths = [];
|
|
44
|
+
const indexOf = (id) => {
|
|
45
|
+
let i = index.get(id);
|
|
46
|
+
if (i === void 0) {
|
|
47
|
+
i = names.length;
|
|
48
|
+
index.set(id, i);
|
|
49
|
+
names.push(id);
|
|
50
|
+
lengths.push(0);
|
|
51
|
+
}
|
|
52
|
+
return i;
|
|
53
|
+
};
|
|
54
|
+
for (const node of graph.nodes) {
|
|
55
|
+
lengths[indexOf(node.id)] = node.length;
|
|
56
|
+
}
|
|
57
|
+
const heads = graph.paths ?? [];
|
|
58
|
+
const from = new Int32Array(heads.length);
|
|
59
|
+
const to = new Int32Array(heads.length);
|
|
60
|
+
const steps = [];
|
|
61
|
+
heads.forEach((path, p) => {
|
|
62
|
+
from[p] = steps.length;
|
|
63
|
+
for (const id of path.nodeIds) {
|
|
64
|
+
steps.push(indexOf(id));
|
|
65
|
+
}
|
|
66
|
+
to[p] = steps.length;
|
|
67
|
+
});
|
|
68
|
+
return {
|
|
69
|
+
heads,
|
|
70
|
+
from,
|
|
71
|
+
to,
|
|
72
|
+
steps,
|
|
73
|
+
lengths,
|
|
74
|
+
names,
|
|
75
|
+
reference: referenceWalkName(graph)
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
function tablePieces(tables, referencePath, visits) {
|
|
79
|
+
const { nodes: n, walks: w } = tables;
|
|
80
|
+
const kept = [];
|
|
81
|
+
for (let p = 0; p < w.names.length; p++) {
|
|
82
|
+
if (w.offsets[p + 1] > w.offsets[p]) {
|
|
83
|
+
kept.push(p);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
const heads = kept.map((p) => tablePath(w, p));
|
|
87
|
+
const rankZero = /* @__PURE__ */ new Set();
|
|
88
|
+
for (let i = 0; i < n.lengths.length; i++) {
|
|
89
|
+
if (n.refs[i] >= 0 && n.ranks[i] === 0) {
|
|
90
|
+
rankZero.add(n.refNames[n.refs[i]]);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return {
|
|
94
|
+
heads,
|
|
95
|
+
from: kept.map((p) => w.offsets[p]),
|
|
96
|
+
to: kept.map((p) => w.offsets[p + 1]),
|
|
97
|
+
steps: w.steps,
|
|
98
|
+
lengths: n.lengths,
|
|
99
|
+
// a visit names its node as the Graph does, which costs a pass over the
|
|
100
|
+
// steps
|
|
101
|
+
names: visits ? tableNodeIds(tables) : n.names,
|
|
102
|
+
reference: referenceOf(
|
|
103
|
+
heads.map((h) => pathOrigin(h.name).name),
|
|
104
|
+
referencePath,
|
|
105
|
+
rankZero
|
|
106
|
+
)
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
function sampleOf(path) {
|
|
110
|
+
return path.sample ?? panSNSample(path.name);
|
|
111
|
+
}
|
|
112
|
+
function labelOf(path) {
|
|
113
|
+
return path.haplotype !== void 0 && path.sample !== void 0 ? `${path.sample}#${path.haplotype}` : sampleOf(path);
|
|
114
|
+
}
|
|
115
|
+
var Columns = class {
|
|
116
|
+
constructor(width) {
|
|
117
|
+
this.offsets = [0];
|
|
118
|
+
this.values = Array.from({ length: width }, () => []);
|
|
119
|
+
}
|
|
120
|
+
get length() {
|
|
121
|
+
return this.values[0].length;
|
|
122
|
+
}
|
|
123
|
+
push(...row) {
|
|
124
|
+
row.forEach((v, i) => this.values[i].push(v));
|
|
125
|
+
}
|
|
126
|
+
endRow() {
|
|
127
|
+
this.offsets.push(this.length);
|
|
128
|
+
}
|
|
129
|
+
// the rows in `order`, column i in the array `make[i]` makes
|
|
130
|
+
reorder(order, make) {
|
|
131
|
+
const columns = make.map((m) => m(this.length));
|
|
132
|
+
const offsets = new Uint32Array(order.length + 1);
|
|
133
|
+
let at = 0;
|
|
134
|
+
order.forEach((row, i) => {
|
|
135
|
+
for (let k = this.offsets[row]; k < this.offsets[row + 1]; k++, at++) {
|
|
136
|
+
columns.forEach((column, c) => {
|
|
137
|
+
column[at] = this.values[c][k];
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
offsets[i + 1] = at;
|
|
141
|
+
});
|
|
142
|
+
return { offsets, columns };
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
var float64 = (n) => new Float64Array(n);
|
|
146
|
+
function walkRowRuns(source, region, o = {}) {
|
|
147
|
+
const {
|
|
148
|
+
heads,
|
|
149
|
+
from,
|
|
150
|
+
to,
|
|
151
|
+
steps: all,
|
|
152
|
+
lengths,
|
|
153
|
+
names,
|
|
154
|
+
reference
|
|
155
|
+
} = "walks" in source ? tablePieces(source, o.referencePath, o.visits) : graphPieces(source);
|
|
156
|
+
const declared = lengths.length;
|
|
157
|
+
const lengthOf = (node) => node < declared ? lengths[node] : 0;
|
|
158
|
+
const nameOf = (p) => pathOrigin(heads[p].name).name;
|
|
159
|
+
const startOf = (p) => heads[p].start;
|
|
160
|
+
const byStart = (a, b) => (startOf(a) ?? 0) - (startOf(b) ?? 0);
|
|
161
|
+
const pieceIds = heads.map((_, p) => p);
|
|
162
|
+
const referencePieces = pieceIds.filter((p) => nameOf(p) === reference).sort(byStart);
|
|
163
|
+
const first = referencePieces[0];
|
|
164
|
+
const others = pieceIds.filter((p) => nameOf(p) !== reference);
|
|
165
|
+
if (first === void 0 || others.length === 0) {
|
|
166
|
+
return void 0;
|
|
167
|
+
}
|
|
168
|
+
const walks = groupBy(others, nameOf);
|
|
169
|
+
const spanStart = new Float64Array(names.length).fill(Number.NaN);
|
|
170
|
+
const spanEnd = new Float64Array(names.length);
|
|
171
|
+
let reachesBefore = false;
|
|
172
|
+
let reachesAfter = false;
|
|
173
|
+
const cut = region && region.end > region.start ? region : void 0;
|
|
174
|
+
for (const piece of referencePieces) {
|
|
175
|
+
let pos = startOf(piece) ?? 0;
|
|
176
|
+
for (let s = from[piece]; s < to[piece]; s++) {
|
|
177
|
+
const node = all[s];
|
|
178
|
+
const len = lengthOf(node);
|
|
179
|
+
if (Number.isNaN(spanStart[node])) {
|
|
180
|
+
spanStart[node] = pos;
|
|
181
|
+
spanEnd[node] = pos + len;
|
|
182
|
+
if (cut) {
|
|
183
|
+
reachesBefore ||= pos + len <= cut.start;
|
|
184
|
+
reachesAfter ||= pos >= cut.end;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
pos += len;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
const flanked = cut === void 0 || reachesBefore && reachesAfter;
|
|
191
|
+
const runs = new Columns(5);
|
|
192
|
+
const chunks = [];
|
|
193
|
+
const chunkIndex = /* @__PURE__ */ new Map();
|
|
194
|
+
const chunkOf = (chunk2) => {
|
|
195
|
+
if (!chunk2) {
|
|
196
|
+
return -1;
|
|
197
|
+
}
|
|
198
|
+
const key = `${chunk2.refName}:${chunk2.start}`;
|
|
199
|
+
let i = chunkIndex.get(key);
|
|
200
|
+
if (i === void 0) {
|
|
201
|
+
i = chunks.length;
|
|
202
|
+
chunkIndex.set(key, i);
|
|
203
|
+
chunks.push(chunk2);
|
|
204
|
+
}
|
|
205
|
+
return i;
|
|
206
|
+
};
|
|
207
|
+
const visits = o.visits ? new Columns(4) : void 0;
|
|
208
|
+
let steps = new Int32Array(0);
|
|
209
|
+
let stepStart = new Float64Array(0);
|
|
210
|
+
const rowOf = (pieces) => {
|
|
211
|
+
const head = heads[pieces[0]];
|
|
212
|
+
const ordered = [...pieces].sort(byStart);
|
|
213
|
+
let count = ordered.length - 1;
|
|
214
|
+
for (const piece of ordered) {
|
|
215
|
+
count += to[piece] - from[piece];
|
|
216
|
+
}
|
|
217
|
+
if (count > steps.length) {
|
|
218
|
+
steps = new Int32Array(count * 2);
|
|
219
|
+
stepStart = new Float64Array(count * 2);
|
|
220
|
+
}
|
|
221
|
+
let length = 0;
|
|
222
|
+
let unplaced = false;
|
|
223
|
+
let end;
|
|
224
|
+
let previous;
|
|
225
|
+
const partsAt = /* @__PURE__ */ new Map();
|
|
226
|
+
for (const piece of ordered) {
|
|
227
|
+
const start2 = startOf(piece);
|
|
228
|
+
if (start2 === void 0 || end !== void 0 && start2 < end) {
|
|
229
|
+
unplaced = true;
|
|
230
|
+
}
|
|
231
|
+
if (end !== void 0 && start2 !== void 0 && start2 > end) {
|
|
232
|
+
partsAt.set(
|
|
233
|
+
length,
|
|
234
|
+
gapParts(
|
|
235
|
+
start2 - end,
|
|
236
|
+
previous === void 0 ? void 0 : heads[previous].after,
|
|
237
|
+
heads[piece].before
|
|
238
|
+
)
|
|
239
|
+
);
|
|
240
|
+
steps[length] = -(start2 - end);
|
|
241
|
+
stepStart[length++] = end;
|
|
242
|
+
}
|
|
243
|
+
let pos = start2 ?? 0;
|
|
244
|
+
for (let s = from[piece]; s < to[piece]; s++) {
|
|
245
|
+
const node = all[s];
|
|
246
|
+
steps[length] = node;
|
|
247
|
+
stepStart[length++] = pos;
|
|
248
|
+
pos += lengthOf(node);
|
|
249
|
+
}
|
|
250
|
+
end = start2 === void 0 ? void 0 : pos;
|
|
251
|
+
previous = piece;
|
|
252
|
+
}
|
|
253
|
+
const onReference = (i) => i >= 0 && i < length && steps[i] >= 0 && !Number.isNaN(spanStart[steps[i]]);
|
|
254
|
+
const stepEnd = (i) => {
|
|
255
|
+
const id = steps[i];
|
|
256
|
+
return stepStart[i] + (id < 0 ? -id : lengthOf(id));
|
|
257
|
+
};
|
|
258
|
+
const partialSide = (i0, i1) => {
|
|
259
|
+
const flank = i0 >= 0 ? i0 : i1;
|
|
260
|
+
let near = -1;
|
|
261
|
+
for (let d = 1; near < 0 && d < length; d++) {
|
|
262
|
+
near = [flank - d, flank + d].find(onReference) ?? -1;
|
|
263
|
+
}
|
|
264
|
+
if (near < 0) {
|
|
265
|
+
return void 0;
|
|
266
|
+
}
|
|
267
|
+
const forward = near > flank === spanStart[steps[near]] > spanStart[steps[flank]];
|
|
268
|
+
const after = forward === (flank === i0);
|
|
269
|
+
const last2 = after ? length - 1 : 0;
|
|
270
|
+
const contigEnds = onReference(last2);
|
|
271
|
+
const stop2 = {
|
|
272
|
+
contigEnds,
|
|
273
|
+
shortBp: contigEnds ? Math.max(
|
|
274
|
+
0,
|
|
275
|
+
cut.start - spanEnd[steps[last2]],
|
|
276
|
+
spanStart[steps[last2]] - cut.end
|
|
277
|
+
) : 0
|
|
278
|
+
};
|
|
279
|
+
return {
|
|
280
|
+
stop: stop2,
|
|
281
|
+
lo: after ? flank + 1 : 0,
|
|
282
|
+
hi: after ? length : flank,
|
|
283
|
+
backward: !forward,
|
|
284
|
+
axisStart: forward ? after ? stepEnd(flank) : stepStart[0] : after ? stepEnd(length - 1) : stepStart[flank]
|
|
285
|
+
};
|
|
286
|
+
};
|
|
287
|
+
let lo = 0;
|
|
288
|
+
let hi = length;
|
|
289
|
+
let backward = false;
|
|
290
|
+
let complete = true;
|
|
291
|
+
let flankFrom = -1;
|
|
292
|
+
let flankTo = -1;
|
|
293
|
+
let axisStart;
|
|
294
|
+
let stop;
|
|
295
|
+
if (cut && flanked) {
|
|
296
|
+
let i0 = -1;
|
|
297
|
+
let i1 = -1;
|
|
298
|
+
let bestEnd = -Infinity;
|
|
299
|
+
let bestStart = Infinity;
|
|
300
|
+
for (let i = 0; i < length; i++) {
|
|
301
|
+
if (onReference(i)) {
|
|
302
|
+
const id = steps[i];
|
|
303
|
+
if (spanEnd[id] <= cut.start && spanEnd[id] > bestEnd) {
|
|
304
|
+
bestEnd = spanEnd[id];
|
|
305
|
+
i0 = i;
|
|
306
|
+
}
|
|
307
|
+
if (spanStart[id] >= cut.end && spanStart[id] < bestStart) {
|
|
308
|
+
bestStart = spanStart[id];
|
|
309
|
+
i1 = i;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
if (i0 < 0 || i1 < 0) {
|
|
314
|
+
complete = false;
|
|
315
|
+
const inside = i0 >= 0 || i1 >= 0 ? partialSide(i0, i1) : void 0;
|
|
316
|
+
if (inside) {
|
|
317
|
+
;
|
|
318
|
+
({ lo, hi, backward, axisStart, stop } = inside);
|
|
319
|
+
}
|
|
320
|
+
} else {
|
|
321
|
+
lo = Math.min(i0, i1) + 1;
|
|
322
|
+
hi = Math.max(i0, i1);
|
|
323
|
+
backward = i0 > i1;
|
|
324
|
+
flankFrom = i0;
|
|
325
|
+
flankTo = i1;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
const contig = head.contig ?? panSNContig(pathOrigin(head.name).name);
|
|
329
|
+
const axis = unplaced || length === 0 ? void 0 : axisStart !== void 0 ? { contig, start: axisStart, reversed: backward } : flankFrom < 0 ? { contig, start: stepStart[0], reversed: false } : flankFrom < flankTo ? { contig, start: stepEnd(flankFrom), reversed: false } : { contig, start: stepStart[flankFrom], reversed: true };
|
|
330
|
+
let bp2 = 0;
|
|
331
|
+
let offReferenceBp = 0;
|
|
332
|
+
let gapBp = 0;
|
|
333
|
+
let step = 0;
|
|
334
|
+
let last = -1;
|
|
335
|
+
let lastFlags = 0;
|
|
336
|
+
let lastRef = Number.NaN;
|
|
337
|
+
const [, runBp, runRef, runFlags] = runs.values;
|
|
338
|
+
for (let k = lo; k < hi; k++) {
|
|
339
|
+
const index = backward ? hi - 1 - (k - lo) : k;
|
|
340
|
+
const id = steps[index];
|
|
341
|
+
if (id < 0) {
|
|
342
|
+
const parts = partsAt.get(index);
|
|
343
|
+
for (const part of backward ? [...parts].reverse() : parts) {
|
|
344
|
+
runs.push(
|
|
345
|
+
bp2,
|
|
346
|
+
part.bp,
|
|
347
|
+
Number.NaN,
|
|
348
|
+
RUN_GAP | causeFlags(part.cause),
|
|
349
|
+
chunkOf(part.chunk)
|
|
350
|
+
);
|
|
351
|
+
bp2 += part.bp;
|
|
352
|
+
}
|
|
353
|
+
last = runs.length - 1;
|
|
354
|
+
lastFlags = RUN_GAP;
|
|
355
|
+
lastRef = Number.NaN;
|
|
356
|
+
gapBp += -id;
|
|
357
|
+
step = 0;
|
|
358
|
+
continue;
|
|
359
|
+
}
|
|
360
|
+
const len = lengthOf(id);
|
|
361
|
+
const at = spanStart[id];
|
|
362
|
+
const on = !Number.isNaN(at);
|
|
363
|
+
visits?.push(id, bp2, len, on ? 1 : 0);
|
|
364
|
+
const placed = last >= 0 && !Number.isNaN(lastRef);
|
|
365
|
+
const forward = on && placed && step >= 0 && lastRef + (runBp[last] ?? 0) === at;
|
|
366
|
+
const back = on && placed && step <= 0 && spanEnd[id] === lastRef;
|
|
367
|
+
if (!on && last >= 0 && !(lastFlags & (RUN_ON_REFERENCE | RUN_GAP))) {
|
|
368
|
+
runBp[last] += len;
|
|
369
|
+
} else if (forward || back) {
|
|
370
|
+
runBp[last] += len;
|
|
371
|
+
if (!forward) {
|
|
372
|
+
lastRef = at;
|
|
373
|
+
runRef[last] = at;
|
|
374
|
+
lastFlags |= RUN_REVERSED;
|
|
375
|
+
runFlags[last] = lastFlags;
|
|
376
|
+
}
|
|
377
|
+
step = forward ? 1 : -1;
|
|
378
|
+
} else {
|
|
379
|
+
lastFlags = on ? RUN_ON_REFERENCE : 0;
|
|
380
|
+
lastRef = on ? at : Number.NaN;
|
|
381
|
+
runs.push(bp2, len, lastRef, lastFlags, -1);
|
|
382
|
+
last = runs.length - 1;
|
|
383
|
+
step = 0;
|
|
384
|
+
}
|
|
385
|
+
bp2 += len;
|
|
386
|
+
if (!on) {
|
|
387
|
+
offReferenceBp += len;
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
runs.endRow();
|
|
391
|
+
visits?.endRow();
|
|
392
|
+
return {
|
|
393
|
+
name: head.name,
|
|
394
|
+
label: labelOf(head),
|
|
395
|
+
sample: sampleOf(head),
|
|
396
|
+
haplotype: head.haplotype,
|
|
397
|
+
bp: bp2,
|
|
398
|
+
offReferenceBp,
|
|
399
|
+
gapBp,
|
|
400
|
+
complete,
|
|
401
|
+
stop,
|
|
402
|
+
axis
|
|
403
|
+
};
|
|
404
|
+
};
|
|
405
|
+
const referenceRow = rowOf(referencePieces);
|
|
406
|
+
const rows = [...walks.values()].map((pieces, i) => ({
|
|
407
|
+
meta: rowOf(pieces),
|
|
408
|
+
row: i + 1
|
|
409
|
+
}));
|
|
410
|
+
rows.sort(
|
|
411
|
+
(a, b) => Number(b.meta.complete) - Number(a.meta.complete) || b.meta.bp - a.meta.bp || a.meta.label.localeCompare(b.meta.label)
|
|
412
|
+
);
|
|
413
|
+
const order = [0, ...rows.map((r) => r.row)];
|
|
414
|
+
const { offsets, columns } = runs.reorder(order, [
|
|
415
|
+
float64,
|
|
416
|
+
float64,
|
|
417
|
+
float64,
|
|
418
|
+
(n) => new Uint8Array(n),
|
|
419
|
+
(n) => new Int32Array(n)
|
|
420
|
+
]);
|
|
421
|
+
const [start, bp, referenceStart, flags, chunk] = columns;
|
|
422
|
+
return {
|
|
423
|
+
origin: cut ? cut.start : startOf(first) ?? 0,
|
|
424
|
+
rows: [referenceRow, ...rows.map((r) => r.meta)],
|
|
425
|
+
offsets,
|
|
426
|
+
start,
|
|
427
|
+
bp,
|
|
428
|
+
referenceStart,
|
|
429
|
+
flags,
|
|
430
|
+
chunk,
|
|
431
|
+
chunks,
|
|
432
|
+
visits: visits && visitColumns(visits, order, names)
|
|
433
|
+
};
|
|
434
|
+
}
|
|
435
|
+
function visitColumns(visits, order, names) {
|
|
436
|
+
const { offsets, columns } = visits.reorder(order, [
|
|
437
|
+
(n) => new Int32Array(n),
|
|
438
|
+
float64,
|
|
439
|
+
float64,
|
|
440
|
+
(n) => new Uint8Array(n)
|
|
441
|
+
]);
|
|
442
|
+
const [node, start, bp, onReference] = columns;
|
|
443
|
+
return { offsets, node, start, bp, onReference, names };
|
|
444
|
+
}
|
|
445
|
+
function runAt(t, k) {
|
|
446
|
+
const f = t.flags[k];
|
|
447
|
+
const run = {
|
|
448
|
+
start: t.start[k],
|
|
449
|
+
bp: t.bp[k],
|
|
450
|
+
onReference: (f & RUN_ON_REFERENCE) !== 0
|
|
451
|
+
};
|
|
452
|
+
if (f & RUN_GAP) {
|
|
453
|
+
run.gap = true;
|
|
454
|
+
const cause = GAP_CAUSES[f >> CAUSE_SHIFT & 3];
|
|
455
|
+
if (cause) {
|
|
456
|
+
run.cause = cause;
|
|
457
|
+
}
|
|
458
|
+
const chunk = t.chunks[t.chunk[k]];
|
|
459
|
+
if (chunk) {
|
|
460
|
+
run.chunk = chunk;
|
|
461
|
+
}
|
|
462
|
+
} else {
|
|
463
|
+
run.referenceStart = Number.isNaN(t.referenceStart[k]) ? void 0 : t.referenceStart[k];
|
|
464
|
+
}
|
|
465
|
+
if (f & RUN_REVERSED) {
|
|
466
|
+
run.reversed = true;
|
|
467
|
+
}
|
|
468
|
+
return run;
|
|
469
|
+
}
|
|
470
|
+
function visitsOf(v, row) {
|
|
471
|
+
const out = [];
|
|
472
|
+
for (let k = v.offsets[row]; k < v.offsets[row + 1]; k++) {
|
|
473
|
+
out.push({
|
|
474
|
+
node: v.names[v.node[k]],
|
|
475
|
+
start: v.start[k],
|
|
476
|
+
bp: v.bp[k],
|
|
477
|
+
onReference: v.onReference[k] === 1
|
|
478
|
+
});
|
|
479
|
+
}
|
|
480
|
+
return out;
|
|
481
|
+
}
|
|
482
|
+
function walkRowsOf(t, unit) {
|
|
483
|
+
const rows = t.rows.map((meta, i) => {
|
|
484
|
+
const runs = [];
|
|
485
|
+
for (let k = t.offsets[i]; k < t.offsets[i + 1]; k++) {
|
|
486
|
+
runs.push(runAt(t, k));
|
|
487
|
+
}
|
|
488
|
+
return {
|
|
489
|
+
...meta,
|
|
490
|
+
runs,
|
|
491
|
+
visits: t.visits && visitsOf(t.visits, i)
|
|
492
|
+
};
|
|
493
|
+
});
|
|
494
|
+
return { origin: t.origin, unit, reference: rows[0], rows: rows.slice(1) };
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
export {
|
|
498
|
+
referenceWalkName,
|
|
499
|
+
walkRowRuns,
|
|
500
|
+
runAt,
|
|
501
|
+
walkRowsOf
|
|
502
|
+
};
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Canvas2DRenderer
|
|
3
|
+
} from "./chunk-EJRJAAN7.js";
|
|
1
4
|
import {
|
|
2
5
|
svgCanvas
|
|
3
6
|
} from "./chunk-V4YML3GR.js";
|
|
@@ -5,15 +8,12 @@ import {
|
|
|
5
8
|
stripGeneGaps,
|
|
6
9
|
walkStripFrame,
|
|
7
10
|
walkStripLabelsTree
|
|
8
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-PNM6Z3IE.js";
|
|
9
12
|
import {
|
|
10
13
|
walkRowsKey,
|
|
11
14
|
walkRowsKeyTree,
|
|
12
15
|
walkRowsTree
|
|
13
16
|
} from "./chunk-XZ6PQBU6.js";
|
|
14
|
-
import {
|
|
15
|
-
Canvas2DRenderer
|
|
16
|
-
} from "./chunk-EJRJAAN7.js";
|
|
17
17
|
import {
|
|
18
18
|
EXON_COLOR,
|
|
19
19
|
exonOutlineTree,
|
|
@@ -34,13 +34,13 @@ import {
|
|
|
34
34
|
} from "./chunk-77EGQQJU.js";
|
|
35
35
|
import {
|
|
36
36
|
version
|
|
37
|
-
} from "./chunk-
|
|
37
|
+
} from "./chunk-XEWPWCML.js";
|
|
38
38
|
import {
|
|
39
39
|
axisScaleOf
|
|
40
|
-
} from "./chunk-
|
|
40
|
+
} from "./chunk-CE6ZIKJX.js";
|
|
41
41
|
import {
|
|
42
42
|
figureScene
|
|
43
|
-
} from "./chunk-
|
|
43
|
+
} from "./chunk-T35BSLW5.js";
|
|
44
44
|
import {
|
|
45
45
|
encodingStops
|
|
46
46
|
} from "./chunk-TABI4JEU.js";
|
|
@@ -49,17 +49,17 @@ import {
|
|
|
49
49
|
} from "./chunk-D4ZFRBB4.js";
|
|
50
50
|
import {
|
|
51
51
|
walkRowLabels
|
|
52
|
-
} from "./chunk-
|
|
52
|
+
} from "./chunk-TZLEHZVC.js";
|
|
53
53
|
import {
|
|
54
54
|
nodeInk
|
|
55
55
|
} from "./chunk-CRCD3ODN.js";
|
|
56
56
|
import {
|
|
57
57
|
FIGURE_DEFAULTS
|
|
58
|
-
} from "./chunk-
|
|
58
|
+
} from "./chunk-EFD753MS.js";
|
|
59
59
|
import {
|
|
60
60
|
FIT_PADDING,
|
|
61
61
|
fitTransform
|
|
62
|
-
} from "./chunk-
|
|
62
|
+
} from "./chunk-REOWLPH4.js";
|
|
63
63
|
import {
|
|
64
64
|
LABEL_CHAR_PX,
|
|
65
65
|
LABEL_PAD,
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
} from "./chunk-JMABOQWL.js";
|
|
4
4
|
import {
|
|
5
5
|
layoutModeByValue
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-TEXAKEJX.js";
|
|
7
7
|
import {
|
|
8
8
|
parseRegion
|
|
9
9
|
} from "./chunk-TUQKGAK3.js";
|
|
@@ -12,13 +12,13 @@ import {
|
|
|
12
12
|
} from "./chunk-77EGQQJU.js";
|
|
13
13
|
import {
|
|
14
14
|
version
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-XEWPWCML.js";
|
|
16
16
|
import {
|
|
17
17
|
axisScaleOf
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-CE6ZIKJX.js";
|
|
19
19
|
import {
|
|
20
20
|
figureScene
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-T35BSLW5.js";
|
|
22
22
|
import {
|
|
23
23
|
encodingStops
|
|
24
24
|
} from "./chunk-TABI4JEU.js";
|
|
@@ -30,13 +30,13 @@ import {
|
|
|
30
30
|
} from "./chunk-G2FD7S3C.js";
|
|
31
31
|
import {
|
|
32
32
|
FIGURE_DEFAULTS
|
|
33
|
-
} from "./chunk-
|
|
33
|
+
} from "./chunk-EFD753MS.js";
|
|
34
34
|
import {
|
|
35
35
|
engineSettingsOf,
|
|
36
36
|
fitTransform,
|
|
37
37
|
forceLayout,
|
|
38
38
|
loadGraph
|
|
39
|
-
} from "./chunk-
|
|
39
|
+
} from "./chunk-REOWLPH4.js";
|
|
40
40
|
import {
|
|
41
41
|
isBackbone
|
|
42
42
|
} from "./chunk-RJWPJCIB.js";
|
|
@@ -14,17 +14,17 @@ import {
|
|
|
14
14
|
} from "./chunk-SWCULW6S.js";
|
|
15
15
|
import {
|
|
16
16
|
walkRowsExtent
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-TZLEHZVC.js";
|
|
18
18
|
import {
|
|
19
19
|
pathLegend,
|
|
20
20
|
walkLabelsOf
|
|
21
21
|
} from "./chunk-3GP3KT5L.js";
|
|
22
22
|
import {
|
|
23
23
|
FIGURE_DEFAULTS
|
|
24
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-EFD753MS.js";
|
|
25
25
|
import {
|
|
26
26
|
drawingBounds
|
|
27
|
-
} from "./chunk-
|
|
27
|
+
} from "./chunk-REOWLPH4.js";
|
|
28
28
|
import {
|
|
29
29
|
referenceLabel
|
|
30
30
|
} from "./chunk-234NFZS4.js";
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
hasTubeMapPaths,
|
|
4
4
|
tubeMapLayout,
|
|
5
5
|
tubeMapReferenceLayout
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-3LZ334X4.js";
|
|
7
7
|
import {
|
|
8
8
|
sampleRowLayout
|
|
9
9
|
} from "./chunk-GJU6BJJA.js";
|
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
} from "./chunk-UAFATXYA.js";
|
|
16
16
|
import {
|
|
17
17
|
walkRowLayout
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-TZLEHZVC.js";
|
|
19
19
|
import {
|
|
20
20
|
isBackbone,
|
|
21
21
|
isOffReference
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
walkRows
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-JDZ5GTZT.js";
|
|
4
4
|
import {
|
|
5
5
|
ROW_HEIGHT_PX
|
|
6
6
|
} from "./chunk-CPMHA4W5.js";
|
|
@@ -37,9 +37,12 @@ function walkRowLabels(rows, layout, pitch) {
|
|
|
37
37
|
}));
|
|
38
38
|
}
|
|
39
39
|
function walkRowLayout(graph, region) {
|
|
40
|
-
const backbone = backboneNodes(graph);
|
|
41
40
|
const walks = walkRows(graph, region);
|
|
42
|
-
|
|
41
|
+
return walks && walkRowLayoutOf(graph, walks, region);
|
|
42
|
+
}
|
|
43
|
+
function walkRowLayoutOf(graph, walks, region) {
|
|
44
|
+
const backbone = backboneNodes(graph);
|
|
45
|
+
if (backbone.length === 0) {
|
|
43
46
|
return void 0;
|
|
44
47
|
}
|
|
45
48
|
const overWindow = region ? backbone.filter((n) => overlapsWindow(n, region)) : backbone;
|
|
@@ -60,5 +63,6 @@ export {
|
|
|
60
63
|
longestBar,
|
|
61
64
|
walkRowsExtent,
|
|
62
65
|
walkRowLabels,
|
|
63
|
-
walkRowLayout
|
|
66
|
+
walkRowLayout,
|
|
67
|
+
walkRowLayoutOf
|
|
64
68
|
};
|