@jax-data-science/sci-image-visualizer 0.8.3 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +201 -460
- package/esm2022/index.mjs +28 -15
- package/esm2022/lib/channel-histogram/channel-histogram.component.mjs +163 -91
- package/esm2022/lib/contracts/capabilities.contract.mjs +4 -3
- package/esm2022/lib/contracts/cell-segmenter.contract.mjs +1 -1
- package/esm2022/lib/contracts/channel-histogram-api.contract.mjs +5 -1
- package/esm2022/lib/contracts/color.mjs +60 -0
- package/esm2022/lib/contracts/colormap-lut.mjs +213 -57
- package/esm2022/lib/contracts/coordinate-transform.contract.mjs +1 -1
- package/esm2022/lib/contracts/display-types.mjs +11 -1
- package/esm2022/lib/contracts/instance-segmenter.contract.mjs +1 -1
- package/esm2022/lib/contracts/intensity.mjs +48 -5
- package/esm2022/lib/contracts/plot-type-contribution.contract.mjs +1 -1
- package/esm2022/lib/contracts/plot-type.mjs +134 -17
- package/esm2022/lib/contracts/ports/image-state.port.mjs +4 -1
- package/esm2022/lib/contracts/ports/preferences.port.mjs +5 -1
- package/esm2022/lib/contracts/ports/region-io.port.mjs +2 -1
- package/esm2022/lib/contracts/ports/spatial-data.port.mjs +5 -1
- package/esm2022/lib/contracts/ports/tile-access.port.mjs +2 -1
- package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
- package/esm2022/lib/contracts/region-overlay.contract.mjs +1 -1
- package/esm2022/lib/contracts/sam.contract.mjs +1 -1
- package/esm2022/lib/contracts/semantic-segmenter.contract.mjs +1 -1
- package/esm2022/lib/contracts/spatial-dataset.contract.mjs +3 -1
- package/esm2022/lib/contracts/toolbar-tool.contract.mjs +6 -4
- package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
- package/esm2022/lib/contracts/viz-config.mjs +2 -1
- package/esm2022/lib/geometry/contour.mjs +63 -0
- package/esm2022/lib/geometry/raster.mjs +98 -0
- package/esm2022/lib/geometry/ring.mjs +201 -0
- package/esm2022/lib/hex-color-picker/hex-color-picker.component.mjs +202 -102
- package/esm2022/lib/implementations/base-store-visualizer.mjs +201 -48
- package/esm2022/lib/implementations/napari-js/napari-axes-gizmo.mjs +65 -0
- package/esm2022/lib/implementations/napari-js/napari-display-state.mjs +136 -0
- package/esm2022/lib/implementations/napari-js/napari-helpers.mjs +199 -0
- package/esm2022/lib/implementations/napari-js/napari-image-2d-scene.mjs +602 -0
- package/esm2022/lib/implementations/napari-js/napari-loading-badge.mjs +3 -4
- package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +66 -0
- package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +157 -591
- package/esm2022/lib/implementations/napari-js/napari-scene.mjs +2 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +614 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +769 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +199 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +263 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +159 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +106 -1408
- package/esm2022/lib/implementations/napari-js/napari-spatial-tooltip.mjs +2 -2
- package/esm2022/lib/implementations/napari-js/napari-surface-scene.mjs +271 -0
- package/esm2022/lib/implementations/napari-js/napari-tile-client.mjs +562 -0
- package/esm2022/lib/implementations/napari-js/napari-tool-bridge.mjs +344 -0
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +358 -4218
- package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +439 -0
- package/esm2022/lib/implementations/napari-js/napari-volume-z-handle.mjs +6 -6
- package/esm2022/lib/implementations/napari-js/region-overlay/overlay-projection.mjs +96 -0
- package/esm2022/lib/implementations/napari-js/region-overlay/region-edit.mjs +35 -0
- package/esm2022/lib/implementations/napari-js/region-overlay/region-svg-renderer.mjs +182 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/categorical-lookup.mjs +30 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +274 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/density-layer.mjs +144 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/layer-groups.mjs +165 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/plan-context.mjs +78 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-hover.mjs +182 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-jobs.mjs +369 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +306 -0
- package/esm2022/lib/implementations/osd/display-pipeline.mjs +102 -40
- package/esm2022/lib/implementations/osd/histogram-sampler.mjs +56 -31
- package/esm2022/lib/implementations/osd/openseadragon-viewer-options.mjs +128 -0
- package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +333 -1685
- package/esm2022/lib/implementations/osd/osd-coordinate-transform.mjs +1 -1
- package/esm2022/lib/implementations/osd/osd-coords.mjs +5 -6
- package/esm2022/lib/implementations/osd/osd-export.mjs +122 -0
- package/esm2022/lib/implementations/osd/osd-lib.mjs +15 -1
- package/esm2022/lib/implementations/osd/osd-navigator-chrome.mjs +205 -0
- package/esm2022/lib/implementations/osd/osd-pixel-readback.mjs +68 -0
- package/esm2022/lib/implementations/osd/osd-region-overlay-draw.mjs +153 -0
- package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +185 -718
- package/esm2022/lib/implementations/osd/osd-scale-bar.mjs +52 -60
- package/esm2022/lib/implementations/osd/osd-tile-source.mjs +105 -0
- package/esm2022/lib/implementations/osd/osd-viewer-like.mjs +2 -0
- package/esm2022/lib/implementations/osd/osd-viewer-mount.mjs +44 -0
- package/esm2022/lib/implementations/osd/osd-viewport.mjs +184 -0
- package/esm2022/lib/implementations/osd/osd-zoom.mjs +7 -1
- package/esm2022/lib/implementations/osd/simple-source.mjs +395 -0
- package/esm2022/lib/implementations/osd/slice-cache.mjs +53 -48
- package/esm2022/lib/implementations/osd/tile-client.mjs +32 -11
- package/esm2022/lib/implementations/osd/tile-recolor.mjs +330 -0
- package/esm2022/lib/implementations/plotly/omics-trace-builders.mjs +161 -73
- package/esm2022/lib/implementations/plotly/plotly-coordinate-transform.mjs +1 -1
- package/esm2022/lib/implementations/plotly/plotly-image-loader.mjs +112 -0
- package/esm2022/lib/implementations/plotly/plotly-image-recolor.mjs +178 -0
- package/esm2022/lib/implementations/plotly/plotly-intensity-inset.mjs +33 -0
- package/esm2022/lib/implementations/plotly/plotly-isosurface-controls.mjs +83 -0
- package/esm2022/lib/implementations/plotly/plotly-layouts.mjs +121 -0
- package/esm2022/lib/implementations/plotly/plotly-readback.mjs +117 -0
- package/esm2022/lib/implementations/plotly/plotly-region-overlay.mjs +19 -10
- package/esm2022/lib/implementations/plotly/plotly-shape-projection.mjs +223 -0
- package/esm2022/lib/implementations/plotly/plotly-trace-builders.mjs +79 -19
- package/esm2022/lib/implementations/plotly/plotly-zoom-controller.mjs +223 -0
- package/esm2022/lib/implementations/plotly/plotly.service.mjs +439 -1655
- package/esm2022/lib/implementations/region-centroids.mjs +47 -0
- package/esm2022/lib/implementations/simple-slice-access.service.mjs +22 -12
- package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +172 -92
- package/esm2022/lib/implementations/spatial-data-http/spatial-wire.mjs +103 -22
- package/esm2022/lib/implementations/tile-server/index.mjs +6 -0
- package/esm2022/lib/implementations/tile-server/native-histogram.mjs +30 -0
- package/esm2022/lib/implementations/tile-server/poll-descriptor.mjs +65 -0
- package/esm2022/lib/implementations/tile-server/tile-protocol.mjs +42 -0
- package/esm2022/lib/implementations/tile-server/transport.mjs +135 -0
- package/esm2022/lib/intensity/intensity-profile.mjs +107 -0
- package/esm2022/lib/intensity/intensity-profile.service.mjs +223 -0
- package/esm2022/lib/intensity-inset/intensity-inset.component.mjs +133 -0
- package/esm2022/lib/models/bezier.mjs +1 -11
- package/esm2022/lib/models/class-preset.mjs +41 -3
- package/esm2022/lib/models/geometry.mjs +27 -164
- package/esm2022/lib/models/polygon-edit.mjs +254 -0
- package/esm2022/lib/models/polygon-factory.mjs +118 -0
- package/esm2022/lib/models/region-clone.mjs +68 -0
- package/esm2022/lib/models/region-geojson.mjs +373 -0
- package/esm2022/lib/models/region.mjs +34 -33
- package/esm2022/lib/models/shape.mjs +18 -16
- package/esm2022/lib/plot-mode/contribution-host.mjs +297 -0
- package/esm2022/lib/plot-mode/plot-mode-controller.mjs +9 -6
- package/esm2022/lib/plot-mode/plot-type-menu.mjs +85 -0
- package/esm2022/lib/plot-mode/tool-params-model.mjs +87 -0
- package/esm2022/lib/plot.utilities.mjs +296 -473
- package/esm2022/lib/processing/image-crop.mjs +1 -1
- package/esm2022/lib/processing/processing-image.mjs +28 -15
- package/esm2022/lib/provide-visualization.mjs +40 -14
- package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +99 -0
- package/esm2022/lib/region-editor/file-stem.mjs +13 -0
- package/esm2022/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.mjs +118 -0
- package/esm2022/lib/region-editor/mask-export.service.mjs +98 -0
- package/esm2022/lib/region-editor/mask-raster.mjs +11 -5
- package/esm2022/lib/region-editor/region-color-dialog/region-color-dialog.component.mjs +56 -0
- package/esm2022/lib/region-editor/region-editor-help/region-editor-help.component.mjs +28 -0
- package/esm2022/lib/region-editor/region-editor.component.mjs +402 -651
- package/esm2022/lib/region-editor/region-metrics.mjs +68 -0
- package/esm2022/lib/region-editor/region-persistence.service.mjs +134 -0
- package/esm2022/lib/region-editor/region-table/region-table.component.mjs +153 -0
- package/esm2022/lib/region-editor/save-mask-dialog/save-mask-dialog.component.mjs +91 -0
- package/esm2022/lib/region-editor/save-regions-dialog/save-regions-dialog.component.mjs +92 -0
- package/esm2022/lib/region-ops.service.mjs +28 -70
- package/esm2022/lib/region-overlay/region-geometry.mjs +360 -0
- package/esm2022/lib/region-overlay/region-hit-test.mjs +103 -0
- package/esm2022/lib/region-overlay/svg-region-renderer.mjs +228 -0
- package/esm2022/lib/render-orchestrator.mjs +14 -11
- package/esm2022/lib/render-session.mjs +207 -0
- package/esm2022/lib/routing-visualizer.service.mjs +459 -411
- package/esm2022/lib/spatial/density-raster.mjs +14 -0
- package/esm2022/lib/spatial/embedding-compute-coordinator.mjs +239 -0
- package/esm2022/lib/spatial/embedding-compute.mjs +43 -10
- package/esm2022/lib/spatial/gene-search.mjs +1 -1
- package/esm2022/lib/spatial/glyphs.mjs +97 -0
- package/esm2022/lib/spatial/lod.mjs +187 -0
- package/esm2022/lib/spatial/spatial-controls.facade.mjs +200 -0
- package/esm2022/lib/spatial/spatial-density.mjs +25 -16
- package/esm2022/lib/spatial/spatial-encoding.mjs +26 -82
- package/esm2022/lib/spatial/spatial-expression.mjs +43 -42
- package/esm2022/lib/spatial/spatial-framing.mjs +1 -1
- package/esm2022/lib/spatial/spatial-heatmap.mjs +6 -3
- package/esm2022/lib/spatial/spatial-hover.mjs +5 -33
- package/esm2022/lib/spatial/spatial-panel-model.mjs +282 -0
- package/esm2022/lib/spatial/spatial-sections.mjs +1 -1
- package/esm2022/lib/spatial/spatial-selection.mjs +33 -46
- package/esm2022/lib/spatial/spatial-tile-merge.mjs +219 -0
- package/esm2022/lib/spatial/spatial-tiles.mjs +12 -648
- package/esm2022/lib/spatial/spatial-volume-image.mjs +2 -4
- package/esm2022/lib/spatial/stats.mjs +71 -0
- package/esm2022/lib/spatial/transcript-grouping.mjs +307 -0
- package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +150 -0
- package/esm2022/lib/spatial-controls/spatial-charts/chart-data-model.mjs +309 -0
- package/esm2022/lib/spatial-controls/spatial-charts/chart-help.mjs +145 -0
- package/esm2022/lib/spatial-controls/spatial-charts/plotly-chart-host.mjs +158 -0
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.mjs +47 -0
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +297 -802
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.mjs +89 -0
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.mjs +52 -0
- package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +143 -1238
- package/esm2022/lib/spatial-controls/spatial-gene-picker.mjs +153 -0
- package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +241 -0
- package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +193 -0
- package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +132 -0
- package/esm2022/lib/spatial-controls/spatial-key/spatial-key.model.mjs +67 -0
- package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +147 -0
- package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +300 -0
- package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +370 -0
- package/esm2022/lib/store/class-color.util.mjs +46 -3
- package/esm2022/lib/store/region-history.mjs +146 -0
- package/esm2022/lib/store/region-scope-cache.mjs +140 -0
- package/esm2022/lib/store/region-selection.mjs +82 -0
- package/esm2022/lib/store/region-store.service.mjs +279 -675
- package/esm2022/lib/store/spatial-selection.service.mjs +2 -2
- package/esm2022/lib/store/visualizer-store.service.mjs +49 -71
- package/esm2022/lib/toast-outlets.mjs +5 -4
- package/esm2022/lib/toolbar/brush/brush-tool.service.mjs +92 -434
- package/esm2022/lib/toolbar/canvas-tools.mjs +20 -0
- package/esm2022/lib/toolbar/crop/slide-crop.mjs +26 -42
- package/esm2022/lib/toolbar/plot-type-selector/plot-type-selector.component.mjs +85 -0
- package/esm2022/lib/toolbar/region-tools/region-tool-buttons.mjs +74 -0
- package/esm2022/lib/toolbar/region-tools/region-tools.component.mjs +114 -0
- package/esm2022/lib/toolbar/segmentation/cell-segment-tool.service.mjs +74 -78
- package/esm2022/lib/toolbar/segmentation/cellpose-segmenter.service.mjs +50 -8
- package/esm2022/lib/toolbar/segmentation/onnx-sam-session.mjs +61 -42
- package/esm2022/lib/toolbar/segmentation/pending-calls.mjs +47 -0
- package/esm2022/lib/toolbar/segmentation/sam-model-registry.mjs +12 -4
- package/esm2022/lib/toolbar/segmentation/sam-onnx-core.mjs +70 -14
- package/esm2022/lib/toolbar/segmentation/sam-point-tool.service.mjs +135 -172
- package/esm2022/lib/toolbar/segmentation/sam-prompt.mjs +9 -90
- package/esm2022/lib/toolbar/segmentation/sam-session.service.mjs +183 -0
- package/esm2022/lib/toolbar/segmentation/sam-tool.service.mjs +95 -150
- package/esm2022/lib/toolbar/segmentation/segmentation-commit.mjs +12 -0
- package/esm2022/lib/toolbar/segmentation/segmentation-runner.mjs +108 -0
- package/esm2022/lib/toolbar/segmentation-tools/segmentation-tools.component.mjs +155 -0
- package/esm2022/lib/toolbar/stack-controls/stack-controls.component.mjs +81 -0
- package/esm2022/lib/toolbar/tool-kit/async-tool-status.mjs +37 -0
- package/esm2022/lib/toolbar/tool-kit/canvas-tool-manager.mjs +63 -0
- package/esm2022/lib/toolbar/tool-kit/canvas-tool.mjs +2 -0
- package/esm2022/lib/toolbar/tool-kit/frame-pixels.mjs +108 -0
- package/esm2022/lib/toolbar/tool-kit/mask-stroke-editor.mjs +306 -0
- package/esm2022/lib/toolbar/tool-kit/matrix-frame.mjs +61 -0
- package/esm2022/lib/toolbar/tool-kit/tool-overlay.mjs +140 -0
- package/esm2022/lib/toolbar/tool-kit/undo-gesture.mjs +24 -0
- package/esm2022/lib/toolbar/tool-slider/tool-slider.component.mjs +63 -0
- package/esm2022/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.mjs +50 -0
- package/esm2022/lib/toolbar/toolbar.component.mjs +68 -117
- package/esm2022/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.mjs +93 -115
- package/esm2022/lib/toolbar/view-controls/view-controls.component.mjs +107 -0
- package/esm2022/lib/toolbar/wand/wand-region-grow.mjs +321 -0
- package/esm2022/lib/toolbar/wand/wand-tool.service.mjs +121 -416
- package/esm2022/lib/toolbar/wand/wand.service.mjs +30 -894
- package/esm2022/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.mjs +48 -90
- package/esm2022/lib/util/mark-for-check.mjs +17 -0
- package/esm2022/lib/util/supersede.mjs +56 -0
- package/esm2022/lib/visualization.module.mjs +39 -141
- package/esm2022/lib/visualizer/floating-drag.directive.mjs +58 -0
- package/esm2022/lib/visualizer/region-actions.mjs +149 -0
- package/esm2022/lib/visualizer/region-load.mjs +60 -0
- package/esm2022/lib/visualizer/spatial-dataset-binder.mjs +163 -0
- package/esm2022/lib/visualizer/tool-modes.mjs +113 -0
- package/esm2022/lib/visualizer/viewer-shortcuts.mjs +167 -0
- package/esm2022/lib/visualizer/visualizer-context-menu.mjs +119 -0
- package/esm2022/lib/visualizer.component.mjs +480 -1902
- package/esm2022/lib/workers/spatial-math-ops.mjs +43 -0
- package/esm2022/lib/workers/spatial-math-worker.mjs +10 -0
- package/esm2022/lib/workers/spatial-math.mjs +190 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs +41083 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs +238 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs +12 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +41 -34467
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
- package/fesm2022/mask.worker.js +36 -917
- package/fesm2022/onnx-sam.worker.js +52 -16
- package/fesm2022/spatial-math.worker.js +471 -0
- package/fesm2022/tsne.worker.js +32 -15
- package/index.d.ts +13 -10
- package/lib/channel-histogram/channel-histogram.component.d.ts +53 -43
- package/lib/contracts/capabilities.contract.d.ts +4 -2
- package/lib/contracts/cell-segmenter.contract.d.ts +1 -0
- package/lib/contracts/channel-histogram-api.contract.d.ts +4 -0
- package/lib/contracts/color.d.ts +27 -0
- package/lib/contracts/colormap-lut.d.ts +19 -4
- package/lib/contracts/coordinate-transform.contract.d.ts +3 -3
- package/lib/contracts/display-types.d.ts +21 -0
- package/lib/contracts/instance-segmenter.contract.d.ts +5 -0
- package/lib/contracts/intensity.d.ts +13 -2
- package/lib/contracts/plot-type.d.ts +3 -1
- package/lib/contracts/ports/image-state.port.d.ts +6 -2
- package/lib/contracts/ports/preferences.port.d.ts +4 -0
- package/lib/contracts/ports/region-io.port.d.ts +1 -0
- package/lib/contracts/ports/spatial-data.port.d.ts +4 -10
- package/lib/contracts/ports/tile-access.port.d.ts +1 -0
- package/lib/contracts/region-editor-api.contract.d.ts +1 -1
- package/lib/contracts/region-overlay.contract.d.ts +5 -0
- package/lib/contracts/sam.contract.d.ts +7 -0
- package/lib/contracts/semantic-segmenter.contract.d.ts +6 -0
- package/lib/contracts/spatial-dataset.contract.d.ts +19 -6
- package/lib/contracts/toolbar-tool.contract.d.ts +1 -0
- package/lib/contracts/visualizer.contract.d.ts +221 -54
- package/lib/contracts/viz-config.d.ts +1 -0
- package/lib/geometry/contour.d.ts +24 -0
- package/lib/geometry/raster.d.ts +42 -0
- package/lib/geometry/ring.d.ts +67 -0
- package/lib/hex-color-picker/hex-color-picker.component.d.ts +61 -27
- package/lib/implementations/base-store-visualizer.d.ts +61 -15
- package/lib/implementations/napari-js/napari-axes-gizmo.d.ts +36 -0
- package/lib/implementations/napari-js/napari-display-state.d.ts +76 -0
- package/lib/implementations/napari-js/napari-helpers.d.ts +129 -0
- package/lib/implementations/napari-js/napari-image-2d-scene.d.ts +162 -0
- package/lib/implementations/napari-js/napari-loading-badge.d.ts +0 -1
- package/lib/implementations/napari-js/napari-loading-state.d.ts +30 -0
- package/lib/implementations/napari-js/napari-region-overlay.d.ts +62 -70
- package/lib/implementations/napari-js/napari-scene.d.ts +93 -0
- package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +163 -0
- package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +212 -0
- package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +114 -0
- package/lib/implementations/napari-js/napari-spatial-hover.d.ts +89 -0
- package/lib/implementations/napari-js/napari-spatial-scene.d.ts +118 -0
- package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +56 -263
- package/lib/implementations/napari-js/napari-spatial-tooltip.d.ts +1 -1
- package/lib/implementations/napari-js/napari-surface-scene.d.ts +76 -0
- package/lib/implementations/napari-js/napari-tile-client.d.ts +214 -0
- package/lib/implementations/napari-js/napari-tool-bridge.d.ts +179 -0
- package/lib/implementations/napari-js/napari-visualizer.service.d.ts +121 -883
- package/lib/implementations/napari-js/napari-volume-scene.d.ts +104 -0
- package/lib/implementations/napari-js/napari-volume-z-handle.d.ts +8 -12
- package/lib/implementations/napari-js/region-overlay/overlay-projection.d.ts +59 -0
- package/lib/implementations/napari-js/region-overlay/region-edit.d.ts +15 -0
- package/lib/implementations/napari-js/region-overlay/region-svg-renderer.d.ts +54 -0
- package/lib/implementations/napari-js/spatial-tiles/categorical-lookup.d.ts +26 -0
- package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +70 -0
- package/lib/implementations/napari-js/spatial-tiles/density-layer.d.ts +61 -0
- package/lib/implementations/napari-js/spatial-tiles/layer-groups.d.ts +67 -0
- package/lib/implementations/napari-js/spatial-tiles/plan-context.d.ts +38 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-hover.d.ts +71 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-jobs.d.ts +105 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +56 -0
- package/lib/implementations/osd/display-pipeline.d.ts +38 -9
- package/lib/implementations/osd/histogram-sampler.d.ts +22 -12
- package/lib/implementations/osd/openseadragon-viewer-options.d.ts +35 -0
- package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +78 -354
- package/lib/implementations/osd/osd-coordinate-transform.d.ts +2 -1
- package/lib/implementations/osd/osd-coords.d.ts +6 -4
- package/lib/implementations/osd/osd-export.d.ts +36 -0
- package/lib/implementations/osd/osd-lib.d.ts +7 -0
- package/lib/implementations/osd/osd-navigator-chrome.d.ts +69 -0
- package/lib/implementations/osd/osd-pixel-readback.d.ts +22 -0
- package/lib/implementations/osd/osd-region-overlay-draw.d.ts +37 -0
- package/lib/implementations/osd/osd-region-overlay.d.ts +36 -48
- package/lib/implementations/osd/osd-scale-bar.d.ts +8 -6
- package/lib/implementations/osd/osd-tile-source.d.ts +49 -0
- package/lib/implementations/osd/osd-viewer-like.d.ts +100 -0
- package/lib/implementations/osd/osd-viewer-mount.d.ts +14 -0
- package/lib/implementations/osd/osd-viewport.d.ts +77 -0
- package/lib/implementations/osd/osd-zoom.d.ts +6 -0
- package/lib/implementations/osd/simple-source.d.ts +161 -0
- package/lib/implementations/osd/slice-cache.d.ts +12 -3
- package/lib/implementations/osd/tile-client.d.ts +11 -14
- package/lib/implementations/osd/tile-recolor.d.ts +141 -0
- package/lib/implementations/plotly/omics-trace-builders.d.ts +32 -20
- package/lib/implementations/plotly/plotly-image-loader.d.ts +49 -0
- package/lib/implementations/plotly/plotly-image-recolor.d.ts +75 -0
- package/lib/implementations/plotly/plotly-intensity-inset.d.ts +8 -0
- package/lib/implementations/plotly/plotly-isosurface-controls.d.ts +38 -0
- package/lib/implementations/plotly/plotly-layouts.d.ts +188 -0
- package/lib/implementations/plotly/plotly-readback.d.ts +41 -0
- package/lib/implementations/plotly/plotly-region-overlay.d.ts +2 -2
- package/lib/implementations/plotly/plotly-shape-projection.d.ts +92 -0
- package/lib/implementations/plotly/plotly-trace-builders.d.ts +23 -12
- package/lib/implementations/plotly/plotly-zoom-controller.d.ts +86 -0
- package/lib/implementations/plotly/plotly.service.d.ts +136 -401
- package/lib/implementations/region-centroids.d.ts +14 -0
- package/lib/implementations/simple-slice-access.service.d.ts +7 -4
- package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +42 -18
- package/lib/implementations/spatial-data-http/spatial-wire.d.ts +34 -9
- package/lib/implementations/tile-server/index.d.ts +5 -0
- package/lib/implementations/tile-server/native-histogram.d.ts +25 -0
- package/lib/implementations/tile-server/poll-descriptor.d.ts +39 -0
- package/lib/implementations/tile-server/tile-protocol.d.ts +80 -0
- package/lib/implementations/tile-server/transport.d.ts +62 -0
- package/lib/intensity/intensity-profile.d.ts +66 -0
- package/lib/intensity/intensity-profile.service.d.ts +108 -0
- package/lib/intensity-inset/intensity-inset.component.d.ts +58 -0
- package/lib/models/bezier.d.ts +0 -5
- package/lib/models/class-preset.d.ts +18 -0
- package/lib/models/geometry.d.ts +14 -48
- package/lib/models/polygon-edit.d.ts +72 -0
- package/lib/models/polygon-factory.d.ts +40 -0
- package/lib/models/region-clone.d.ts +20 -0
- package/lib/models/region-geojson.d.ts +17 -0
- package/lib/models/region.d.ts +40 -4
- package/lib/models/shape.d.ts +8 -0
- package/lib/plot-mode/contribution-host.d.ts +125 -0
- package/lib/plot-mode/plot-type-menu.d.ts +60 -0
- package/lib/plot-mode/tool-params-model.d.ts +49 -0
- package/lib/plot.utilities.d.ts +19 -30
- package/lib/processing/processing-image.d.ts +5 -2
- package/lib/provide-visualization.d.ts +19 -2
- package/lib/region-editor/classes-panel/classes-panel.component.d.ts +56 -0
- package/lib/region-editor/file-stem.d.ts +7 -0
- package/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.d.ts +45 -0
- package/lib/region-editor/mask-export.service.d.ts +54 -0
- package/lib/region-editor/mask-raster.d.ts +2 -8
- package/lib/region-editor/region-color-dialog/region-color-dialog.component.d.ts +29 -0
- package/lib/region-editor/region-editor-help/region-editor-help.component.d.ts +11 -0
- package/lib/region-editor/region-editor.component.d.ts +166 -199
- package/lib/region-editor/region-metrics.d.ts +26 -0
- package/lib/region-editor/region-persistence.service.d.ts +69 -0
- package/lib/region-editor/region-table/region-table.component.d.ts +83 -0
- package/lib/region-editor/save-mask-dialog/save-mask-dialog.component.d.ts +36 -0
- package/lib/region-editor/save-regions-dialog/save-regions-dialog.component.d.ts +37 -0
- package/lib/region-ops.service.d.ts +1 -7
- package/lib/region-overlay/region-geometry.d.ts +157 -0
- package/lib/region-overlay/region-hit-test.d.ts +38 -0
- package/lib/region-overlay/svg-region-renderer.d.ts +110 -0
- package/lib/render-orchestrator.d.ts +6 -2
- package/lib/render-session.d.ts +75 -0
- package/lib/routing-visualizer.service.d.ts +110 -58
- package/lib/spatial/density-raster.d.ts +6 -0
- package/lib/spatial/embedding-compute-coordinator.d.ts +123 -0
- package/lib/spatial/embedding-compute.d.ts +21 -2
- package/lib/spatial/glyphs.d.ts +16 -0
- package/lib/spatial/lod.d.ts +94 -0
- package/lib/spatial/spatial-controls.facade.d.ts +64 -0
- package/lib/spatial/spatial-density.d.ts +15 -5
- package/lib/spatial/spatial-encoding.d.ts +11 -44
- package/lib/spatial/spatial-expression.d.ts +40 -22
- package/lib/spatial/spatial-framing.d.ts +1 -0
- package/lib/spatial/spatial-heatmap.d.ts +2 -0
- package/lib/spatial/spatial-hover.d.ts +4 -16
- package/lib/spatial/spatial-panel-model.d.ts +135 -0
- package/lib/spatial/spatial-selection.d.ts +21 -26
- package/lib/spatial/spatial-tile-merge.d.ts +41 -0
- package/lib/spatial/spatial-tiles.d.ts +9 -256
- package/lib/spatial/stats.d.ts +38 -0
- package/lib/spatial/transcript-grouping.d.ts +119 -0
- package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +64 -0
- package/lib/spatial-controls/spatial-charts/chart-data-model.d.ts +153 -0
- package/lib/spatial-controls/spatial-charts/chart-help.d.ts +69 -0
- package/lib/spatial-controls/spatial-charts/plotly-chart-host.d.ts +98 -0
- package/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.d.ts +26 -0
- package/lib/spatial-controls/spatial-charts/spatial-charts.component.d.ts +101 -260
- package/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.d.ts +43 -0
- package/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.d.ts +27 -0
- package/lib/spatial-controls/spatial-controls.component.d.ts +68 -448
- package/lib/spatial-controls/spatial-gene-picker.d.ts +86 -0
- package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +102 -0
- package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +72 -0
- package/lib/spatial-controls/spatial-key/spatial-key.component.d.ts +66 -0
- package/lib/spatial-controls/spatial-key/spatial-key.model.d.ts +33 -0
- package/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.d.ts +64 -0
- package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +117 -0
- package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +142 -0
- package/lib/store/class-color.util.d.ts +35 -1
- package/lib/store/region-history.d.ts +66 -0
- package/lib/store/region-scope-cache.d.ts +63 -0
- package/lib/store/region-selection.d.ts +36 -0
- package/lib/store/region-store.service.d.ts +104 -112
- package/lib/store/visualizer-store.service.d.ts +22 -33
- package/lib/toast-outlets.d.ts +4 -3
- package/lib/toolbar/brush/brush-tool.service.d.ts +31 -98
- package/lib/toolbar/canvas-tools.d.ts +20 -0
- package/lib/toolbar/crop/slide-crop.d.ts +10 -4
- package/lib/toolbar/plot-type-selector/plot-type-selector.component.d.ts +38 -0
- package/lib/toolbar/region-tools/region-tool-buttons.d.ts +21 -0
- package/lib/toolbar/region-tools/region-tools.component.d.ts +60 -0
- package/lib/toolbar/segmentation/cell-segment-tool.service.d.ts +10 -14
- package/lib/toolbar/segmentation/cellpose-segmenter.service.d.ts +12 -2
- package/lib/toolbar/segmentation/onnx-sam-session.d.ts +22 -3
- package/lib/toolbar/segmentation/pending-calls.d.ts +31 -0
- package/lib/toolbar/segmentation/sam-model-registry.d.ts +9 -3
- package/lib/toolbar/segmentation/sam-onnx-core.d.ts +18 -5
- package/lib/toolbar/segmentation/sam-point-tool.service.d.ts +46 -32
- package/lib/toolbar/segmentation/sam-prompt.d.ts +7 -31
- package/lib/toolbar/segmentation/sam-session.service.d.ts +74 -0
- package/lib/toolbar/segmentation/sam-tool.service.d.ts +23 -30
- package/lib/toolbar/segmentation/segmentation-commit.d.ts +8 -0
- package/lib/toolbar/segmentation/segmentation-runner.d.ts +52 -0
- package/lib/toolbar/segmentation-tools/segmentation-tools.component.d.ts +87 -0
- package/lib/toolbar/stack-controls/stack-controls.component.d.ts +40 -0
- package/lib/toolbar/tool-kit/async-tool-status.d.ts +21 -0
- package/lib/toolbar/tool-kit/canvas-tool-manager.d.ts +36 -0
- package/lib/toolbar/tool-kit/canvas-tool.d.ts +86 -0
- package/lib/toolbar/tool-kit/frame-pixels.d.ts +45 -0
- package/lib/toolbar/tool-kit/mask-stroke-editor.d.ts +125 -0
- package/lib/toolbar/tool-kit/matrix-frame.d.ts +40 -0
- package/lib/toolbar/tool-kit/tool-overlay.d.ts +60 -0
- package/lib/toolbar/tool-kit/undo-gesture.d.ts +17 -0
- package/lib/toolbar/tool-slider/tool-slider.component.d.ts +33 -0
- package/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.d.ts +24 -0
- package/lib/toolbar/toolbar.component.d.ts +47 -83
- package/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.d.ts +33 -40
- package/lib/toolbar/view-controls/view-controls.component.d.ts +54 -0
- package/lib/toolbar/wand/wand-region-grow.d.ts +49 -0
- package/lib/toolbar/wand/wand-tool.service.d.ts +39 -124
- package/lib/toolbar/wand/wand.service.d.ts +22 -116
- package/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.d.ts +17 -37
- package/lib/util/mark-for-check.d.ts +11 -0
- package/lib/util/supersede.d.ts +53 -0
- package/lib/visualization.module.d.ts +18 -39
- package/lib/visualizer/floating-drag.directive.d.ts +30 -0
- package/lib/visualizer/region-actions.d.ts +54 -0
- package/lib/visualizer/region-load.d.ts +27 -0
- package/lib/visualizer/spatial-dataset-binder.d.ts +74 -0
- package/lib/visualizer/tool-modes.d.ts +49 -0
- package/lib/visualizer/viewer-shortcuts.d.ts +71 -0
- package/lib/visualizer/visualizer-context-menu.d.ts +55 -0
- package/lib/visualizer.component.d.ts +201 -447
- package/lib/workers/spatial-math-ops.d.ts +65 -0
- package/lib/workers/spatial-math-worker.d.ts +7 -0
- package/lib/workers/spatial-math.d.ts +74 -0
- package/package.json +12 -3
- package/src/lib/styles/_viz-icons-rules.scss +73 -0
- package/src/lib/styles/viz-icons.scss +14 -0
- package/esm2022/lib/implementations/napari-js/napari-axes-labels.mjs +0 -97
- package/esm2022/lib/implementations/napari-js/napari-navigator.mjs +0 -195
- package/esm2022/lib/implementations/napari-js/napari-scale-bar.mjs +0 -92
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs +0 -329
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs.map +0 -1
- package/lib/implementations/napari-js/napari-axes-labels.d.ts +0 -49
- package/lib/implementations/napari-js/napari-navigator.d.ts +0 -72
- package/lib/implementations/napari-js/napari-scale-bar.d.ts +0 -35
- package/src/lib/assets/cell-detection.svg +0 -37
- package/src/lib/assets/click.svg +0 -1
- package/src/lib/assets/colormap-luts.json +0 -1
- package/src/lib/assets/edit-selection-white.svg +0 -47
- package/src/lib/assets/icons/colormap-earth.png +0 -0
- package/src/lib/assets/icons/colormap-placeholder.png +0 -0
- package/src/lib/assets/icons/colormap-pubu.png +0 -0
- package/src/lib/assets/interactive-segmentation-cursor.svg +0 -1
- package/src/lib/assets/picture-segmentation.svg +0 -43
- package/src/lib/assets/test/download-379.svg +0 -1
- package/src/lib/assets/test/download-98.svg +0 -1
- package/src/lib/assets/test/json-1.svg +0 -1
- package/src/lib/assets/test/load-53.svg +0 -1
- package/src/lib/assets/test/mask-44.svg +0 -1
- package/src/lib/assets/test/mask-download-44.svg +0 -15
- package/src/lib/assets/test/mask-save-44.svg +0 -11
- package/src/lib/assets/test/overlay-1.svg +0 -1
- package/src/lib/assets/test/overlay-4.svg +0 -1
- package/src/lib/assets/test/region-26.svg +0 -1
- package/src/lib/assets/test/save-56.svg +0 -1
- package/src/lib/assets/test/upload-43.svg +0 -1
|
@@ -1,259 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Spatial tile helpers, re-exported from the modules they now live in.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* — the part that decides whether the view is fast and legible — is testable without a
|
|
9
|
-
* GPU.
|
|
10
|
-
*
|
|
11
|
-
* Observation units map onto world units through the dataset's `imageRef` affine
|
|
12
|
-
* (`world = data · scale + translate`), so "pixels per observation unit" is
|
|
13
|
-
* `zoom · scale`. For a Xenium bundle the data unit is the micron and the world unit the
|
|
14
|
-
* morphology pixel.
|
|
15
|
-
*/
|
|
16
|
-
import type { SpatialBounds, SpatialImageRef, SpatialTileLevel, SpatialTranscriptTile } from '../contracts/spatial-dataset.contract';
|
|
17
|
-
import type { SpatialViewState } from '../contracts/display-types';
|
|
18
|
-
import type { SpatialDataset } from '../contracts/spatial-dataset.contract';
|
|
19
|
-
/** A rectangle in observation coordinates. */
|
|
20
|
-
export interface DataRect {
|
|
21
|
-
x0: number;
|
|
22
|
-
y0: number;
|
|
23
|
-
x1: number;
|
|
24
|
-
y1: number;
|
|
25
|
-
}
|
|
26
|
-
/** Tile address. */
|
|
27
|
-
export interface TileKey {
|
|
28
|
-
level: number;
|
|
29
|
-
gx: number;
|
|
30
|
-
gy: number;
|
|
31
|
-
}
|
|
32
|
-
/** Whether cell outlines are drawn: the user's choice, else on when the dataset has any. */
|
|
33
|
-
export declare function cellsShown(dataset: Pick<SpatialDataset, 'polygonTiles' | 'polygons'> | null, view: Pick<SpatialViewState, 'showCells'>): boolean;
|
|
34
|
-
/** A column holding a hand-curated cell-type annotation, by naming convention. */
|
|
35
|
-
export declare function isCuratedColumn(name: string): boolean;
|
|
36
|
-
/**
|
|
37
|
-
* The categorical column that names each cell's type: the view's choice when it is a
|
|
38
|
-
* column of this dataset, else the first categorical column that is not a curated
|
|
39
|
-
* annotation (a pipeline's clustering is the default; curation is opted into), else
|
|
40
|
-
* any categorical column.
|
|
41
|
-
*/
|
|
42
|
-
export declare function cellTypeColumnFor(dataset: SpatialDataset, view: Pick<SpatialViewState, 'cellTypeColumn'>): string | null;
|
|
43
|
-
export declare function tileId(k: TileKey): string;
|
|
44
|
-
/** Canvas pixels per observation unit along x, for a camera zoom and a data→world affine. */
|
|
45
|
-
export declare function pixelsPerDataUnit(zoom: number, ref?: SpatialImageRef | null): number;
|
|
46
|
-
/**
|
|
47
|
-
* The part of observation space the camera shows, padded by `margin` (a fraction of the
|
|
48
|
-
* viewport) so tiles just off screen are already there when a pan brings them in.
|
|
49
|
-
*/
|
|
50
|
-
export declare function visibleDataRect(center: readonly [number, number], zoom: number, canvasW: number, canvasH: number, ref?: SpatialImageRef | null, margin?: number): DataRect | null;
|
|
51
|
-
/**
|
|
52
|
-
* Tiles of one level intersecting `rect`, clipped to the dataset's `bounds` (so zooming
|
|
53
|
-
* out over empty canvas does not ask for tiles that cannot exist). Ordered from the
|
|
54
|
-
* rectangle's centre outward, so the middle of the screen fills in first.
|
|
55
|
-
*/
|
|
56
|
-
export declare function tilesInRect(rect: DataRect, level: number, levels: readonly SpatialTileLevel[], bounds?: SpatialBounds | null, limit?: number): TileKey[];
|
|
57
|
-
/**
|
|
58
|
-
* Typical cell diameter, in observation units, used to judge how large cells appear.
|
|
59
|
-
* Derived from the per-observation radius when there is one; 12 µm otherwise.
|
|
60
|
-
*/
|
|
61
|
-
export declare function typicalCellDiameter(radius: Float32Array | number | undefined, fallback?: number): number;
|
|
62
|
-
/**
|
|
63
|
-
* On-screen cell diameter (px) at or above which each polygon level is used. A level
|
|
64
|
-
* halves the vertices of the one below, so each should take over when the cell is about
|
|
65
|
-
* half as large on screen. Below the last finite threshold outlines are not drawn at
|
|
66
|
-
* all — a cell a few pixels wide is a dot, and the observation markers already draw it
|
|
67
|
-
* as one.
|
|
68
|
-
*
|
|
69
|
-
* Xenium's fourth level (3 vertices per cell) is deliberately never used: seen on
|
|
70
|
-
* screen it is a field of triangles, which reads as an artefact rather than as cells.
|
|
71
|
-
* The dots below 8 px say the same thing more honestly.
|
|
72
|
-
*/
|
|
73
|
-
export declare const POLYGON_LEVEL_MIN_CELL_PX: number[];
|
|
74
|
-
/**
|
|
75
|
-
* Which polygon level suits this zoom, or -1 for "too small to outline".
|
|
76
|
-
* `detail` > 1 prefers finer levels (sharper, slower); < 1 coarser.
|
|
77
|
-
*/
|
|
78
|
-
export declare function polygonLevelFor(pxPerUnit: number, cellDiameter: number, levelCount: number, detail?: number): number;
|
|
79
|
-
/**
|
|
80
|
-
* Which transcript level suits this zoom: the one whose tiles come out closest to
|
|
81
|
-
* `targetTilePx` on screen. Coarser levels aggregate more, so this keeps the number of
|
|
82
|
-
* markers per screen roughly constant however far out the camera is — the property that
|
|
83
|
-
* keeps the view fast.
|
|
84
|
-
*/
|
|
85
|
-
export declare function transcriptLevelFor(pxPerUnit: number, levels: readonly SpatialTileLevel[], targetTilePx?: number): number;
|
|
86
|
-
/**
|
|
87
|
-
* The bin a selection of genes is grouped into at this zoom, in observation units, or null
|
|
88
|
-
* to draw every transcript. Bins follow the all-gene pyramid's ladder (`baseBin` × 2^m) so a
|
|
89
|
-
* gene selection and "all genes" group alike: the finest bin whose markers land at least
|
|
90
|
-
* `spacingPx` apart on screen. Once the finest bin is that wide, transcripts are drawn as
|
|
91
|
-
* themselves.
|
|
92
|
-
*/
|
|
93
|
-
export declare function geneBinSize(pxPerUnit: number, baseBin: number, levels?: number, spacingPx?: number): number | null;
|
|
94
|
-
/** The entries of `t` inside `rect` (observation units). */
|
|
95
|
-
export declare function clipTranscripts(t: SpatialTranscriptTile, rect: DataRect): SpatialTranscriptTile;
|
|
96
|
-
/**
|
|
97
|
-
* Group transcripts into `bin`-wide squares of a grid anchored at the origin (so a pan does
|
|
98
|
-
* not move them), one entry per (group, square): `groupOf(gene slot)` says which group a gene
|
|
99
|
-
* is in — its cluster in the gene tree, or itself. Each entry sits at its transcripts'
|
|
100
|
-
* centroid, weighted by how many each stands for; it takes the gene and the cell holding most
|
|
101
|
-
* of them, each summed over all its transcripts in the entry. `group[i]` is entry i's group.
|
|
102
|
-
*/
|
|
103
|
-
export declare function groupTranscripts(t: SpatialTranscriptTile, bin: number, groupOf?: (geneSlot: number) => number): {
|
|
104
|
-
tile: SpatialTranscriptTile;
|
|
105
|
-
group: Int32Array;
|
|
106
|
-
};
|
|
107
|
-
/**
|
|
108
|
-
* The colour of each gene-tree cluster of a selection, for colouring transcripts by cluster: a
|
|
109
|
-
* cluster named like a group of the cells' grouping takes that group's colour (its cells and its
|
|
110
|
-
* transcripts agree); the others take palette colours in tree order. Clusters are the tree's
|
|
111
|
-
* groups holding a selected gene, then each ungrouped selected gene on its own. Every gene of a
|
|
112
|
-
* cluster gets the same colour — the tree's swatches and the markers use this one map.
|
|
113
|
-
*/
|
|
114
|
-
export declare function clusterColorMap(genes: readonly string[], groups: readonly {
|
|
115
|
-
name: string;
|
|
116
|
-
genes: readonly string[];
|
|
117
|
-
}[], cellColors: ReadonlyMap<string, string>, palette: readonly string[]): Map<string, string>;
|
|
118
|
-
/** The cluster a selected gene is in: its first gene-tree group holding it, else itself. */
|
|
119
|
-
export declare function clusterOfGene(gene: string, groups: readonly {
|
|
120
|
-
name: string;
|
|
121
|
-
genes: readonly string[];
|
|
122
|
-
}[]): string;
|
|
123
|
-
/** Smallest and largest transcript marker, in canvas pixels. */
|
|
124
|
-
export declare const TRANSCRIPT_MIN_PX = 4;
|
|
125
|
-
export declare const TRANSCRIPT_MAX_PX = 32;
|
|
126
|
-
/**
|
|
127
|
-
* Physical diameter a single transcript is drawn at, in µm — clearly larger than the
|
|
128
|
-
* imaged spot (~0.3 µm) so it stays legible, and small enough that neighbouring
|
|
129
|
-
* molecules inside one cell stay apart.
|
|
130
|
-
*/
|
|
131
|
-
export declare const TRANSCRIPT_PHYSICAL_UM = 1.2;
|
|
132
|
-
/**
|
|
133
|
-
* Marker diameter in canvas pixels for an entry standing for `weight` transcripts.
|
|
134
|
-
*
|
|
135
|
-
* The convention spatial viewers share (deck.gl's `radiusMinPixels`/`radiusMaxPixels`,
|
|
136
|
-
* Xenium Explorer's transcript size): a PHYSICAL size, clamped to a screen-pixel range.
|
|
137
|
-
* Zoomed out, markers sit at the minimum and never vanish; zoomed in, they grow with the
|
|
138
|
-
* tissue instead of shrinking to specks next to cells hundreds of pixels wide. A fixed
|
|
139
|
-
* screen size does the opposite at high zoom, which is what made transcripts disappear
|
|
140
|
-
* at pixel-level zoom.
|
|
141
|
-
*
|
|
142
|
-
* Aggregates grow with the cube root of their count: area ∝ count would let one dense
|
|
143
|
-
* aggregate swallow its neighbours, the cube root keeps a 1000-transcript cluster clearly
|
|
144
|
-
* larger than a 10-transcript one without covering the tile.
|
|
145
|
-
*
|
|
146
|
-
* `pxPerMicron` is omitted for data with no known physical unit; the marker is then
|
|
147
|
-
* screen-sized only.
|
|
148
|
-
*/
|
|
149
|
-
export declare function transcriptMarkerPx(weight: number, scale?: number, pxPerMicron?: number): number;
|
|
150
|
-
/** Marker shapes for the transcript "icon" mode. All star-convex, so a fan fills them. */
|
|
151
|
-
export declare const TRANSCRIPT_GLYPHS: readonly ["circle", "star", "triangle", "square", "diamond", "cross", "hexagon", "triangle-down", "pentagon", "x"];
|
|
152
|
-
export type TranscriptGlyph = typeof TRANSCRIPT_GLYPHS[number];
|
|
153
|
-
/** Unit outline of a glyph, radius ≈ 1, centred on the origin, as `[x0, y0, x1, y1, …]`. */
|
|
154
|
-
export declare function glyphOutline(glyph: TranscriptGlyph): Float32Array;
|
|
155
|
-
/** The glyph a gene gets by default: by its position in the selected list. */
|
|
156
|
-
export declare function defaultGlyphFor(slot: number): TranscriptGlyph;
|
|
157
|
-
/**
|
|
158
|
-
* Expand point markers into glyph rings for a shapes layer: entry `i` becomes a copy of
|
|
159
|
-
* `glyphs[gene[i]]` scaled to `radius[i]` and centred on `(x[i], y[i])`.
|
|
160
|
-
*/
|
|
161
|
-
export declare function glyphRings(x: Float32Array, y: Float32Array, radius: Float32Array, glyphOf: (i: number) => Float32Array): {
|
|
162
|
-
coords: Float32Array;
|
|
163
|
-
offsets: Uint32Array;
|
|
164
|
-
};
|
|
165
|
-
/**
|
|
166
|
-
* A shapes layer colours through a colormap LUT, not per-shape RGBA. A categorical
|
|
167
|
-
* palette becomes a piecewise-constant colormap: category `c` of `n` owns the band
|
|
168
|
-
* `[c/n, (c+1)/n)`, and a shape takes the value at its band's centre, so the LUT's
|
|
169
|
-
* linear filtering never blends two categories.
|
|
170
|
-
*
|
|
171
|
-
* Returns the stops (linear 0..1 RGB) and a function mapping a category code to the
|
|
172
|
-
* value to hand the layer. `missing` is the colour of the extra band used for "no
|
|
173
|
-
* category".
|
|
174
|
-
*/
|
|
175
|
-
export declare function discreteColormapStops(rgb: readonly (readonly [number, number, number])[], missing: readonly [number, number, number]): {
|
|
176
|
-
stops: {
|
|
177
|
-
t: number;
|
|
178
|
-
color: [number, number, number];
|
|
179
|
-
}[];
|
|
180
|
-
valueOf: (code: number) => number;
|
|
181
|
-
};
|
|
182
|
-
/**
|
|
183
|
-
* Separable Gaussian blur of a row-major raster, `sigma` in raster cells.
|
|
184
|
-
*
|
|
185
|
-
* A per-gene count raster at 10 µm is mostly zeros and ones — drawn as-is it is speckle,
|
|
186
|
-
* not a density. A σ of one to two cells (10–20 µm, about a cell diameter) turns it into
|
|
187
|
-
* a field that reads as territory while keeping structures a few cells wide.
|
|
188
|
-
*/
|
|
189
|
-
export declare function smoothRaster(values: Float32Array, rows: number, cols: number, sigma: number): Float32Array;
|
|
190
|
-
/**
|
|
191
|
-
* Colour a density raster as RGBA bytes: log-scaled, windowed at a high percentile of the
|
|
192
|
-
* non-zero values, and faded in from transparent so empty tissue shows what is under it.
|
|
193
|
-
*/
|
|
194
|
-
export declare function colorDensity(values: Float32Array, lut: readonly (readonly [number, number, number])[], opacity: number, { log, percentile }?: {
|
|
195
|
-
log?: boolean | undefined;
|
|
196
|
-
percentile?: number | undefined;
|
|
197
|
-
}): Uint8Array;
|
|
198
|
-
/** Smallest on-screen spacing between groups, in px — below it groups read as noise. */
|
|
199
|
-
export declare const GROUP_MIN_SPACING_PX = 14;
|
|
200
|
-
/** Area of `rect` inside `bounds` (the whole rect when there are none). */
|
|
201
|
-
export declare function visibleArea(rect: DataRect, bounds?: SpatialBounds | null): number;
|
|
202
|
-
export type AllGenesPlan = {
|
|
203
|
-
kind: 'individual';
|
|
204
|
-
} | {
|
|
205
|
-
kind: 'bins';
|
|
206
|
-
level: number;
|
|
207
|
-
} | {
|
|
208
|
-
kind: 'none';
|
|
209
|
-
};
|
|
210
|
-
/**
|
|
211
|
-
* How to draw every transcript in view without exceeding `budget` markers.
|
|
212
|
-
*
|
|
213
|
-
* - The transcripts themselves, once the estimated count in view fits the budget.
|
|
214
|
-
* - Otherwise the finest pyramid level whose bins are at least `minSpacingPx` apart on
|
|
215
|
-
* screen and number no more than the budget — groups big enough to read, few enough
|
|
216
|
-
* to draw.
|
|
217
|
-
*
|
|
218
|
-
* The count in view is estimated from the average density, which over- or under-shoots
|
|
219
|
-
* locally; the renderer still caps what it draws, so an estimate is enough to choose.
|
|
220
|
-
*/
|
|
221
|
-
export declare function allGenesPlan(o: {
|
|
222
|
-
rect: DataRect;
|
|
223
|
-
bounds: SpatialBounds;
|
|
224
|
-
total: number;
|
|
225
|
-
pxPerUnit: number;
|
|
226
|
-
levels: readonly {
|
|
227
|
-
binSize: number;
|
|
228
|
-
}[];
|
|
229
|
-
budget: number;
|
|
230
|
-
canIndividual: boolean;
|
|
231
|
-
minSpacingPx?: number;
|
|
232
|
-
}): AllGenesPlan;
|
|
233
|
-
/**
|
|
234
|
-
* Diameter in px of a group of `count` transcripts in a bin `binPx` wide, where
|
|
235
|
-
* `refCount` is a typical busy bin in view (its 95th percentile).
|
|
236
|
-
*
|
|
237
|
-
* Area grows with the count — a bin with a quarter of the transcripts gets half the
|
|
238
|
-
* diameter — between a third of the bin (so a sparse bin is still visible) and a little
|
|
239
|
-
* over the full bin (so dense neighbours just touch rather than pile up).
|
|
240
|
-
*/
|
|
241
|
-
export declare function groupedMarkerPx(count: number, refCount: number, binPx: number, scale?: number): number;
|
|
242
|
-
/** The `p` quantile (0..1) of a count vector — a sample of it for large vectors. */
|
|
243
|
-
export declare function quantileOf(values: ArrayLike<number>, p: number): number;
|
|
244
|
-
/** {@link tilesInRect} for a grid whose tile (0, 0) starts at `origin`. */
|
|
245
|
-
export declare function tilesInRectFrom(origin: readonly [number, number], rect: DataRect, level: number, levels: readonly SpatialTileLevel[], bounds?: SpatialBounds | null, limit?: number): TileKey[];
|
|
246
|
-
/** A density window from the non-empty bins: 1st to 99th percentile. */
|
|
247
|
-
export declare function densityAutoRange(values: ArrayLike<number>): [number, number];
|
|
248
|
-
/**
|
|
249
|
-
* Colour density bins through `lut` over the window `[lo, hi]` — Xenium Explorer's
|
|
250
|
-
* "scale threshold". Bins at or below `lo` are transparent, so empty tissue shows the
|
|
251
|
-
* image under it; bins at or above `hi` saturate.
|
|
252
|
-
*/
|
|
253
|
-
export declare function colorDensityWindow(values: ArrayLike<number>, lut: readonly (readonly [number, number, number])[], opacity: number, lo: number, hi: number): Uint8Array;
|
|
254
|
-
/**
|
|
255
|
-
* Inferno (matplotlib), as an inline `[stop, colour]` scale: the density map's default,
|
|
256
|
-
* as in Xenium Explorer. Inline because the colormap tree's `INFERNO_LUT` key is resolved
|
|
257
|
-
* at runtime by the store, which the renderer does not see.
|
|
4
|
+
* @deprecated Kept for one release so existing imports keep working. Import from
|
|
5
|
+
* `./lod` (level of detail, tiles in view), `./transcript-grouping` (grouping, marker
|
|
6
|
+
* sizing, cluster colours), `./glyphs` (transcript icons) or `./density-raster` (density
|
|
7
|
+
* window and scale) instead.
|
|
258
8
|
*/
|
|
259
|
-
export
|
|
9
|
+
export * from './lod';
|
|
10
|
+
export * from './transcript-grouping';
|
|
11
|
+
export * from './glyphs';
|
|
12
|
+
export * from './density-raster';
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Percentiles for the spatial code: one "collect, sort, index" routine instead of one per
|
|
3
|
+
* caller.
|
|
4
|
+
*
|
|
5
|
+
* The callers used to differ in rounding (`round(p·(n-1))` against `floor(p·n)`), in
|
|
6
|
+
* sampling and in filtering, so windows computed for the same data in different views
|
|
7
|
+
* could disagree. Here there is one rule for each:
|
|
8
|
+
*
|
|
9
|
+
* - **Rank**: `round(p·(n-1))` — the nearest rank. `floor(p·n)` is biased upward and
|
|
10
|
+
* hands back the maximum for `p = 0.99` on a hundred values, outlier included.
|
|
11
|
+
* - **Sort**: a typed-array sort, which is native and numeric — several times faster
|
|
12
|
+
* than a comparator sort of a boxed `number[]`, and far lighter on the heap.
|
|
13
|
+
* - **Sample**: past `2·sampleSize` qualifying values, every `floor(count/sampleSize)`-th
|
|
14
|
+
* one, which is plenty for a display window and keeps a 3.7M-cell recolour from
|
|
15
|
+
* sorting 3.7M values.
|
|
16
|
+
*/
|
|
17
|
+
export interface QuantileOptions {
|
|
18
|
+
/** Which values count: every finite one (the default), or only those above zero. */
|
|
19
|
+
filter?: 'finite' | 'positive';
|
|
20
|
+
/** Count index `i` only where `where[i] > 0` — e.g. a field's support. */
|
|
21
|
+
where?: ArrayLike<number>;
|
|
22
|
+
/** Sample down to about this many values (see the module doc); unsampled when absent. */
|
|
23
|
+
sampleSize?: number;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* The `ps` quantiles (each 0..1, clamped) of the values that qualify, or null when none do.
|
|
27
|
+
*/
|
|
28
|
+
export declare function quantiles(values: ArrayLike<number>, ps: readonly number[], opts?: QuantileOptions): number[] | null;
|
|
29
|
+
/** One quantile; see {@link quantiles}. */
|
|
30
|
+
export declare function quantile(values: ArrayLike<number>, p: number, opts?: QuantileOptions): number | null;
|
|
31
|
+
/** Sample size for a contrast window: a display window does not need every value. */
|
|
32
|
+
export declare const WINDOW_SAMPLE_SIZE = 65536;
|
|
33
|
+
/**
|
|
34
|
+
* A `[lo, hi]` percentile window over the qualifying values, never flat or inverted
|
|
35
|
+
* (a flat window would divide by zero downstream, so it is widened by one), and `[0, 1]`
|
|
36
|
+
* when nothing qualifies, so callers always get a usable window.
|
|
37
|
+
*/
|
|
38
|
+
export declare function percentileWindow(values: ArrayLike<number>, lo: number, hi: number, opts?: QuantileOptions): [number, number];
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transcript grouping and marker sizing: how many transcripts one marker stands for at the
|
|
3
|
+
* current zoom, how big it is drawn, and which colour each gene-tree cluster takes. Pure, so
|
|
4
|
+
* the budget policy is testable without a viewer.
|
|
5
|
+
*/
|
|
6
|
+
import type { SpatialBounds, SpatialTranscriptTile } from '../contracts/spatial-dataset.contract';
|
|
7
|
+
import { DataRect } from './lod';
|
|
8
|
+
/** Smallest on-screen spacing between groups, in px — below it groups read as noise. */
|
|
9
|
+
export declare const GROUP_MIN_SPACING_PX = 14;
|
|
10
|
+
/**
|
|
11
|
+
* The bin a selection of genes is grouped into at this zoom, in observation units, or null
|
|
12
|
+
* to draw every transcript. Bins follow the all-gene pyramid's ladder (`baseBin` × 2^m) so a
|
|
13
|
+
* gene selection and "all genes" group alike: the finest bin whose markers land at least
|
|
14
|
+
* `spacingPx` apart on screen. Once the finest bin is that wide, transcripts are drawn as
|
|
15
|
+
* themselves.
|
|
16
|
+
*/
|
|
17
|
+
export declare function geneBinSize(pxPerUnit: number, baseBin: number, levels?: number, spacingPx?: number): number | null;
|
|
18
|
+
/** The entries of `t` inside `rect` (observation units). */
|
|
19
|
+
export declare function clipTranscripts(t: SpatialTranscriptTile, rect: DataRect): SpatialTranscriptTile;
|
|
20
|
+
/**
|
|
21
|
+
* Group transcripts into `bin`-wide squares of a grid anchored at the origin (so a pan does
|
|
22
|
+
* not move them), one entry per (group, square): `groupOf(gene slot)` says which group a gene
|
|
23
|
+
* is in — its cluster in the gene tree, or itself. Each entry sits at its transcripts'
|
|
24
|
+
* centroid, weighted by how many each stands for; it takes the gene and the cell holding most
|
|
25
|
+
* of them, each summed over all its transcripts in the entry. `group[i]` is entry i's group.
|
|
26
|
+
*/
|
|
27
|
+
export declare function groupTranscripts(t: SpatialTranscriptTile, bin: number, groupOf?: (geneSlot: number) => number): {
|
|
28
|
+
tile: SpatialTranscriptTile;
|
|
29
|
+
group: Int32Array;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* The colour of each gene-tree cluster of a selection, for colouring transcripts by cluster: a
|
|
33
|
+
* cluster named like a group of the cells' grouping takes that group's colour (its cells and its
|
|
34
|
+
* transcripts agree); the others take palette colours in tree order. Clusters are the tree's
|
|
35
|
+
* groups holding a selected gene, then each ungrouped selected gene on its own. Every gene of a
|
|
36
|
+
* cluster gets the same colour — the tree's swatches and the markers use this one map.
|
|
37
|
+
*/
|
|
38
|
+
export declare function clusterColorMap(genes: readonly string[], groups: readonly {
|
|
39
|
+
name: string;
|
|
40
|
+
genes: readonly string[];
|
|
41
|
+
}[], cellColors: ReadonlyMap<string, string>, palette: readonly string[]): Map<string, string>;
|
|
42
|
+
/** The cluster a selected gene is in: its first gene-tree group holding it, else itself. */
|
|
43
|
+
export declare function clusterOfGene(gene: string, groups: readonly {
|
|
44
|
+
name: string;
|
|
45
|
+
genes: readonly string[];
|
|
46
|
+
}[]): string;
|
|
47
|
+
/** Smallest transcript marker, in canvas pixels. */
|
|
48
|
+
export declare const TRANSCRIPT_MIN_PX = 4;
|
|
49
|
+
/** Largest transcript marker, in canvas pixels. */
|
|
50
|
+
export declare const TRANSCRIPT_MAX_PX = 32;
|
|
51
|
+
/**
|
|
52
|
+
* Physical diameter a single transcript is drawn at, in µm — clearly larger than the
|
|
53
|
+
* imaged spot (~0.3 µm) so it stays legible, and small enough that neighbouring
|
|
54
|
+
* molecules inside one cell stay apart.
|
|
55
|
+
*/
|
|
56
|
+
export declare const TRANSCRIPT_PHYSICAL_UM = 1.2;
|
|
57
|
+
/**
|
|
58
|
+
* Marker diameter in canvas pixels for an entry standing for `weight` transcripts.
|
|
59
|
+
*
|
|
60
|
+
* The convention spatial viewers share (deck.gl's `radiusMinPixels`/`radiusMaxPixels`,
|
|
61
|
+
* Xenium Explorer's transcript size): a PHYSICAL size, clamped to a screen-pixel range.
|
|
62
|
+
* Zoomed out, markers sit at the minimum and never vanish; zoomed in, they grow with the
|
|
63
|
+
* tissue instead of shrinking to specks next to cells hundreds of pixels wide. A fixed
|
|
64
|
+
* screen size does the opposite at high zoom, which is what made transcripts disappear
|
|
65
|
+
* at pixel-level zoom.
|
|
66
|
+
*
|
|
67
|
+
* Aggregates grow with the cube root of their count: area ∝ count would let one dense
|
|
68
|
+
* aggregate swallow its neighbours, the cube root keeps a 1000-transcript cluster clearly
|
|
69
|
+
* larger than a 10-transcript one without covering the tile.
|
|
70
|
+
*
|
|
71
|
+
* `pxPerMicron` is omitted for data with no known physical unit; the marker is then
|
|
72
|
+
* screen-sized only.
|
|
73
|
+
*/
|
|
74
|
+
export declare function transcriptMarkerPx(weight: number, scale?: number, pxPerMicron?: number): number;
|
|
75
|
+
/**
|
|
76
|
+
* How "all genes" is drawn at the current zoom: individual transcripts, a bin level, or nothing.
|
|
77
|
+
*/
|
|
78
|
+
export type AllGenesPlan = {
|
|
79
|
+
kind: 'individual';
|
|
80
|
+
} | {
|
|
81
|
+
kind: 'bins';
|
|
82
|
+
level: number;
|
|
83
|
+
} | {
|
|
84
|
+
kind: 'none';
|
|
85
|
+
};
|
|
86
|
+
/**
|
|
87
|
+
* How to draw every transcript in view without exceeding `budget` markers.
|
|
88
|
+
*
|
|
89
|
+
* - The transcripts themselves, once the estimated count in view fits the budget.
|
|
90
|
+
* - Otherwise the finest pyramid level whose bins are at least `minSpacingPx` apart on
|
|
91
|
+
* screen and number no more than the budget — groups big enough to read, few enough
|
|
92
|
+
* to draw.
|
|
93
|
+
*
|
|
94
|
+
* The count in view is estimated from the average density, which over- or under-shoots
|
|
95
|
+
* locally; the renderer still caps what it draws, so an estimate is enough to choose.
|
|
96
|
+
*/
|
|
97
|
+
export declare function allGenesPlan(o: {
|
|
98
|
+
rect: DataRect;
|
|
99
|
+
bounds: SpatialBounds;
|
|
100
|
+
total: number;
|
|
101
|
+
pxPerUnit: number;
|
|
102
|
+
levels: readonly {
|
|
103
|
+
binSize: number;
|
|
104
|
+
}[];
|
|
105
|
+
budget: number;
|
|
106
|
+
canIndividual: boolean;
|
|
107
|
+
minSpacingPx?: number;
|
|
108
|
+
}): AllGenesPlan;
|
|
109
|
+
/**
|
|
110
|
+
* Diameter in px of a group of `count` transcripts in a bin `binPx` wide, where
|
|
111
|
+
* `refCount` is a typical busy bin in view (its 95th percentile).
|
|
112
|
+
*
|
|
113
|
+
* Area grows with the count — a bin with a quarter of the transcripts gets half the
|
|
114
|
+
* diameter — between a third of the bin (so a sparse bin is still visible) and a little
|
|
115
|
+
* over the full bin (so dense neighbours just touch rather than pile up).
|
|
116
|
+
*/
|
|
117
|
+
export declare function groupedMarkerPx(count: number, refCount: number, binPx: number, scale?: number): number;
|
|
118
|
+
/** The `p` quantile (0..1) of a count vector — a sample of it for large vectors. */
|
|
119
|
+
export declare function quantileOf(values: ArrayLike<number>, p: number): number;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { EventEmitter, OnChanges, SimpleChanges } from '@angular/core';
|
|
2
|
+
import type { ISpatialControls } from '../../contracts/visualizer.contract';
|
|
3
|
+
import type { SpatialDataset } from '../../contracts/spatial-dataset.contract';
|
|
4
|
+
import { SpatialViewState } from '../../contracts/display-types';
|
|
5
|
+
import { PanelOption } from '../../spatial/spatial-panel-model';
|
|
6
|
+
import type { GenePickerModel } from '../spatial-gene-picker';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
/**
|
|
9
|
+
* The Cells section, as Xenium Explorer's: the outlines' on/off switch, which boundary set
|
|
10
|
+
* is drawn, how cells are coloured (with the gene, the colour, or the colour bar that
|
|
11
|
+
* goes with it), the {@link SpatialGroupsPanelComponent groups}, and how cells are drawn.
|
|
12
|
+
*
|
|
13
|
+
* Writes only through `controls.setViewState`.
|
|
14
|
+
*/
|
|
15
|
+
export declare class SpatialCellsPanelComponent implements OnChanges {
|
|
16
|
+
/** The spatial controls this panel reads and writes through; null without a `SPATIAL_DATA_PORT`. */
|
|
17
|
+
controls: ISpatialControls | null;
|
|
18
|
+
/** The dataset on offer, or null. */
|
|
19
|
+
dataset: SpatialDataset | null;
|
|
20
|
+
/** The current spatial view state: what is drawn, and how. */
|
|
21
|
+
view: SpatialViewState;
|
|
22
|
+
/** The gene list the "Gene Expression" colouring picks from, shared with the other
|
|
23
|
+
* gene dropdowns. */
|
|
24
|
+
genes: GenePickerModel | null;
|
|
25
|
+
/** The observations' continuous colour bar, shown for the gene colouring while it has one. */
|
|
26
|
+
colorBarCss: string | null;
|
|
27
|
+
/** Whether the section is expanded. */
|
|
28
|
+
open: boolean;
|
|
29
|
+
/** Asks to open or close it; two-way with `open`. */
|
|
30
|
+
readonly openChange: EventEmitter<boolean>;
|
|
31
|
+
/** Virtual-scrolled only past this many options: the scroller earns its complexity for
|
|
32
|
+
* a few thousand names, and for eight it adds only overhead — a virtual viewport that
|
|
33
|
+
* short swallows the clicks it is meant to forward. */
|
|
34
|
+
protected readonly geneVirtualScrollFrom = 200;
|
|
35
|
+
protected readonly cellDrawOptions: PanelOption<SpatialViewState['cellDraw']>[];
|
|
36
|
+
/**
|
|
37
|
+
* Option lists for the cell controls. Built once per dataset rather than in getters: a
|
|
38
|
+
* getter returns a fresh array on every change-detection pass, and PrimeNG re-renders
|
|
39
|
+
* its buttons whenever the array identity changes — which made them impossible to click.
|
|
40
|
+
*/
|
|
41
|
+
protected cellSetOptions: PanelOption<string>[];
|
|
42
|
+
/** Cell colour modes on offer (Xenium Explorer's "Cell Color"). */
|
|
43
|
+
protected cellColorOptions: PanelOption<SpatialViewState['cellColorMode']>[];
|
|
44
|
+
/** The density colour bar, rebuilt only when its colormap changes (a 256-entry LUT). */
|
|
45
|
+
protected densityColorBarCss: string;
|
|
46
|
+
private densityBarFor;
|
|
47
|
+
ngOnChanges(changes: SimpleChanges): void;
|
|
48
|
+
/** Whether outlines are on — the explicit choice, or automatically for data that has them. */
|
|
49
|
+
protected get cellsOn(): boolean;
|
|
50
|
+
/** The boundary set drawn: the view's choice, else the dataset's default, else its first. */
|
|
51
|
+
protected get activeCellSet(): string | null;
|
|
52
|
+
/** Fill opacity as a 0–100 number, for the box beside the slider. */
|
|
53
|
+
protected get cellOpacityPercent(): number;
|
|
54
|
+
protected onShowCells(on: boolean): void;
|
|
55
|
+
protected onCellSet(set: string): void;
|
|
56
|
+
protected onCellDraw(draw: SpatialViewState['cellDraw']): void;
|
|
57
|
+
protected onCellOpacity(value: number | undefined): void;
|
|
58
|
+
protected onCellOpacityPercent(v: number | null): void;
|
|
59
|
+
protected onCellColorMode(mode: SpatialViewState['cellColorMode']): void;
|
|
60
|
+
protected onCellColorGene(gene: string | null): void;
|
|
61
|
+
protected onCellSingleColor(hex: string): void;
|
|
62
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<SpatialCellsPanelComponent, never>;
|
|
63
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<SpatialCellsPanelComponent, "spatial-cells-panel", never, { "controls": { "alias": "controls"; "required": false; }; "dataset": { "alias": "dataset"; "required": false; }; "view": { "alias": "view"; "required": false; }; "genes": { "alias": "genes"; "required": false; }; "colorBarCss": { "alias": "colorBarCss"; "required": false; }; "open": { "alias": "open"; "required": false; }; }, { "openChange": "openChange"; }, never, never, true, never>;
|
|
64
|
+
}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import type { ISpatialControls } from '../../contracts/visualizer.contract';
|
|
2
|
+
import type { SpatialDataset, SpatialEmbedding, SpatialEmbeddingMeta } from '../../contracts/spatial-dataset.contract';
|
|
3
|
+
import type { SpatialColorBy } from '../../contracts/display-types';
|
|
4
|
+
import type { OmicsGrouping } from '../../implementations/plotly/omics-trace-builders';
|
|
5
|
+
/** What a colour-source load came to. */
|
|
6
|
+
export type ValueLoad =
|
|
7
|
+
/** Nothing to chart: no colour source, or no port. */
|
|
8
|
+
'none'
|
|
9
|
+
/** A categorical column: its counts per category are loaded. */
|
|
10
|
+
| 'categorical'
|
|
11
|
+
/** A gene or numeric column: its values are loaded. */
|
|
12
|
+
| 'continuous'
|
|
13
|
+
/** The load failed; {@link ChartDataModel.notice} says why. */
|
|
14
|
+
| 'failed'
|
|
15
|
+
/** A newer load (or a dataset switch) overtook this one: nothing to do. */
|
|
16
|
+
| 'superseded';
|
|
17
|
+
/** What the renderer draws from: everything loaded for the current dataset. */
|
|
18
|
+
export interface ChartData {
|
|
19
|
+
/** The colour source's values, when it is continuous. */
|
|
20
|
+
values: Float32Array | null;
|
|
21
|
+
/** The colour source's categories, when it is a categorical column. */
|
|
22
|
+
categorical: OmicsGrouping | null;
|
|
23
|
+
/** The grouping column the violin, box and heatmap split by. */
|
|
24
|
+
grouping: OmicsGrouping | null;
|
|
25
|
+
groupBy: string | null;
|
|
26
|
+
/** The heatmap's genes that have their vectors, in row order. */
|
|
27
|
+
heatmapRows: {
|
|
28
|
+
name: string;
|
|
29
|
+
values: Float32Array;
|
|
30
|
+
}[];
|
|
31
|
+
/** The drawn embedding's coordinates, once loaded. */
|
|
32
|
+
embeddingCoords: SpatialEmbedding | null;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* The data the spatial charts draw, and its loading: the colour source's vector (or its
|
|
36
|
+
* categories), the grouping column, the heatmap's gene vectors, and the embedding's
|
|
37
|
+
* coordinates.
|
|
38
|
+
*
|
|
39
|
+
* Each load has its OWN {@link Supersede}: on one shared counter a redraw for a selection
|
|
40
|
+
* change dropped a pending colour-source load (SPATIAL-2), and a busy flag per load, since
|
|
41
|
+
* a shared one was left set by whichever load lost its race. A dataset switch
|
|
42
|
+
* ({@link onDatasetChanged}) cancels all of them together and drops every vector, because
|
|
43
|
+
* each is indexed by the previous dataset's observations (SPATIAL-1).
|
|
44
|
+
*
|
|
45
|
+
* Plain class: the component asks it to load, then renders {@link snapshot}.
|
|
46
|
+
*/
|
|
47
|
+
export declare class ChartDataModel {
|
|
48
|
+
/** Categorical column the violin/box (and heatmap) split by; null = one trace for all. */
|
|
49
|
+
groupBy: string | null;
|
|
50
|
+
groupOptions: {
|
|
51
|
+
label: string;
|
|
52
|
+
value: string | null;
|
|
53
|
+
}[];
|
|
54
|
+
/**
|
|
55
|
+
* Genes the heatmap's rows are. Local rather than in `SpatialViewState`, as the chart
|
|
56
|
+
* kind is: this is what the panel is charting, not what the map is drawing.
|
|
57
|
+
*/
|
|
58
|
+
heatmapGenes: string[];
|
|
59
|
+
geneOptions: {
|
|
60
|
+
label: string;
|
|
61
|
+
value: string;
|
|
62
|
+
}[];
|
|
63
|
+
/** Embeddings to offer, and which of them is drawn. */
|
|
64
|
+
embeddings: SpatialEmbeddingMeta[];
|
|
65
|
+
embedding: SpatialEmbeddingMeta | null;
|
|
66
|
+
embeddingCoords: SpatialEmbedding | null;
|
|
67
|
+
/** Set when something cannot be charted, for an inline hint. */
|
|
68
|
+
notice: string | null;
|
|
69
|
+
private values;
|
|
70
|
+
/** Set instead of `values` when the colour source is a categorical column: its
|
|
71
|
+
* distribution is counts per category, not a histogram of its codes. */
|
|
72
|
+
private categorical;
|
|
73
|
+
private grouping;
|
|
74
|
+
/** Every gene the dataset inlined. `geneOptions` is only ever the best few hundred of
|
|
75
|
+
* these — see `gene-search.ts` for why a whole-transcriptome list cannot be handed to
|
|
76
|
+
* the control whole. */
|
|
77
|
+
private geneNames;
|
|
78
|
+
/** What is typed in the picker's filter box, so the options can be rebuilt when the
|
|
79
|
+
* selection changes without losing the query. */
|
|
80
|
+
private geneQuery;
|
|
81
|
+
/** Fetched vectors by gene name, so adding a fourth gene does not refetch the first
|
|
82
|
+
* three — each is a full per-observation Float32Array. */
|
|
83
|
+
private readonly geneCache;
|
|
84
|
+
private valueBusy;
|
|
85
|
+
private heatmapBusy;
|
|
86
|
+
private embeddingBusy;
|
|
87
|
+
/** Guards the colour-source fetch: a fast colour-source change can resolve out of order,
|
|
88
|
+
* and a stale vector would be charted against the new label. */
|
|
89
|
+
private readonly valueLoad;
|
|
90
|
+
/** The same for the grouping, which the user can change as fast. */
|
|
91
|
+
private readonly groupLoad;
|
|
92
|
+
private readonly heatmapLoad;
|
|
93
|
+
private readonly embeddingLoad;
|
|
94
|
+
/** The dataset the loaded vectors belong to; `undefined` before the first. */
|
|
95
|
+
private datasetId;
|
|
96
|
+
/** A load is in flight. */
|
|
97
|
+
get busy(): boolean;
|
|
98
|
+
/** Whether the colour source is a categorical column (with its categories loaded). */
|
|
99
|
+
get isCategorical(): boolean;
|
|
100
|
+
/** Whether a grouping column's categories are loaded. */
|
|
101
|
+
get hasGrouping(): boolean;
|
|
102
|
+
/** What the renderer draws from. */
|
|
103
|
+
snapshot(): ChartData;
|
|
104
|
+
/**
|
|
105
|
+
* A dataset emission: its grouping columns, gene names and the embeddings to offer.
|
|
106
|
+
*
|
|
107
|
+
* @returns true when this is a SWITCH from another dataset. Every vector loaded so far is
|
|
108
|
+
* then dropped and every load still running for the old dataset cancelled; the caller
|
|
109
|
+
* must reload the colour source (and the grouping), because a port may go straight from
|
|
110
|
+
* one dataset to the next with a colour source of the same name, so the view need not
|
|
111
|
+
* re-emit.
|
|
112
|
+
*/
|
|
113
|
+
onDatasetChanged(dataset: SpatialDataset | null, categoricalColumns: readonly string[], embeddings: SpatialEmbeddingMeta[]): boolean;
|
|
114
|
+
/** Fetch the colour source's vector — or, for a categorical column, its categories. */
|
|
115
|
+
loadValues(controls: ISpatialControls | null, source: SpatialColorBy | null): Promise<ValueLoad>;
|
|
116
|
+
/**
|
|
117
|
+
* Group by `name` (null for none), fetching its categories.
|
|
118
|
+
*
|
|
119
|
+
* @returns false when a later choice overtook this one — sequenced, because picking A
|
|
120
|
+
* then B with a slower A would otherwise chart A's categories under a dropdown that
|
|
121
|
+
* says B. A failure falls back to no grouping.
|
|
122
|
+
*/
|
|
123
|
+
loadGrouping(controls: ISpatialControls | null, name: string | null): Promise<boolean>;
|
|
124
|
+
/** The heatmap's rows. Chosen genes stay among the options, or the control cannot label
|
|
125
|
+
* its chips. */
|
|
126
|
+
setHeatmapGenes(names: string[] | null): void;
|
|
127
|
+
/** The gene picker's filter box changed: search the resident names, show the best. */
|
|
128
|
+
filterGenes(query: string | null): void;
|
|
129
|
+
/**
|
|
130
|
+
* Fetch any gene the heatmap needs and does not already hold.
|
|
131
|
+
*
|
|
132
|
+
* Sequenced: each vector is a separate request, and a slower one must not paint rows
|
|
133
|
+
* for a gene list the user has already moved on from — nor land in the cache of a
|
|
134
|
+
* dataset it was not fetched for.
|
|
135
|
+
*/
|
|
136
|
+
loadHeatmapGenes(controls: ISpatialControls | null): Promise<void>;
|
|
137
|
+
/** Draw `name` next, when the dataset offers it. @returns whether the choice changed. */
|
|
138
|
+
selectEmbedding(name: string): boolean;
|
|
139
|
+
/**
|
|
140
|
+
* The coordinates for `meta`: kept when already loaded, else fetched — sequenced, as a
|
|
141
|
+
* slower round-trip must not paint over an embedding the user has already moved on from.
|
|
142
|
+
*
|
|
143
|
+
* @returns whether they are ready to draw ('failed' has set {@link notice}).
|
|
144
|
+
*/
|
|
145
|
+
loadEmbedding(getEmbedding: (name: string) => Promise<SpatialEmbedding>, meta: SpatialEmbeddingMeta): Promise<'ready' | 'failed' | 'superseded'>;
|
|
146
|
+
/**
|
|
147
|
+
* Supersede any embedding load in flight without starting one — for a draw that needs
|
|
148
|
+
* no fetch (computed here, or still to be computed), which a slower fetch must not
|
|
149
|
+
* overwrite.
|
|
150
|
+
*/
|
|
151
|
+
supersedeEmbeddingLoad(): void;
|
|
152
|
+
private refreshGeneOptions;
|
|
153
|
+
}
|