@jbrowse/bandage-core 0.1.1

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 (64) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +29 -0
  3. package/dist/chunks/bandage-layout-3AR6BCUD.js +4694 -0
  4. package/dist/index.js +5409 -0
  5. package/dist/types/alleleProjection/projectAlleles.d.ts +13 -0
  6. package/dist/types/anchoredNodes.d.ts +17 -0
  7. package/dist/types/bandage/bandage-layout.d.ts +14 -0
  8. package/dist/types/bubbleSpreads.d.ts +32 -0
  9. package/dist/types/bubbles/bubbleHalos.d.ts +20 -0
  10. package/dist/types/bubbles/bubbleLine.d.ts +24 -0
  11. package/dist/types/bubbles/bubblesFromGraph.d.ts +3 -0
  12. package/dist/types/bubbles/classifyBubble.d.ts +16 -0
  13. package/dist/types/bubbles/popBubble.d.ts +2 -0
  14. package/dist/types/colorSchemes.d.ts +33 -0
  15. package/dist/types/deletionEdges.d.ts +24 -0
  16. package/dist/types/gaf/parseGaf.d.ts +37 -0
  17. package/dist/types/gbzWindow.d.ts +27 -0
  18. package/dist/types/genes/genePins.d.ts +19 -0
  19. package/dist/types/gfa/gfaConverter.d.ts +11 -0
  20. package/dist/types/gfa-core/gfaParser.d.ts +48 -0
  21. package/dist/types/gfa-core/index.d.ts +2 -0
  22. package/dist/types/graphLabels.d.ts +46 -0
  23. package/dist/types/index.d.ts +50 -0
  24. package/dist/types/labelLayout.d.ts +59 -0
  25. package/dist/types/layout/anchoredLayout.d.ts +5 -0
  26. package/dist/types/layout/drawnScale.d.ts +28 -0
  27. package/dist/types/layout/mergeRuns.d.ts +9 -0
  28. package/dist/types/layout/orderedLayout.d.ts +9 -0
  29. package/dist/types/layout/orientToReference.d.ts +4 -0
  30. package/dist/types/layout/placeOffReference.d.ts +9 -0
  31. package/dist/types/layout/referenceSeeds.d.ts +12 -0
  32. package/dist/types/layout/rowSpacing.d.ts +1 -0
  33. package/dist/types/layout/sampleRowLayout.d.ts +5 -0
  34. package/dist/types/layout/tubeMapLayout.d.ts +19 -0
  35. package/dist/types/layout/variantMapLayout.d.ts +2 -0
  36. package/dist/types/layout/walkRowLayout.d.ts +10 -0
  37. package/dist/types/layout/walkRows.d.ts +25 -0
  38. package/dist/types/layoutModes.d.ts +153 -0
  39. package/dist/types/loadBandage.d.ts +3 -0
  40. package/dist/types/nodeWidths.d.ts +18 -0
  41. package/dist/types/overlayLabels.d.ts +29 -0
  42. package/dist/types/pansn.d.ts +8 -0
  43. package/dist/types/pathAnchoring.d.ts +20 -0
  44. package/dist/types/pathColors.d.ts +14 -0
  45. package/dist/types/pipeline.d.ts +79 -0
  46. package/dist/types/referenceSpan.d.ts +12 -0
  47. package/dist/types/renderer/Canvas2DRenderer.d.ts +32 -0
  48. package/dist/types/renderer/GeometryBuilder.d.ts +63 -0
  49. package/dist/types/renderer/colorBits.d.ts +2 -0
  50. package/dist/types/renderer/types.d.ts +50 -0
  51. package/dist/types/tubeMap/draw.d.ts +66 -0
  52. package/dist/types/tubeMap/frame.d.ts +15 -0
  53. package/dist/types/tubeMap/mismatches.d.ts +24 -0
  54. package/dist/types/tubeMap/reads.d.ts +10 -0
  55. package/dist/types/tubeMap/warp.d.ts +7 -0
  56. package/dist/types/types.d.ts +75 -0
  57. package/dist/types/util/SpatialIndex.d.ts +25 -0
  58. package/dist/types/util/edgeCurves.d.ts +4 -0
  59. package/dist/types/util/geometry.d.ts +46 -0
  60. package/dist/types/util/hitDetection.d.ts +10 -0
  61. package/dist/types/util/wheelZoom.d.ts +5 -0
  62. package/dist/types/viewport.d.ts +22 -0
  63. package/dist/types/walkHighlight.d.ts +10 -0
  64. package/package.json +43 -0
@@ -0,0 +1,25 @@
1
+ import type { Graph } from '../types';
2
+ export interface WalkRun {
3
+ start: number;
4
+ bp: number;
5
+ onReference: boolean;
6
+ }
7
+ export interface WalkRow {
8
+ name: string;
9
+ label: string;
10
+ sample: string;
11
+ bp: number;
12
+ offReferenceBp: number;
13
+ complete: boolean;
14
+ runs: WalkRun[];
15
+ }
16
+ export interface WalkRows {
17
+ origin: number;
18
+ unit?: number;
19
+ reference: WalkRow;
20
+ rows: WalkRow[];
21
+ }
22
+ export declare function walkRows(graph: Graph, region?: {
23
+ start: number;
24
+ end: number;
25
+ }, unit?: number): WalkRows | undefined;
@@ -0,0 +1,153 @@
1
+ import { anchoredLayout } from './layout/anchoredLayout';
2
+ import { orderedLayout } from './layout/orderedLayout';
3
+ import { sampleRowLayout } from './layout/sampleRowLayout';
4
+ import { hasTubeMapPaths, tubeMapLayout, tubeMapReferenceLayout } from './layout/tubeMapLayout';
5
+ import { variantMapLayout } from './layout/variantMapLayout';
6
+ import { walkRowLayout } from './layout/walkRowLayout';
7
+ import type { Graph, LayoutResult } from './types';
8
+ export declare const FORCE_LAYOUT_LABEL = "Force-directed layout";
9
+ export interface LayoutMode {
10
+ value: string;
11
+ label: string;
12
+ description: string;
13
+ run: (graph: Graph, region?: {
14
+ start: number;
15
+ end: number;
16
+ }, keepRows?: readonly string[]) => LayoutResult | undefined;
17
+ available: (graph: Graph) => boolean;
18
+ cutMargins: boolean;
19
+ drawsLocally: (graph: Graph) => boolean;
20
+ }
21
+ export declare const LAYOUT_MODES: readonly [{
22
+ readonly value: "auto";
23
+ readonly label: "Anchored";
24
+ readonly description: "x is reference bp, one row per stable rank. Needs rGFA tags or a reference path.";
25
+ readonly run: typeof anchoredLayout;
26
+ readonly cutMargins: true;
27
+ readonly available: (graph: Graph) => boolean;
28
+ readonly drawsLocally: (graph: Graph) => boolean;
29
+ }, {
30
+ readonly value: "samplerows";
31
+ readonly label: "Sample rows";
32
+ readonly description: "x is reference bp, one row per contributing assembly. Needs rGFA tags or a reference path.";
33
+ readonly run: typeof sampleRowLayout;
34
+ readonly cutMargins: true;
35
+ readonly available: (graph: Graph) => boolean;
36
+ readonly drawsLocally: (graph: Graph) => boolean;
37
+ }, {
38
+ readonly value: "walkrows";
39
+ readonly label: "Walk rows";
40
+ readonly description: "x is each walk's own bp: one bar per haplotype, sequence the reference also carries in blue and sequence it does not in purple, so a repeat expansion reads as bar length. Needs W or P lines.";
41
+ readonly run: typeof walkRowLayout;
42
+ readonly cutMargins: false;
43
+ readonly available: (graph: Graph) => boolean;
44
+ readonly drawsLocally: (graph: Graph) => boolean;
45
+ }, {
46
+ readonly value: "ordered";
47
+ readonly label: "Ordered";
48
+ readonly description: "x is reference order, not bp: every node gets room, bubbles read as lenses. Needs rGFA tags or a reference path.";
49
+ readonly run: typeof orderedLayout;
50
+ readonly cutMargins: false;
51
+ readonly available: (graph: Graph) => boolean;
52
+ readonly drawsLocally: (graph: Graph) => boolean;
53
+ }, {
54
+ readonly value: "variants";
55
+ readonly label: "Variant map";
56
+ readonly description: "The reference as a line with one typed glyph per bubble, from the bubble index or from the graph itself: SNP, indel, deletion, inversion, repeat array. Click a glyph to open the graph inside it.";
57
+ readonly run: typeof variantMapLayout;
58
+ readonly cutMargins: true;
59
+ readonly available: (graph: Graph) => boolean;
60
+ readonly drawsLocally: (graph: Graph) => boolean;
61
+ }, {
62
+ readonly value: "tubemap";
63
+ readonly label: "Tube map";
64
+ readonly description: "sequenceTubeMap: every path a coloured tube through boxed nodes, columns in node order and node widths log-scaled. Needs P or W lines.";
65
+ readonly run: typeof tubeMapLayout;
66
+ readonly cutMargins: false;
67
+ readonly available: typeof hasTubeMapPaths;
68
+ readonly drawsLocally: typeof hasTubeMapPaths;
69
+ }, {
70
+ readonly value: "tubemapref";
71
+ readonly label: "Tube map on reference";
72
+ readonly description: "The tube map with each column at the reference bp it covers, so the tubes line up with the tracks around them. Needs P or W lines and a reference path.";
73
+ readonly run: typeof tubeMapReferenceLayout;
74
+ readonly cutMargins: true;
75
+ readonly available: (graph: Graph) => boolean;
76
+ readonly drawsLocally: (graph: Graph) => boolean;
77
+ }, {
78
+ readonly value: "force";
79
+ readonly label: "Force-directed layout";
80
+ readonly description: "OGDF FMMM, via the external Bandage engine.";
81
+ readonly run: () => undefined;
82
+ readonly cutMargins: false;
83
+ readonly available: () => true;
84
+ readonly drawsLocally: () => false;
85
+ }];
86
+ export type LayoutModeValue = (typeof LAYOUT_MODES)[number]['value'];
87
+ export declare const LAYOUT_MODE_VALUES: ("auto" | "ordered" | "samplerows" | "walkrows" | "variants" | "tubemap" | "tubemapref" | "force")[];
88
+ export declare function modeUsesLayoutEngine(value: string, graph: Graph): boolean;
89
+ export declare function layoutModeByValue(value: string): {
90
+ readonly value: "auto";
91
+ readonly label: "Anchored";
92
+ readonly description: "x is reference bp, one row per stable rank. Needs rGFA tags or a reference path.";
93
+ readonly run: typeof anchoredLayout;
94
+ readonly cutMargins: true;
95
+ readonly available: (graph: Graph) => boolean;
96
+ readonly drawsLocally: (graph: Graph) => boolean;
97
+ } | {
98
+ readonly value: "samplerows";
99
+ readonly label: "Sample rows";
100
+ readonly description: "x is reference bp, one row per contributing assembly. Needs rGFA tags or a reference path.";
101
+ readonly run: typeof sampleRowLayout;
102
+ readonly cutMargins: true;
103
+ readonly available: (graph: Graph) => boolean;
104
+ readonly drawsLocally: (graph: Graph) => boolean;
105
+ } | {
106
+ readonly value: "walkrows";
107
+ readonly label: "Walk rows";
108
+ readonly description: "x is each walk's own bp: one bar per haplotype, sequence the reference also carries in blue and sequence it does not in purple, so a repeat expansion reads as bar length. Needs W or P lines.";
109
+ readonly run: typeof walkRowLayout;
110
+ readonly cutMargins: false;
111
+ readonly available: (graph: Graph) => boolean;
112
+ readonly drawsLocally: (graph: Graph) => boolean;
113
+ } | {
114
+ readonly value: "ordered";
115
+ readonly label: "Ordered";
116
+ readonly description: "x is reference order, not bp: every node gets room, bubbles read as lenses. Needs rGFA tags or a reference path.";
117
+ readonly run: typeof orderedLayout;
118
+ readonly cutMargins: false;
119
+ readonly available: (graph: Graph) => boolean;
120
+ readonly drawsLocally: (graph: Graph) => boolean;
121
+ } | {
122
+ readonly value: "variants";
123
+ readonly label: "Variant map";
124
+ readonly description: "The reference as a line with one typed glyph per bubble, from the bubble index or from the graph itself: SNP, indel, deletion, inversion, repeat array. Click a glyph to open the graph inside it.";
125
+ readonly run: typeof variantMapLayout;
126
+ readonly cutMargins: true;
127
+ readonly available: (graph: Graph) => boolean;
128
+ readonly drawsLocally: (graph: Graph) => boolean;
129
+ } | {
130
+ readonly value: "tubemap";
131
+ readonly label: "Tube map";
132
+ readonly description: "sequenceTubeMap: every path a coloured tube through boxed nodes, columns in node order and node widths log-scaled. Needs P or W lines.";
133
+ readonly run: typeof tubeMapLayout;
134
+ readonly cutMargins: false;
135
+ readonly available: typeof hasTubeMapPaths;
136
+ readonly drawsLocally: typeof hasTubeMapPaths;
137
+ } | {
138
+ readonly value: "tubemapref";
139
+ readonly label: "Tube map on reference";
140
+ readonly description: "The tube map with each column at the reference bp it covers, so the tubes line up with the tracks around them. Needs P or W lines and a reference path.";
141
+ readonly run: typeof tubeMapReferenceLayout;
142
+ readonly cutMargins: true;
143
+ readonly available: (graph: Graph) => boolean;
144
+ readonly drawsLocally: (graph: Graph) => boolean;
145
+ } | {
146
+ readonly value: "force";
147
+ readonly label: "Force-directed layout";
148
+ readonly description: "OGDF FMMM, via the external Bandage engine.";
149
+ readonly run: () => undefined;
150
+ readonly cutMargins: false;
151
+ readonly available: () => true;
152
+ readonly drawsLocally: () => false;
153
+ };
@@ -0,0 +1,3 @@
1
+ export type { BandageModule } from './bandage/bandage-layout.js';
2
+ import type { BandageModule } from './bandage/bandage-layout.js';
3
+ export default function loadBandage(): Promise<BandageModule>;
@@ -0,0 +1,18 @@
1
+ import type { Graph, GraphNode } from './types';
2
+ import type { NodeInk } from './util/hitDetection';
3
+ export declare const NODE_WIDTHS: readonly [{
4
+ readonly value: "depth";
5
+ readonly label: "By depth";
6
+ readonly description: "Thicker the more paths carry a node, on the square root of its depth against the mean. A graph with one depth everywhere draws uniform.";
7
+ }, {
8
+ readonly value: "uniform";
9
+ readonly label: "Uniform";
10
+ readonly description: "Every node the same thickness.";
11
+ }];
12
+ export type NodeWidth = (typeof NODE_WIDTHS)[number]['value'];
13
+ export declare const NODE_WIDTH_VALUES: ("uniform" | "depth")[];
14
+ export declare function meanDepth(graph: Graph): number;
15
+ export declare function depthWidthFactor(node: GraphNode, mean: number): number;
16
+ export declare function nodeWidthPx(node: GraphNode, contigThickness: number, nodeWidth: NodeWidth, mean: number): number;
17
+ export declare function maxNodeWidthPx(contigThickness: number, nodeWidth: NodeWidth): number;
18
+ export declare function nodeInk(graph: Graph | undefined, nodeById: ReadonlyMap<string, GraphNode> | undefined, contigThickness: number, nodeWidth: NodeWidth): NodeInk;
@@ -0,0 +1,29 @@
1
+ export interface Box {
2
+ x0: number;
3
+ x1: number;
4
+ y0: number;
5
+ y1: number;
6
+ }
7
+ export declare const LABEL_PX = 11;
8
+ export declare const LABEL_CHAR_PX = 6.2;
9
+ export declare const LABEL_PAD = 4;
10
+ export interface LabelCandidate<T> {
11
+ item: T;
12
+ x: number;
13
+ y: number;
14
+ text: string;
15
+ stack?: number;
16
+ }
17
+ export interface PlacedLabel<T> extends LabelCandidate<T> {
18
+ w: number;
19
+ }
20
+ export type TakeBox = (box: Box) => boolean;
21
+ export declare function labelWidth(text: string): number;
22
+ export declare function overlaps(a: Box, b: Box): boolean;
23
+ interface Frame {
24
+ width: number;
25
+ height: number;
26
+ }
27
+ export declare function occupancy(frame: Frame, reserved?: Box[]): TakeBox;
28
+ export declare function placeLabels<T>(candidates: LabelCandidate<T>[], frame: Frame, take: TakeBox): PlacedLabel<T>[];
29
+ export {};
@@ -0,0 +1,8 @@
1
+ import type { BaseFeatureDataAdapter } from '@jbrowse/core/data_adapters/BaseAdapter';
2
+ export declare function panSNSample(refName: string): string;
3
+ export declare function panSNHaplotype(refName: string): string | undefined;
4
+ export declare function panSNContig(refName: string): string;
5
+ export declare function panSNMatchesPrefix(refName: string, prefix: string | undefined): boolean;
6
+ export declare function resolvePanSNPrefix(adapter: BaseFeatureDataAdapter, name: string): string;
7
+ export declare function resolvePanSNPrefix(adapter: BaseFeatureDataAdapter, name: string | undefined): string | undefined;
8
+ export declare function assemblyByPanSNPrefix(adapter: BaseFeatureDataAdapter): Record<string, string>;
@@ -0,0 +1,20 @@
1
+ import type { Graph, PathOrigin, PathVisit } from './types';
2
+ export declare function pathOrigin(pathName: string): {
3
+ name: string;
4
+ start: number;
5
+ };
6
+ export interface PathSteps {
7
+ name: string;
8
+ start: number;
9
+ steps: {
10
+ id: string;
11
+ strand: '+' | '-';
12
+ }[];
13
+ }
14
+ export declare function surveyPaths(paths: PathSteps[], lengthOf: (segmentId: string) => number): {
15
+ anchorPaths: PathOrigin[];
16
+ pathVisits: Map<string, PathVisit[]>;
17
+ };
18
+ export declare function chooseReferencePath(anchorPaths: PathOrigin[], preferred: string | undefined): PathOrigin | undefined;
19
+ export declare function anchorFromPaths(graph: Graph, preferred: string | undefined): Graph;
20
+ export declare function anchorGraph(graph: Graph, preferred: string | undefined): Graph;
@@ -0,0 +1,14 @@
1
+ import type { GraphPath } from './types';
2
+ export declare function nameHue(name: string): number;
3
+ export declare function pathHueAt(index: number, count: number): number;
4
+ export declare const PATH_SATURATION = 0.7;
5
+ export declare const PATH_LIGHTNESS = 0.5;
6
+ export declare const MAX_PATH_COLORS = 16;
7
+ export declare function pathColorsLegible(pathCount: number): boolean;
8
+ export declare function pathCssColor(index: number, count: number): string;
9
+ export interface PathLegendEntry {
10
+ name: string;
11
+ label: string;
12
+ color: string;
13
+ }
14
+ export declare function pathLegend(paths: GraphPath[]): PathLegendEntry[];
@@ -0,0 +1,79 @@
1
+ import type { BubbleSpread } from './bubbleSpreads';
2
+ import type { LayoutScaling } from './layout/drawnScale';
3
+ import type { LayoutNode } from './layout/referenceSeeds';
4
+ import type { Graph, LayoutResult, NodeSegment } from './types';
5
+ export interface Bounds {
6
+ minX: number;
7
+ minY: number;
8
+ maxX: number;
9
+ maxY: number;
10
+ }
11
+ export declare function loadGraph(text: string, name: string, opts?: {
12
+ referencePath?: string;
13
+ maxNodes?: number;
14
+ }): Graph;
15
+ export interface EngineRequest {
16
+ graph: {
17
+ nodes: LayoutNode[];
18
+ edges: Graph['edges'];
19
+ };
20
+ options: Record<string, unknown>;
21
+ }
22
+ export type LayoutEngine = (request: EngineRequest) => Promise<{
23
+ result: LayoutResult;
24
+ duration: number;
25
+ }>;
26
+ export interface EngineSettings {
27
+ quality: number;
28
+ linearLayout: boolean;
29
+ bubbleSpread: BubbleSpread;
30
+ }
31
+ export declare function engineRequest(graph: Graph, scaling: LayoutScaling, settings: EngineSettings): EngineRequest;
32
+ export declare function engineKey(graph: Graph, settings: EngineSettings): string;
33
+ export declare function forceLayout(graph: Graph, settings: EngineSettings, engine: LayoutEngine): Promise<{
34
+ result: {
35
+ nodePositions: Record<string, NodeSegment[]>;
36
+ rowLabels?: import("./types").RowLabel[];
37
+ sampleRows?: string[];
38
+ alleleDeletions?: import("./types").AlleleDeletion[];
39
+ referenceAxis?: boolean;
40
+ pixelRows?: boolean;
41
+ extent?: {
42
+ minX?: number;
43
+ minY?: number;
44
+ maxX?: number;
45
+ maxY?: number;
46
+ };
47
+ tubeMap?: import(".").TubeMapDrawing;
48
+ };
49
+ duration: number;
50
+ }>;
51
+ export declare function layoutExtent(nodePositions: Record<string, NodeSegment[]>): Bounds;
52
+ export declare const FIT_PADDING = 40;
53
+ export declare function clampZoom(zoom: number): number;
54
+ export declare function fittedTranslateY(bounds: {
55
+ minY: number;
56
+ h: number;
57
+ }, usableHeight: number, yScale: number): number;
58
+ export declare function fitTransform(bounds: {
59
+ minX: number;
60
+ minY: number;
61
+ w: number;
62
+ h: number;
63
+ }, paneWidth: number, paneHeight: number, pixelRows: boolean): {
64
+ scale: number;
65
+ translateX: number;
66
+ translateY: number;
67
+ } | undefined;
68
+ export declare function drawingBounds(layout: LayoutResult, opts?: {
69
+ region?: {
70
+ start: number;
71
+ end: number;
72
+ };
73
+ extent?: LayoutResult['extent'];
74
+ }): {
75
+ minX: number;
76
+ minY: number;
77
+ w: number;
78
+ h: number;
79
+ };
@@ -0,0 +1,12 @@
1
+ import type { Graph, GraphNode } from './types';
2
+ export interface ReferenceSpan {
3
+ start: number;
4
+ end: number;
5
+ }
6
+ export declare function buildNeighbors(graph: Graph): Map<string, string[]>;
7
+ export declare function nodeReferenceSpan({ nodeId, nodeById, neighbors, }: {
8
+ nodeId: string;
9
+ nodeById: Map<string, GraphNode>;
10
+ neighbors: Map<string, string[]>;
11
+ }): ReferenceSpan | undefined;
12
+ export declare function referenceMidpoints(graph: Graph): Map<string, number>;
@@ -0,0 +1,32 @@
1
+ import { Canvas2DRenderingBackendBase } from '@jbrowse/render-core/renderingBackendBase';
2
+ import type { Arrowhead, RenderBatch, Renderer, TransformUniform } from './types';
3
+ export declare class Canvas2DRenderer extends Canvas2DRenderingBackendBase implements Renderer {
4
+ private transform;
5
+ private batch;
6
+ private nodeHighlights;
7
+ private highlightedEdge;
8
+ private highlightFactor;
9
+ resize(width: number, height: number): void;
10
+ uploadGeometry(batch: RenderBatch): void;
11
+ setNodeHighlights(factors: ReadonlyMap<string, number>): void;
12
+ setEdgeHighlight(edgeIndex: number | null, factor: number): void;
13
+ updateTransform(transform: TransformUniform): void;
14
+ render(clearColor: [number, number, number, number]): void;
15
+ private renderEdges;
16
+ private renderNodes;
17
+ private renderArrows;
18
+ dispose(): void;
19
+ }
20
+ export declare function arrowheadOutline(a: Arrowhead, t: TransformUniform): readonly [{
21
+ readonly x: number;
22
+ readonly y: number;
23
+ }, {
24
+ readonly x: number;
25
+ readonly y: number;
26
+ }, {
27
+ readonly x: number;
28
+ readonly y: number;
29
+ }, {
30
+ readonly x: number;
31
+ readonly y: number;
32
+ }];
@@ -0,0 +1,63 @@
1
+ import type { ResolvedColorScheme } from '../colorSchemes';
2
+ import type { NodeWidth } from '../nodeWidths';
3
+ import type { Graph, GraphNode, NodeSegment } from '../types';
4
+ import type { WalkHighlight } from '../walkHighlight';
5
+ import type { RenderBatch } from './types';
6
+ import type { AxisScale, BezierCurve } from '../util/geometry';
7
+ export interface BuildOptions {
8
+ nodePositions: Record<string, NodeSegment[]>;
9
+ graph: Graph;
10
+ nodeById: Map<string, GraphNode>;
11
+ colorScheme: ResolvedColorScheme;
12
+ contigThickness: number;
13
+ connectorThickness: number;
14
+ drawPaths: boolean;
15
+ nodeWidth?: NodeWidth;
16
+ highlight?: WalkHighlight;
17
+ axis: AxisScale;
18
+ linearLayout?: boolean;
19
+ viewportBounds?: {
20
+ minX: number;
21
+ minY: number;
22
+ maxX: number;
23
+ maxY: number;
24
+ };
25
+ referenceRamp?: ReferenceRamp;
26
+ deletions?: Map<number, string[]>;
27
+ hiddenEdges?: ReadonlySet<number>;
28
+ version?: number;
29
+ }
30
+ export declare function hslToRgb(h: number, s: number, l: number): [number, number, number];
31
+ export declare const REFERENCE_RAMP_MAX_HUE = 300;
32
+ export interface ReferenceRamp {
33
+ start: number;
34
+ span: number;
35
+ midpoints: Map<string, number>;
36
+ }
37
+ export interface ColorSchemeRange {
38
+ minDepth: number;
39
+ maxDepth: number;
40
+ minLength: number;
41
+ maxLength: number;
42
+ maxRank: number;
43
+ nodeCount: number;
44
+ referenceRamp?: ReferenceRamp;
45
+ }
46
+ export declare function computeReferenceRamp(graph: Graph, domain: {
47
+ start: number;
48
+ end: number;
49
+ } | undefined): ReferenceRamp;
50
+ export declare function computeColorSchemeRange(graph: Graph): {
51
+ minDepth: number;
52
+ maxDepth: number;
53
+ minLength: number;
54
+ maxLength: number;
55
+ maxRank: number;
56
+ nodeCount: number;
57
+ };
58
+ export declare function getNodeColor(node: GraphNode, nodeIndex: number, colorScheme: ResolvedColorScheme, range: ColorSchemeRange): number;
59
+ export declare function endTangent(c: BezierCurve, yToX?: number, into?: {
60
+ from: NodeSegment;
61
+ to: NodeSegment;
62
+ }): number;
63
+ export declare function buildGeometry(options: BuildOptions): RenderBatch;
@@ -0,0 +1,2 @@
1
+ export declare function fadeAbgr(c: number, alpha: number): number;
2
+ export declare function brightenAbgr(c: number, factor: number): number;
@@ -0,0 +1,50 @@
1
+ import type { BezierCurve } from '../util/geometry';
2
+ export interface EdgeCurveBatch {
3
+ curves: BezierCurve[];
4
+ thickness: number;
5
+ color: number;
6
+ }
7
+ export interface NodeStroke {
8
+ points: {
9
+ x: number;
10
+ y: number;
11
+ }[];
12
+ thickness: number;
13
+ color: number;
14
+ }
15
+ export interface Arrowhead {
16
+ x: number;
17
+ y: number;
18
+ angle: number;
19
+ length: number;
20
+ halfWidth: number;
21
+ color: number;
22
+ }
23
+ export interface Run {
24
+ start: number;
25
+ count: number;
26
+ }
27
+ export interface RenderBatch {
28
+ nodeStrokes: NodeStroke[];
29
+ nodeStrokeRuns: Map<string, Run>;
30
+ arrows: Arrowhead[];
31
+ arrowRuns: Map<number, Run>;
32
+ edgeCurves: EdgeCurveBatch[];
33
+ edgeCurveRuns: Map<number, Run>;
34
+ }
35
+ export interface TransformUniform {
36
+ scaleX: number;
37
+ scaleY: number;
38
+ translateX: number;
39
+ translateY: number;
40
+ dpr: number;
41
+ }
42
+ export interface Renderer {
43
+ resize(width: number, height: number): void;
44
+ uploadGeometry(batch: RenderBatch): void;
45
+ setNodeHighlights(factors: ReadonlyMap<string, number>): void;
46
+ setEdgeHighlight(edgeIndex: number | null, factor: number): void;
47
+ updateTransform(transform: TransformUniform): void;
48
+ render(clearColor: [number, number, number, number]): void;
49
+ dispose(): void;
50
+ }
@@ -0,0 +1,66 @@
1
+ import type { TubeMapTransform } from './frame';
2
+ import type { TubeMapMismatch } from './mismatches';
3
+ import type { TubeMapLayout } from '@gmod/tubemap-core';
4
+ type Command = {
5
+ op: 'M' | 'L';
6
+ x: number;
7
+ y: number;
8
+ } | {
9
+ op: 'Q';
10
+ x1: number;
11
+ y1: number;
12
+ x: number;
13
+ y: number;
14
+ } | {
15
+ op: 'C';
16
+ x1: number;
17
+ y1: number;
18
+ x2: number;
19
+ y2: number;
20
+ x: number;
21
+ y: number;
22
+ } | {
23
+ op: 'H';
24
+ x: number;
25
+ } | {
26
+ op: 'V';
27
+ y: number;
28
+ } | {
29
+ op: 'Z';
30
+ };
31
+ export declare function parsePath(d: string): Command[];
32
+ interface Filled {
33
+ color: string;
34
+ alpha: number;
35
+ x0: number;
36
+ x1: number;
37
+ }
38
+ interface Rect extends Filled {
39
+ y0: number;
40
+ y1: number;
41
+ }
42
+ interface Shape extends Filled {
43
+ commands: Command[];
44
+ }
45
+ interface Layer {
46
+ rects: Rect[];
47
+ shapes: Shape[];
48
+ }
49
+ export interface TubeMapPicture {
50
+ layers: Layer[];
51
+ nodes: {
52
+ name: string;
53
+ commands: Command[];
54
+ x0: number;
55
+ x1: number;
56
+ }[];
57
+ mismatches: TubeMapMismatch[];
58
+ }
59
+ export declare function tubeMapPicture(layout: TubeMapLayout): TubeMapPicture;
60
+ export interface TubeMapFrame extends TubeMapTransform {
61
+ width: number;
62
+ highlightNode?: string | null;
63
+ darkMode?: boolean;
64
+ }
65
+ export declare function drawTubeMap(ctx: CanvasRenderingContext2D, picture: TubeMapPicture, frame: TubeMapFrame): void;
66
+ export {};
@@ -0,0 +1,15 @@
1
+ import type { TubeMapDrawing } from '../layout/tubeMapLayout';
2
+ export interface TubeMapView {
3
+ scaleX: number;
4
+ translateX: number;
5
+ scaleY: number;
6
+ translateY: number;
7
+ usableHeight: number;
8
+ }
9
+ export interface TubeMapTransform {
10
+ x: (tx: number) => number;
11
+ y: (ty: number) => number;
12
+ yScale: number;
13
+ }
14
+ export declare function tubeMapFrame(drawing: TubeMapDrawing, view: TubeMapView): TubeMapTransform;
15
+ export declare function tubeMapNodeAt(drawing: TubeMapDrawing, { x, y }: TubeMapTransform, sx: number, sy: number): null;
@@ -0,0 +1,24 @@
1
+ import type { TubeMapLayout } from '@gmod/tubemap-core';
2
+ interface MarkBase {
3
+ readId: number;
4
+ y: number;
5
+ height: number;
6
+ nodeY: number;
7
+ }
8
+ export type TubeMapMismatch = (MarkBase & {
9
+ kind: 'insertion';
10
+ x: number;
11
+ seq?: string;
12
+ softClip: boolean;
13
+ }) | (MarkBase & {
14
+ kind: 'deletion';
15
+ x0: number;
16
+ x1: number;
17
+ }) | (MarkBase & {
18
+ kind: 'substitution';
19
+ x0: number;
20
+ x1: number;
21
+ seq: string;
22
+ });
23
+ export declare function tubeMapMismatches(layout: TubeMapLayout): TubeMapMismatch[];
24
+ export {};
@@ -0,0 +1,10 @@
1
+ import type { GafRecord } from '../gaf/parseGaf';
2
+ import type { Graph, GraphNode } from '../types';
3
+ import type { InputTrack } from '@gmod/tubemap-core';
4
+ export declare function canonicalStrand(node: GraphNode): "+" | "-";
5
+ export declare function stepName(node: GraphNode, strand: '+' | '-'): string;
6
+ export declare function tubeMapReads(graph: Graph, records: readonly GafRecord[], firstId: number): InputTrack[];
7
+ export declare function readColor(read: {
8
+ id: number;
9
+ is_reverse?: boolean;
10
+ }): string;
@@ -0,0 +1,7 @@
1
+ import type { TubeMapColumn } from '../layout/tubeMapLayout';
2
+ export interface Knot {
3
+ tx: number;
4
+ sx: number;
5
+ }
6
+ export declare function referenceKnots(columns: readonly TubeMapColumn[], bpToScreen: (bp: number) => number): Knot[];
7
+ export declare function warpX(knots: readonly Knot[], tx: number): number;