@genome-spy/core 0.64.0 → 0.66.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.
- package/dist/bundle/{index-CCJIjehY.js → AbortablePromiseCache-CcuMrnn7.js} +22 -91
- package/dist/bundle/browser-BRemItdO.js +138 -0
- package/dist/bundle/index-BatuyGAI.js +271 -0
- package/dist/bundle/index-ByuE8dvu.js +332 -0
- package/dist/bundle/index-Cq3QFUxX.js +1781 -0
- package/dist/bundle/{index-C08YCM2T.js → index-D-w7Mmt9.js} +246 -126
- package/dist/bundle/index-D28m8tSW.js +1607 -0
- package/dist/bundle/index-D74H8TTz.js +508 -0
- package/dist/bundle/index-DbJ0oeYM.js +631 -0
- package/dist/bundle/index.es.js +15034 -13842
- package/dist/bundle/index.js +223 -237
- package/dist/bundle/inflate-GtwLkvSP.js +1048 -0
- package/dist/bundle/unzip-NywezaRR.js +1492 -0
- package/dist/schema.json +22 -4
- package/dist/src/config/scaleDefaults.d.ts +8 -0
- package/dist/src/config/scaleDefaults.d.ts.map +1 -0
- package/dist/src/config/scaleDefaults.js +45 -0
- package/dist/src/data/collector.d.ts +7 -2
- package/dist/src/data/collector.d.ts.map +1 -1
- package/dist/src/data/collector.js +13 -2
- package/dist/src/data/dataFlow.d.ts +20 -42
- package/dist/src/data/dataFlow.d.ts.map +1 -1
- package/dist/src/data/dataFlow.js +57 -80
- package/dist/src/data/flowHandle.d.ts +15 -0
- package/dist/src/data/flowHandle.d.ts.map +1 -0
- package/dist/src/data/flowHandle.js +13 -0
- package/dist/src/data/flowInit.d.ts +85 -0
- package/dist/src/data/flowInit.d.ts.map +1 -0
- package/dist/src/data/flowInit.js +238 -0
- package/dist/src/data/flowInit.test.d.ts +2 -0
- package/dist/src/data/flowInit.test.d.ts.map +1 -0
- package/dist/src/data/flowOptimizer.d.ts +6 -4
- package/dist/src/data/flowOptimizer.d.ts.map +1 -1
- package/dist/src/data/flowOptimizer.js +29 -14
- package/dist/src/data/sources/lazy/axisTickSource.js +1 -1
- package/dist/src/data/sources/lazy/bamSource.js +1 -1
- package/dist/src/data/sources/lazy/bigBedSource.js +1 -1
- package/dist/src/data/sources/lazy/bigWigSource.js +1 -1
- package/dist/src/data/sources/lazy/gff3Source.d.ts +2 -6
- package/dist/src/data/sources/lazy/gff3Source.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/gff3Source.js +4 -8
- package/dist/src/data/sources/lazy/indexedFastaSource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/indexedFastaSource.js +17 -17
- package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts +1 -1
- package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/singleAxisLazySource.js +10 -3
- package/dist/src/data/sources/lazy/singleAxisWindowedSource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/singleAxisWindowedSource.js +5 -1
- package/dist/src/data/sources/lazy/tabixSource.js +1 -1
- package/dist/src/data/transforms/filterScoredLabels.d.ts +1 -1
- package/dist/src/data/transforms/filterScoredLabels.d.ts.map +1 -1
- package/dist/src/data/transforms/filterScoredLabels.js +1 -1
- package/dist/src/data/transforms/linearizeGenomicCoordinate.d.ts.map +1 -1
- package/dist/src/data/transforms/linearizeGenomicCoordinate.js +2 -1
- package/dist/src/encoder/encoder.d.ts +1 -1
- package/dist/src/encoder/encoder.d.ts.map +1 -1
- package/dist/src/encoder/encoder.js +1 -1
- package/dist/src/genome/scaleLocus.d.ts +39 -0
- package/dist/src/genome/scaleLocus.d.ts.map +1 -1
- package/dist/src/genome/scaleLocus.js +76 -0
- package/dist/src/genomeSpy/canvasExport.d.ts +19 -0
- package/dist/src/genomeSpy/canvasExport.d.ts.map +1 -0
- package/dist/src/genomeSpy/canvasExport.js +66 -0
- package/dist/src/genomeSpy/containerUi.d.ts +17 -0
- package/dist/src/genomeSpy/containerUi.d.ts.map +1 -0
- package/dist/src/genomeSpy/containerUi.js +78 -0
- package/dist/src/genomeSpy/eventListenerRegistry.d.ts +19 -0
- package/dist/src/genomeSpy/eventListenerRegistry.d.ts.map +1 -0
- package/dist/src/genomeSpy/eventListenerRegistry.js +38 -0
- package/dist/src/genomeSpy/inputBindingManager.d.ts +14 -0
- package/dist/src/genomeSpy/inputBindingManager.d.ts.map +1 -0
- package/dist/src/genomeSpy/inputBindingManager.js +63 -0
- package/dist/src/genomeSpy/interactionController.d.ts +40 -0
- package/dist/src/genomeSpy/interactionController.d.ts.map +1 -0
- package/dist/src/genomeSpy/interactionController.js +371 -0
- package/dist/src/genomeSpy/keyboardListenerManager.d.ts +10 -0
- package/dist/src/genomeSpy/keyboardListenerManager.d.ts.map +1 -0
- package/dist/src/genomeSpy/keyboardListenerManager.js +31 -0
- package/dist/src/genomeSpy/loadingIndicatorManager.d.ts +15 -0
- package/dist/src/genomeSpy/loadingIndicatorManager.d.ts.map +1 -0
- package/dist/src/genomeSpy/loadingIndicatorManager.js +92 -0
- package/dist/src/genomeSpy/renderCoordinator.d.ts +22 -0
- package/dist/src/genomeSpy/renderCoordinator.d.ts.map +1 -0
- package/dist/src/genomeSpy/renderCoordinator.js +118 -0
- package/dist/src/genomeSpy/viewContextFactory.d.ts +18 -0
- package/dist/src/genomeSpy/viewContextFactory.d.ts.map +1 -0
- package/dist/src/genomeSpy/viewContextFactory.js +79 -0
- package/dist/src/genomeSpy/viewDataInit.d.ts +12 -0
- package/dist/src/genomeSpy/viewDataInit.d.ts.map +1 -0
- package/dist/src/genomeSpy/viewDataInit.js +41 -0
- package/dist/src/genomeSpy/viewHierarchyConfig.d.ts +14 -0
- package/dist/src/genomeSpy/viewHierarchyConfig.d.ts.map +1 -0
- package/dist/src/genomeSpy/viewHierarchyConfig.js +24 -0
- package/dist/src/genomeSpy/viewHighlight.d.ts +5 -0
- package/dist/src/genomeSpy/viewHighlight.d.ts.map +1 -0
- package/dist/src/genomeSpy/viewHighlight.js +30 -0
- package/dist/src/genomeSpy.d.ts +17 -72
- package/dist/src/genomeSpy.d.ts.map +1 -1
- package/dist/src/genomeSpy.js +180 -789
- package/dist/src/gl/glslScaleGenerator.d.ts +1 -1
- package/dist/src/gl/webGLHelper.d.ts +2 -2
- package/dist/src/gl/webGLHelper.d.ts.map +1 -1
- package/dist/src/gl/webGLHelper.js +4 -4
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -12
- package/dist/src/marks/mark.d.ts +1 -0
- package/dist/src/marks/mark.d.ts.map +1 -1
- package/dist/src/marks/mark.js +26 -3
- package/dist/src/{view → scales}/axisResolution.d.ts +12 -14
- package/dist/src/scales/axisResolution.d.ts.map +1 -0
- package/dist/src/{view → scales}/axisResolution.js +38 -12
- package/dist/src/scales/axisResolution.test.d.ts.map +1 -0
- package/dist/src/scales/scaleDomainAggregator.d.ts +57 -0
- package/dist/src/scales/scaleDomainAggregator.d.ts.map +1 -0
- package/dist/src/scales/scaleDomainAggregator.js +162 -0
- package/dist/src/scales/scaleDomainAggregator.test.d.ts +2 -0
- package/dist/src/scales/scaleDomainAggregator.test.d.ts.map +1 -0
- package/dist/src/scales/scaleInstanceManager.d.ts +40 -0
- package/dist/src/scales/scaleInstanceManager.d.ts.map +1 -0
- package/dist/src/scales/scaleInstanceManager.js +313 -0
- package/dist/src/scales/scaleInstanceManager.test.d.ts +2 -0
- package/dist/src/scales/scaleInstanceManager.test.d.ts.map +1 -0
- package/dist/src/scales/scaleInteractionController.d.ts +73 -0
- package/dist/src/scales/scaleInteractionController.d.ts.map +1 -0
- package/dist/src/scales/scaleInteractionController.js +336 -0
- package/dist/src/scales/scaleInteractionController.test.d.ts +2 -0
- package/dist/src/scales/scaleInteractionController.test.d.ts.map +1 -0
- package/dist/src/scales/scalePropsResolver.d.ts +23 -0
- package/dist/src/scales/scalePropsResolver.d.ts.map +1 -0
- package/dist/src/scales/scalePropsResolver.js +74 -0
- package/dist/src/{view → scales}/scaleResolution.d.ts +53 -31
- package/dist/src/scales/scaleResolution.d.ts.map +1 -0
- package/dist/src/scales/scaleResolution.js +658 -0
- package/dist/src/scales/scaleResolution.test.d.ts.map +1 -0
- package/dist/src/scales/scaleResolutionConstants.d.ts +6 -0
- package/dist/src/scales/scaleResolutionConstants.d.ts.map +1 -0
- package/dist/src/scales/scaleResolutionConstants.js +5 -0
- package/dist/src/scales/scaleRules.d.ts +16 -0
- package/dist/src/scales/scaleRules.d.ts.map +1 -0
- package/dist/src/scales/scaleRules.js +103 -0
- package/dist/src/scales/scaleRules.test.d.ts +2 -0
- package/dist/src/scales/scaleRules.test.d.ts.map +1 -0
- package/dist/src/spec/channel.d.ts +13 -18
- package/dist/src/spec/sampleView.d.ts +3 -2
- package/dist/src/spec/scale.d.ts +6 -0
- package/dist/src/types/embedApi.d.ts +5 -0
- package/dist/src/types/scaleResolutionApi.d.ts +1 -1
- package/dist/src/types/viewContext.d.ts +1 -1
- package/dist/src/view/concatView.d.ts +18 -0
- package/dist/src/view/concatView.d.ts.map +1 -1
- package/dist/src/view/concatView.js +73 -0
- package/dist/src/view/concatView.test.d.ts +2 -0
- package/dist/src/view/concatView.test.d.ts.map +1 -0
- package/dist/src/view/containerMutationHelper.d.ts +74 -0
- package/dist/src/view/containerMutationHelper.d.ts.map +1 -0
- package/dist/src/view/containerMutationHelper.js +114 -0
- package/dist/src/view/containerView.d.ts +0 -7
- package/dist/src/view/containerView.d.ts.map +1 -1
- package/dist/src/view/containerView.js +0 -10
- package/dist/src/view/facetView.d.ts.map +1 -1
- package/dist/src/view/facetView.js +0 -14
- package/dist/src/view/flowBuilder.d.ts +2 -2
- package/dist/src/view/flowBuilder.d.ts.map +1 -1
- package/dist/src/view/flowBuilder.js +21 -4
- package/dist/src/view/gridView/gridChild.d.ts +11 -0
- package/dist/src/view/gridView/gridChild.d.ts.map +1 -1
- package/dist/src/view/gridView/gridChild.js +32 -6
- package/dist/src/view/gridView/gridView.d.ts +39 -1
- package/dist/src/view/gridView/gridView.d.ts.map +1 -1
- package/dist/src/view/gridView/gridView.js +113 -42
- package/dist/src/view/gridView/gridView.test.d.ts +2 -0
- package/dist/src/view/gridView/gridView.test.d.ts.map +1 -0
- package/dist/src/view/gridView/scrollbar.d.ts +39 -8
- package/dist/src/view/gridView/scrollbar.d.ts.map +1 -1
- package/dist/src/view/gridView/scrollbar.js +184 -69
- package/dist/src/view/gridView/selectionRect.d.ts +8 -4
- package/dist/src/view/gridView/selectionRect.d.ts.map +1 -1
- package/dist/src/view/gridView/selectionRect.js +28 -3
- package/dist/src/view/gridView/selectionRect.test.d.ts +2 -0
- package/dist/src/view/gridView/selectionRect.test.d.ts.map +1 -0
- package/dist/src/view/layerView.d.ts +14 -0
- package/dist/src/view/layerView.d.ts.map +1 -1
- package/dist/src/view/layerView.js +66 -0
- package/dist/src/view/layerView.test.d.ts +2 -0
- package/dist/src/view/layerView.test.d.ts.map +1 -0
- package/dist/src/view/paramMediator.d.ts +2 -1
- package/dist/src/view/paramMediator.d.ts.map +1 -1
- package/dist/src/view/paramMediator.js +13 -1
- package/dist/src/view/testUtils.d.ts.map +1 -1
- package/dist/src/view/testUtils.js +18 -5
- package/dist/src/view/unitView.d.ts.map +1 -1
- package/dist/src/view/unitView.js +52 -12
- package/dist/src/view/view.d.ts +23 -7
- package/dist/src/view/view.d.ts.map +1 -1
- package/dist/src/view/view.js +61 -5
- package/dist/src/view/viewDispose.test.d.ts +2 -0
- package/dist/src/view/viewDispose.test.d.ts.map +1 -0
- package/dist/src/view/viewUtils.d.ts +4 -4
- package/dist/src/view/viewUtils.d.ts.map +1 -1
- package/dist/src/view/viewUtils.js +19 -15
- package/dist/src/view/viewUtils.test.d.ts +2 -0
- package/dist/src/view/viewUtils.test.d.ts.map +1 -0
- package/package.json +10 -10
- package/dist/bundle/__vite-browser-external-C--ziKoh.js +0 -8
- package/dist/bundle/_commonjsHelpers-DjF3Plf2.js +0 -26
- package/dist/bundle/index-5ajWdKly.js +0 -1319
- package/dist/bundle/index-B03-Om4z.js +0 -274
- package/dist/bundle/index-BftNdA0O.js +0 -27
- package/dist/bundle/index-Bg7C4Xat.js +0 -2750
- package/dist/bundle/index-C3QR8Lv6.js +0 -2131
- package/dist/bundle/index-DTcHjAHp.js +0 -505
- package/dist/bundle/index-DnIkxb0L.js +0 -1025
- package/dist/bundle/index-Ww3TAo6_.js +0 -71
- package/dist/bundle/index-g8iXgW0W.js +0 -651
- package/dist/bundle/long-B-FASCSo.js +0 -2387
- package/dist/bundle/remoteFile-BuaqFGWk.js +0 -94
- package/dist/src/data/collector.test.js +0 -138
- package/dist/src/data/dataFlow.test.js +0 -5
- package/dist/src/data/flow.test.js +0 -81
- package/dist/src/data/flowNode.test.js +0 -50
- package/dist/src/data/flowOptimizer.test.js +0 -204
- package/dist/src/data/formats/fasta.test.js +0 -27
- package/dist/src/data/sources/inlineSource.test.js +0 -63
- package/dist/src/data/sources/sequenceSource.test.js +0 -81
- package/dist/src/data/transforms/aggregate.test.js +0 -134
- package/dist/src/data/transforms/clone.test.js +0 -11
- package/dist/src/data/transforms/coverage.test.js +0 -238
- package/dist/src/data/transforms/filter.test.js +0 -20
- package/dist/src/data/transforms/flatten.test.js +0 -96
- package/dist/src/data/transforms/flattenDelimited.test.js +0 -90
- package/dist/src/data/transforms/flattenSequence.test.js +0 -34
- package/dist/src/data/transforms/formula.test.js +0 -25
- package/dist/src/data/transforms/identifier.test.js +0 -92
- package/dist/src/data/transforms/pileup.test.js +0 -70
- package/dist/src/data/transforms/project.test.js +0 -32
- package/dist/src/data/transforms/regexExtract.test.js +0 -70
- package/dist/src/data/transforms/regexFold.test.js +0 -201
- package/dist/src/data/transforms/sample.test.js +0 -38
- package/dist/src/data/transforms/stack.test.js +0 -91
- package/dist/src/encoder/accessor.test.js +0 -162
- package/dist/src/encoder/encoder.test.js +0 -105
- package/dist/src/genome/genome.test.js +0 -268
- package/dist/src/genome/genomes.test.js +0 -8
- package/dist/src/genome/scaleIndex.test.js +0 -78
- package/dist/src/genome/scaleLocus.test.js +0 -4
- package/dist/src/scale/scale.test.js +0 -326
- package/dist/src/scale/ticks.test.js +0 -46
- package/dist/src/selection/selection.test.js +0 -14
- package/dist/src/utils/addBaseUrl.test.js +0 -30
- package/dist/src/utils/binnedIndex.test.js +0 -201
- package/dist/src/utils/cloner.test.js +0 -35
- package/dist/src/utils/coalesce.test.js +0 -16
- package/dist/src/utils/concatIterables.test.js +0 -8
- package/dist/src/utils/domainArray.test.js +0 -130
- package/dist/src/utils/indexer.test.js +0 -49
- package/dist/src/utils/interactionEvent.test.js +0 -35
- package/dist/src/utils/iterateNestedMaps.test.js +0 -33
- package/dist/src/utils/kWayMerge.test.js +0 -30
- package/dist/src/utils/mergeObjects.test.js +0 -42
- package/dist/src/utils/numberExtractor.test.js +0 -6
- package/dist/src/utils/propertyCacher.test.js +0 -89
- package/dist/src/utils/propertyCoalescer.test.js +0 -25
- package/dist/src/utils/radixSort.test.js +0 -51
- package/dist/src/utils/reservationMap.test.js +0 -20
- package/dist/src/utils/ringBuffer.test.js +0 -39
- package/dist/src/utils/topK.test.js +0 -54
- package/dist/src/utils/trees.test.js +0 -135
- package/dist/src/utils/url.test.js +0 -28
- package/dist/src/utils/variableTools.test.js +0 -13
- package/dist/src/view/axisResolution.d.ts.map +0 -1
- package/dist/src/view/axisResolution.test.d.ts.map +0 -1
- package/dist/src/view/axisResolution.test.js +0 -206
- package/dist/src/view/flowBuilder.test.js +0 -125
- package/dist/src/view/layout/flexLayout.test.js +0 -323
- package/dist/src/view/layout/grid.test.js +0 -71
- package/dist/src/view/layout/rectangle.test.js +0 -192
- package/dist/src/view/paramMediator.test.js +0 -260
- package/dist/src/view/scaleResolution.d.ts.map +0 -1
- package/dist/src/view/scaleResolution.js +0 -1049
- package/dist/src/view/scaleResolution.test.d.ts.map +0 -1
- package/dist/src/view/scaleResolution.test.js +0 -645
- package/dist/src/view/view.test.js +0 -245
- package/dist/src/view/viewFactory.test.js +0 -25
- /package/dist/src/{view → scales}/axisResolution.test.d.ts +0 -0
- /package/dist/src/{view → scales}/scaleResolution.test.d.ts +0 -0
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import UnitView from "../view/unitView.js";
|
|
2
|
+
import { buildDataFlow } from "../view/flowBuilder.js";
|
|
3
|
+
import { optimizeDataFlow } from "./flowOptimizer.js";
|
|
4
|
+
import { VISIT_SKIP } from "../view/view.js";
|
|
5
|
+
import { reconfigureScaleDomains } from "../scales/scaleResolution.js";
|
|
6
|
+
|
|
7
|
+
/** @type {WeakMap<import("./sources/dataSource.js").default, Promise<void>>} */
|
|
8
|
+
const inFlightLoads = new WeakMap();
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Deduplicate concurrent loads for shared sources without changing propagation.
|
|
12
|
+
*
|
|
13
|
+
* Data sources still propagate rows immediately during `load()`/`loadSynchronously`
|
|
14
|
+
* and do not retain data. This helper only prevents overlapping `load()` calls
|
|
15
|
+
* from running twice; collectors remain the sole in-memory cache. Once the load
|
|
16
|
+
* promise settles, the source may be loaded again later as usual.
|
|
17
|
+
*
|
|
18
|
+
* @param {import("./sources/dataSource.js").default} dataSource
|
|
19
|
+
* @returns {Promise<void>}
|
|
20
|
+
*/
|
|
21
|
+
function loadDataSourceOnce(dataSource) {
|
|
22
|
+
const existing = inFlightLoads.get(dataSource);
|
|
23
|
+
if (existing) {
|
|
24
|
+
return existing;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const loadPromise = Promise.resolve()
|
|
28
|
+
.then(() => dataSource.load())
|
|
29
|
+
.finally(() => {
|
|
30
|
+
inFlightLoads.delete(dataSource);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
inFlightLoads.set(dataSource, loadPromise);
|
|
34
|
+
return loadPromise;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Synchronize flow handles after data flow optimization.
|
|
39
|
+
*
|
|
40
|
+
* @param {import("../view/view.js").default} root
|
|
41
|
+
* @param {Map<import("./sources/dataSource.js").default, import("./sources/dataSource.js").default>} canonicalBySource
|
|
42
|
+
*/
|
|
43
|
+
export function syncFlowHandles(root, canonicalBySource) {
|
|
44
|
+
for (const view of root.getDescendants()) {
|
|
45
|
+
const handle = view.flowHandle;
|
|
46
|
+
if (!handle) {
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const dataSource = handle.dataSource;
|
|
51
|
+
if (dataSource) {
|
|
52
|
+
handle.dataSource = canonicalBySource.get(dataSource) ?? dataSource;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Initializes data flow and mark wiring for a subtree without rebuilding the
|
|
59
|
+
* entire view hierarchy. This is the primary entry point for dynamic view
|
|
60
|
+
* insertion: build the subtree fully, call this, then attach the subtree to
|
|
61
|
+
* the live hierarchy.
|
|
62
|
+
*
|
|
63
|
+
* What it does:
|
|
64
|
+
* - builds/extends the dataflow graph for the subtree
|
|
65
|
+
* - runs flow optimization and syncs flow handles to canonical data sources
|
|
66
|
+
* - discovers the nearest data sources for views in the subtree
|
|
67
|
+
* - initializes dataflow nodes (initialize) for those sources
|
|
68
|
+
* - initializes mark encoders for unit views
|
|
69
|
+
* - queues graphics initialization (if a GL context exists)
|
|
70
|
+
* - wires collector observers so marks update on data arrival
|
|
71
|
+
*
|
|
72
|
+
* How to use it:
|
|
73
|
+
* - call after the subtree is fully constructed (post-order build)
|
|
74
|
+
* - do not attach the subtree to the live hierarchy until after this call
|
|
75
|
+
* - dispose the old subtree before replacing it to prevent observer leaks
|
|
76
|
+
* - follow up with finalizeSubtreeGraphics(...) once graphics promises resolve
|
|
77
|
+
* - reconfigure scales for the subtree when data loads complete
|
|
78
|
+
*
|
|
79
|
+
* Considerations:
|
|
80
|
+
* - this does not trigger data loading; callers decide when to load
|
|
81
|
+
* - data sources are derived by walking to the nearest ancestor source; nested
|
|
82
|
+
* sources should be treated as boundaries (do not walk past them)
|
|
83
|
+
* - only call updateGraphicsData when graphics are initialized or a GL context
|
|
84
|
+
* is available; headless/test contexts must avoid WebGL usage
|
|
85
|
+
* - loadViewSubtreeData emits a subtree-scoped "subtreeDataReady" broadcast
|
|
86
|
+
*
|
|
87
|
+
* TODO:
|
|
88
|
+
* - promote in-flight load caching to a persistent load-state per source
|
|
89
|
+
* - replace global dataLoaded usage with subtree-scoped readiness
|
|
90
|
+
* - integrate with async font readiness for text marks
|
|
91
|
+
* - unify observer wiring via a disposable registry across view types
|
|
92
|
+
*
|
|
93
|
+
* @param {import("../view/view.js").default} subtreeRoot
|
|
94
|
+
* @param {import("./dataFlow.js").default} flow
|
|
95
|
+
* @returns {{
|
|
96
|
+
* dataFlow: import("./dataFlow.js").default,
|
|
97
|
+
* unitViews: UnitView[],
|
|
98
|
+
* dataSources: Set<import("./sources/dataSource.js").default>,
|
|
99
|
+
* graphicsPromises: Promise<import("../marks/mark.js").default>[]
|
|
100
|
+
* }}
|
|
101
|
+
*/
|
|
102
|
+
export function initializeViewSubtree(subtreeRoot, flow) {
|
|
103
|
+
const dataFlow = buildDataFlow(subtreeRoot, flow);
|
|
104
|
+
const canonicalBySource = optimizeDataFlow(dataFlow);
|
|
105
|
+
syncFlowHandles(subtreeRoot, canonicalBySource);
|
|
106
|
+
const subtreeViews = subtreeRoot.getDescendants();
|
|
107
|
+
const dataSources = collectViewSubtreeDataSources(subtreeViews);
|
|
108
|
+
|
|
109
|
+
// Initialize flow nodes for the sources that belong to this subtree.
|
|
110
|
+
for (const dataSource of dataSources) {
|
|
111
|
+
dataSource.visit((node) => node.initialize());
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/** @type {UnitView[]} */
|
|
115
|
+
const unitViews = subtreeViews.filter((view) => view instanceof UnitView);
|
|
116
|
+
|
|
117
|
+
/** @type {Promise<import("../marks/mark.js").default>[]} */
|
|
118
|
+
const graphicsPromises = [];
|
|
119
|
+
|
|
120
|
+
const canInitializeGraphics = !!subtreeRoot.context.glHelper;
|
|
121
|
+
|
|
122
|
+
for (const view of unitViews) {
|
|
123
|
+
const mark = view.mark;
|
|
124
|
+
// Encoders can be initialized immediately; graphics need a GL context.
|
|
125
|
+
mark.initializeEncoders();
|
|
126
|
+
if (canInitializeGraphics) {
|
|
127
|
+
graphicsPromises.push(mark.initializeGraphics().then(() => mark));
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Wire collector completion to mark data/graphics updates.
|
|
131
|
+
const observer = (
|
|
132
|
+
/** @type {import("./collector.js").default} */ _collector
|
|
133
|
+
) => {
|
|
134
|
+
mark.initializeData(); // does faceting
|
|
135
|
+
if (canInitializeGraphics) {
|
|
136
|
+
try {
|
|
137
|
+
mark.updateGraphicsData();
|
|
138
|
+
} catch (e) {
|
|
139
|
+
e.view = view;
|
|
140
|
+
throw e;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
view.context.animator.requestRender();
|
|
144
|
+
};
|
|
145
|
+
view.registerDisposer(view.flowHandle.collector.observe(observer));
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
return {
|
|
149
|
+
dataFlow,
|
|
150
|
+
unitViews,
|
|
151
|
+
dataSources,
|
|
152
|
+
graphicsPromises,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Collects data sources needed to initialize all views in the subtree.
|
|
158
|
+
* This includes sources that are overridden deeper in the hierarchy.
|
|
159
|
+
*
|
|
160
|
+
* @param {import("../view/view.js").default | import("../view/view.js").default[]} subtreeRoot
|
|
161
|
+
* @returns {Set<import("./sources/dataSource.js").default>}
|
|
162
|
+
*/
|
|
163
|
+
export function collectViewSubtreeDataSources(subtreeRoot) {
|
|
164
|
+
const subtreeViews = Array.isArray(subtreeRoot)
|
|
165
|
+
? subtreeRoot
|
|
166
|
+
: subtreeRoot.getDescendants();
|
|
167
|
+
/** @type {Set<import("./sources/dataSource.js").default>} */
|
|
168
|
+
const dataSources = new Set();
|
|
169
|
+
for (const view of subtreeViews) {
|
|
170
|
+
// Walk up to the nearest view that owns a data source.
|
|
171
|
+
let current = view;
|
|
172
|
+
while (current && !current.flowHandle?.dataSource) {
|
|
173
|
+
current = current.dataParent;
|
|
174
|
+
}
|
|
175
|
+
if (current?.flowHandle?.dataSource) {
|
|
176
|
+
dataSources.add(current.flowHandle.dataSource);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return dataSources;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Collects the nearest data sources under a subtree root.
|
|
184
|
+
* These sources define data-ready boundaries for subtree-level loading.
|
|
185
|
+
*
|
|
186
|
+
* @param {import("../view/view.js").default} subtreeRoot
|
|
187
|
+
* @returns {Set<import("./sources/dataSource.js").default>}
|
|
188
|
+
*/
|
|
189
|
+
export function collectNearestViewSubtreeDataSources(subtreeRoot) {
|
|
190
|
+
/** @type {Set<import("./sources/dataSource.js").default>} */
|
|
191
|
+
const dataSources = new Set();
|
|
192
|
+
subtreeRoot.visit((view) => {
|
|
193
|
+
if (view.flowHandle?.dataSource) {
|
|
194
|
+
dataSources.add(view.flowHandle.dataSource);
|
|
195
|
+
return VISIT_SKIP;
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
return dataSources;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Loads the nearest data sources for a subtree.
|
|
203
|
+
* Use the returned promise as a subtree-level "data ready" signal.
|
|
204
|
+
*
|
|
205
|
+
* @param {import("../view/view.js").default} subtreeRoot
|
|
206
|
+
* @param {Set<import("./sources/dataSource.js").default>} [dataSources]
|
|
207
|
+
* @returns {Promise<void[]>}
|
|
208
|
+
*/
|
|
209
|
+
export function loadViewSubtreeData(
|
|
210
|
+
subtreeRoot,
|
|
211
|
+
dataSources = collectNearestViewSubtreeDataSources(subtreeRoot)
|
|
212
|
+
) {
|
|
213
|
+
return Promise.all(
|
|
214
|
+
Array.from(dataSources).map((dataSource) =>
|
|
215
|
+
loadDataSourceOnce(dataSource)
|
|
216
|
+
)
|
|
217
|
+
).then((results) => {
|
|
218
|
+
reconfigureScaleDomains(subtreeRoot);
|
|
219
|
+
broadcastSubtreeDataReady(subtreeRoot);
|
|
220
|
+
return results;
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Broadcasts a subtree-scoped data-ready event to views within the subtree.
|
|
226
|
+
*
|
|
227
|
+
* @param {import("../view/view.js").default} subtreeRoot
|
|
228
|
+
*/
|
|
229
|
+
function broadcastSubtreeDataReady(subtreeRoot) {
|
|
230
|
+
/** @type {import("../view/view.js").BroadcastMessage} */
|
|
231
|
+
const message = {
|
|
232
|
+
type: /** @type {import("../genomeSpy.js").BroadcastEventType} */ (
|
|
233
|
+
"subtreeDataReady"
|
|
234
|
+
),
|
|
235
|
+
payload: { subtreeRoot },
|
|
236
|
+
};
|
|
237
|
+
subtreeRoot.visit((view) => view.handleBroadcast(message));
|
|
238
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flowInit.test.d.ts","sourceRoot":"","sources":["../../../src/data/flowInit.test.js"],"names":[],"mappings":""}
|
|
@@ -12,16 +12,18 @@ export function removeRedundantCloneTransforms(node: import("./flowNode.js").def
|
|
|
12
12
|
export function removeRedundantCollectors(): void;
|
|
13
13
|
export function combineAndPullCollectorsUp(): void;
|
|
14
14
|
/**
|
|
15
|
-
* @param {import("./dataFlow.js").default
|
|
15
|
+
* @param {import("./dataFlow.js").default} dataFlow
|
|
16
|
+
* @returns {Map<import("./sources/dataSource.js").default, import("./sources/dataSource.js").default>}
|
|
16
17
|
*/
|
|
17
|
-
export function combineIdenticalDataSources(dataFlow: import("./dataFlow.js").default
|
|
18
|
+
export function combineIdenticalDataSources(dataFlow: import("./dataFlow.js").default): Map<import("./sources/dataSource.js").default, import("./sources/dataSource.js").default>;
|
|
18
19
|
/**
|
|
19
20
|
*
|
|
20
21
|
* @param {import("./flowNode.js").default} root
|
|
21
22
|
*/
|
|
22
23
|
export function optimizeFlowGraph(root: import("./flowNode.js").default): void;
|
|
23
24
|
/**
|
|
24
|
-
* @param {import("./dataFlow.js").default
|
|
25
|
+
* @param {import("./dataFlow.js").default} dataFlow
|
|
26
|
+
* @returns {Map<import("./sources/dataSource.js").default, import("./sources/dataSource.js").default>}
|
|
25
27
|
*/
|
|
26
|
-
export function optimizeDataFlow(dataFlow: import("./dataFlow.js").default
|
|
28
|
+
export function optimizeDataFlow(dataFlow: import("./dataFlow.js").default): Map<import("./sources/dataSource.js").default, import("./sources/dataSource.js").default>;
|
|
27
29
|
//# sourceMappingURL=flowOptimizer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flowOptimizer.d.ts","sourceRoot":"","sources":["../../../src/data/flowOptimizer.js"],"names":[],"mappings":"AAGA;;;GAGG;AACH,oCAHW,OAAO,eAAe,EAAE,OAAO,WAC/B,OAAO,eAAe,EAAE,OAAO,WAczC;AAED;;;;GAIG;AACH,qDAFW,OAAO,eAAe,EAAE,OAAO,iCAgCzC;AAED,kDAEC;AAED,mDAEC;AAmBD
|
|
1
|
+
{"version":3,"file":"flowOptimizer.d.ts","sourceRoot":"","sources":["../../../src/data/flowOptimizer.js"],"names":[],"mappings":"AAGA;;;GAGG;AACH,oCAHW,OAAO,eAAe,EAAE,OAAO,WAC/B,OAAO,eAAe,EAAE,OAAO,WAczC;AAED;;;;GAIG;AACH,qDAFW,OAAO,eAAe,EAAE,OAAO,iCAgCzC;AAED,kDAEC;AAED,mDAEC;AAmBD;;;GAGG;AACH,sDAHW,OAAO,eAAe,EAAE,OAAO,GAC7B,GAAG,CAAC,OAAO,yBAAyB,EAAE,OAAO,EAAE,OAAO,yBAAyB,EAAE,OAAO,CAAC,CAoCrG;AAED;;;GAGG;AACH,wCAFW,OAAO,eAAe,EAAE,OAAO,QASzC;AAED;;;GAGG;AACH,2CAHW,OAAO,eAAe,EAAE,OAAO,GAC7B,GAAG,CAAC,OAAO,yBAAyB,EAAE,OAAO,EAAE,OAAO,yBAAyB,EAAE,OAAO,CAAC,CAQrG"}
|
|
@@ -82,30 +82,43 @@ export function combineAndPullCollectorsUp() {
|
|
|
82
82
|
// --F--G
|
|
83
83
|
|
|
84
84
|
/**
|
|
85
|
-
* @param {import("./dataFlow.js").default
|
|
85
|
+
* @param {import("./dataFlow.js").default} dataFlow
|
|
86
|
+
* @returns {Map<import("./sources/dataSource.js").default, import("./sources/dataSource.js").default>}
|
|
86
87
|
*/
|
|
87
88
|
export function combineIdenticalDataSources(dataFlow) {
|
|
88
|
-
const
|
|
89
|
+
const dataSources = dataFlow.dataSources;
|
|
89
90
|
|
|
90
91
|
/** @type {Map<string, import("./sources/dataSource.js").default>} */
|
|
91
92
|
const sourcesByIdentifiers = new Map();
|
|
92
|
-
for (const
|
|
93
|
-
const ds = e[1];
|
|
93
|
+
for (const ds of dataSources) {
|
|
94
94
|
if (ds.identifier && !sourcesByIdentifiers.has(ds.identifier)) {
|
|
95
95
|
sourcesByIdentifiers.set(ds.identifier, ds);
|
|
96
96
|
}
|
|
97
97
|
}
|
|
98
98
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
99
|
+
/** @type {Set<import("./sources/dataSource.js").default>} */
|
|
100
|
+
const mergedSources = new Set();
|
|
101
|
+
/** @type {Map<import("./sources/dataSource.js").default, import("./sources/dataSource.js").default>} */
|
|
102
|
+
const canonicalBySource = new Map();
|
|
103
|
+
|
|
104
|
+
for (const dataSource of dataSources) {
|
|
105
|
+
if (dataSource.identifier) {
|
|
106
|
+
const target = sourcesByIdentifiers.get(dataSource.identifier);
|
|
107
|
+
if (target) {
|
|
108
|
+
if (target !== dataSource) {
|
|
109
|
+
target.adoptChildrenOf(dataSource);
|
|
110
|
+
}
|
|
111
|
+
mergedSources.add(target);
|
|
112
|
+
canonicalBySource.set(dataSource, target);
|
|
113
|
+
}
|
|
114
|
+
} else {
|
|
115
|
+
mergedSources.add(dataSource);
|
|
116
|
+
canonicalBySource.set(dataSource, dataSource);
|
|
106
117
|
}
|
|
107
|
-
dataFlow.addDataSource(dataSource, key);
|
|
108
118
|
}
|
|
119
|
+
|
|
120
|
+
dataFlow.replaceDataSources(mergedSources);
|
|
121
|
+
return canonicalBySource;
|
|
109
122
|
}
|
|
110
123
|
|
|
111
124
|
/**
|
|
@@ -122,11 +135,13 @@ export function optimizeFlowGraph(root) {
|
|
|
122
135
|
}
|
|
123
136
|
|
|
124
137
|
/**
|
|
125
|
-
* @param {import("./dataFlow.js").default
|
|
138
|
+
* @param {import("./dataFlow.js").default} dataFlow
|
|
139
|
+
* @returns {Map<import("./sources/dataSource.js").default, import("./sources/dataSource.js").default>}
|
|
126
140
|
*/
|
|
127
141
|
export function optimizeDataFlow(dataFlow) {
|
|
128
|
-
combineIdenticalDataSources(dataFlow);
|
|
142
|
+
const canonicalBySource = combineIdenticalDataSources(dataFlow);
|
|
129
143
|
for (const dataSource of dataFlow.dataSources) {
|
|
130
144
|
optimizeFlowGraph(dataSource);
|
|
131
145
|
}
|
|
146
|
+
return canonicalBySource;
|
|
132
147
|
}
|
|
@@ -50,7 +50,7 @@ export default class AxisTickSource extends SingleAxisLazySource {
|
|
|
50
50
|
// Note, although this function is async, it is not awaited. Data are updated
|
|
51
51
|
// synchronously to ensure that the new ticks are available before the next frame is drawn.
|
|
52
52
|
|
|
53
|
-
const scale = this.scaleResolution.
|
|
53
|
+
const scale = this.scaleResolution.getScale();
|
|
54
54
|
const axisLength = this.scaleResolution.getAxisLength();
|
|
55
55
|
const axisParams = this.params.axis;
|
|
56
56
|
|
|
@@ -43,7 +43,7 @@ export default class BamSource extends SingleAxisWindowedSource {
|
|
|
43
43
|
this.initializedPromise = new Promise((resolve) => {
|
|
44
44
|
Promise.all([
|
|
45
45
|
import("@gmod/bam"),
|
|
46
|
-
import("generic-
|
|
46
|
+
import("generic-filehandle2"),
|
|
47
47
|
]).then(([{ BamFile }, { RemoteFile }]) => {
|
|
48
48
|
const withBase = (/** @type {string} */ uri) =>
|
|
49
49
|
new RemoteFile(addBaseUrl(uri, this.view.getBaseUrl()));
|
|
@@ -63,7 +63,7 @@ export default class BigBedSource extends SingleAxisWindowedSource {
|
|
|
63
63
|
Promise.all([
|
|
64
64
|
import("@gmod/bed"),
|
|
65
65
|
import("@gmod/bbi"),
|
|
66
|
-
import("generic-
|
|
66
|
+
import("generic-filehandle2"),
|
|
67
67
|
]).then(([bed, { BigBed }, { RemoteFile }]) => {
|
|
68
68
|
const BED = bed.default;
|
|
69
69
|
|
|
@@ -62,7 +62,7 @@ export default class BigWigSource extends SingleAxisWindowedSource {
|
|
|
62
62
|
this.initializedPromise = new Promise((resolve, reject) => {
|
|
63
63
|
Promise.all([
|
|
64
64
|
import("@gmod/bbi"),
|
|
65
|
-
import("generic-
|
|
65
|
+
import("generic-filehandle2"),
|
|
66
66
|
]).then(([{ BigWig }, { RemoteFile }]) => {
|
|
67
67
|
this.#bbi = new BigWig({
|
|
68
68
|
filehandle: new RemoteFile(
|
|
@@ -1,12 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @extends {TabixSource<import("
|
|
2
|
+
* @extends {TabixSource<import("gff-nostream").GFF3Feature>}
|
|
3
3
|
*/
|
|
4
|
-
export default class Gff3Source extends TabixSource<import("
|
|
4
|
+
export default class Gff3Source extends TabixSource<import("gff-nostream").GFF3Feature> {
|
|
5
5
|
constructor(params: import("../../../spec/data.js").TabixData, view: import("../../../view/view.js").default);
|
|
6
|
-
/**
|
|
7
|
-
* @param {string[]} lines
|
|
8
|
-
*/
|
|
9
|
-
_parseFeatures(lines: string[]): any;
|
|
10
6
|
#private;
|
|
11
7
|
}
|
|
12
8
|
import TabixSource from "./tabixSource.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gff3Source.d.ts","sourceRoot":"","sources":["../../../../../src/data/sources/lazy/gff3Source.js"],"names":[],"mappings":"AAEA;;GAEG;AACH
|
|
1
|
+
{"version":3,"file":"gff3Source.d.ts","sourceRoot":"","sources":["../../../../../src/data/sources/lazy/gff3Source.js"],"names":[],"mappings":"AAEA;;GAEG;AACH;;;CAuBC;wBA5BuB,kBAAkB"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import TabixSource from "./tabixSource.js";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* @extends {TabixSource<import("
|
|
4
|
+
* @extends {TabixSource<import("gff-nostream").GFF3Feature>}
|
|
5
5
|
*/
|
|
6
6
|
export default class Gff3Source extends TabixSource {
|
|
7
|
-
/** @type {import("
|
|
7
|
+
/** @type {import("gff-nostream")} */
|
|
8
8
|
#gff;
|
|
9
9
|
|
|
10
10
|
get label() {
|
|
@@ -15,18 +15,14 @@ export default class Gff3Source extends TabixSource {
|
|
|
15
15
|
* @param {string} header
|
|
16
16
|
*/
|
|
17
17
|
async _handleHeader(header) {
|
|
18
|
-
this.#gff =
|
|
18
|
+
this.#gff = await import("gff-nostream");
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
/**
|
|
22
22
|
* @param {string[]} lines
|
|
23
23
|
*/
|
|
24
24
|
_parseFeatures(lines) {
|
|
25
|
-
|
|
26
|
-
// eslint-disable-next-line no-sync
|
|
27
|
-
const features = this.#gff?.parseStringSync(lines.join("\n"), {
|
|
28
|
-
parseSequences: false,
|
|
29
|
-
});
|
|
25
|
+
const features = this.#gff?.parseArraySync(lines);
|
|
30
26
|
|
|
31
27
|
return features;
|
|
32
28
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indexedFastaSource.d.ts","sourceRoot":"","sources":["../../../../../src/data/sources/lazy/indexedFastaSource.js"],"names":[],"mappings":"AAGA;IACI;;;OAGG;IACH,oBAHW,OAAO,uBAAuB,EAAE,gBAAgB,QAChD,OAAO,uBAAuB,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"indexedFastaSource.d.ts","sourceRoot":"","sources":["../../../../../src/data/sources/lazy/indexedFastaSource.js"],"names":[],"mappings":"AAGA;IACI;;;OAGG;IACH,oBAHW,OAAO,uBAAuB,EAAE,gBAAgB,QAChD,OAAO,uBAAuB,EAAE,OAAO,EAwCjD;IA1BG,yDAAgC;IAQhC,iCAiBE;IATM,iDAKE;CAwCjB;qCAhFoC,+BAA+B"}
|
|
@@ -28,16 +28,9 @@ export default class IndexedFastaSource extends SingleAxisWindowedSource {
|
|
|
28
28
|
|
|
29
29
|
this.initializedPromise = new Promise((resolve) => {
|
|
30
30
|
Promise.all([
|
|
31
|
-
import("buffer"),
|
|
32
31
|
import("@gmod/indexedfasta"),
|
|
33
|
-
import("generic-
|
|
34
|
-
]).then(([{
|
|
35
|
-
// Hack needed by @gmod/indexedfasta
|
|
36
|
-
// TODO: Submit a PR to @gmod/indexedfasta to make this unnecessary
|
|
37
|
-
if (typeof window !== "undefined") {
|
|
38
|
-
window.Buffer ??= Buffer;
|
|
39
|
-
}
|
|
40
|
-
|
|
32
|
+
import("generic-filehandle2"),
|
|
33
|
+
]).then(([{ IndexedFasta }, { RemoteFile }]) => {
|
|
41
34
|
const withBase = (/** @type {string} */ uri) =>
|
|
42
35
|
new RemoteFile(addBaseUrl(uri, this.view.getBaseUrl()));
|
|
43
36
|
|
|
@@ -68,15 +61,22 @@ export default class IndexedFastaSource extends SingleAxisWindowedSource {
|
|
|
68
61
|
.getSequence(d.chrom, d.startPos, d.endPos, {
|
|
69
62
|
signal,
|
|
70
63
|
})
|
|
71
|
-
.then((sequence) =>
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
64
|
+
.then((sequence) => {
|
|
65
|
+
if (sequence != undefined) {
|
|
66
|
+
return {
|
|
67
|
+
chrom: d.chrom,
|
|
68
|
+
start: d.startPos,
|
|
69
|
+
sequence,
|
|
70
|
+
};
|
|
71
|
+
} else {
|
|
72
|
+
console.log(
|
|
73
|
+
`No sequence found for interval ${d.chrom}:${d.startPos}-${d.endPos}`
|
|
74
|
+
);
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
77
|
+
})
|
|
76
78
|
);
|
|
77
79
|
|
|
78
|
-
|
|
79
|
-
this.publishData([features]);
|
|
80
|
-
}
|
|
80
|
+
this.publishData([features.filter((f) => f !== undefined)]);
|
|
81
81
|
}
|
|
82
82
|
}
|
|
@@ -16,7 +16,7 @@ export default class SingleAxisLazySource extends DataSource {
|
|
|
16
16
|
protected initializedPromise: Promise<void>;
|
|
17
17
|
/** @type {import("../../../spec/channel.js").PrimaryPositionalChannel} */
|
|
18
18
|
channel: import("../../../spec/channel.js").PrimaryPositionalChannel;
|
|
19
|
-
scaleResolution: import("../../../
|
|
19
|
+
scaleResolution: import("../../../scales/scaleResolution.js").default;
|
|
20
20
|
/**
|
|
21
21
|
* Convenience getter for genome.
|
|
22
22
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"singleAxisLazySource.d.ts","sourceRoot":"","sources":["../../../../../src/data/sources/lazy/singleAxisLazySource.js"],"names":[],"mappings":"AAIA;;;;GAIG;AACH;IAOI;;;OAGG;IACH,kBAHW,OAAO,uBAAuB,EAAE,OAAO,WACvC,OAAO,0BAA0B,EAAE,wBAAwB,EA+CrE;IAvDD;;;OAGG;IACH,4CAAuC;IAmBnC,2EAA2E;IAC3E,SADW,OAAO,0BAA0B,EAAE,wBAAwB,CAChD;IAEtB,
|
|
1
|
+
{"version":3,"file":"singleAxisLazySource.d.ts","sourceRoot":"","sources":["../../../../../src/data/sources/lazy/singleAxisLazySource.js"],"names":[],"mappings":"AAIA;;;;GAIG;AACH;IAOI;;;OAGG;IACH,kBAHW,OAAO,uBAAuB,EAAE,OAAO,WACvC,OAAO,0BAA0B,EAAE,wBAAwB,EA+CrE;IAvDD;;;OAGG;IACH,4CAAuC;IAmBnC,2EAA2E;IAC3E,SADW,OAAO,0BAA0B,EAAE,wBAAwB,CAChD;IAEtB,sEAA4D;IA+BhE;;;;OAIG;IACH,oEASC;IAED;;;;;;OAMG;IACH,wBAJW,MAAM,EAAE,iBACR,OAAO,yBAAyB,EAAE,gBAAgB,EAAE,QAK9D;IAED;;;;;OAKG;IACH,gCAGC;IAQD;;;;;;;;OAQG;IACH,8BAHW,OAAO,mBAAmB,EAAE,KAAK,EAAE,EAAE,QAgB/C;CACJ;uBArIsB,kBAAkB"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import UnitView from "../../../view/unitView.js";
|
|
2
2
|
import DataSource from "../dataSource.js";
|
|
3
|
-
import {
|
|
3
|
+
import { reconfigureScaleDomains } from "../../../scales/scaleResolution.js";
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Base class for data sources that listen a domain and propagate data lazily.
|
|
@@ -71,7 +71,14 @@ export default class SingleAxisLazySource extends DataSource {
|
|
|
71
71
|
* @protected
|
|
72
72
|
*/
|
|
73
73
|
get genome() {
|
|
74
|
-
|
|
74
|
+
const scale = this.scaleResolution.getScale();
|
|
75
|
+
if ("genome" in scale) {
|
|
76
|
+
const genome = scale.genome();
|
|
77
|
+
if (genome) {
|
|
78
|
+
return genome;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
throw new Error("No genome has been defined!");
|
|
75
82
|
}
|
|
76
83
|
|
|
77
84
|
/**
|
|
@@ -123,6 +130,6 @@ export default class SingleAxisLazySource extends DataSource {
|
|
|
123
130
|
|
|
124
131
|
this.complete();
|
|
125
132
|
|
|
126
|
-
|
|
133
|
+
reconfigureScaleDomains(this.view);
|
|
127
134
|
}
|
|
128
135
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"singleAxisWindowedSource.d.ts","sourceRoot":"","sources":["../../../../../src/data/sources/lazy/singleAxisWindowedSource.js"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH;IAWI;;;OAGG;IACH,kBAHU;QAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,4BAA4B,EAAE,OAAO,CAAA;KAAC,CAGvE;IAEP;;;OAGG;IACH,0CAHW,OAAO,uBAAuB,EAAE,aAAa,QAqBvD;IAED;;;;OAIG;IACH,wBAFW,MAAM,EAAE,QAqBlB;IAcD;;;;;OAKG;IACH,iCAHW,MAAM,EAAE,iBAKlB;IApBD;;OAEG;IACH,mCAOC;IAYD;;;;;;;;;OASG;IACH,4BAHa,CAAC,YAHH,MAAM,EAAE,UACR,CAAC,eAAe,EAAE,OAAO,mCAAmC,EAAE,0BAA0B,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,GAC3H,OAAO,CAAC,CAAC,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"singleAxisWindowedSource.d.ts","sourceRoot":"","sources":["../../../../../src/data/sources/lazy/singleAxisWindowedSource.js"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH;IAWI;;;OAGG;IACH,kBAHU;QAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,4BAA4B,EAAE,OAAO,CAAA;KAAC,CAGvE;IAEP;;;OAGG;IACH,0CAHW,OAAO,uBAAuB,EAAE,aAAa,QAqBvD;IAED;;;;OAIG;IACH,wBAFW,MAAM,EAAE,QAqBlB;IAcD;;;;;OAKG;IACH,iCAHW,MAAM,EAAE,iBAKlB;IApBD;;OAEG;IACH,mCAOC;IAYD;;;;;;;;;OASG;IACH,4BAHa,CAAC,YAHH,MAAM,EAAE,UACR,CAAC,eAAe,EAAE,OAAO,mCAAmC,EAAE,0BAA0B,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,GAC3H,OAAO,CAAC,CAAC,EAAE,CAAC,CAwCvB;IAED;;;;;;OAMG;IACH,yCALW,MAAM,EAAE,cACR,MAAM,YACN,CAAS,IAAQ,EAAR,MAAM,EAAE,KAAE,IAAI,QAyBjC;;CACJ;iCA/KgC,2BAA2B"}
|
|
@@ -125,7 +125,11 @@ export default class SingleAxisWindowedSource extends SingleAxisLazySource {
|
|
|
125
125
|
|
|
126
126
|
try {
|
|
127
127
|
const resultByChrom = await Promise.all(
|
|
128
|
-
discreteChromosomeIntervals.map(
|
|
128
|
+
discreteChromosomeIntervals.map(
|
|
129
|
+
async (
|
|
130
|
+
/** @type {import("@genome-spy/core/genome/genome.js").DiscreteChromosomeInterval} */ d
|
|
131
|
+
) => loader(d, signal)
|
|
132
|
+
)
|
|
129
133
|
);
|
|
130
134
|
|
|
131
135
|
if (!signal.aborted) {
|
|
@@ -37,7 +37,7 @@ export default class TabixSource extends SingleAxisWindowedSource {
|
|
|
37
37
|
this.initializedPromise = new Promise((resolve) => {
|
|
38
38
|
Promise.all([
|
|
39
39
|
import("@gmod/tabix"),
|
|
40
|
-
import("generic-
|
|
40
|
+
import("generic-filehandle2"),
|
|
41
41
|
]).then(async ([{ TabixIndexedFile }, { RemoteFile }]) => {
|
|
42
42
|
const withBase = (/** @type {string} */ uri) =>
|
|
43
43
|
new RemoteFile(addBaseUrl(uri, this.view.getBaseUrl()));
|
|
@@ -20,7 +20,7 @@ export default class FilterScoredLabelsTransform extends Transform {
|
|
|
20
20
|
padding: number;
|
|
21
21
|
/** @type {Map<any, ReservationMap>} */
|
|
22
22
|
reservationMaps: Map<any, ReservationMap>;
|
|
23
|
-
resolution: import("../../
|
|
23
|
+
resolution: import("../../scales/scaleResolution.js").default;
|
|
24
24
|
schedule: () => void;
|
|
25
25
|
_filterAndPropagate(): void;
|
|
26
26
|
groups: Map<any, any>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filterScoredLabels.d.ts","sourceRoot":"","sources":["../../../../src/data/transforms/filterScoredLabels.js"],"names":[],"mappings":"AAOA;IAKI;;;;OAIG;IACH,oBAHW,OAAO,yBAAyB,EAAE,wBAAwB,QAC1D,OAAO,oBAAoB,EAAE,OAAO,EA6C9C;IAxCG,mEAAoB;IAEpB,oBAAoB;IACpB,OADW,GAAG,EAAE,CACD;IAEf,mBAAoC;IAMpC,sDAA8C;IAC9C,oDAAgE;IAChE,wDAAuD;IACvD,sDAAmD;IACnD,mDAA6C;IAC7C,mDAA6C;IAC7C,gCAAgC;IAChC,cADW,CAAS,IAAG,EAAH,GAAG,KAAE,GAAG,CAGd;IACd,gBAAuC;IAEvC,uCAAuC;IACvC,iBADW,GAAG,CAAC,GAAG,EAAE,cAAc,CAAC,CACH;IAEhC,
|
|
1
|
+
{"version":3,"file":"filterScoredLabels.d.ts","sourceRoot":"","sources":["../../../../src/data/transforms/filterScoredLabels.js"],"names":[],"mappings":"AAOA;IAKI;;;;OAIG;IACH,oBAHW,OAAO,yBAAyB,EAAE,wBAAwB,QAC1D,OAAO,oBAAoB,EAAE,OAAO,EA6C9C;IAxCG,mEAAoB;IAEpB,oBAAoB;IACpB,OADW,GAAG,EAAE,CACD;IAEf,mBAAoC;IAMpC,sDAA8C;IAC9C,oDAAgE;IAChE,wDAAuD;IACvD,sDAAmD;IACnD,mDAA6C;IAC7C,mDAA6C;IAC7C,gCAAgC;IAChC,cADW,CAAS,IAAG,EAAH,GAAG,KAAE,GAAG,CAGd;IACd,gBAAuC;IAEvC,uCAAuC;IACvC,iBADW,GAAG,CAAC,GAAG,EAAE,cAAc,CAAC,CACH;IAEhC,8DAAuD;IAIvD,qBAAuE;IAyB3E,4BAsEC;IAKG,sBAAuB;CAU9B;sBA3JqB,gBAAgB;2BAFX,+BAA+B"}
|
|
@@ -76,7 +76,7 @@ export default class FilterScoredLabelsTransform extends Transform {
|
|
|
76
76
|
_filterAndPropagate() {
|
|
77
77
|
super.reset();
|
|
78
78
|
|
|
79
|
-
const scale = this.resolution.
|
|
79
|
+
const scale = this.resolution.getScale();
|
|
80
80
|
const rangeSpan = this.resolution.getAxisLength();
|
|
81
81
|
if (!rangeSpan) {
|
|
82
82
|
// The view size is not (yet) available
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"linearizeGenomicCoordinate.d.ts","sourceRoot":"","sources":["../../../../src/data/transforms/linearizeGenomicCoordinate.js"],"names":[],"mappings":"AAKA;IAKI;;;;OAIG;IACH,oBAHW,OAAO,yBAAyB,EAAE,gCAAgC,QAClE,OAAO,oBAAoB,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"linearizeGenomicCoordinate.d.ts","sourceRoot":"","sources":["../../../../src/data/transforms/linearizeGenomicCoordinate.js"],"names":[],"mappings":"AAKA;IAKI;;;;OAIG;IACH,oBAHW,OAAO,yBAAyB,EAAE,gCAAgC,QAClE,OAAO,oBAAoB,EAAE,OAAO,EAiG9C;IAxFG,2EAAoB;CAyF3B;sBA5GqB,gBAAgB"}
|
|
@@ -28,7 +28,8 @@ export default class LinearizeGenomicCoordinate extends Transform {
|
|
|
28
28
|
throw new Error("Invalid channel: " + channel);
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
-
const
|
|
31
|
+
const scale = view.getScaleResolution(channel).getScale();
|
|
32
|
+
const genome = "genome" in scale ? scale.genome() : undefined;
|
|
32
33
|
if (!genome) {
|
|
33
34
|
throw new Error(
|
|
34
35
|
"LinearizeGenomicCoordinate transform requires a locus scale!"
|
|
@@ -109,7 +109,7 @@ export function getPrimaryChannel(channel: import("../spec/channel.js").Channel)
|
|
|
109
109
|
*
|
|
110
110
|
* @param {import("../spec/channel.js").Channel} channel
|
|
111
111
|
*/
|
|
112
|
-
export function getChannelWithSecondarys(channel: import("../spec/channel.js").Channel): ("
|
|
112
|
+
export function getChannelWithSecondarys(channel: import("../spec/channel.js").Channel): import("../spec/channel.js").Channel[];
|
|
113
113
|
/**
|
|
114
114
|
* @param {import("../spec/channel.js").Channel} channel
|
|
115
115
|
*/
|