@jbrowse/bandage-core 9.6.0 → 9.7.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.
@@ -0,0 +1,81 @@
1
+ import {
2
+ pathSteps
3
+ } from "./chunk-6N7H22SS.js";
4
+ import {
5
+ pathOrigin
6
+ } from "./chunk-ST2IBUAN.js";
7
+
8
+ // src/tubeMap/bundle.ts
9
+ function bundleRoutes(graph, groupOf = () => "", merge = true) {
10
+ const paths = graph.paths ?? [];
11
+ const steps = pathSteps(graph);
12
+ const routes = /* @__PURE__ */ new Map();
13
+ paths.forEach((path, i) => {
14
+ const walk = pathOrigin(path.name).name;
15
+ const route = steps[i].map((s) => `${s.node.id}${s.strand}`).join(",");
16
+ const pieces = routes.get(walk);
17
+ if (pieces) {
18
+ pieces.push(route);
19
+ } else {
20
+ routes.set(walk, [route]);
21
+ }
22
+ });
23
+ const routeRank = /* @__PURE__ */ new Map();
24
+ const bundles = /* @__PURE__ */ new Map();
25
+ for (const [walk, pieces] of routes) {
26
+ const route = walk === graph.referencePath ? `\0${walk}` : pieces.join("|");
27
+ const group = groupOf(walk);
28
+ const rank = routeRank.get(route) ?? routeRank.size;
29
+ routeRank.set(route, rank);
30
+ const key = `${route} ${group}`;
31
+ const bundle = bundles.get(key);
32
+ if (bundle) {
33
+ bundle.walks.push(walk);
34
+ } else {
35
+ bundles.set(key, { rank, group, walks: [walk] });
36
+ }
37
+ }
38
+ if (merge && bundles.size === routes.size) {
39
+ return graph;
40
+ }
41
+ const ordered = [...bundles.values()].sort(
42
+ (a, b) => a.rank - b.rank || a.group.localeCompare(b.group)
43
+ );
44
+ const recordsOf = /* @__PURE__ */ new Map();
45
+ for (const path of paths) {
46
+ const walk = pathOrigin(path.name).name;
47
+ const records = recordsOf.get(walk);
48
+ if (records) {
49
+ records.push(path);
50
+ } else {
51
+ recordsOf.set(walk, [path]);
52
+ }
53
+ }
54
+ if (!merge) {
55
+ return {
56
+ ...graph,
57
+ paths: ordered.flatMap(
58
+ ({ walks }) => walks.flatMap((walk) => recordsOf.get(walk))
59
+ )
60
+ };
61
+ }
62
+ const kept = ordered.flatMap(
63
+ ({ walks }) => recordsOf.get(walks[0]).map((path) => walks.length > 1 ? { ...path, members: walks } : path)
64
+ );
65
+ const keptWalks = new Set(ordered.map((b) => b.walks[0]));
66
+ return {
67
+ ...graph,
68
+ paths: kept,
69
+ anchorPaths: graph.anchorPaths?.filter((p) => keptWalks.has(p.name)),
70
+ pathVisits: graph.pathVisits ? new Map(
71
+ [...graph.pathVisits].map(([segment, visits]) => [
72
+ segment,
73
+ visits.filter((v) => keptWalks.has(v.path))
74
+ ])
75
+ ) : void 0
76
+ };
77
+ }
78
+
79
+ export {
80
+ bundleRoutes
81
+ };
@@ -59,7 +59,8 @@ function tubeMapTracks(graph) {
59
59
  name: path.name,
60
60
  sequence,
61
61
  sourceTrackID: 0,
62
- type: "haplotype"
62
+ type: "haplotype",
63
+ ...path.members ? { freq: path.members.length } : {}
63
64
  }
64
65
  ] : [];
65
66
  });
@@ -218,9 +219,12 @@ function runTubeMap(graph) {
218
219
  const reads = graph.reads ? tubeMapReads(graph, graph.reads, paths.length) : [];
219
220
  const tubeColor = reads.length > 0 ? pathGreyCssColor : pathCssColor;
220
221
  const pathColors = paths.map((_, i) => tubeColor(i, paths.length));
222
+ const bundled = paths.some((p) => p.members);
223
+ const walks = paths.reduce((n, p) => n + (p.members?.length ?? 1), 0);
221
224
  const layout = layoutTubeMap(tubeMapNodes(graph), tracks, reads, {
222
225
  nodeWidthOption: "compressed",
223
- trackWidth: tubeWidth(tracks.length)
226
+ trackWidth: tubeWidth(bundled ? walks : tracks.length),
227
+ ...bundled ? { freqWidth: "linear" } : {}
224
228
  });
225
229
  if (!layout) {
226
230
  return void 0;
@@ -45,7 +45,7 @@ import {
45
45
  } from "./chunk-BR25DGIJ.js";
46
46
  import {
47
47
  version
48
- } from "./chunk-YSQMOOHY.js";
48
+ } from "./chunk-ESRCSSS2.js";
49
49
  import {
50
50
  walkRowLabels,
51
51
  walkRowsExtent
@@ -1,5 +1,5 @@
1
1
  // src/version.ts
2
- var version = "9.6.0";
2
+ var version = "9.7.0";
3
3
 
4
4
  export {
5
5
  version
@@ -6,7 +6,7 @@ import {
6
6
  hasTubeMapPaths,
7
7
  tubeMapLayout,
8
8
  tubeMapReferenceLayout
9
- } from "./chunk-INJ2UVOT.js";
9
+ } from "./chunk-6N7H22SS.js";
10
10
  import {
11
11
  anchoredLayout
12
12
  } from "./chunk-L3O7AWLI.js";
@@ -14,9 +14,9 @@ import "../chunks/chunk-LYJ4US66.js";
14
14
  import {
15
15
  LAYOUT_MODES,
16
16
  layoutModeByValue
17
- } from "../chunks/chunk-M7SRZJ32.js";
17
+ } from "../chunks/chunk-Z7UWHVOM.js";
18
18
  import "../chunks/chunk-LOEA5IHZ.js";
19
- import "../chunks/chunk-INJ2UVOT.js";
19
+ import "../chunks/chunk-6N7H22SS.js";
20
20
  import "../chunks/chunk-CWFNEKST.js";
21
21
  import "../chunks/chunk-L3O7AWLI.js";
22
22
  import "../chunks/chunk-TZFWUT2C.js";
@@ -35,7 +35,7 @@ import "../chunks/chunk-LTUWJKHD.js";
35
35
  import "../chunks/chunk-WSIFAZU7.js";
36
36
  import {
37
37
  figureSvg
38
- } from "../chunks/chunk-WVPC3JVY.js";
38
+ } from "../chunks/chunk-7FARTP3U.js";
39
39
  import "../chunks/chunk-UD5FOCI2.js";
40
40
  import "../chunks/chunk-WBCOREDZ.js";
41
41
  import "../chunks/chunk-4BYTEJGW.js";
@@ -54,7 +54,7 @@ import "../chunks/chunk-2LQ5BWT7.js";
54
54
  import "../chunks/chunk-OXTR3BVF.js";
55
55
  import "../chunks/chunk-BR25DGIJ.js";
56
56
  import "../chunks/chunk-G2FD7S3C.js";
57
- import "../chunks/chunk-YSQMOOHY.js";
57
+ import "../chunks/chunk-ESRCSSS2.js";
58
58
  import "../chunks/chunk-3C5UXR2U.js";
59
59
  import {
60
60
  filterSamples,
package/dist/figure.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  figureSvg
3
- } from "./chunks/chunk-WVPC3JVY.js";
3
+ } from "./chunks/chunk-7FARTP3U.js";
4
4
  import "./chunks/chunk-UD5FOCI2.js";
5
5
  import "./chunks/chunk-WBCOREDZ.js";
6
6
  import "./chunks/chunk-4BYTEJGW.js";
@@ -16,7 +16,7 @@ import "./chunks/chunk-2LQ5BWT7.js";
16
16
  import "./chunks/chunk-OXTR3BVF.js";
17
17
  import "./chunks/chunk-BR25DGIJ.js";
18
18
  import "./chunks/chunk-G2FD7S3C.js";
19
- import "./chunks/chunk-YSQMOOHY.js";
19
+ import "./chunks/chunk-ESRCSSS2.js";
20
20
  import "./chunks/chunk-3C5UXR2U.js";
21
21
  import "./chunks/chunk-MAUEPAMG.js";
22
22
  import "./chunks/chunk-7GBL7SJY.js";
package/dist/index.js CHANGED
@@ -1,15 +1,28 @@
1
1
  import {
2
2
  wheelZoomFactor
3
3
  } from "./chunks/chunk-TDQLINVI.js";
4
+ import {
5
+ drawTubeMapGenes,
6
+ tubeMapGenes
7
+ } from "./chunks/chunk-WEDZ76AK.js";
4
8
  import {
5
9
  tubeMapNodeColors
6
10
  } from "./chunks/chunk-A4MYLGKG.js";
11
+ import {
12
+ bundleRoutes
13
+ } from "./chunks/chunk-5QOMIEHX.js";
7
14
  import {
8
15
  connectorAt,
9
16
  drawLitConnector,
10
17
  drawTubeMapConnectors,
11
18
  tubeMapConnectors
12
19
  } from "./chunks/chunk-2ZT7ZF7A.js";
20
+ import {
21
+ drawTubeMapRuler,
22
+ referenceBoxes,
23
+ rulerBoxes,
24
+ tubeX
25
+ } from "./chunks/chunk-BPRXQ2SS.js";
13
26
  import {
14
27
  drawTubeMap,
15
28
  drawTubeMapHighlight,
@@ -26,16 +39,6 @@ import {
26
39
  referenceKnots,
27
40
  warpX
28
41
  } from "./chunks/chunk-KQFOCDFY.js";
29
- import {
30
- drawTubeMapGenes,
31
- tubeMapGenes
32
- } from "./chunks/chunk-WEDZ76AK.js";
33
- import {
34
- drawTubeMapRuler,
35
- referenceBoxes,
36
- rulerBoxes,
37
- tubeX
38
- } from "./chunks/chunk-BPRXQ2SS.js";
39
42
  import {
40
43
  createForceLayoutCache
41
44
  } from "./chunks/chunk-BV64PQ2C.js";
@@ -84,9 +87,9 @@ import {
84
87
  LAYOUT_MODES,
85
88
  layoutModeByValue,
86
89
  modeUsesLayoutEngine
87
- } from "./chunks/chunk-M7SRZJ32.js";
90
+ } from "./chunks/chunk-Z7UWHVOM.js";
88
91
  import "./chunks/chunk-LOEA5IHZ.js";
89
- import "./chunks/chunk-INJ2UVOT.js";
92
+ import "./chunks/chunk-6N7H22SS.js";
90
93
  import "./chunks/chunk-CWFNEKST.js";
91
94
  import "./chunks/chunk-L3O7AWLI.js";
92
95
  import "./chunks/chunk-TZFWUT2C.js";
@@ -119,7 +122,7 @@ import {
119
122
  } from "./chunks/chunk-AZFVORTC.js";
120
123
  import {
121
124
  figureSvg
122
- } from "./chunks/chunk-WVPC3JVY.js";
125
+ } from "./chunks/chunk-7FARTP3U.js";
123
126
  import {
124
127
  WALK_STRIP_CEILING_PX,
125
128
  cutsWholeWalks,
@@ -219,7 +222,7 @@ import {
219
222
  import "./chunks/chunk-G2FD7S3C.js";
220
223
  import {
221
224
  version
222
- } from "./chunks/chunk-YSQMOOHY.js";
225
+ } from "./chunks/chunk-ESRCSSS2.js";
223
226
  import {
224
227
  walkRowLabels,
225
228
  walkRowsExtent
@@ -387,6 +390,7 @@ export {
387
390
  bubbleSubgraph,
388
391
  bubblesFromGraph,
389
392
  buildGeometry,
393
+ bundleRoutes,
390
394
  callTickInk,
391
395
  clampZoom,
392
396
  classifyBubble,
@@ -8,7 +8,7 @@ import {
8
8
  tubeMapReferenceLayout,
9
9
  tubeMapTracks,
10
10
  tubeWidth
11
- } from "../chunks/chunk-INJ2UVOT.js";
11
+ } from "../chunks/chunk-6N7H22SS.js";
12
12
  import "../chunks/chunk-CWFNEKST.js";
13
13
  import "../chunks/chunk-C44YRP5F.js";
14
14
  import "../chunks/chunk-7GBL7SJY.js";
@@ -4,9 +4,9 @@ import {
4
4
  LAYOUT_MODE_VALUES,
5
5
  layoutModeByValue,
6
6
  modeUsesLayoutEngine
7
- } from "./chunks/chunk-M7SRZJ32.js";
7
+ } from "./chunks/chunk-Z7UWHVOM.js";
8
8
  import "./chunks/chunk-LOEA5IHZ.js";
9
- import "./chunks/chunk-INJ2UVOT.js";
9
+ import "./chunks/chunk-6N7H22SS.js";
10
10
  import "./chunks/chunk-CWFNEKST.js";
11
11
  import "./chunks/chunk-L3O7AWLI.js";
12
12
  import "./chunks/chunk-TZFWUT2C.js";
@@ -0,0 +1,19 @@
1
+ import {
2
+ bundleRoutes
3
+ } from "../chunks/chunk-5QOMIEHX.js";
4
+ import "../chunks/chunk-6N7H22SS.js";
5
+ import "../chunks/chunk-CWFNEKST.js";
6
+ import "../chunks/chunk-C44YRP5F.js";
7
+ import "../chunks/chunk-7GBL7SJY.js";
8
+ import "../chunks/chunk-3ZZSX5HN.js";
9
+ import "../chunks/chunk-AB35TJST.js";
10
+ import "../chunks/chunk-ST2IBUAN.js";
11
+ import "../chunks/chunk-BPLIXMH7.js";
12
+ import "../chunks/chunk-TAMCZHLW.js";
13
+ import "../chunks/chunk-N6FECAXP.js";
14
+ import "../chunks/chunk-2CVHXFK7.js";
15
+ import "../chunks/chunk-CPMHA4W5.js";
16
+ import "../chunks/chunk-FYQWPEEY.js";
17
+ export {
18
+ bundleRoutes
19
+ };
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  pathSteps
3
- } from "../chunks/chunk-INJ2UVOT.js";
3
+ } from "../chunks/chunk-6N7H22SS.js";
4
4
  import "../chunks/chunk-CWFNEKST.js";
5
5
  import "../chunks/chunk-C44YRP5F.js";
6
6
  import "../chunks/chunk-7GBL7SJY.js";
@@ -43,6 +43,7 @@ export { drawTubeMapGenes, tubeMapGenes } from './tubeMap/genes.js';
43
43
  export type { TubeMapGene } from './tubeMap/genes.js';
44
44
  export { connectorAt, drawLitConnector, drawTubeMapConnectors, tubeMapConnectors, } from './tubeMap/connectors.js';
45
45
  export type { Connector } from './tubeMap/connectors.js';
46
+ export { bundleRoutes } from './tubeMap/bundle.js';
46
47
  export type { TubeMapColumn, TubeMapDrawing } from './layout/tubeMapLayout.js';
47
48
  export { deletionDrawing, deletionEdges } from './deletionEdges.js';
48
49
  export type { DeletionDrawing, DeletionEdge } from './deletionEdges.js';
@@ -0,0 +1,2 @@
1
+ import type { Graph } from '../types.js';
2
+ export declare function bundleRoutes(graph: Graph, groupOf?: (walk: string) => string, merge?: boolean): Graph;
@@ -23,6 +23,7 @@ export interface GraphPath {
23
23
  sample?: string;
24
24
  haplotype?: number;
25
25
  contig?: string;
26
+ members?: string[];
26
27
  }
27
28
  export interface PathOrigin {
28
29
  name: string;
@@ -1 +1 @@
1
- export declare const version = "9.6.0";
1
+ export declare const version = "9.7.0";
package/dist/version.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  version
3
- } from "./chunks/chunk-YSQMOOHY.js";
3
+ } from "./chunks/chunk-ESRCSSS2.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": "9.6.0",
3
+ "version": "9.7.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": {
@@ -37,7 +37,7 @@
37
37
  "dependencies": {
38
38
  "@gmod/gbz-base": "^7.0.0",
39
39
  "@gmod/tabix": "^3.9.1",
40
- "@jbrowse/tubemap-core": "^0.2.1"
40
+ "@jbrowse/tubemap-core": "^0.2.2"
41
41
  },
42
42
  "devDependencies": {
43
43
  "@eslint/js": "^10.0.1",