@genome-spy/core 0.36.1 → 0.37.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/README.md +1 -0
- package/dist/{index.es.js → bundle/index.es.js} +2253 -2115
- package/dist/{index.js → bundle/index.js} +180 -44
- package/dist/src/data/collector.d.ts +36 -0
- package/dist/src/data/collector.d.ts.map +1 -0
- package/dist/src/data/collector.js +184 -0
- package/dist/src/data/collector.test.js +84 -0
- package/dist/src/data/dataFlow.d.ts +65 -0
- package/dist/src/data/dataFlow.d.ts.map +1 -0
- package/dist/src/data/dataFlow.js +142 -0
- package/dist/src/data/dataFlow.test.js +5 -0
- package/dist/src/data/facetNode.d.ts +17 -0
- package/dist/src/data/facetNode.d.ts.map +1 -0
- package/dist/src/data/facetNode.js +17 -0
- package/dist/src/data/flow.test.js +72 -0
- package/dist/src/data/flowNode.d.ts +136 -0
- package/dist/src/data/flowNode.d.ts.map +1 -0
- package/dist/src/data/flowNode.js +286 -0
- package/dist/src/data/flowNode.test.js +50 -0
- package/dist/src/data/flowOptimizer.d.ts +27 -0
- package/dist/src/data/flowOptimizer.d.ts.map +1 -0
- package/dist/src/data/flowOptimizer.js +133 -0
- package/dist/src/data/flowOptimizer.test.js +193 -0
- package/dist/src/data/flowTestUtils.d.ts +30 -0
- package/dist/src/data/flowTestUtils.d.ts.map +1 -0
- package/dist/src/data/flowTestUtils.js +63 -0
- package/dist/src/data/formats/fasta.d.ts +20 -0
- package/dist/src/data/formats/fasta.d.ts.map +1 -0
- package/dist/src/data/formats/fasta.js +32 -0
- package/dist/src/data/formats/fasta.test.js +27 -0
- package/dist/src/data/sources/dataSource.d.ts +12 -0
- package/dist/src/data/sources/dataSource.d.ts.map +1 -0
- package/dist/src/data/sources/dataSource.js +25 -0
- package/dist/src/data/sources/dataSourceFactory.d.ts +16 -0
- package/dist/src/data/sources/dataSourceFactory.d.ts.map +1 -0
- package/dist/src/data/sources/dataSourceFactory.js +127 -0
- package/dist/src/data/sources/dataUtils.d.ts +50 -0
- package/dist/src/data/sources/dataUtils.d.ts.map +1 -0
- package/dist/src/data/sources/dataUtils.js +83 -0
- package/dist/src/data/sources/dynamic/README.md +3 -0
- package/dist/src/data/sources/dynamic/axisGenomeSource.d.ts +13 -0
- package/dist/src/data/sources/dynamic/axisGenomeSource.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/axisGenomeSource.js +19 -0
- package/dist/src/data/sources/dynamic/axisTickSource.d.ts +18 -0
- package/dist/src/data/sources/dynamic/axisTickSource.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/axisTickSource.js +73 -0
- package/dist/src/data/sources/dynamic/bamSource.d.ts +46 -0
- package/dist/src/data/sources/dynamic/bamSource.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/bamSource.js +115 -0
- package/dist/src/data/sources/dynamic/bigBedSource.d.ts +51 -0
- package/dist/src/data/sources/dynamic/bigBedSource.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/bigBedSource.js +128 -0
- package/dist/src/data/sources/dynamic/bigWigSource.d.ts +58 -0
- package/dist/src/data/sources/dynamic/bigWigSource.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/bigWigSource.js +166 -0
- package/dist/src/data/sources/dynamic/gff3Source.d.ts +8 -0
- package/dist/src/data/sources/dynamic/gff3Source.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/gff3Source.js +19 -0
- package/dist/src/data/sources/dynamic/indexedFastaSource.d.ts +30 -0
- package/dist/src/data/sources/dynamic/indexedFastaSource.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/indexedFastaSource.js +86 -0
- package/dist/src/data/sources/dynamic/singleAxisLazySource.d.ts +42 -0
- package/dist/src/data/sources/dynamic/singleAxisLazySource.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/singleAxisLazySource.js +129 -0
- package/dist/src/data/sources/dynamic/tabixSource.d.ts +54 -0
- package/dist/src/data/sources/dynamic/tabixSource.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/tabixSource.js +140 -0
- package/dist/src/data/sources/dynamic/windowedMixin.d.ts +32 -0
- package/dist/src/data/sources/dynamic/windowedMixin.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/windowedMixin.js +53 -0
- package/dist/src/data/sources/inlineSource.d.ts +16 -0
- package/dist/src/data/sources/inlineSource.d.ts.map +1 -0
- package/dist/src/data/sources/inlineSource.js +68 -0
- package/dist/src/data/sources/inlineSource.test.js +56 -0
- package/dist/src/data/sources/namedSource.d.ts +25 -0
- package/dist/src/data/sources/namedSource.d.ts.map +1 -0
- package/dist/src/data/sources/namedSource.js +80 -0
- package/dist/src/data/sources/sequenceSource.d.ts +17 -0
- package/dist/src/data/sources/sequenceSource.d.ts.map +1 -0
- package/dist/src/data/sources/sequenceSource.js +47 -0
- package/dist/src/data/sources/sequenceSource.test.js +46 -0
- package/dist/src/data/sources/urlSource.d.ts +16 -0
- package/dist/src/data/sources/urlSource.d.ts.map +1 -0
- package/dist/src/data/sources/urlSource.js +74 -0
- package/dist/src/data/transforms/aggregate.d.ts +18 -0
- package/dist/src/data/transforms/aggregate.d.ts.map +1 -0
- package/dist/src/data/transforms/aggregate.js +67 -0
- package/dist/src/data/transforms/clone.d.ts +15 -0
- package/dist/src/data/transforms/clone.d.ts.map +1 -0
- package/dist/src/data/transforms/clone.js +40 -0
- package/dist/src/data/transforms/clone.test.js +11 -0
- package/dist/src/data/transforms/coverage.d.ts +30 -0
- package/dist/src/data/transforms/coverage.d.ts.map +1 -0
- package/dist/src/data/transforms/coverage.js +183 -0
- package/dist/src/data/transforms/coverage.test.js +123 -0
- package/dist/src/data/transforms/filter.d.ts +12 -0
- package/dist/src/data/transforms/filter.d.ts.map +1 -0
- package/dist/src/data/transforms/filter.js +33 -0
- package/dist/src/data/transforms/filter.test.js +18 -0
- package/dist/src/data/transforms/filterScoredLabels.d.ts +29 -0
- package/dist/src/data/transforms/filterScoredLabels.d.ts.map +1 -0
- package/dist/src/data/transforms/filterScoredLabels.js +134 -0
- package/dist/src/data/transforms/flatten.d.ts +10 -0
- package/dist/src/data/transforms/flatten.d.ts.map +1 -0
- package/dist/src/data/transforms/flatten.js +68 -0
- package/dist/src/data/transforms/flatten.test.js +93 -0
- package/dist/src/data/transforms/flattenCompressedExons.d.ts +19 -0
- package/dist/src/data/transforms/flattenCompressedExons.d.ts.map +1 -0
- package/dist/src/data/transforms/flattenCompressedExons.js +53 -0
- package/dist/src/data/transforms/flattenDelimited.d.ts +10 -0
- package/dist/src/data/transforms/flattenDelimited.d.ts.map +1 -0
- package/dist/src/data/transforms/flattenDelimited.js +66 -0
- package/dist/src/data/transforms/flattenDelimited.test.js +87 -0
- package/dist/src/data/transforms/flattenSequence.d.ts +11 -0
- package/dist/src/data/transforms/flattenSequence.d.ts.map +1 -0
- package/dist/src/data/transforms/flattenSequence.js +35 -0
- package/dist/src/data/transforms/flattenSequence.test.js +34 -0
- package/dist/src/data/transforms/formula.d.ts +13 -0
- package/dist/src/data/transforms/formula.d.ts.map +1 -0
- package/dist/src/data/transforms/formula.js +35 -0
- package/dist/src/data/transforms/formula.test.js +19 -0
- package/dist/src/data/transforms/identifier.d.ts +40 -0
- package/dist/src/data/transforms/identifier.d.ts.map +1 -0
- package/dist/src/data/transforms/identifier.js +106 -0
- package/dist/src/data/transforms/identifier.test.js +83 -0
- package/dist/src/data/transforms/linearizeGenomicCoordinate.d.ts +10 -0
- package/dist/src/data/transforms/linearizeGenomicCoordinate.d.ts.map +1 -0
- package/dist/src/data/transforms/linearizeGenomicCoordinate.js +97 -0
- package/dist/src/data/transforms/measureText.d.ts +18 -0
- package/dist/src/data/transforms/measureText.d.ts.map +1 -0
- package/dist/src/data/transforms/measureText.js +42 -0
- package/dist/src/data/transforms/pileup.d.ts +10 -0
- package/dist/src/data/transforms/pileup.d.ts.map +1 -0
- package/dist/src/data/transforms/pileup.js +126 -0
- package/dist/src/data/transforms/pileup.test.js +70 -0
- package/dist/src/data/transforms/project.d.ts +13 -0
- package/dist/src/data/transforms/project.d.ts.map +1 -0
- package/dist/src/data/transforms/project.js +38 -0
- package/dist/src/data/transforms/project.test.js +32 -0
- package/dist/src/data/transforms/regexExtract.d.ts +13 -0
- package/dist/src/data/transforms/regexExtract.d.ts.map +1 -0
- package/dist/src/data/transforms/regexExtract.js +57 -0
- package/dist/src/data/transforms/regexExtract.test.js +67 -0
- package/dist/src/data/transforms/regexFold.d.ts +14 -0
- package/dist/src/data/transforms/regexFold.d.ts.map +1 -0
- package/dist/src/data/transforms/regexFold.js +139 -0
- package/dist/src/data/transforms/regexFold.test.js +160 -0
- package/dist/src/data/transforms/sample.d.ts +42 -0
- package/dist/src/data/transforms/sample.d.ts.map +1 -0
- package/dist/src/data/transforms/sample.js +99 -0
- package/dist/src/data/transforms/sample.test.js +38 -0
- package/dist/src/data/transforms/stack.d.ts +11 -0
- package/dist/src/data/transforms/stack.d.ts.map +1 -0
- package/dist/src/data/transforms/stack.js +134 -0
- package/dist/src/data/transforms/stack.test.js +91 -0
- package/dist/src/data/transforms/transformFactory.d.ts +12 -0
- package/dist/src/data/transforms/transformFactory.d.ts.map +1 -0
- package/dist/src/data/transforms/transformFactory.js +59 -0
- package/dist/src/encoder/accessor.d.ts +15 -0
- package/dist/src/encoder/accessor.d.ts.map +1 -0
- package/dist/src/encoder/accessor.js +76 -0
- package/dist/src/encoder/accessor.test.js +47 -0
- package/dist/src/encoder/encoder.d.ts +144 -0
- package/dist/src/encoder/encoder.d.ts.map +1 -0
- package/dist/src/encoder/encoder.js +400 -0
- package/dist/src/encoder/encoder.test.js +98 -0
- package/dist/src/fonts/Lato-Regular.json +1267 -0
- package/dist/src/fonts/Lato-Regular.png +0 -0
- package/dist/src/fonts/OFL.txt +93 -0
- package/dist/src/fonts/README.md +3 -0
- package/dist/src/fonts/bmFontManager.d.ts +182 -0
- package/dist/src/fonts/bmFontManager.d.ts.map +1 -0
- package/dist/src/fonts/bmFontManager.js +359 -0
- package/dist/src/fonts/bmFontMetrics.d.ts +45 -0
- package/dist/src/fonts/bmFontMetrics.d.ts.map +1 -0
- package/dist/src/fonts/bmFontMetrics.js +108 -0
- package/dist/src/genome/genome.d.ts +172 -0
- package/dist/src/genome/genome.d.ts.map +1 -0
- package/dist/src/genome/genome.js +379 -0
- package/dist/src/genome/genome.test.js +226 -0
- package/dist/src/genome/genomeStore.d.ts +20 -0
- package/dist/src/genome/genomeStore.d.ts.map +1 -0
- package/dist/src/genome/genomeStore.js +54 -0
- package/dist/src/genome/locusFormat.d.ts +14 -0
- package/dist/src/genome/locusFormat.d.ts.map +1 -0
- package/dist/src/genome/locusFormat.js +37 -0
- package/dist/src/genome/scaleIndex.d.ts +6 -0
- package/dist/src/genome/scaleIndex.d.ts.map +1 -0
- package/dist/src/genome/scaleIndex.js +165 -0
- package/dist/src/genome/scaleIndex.test.js +78 -0
- package/dist/src/genome/scaleLocus.d.ts +3 -0
- package/dist/src/genome/scaleLocus.d.ts.map +1 -0
- package/dist/src/genome/scaleLocus.js +101 -0
- package/dist/src/genome/scaleLocus.test.js +4 -0
- package/dist/src/genomeSpy.d.ts +141 -0
- package/dist/src/genomeSpy.d.ts.map +1 -0
- package/dist/src/genomeSpy.js +788 -0
- package/dist/src/gl/arrayBuilder.d.ts +71 -0
- package/dist/src/gl/arrayBuilder.d.ts.map +1 -0
- package/dist/src/gl/arrayBuilder.js +199 -0
- package/dist/src/gl/dataToVertices.d.ts +194 -0
- package/dist/src/gl/dataToVertices.d.ts.map +1 -0
- package/dist/src/gl/dataToVertices.js +639 -0
- package/dist/src/gl/includes/common.glsl.js +2 -0
- package/dist/src/gl/includes/picking.fragment.glsl.js +2 -0
- package/dist/src/gl/includes/picking.vertex.glsl.js +2 -0
- package/dist/src/gl/includes/sampleFacet.glsl.js +2 -0
- package/dist/src/gl/includes/scales.glsl.js +2 -0
- package/dist/src/gl/link.fragment.glsl.js +2 -0
- package/dist/src/gl/link.vertex.glsl.js +2 -0
- package/dist/src/gl/point.fragment.glsl.js +2 -0
- package/dist/src/gl/point.vertex.glsl.js +2 -0
- package/dist/src/gl/rect.fragment.glsl.js +2 -0
- package/dist/src/gl/rect.vertex.glsl.js +2 -0
- package/dist/src/gl/rule.fragment.glsl.js +2 -0
- package/dist/src/gl/rule.vertex.glsl.js +2 -0
- package/dist/src/gl/text.fragment.glsl.js +2 -0
- package/dist/src/gl/text.vertex.glsl.js +2 -0
- package/dist/src/gl/webGLHelper.d.ts +118 -0
- package/dist/src/gl/webGLHelper.d.ts.map +1 -0
- package/dist/src/gl/webGLHelper.js +513 -0
- package/dist/src/img/bowtie.svg +1 -0
- package/dist/src/img/genomespy-favicon.svg +34 -0
- package/dist/src/index.d.ts +15 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.html +11 -0
- package/dist/src/index.js +129 -0
- package/dist/src/marks/link.d.ts +11 -0
- package/dist/src/marks/link.d.ts.map +1 -0
- package/dist/src/marks/link.js +175 -0
- package/dist/src/marks/mark.d.ts +226 -0
- package/dist/src/marks/mark.d.ts.map +1 -0
- package/dist/src/marks/mark.js +1004 -0
- package/dist/src/marks/markUtils.d.ts +23 -0
- package/dist/src/marks/markUtils.d.ts.map +1 -0
- package/dist/src/marks/markUtils.js +125 -0
- package/dist/src/marks/pointMark.d.ts +11 -0
- package/dist/src/marks/pointMark.d.ts.map +1 -0
- package/dist/src/marks/pointMark.js +251 -0
- package/dist/src/marks/rectMark.d.ts +18 -0
- package/dist/src/marks/rectMark.d.ts.map +1 -0
- package/dist/src/marks/rectMark.js +255 -0
- package/dist/src/marks/rule.d.ts +6 -0
- package/dist/src/marks/rule.d.ts.map +1 -0
- package/dist/src/marks/rule.js +250 -0
- package/dist/src/marks/text.d.ts +13 -0
- package/dist/src/marks/text.d.ts.map +1 -0
- package/dist/src/marks/text.js +279 -0
- package/dist/src/scale/colorUtils.d.ts +34 -0
- package/dist/src/scale/colorUtils.d.ts.map +1 -0
- package/dist/src/scale/colorUtils.js +184 -0
- package/dist/src/scale/glslScaleGenerator.d.ts +45 -0
- package/dist/src/scale/glslScaleGenerator.d.ts.map +1 -0
- package/dist/src/scale/glslScaleGenerator.js +506 -0
- package/dist/src/scale/scale.d.ts +10 -0
- package/dist/src/scale/scale.d.ts.map +1 -0
- package/dist/src/scale/scale.js +456 -0
- package/dist/src/scale/scale.test.js +324 -0
- package/dist/src/scale/ticks.d.ts +47 -0
- package/dist/src/scale/ticks.d.ts.map +1 -0
- package/dist/src/scale/ticks.js +203 -0
- package/dist/src/scale/ticks.test.js +40 -0
- package/dist/src/singlePageApp.d.ts +2 -0
- package/dist/src/singlePageApp.d.ts.map +1 -0
- package/dist/src/singlePageApp.js +13 -0
- package/dist/src/spec/axis.d.ts +402 -0
- package/dist/src/spec/channel.d.ts +440 -0
- package/dist/src/spec/data.d.ts +370 -0
- package/dist/src/spec/font.d.ts +15 -0
- package/dist/src/spec/genome.d.ts +35 -0
- package/dist/src/spec/mark.d.ts +435 -0
- package/dist/src/spec/root.d.ts +22 -0
- package/dist/src/spec/sampleView.d.ts +185 -0
- package/dist/src/spec/scale.d.ts +273 -0
- package/dist/src/spec/title.d.ts +102 -0
- package/dist/src/spec/tooltip.d.ts +9 -0
- package/dist/src/spec/transform.d.ts +504 -0
- package/dist/src/spec/view.d.ts +214 -0
- package/dist/src/styles/genome-spy.css.d.ts +3 -0
- package/dist/src/styles/genome-spy.css.d.ts.map +1 -0
- package/dist/src/styles/genome-spy.css.js +114 -0
- package/dist/src/styles/genome-spy.scss +153 -0
- package/dist/src/tooltip/dataTooltipHandler.d.ts +2 -0
- package/dist/src/tooltip/dataTooltipHandler.d.ts.map +1 -0
- package/dist/src/tooltip/dataTooltipHandler.js +64 -0
- package/dist/src/tooltip/refseqGeneTooltipHandler.d.ts +2 -0
- package/dist/src/tooltip/refseqGeneTooltipHandler.d.ts.map +1 -0
- package/dist/src/tooltip/refseqGeneTooltipHandler.js +78 -0
- package/dist/src/tooltip/tooltipHandler.d.ts +9 -0
- package/dist/src/tooltip/tooltipHandler.d.ts.map +1 -0
- package/dist/src/tooltip/tooltipHandler.ts +12 -0
- package/dist/src/types/bmFont.d.ts +58 -0
- package/dist/src/types/embedApi.d.ts +67 -0
- package/dist/src/types/encoder.d.ts +84 -0
- package/dist/src/types/flowBatch.d.ts +40 -0
- package/dist/src/types/rendering.d.ts +65 -0
- package/dist/src/types/scaleResolutionApi.d.ts +40 -0
- package/dist/src/types/viewContext.d.ts +85 -0
- package/dist/src/utils/addBaseUrl.d.ts +6 -0
- package/dist/src/utils/addBaseUrl.d.ts.map +1 -0
- package/dist/src/utils/addBaseUrl.js +19 -0
- package/dist/src/utils/addBaseUrl.test.js +22 -0
- package/dist/src/utils/animator.d.ts +41 -0
- package/dist/src/utils/animator.d.ts.map +1 -0
- package/dist/src/utils/animator.js +83 -0
- package/dist/src/utils/arrayUtils.d.ts +34 -0
- package/dist/src/utils/arrayUtils.d.ts.map +1 -0
- package/dist/src/utils/arrayUtils.js +61 -0
- package/dist/src/utils/binnedIndex.d.ts +23 -0
- package/dist/src/utils/binnedIndex.d.ts.map +1 -0
- package/dist/src/utils/binnedIndex.js +167 -0
- package/dist/src/utils/binnedIndex.test.js +155 -0
- package/dist/src/utils/clamp.d.ts +7 -0
- package/dist/src/utils/clamp.d.ts.map +1 -0
- package/dist/src/utils/clamp.js +8 -0
- package/dist/src/utils/cloner.d.ts +16 -0
- package/dist/src/utils/cloner.d.ts.map +1 -0
- package/dist/src/utils/cloner.js +34 -0
- package/dist/src/utils/cloner.test.js +24 -0
- package/dist/src/utils/coalesce.d.ts +6 -0
- package/dist/src/utils/coalesce.d.ts.map +1 -0
- package/dist/src/utils/coalesce.js +11 -0
- package/dist/src/utils/coalesce.test.js +16 -0
- package/dist/src/utils/concatIterables.d.ts +8 -0
- package/dist/src/utils/concatIterables.d.ts.map +1 -0
- package/dist/src/utils/concatIterables.js +26 -0
- package/dist/src/utils/concatIterables.test.js +8 -0
- package/dist/src/utils/debounce.d.ts +8 -0
- package/dist/src/utils/debounce.d.ts.map +1 -0
- package/dist/src/utils/debounce.js +37 -0
- package/dist/src/utils/domainArray.d.ts +61 -0
- package/dist/src/utils/domainArray.d.ts.map +1 -0
- package/dist/src/utils/domainArray.js +216 -0
- package/dist/src/utils/domainArray.test.js +130 -0
- package/dist/src/utils/eerp.d.ts +12 -0
- package/dist/src/utils/eerp.d.ts.map +1 -0
- package/dist/src/utils/eerp.js +13 -0
- package/dist/src/utils/expression.d.ts +9 -0
- package/dist/src/utils/expression.d.ts.map +1 -0
- package/dist/src/utils/expression.js +32 -0
- package/dist/src/utils/field.d.ts +17 -0
- package/dist/src/utils/field.d.ts.map +1 -0
- package/dist/src/utils/field.js +28 -0
- package/dist/src/utils/formatObject.d.ts +7 -0
- package/dist/src/utils/formatObject.d.ts.map +1 -0
- package/dist/src/utils/formatObject.js +37 -0
- package/dist/src/utils/indexer.d.ts +16 -0
- package/dist/src/utils/indexer.d.ts.map +1 -0
- package/dist/src/utils/indexer.js +43 -0
- package/dist/src/utils/indexer.test.js +47 -0
- package/dist/src/utils/inertia.d.ts +42 -0
- package/dist/src/utils/inertia.d.ts.map +1 -0
- package/dist/src/utils/inertia.js +124 -0
- package/dist/src/utils/interactionEvent.d.ts +26 -0
- package/dist/src/utils/interactionEvent.d.ts.map +1 -0
- package/dist/src/utils/interactionEvent.js +33 -0
- package/dist/src/utils/iterateNestedMaps.d.ts +11 -0
- package/dist/src/utils/iterateNestedMaps.d.ts.map +1 -0
- package/dist/src/utils/iterateNestedMaps.js +21 -0
- package/dist/src/utils/iterateNestedMaps.test.js +33 -0
- package/dist/src/utils/kWayMerge.d.ts +9 -0
- package/dist/src/utils/kWayMerge.d.ts.map +1 -0
- package/dist/src/utils/kWayMerge.js +42 -0
- package/dist/src/utils/kWayMerge.test.js +26 -0
- package/dist/src/utils/layout/flexLayout.d.ts +182 -0
- package/dist/src/utils/layout/flexLayout.d.ts.map +1 -0
- package/dist/src/utils/layout/flexLayout.js +381 -0
- package/dist/src/utils/layout/flexLayout.test.js +323 -0
- package/dist/src/utils/layout/grid.d.ts +29 -0
- package/dist/src/utils/layout/grid.d.ts.map +1 -0
- package/dist/src/utils/layout/grid.js +95 -0
- package/dist/src/utils/layout/grid.test.js +71 -0
- package/dist/src/utils/layout/padding.d.ts +83 -0
- package/dist/src/utils/layout/padding.d.ts.map +1 -0
- package/dist/src/utils/layout/padding.js +155 -0
- package/dist/src/utils/layout/point.d.ts +16 -0
- package/dist/src/utils/layout/point.d.ts.map +1 -0
- package/dist/src/utils/layout/point.js +23 -0
- package/dist/src/utils/layout/rectangle.d.ts +142 -0
- package/dist/src/utils/layout/rectangle.d.ts.map +1 -0
- package/dist/src/utils/layout/rectangle.js +296 -0
- package/dist/src/utils/layout/rectangle.test.js +172 -0
- package/dist/src/utils/mergeObjects.d.ts +15 -0
- package/dist/src/utils/mergeObjects.d.ts.map +1 -0
- package/dist/src/utils/mergeObjects.js +99 -0
- package/dist/src/utils/mergeObjects.test.js +42 -0
- package/dist/src/utils/numberExtractor.d.ts +9 -0
- package/dist/src/utils/numberExtractor.d.ts.map +1 -0
- package/dist/src/utils/numberExtractor.js +24 -0
- package/dist/src/utils/numberExtractor.test.js +6 -0
- package/dist/src/utils/point.d.ts +9 -0
- package/dist/src/utils/point.d.ts.map +1 -0
- package/dist/src/utils/point.js +14 -0
- package/dist/src/utils/propertyCacher.d.ts +30 -0
- package/dist/src/utils/propertyCacher.d.ts.map +1 -0
- package/dist/src/utils/propertyCacher.js +70 -0
- package/dist/src/utils/propertyCacher.test.js +85 -0
- package/dist/src/utils/propertyCoalescer.d.ts +15 -0
- package/dist/src/utils/propertyCoalescer.d.ts.map +1 -0
- package/dist/src/utils/propertyCoalescer.js +42 -0
- package/dist/src/utils/propertyCoalescer.test.js +22 -0
- package/dist/src/utils/reservationMap.d.ts +42 -0
- package/dist/src/utils/reservationMap.d.ts.map +1 -0
- package/dist/src/utils/reservationMap.js +103 -0
- package/dist/src/utils/reservationMap.test.js +20 -0
- package/dist/src/utils/scaleNull.d.ts +13 -0
- package/dist/src/utils/scaleNull.d.ts.map +1 -0
- package/dist/src/utils/scaleNull.js +21 -0
- package/dist/src/utils/setOperations.d.ts +31 -0
- package/dist/src/utils/setOperations.d.ts.map +1 -0
- package/dist/src/utils/setOperations.js +75 -0
- package/dist/src/utils/smoothstep.d.ts +7 -0
- package/dist/src/utils/smoothstep.d.ts.map +1 -0
- package/dist/src/utils/smoothstep.js +10 -0
- package/dist/src/utils/throttle.d.ts +8 -0
- package/dist/src/utils/throttle.d.ts.map +1 -0
- package/dist/src/utils/throttle.js +34 -0
- package/dist/src/utils/topK.d.ts +22 -0
- package/dist/src/utils/topK.d.ts.map +1 -0
- package/dist/src/utils/topK.js +76 -0
- package/dist/src/utils/topK.test.js +64 -0
- package/dist/src/utils/transition.d.ts +44 -0
- package/dist/src/utils/transition.d.ts.map +1 -0
- package/dist/src/utils/transition.js +74 -0
- package/dist/src/utils/trees.d.ts +56 -0
- package/dist/src/utils/trees.d.ts.map +1 -0
- package/dist/src/utils/trees.js +92 -0
- package/dist/src/utils/trees.test.js +130 -0
- package/dist/src/utils/ui/tooltip.d.ts +50 -0
- package/dist/src/utils/ui/tooltip.d.ts.map +1 -0
- package/dist/src/utils/ui/tooltip.js +189 -0
- package/dist/src/utils/url.d.ts +9 -0
- package/dist/src/utils/url.d.ts.map +1 -0
- package/dist/src/utils/url.js +22 -0
- package/dist/src/utils/variableTools.d.ts +14 -0
- package/dist/src/utils/variableTools.d.ts.map +1 -0
- package/dist/src/utils/variableTools.js +24 -0
- package/dist/src/utils/variableTools.test.js +13 -0
- package/dist/src/view/axisGridView.d.ts +39 -0
- package/dist/src/view/axisGridView.d.ts.map +1 -0
- package/dist/src/view/axisGridView.js +246 -0
- package/dist/src/view/axisResolution.d.ts +24 -0
- package/dist/src/view/axisResolution.d.ts.map +1 -0
- package/dist/src/view/axisResolution.js +141 -0
- package/dist/src/view/axisResolution.test.js +201 -0
- package/dist/src/view/axisView.d.ts +49 -0
- package/dist/src/view/axisView.d.ts.map +1 -0
- package/dist/src/view/axisView.js +629 -0
- package/dist/src/view/concatView.d.ts +16 -0
- package/dist/src/view/concatView.d.ts.map +1 -0
- package/dist/src/view/concatView.js +84 -0
- package/dist/src/view/containerView.d.ts +43 -0
- package/dist/src/view/containerView.d.ts.map +1 -0
- package/dist/src/view/containerView.js +137 -0
- package/dist/src/view/facetView.d.ts +71 -0
- package/dist/src/view/facetView.d.ts.map +1 -0
- package/dist/src/view/facetView.js +492 -0
- package/dist/src/view/flowBuilder.d.ts +37 -0
- package/dist/src/view/flowBuilder.d.ts.map +1 -0
- package/dist/src/view/flowBuilder.js +383 -0
- package/dist/src/view/flowBuilder.test.js +125 -0
- package/dist/src/view/gridView.d.ts +111 -0
- package/dist/src/view/gridView.d.ts.map +1 -0
- package/dist/src/view/gridView.js +1086 -0
- package/dist/src/view/implicitRootView.d.ts +9 -0
- package/dist/src/view/implicitRootView.d.ts.map +1 -0
- package/dist/src/view/implicitRootView.js +23 -0
- package/dist/src/view/importView.d.ts +17 -0
- package/dist/src/view/importView.d.ts.map +1 -0
- package/dist/src/view/importView.js +22 -0
- package/dist/src/view/layerView.d.ts +25 -0
- package/dist/src/view/layerView.d.ts.map +1 -0
- package/dist/src/view/layerView.js +77 -0
- package/dist/src/view/renderingContext/bufferedViewRenderingContext.d.ts +30 -0
- package/dist/src/view/renderingContext/bufferedViewRenderingContext.d.ts.map +1 -0
- package/dist/src/view/renderingContext/bufferedViewRenderingContext.js +175 -0
- package/dist/src/view/renderingContext/compositeViewRenderingContext.d.ts +14 -0
- package/dist/src/view/renderingContext/compositeViewRenderingContext.d.ts.map +1 -0
- package/dist/src/view/renderingContext/compositeViewRenderingContext.js +51 -0
- package/dist/src/view/renderingContext/debuggingViewRenderingContext.d.ts +51 -0
- package/dist/src/view/renderingContext/debuggingViewRenderingContext.d.ts.map +1 -0
- package/dist/src/view/renderingContext/debuggingViewRenderingContext.js +94 -0
- package/dist/src/view/renderingContext/layoutRecorderViewRenderingContext.d.ts +60 -0
- package/dist/src/view/renderingContext/layoutRecorderViewRenderingContext.d.ts.map +1 -0
- package/dist/src/view/renderingContext/layoutRecorderViewRenderingContext.js +128 -0
- package/dist/src/view/renderingContext/simpleViewRenderingContext.d.ts +19 -0
- package/dist/src/view/renderingContext/simpleViewRenderingContext.d.ts.map +1 -0
- package/dist/src/view/renderingContext/simpleViewRenderingContext.js +64 -0
- package/dist/src/view/renderingContext/svgViewRenderingContext.d.ts +22 -0
- package/dist/src/view/renderingContext/svgViewRenderingContext.d.ts.map +1 -0
- package/dist/src/view/renderingContext/svgViewRenderingContext.js +125 -0
- package/dist/src/view/renderingContext/viewRenderingContext.d.ts +33 -0
- package/dist/src/view/renderingContext/viewRenderingContext.d.ts.map +1 -0
- package/dist/src/view/renderingContext/viewRenderingContext.js +41 -0
- package/dist/src/view/scaleResolution.d.ts +170 -0
- package/dist/src/view/scaleResolution.d.ts.map +1 -0
- package/dist/src/view/scaleResolution.js +874 -0
- package/dist/src/view/scaleResolution.test.js +658 -0
- package/dist/src/view/testUtils.d.ts +30 -0
- package/dist/src/view/testUtils.d.ts.map +1 -0
- package/dist/src/view/testUtils.js +101 -0
- package/dist/src/view/title.d.ts +6 -0
- package/dist/src/view/title.d.ts.map +1 -0
- package/dist/src/view/title.js +165 -0
- package/dist/src/view/unitView.d.ts +93 -0
- package/dist/src/view/unitView.d.ts.map +1 -0
- package/dist/src/view/unitView.js +345 -0
- package/dist/src/view/view.d.ts +291 -0
- package/dist/src/view/view.d.ts.map +1 -0
- package/dist/src/view/view.js +691 -0
- package/dist/src/view/view.test.js +214 -0
- package/dist/src/view/viewFactory.d.ts +76 -0
- package/dist/src/view/viewFactory.d.ts.map +1 -0
- package/dist/src/view/viewFactory.js +178 -0
- package/dist/src/view/viewFactory.test.js +17 -0
- package/dist/src/view/viewUtils.d.ts +90 -0
- package/dist/src/view/viewUtils.d.ts.map +1 -0
- package/dist/src/view/viewUtils.js +326 -0
- package/dist/src/view/zoom.d.ts +23 -0
- package/dist/src/view/zoom.d.ts.map +1 -0
- package/dist/src/view/zoom.js +89 -0
- package/package.json +17 -12
- package/dist/style.css +0 -1
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import createFunction from "../../utils/expression";
|
|
2
|
+
import FlowNode, { BEHAVIOR_MODIFIES } from "../flowNode";
|
|
3
|
+
|
|
4
|
+
export default class FormulaTransform extends FlowNode {
|
|
5
|
+
get behavior() {
|
|
6
|
+
return BEHAVIOR_MODIFIES;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
*
|
|
11
|
+
* @param {import("../../spec/transform").FormulaParams} params
|
|
12
|
+
*/
|
|
13
|
+
constructor(params) {
|
|
14
|
+
super();
|
|
15
|
+
this.params = params;
|
|
16
|
+
|
|
17
|
+
this.as = params.as;
|
|
18
|
+
|
|
19
|
+
/** @type {(datum: any) => any} */
|
|
20
|
+
this.fn = undefined;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
initialize() {
|
|
24
|
+
this.fn = createFunction(this.params.expr, this.getGlobalObject());
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
*
|
|
29
|
+
* @param {import("../flowNode").Datum} datum
|
|
30
|
+
*/
|
|
31
|
+
handle(datum) {
|
|
32
|
+
datum[this.as] = this.fn(datum);
|
|
33
|
+
this._propagate(datum);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { expect, test } from "vitest";
|
|
2
|
+
import { processData } from "../flowTestUtils";
|
|
3
|
+
import FormulaTransform from "./formula";
|
|
4
|
+
|
|
5
|
+
test("FormulaTransform", () => {
|
|
6
|
+
const data = [{ a: 2 }, { a: 3 }];
|
|
7
|
+
|
|
8
|
+
const t = new FormulaTransform({
|
|
9
|
+
type: "formula",
|
|
10
|
+
expr: "datum.a * 2",
|
|
11
|
+
as: "b",
|
|
12
|
+
});
|
|
13
|
+
t.initialize();
|
|
14
|
+
|
|
15
|
+
expect(processData(t, data)).toEqual([
|
|
16
|
+
{ a: 2, b: 4 },
|
|
17
|
+
{ a: 3, b: 6 },
|
|
18
|
+
]);
|
|
19
|
+
});
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export const DEFAULT_AS: "_uniqueId";
|
|
2
|
+
export const BLOCK_SIZE: 10000;
|
|
3
|
+
/**
|
|
4
|
+
* Assigns unique identifiers for tuples that pass through this transform.
|
|
5
|
+
*
|
|
6
|
+
* The identifiers are reserved in equally sized blocks, allowing for
|
|
7
|
+
* quick lookup of the IdentifierTransform instance that assigned the id.
|
|
8
|
+
* This is mainly used for creating ids that can be used for picking, i.e.,
|
|
9
|
+
* selecting rendered data items by hovering or clicking.
|
|
10
|
+
*/
|
|
11
|
+
export default class IdentifierTransform extends FlowNode {
|
|
12
|
+
/**
|
|
13
|
+
*
|
|
14
|
+
* @param {import("../../spec/transform").IdentifierParams} params
|
|
15
|
+
*/
|
|
16
|
+
constructor(params: import("../../spec/transform").IdentifierParams);
|
|
17
|
+
params: import("../../spec/transform").IdentifierParams;
|
|
18
|
+
as: string;
|
|
19
|
+
/**
|
|
20
|
+
* The block indexes reserved by this transform instance.
|
|
21
|
+
* @type {number[]}
|
|
22
|
+
*/
|
|
23
|
+
_blocks: number[];
|
|
24
|
+
/**
|
|
25
|
+
* The number of blocks used
|
|
26
|
+
*/
|
|
27
|
+
_usedBlocks: number;
|
|
28
|
+
/**
|
|
29
|
+
* The next advancement allocates the initial block for this instance
|
|
30
|
+
*/
|
|
31
|
+
_id: number;
|
|
32
|
+
/**
|
|
33
|
+
* @returns {number}
|
|
34
|
+
*/
|
|
35
|
+
_nextId(): number;
|
|
36
|
+
_getBlock(): number;
|
|
37
|
+
_reserveBlock(): number;
|
|
38
|
+
}
|
|
39
|
+
import FlowNode from "../flowNode";
|
|
40
|
+
//# sourceMappingURL=identifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identifier.d.ts","sourceRoot":"","sources":["../../../../src/data/transforms/identifier.js"],"names":[],"mappings":"AAEA,qCAAsC;AAEtC,+BAAgC;AAehC;;;;;;;GAOG;AACH;IAKI;;;OAGG;IACH,oBAFW,OAAO,sBAAsB,EAAE,gBAAgB,EAuBzD;IAnBG,wDAAoB;IAEpB,WAAiC;IAEjC;;;OAGG;IACH,SAFU,MAAM,EAAE,CAED;IAEjB;;OAEG;IACH,oBAAoB;IAEpB;;OAEG;IACH,YAAa;IAuBjB;;OAEG;IACH,WAFa,MAAM,CAOlB;IAED,oBAMC;IAED,wBAOC;CACJ;qBAzG2C,aAAa"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import FlowNode, { BEHAVIOR_MODIFIES } from "../flowNode";
|
|
2
|
+
|
|
3
|
+
export const DEFAULT_AS = "_uniqueId";
|
|
4
|
+
|
|
5
|
+
export const BLOCK_SIZE = 10000;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* TODO: The reservation map should be bound to GenomeSpy instances.
|
|
9
|
+
* Because it's now global, there's a higher risk that we run out of ids.
|
|
10
|
+
*
|
|
11
|
+
* TODO: Identifier transforms should be removed from the reservation map
|
|
12
|
+
* when a transform is removed from the flow.
|
|
13
|
+
*
|
|
14
|
+
* The first block is reserved for "none".
|
|
15
|
+
*
|
|
16
|
+
* @type {IdentifierTransform[]}
|
|
17
|
+
*/
|
|
18
|
+
const reservationMap = [null];
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Assigns unique identifiers for tuples that pass through this transform.
|
|
22
|
+
*
|
|
23
|
+
* The identifiers are reserved in equally sized blocks, allowing for
|
|
24
|
+
* quick lookup of the IdentifierTransform instance that assigned the id.
|
|
25
|
+
* This is mainly used for creating ids that can be used for picking, i.e.,
|
|
26
|
+
* selecting rendered data items by hovering or clicking.
|
|
27
|
+
*/
|
|
28
|
+
export default class IdentifierTransform extends FlowNode {
|
|
29
|
+
get behavior() {
|
|
30
|
+
return BEHAVIOR_MODIFIES;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
*
|
|
35
|
+
* @param {import("../../spec/transform").IdentifierParams} params
|
|
36
|
+
*/
|
|
37
|
+
constructor(params) {
|
|
38
|
+
super();
|
|
39
|
+
this.params = params;
|
|
40
|
+
|
|
41
|
+
this.as = params.as ?? DEFAULT_AS;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* The block indexes reserved by this transform instance.
|
|
45
|
+
* @type {number[]}
|
|
46
|
+
*/
|
|
47
|
+
this._blocks = [];
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* The number of blocks used
|
|
51
|
+
*/
|
|
52
|
+
this._usedBlocks = 0;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* The next advancement allocates the initial block for this instance
|
|
56
|
+
*/
|
|
57
|
+
this._id = -1;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
initialize() {
|
|
61
|
+
//
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
reset() {
|
|
65
|
+
super.reset();
|
|
66
|
+
|
|
67
|
+
this._usedBlocks = 0;
|
|
68
|
+
this._id = -1;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
*
|
|
73
|
+
* @param {import("../flowNode").Datum} datum
|
|
74
|
+
*/
|
|
75
|
+
handle(datum) {
|
|
76
|
+
datum[this.as] = this._nextId();
|
|
77
|
+
this._propagate(datum);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* @returns {number}
|
|
82
|
+
*/
|
|
83
|
+
_nextId() {
|
|
84
|
+
if (++this._id % BLOCK_SIZE == 0) {
|
|
85
|
+
this._id = this._getBlock() * BLOCK_SIZE;
|
|
86
|
+
}
|
|
87
|
+
return this._id;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
_getBlock() {
|
|
91
|
+
if (this._usedBlocks < this._blocks.length) {
|
|
92
|
+
return this._blocks[this._usedBlocks++];
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return this._reserveBlock();
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
_reserveBlock() {
|
|
99
|
+
const blockId = reservationMap.length;
|
|
100
|
+
reservationMap[blockId] = this;
|
|
101
|
+
this._blocks.push(blockId);
|
|
102
|
+
this._usedBlocks++;
|
|
103
|
+
|
|
104
|
+
return blockId;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { expect, test } from "vitest";
|
|
2
|
+
import { range } from "d3-array";
|
|
3
|
+
import { processData } from "../flowTestUtils";
|
|
4
|
+
import IdentifierTransform, { BLOCK_SIZE, DEFAULT_AS } from "./identifier";
|
|
5
|
+
|
|
6
|
+
test("An IdentifierTransform adds identifiers correctly", () => {
|
|
7
|
+
const data = range(BLOCK_SIZE * 2).map((x) => ({ data: x }));
|
|
8
|
+
|
|
9
|
+
const identifiedData = processData(
|
|
10
|
+
new IdentifierTransform({ type: "identifier" }),
|
|
11
|
+
data
|
|
12
|
+
);
|
|
13
|
+
|
|
14
|
+
// The fist block is skipped
|
|
15
|
+
const firstId = BLOCK_SIZE;
|
|
16
|
+
|
|
17
|
+
expect(identifiedData[0]).toEqual({ data: 0, [DEFAULT_AS]: firstId });
|
|
18
|
+
expect(identifiedData[1]).toEqual({ data: 1, [DEFAULT_AS]: firstId + 1 });
|
|
19
|
+
expect(identifiedData[BLOCK_SIZE]).toEqual({
|
|
20
|
+
data: BLOCK_SIZE,
|
|
21
|
+
[DEFAULT_AS]: firstId + BLOCK_SIZE,
|
|
22
|
+
});
|
|
23
|
+
expect(identifiedData[BLOCK_SIZE + 1]).toEqual({
|
|
24
|
+
data: BLOCK_SIZE + 1,
|
|
25
|
+
[DEFAULT_AS]: firstId + BLOCK_SIZE + 1,
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
test("Another transform instance adds identifiers correctly", () => {
|
|
30
|
+
const data = range(BLOCK_SIZE * 2).map((x) => ({ data: x }));
|
|
31
|
+
// Another instance
|
|
32
|
+
const identifiedData = processData(
|
|
33
|
+
new IdentifierTransform({ type: "identifier" }),
|
|
34
|
+
data
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
// The fist block was skipped and the previous test case consumed two blocks
|
|
38
|
+
const firstId = BLOCK_SIZE * 3;
|
|
39
|
+
|
|
40
|
+
expect(identifiedData[0]).toEqual({ data: 0, [DEFAULT_AS]: firstId });
|
|
41
|
+
expect(identifiedData[1]).toEqual({ data: 1, [DEFAULT_AS]: firstId + 1 });
|
|
42
|
+
expect(identifiedData[BLOCK_SIZE]).toEqual({
|
|
43
|
+
data: BLOCK_SIZE,
|
|
44
|
+
[DEFAULT_AS]: firstId + BLOCK_SIZE,
|
|
45
|
+
});
|
|
46
|
+
expect(identifiedData[BLOCK_SIZE + 1]).toEqual({
|
|
47
|
+
data: BLOCK_SIZE + 1,
|
|
48
|
+
[DEFAULT_AS]: firstId + BLOCK_SIZE + 1,
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
test("IdentifierTransform recycles allocated blocks", () => {
|
|
53
|
+
let data = range(BLOCK_SIZE * 2).map((x) => ({ data: x }));
|
|
54
|
+
|
|
55
|
+
const transform = new IdentifierTransform({ type: "identifier" });
|
|
56
|
+
let identifiedData = processData(transform, data);
|
|
57
|
+
|
|
58
|
+
let firstId = BLOCK_SIZE * 5;
|
|
59
|
+
|
|
60
|
+
expect(identifiedData[0]).toEqual({ data: 0, [DEFAULT_AS]: firstId });
|
|
61
|
+
expect(identifiedData[BLOCK_SIZE]).toEqual({
|
|
62
|
+
data: BLOCK_SIZE,
|
|
63
|
+
[DEFAULT_AS]: firstId + BLOCK_SIZE,
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
data = range(BLOCK_SIZE * 3).map((x) => ({ data: x }));
|
|
67
|
+
|
|
68
|
+
// Resetting the transform. It should now reuse the allocated blocks.
|
|
69
|
+
transform.reset();
|
|
70
|
+
identifiedData = processData(transform, data);
|
|
71
|
+
|
|
72
|
+
expect(identifiedData[0]).toEqual({ data: 0, [DEFAULT_AS]: firstId });
|
|
73
|
+
expect(identifiedData[BLOCK_SIZE]).toEqual({
|
|
74
|
+
data: BLOCK_SIZE,
|
|
75
|
+
[DEFAULT_AS]: firstId + BLOCK_SIZE,
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
// ... and reserve one extra
|
|
79
|
+
expect(identifiedData[BLOCK_SIZE * 2]).toEqual({
|
|
80
|
+
data: BLOCK_SIZE * 2,
|
|
81
|
+
[DEFAULT_AS]: firstId + BLOCK_SIZE * 2,
|
|
82
|
+
});
|
|
83
|
+
});
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export default class LinearizeGenomicCoordinate extends FlowNode {
|
|
2
|
+
/**
|
|
3
|
+
*
|
|
4
|
+
* @param {import("../../spec/transform").LinearizeGenomicCoordinateParams} params
|
|
5
|
+
* @param {import("../../view/view").default} view
|
|
6
|
+
*/
|
|
7
|
+
constructor(params: import("../../spec/transform").LinearizeGenomicCoordinateParams, view: import("../../view/view").default);
|
|
8
|
+
}
|
|
9
|
+
import FlowNode from "../flowNode";
|
|
10
|
+
//# sourceMappingURL=linearizeGenomicCoordinate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linearizeGenomicCoordinate.d.ts","sourceRoot":"","sources":["../../../../src/data/transforms/linearizeGenomicCoordinate.js"],"names":[],"mappings":"AAIA;IAKI;;;;OAIG;IACH,oBAHW,OAAO,sBAAsB,EAAE,gCAAgC,QAC/D,OAAO,iBAAiB,EAAE,OAAO,EAmF3C;CACJ;qBA9F2C,aAAa"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { asArray } from "../../utils/arrayUtils";
|
|
2
|
+
import { field } from "../../utils/field";
|
|
3
|
+
import FlowNode, { BEHAVIOR_MODIFIES } from "../flowNode";
|
|
4
|
+
|
|
5
|
+
export default class LinearizeGenomicCoordinate extends FlowNode {
|
|
6
|
+
get behavior() {
|
|
7
|
+
return BEHAVIOR_MODIFIES;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
*
|
|
12
|
+
* @param {import("../../spec/transform").LinearizeGenomicCoordinateParams} params
|
|
13
|
+
* @param {import("../../view/view").default} view
|
|
14
|
+
*/
|
|
15
|
+
constructor(params, view) {
|
|
16
|
+
super();
|
|
17
|
+
|
|
18
|
+
const channel = params.channel ?? "x";
|
|
19
|
+
|
|
20
|
+
if (!["x", "y"].includes(channel)) {
|
|
21
|
+
throw new Error("Invalid channel: " + channel);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const genome = view.getScaleResolution(channel).getGenome();
|
|
25
|
+
if (!genome) {
|
|
26
|
+
throw new Error(
|
|
27
|
+
"LinearizeGenomicCoordinate transform requires a locus scale!"
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const chromAccessor = field(params.chrom);
|
|
32
|
+
const posAccessors = asArray(params.pos).map((pos) => field(pos));
|
|
33
|
+
const as = asArray(params.as);
|
|
34
|
+
|
|
35
|
+
if (posAccessors.length != as.length) {
|
|
36
|
+
throw new Error(
|
|
37
|
+
'The number of "pos" and "as" elements must be equal!'
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const offsetParam = asArray(params.offset);
|
|
42
|
+
|
|
43
|
+
/** @type {number[]} */
|
|
44
|
+
let posOffsets;
|
|
45
|
+
|
|
46
|
+
if (offsetParam.length == 0) {
|
|
47
|
+
posOffsets = new Array(posAccessors.length).fill(0);
|
|
48
|
+
} else if (offsetParam.length == 1) {
|
|
49
|
+
posOffsets = new Array(posAccessors.length).fill(offsetParam[0]);
|
|
50
|
+
} else if (offsetParam.length == posAccessors.length) {
|
|
51
|
+
posOffsets = offsetParam;
|
|
52
|
+
} else {
|
|
53
|
+
throw new Error(
|
|
54
|
+
`Invalid "offset" parameter: ${JSON.stringify(params.offset)}!`
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const setter = new Function(
|
|
59
|
+
"datum",
|
|
60
|
+
"chromOffset",
|
|
61
|
+
"posAccessors",
|
|
62
|
+
as
|
|
63
|
+
.map(
|
|
64
|
+
(a, i) =>
|
|
65
|
+
`datum[${JSON.stringify(
|
|
66
|
+
a
|
|
67
|
+
)}] = chromOffset + +posAccessors[${i}](datum) - ${
|
|
68
|
+
posOffsets[i]
|
|
69
|
+
};`
|
|
70
|
+
)
|
|
71
|
+
.join("\n")
|
|
72
|
+
);
|
|
73
|
+
|
|
74
|
+
/** @type {any} */
|
|
75
|
+
let lastChrom;
|
|
76
|
+
let chromOffset = 0;
|
|
77
|
+
|
|
78
|
+
/** @param {string | number} chrom */
|
|
79
|
+
const getChromOffset = (chrom) => {
|
|
80
|
+
if (chrom !== lastChrom) {
|
|
81
|
+
chromOffset = genome.cumulativeChromPositions.get(chrom);
|
|
82
|
+
if (chromOffset === undefined) {
|
|
83
|
+
throw new Error("Unknown chromosome/contig: " + chrom);
|
|
84
|
+
}
|
|
85
|
+
lastChrom = chrom;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return chromOffset;
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
/** @param {Record<string, any>} datum */
|
|
92
|
+
this.handle = (datum) => {
|
|
93
|
+
setter(datum, getChromOffset(chromAccessor(datum)), posAccessors);
|
|
94
|
+
this._propagate(datum);
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Measures text length. This is mainly intended for reading-direction arrows
|
|
3
|
+
* in gene annotations.
|
|
4
|
+
*/
|
|
5
|
+
export default class MeasureTextTransform extends FlowNode {
|
|
6
|
+
/**
|
|
7
|
+
*
|
|
8
|
+
* @param {import("../../spec/transform").MeasureTextParams} config
|
|
9
|
+
*/
|
|
10
|
+
constructor(config: import("../../spec/transform").MeasureTextParams);
|
|
11
|
+
/**
|
|
12
|
+
*
|
|
13
|
+
* @param {any} datum
|
|
14
|
+
*/
|
|
15
|
+
handle: (datum: any) => void;
|
|
16
|
+
}
|
|
17
|
+
import FlowNode from "../flowNode";
|
|
18
|
+
//# sourceMappingURL=measureText.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"measureText.d.ts","sourceRoot":"","sources":["../../../../src/data/transforms/measureText.js"],"names":[],"mappings":"AAKA;;;GAGG;AACH;IAKI;;;OAGG;IACH,oBAFW,OAAO,sBAAsB,EAAE,iBAAiB,EAwB1D;IAbG;;;OAGG;IACH,gBAFW,GAAG,UAUb;CAER;qBAzC2C,aAAa"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import FlowNode, { BEHAVIOR_MODIFIES } from "../flowNode";
|
|
2
|
+
import fontMetadata from "../../fonts/Lato-Regular.json";
|
|
3
|
+
import getMetrics from "../../fonts/bmFontMetrics";
|
|
4
|
+
import { field } from "../../utils/field";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Measures text length. This is mainly intended for reading-direction arrows
|
|
8
|
+
* in gene annotations.
|
|
9
|
+
*/
|
|
10
|
+
export default class MeasureTextTransform extends FlowNode {
|
|
11
|
+
get behavior() {
|
|
12
|
+
return BEHAVIOR_MODIFIES;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
*
|
|
17
|
+
* @param {import("../../spec/transform").MeasureTextParams} config
|
|
18
|
+
*/
|
|
19
|
+
constructor(config) {
|
|
20
|
+
super();
|
|
21
|
+
|
|
22
|
+
const metrics = getMetrics(fontMetadata);
|
|
23
|
+
const accessor = field(config.field);
|
|
24
|
+
const as = config.as;
|
|
25
|
+
// TODO: Support custom fonts.
|
|
26
|
+
const size = config.fontSize;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
*
|
|
30
|
+
* @param {any} datum
|
|
31
|
+
*/
|
|
32
|
+
this.handle = (datum) => {
|
|
33
|
+
const text = accessor(datum);
|
|
34
|
+
if (text !== undefined) {
|
|
35
|
+
datum[as] = metrics.measureWidth(text, size);
|
|
36
|
+
} else {
|
|
37
|
+
datum[as] = 0;
|
|
38
|
+
}
|
|
39
|
+
this._propagate(datum);
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export default class PileupTransform extends FlowNode {
|
|
2
|
+
/**
|
|
3
|
+
*
|
|
4
|
+
* @param {import("../../spec/transform").PileupParams} params
|
|
5
|
+
*/
|
|
6
|
+
constructor(params: import("../../spec/transform").PileupParams);
|
|
7
|
+
params: import("../../spec/transform").PileupParams;
|
|
8
|
+
}
|
|
9
|
+
import FlowNode from "../flowNode";
|
|
10
|
+
//# sourceMappingURL=pileup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pileup.d.ts","sourceRoot":"","sources":["../../../../src/data/transforms/pileup.js"],"names":[],"mappings":"AAQA;IAKI;;;OAGG;IACH,oBAFW,OAAO,sBAAsB,EAAE,YAAY,EAMrD;IADG,oDAAoB;CAyG3B;qBAzH2C,aAAa"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/* eslint-disable no-unmodified-loop-condition */
|
|
2
|
+
import FlatQueue from "flatqueue";
|
|
3
|
+
import { isNumber } from "vega-util";
|
|
4
|
+
import { field } from "../../utils/field";
|
|
5
|
+
import FlowNode, { BEHAVIOR_MODIFIES } from "../flowNode";
|
|
6
|
+
|
|
7
|
+
const maxDepth = 65536;
|
|
8
|
+
|
|
9
|
+
export default class PileupTransform extends FlowNode {
|
|
10
|
+
get behavior() {
|
|
11
|
+
return BEHAVIOR_MODIFIES;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
*
|
|
16
|
+
* @param {import("../../spec/transform").PileupParams} params
|
|
17
|
+
*/
|
|
18
|
+
constructor(params) {
|
|
19
|
+
super();
|
|
20
|
+
|
|
21
|
+
this.params = params;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
reset() {
|
|
25
|
+
super.reset();
|
|
26
|
+
this.initialize();
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
initialize() {
|
|
30
|
+
const params = this.params;
|
|
31
|
+
|
|
32
|
+
const laneField = params.as || "lane";
|
|
33
|
+
const spacing = isNumber(params.spacing) ? params.spacing : 1;
|
|
34
|
+
const startAccessor = field(params.start);
|
|
35
|
+
const endAccessor = field(params.end);
|
|
36
|
+
|
|
37
|
+
// We choose the implementation based on the need of order preference.
|
|
38
|
+
// The preference-aware algorithm has a lousy O(n^2) time complexity but
|
|
39
|
+
// it's acceptable for finding lanes for genes based on their strands.
|
|
40
|
+
|
|
41
|
+
// Both implementations expect the items to be sorted by their start
|
|
42
|
+
// coordinates.
|
|
43
|
+
|
|
44
|
+
if (!params.preference !== !params.preferredOrder) {
|
|
45
|
+
throw new Error(
|
|
46
|
+
`Must specify both "preference" and "preferredOrder"`
|
|
47
|
+
);
|
|
48
|
+
} else if (params.preference) {
|
|
49
|
+
const freeLaneMap = new Float64Array(maxDepth);
|
|
50
|
+
|
|
51
|
+
const preferenceAccessor = field(params.preference);
|
|
52
|
+
/** @type {any[]} */
|
|
53
|
+
const preferredOrder = params.preferredOrder;
|
|
54
|
+
|
|
55
|
+
let lastStart = Infinity;
|
|
56
|
+
|
|
57
|
+
/** @param {Record<string, any>} datum */
|
|
58
|
+
this.handle = (datum) => {
|
|
59
|
+
const start = startAccessor(datum);
|
|
60
|
+
if (start < lastStart) {
|
|
61
|
+
// Reset if encountered a new chromosome...
|
|
62
|
+
freeLaneMap.fill(-Infinity);
|
|
63
|
+
}
|
|
64
|
+
lastStart = start;
|
|
65
|
+
|
|
66
|
+
// Linear search, but the number of preferences is likely be low
|
|
67
|
+
const preferredLane = preferredOrder.indexOf(
|
|
68
|
+
preferenceAccessor(datum)
|
|
69
|
+
);
|
|
70
|
+
let lane = -1;
|
|
71
|
+
if (preferredLane >= 0 && freeLaneMap[preferredLane] < start) {
|
|
72
|
+
lane = preferredLane;
|
|
73
|
+
} else {
|
|
74
|
+
const start = startAccessor(datum);
|
|
75
|
+
for (lane = 0; lane < freeLaneMap.length; lane++) {
|
|
76
|
+
if (freeLaneMap[lane] < start) {
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (lane >= freeLaneMap.length) {
|
|
81
|
+
throw new Error("Out of lanes!");
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
freeLaneMap[lane] = endAccessor(datum) + spacing;
|
|
85
|
+
datum[laneField] = lane;
|
|
86
|
+
this._propagate(datum);
|
|
87
|
+
};
|
|
88
|
+
} else {
|
|
89
|
+
/** @type {FlatQueue<number>} */
|
|
90
|
+
const ends = new FlatQueue();
|
|
91
|
+
|
|
92
|
+
/** @type {FlatQueue<number>} */
|
|
93
|
+
const freeLanes = new FlatQueue();
|
|
94
|
+
|
|
95
|
+
// Keep track of the last processed element. Flush the queues if the start
|
|
96
|
+
// pos suddenly decreases. This happens when piling up consecutive chromosomes.
|
|
97
|
+
let lastStart = -Infinity;
|
|
98
|
+
|
|
99
|
+
let maxLane = 0;
|
|
100
|
+
|
|
101
|
+
/** @param {Record<string, any>} datum */
|
|
102
|
+
this.handle = (datum) => {
|
|
103
|
+
const start = startAccessor(datum);
|
|
104
|
+
while (
|
|
105
|
+
ends.length &&
|
|
106
|
+
(ends.peekValue() <= start || start < lastStart)
|
|
107
|
+
) {
|
|
108
|
+
const freeLane = ends.pop();
|
|
109
|
+
freeLanes.push(freeLane, freeLane);
|
|
110
|
+
}
|
|
111
|
+
lastStart = start;
|
|
112
|
+
|
|
113
|
+
let lane = freeLanes.pop();
|
|
114
|
+
if (lane === undefined) {
|
|
115
|
+
lane = maxLane++;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
datum[laneField] = lane;
|
|
119
|
+
|
|
120
|
+
this._propagate(datum);
|
|
121
|
+
|
|
122
|
+
ends.push(lane, endAccessor(datum) + spacing);
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { expect, test } from "vitest";
|
|
2
|
+
import PileupTransform from "./pileup";
|
|
3
|
+
import { processData } from "../flowTestUtils";
|
|
4
|
+
|
|
5
|
+
// TODO: Test for lane preferences
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @typedef {import("../../spec/transform").PileupParams} PileupParams
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
const reads = [
|
|
12
|
+
[0, 4],
|
|
13
|
+
[1, 3],
|
|
14
|
+
[2, 6],
|
|
15
|
+
[4, 8],
|
|
16
|
+
[8, 10],
|
|
17
|
+
[11, 14],
|
|
18
|
+
[11, 13],
|
|
19
|
+
[11, 12],
|
|
20
|
+
[15, 18],
|
|
21
|
+
[16, 18],
|
|
22
|
+
[17, 18],
|
|
23
|
+
].map((d) => ({
|
|
24
|
+
start: d[0],
|
|
25
|
+
end: d[1],
|
|
26
|
+
}));
|
|
27
|
+
|
|
28
|
+
const lanes = [0, 1, 2, 1, 0, 0, 1, 2, 0, 1, 2];
|
|
29
|
+
|
|
30
|
+
/** @type {PileupParams} */
|
|
31
|
+
const params = {
|
|
32
|
+
type: "pileup",
|
|
33
|
+
start: "start",
|
|
34
|
+
end: "end",
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* @param {PileupParams} params
|
|
39
|
+
* @param {any[]} data
|
|
40
|
+
*/
|
|
41
|
+
function pileupTransform(params, data) {
|
|
42
|
+
const t = new PileupTransform(params);
|
|
43
|
+
t.initialize();
|
|
44
|
+
return processData(t, data);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
test("Pileup transform produces correct pileup", () => {
|
|
48
|
+
const piledUp = lanes.map((d, i) => ({
|
|
49
|
+
...reads[i],
|
|
50
|
+
lane: d,
|
|
51
|
+
}));
|
|
52
|
+
|
|
53
|
+
expect(pileupTransform(params, reads)).toEqual(piledUp);
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
test("Pileup transform produces correct pileup with consecutive contigs", () => {
|
|
57
|
+
// Simulate data having multiple chromosomes, sorted by [chrom, pos].
|
|
58
|
+
// Piling should handle suddenly decreasing start positions by freeing all
|
|
59
|
+
// reserved lanes.
|
|
60
|
+
|
|
61
|
+
const repeatedReads = [...reads, ...reads];
|
|
62
|
+
const repeatedLanes = [...lanes, ...lanes];
|
|
63
|
+
|
|
64
|
+
const piledUp = repeatedLanes.map((d, i) => ({
|
|
65
|
+
...repeatedReads[i],
|
|
66
|
+
lane: d,
|
|
67
|
+
}));
|
|
68
|
+
|
|
69
|
+
expect(pileupTransform(params, repeatedReads)).toEqual(piledUp);
|
|
70
|
+
});
|