@genome-spy/core 0.29.0 → 0.30.2
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/dist/index.es.js +16373 -0
- package/dist/index.js +43 -43
- package/package.json +10 -7
- package/src/data/collector.js +0 -183
- package/src/data/collector.test.js +0 -84
- package/src/data/dataFlow.js +0 -148
- package/src/data/dataFlow.test.js +0 -5
- package/src/data/facetNode.js +0 -17
- package/src/data/flow.test.js +0 -72
- package/src/data/flowBatch.d.ts +0 -40
- package/src/data/flowNode.js +0 -283
- package/src/data/flowNode.test.js +0 -50
- package/src/data/flowOptimizer.js +0 -123
- package/src/data/flowOptimizer.test.js +0 -193
- package/src/data/flowTestUtils.js +0 -63
- package/src/data/formats/fasta.js +0 -32
- package/src/data/formats/fasta.test.js +0 -27
- package/src/data/sources/dataSource.js +0 -22
- package/src/data/sources/dataSourceFactory.js +0 -24
- package/src/data/sources/dataUtils.js +0 -78
- package/src/data/sources/dynamicCallbackSource.js +0 -57
- package/src/data/sources/dynamicSource.js +0 -37
- package/src/data/sources/inlineSource.js +0 -67
- package/src/data/sources/inlineSource.test.js +0 -56
- package/src/data/sources/namedSource.js +0 -79
- package/src/data/sources/sequenceSource.js +0 -46
- package/src/data/sources/sequenceSource.test.js +0 -46
- package/src/data/sources/urlSource.js +0 -74
- package/src/data/transforms/aggregate.js +0 -70
- package/src/data/transforms/clone.js +0 -40
- package/src/data/transforms/clone.test.js +0 -11
- package/src/data/transforms/coverage.js +0 -187
- package/src/data/transforms/coverage.test.js +0 -123
- package/src/data/transforms/filter.js +0 -37
- package/src/data/transforms/filter.test.js +0 -18
- package/src/data/transforms/filterScoredLabels.js +0 -134
- package/src/data/transforms/flattenCompressedExons.js +0 -57
- package/src/data/transforms/flattenDelimited.js +0 -74
- package/src/data/transforms/flattenDelimited.test.js +0 -87
- package/src/data/transforms/flattenSequence.js +0 -39
- package/src/data/transforms/flattenSequence.test.js +0 -34
- package/src/data/transforms/formula.js +0 -39
- package/src/data/transforms/formula.test.js +0 -19
- package/src/data/transforms/identifier.js +0 -108
- package/src/data/transforms/identifier.test.js +0 -83
- package/src/data/transforms/linearizeGenomicCoordinate.js +0 -101
- package/src/data/transforms/measureText.js +0 -44
- package/src/data/transforms/pileup.js +0 -128
- package/src/data/transforms/pileup.test.js +0 -70
- package/src/data/transforms/project.js +0 -41
- package/src/data/transforms/project.test.js +0 -32
- package/src/data/transforms/regexExtract.js +0 -61
- package/src/data/transforms/regexExtract.test.js +0 -67
- package/src/data/transforms/regexFold.js +0 -141
- package/src/data/transforms/regexFold.test.js +0 -160
- package/src/data/transforms/sample.js +0 -101
- package/src/data/transforms/sample.test.js +0 -38
- package/src/data/transforms/stack.js +0 -137
- package/src/data/transforms/stack.test.js +0 -91
- package/src/data/transforms/transformFactory.js +0 -60
- package/src/embedApi.d.ts +0 -67
- package/src/encoder/accessor.js +0 -82
- package/src/encoder/accessor.test.js +0 -47
- package/src/encoder/encoder.js +0 -394
- package/src/encoder/encoder.test.js +0 -98
- package/src/fonts/Lato-Regular.json +0 -1267
- package/src/fonts/Lato-Regular.png +0 -0
- package/src/fonts/OFL.txt +0 -93
- package/src/fonts/README.md +0 -3
- package/src/fonts/bmFont.d.ts +0 -58
- package/src/fonts/bmFontManager.js +0 -357
- package/src/fonts/bmFontMetrics.js +0 -108
- package/src/genome/genome.js +0 -317
- package/src/genome/genome.test.js +0 -188
- package/src/genome/genomeStore.js +0 -54
- package/src/genome/locusFormat.js +0 -31
- package/src/genome/scaleIndex.d.ts +0 -38
- package/src/genome/scaleIndex.js +0 -166
- package/src/genome/scaleIndex.test.js +0 -78
- package/src/genome/scaleLocus.d.ts +0 -11
- package/src/genome/scaleLocus.js +0 -108
- package/src/genome/scaleLocus.test.js +0 -4
- package/src/genomeSpy.js +0 -784
- package/src/gl/arrayBuilder.js +0 -199
- package/src/gl/dataToVertices.js +0 -636
- package/src/gl/includes/common.glsl +0 -63
- package/src/gl/includes/picking.fragment.glsl +0 -1
- package/src/gl/includes/picking.vertex.glsl +0 -27
- package/src/gl/includes/sampleFacet.glsl +0 -107
- package/src/gl/includes/scales.glsl +0 -112
- package/src/gl/link.fragment.glsl +0 -18
- package/src/gl/link.vertex.glsl +0 -111
- package/src/gl/point.fragment.glsl +0 -123
- package/src/gl/point.vertex.glsl +0 -129
- package/src/gl/rect.fragment.glsl +0 -51
- package/src/gl/rect.vertex.glsl +0 -114
- package/src/gl/rule.fragment.glsl +0 -52
- package/src/gl/rule.vertex.glsl +0 -89
- package/src/gl/text.fragment.glsl +0 -31
- package/src/gl/text.vertex.glsl +0 -246
- package/src/gl/webGLHelper.js +0 -489
- package/src/img/bowtie.svg +0 -1
- package/src/img/genomespy-favicon.svg +0 -34
- package/src/index.html +0 -11
- package/src/index.js +0 -128
- package/src/marks/link.js +0 -175
- package/src/marks/mark.js +0 -975
- package/src/marks/markUtils.js +0 -125
- package/src/marks/pointMark.js +0 -251
- package/src/marks/rectMark.js +0 -241
- package/src/marks/rule.js +0 -250
- package/src/marks/text.js +0 -278
- package/src/node_modules/.vitest/results.json +0 -1
- package/src/scale/colorUtils.js +0 -184
- package/src/scale/glslScaleGenerator.js +0 -488
- package/src/scale/scale.js +0 -451
- package/src/scale/scale.test.js +0 -324
- package/src/scale/ticks.js +0 -203
- package/src/scale/ticks.test.js +0 -40
- package/src/singlePageApp.js +0 -13
- package/src/spec/axis.d.ts +0 -296
- package/src/spec/channel.d.ts +0 -430
- package/src/spec/data.d.ts +0 -196
- package/src/spec/font.d.ts +0 -15
- package/src/spec/genome.d.ts +0 -35
- package/src/spec/mark.d.ts +0 -429
- package/src/spec/root.d.ts +0 -17
- package/src/spec/sampleView.d.ts +0 -180
- package/src/spec/scale.d.ts +0 -273
- package/src/spec/title.d.ts +0 -102
- package/src/spec/tooltip.d.ts +0 -9
- package/src/spec/transform.d.ts +0 -479
- package/src/spec/view.d.ts +0 -201
- package/src/styles/genome-spy.scss +0 -153
- package/src/tooltip/dataTooltipHandler.js +0 -64
- package/src/tooltip/refseqGeneTooltipHandler.js +0 -78
- package/src/tooltip/tooltipHandler.ts +0 -12
- package/src/types/filetypes.d.ts +0 -14
- package/src/types/flatqueue.d.ts +0 -53
- package/src/types/glsl.d.ts +0 -4
- package/src/types/internmap.d.ts +0 -22
- package/src/types/object.d.ts +0 -21
- package/src/types/vega-loader.d.ts +0 -1
- package/src/types/vega-scale.d.ts +0 -60
- package/src/utils/addBaseUrl.js +0 -19
- package/src/utils/addBaseUrl.test.js +0 -22
- package/src/utils/animator.js +0 -83
- package/src/utils/arrayUtils.js +0 -61
- package/src/utils/binnedIndex.js +0 -167
- package/src/utils/binnedIndex.test.js +0 -155
- package/src/utils/clamp.js +0 -8
- package/src/utils/cloner.js +0 -34
- package/src/utils/cloner.test.js +0 -24
- package/src/utils/coalesce.js +0 -11
- package/src/utils/coalesce.test.js +0 -16
- package/src/utils/concatIterables.js +0 -26
- package/src/utils/concatIterables.test.js +0 -8
- package/src/utils/debounce.js +0 -37
- package/src/utils/domainArray.js +0 -216
- package/src/utils/domainArray.test.js +0 -130
- package/src/utils/eerp.js +0 -13
- package/src/utils/expression.js +0 -32
- package/src/utils/field.js +0 -28
- package/src/utils/formatObject.js +0 -31
- package/src/utils/indexer.js +0 -43
- package/src/utils/indexer.test.js +0 -47
- package/src/utils/inertia.js +0 -124
- package/src/utils/interactionEvent.js +0 -33
- package/src/utils/iterateNestedMaps.js +0 -21
- package/src/utils/iterateNestedMaps.test.js +0 -33
- package/src/utils/kWayMerge.js +0 -42
- package/src/utils/kWayMerge.test.js +0 -26
- package/src/utils/layout/flexLayout.js +0 -368
- package/src/utils/layout/flexLayout.test.js +0 -311
- package/src/utils/layout/grid.js +0 -95
- package/src/utils/layout/grid.test.js +0 -71
- package/src/utils/layout/padding.js +0 -120
- package/src/utils/layout/point.js +0 -23
- package/src/utils/layout/rectangle.js +0 -288
- package/src/utils/layout/rectangle.test.js +0 -172
- package/src/utils/mergeObjects.js +0 -99
- package/src/utils/mergeObjects.test.js +0 -42
- package/src/utils/numberExtractor.js +0 -24
- package/src/utils/numberExtractor.test.js +0 -6
- package/src/utils/point.js +0 -14
- package/src/utils/propertyCacher.js +0 -70
- package/src/utils/propertyCacher.test.js +0 -85
- package/src/utils/propertyCoalescer.js +0 -42
- package/src/utils/propertyCoalescer.test.js +0 -22
- package/src/utils/reservationMap.js +0 -103
- package/src/utils/reservationMap.test.js +0 -20
- package/src/utils/scaleNull.js +0 -19
- package/src/utils/setOperations.js +0 -75
- package/src/utils/smoothstep.js +0 -10
- package/src/utils/throttle.js +0 -34
- package/src/utils/topK.js +0 -76
- package/src/utils/topK.test.js +0 -64
- package/src/utils/transition.js +0 -74
- package/src/utils/ui/tooltip.js +0 -189
- package/src/utils/url.js +0 -22
- package/src/utils/variableTools.js +0 -24
- package/src/utils/variableTools.test.js +0 -13
- package/src/view/axisResolution.js +0 -140
- package/src/view/axisResolution.test.js +0 -201
- package/src/view/axisView.js +0 -747
- package/src/view/concatView.js +0 -45
- package/src/view/containerView.js +0 -159
- package/src/view/facetView.js +0 -491
- package/src/view/flowBuilder.js +0 -367
- package/src/view/flowBuilder.test.js +0 -125
- package/src/view/gridView.js +0 -786
- package/src/view/implicitRootView.js +0 -14
- package/src/view/importView.js +0 -19
- package/src/view/layerView.js +0 -74
- package/src/view/rendering.d.ts +0 -44
- package/src/view/renderingContext/compositeViewRenderingContext.js +0 -51
- package/src/view/renderingContext/deferredViewRenderingContext.js +0 -176
- package/src/view/renderingContext/layoutRecorderViewRenderingContext.js +0 -128
- package/src/view/renderingContext/simpleViewRenderingContext.js +0 -64
- package/src/view/renderingContext/svgViewRenderingContext.js +0 -125
- package/src/view/renderingContext/viewRenderingContext.js +0 -41
- package/src/view/scaleResolution.js +0 -791
- package/src/view/scaleResolution.test.js +0 -572
- package/src/view/scaleResolutionApi.d.ts +0 -40
- package/src/view/testUtils.js +0 -51
- package/src/view/title.js +0 -165
- package/src/view/unitView.js +0 -382
- package/src/view/view.js +0 -612
- package/src/view/view.test.js +0 -214
- package/src/view/viewContext.d.ts +0 -62
- package/src/view/viewFactory.js +0 -181
- package/src/view/viewFactory.test.js +0 -17
- package/src/view/viewUtils.js +0 -327
- package/src/view/zoom.js +0 -89
package/src/genome/scaleIndex.js
DELETED
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
import { ticks as d3ticks, tickStep, extent } from "d3-array";
|
|
2
|
-
import { format as d3format } from "d3-format";
|
|
3
|
-
|
|
4
|
-
const minimumDomainSpan = 1;
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Creates a "index" scale, which works similarly to d3's band scale but the domain
|
|
8
|
-
* consists of integer indexes.
|
|
9
|
-
*
|
|
10
|
-
* @returns {import("./scaleIndex").ScaleIndex}
|
|
11
|
-
*/
|
|
12
|
-
export default function scaleIndex() {
|
|
13
|
-
let domain = [0, 1];
|
|
14
|
-
let range = [0, 1];
|
|
15
|
-
|
|
16
|
-
let domainSpan = 1;
|
|
17
|
-
let rangeSpan = 1;
|
|
18
|
-
|
|
19
|
-
let paddingInner = 0;
|
|
20
|
-
let paddingOuter = 0;
|
|
21
|
-
let align = 0.5;
|
|
22
|
-
|
|
23
|
-
/** The number of the first element. This affects the generated ticks and their labels. */
|
|
24
|
-
let numberingOffset = 0;
|
|
25
|
-
|
|
26
|
-
const scaleFunction = (/** @type {number} */ x) =>
|
|
27
|
-
((x + align - domain[0]) / domainSpan) * rangeSpan + range[0];
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* In principle, the domain consists of integer indices. However,
|
|
31
|
-
* we accept real numbers so that items can be centered inside a band.
|
|
32
|
-
*
|
|
33
|
-
* @type {import("./scaleIndex").ScaleIndex}
|
|
34
|
-
*/
|
|
35
|
-
const scale = /** @type {any} */ (scaleFunction);
|
|
36
|
-
|
|
37
|
-
scale.invert = (y) =>
|
|
38
|
-
((y - range[0]) / rangeSpan) * domainSpan + domain[0] - align;
|
|
39
|
-
|
|
40
|
-
// @ts-expect-error
|
|
41
|
-
scale.domain = function (_) {
|
|
42
|
-
if (arguments.length) {
|
|
43
|
-
domain = extent(_);
|
|
44
|
-
domainSpan = domain[1] - domain[0];
|
|
45
|
-
|
|
46
|
-
if (domainSpan < minimumDomainSpan) {
|
|
47
|
-
domainSpan = minimumDomainSpan;
|
|
48
|
-
const centroid = (domain[0] + domain[1]) / 2;
|
|
49
|
-
domain[0] = centroid - domainSpan / 2;
|
|
50
|
-
domain[1] = centroid + domainSpan / 2;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
return scale;
|
|
54
|
-
} else {
|
|
55
|
-
return domain;
|
|
56
|
-
}
|
|
57
|
-
};
|
|
58
|
-
|
|
59
|
-
// @ts-expect-error
|
|
60
|
-
scale.range = function (_) {
|
|
61
|
-
if (arguments.length) {
|
|
62
|
-
range = [..._];
|
|
63
|
-
rangeSpan = range[1] - range[0];
|
|
64
|
-
return scale;
|
|
65
|
-
} else {
|
|
66
|
-
return range;
|
|
67
|
-
}
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
// @ts-expect-error
|
|
71
|
-
scale.numberingOffset = function (_) {
|
|
72
|
-
if (arguments.length) {
|
|
73
|
-
numberingOffset = _;
|
|
74
|
-
return scale;
|
|
75
|
-
} else {
|
|
76
|
-
return numberingOffset;
|
|
77
|
-
}
|
|
78
|
-
};
|
|
79
|
-
|
|
80
|
-
// @ts-expect-error
|
|
81
|
-
scale.padding = function (_) {
|
|
82
|
-
if (arguments.length) {
|
|
83
|
-
paddingOuter = _;
|
|
84
|
-
paddingInner = Math.min(1, _);
|
|
85
|
-
return scale;
|
|
86
|
-
} else {
|
|
87
|
-
return paddingInner;
|
|
88
|
-
}
|
|
89
|
-
};
|
|
90
|
-
|
|
91
|
-
// @ts-expect-error
|
|
92
|
-
scale.paddingInner = function (_) {
|
|
93
|
-
if (arguments.length) {
|
|
94
|
-
paddingInner = Math.min(1, _);
|
|
95
|
-
return scale;
|
|
96
|
-
} else {
|
|
97
|
-
return paddingInner;
|
|
98
|
-
}
|
|
99
|
-
};
|
|
100
|
-
|
|
101
|
-
// @ts-expect-error
|
|
102
|
-
scale.paddingOuter = function (_) {
|
|
103
|
-
if (arguments.length) {
|
|
104
|
-
paddingOuter = _;
|
|
105
|
-
return scale;
|
|
106
|
-
} else {
|
|
107
|
-
return paddingOuter;
|
|
108
|
-
}
|
|
109
|
-
};
|
|
110
|
-
|
|
111
|
-
// @ts-expect-error
|
|
112
|
-
scale.align = function (_) {
|
|
113
|
-
if (arguments.length) {
|
|
114
|
-
align = Math.max(0, Math.min(1, _));
|
|
115
|
-
return scale;
|
|
116
|
-
} else {
|
|
117
|
-
return align;
|
|
118
|
-
}
|
|
119
|
-
};
|
|
120
|
-
|
|
121
|
-
scale.step = () => rangeSpan / domainSpan;
|
|
122
|
-
|
|
123
|
-
scale.bandwidth = () => scale.step();
|
|
124
|
-
|
|
125
|
-
scale.ticks = (count) => {
|
|
126
|
-
const align = /** @type {number} */ (scale.align());
|
|
127
|
-
const offset = /** @type {number} */ (scale.numberingOffset());
|
|
128
|
-
return d3ticks(
|
|
129
|
-
domain[0] - align + offset,
|
|
130
|
-
domain[1] - align + offset,
|
|
131
|
-
Math.min(count, Math.ceil(domainSpan))
|
|
132
|
-
)
|
|
133
|
-
.filter(Number.isInteger)
|
|
134
|
-
.map((x) => x - numberingOffset);
|
|
135
|
-
};
|
|
136
|
-
|
|
137
|
-
scale.tickFormat = (count, specifier) => {
|
|
138
|
-
if (specifier) {
|
|
139
|
-
throw new Error(
|
|
140
|
-
"Index scale's tickFormat does not support a specifier!"
|
|
141
|
-
);
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
const step = tickStep(
|
|
145
|
-
domain[0],
|
|
146
|
-
domain[1],
|
|
147
|
-
Math.min(count, Math.ceil(domainSpan))
|
|
148
|
-
);
|
|
149
|
-
// Use higher display precision for smaller spans
|
|
150
|
-
// TODO: max absolute value should be taken into account too. 2.00M vs 200M
|
|
151
|
-
const numberFormat = step < 100000 ? d3format(",") : d3format(".3s");
|
|
152
|
-
|
|
153
|
-
return /** @param {number} x */ (x) =>
|
|
154
|
-
numberFormat(x + numberingOffset);
|
|
155
|
-
};
|
|
156
|
-
|
|
157
|
-
scale.copy = () =>
|
|
158
|
-
scaleIndex()
|
|
159
|
-
.domain(domain)
|
|
160
|
-
.range(range)
|
|
161
|
-
.paddingInner(paddingInner)
|
|
162
|
-
.paddingOuter(paddingOuter)
|
|
163
|
-
.numberingOffset(numberingOffset);
|
|
164
|
-
|
|
165
|
-
return scale;
|
|
166
|
-
}
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import { expect, test } from "vitest";
|
|
2
|
-
import scaleIndex from "./scaleIndex";
|
|
3
|
-
|
|
4
|
-
test("Scale with defaults works as expected", () => {
|
|
5
|
-
const scale = scaleIndex();
|
|
6
|
-
|
|
7
|
-
// Align is 0.5 by default
|
|
8
|
-
expect(scale(-1)).toEqual(-0.5);
|
|
9
|
-
expect(scale(0)).toEqual(0.5);
|
|
10
|
-
expect(scale(1)).toEqual(1.5);
|
|
11
|
-
expect(scale(2)).toEqual(2.5);
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
test("Scale scales correctly with custom domain and range", () => {
|
|
15
|
-
const scale = scaleIndex().domain([0, 10]).range([100, 200]).align(0.0);
|
|
16
|
-
|
|
17
|
-
expect(scale(0)).toEqual(100);
|
|
18
|
-
expect(scale(10)).toEqual(200);
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
test("Invert works as expected", () => {
|
|
22
|
-
const scale = scaleIndex().domain([0, 10]).range([100, 200]).align(0.0);
|
|
23
|
-
|
|
24
|
-
expect(scale.invert(scale(0))).toEqual(0);
|
|
25
|
-
expect(scale.invert(scale(5))).toEqual(5);
|
|
26
|
-
expect(scale.invert(scale(10))).toEqual(10);
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
test("Scale scales correctly with custom domain, range, and align", () => {
|
|
30
|
-
const scale = scaleIndex().domain([0, 10]).range([100, 200]).align(0.5);
|
|
31
|
-
|
|
32
|
-
expect(scale(0)).toEqual(105);
|
|
33
|
-
expect(scale(10)).toEqual(205);
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
test("Invert works as expected with align", () => {
|
|
37
|
-
const scale = scaleIndex().domain([0, 10]).range([100, 200]).align(0.5);
|
|
38
|
-
|
|
39
|
-
expect(scale.invert(scale(0))).toEqual(0);
|
|
40
|
-
expect(scale.invert(scale(5))).toEqual(5);
|
|
41
|
-
expect(scale.invert(scale(10))).toEqual(10);
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
test("domain() accepts numeric ordinal domain and computes its extent", () => {
|
|
45
|
-
const scale = scaleIndex().domain([7, 3, 5, 9, 8]);
|
|
46
|
-
expect(scale.domain()).toEqual([3, 9]);
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
test("domain() clamps the minimum domain span to one", () => {
|
|
50
|
-
const scale = scaleIndex().domain([1.25, 1.75]);
|
|
51
|
-
expect(scale.domain()).toEqual([1, 2]);
|
|
52
|
-
|
|
53
|
-
scale.domain([1.75, 2.25]);
|
|
54
|
-
expect(scale.domain()).toEqual([1.5, 2.5]);
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
test("ticks() produces integer values", () => {
|
|
58
|
-
const scale = scaleIndex().domain([0, 5]).numberingOffset(0);
|
|
59
|
-
|
|
60
|
-
expect(scale.ticks(5)).toEqual([0, 1, 2, 3, 4]);
|
|
61
|
-
expect(scale.ticks(100)).toEqual([0, 1, 2, 3, 4]);
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
test("ticks() take numberingOffset into account", () => {
|
|
65
|
-
const scale = scaleIndex().domain([10, 15]).numberingOffset(1);
|
|
66
|
-
|
|
67
|
-
// The ticks have been offset so that nice labels can be generated (5, 10, 15, ...)
|
|
68
|
-
expect(scale.ticks(5)).toEqual([10, 11, 12, 13, 14]);
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
test("tickFormat() takes numberingOffset into account", () => {
|
|
72
|
-
const scale = scaleIndex().domain([10, 15]).numberingOffset(1);
|
|
73
|
-
|
|
74
|
-
const format = scale.tickFormat(5);
|
|
75
|
-
|
|
76
|
-
// Although the ticks have been offset, the labels should be nice
|
|
77
|
-
expect(scale.ticks(5).map(format)).toEqual(["11", "12", "13", "14", "15"]);
|
|
78
|
-
});
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import Genome from "./genome";
|
|
2
|
-
import { ScaleIndex } from "./scaleIndex";
|
|
3
|
-
|
|
4
|
-
export default function scaleLocus(): ScaleLocus;
|
|
5
|
-
|
|
6
|
-
export interface ScaleLocus extends ScaleIndex {
|
|
7
|
-
genome(): Genome;
|
|
8
|
-
genome(genome: Genome): this;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export function isScaleLocus(scale: any): scale is ScaleLocus;
|
package/src/genome/scaleLocus.js
DELETED
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
import { tickStep } from "d3-array";
|
|
2
|
-
import { format as d3format } from "d3-format";
|
|
3
|
-
import scaleIndex from "./scaleIndex.js";
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Creates a "locus" scale, which works similarly to band scale but the domain
|
|
7
|
-
* consists of integer indexes.
|
|
8
|
-
*
|
|
9
|
-
* @typedef {import("./genome").default} Genome
|
|
10
|
-
* @returns {import("./scaleLocus").ScaleLocus}
|
|
11
|
-
*/
|
|
12
|
-
export default function scaleLocus() {
|
|
13
|
-
/** @type {import("./scaleLocus").ScaleLocus} */
|
|
14
|
-
const scale = /** @type {any} */ (scaleIndex().numberingOffset(1));
|
|
15
|
-
|
|
16
|
-
/** @type {Genome} */
|
|
17
|
-
let genome;
|
|
18
|
-
|
|
19
|
-
// @ts-expect-error
|
|
20
|
-
scale.genome = function (_) {
|
|
21
|
-
if (arguments.length) {
|
|
22
|
-
genome = _;
|
|
23
|
-
return scale;
|
|
24
|
-
} else {
|
|
25
|
-
return genome;
|
|
26
|
-
}
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
scale.ticks = (count) => {
|
|
30
|
-
if (!genome) {
|
|
31
|
-
return [];
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
const domain = scale.domain();
|
|
35
|
-
const numberingOffset = scale.numberingOffset();
|
|
36
|
-
|
|
37
|
-
const [minChrom, maxChrom] = [
|
|
38
|
-
Math.max(domain[0], 0),
|
|
39
|
-
Math.min(domain[1], genome.totalSize - 1),
|
|
40
|
-
].map((x) => genome.toChromosome(x));
|
|
41
|
-
|
|
42
|
-
const step = Math.max(1, tickStep(domain[0], domain[1], count));
|
|
43
|
-
|
|
44
|
-
const ticks = [];
|
|
45
|
-
|
|
46
|
-
for (let i = minChrom.index; i <= maxChrom.index; i++) {
|
|
47
|
-
const chrom = genome.chromosomes[i];
|
|
48
|
-
|
|
49
|
-
const from = Math.max(
|
|
50
|
-
chrom.continuousStart + step,
|
|
51
|
-
domain[0] - ((domain[0] - chrom.continuousStart) % step)
|
|
52
|
-
);
|
|
53
|
-
const to = Math.min(chrom.continuousEnd - step / 4, domain[1] + 1);
|
|
54
|
-
for (let pos = from; pos <= to; pos += step) {
|
|
55
|
-
const tick = pos - numberingOffset;
|
|
56
|
-
if (tick >= domain[0] && tick < domain[1]) {
|
|
57
|
-
ticks.push(tick);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
return ticks;
|
|
63
|
-
};
|
|
64
|
-
|
|
65
|
-
scale.tickFormat = (count, specifier) => {
|
|
66
|
-
if (!genome) {
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
if (specifier) {
|
|
71
|
-
throw new Error(
|
|
72
|
-
"Locus scale's tickFormat does not support a specifier!"
|
|
73
|
-
);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
const domain = scale.domain();
|
|
77
|
-
const domainSpan = domain[1] - domain[0];
|
|
78
|
-
const numberingOffset = scale.numberingOffset();
|
|
79
|
-
|
|
80
|
-
const step = tickStep(
|
|
81
|
-
domain[0],
|
|
82
|
-
domain[1],
|
|
83
|
-
Math.min(count, Math.ceil(domainSpan))
|
|
84
|
-
);
|
|
85
|
-
// Use higher display precision for smaller spans
|
|
86
|
-
// TODO: max absolute value should be taken into account too. 2.00M vs 200M
|
|
87
|
-
const numberFormat = step < 1e6 ? d3format(",") : d3format(".3s");
|
|
88
|
-
|
|
89
|
-
/** @type {function(number):number} */
|
|
90
|
-
const fixer = (x) => x - genome.toChromosome(x).continuousStart;
|
|
91
|
-
|
|
92
|
-
return /** @param {number} x */ (x) =>
|
|
93
|
-
numberFormat(fixer(x) + numberingOffset);
|
|
94
|
-
};
|
|
95
|
-
|
|
96
|
-
const originalCopy = scale.copy;
|
|
97
|
-
|
|
98
|
-
scale.copy = () => originalCopy().genome(genome);
|
|
99
|
-
|
|
100
|
-
return scale;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
/**
|
|
104
|
-
* @type {import("./scaleLocus").isScaleLocus}
|
|
105
|
-
*/
|
|
106
|
-
export function isScaleLocus(scale) {
|
|
107
|
-
return scale.type == "locus";
|
|
108
|
-
}
|