@jax-data-science/sci-image-visualizer 0.8.3 → 0.10.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 +34 -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/image.contract.mjs +1 -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/region-store.contract.mjs +1 -1
- package/esm2022/lib/contracts/sam.contract.mjs +1 -1
- package/esm2022/lib/contracts/section-view.contract.mjs +2 -0
- 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/loft.mjs +128 -0
- package/esm2022/lib/geometry/polylabel.mjs +156 -0
- package/esm2022/lib/geometry/raster.mjs +98 -0
- package/esm2022/lib/geometry/reconstruct.mjs +315 -0
- package/esm2022/lib/geometry/reslice-image.mjs +57 -0
- package/esm2022/lib/geometry/ring.mjs +201 -0
- package/esm2022/lib/geometry/section.mjs +215 -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 +12 -9
- package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +83 -0
- package/esm2022/lib/implementations/napari-js/napari-region-mesh-pointer.mjs +100 -0
- package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +180 -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 +270 -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 +347 -0
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +427 -4207
- package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +129 -0
- package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +550 -0
- package/esm2022/lib/implementations/napari-js/napari-volume-slice-planes.mjs +103 -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 +194 -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 +164 -0
- package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +213 -716
- 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 +134 -0
- package/esm2022/lib/models/region-clone.mjs +68 -0
- package/esm2022/lib/models/region-geojson.mjs +411 -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/class-tree/class-tree.component.mjs +156 -0
- package/esm2022/lib/region-editor/class-tree/class-tree.mjs +108 -0
- package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +163 -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 +896 -660
- package/esm2022/lib/region-editor/region-metrics.mjs +86 -0
- package/esm2022/lib/region-editor/region-persistence.service.mjs +160 -0
- package/esm2022/lib/region-editor/region-table/region-table.component.mjs +169 -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/region-source-layer.mjs +378 -0
- package/esm2022/lib/region-overlay/region-style.mjs +97 -0
- package/esm2022/lib/region-overlay/svg-region-renderer.mjs +228 -0
- package/esm2022/lib/region-source/http-region-source.mjs +104 -0
- package/esm2022/lib/region-source/region-source-ops.mjs +53 -0
- package/esm2022/lib/region-source/region-source-worker.mjs +10 -0
- package/esm2022/lib/region-source/region-source.mjs +67 -0
- package/esm2022/lib/region-source/region-tiles.mjs +708 -0
- package/esm2022/lib/region-source/worker-region-source.mjs +229 -0
- package/esm2022/lib/render-orchestrator.mjs +14 -11
- package/esm2022/lib/render-session.mjs +207 -0
- package/esm2022/lib/routing-visualizer.service.mjs +858 -414
- package/esm2022/lib/section-pane/section-pane.component.mjs +299 -0
- 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 +53 -5
- package/esm2022/lib/store/class-signatures.mjs +63 -0
- package/esm2022/lib/store/region-history.mjs +146 -0
- package/esm2022/lib/store/region-scope-cache.mjs +144 -0
- package/esm2022/lib/store/region-selection.mjs +82 -0
- package/esm2022/lib/store/region-source-scope.mjs +171 -0
- package/esm2022/lib/store/region-store.service.mjs +986 -670
- package/esm2022/lib/store/spatial-selection.service.mjs +2 -2
- package/esm2022/lib/store/visualizer-store.service.mjs +81 -76
- 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 +120 -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 +121 -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 +84 -119
- 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 +123 -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/volume-sections.mjs +175 -0
- package/esm2022/lib/visualizer.component.mjs +602 -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-BKQhpbHv.mjs +47169 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BKQhpbHv.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-z1IN-F7w.mjs +238 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-z1IN-F7w.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.mjs +12 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.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/region-source.worker.js +1067 -0
- package/fesm2022/spatial-math.worker.js +471 -0
- package/fesm2022/tsne.worker.js +32 -15
- package/index.d.ts +19 -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/image.contract.d.ts +4 -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 +85 -1
- package/lib/contracts/region-overlay.contract.d.ts +5 -0
- package/lib/contracts/region-store.contract.d.ts +22 -0
- package/lib/contracts/sam.contract.d.ts +7 -0
- package/lib/contracts/section-view.contract.d.ts +44 -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 +231 -54
- package/lib/contracts/viz-config.d.ts +9 -0
- package/lib/geometry/contour.d.ts +24 -0
- package/lib/geometry/loft.d.ts +22 -0
- package/lib/geometry/polylabel.d.ts +23 -0
- package/lib/geometry/raster.d.ts +42 -0
- package/lib/geometry/reconstruct.d.ts +54 -0
- package/lib/geometry/reslice-image.d.ts +33 -0
- package/lib/geometry/ring.d.ts +67 -0
- package/lib/geometry/section.d.ts +52 -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 +4 -3
- package/lib/implementations/napari-js/napari-loading-state.d.ts +37 -0
- package/lib/implementations/napari-js/napari-region-mesh-pointer.d.ts +32 -0
- package/lib/implementations/napari-js/napari-region-overlay.d.ts +68 -71
- package/lib/implementations/napari-js/napari-scene.d.ts +126 -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 +91 -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 +169 -883
- package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +66 -0
- package/lib/implementations/napari-js/napari-volume-scene.d.ts +148 -0
- package/lib/implementations/napari-js/napari-volume-slice-planes.d.ts +43 -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 +38 -0
- package/lib/implementations/osd/osd-region-overlay.d.ts +46 -51
- 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 +83 -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 +25 -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 +45 -0
- package/lib/models/region-clone.d.ts +20 -0
- package/lib/models/region-geojson.d.ts +57 -0
- package/lib/models/region.d.ts +59 -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/class-tree/class-tree.component.d.ts +78 -0
- package/lib/region-editor/class-tree/class-tree.d.ts +31 -0
- package/lib/region-editor/classes-panel/classes-panel.component.d.ts +86 -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 +283 -200
- package/lib/region-editor/region-metrics.d.ts +34 -0
- package/lib/region-editor/region-persistence.service.d.ts +77 -0
- package/lib/region-editor/region-table/region-table.component.d.ts +89 -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 +158 -0
- package/lib/region-overlay/region-hit-test.d.ts +38 -0
- package/lib/region-overlay/region-source-layer.d.ts +96 -0
- package/lib/region-overlay/region-style.d.ts +52 -0
- package/lib/region-overlay/svg-region-renderer.d.ts +110 -0
- package/lib/region-source/http-region-source.d.ts +45 -0
- package/lib/region-source/region-source-ops.d.ts +89 -0
- package/lib/region-source/region-source-worker.d.ts +7 -0
- package/lib/region-source/region-source.d.ts +82 -0
- package/lib/region-source/region-tiles.d.ts +289 -0
- package/lib/region-source/worker-region-source.d.ts +65 -0
- package/lib/render-orchestrator.d.ts +6 -2
- package/lib/render-session.d.ts +75 -0
- package/lib/routing-visualizer.service.d.ts +248 -59
- package/lib/section-pane/section-pane.component.d.ts +47 -0
- 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 +39 -2
- package/lib/store/class-signatures.d.ts +11 -0
- package/lib/store/region-history.d.ts +66 -0
- package/lib/store/region-scope-cache.d.ts +65 -0
- package/lib/store/region-selection.d.ts +36 -0
- package/lib/store/region-source-scope.d.ts +68 -0
- package/lib/store/region-store.service.d.ts +312 -116
- package/lib/store/visualizer-store.service.d.ts +32 -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 +62 -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 +51 -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 +55 -84
- 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 +46 -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/volume-sections.d.ts +64 -0
- package/lib/visualizer.component.d.ts +232 -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/assets/slice.svg +23 -0
- 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
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { AfterViewInit, EventEmitter, NgZone, OnChanges, OnDestroy } from '@angular/core';
|
|
2
|
+
import type { SectionAxis, SectionView } from '../contracts/section-view.contract';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export declare class SectionPaneComponent implements AfterViewInit, OnChanges, OnDestroy {
|
|
5
|
+
private readonly zone;
|
|
6
|
+
axis: SectionAxis;
|
|
7
|
+
view: SectionView | null;
|
|
8
|
+
/** A point clicked, in section coordinates (u across, v down). */
|
|
9
|
+
readonly pick: EventEmitter<{
|
|
10
|
+
u: number;
|
|
11
|
+
v: number;
|
|
12
|
+
}>;
|
|
13
|
+
private canvasRef;
|
|
14
|
+
private zoom;
|
|
15
|
+
private pan;
|
|
16
|
+
private press;
|
|
17
|
+
private image;
|
|
18
|
+
private resize?;
|
|
19
|
+
private frame;
|
|
20
|
+
constructor(zone: NgZone);
|
|
21
|
+
protected get axisColor(): string;
|
|
22
|
+
protected get label(): string;
|
|
23
|
+
ngAfterViewInit(): void;
|
|
24
|
+
ngOnChanges(): void;
|
|
25
|
+
ngOnDestroy(): void;
|
|
26
|
+
/** Back to the whole section, centred. */
|
|
27
|
+
fit(): void;
|
|
28
|
+
protected onWheel(e: WheelEvent): void;
|
|
29
|
+
protected onDown(e: PointerEvent): void;
|
|
30
|
+
protected onMove(e: PointerEvent): void;
|
|
31
|
+
protected onUp(e: PointerEvent): void;
|
|
32
|
+
private local;
|
|
33
|
+
/** Section units → CSS px in the pane: scale per unit across and down, and the origin. */
|
|
34
|
+
private transform;
|
|
35
|
+
private toSection;
|
|
36
|
+
/** Redraw on the next frame (outside Angular: a canvas paint needs no change detection). */
|
|
37
|
+
private draw;
|
|
38
|
+
private paint;
|
|
39
|
+
/** Each class's cut: its outlines filled and stroked, its lines drawn (a dot for one point). */
|
|
40
|
+
private paintRegions;
|
|
41
|
+
/** The other planes: across (u) and down (v), dashed in their axis colours. */
|
|
42
|
+
private paintCrosshair;
|
|
43
|
+
/** The section's image on a canvas of its own size (made again only for a new image). */
|
|
44
|
+
private imageCanvas;
|
|
45
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<SectionPaneComponent, never>;
|
|
46
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<SectionPaneComponent, "viz-section-pane", never, { "axis": { "alias": "axis"; "required": true; }; "view": { "alias": "view"; "required": false; }; }, { "pick": "pick"; }, never, never, true, never>;
|
|
47
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The transcript-density raster's window. Its default colour scale is matplotlib's
|
|
3
|
+
* inferno (`INFERNO_LUT` from napari-js/colormaps), as in Xenium Explorer.
|
|
4
|
+
*/
|
|
5
|
+
/** A density window from the non-empty bins: 1st to 99th percentile. */
|
|
6
|
+
export declare function densityAutoRange(values: ArrayLike<number>): [number, number];
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { BehaviorSubject } from 'rxjs';
|
|
2
|
+
import type { SpatialEmbedding, SpatialEmbeddingMeta } from '../contracts/spatial-dataset.contract';
|
|
3
|
+
/** Where a browser-side embedding computation stands, for the progress bar and messages. */
|
|
4
|
+
export interface EmbeddingComputeState {
|
|
5
|
+
/** True while a run is going. */
|
|
6
|
+
running: boolean;
|
|
7
|
+
/** 0..1 while running, or null before the first report. */
|
|
8
|
+
fraction: number | null;
|
|
9
|
+
/** Which backend the worker got — 'webgpu', 'wasm' or 'cpu'. */
|
|
10
|
+
backend: string | null;
|
|
11
|
+
message: string | null;
|
|
12
|
+
error: string | null;
|
|
13
|
+
}
|
|
14
|
+
/** Where the PCA scores come from: a port that serves embeddings by name. */
|
|
15
|
+
export type EmbeddingSource = (name: string) => Promise<SpatialEmbedding>;
|
|
16
|
+
/**
|
|
17
|
+
* Largest dataset a t-SNE is offered for in the browser.
|
|
18
|
+
*
|
|
19
|
+
* t-SNE is O(N²) per iteration — vectorised on the GPU, but not approximated — so the cost
|
|
20
|
+
* is quadratic in observations. Measured end to end in Firefox on WebGPU: 2,688 points took
|
|
21
|
+
* 95 s. That scales to roughly five and a half minutes at this threshold, and to about 76
|
|
22
|
+
* minutes at seqFISH's 19,416, which was also measured offline.
|
|
23
|
+
*
|
|
24
|
+
* Past this the option is WITHDRAWN rather than offered with a warning. An hour-long job
|
|
25
|
+
* started from a button is not a choice a reader can meaningfully consent to in a dialog,
|
|
26
|
+
* and a t-SNE that large belongs in the offline pipeline, where it can run once and be
|
|
27
|
+
* served to everyone.
|
|
28
|
+
*/
|
|
29
|
+
export declare const BROWSER_TSNE_MAX_OBSERVATIONS = 5000;
|
|
30
|
+
/**
|
|
31
|
+
* A t-SNE the dataset does not publish, offered so it can be computed here.
|
|
32
|
+
*
|
|
33
|
+
* A dropped-in `.h5ad` typically carries one UMAP and a PCA, and no t-SNE — the two views
|
|
34
|
+
* answer different questions, so having only one is a real gap. Computing it needs no
|
|
35
|
+
* expression data: t-SNE runs on the PCA scores, which is why this can happen in the
|
|
36
|
+
* browser at all while PCA cannot.
|
|
37
|
+
*/
|
|
38
|
+
export declare const COMPUTABLE_EMBEDDINGS: readonly SpatialEmbeddingMeta[];
|
|
39
|
+
/** Roughly how long a t-SNE of `n` observations takes, in seconds, from the measured anchor. */
|
|
40
|
+
export declare function tsneEstimateSeconds(n: number): number;
|
|
41
|
+
/** A duration as something to put on a button: `~42s`, `~6 min`. */
|
|
42
|
+
export declare function estimateLabel(seconds: number): string;
|
|
43
|
+
/**
|
|
44
|
+
* The browser-side embedding computation behind the charts' Embedding tab: which
|
|
45
|
+
* embeddings to offer for a dataset, the t-SNE run itself (PCA scores from the port, then a
|
|
46
|
+
* worker), its progress, and the results computed this session.
|
|
47
|
+
*
|
|
48
|
+
* A run is several awaits long — the PCA scores arrive over HTTP, then the worker takes a
|
|
49
|
+
* minute or more — and the dataset can change at any of them, including before the run
|
|
50
|
+
* exists to be terminated. Every await is checked against a {@link Supersede} that a
|
|
51
|
+
* dataset switch ({@link setDataset}) or teardown ({@link abandon}) cancels, so the scores
|
|
52
|
+
* fetched for one dataset are never embedded and drawn over another's observations.
|
|
53
|
+
*
|
|
54
|
+
* Plain class: the owner renders {@link state} (or {@link state$}).
|
|
55
|
+
*/
|
|
56
|
+
export declare class EmbeddingComputeCoordinator {
|
|
57
|
+
readonly state$: BehaviorSubject<EmbeddingComputeState>;
|
|
58
|
+
/** True when a t-SNE is missing but the dataset is too big to embed here. */
|
|
59
|
+
tooLarge: boolean;
|
|
60
|
+
/** Observations in the live dataset, kept for the cost estimate. */
|
|
61
|
+
observationCount: number;
|
|
62
|
+
/** Coordinates computed in this browser, by name. Not persisted: a reload recomputes. */
|
|
63
|
+
private readonly computed;
|
|
64
|
+
/** The live run, when one is going. */
|
|
65
|
+
private run;
|
|
66
|
+
private readonly load;
|
|
67
|
+
get state(): EmbeddingComputeState;
|
|
68
|
+
get running(): boolean;
|
|
69
|
+
/**
|
|
70
|
+
* A new dataset: drop everything computed or computing for the previous one, and return
|
|
71
|
+
* the embeddings to offer — the published ones, plus a t-SNE to compute where the dataset
|
|
72
|
+
* has a PCA to embed, no t-SNE of its own, and is small enough. Otherwise the menu would
|
|
73
|
+
* advertise work that cannot start, or duplicate what is already served.
|
|
74
|
+
*/
|
|
75
|
+
setDataset(published: readonly SpatialEmbeddingMeta[], observationCount: number): SpatialEmbeddingMeta[];
|
|
76
|
+
/** Whether `meta` is one this browser would have to compute. */
|
|
77
|
+
isComputable(meta: SpatialEmbeddingMeta | null): boolean;
|
|
78
|
+
/** Whether `meta` has already been computed this session. */
|
|
79
|
+
isComputed(meta: SpatialEmbeddingMeta | null): boolean;
|
|
80
|
+
/** The coordinates computed for `name`, if any. */
|
|
81
|
+
result(name: string): SpatialEmbedding | undefined;
|
|
82
|
+
/** Roughly how long a run would take here, in seconds. Shown before the click: a progress
|
|
83
|
+
* bar tells you a job is going; only an estimate tells you whether to start it. */
|
|
84
|
+
get estimateSeconds(): number;
|
|
85
|
+
/** {@link estimateSeconds} as something to put on a button. */
|
|
86
|
+
get estimateLabel(): string;
|
|
87
|
+
/** Why the option is absent, when a dataset is past the threshold. */
|
|
88
|
+
get tooLargeNote(): string;
|
|
89
|
+
/**
|
|
90
|
+
* Compute `meta` here, in a worker, from the dataset's PCA among `embeddings`.
|
|
91
|
+
*
|
|
92
|
+
* The PCA scores come from the port as an ordinary embedding — the server derives them,
|
|
93
|
+
* because PCA needs the whole expression matrix (185 MB for a Visium dataset) while
|
|
94
|
+
* t-SNE needs only the scores (0.51 MB). Sending the matrix to the browser to save a few
|
|
95
|
+
* seconds of arithmetic would be a far slower answer.
|
|
96
|
+
*
|
|
97
|
+
* @returns the coordinates, to draw — or null when there is nothing to draw: cancelled,
|
|
98
|
+
* abandoned, failed (see {@link state}), or already running.
|
|
99
|
+
*/
|
|
100
|
+
start(meta: SpatialEmbeddingMeta, embeddings: readonly SpatialEmbeddingMeta[], getEmbedding: EmbeddingSource): Promise<SpatialEmbedding | null>;
|
|
101
|
+
/** The user's Cancel: ask the worker to stop. The run settles shortly after, with nothing. */
|
|
102
|
+
cancel(): void;
|
|
103
|
+
/**
|
|
104
|
+
* Drop any computation in progress, because what it is computing no longer applies.
|
|
105
|
+
*
|
|
106
|
+
* Distinct from {@link cancel}: this does not wait — the run is settled and the worker
|
|
107
|
+
* killed, so a dataset switch or a teardown cannot leave a t-SNE grinding on in the
|
|
108
|
+
* background over observations nothing is showing any more.
|
|
109
|
+
*/
|
|
110
|
+
abandon(): void;
|
|
111
|
+
private patch;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* The dataset's PCA, as row-major scores.
|
|
115
|
+
*
|
|
116
|
+
* Assembled from whichever PCA the source offers, widest first — a 3-D one gives t-SNE
|
|
117
|
+
* three components instead of two for the same request.
|
|
118
|
+
*/
|
|
119
|
+
export declare function loadPcaScores(embeddings: readonly SpatialEmbeddingMeta[], getEmbedding: EmbeddingSource): Promise<{
|
|
120
|
+
scores: Float32Array;
|
|
121
|
+
nObs: number;
|
|
122
|
+
nDims: number;
|
|
123
|
+
} | null>;
|
|
@@ -18,6 +18,7 @@ export interface ComputeProgress {
|
|
|
18
18
|
backend: string | null;
|
|
19
19
|
message: string | null;
|
|
20
20
|
}
|
|
21
|
+
/** One t-SNE to compute: the PCA scores to embed and the run's parameters. */
|
|
21
22
|
export interface ComputeRequest {
|
|
22
23
|
/** PCA scores, row-major `nObs x nDims`. */
|
|
23
24
|
scores: Float32Array;
|
|
@@ -28,12 +29,30 @@ export interface ComputeRequest {
|
|
|
28
29
|
iterations?: number;
|
|
29
30
|
seed?: number;
|
|
30
31
|
}
|
|
31
|
-
/**
|
|
32
|
-
|
|
32
|
+
/**
|
|
33
|
+
* Factory, so a test can supply a worker without a bundler. May be asynchronous, as the
|
|
34
|
+
* default one is: it imports the worker module on demand.
|
|
35
|
+
*/
|
|
36
|
+
export type WorkerFactory = () => Worker | Promise<Worker>;
|
|
37
|
+
/**
|
|
38
|
+
* One t-SNE run in its own worker: start it, follow its progress, cancel it. Single use —
|
|
39
|
+
* a new computation takes a new run.
|
|
40
|
+
*/
|
|
33
41
|
export declare class EmbeddingComputeRun {
|
|
34
42
|
private readonly factory?;
|
|
35
43
|
private worker;
|
|
36
44
|
private settled;
|
|
45
|
+
/**
|
|
46
|
+
* Between `run()` being called and the worker existing.
|
|
47
|
+
*
|
|
48
|
+
* The default factory imports the worker module first, and a dataset switch or a
|
|
49
|
+
* teardown can call {@link terminate} in that window. With no worker yet there is
|
|
50
|
+
* nothing to kill, so terminating bumps {@link generation} instead and the run stops
|
|
51
|
+
* itself the moment the worker arrives, before posting it any work.
|
|
52
|
+
*/
|
|
53
|
+
private starting;
|
|
54
|
+
/** Bumped by {@link terminate}; a run that finds it changed across its await gives up. */
|
|
55
|
+
private generation;
|
|
37
56
|
/**
|
|
38
57
|
* Settles a run that is still waiting, set for as long as one is.
|
|
39
58
|
*
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transcript "icon" mode: the marker shapes, and their outlines for the panel's previews.
|
|
3
|
+
* The napari view draws them as napari-js point symbols (`GLYPH_SYMBOLS` in
|
|
4
|
+
* `spatial-tiles/transcript-layers.ts`), with these outlines' proportions.
|
|
5
|
+
*/
|
|
6
|
+
/** Marker shapes for the transcript "icon" mode. */
|
|
7
|
+
export declare const TRANSCRIPT_GLYPHS: readonly ["circle", "star", "triangle", "square", "diamond", "cross", "hexagon", "triangle-down", "pentagon", "x"];
|
|
8
|
+
/** One of the marker shapes in {@link TRANSCRIPT_GLYPHS}. */
|
|
9
|
+
export type TranscriptGlyph = (typeof TRANSCRIPT_GLYPHS)[number];
|
|
10
|
+
/**
|
|
11
|
+
* Unit outline of a glyph, radius ≈ 1, centred on the origin, as `[x0, y0, x1, y1, …]` — the
|
|
12
|
+
* panel's preview of the point symbol the canvas draws.
|
|
13
|
+
*/
|
|
14
|
+
export declare function glyphOutline(glyph: TranscriptGlyph): Float32Array;
|
|
15
|
+
/** The glyph a gene gets by default: by its position in the selected list. */
|
|
16
|
+
export declare function defaultGlyphFor(slot: number): TranscriptGlyph;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Level-of-detail planning for tiled spatial geometry — cell outlines and transcripts.
|
|
3
|
+
*
|
|
4
|
+
* The renderer knows its camera (a world-space centre, a zoom in canvas pixels per world
|
|
5
|
+
* unit, a canvas size); a tiled dataset knows its grids (one per level, in observation
|
|
6
|
+
* units). This module is the bridge: which level the zoom calls for and which tiles are on
|
|
7
|
+
* screen. Everything here is pure, so the policy — the part that decides whether the view
|
|
8
|
+
* is fast and legible — is testable without a GPU.
|
|
9
|
+
*
|
|
10
|
+
* Observation units map onto world units through the dataset's `imageRef` affine
|
|
11
|
+
* (`world = data · scale + translate`), so "pixels per observation unit" is
|
|
12
|
+
* `zoom · scale`. For a Xenium bundle the data unit is the micron and the world unit the
|
|
13
|
+
* morphology pixel.
|
|
14
|
+
*/
|
|
15
|
+
import type { SpatialBounds, SpatialDataset, SpatialImageRef, SpatialTileLevel } from '../contracts/spatial-dataset.contract';
|
|
16
|
+
import type { SpatialViewState } from '../contracts/display-types';
|
|
17
|
+
/** A rectangle in observation coordinates. */
|
|
18
|
+
export interface DataRect {
|
|
19
|
+
x0: number;
|
|
20
|
+
y0: number;
|
|
21
|
+
x1: number;
|
|
22
|
+
y1: number;
|
|
23
|
+
}
|
|
24
|
+
/** Tile address. */
|
|
25
|
+
export interface TileKey {
|
|
26
|
+
level: number;
|
|
27
|
+
gx: number;
|
|
28
|
+
gy: number;
|
|
29
|
+
}
|
|
30
|
+
/** Whether cell outlines are drawn: the user's choice, else on when the dataset has any. */
|
|
31
|
+
export declare function cellsShown(dataset: Pick<SpatialDataset, 'polygonTiles' | 'polygons'> | null, view: Pick<SpatialViewState, 'showCells'>): boolean;
|
|
32
|
+
/** A column holding a hand-curated cell-type annotation, by naming convention. */
|
|
33
|
+
export declare function isCuratedColumn(name: string): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* The categorical column that names each cell's type: the view's choice when it is a
|
|
36
|
+
* column of this dataset, else the first categorical column that is not a curated
|
|
37
|
+
* annotation (a pipeline's clustering is the default; curation is opted into), else
|
|
38
|
+
* any categorical column.
|
|
39
|
+
*/
|
|
40
|
+
export declare function cellTypeColumnFor(dataset: SpatialDataset, view: Pick<SpatialViewState, 'cellTypeColumn'>): string | null;
|
|
41
|
+
/** A stable string id for a tile key, `level/gx/gy` — usable as a Map key. */
|
|
42
|
+
export declare function tileId(k: TileKey): string;
|
|
43
|
+
/** Canvas pixels per observation unit along x, for a camera zoom and a data→world affine. */
|
|
44
|
+
export declare function pixelsPerDataUnit(zoom: number, ref?: SpatialImageRef | null): number;
|
|
45
|
+
/**
|
|
46
|
+
* The part of observation space the camera shows, padded by `margin` (a fraction of the
|
|
47
|
+
* viewport) so tiles just off screen are already there when a pan brings them in: napari-js's
|
|
48
|
+
* `worldViewport`, mapped back through the inverse of the data→world affine.
|
|
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
|
+
* Tile `g` covers `[g·s, (g+1)·s)`. The view's far edge is open — a tile starting exactly
|
|
57
|
+
* at `rect.x1` shows nothing — but the bounds' far edge is closed: the bounds are the
|
|
58
|
+
* extreme observations' coordinates, so one sits exactly on `bounds[2]`, in the tile
|
|
59
|
+
* starting there.
|
|
60
|
+
*/
|
|
61
|
+
export declare function tilesInRect(rect: DataRect, level: number, levels: readonly SpatialTileLevel[], bounds?: SpatialBounds | null, limit?: number): TileKey[];
|
|
62
|
+
/** {@link tilesInRect} for a grid whose tile (0, 0) starts at `origin`. */
|
|
63
|
+
export declare function tilesInRectFrom(origin: readonly [number, number], rect: DataRect, level: number, levels: readonly SpatialTileLevel[], bounds?: SpatialBounds | null, limit?: number): TileKey[];
|
|
64
|
+
/** Area of `rect` inside `bounds` (the whole rect when there are none). */
|
|
65
|
+
export declare function visibleArea(rect: DataRect, bounds?: SpatialBounds | null): number;
|
|
66
|
+
/**
|
|
67
|
+
* Typical cell diameter, in observation units, used to judge how large cells appear.
|
|
68
|
+
* Derived from the per-observation radius when there is one; 12 µm otherwise.
|
|
69
|
+
*/
|
|
70
|
+
export declare function typicalCellDiameter(radius: Float32Array | number | undefined, fallback?: number): number;
|
|
71
|
+
/**
|
|
72
|
+
* On-screen cell diameter (px) at or above which each polygon level is used. A level
|
|
73
|
+
* halves the vertices of the one below, so each should take over when the cell is about
|
|
74
|
+
* half as large on screen. Below the last finite threshold outlines are not drawn at
|
|
75
|
+
* all — a cell a few pixels wide is a dot, and the observation markers already draw it
|
|
76
|
+
* as one.
|
|
77
|
+
*
|
|
78
|
+
* Xenium's fourth level (3 vertices per cell) is deliberately never used: seen on
|
|
79
|
+
* screen it is a field of triangles, which reads as an artefact rather than as cells.
|
|
80
|
+
* The dots below 8 px say the same thing more honestly.
|
|
81
|
+
*/
|
|
82
|
+
export declare const POLYGON_LEVEL_MIN_CELL_PX: number[];
|
|
83
|
+
/**
|
|
84
|
+
* Which polygon level suits this zoom, or -1 for "too small to outline".
|
|
85
|
+
* `detail` > 1 prefers finer levels (sharper, slower); < 1 coarser.
|
|
86
|
+
*/
|
|
87
|
+
export declare function polygonLevelFor(pxPerUnit: number, cellDiameter: number, levelCount: number, detail?: number): number;
|
|
88
|
+
/**
|
|
89
|
+
* Which transcript level suits this zoom: the one whose tiles come out closest to
|
|
90
|
+
* `targetTilePx` on screen. Coarser levels aggregate more, so this keeps the number of
|
|
91
|
+
* markers per screen roughly constant however far out the camera is — the property that
|
|
92
|
+
* keeps the view fast.
|
|
93
|
+
*/
|
|
94
|
+
export declare function transcriptLevelFor(pxPerUnit: number, levels: readonly SpatialTileLevel[], targetTilePx?: number): number;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { Observable } from 'rxjs';
|
|
2
|
+
import { PlotType } from '../contracts/plot-type';
|
|
3
|
+
import { SpatialDataPort } from '../contracts/ports/spatial-data.port';
|
|
4
|
+
import { SpatialObservations } from '../contracts/spatial-dataset.contract';
|
|
5
|
+
import { ISpatialControls } from '../contracts/visualizer.contract';
|
|
6
|
+
import { RegionStore } from '../store/region-store.service';
|
|
7
|
+
import { SpatialSelectionStore } from '../store/spatial-selection.service';
|
|
8
|
+
import { VisualizerStore } from '../store/visualizer-store.service';
|
|
9
|
+
/** The renderer-side spatial readouts the controls surface (the napari-js backend). */
|
|
10
|
+
export interface SpatialRendererFeeds {
|
|
11
|
+
readonly transcriptEstimate$: {
|
|
12
|
+
asObservable(): Observable<{
|
|
13
|
+
points: number;
|
|
14
|
+
max: number;
|
|
15
|
+
} | null>;
|
|
16
|
+
};
|
|
17
|
+
readonly geneCountsInView$: {
|
|
18
|
+
asObservable(): Observable<Record<string, number> | null>;
|
|
19
|
+
};
|
|
20
|
+
readonly densityStats$: {
|
|
21
|
+
asObservable(): Observable<{
|
|
22
|
+
lo: number;
|
|
23
|
+
hi: number;
|
|
24
|
+
max: number;
|
|
25
|
+
} | null>;
|
|
26
|
+
};
|
|
27
|
+
/** Observations projected to canvas pixels by the 3D camera, or null when the cloud is not mounted. */
|
|
28
|
+
getSpatialScreenProjection(obs: SpatialObservations): Float32Array | null;
|
|
29
|
+
}
|
|
30
|
+
/** What the facade works over: the shared stores, the renderer feeds and the router's view state. */
|
|
31
|
+
export interface SpatialControlsContext {
|
|
32
|
+
readonly store: VisualizerStore;
|
|
33
|
+
readonly regionStore: RegionStore;
|
|
34
|
+
readonly selectionStore: SpatialSelectionStore;
|
|
35
|
+
readonly napari: SpatialRendererFeeds;
|
|
36
|
+
/** The plot type on screen (the 3D cloud selects in screen space). */
|
|
37
|
+
plotType(): PlotType;
|
|
38
|
+
/** The displayed slice (a volume-backed dataset selects within one section). */
|
|
39
|
+
zIndex(): number;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* The spatial-omics controls (`ISpatialControls`) over a host's `SPATIAL_DATA_PORT`.
|
|
43
|
+
*
|
|
44
|
+
* Backend-neutral: the view state lives in the shared `VisualizerStore` (like the
|
|
45
|
+
* colormap) and the selection in the `SpatialSelectionStore`, so the controls keep
|
|
46
|
+
* working across a plot-type switch and a host can drive them before any backend has
|
|
47
|
+
* mounted. Owns its mirror of the port's dataset — dropping a stale selection and an
|
|
48
|
+
* unsatisfiable colour source when the dataset changes — and the subscription behind
|
|
49
|
+
* it, released by {@link dispose} (review CORE-30).
|
|
50
|
+
*/
|
|
51
|
+
export declare class SpatialControlsFacade {
|
|
52
|
+
private readonly port;
|
|
53
|
+
private readonly ctx;
|
|
54
|
+
/** The controls; one object for the facade's life, so consumers can hold it. */
|
|
55
|
+
readonly controls: ISpatialControls;
|
|
56
|
+
/** Latest dataset, mirrored so `selectFromRegions()` can answer synchronously — it
|
|
57
|
+
* runs from a button click and must not await a round-trip. */
|
|
58
|
+
private dataset;
|
|
59
|
+
private readonly sub;
|
|
60
|
+
constructor(port: SpatialDataPort, ctx: SpatialControlsContext);
|
|
61
|
+
/** Release the port subscription (the router's injector is being destroyed). */
|
|
62
|
+
dispose(): void;
|
|
63
|
+
private build;
|
|
64
|
+
}
|
|
@@ -27,6 +27,7 @@ export interface DensityGrid {
|
|
|
27
27
|
/** World size of one voxel per axis, in the observations' units. */
|
|
28
28
|
voxelSize: [number, number, number];
|
|
29
29
|
}
|
|
30
|
+
/** Kernel and observation subset for a density estimate. */
|
|
30
31
|
export interface DensityOptions {
|
|
31
32
|
/** Kernel σ per axis, in the observations' units. */
|
|
32
33
|
sigma: [number, number, number];
|
|
@@ -44,12 +45,21 @@ export interface DensityOptions {
|
|
|
44
45
|
*/
|
|
45
46
|
export declare function densityGrid(dataset: SpatialDataset, stride?: number, targetLongAxis?: number, zStride?: number): DensityGrid | null;
|
|
46
47
|
/**
|
|
47
|
-
*
|
|
48
|
+
* A normalised 1-D Gaussian kernel of radius `ceil(3σ)` (at least 1), centre at
|
|
49
|
+
* index `radius`.
|
|
50
|
+
*/
|
|
51
|
+
export declare function gaussianKernel(sigma: number): {
|
|
52
|
+
kernel: Float32Array;
|
|
53
|
+
radius: number;
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* In-place separable Gaussian along one axis of a w x h x d field. A 2-D field is
|
|
57
|
+
* the `d = 1` case.
|
|
48
58
|
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
59
|
+
* The ONE blur for every field in this folder: the 2-D gene map, the gene-map
|
|
60
|
+
* volume and the density volumes all smooth through it. Two copies of a separable
|
|
61
|
+
* blur would be two chances to smooth an estimate and its normaliser differently,
|
|
62
|
+
* which is the one thing a Nadaraya-Watson field cannot survive.
|
|
53
63
|
*/
|
|
54
64
|
export declare function blurVolumeAxis(field: Float32Array, w: number, h: number, d: number, axis: 0 | 1 | 2, sigmaVox: number): void;
|
|
55
65
|
/**
|
|
@@ -19,45 +19,16 @@ import { ColormapValue } from '../contracts/display-types';
|
|
|
19
19
|
*
|
|
20
20
|
* COLOUR REPRESENTATION
|
|
21
21
|
* ---------------------
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
* `PointsLayer.faceColor`
|
|
25
|
-
* {@link toRgbaTuples} adapts at the boundary; when the layer accepts a typed
|
|
26
|
-
* array the adapter goes away and the flat buffer is passed straight through.
|
|
22
|
+
* Everything is a flat `Float32Array` of `[r,g,b,a, …]` in 0..1 — one
|
|
23
|
+
* allocation for N points, GPU-upload shaped. napari-js (≥ 0.15)
|
|
24
|
+
* `PointsLayer.faceColor` and `Points3DLayer.colors` take it as is.
|
|
27
25
|
*/
|
|
28
|
-
/**
|
|
26
|
+
/** One RGBA colour, r, g, b, a in 0..1 (napari-js's broadcast colour). */
|
|
29
27
|
export type RGBA = [number, number, number, number];
|
|
30
28
|
/** Neutral grey for observations with no value (NaN, or {@link NO_CATEGORY}). */
|
|
31
29
|
export declare const MISSING_COLOR: Rgb;
|
|
32
30
|
/** Default alpha for muted (background / unselected) points — CosMx-style context. */
|
|
33
31
|
export declare const DEFAULT_MUTED_OPACITY = 0.15;
|
|
34
|
-
/**
|
|
35
|
-
* Largest number of CATEGORIES whose colours survive the 3D points layer's LUT
|
|
36
|
-
* intact.
|
|
37
|
-
*
|
|
38
|
-
* That layer has no per-point RGBA — it maps a per-point SCALAR through a
|
|
39
|
-
* 256-entry colormap LUT — so a categorical palette is encoded as one contiguous
|
|
40
|
-
* block of LUT entries per value. Measured against napari-js, every K in 2..96
|
|
41
|
-
* blocks round-trips exactly and K=97 is the first that does not: 256 texels
|
|
42
|
-
* cannot keep more values apart than that.
|
|
43
|
-
*
|
|
44
|
-
* One of those 96 blocks is spent on {@link NO_CATEGORY}, which every column can
|
|
45
|
-
* contain, so what fits is **95 categories** — the number published here. It was
|
|
46
|
-
* 96 while the encoder rejected at 96, which meant a 96-category column drew flat
|
|
47
|
-
* with the panel showing no warning: the one failure this ceiling exists to
|
|
48
|
-
* prevent, arrived at from the other direction.
|
|
49
|
-
*
|
|
50
|
-
* Above it the cloud draws FLAT rather than draw a lie, because subtly wrong
|
|
51
|
-
* category colours under a confident legend is the failure nobody catches.
|
|
52
|
-
*
|
|
53
|
-
* A limit of that one layer, and of nothing else: the 2D markers carry per-point
|
|
54
|
-
* RGBA, and a density volume is a scalar field per cluster. Shared here so the
|
|
55
|
-
* renderer that enforces it and the panel that explains it cannot drift apart.
|
|
56
|
-
*/
|
|
57
|
-
export declare const SPATIAL_3D_MAX_CATEGORIES = 95;
|
|
58
|
-
/** LUT blocks the 3D layer can keep apart — {@link SPATIAL_3D_MAX_CATEGORIES}
|
|
59
|
-
* plus the one reserved for a missing value. */
|
|
60
|
-
export declare const SPATIAL_3D_LUT_BLOCKS: number;
|
|
61
32
|
/**
|
|
62
33
|
* Fallback categorical palette. Colour-blind-safe and stable, so a category
|
|
63
34
|
* without an authored colour still lands somewhere sensible and lands there
|
|
@@ -73,12 +44,14 @@ interface MuteOptions {
|
|
|
73
44
|
/** `1` at index i mutes observation i. Absent ⇒ nothing is muted. */
|
|
74
45
|
muted?: Uint8Array | null;
|
|
75
46
|
}
|
|
47
|
+
/** Options for {@link encodeCategorical}: a colour per category, plus muting. */
|
|
76
48
|
export interface CategoricalEncodingOptions extends MuteOptions {
|
|
77
49
|
/** Per-category `#rrggbb`, index-aligned with the column's categories. */
|
|
78
50
|
colors: string[];
|
|
79
51
|
/** Colour for {@link NO_CATEGORY}. Default {@link MISSING_COLOR}. */
|
|
80
52
|
missingColor?: Rgb;
|
|
81
53
|
}
|
|
54
|
+
/** Options for {@link encodeContinuous}: a colormap, a contrast window and scaling, plus muting. */
|
|
82
55
|
export interface ContinuousEncodingOptions extends MuteOptions {
|
|
83
56
|
/** 256-entry RGB table from {@link buildColormapLut}. */
|
|
84
57
|
lut: Rgb[];
|
|
@@ -90,8 +63,8 @@ export interface ContinuousEncodingOptions extends MuteOptions {
|
|
|
90
63
|
/** Colour for `NaN`. Default {@link MISSING_COLOR}. */
|
|
91
64
|
missingColor?: Rgb;
|
|
92
65
|
}
|
|
93
|
-
/** Parse `#rgb` / `#rrggbb
|
|
94
|
-
* Exported so the
|
|
66
|
+
/** Parse a CSS colour (`#rgb` / `#rrggbb`, see {@link parseCssColor}) to 0–255 RGB; unparseable
|
|
67
|
+
* input falls back to grey. Exported so the tile layers parse palettes exactly as the markers do. */
|
|
95
68
|
export declare function parseHex(hex: string): Rgb;
|
|
96
69
|
/**
|
|
97
70
|
* Per-category colours: the column's authored `colors` where present (so the
|
|
@@ -110,7 +83,9 @@ export declare function encodeContinuous(values: Float32Array, opts: ContinuousE
|
|
|
110
83
|
* fractions (0.01 / 0.99 clips the extreme 1% at each end).
|
|
111
84
|
*
|
|
112
85
|
* Returns `[0, 1]` for an empty or all-missing vector so callers always get a
|
|
113
|
-
* usable window.
|
|
86
|
+
* usable window. A large vector is windowed from an even sample of it — see
|
|
87
|
+
* `spatial/stats.ts` — because this runs on every recolour, and sorting millions
|
|
88
|
+
* of values each time cost most of a second.
|
|
114
89
|
*/
|
|
115
90
|
export declare function contrastWindow(values: Float32Array, lo?: number, hi?: number): [number, number];
|
|
116
91
|
/**
|
|
@@ -122,14 +97,6 @@ export declare function contrastWindow(values: Float32Array, lo?: number, hi?: n
|
|
|
122
97
|
* often don't); it is in image pixels, like everything else in this space.
|
|
123
98
|
*/
|
|
124
99
|
export declare function markerDiameters(observations: SpatialObservations, fallbackRadius?: number): number | Float32Array;
|
|
125
|
-
/**
|
|
126
|
-
* Adapt a flat RGBA buffer to the `RGBA[]` shape napari-js 0.12.0's
|
|
127
|
-
* `PointsLayer.faceColor` accepts. One 4-element array per point — the reason
|
|
128
|
-
* this is a named boundary rather than inlined: it is the one place the model
|
|
129
|
-
* stops being typed-array shaped, and it is what a future napari-js taking a
|
|
130
|
-
* `Float32Array` would delete.
|
|
131
|
-
*/
|
|
132
|
-
export declare function toRgbaTuples(flat: Float32Array): RGBA[];
|
|
133
100
|
/** Convenience: a 256-entry LUT for a colormap value, falling back to Viridis. */
|
|
134
101
|
export declare function lutFor(colormapValue: unknown, reverse?: boolean): Rgb[];
|
|
135
102
|
/** True when every entry of a LUT is a neutral grey. Tested on the VALUES rather
|
|
@@ -40,6 +40,10 @@ export interface ExpressionFieldOptions {
|
|
|
40
40
|
/** Observations to include; every one when absent (a plane, a selection). */
|
|
41
41
|
indices?: Uint32Array;
|
|
42
42
|
}
|
|
43
|
+
/**
|
|
44
|
+
* A 2D field of kernel-weighted mean expression on a `width × height` grid, with the
|
|
45
|
+
* support that says where it was actually measured.
|
|
46
|
+
*/
|
|
43
47
|
export interface ExpressionField {
|
|
44
48
|
width: number;
|
|
45
49
|
height: number;
|
|
@@ -60,6 +64,15 @@ export interface ExpressionField {
|
|
|
60
64
|
* than an empty one the reader has to interpret.
|
|
61
65
|
*/
|
|
62
66
|
export declare function expressionField(obs: SpatialObservations, opts: ExpressionFieldOptions): ExpressionField | null;
|
|
67
|
+
/**
|
|
68
|
+
* Contrast window of a gene map (2-D or 3-D), from percentiles of the MEASURED pixels.
|
|
69
|
+
*
|
|
70
|
+
* `mean` is 0 wherever `support` is 0, and those zeros are not data: windowing the whole
|
|
71
|
+
* array pins the low percentile at 0 and slides the high one upward on any section the
|
|
72
|
+
* tissue does not fill, so the colours stop describing what was measured. `lo`/`hi` are
|
|
73
|
+
* fractions, as for `contrastWindow`; `[0, 1]` when nothing was measured.
|
|
74
|
+
*/
|
|
75
|
+
export declare function fieldContrastWindow(field: Pick<ExpressionField | ExpressionVolumeField, 'mean' | 'support'>, lo?: number, hi?: number): [number, number];
|
|
63
76
|
/**
|
|
64
77
|
* Colour a field into RGBA8 for a `channels: 4` image source.
|
|
65
78
|
*
|
|
@@ -73,28 +86,7 @@ export declare function colorExpressionField(field: ExpressionField, lut: readon
|
|
|
73
86
|
log?: boolean;
|
|
74
87
|
opacity?: number;
|
|
75
88
|
}): Uint8Array;
|
|
76
|
-
/**
|
|
77
|
-
* The same estimator in 3D: a gene's expression over a serially sectioned
|
|
78
|
-
* specimen, on a {@link DensityGrid} lattice.
|
|
79
|
-
*
|
|
80
|
-
* Two modes, and the difference between them is the difference between a
|
|
81
|
-
* measurement and an estimate:
|
|
82
|
-
*
|
|
83
|
-
* - **sheets** (`interpolate` unset) blurs in-plane only, so exactly the z planes
|
|
84
|
-
* that hold cells are filled and the gaps between sections stay empty. This is
|
|
85
|
-
* the measured sections, stacked — the 2D gene map of each slide, at its own z.
|
|
86
|
-
* - **volume** (`interpolate` set) also smooths along z, so the planes between
|
|
87
|
-
* the sections carry an interpolated value. Smoothing the numerator and the
|
|
88
|
-
* denominator together is what makes that honest: it is Nadaraya-Watson, so an
|
|
89
|
-
* unimaged plane inherits its neighbours' MEAN rather than their sum thinned
|
|
90
|
-
* over a gap nobody sampled. Outside the sampled range the field is zeroed —
|
|
91
|
-
* "smoothed between the imaged sections" must not put expression in front of
|
|
92
|
-
* the first section or behind the last.
|
|
93
|
-
*
|
|
94
|
-
* Individual cells are still never interpolated: consecutive sections sample
|
|
95
|
-
* different cells, so there is nothing to interpolate along. What is interpolated
|
|
96
|
-
* is a field, which is legitimately defined between the planes.
|
|
97
|
-
*/
|
|
89
|
+
/** Options for {@link expressionVolume}. */
|
|
98
90
|
export interface ExpressionVolumeOptions {
|
|
99
91
|
/** Kernel σ per axis, in the observations' own units. The z term is used only
|
|
100
92
|
* when {@link interpolate} is set. */
|
|
@@ -107,6 +99,10 @@ export interface ExpressionVolumeOptions {
|
|
|
107
99
|
* sheets isolated at their own planes. */
|
|
108
100
|
interpolate?: boolean;
|
|
109
101
|
}
|
|
102
|
+
/**
|
|
103
|
+
* The 3D counterpart of {@link ExpressionField}: kernel-weighted mean expression on a
|
|
104
|
+
* `width × height × depth` voxel grid, with its support.
|
|
105
|
+
*/
|
|
110
106
|
export interface ExpressionVolumeField {
|
|
111
107
|
width: number;
|
|
112
108
|
height: number;
|
|
@@ -118,6 +114,28 @@ export interface ExpressionVolumeField {
|
|
|
118
114
|
/** Finite range of `mean` over the supported voxels, for a contrast window. */
|
|
119
115
|
range: [number, number];
|
|
120
116
|
}
|
|
117
|
+
/**
|
|
118
|
+
* The same estimator in 3D: a gene's expression over a serially sectioned
|
|
119
|
+
* specimen, on a {@link DensityGrid} lattice.
|
|
120
|
+
*
|
|
121
|
+
* Two modes, and the difference between them is the difference between a
|
|
122
|
+
* measurement and an estimate:
|
|
123
|
+
*
|
|
124
|
+
* - **sheets** (`interpolate` unset) blurs in-plane only, so exactly the z planes
|
|
125
|
+
* that hold cells are filled and the gaps between sections stay empty. This is
|
|
126
|
+
* the measured sections, stacked — the 2D gene map of each slide, at its own z.
|
|
127
|
+
* - **volume** (`interpolate` set) also smooths along z, so the planes between
|
|
128
|
+
* the sections carry an interpolated value. Smoothing the numerator and the
|
|
129
|
+
* denominator together is what makes that honest: it is Nadaraya-Watson, so an
|
|
130
|
+
* unimaged plane inherits its neighbours' MEAN rather than their sum thinned
|
|
131
|
+
* over a gap nobody sampled. Outside the sampled range the field is zeroed —
|
|
132
|
+
* "smoothed between the imaged sections" must not put expression in front of
|
|
133
|
+
* the first section or behind the last.
|
|
134
|
+
*
|
|
135
|
+
* Individual cells are still never interpolated: consecutive sections sample
|
|
136
|
+
* different cells, so there is nothing to interpolate along. What is interpolated
|
|
137
|
+
* is a field, which is legitimately defined between the planes.
|
|
138
|
+
*/
|
|
121
139
|
export declare function expressionVolume(obs: SpatialObservations, grid: DensityGrid, opts: ExpressionVolumeOptions): ExpressionVolumeField | null;
|
|
122
140
|
/**
|
|
123
141
|
* Encode a field into the uint8 scalar a `VolumeLayer` renders, windowed the same
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
/** Fraction of the viewport the coordinates are fitted into, so the outermost markers are not
|
|
13
13
|
* flush against the edge. Matches napari-js's own fit margin. */
|
|
14
14
|
export declare const SPATIAL_FIT_MARGIN = 0.95;
|
|
15
|
+
/** A 2D camera framing: where to centre, and how far to zoom. */
|
|
15
16
|
export interface SpatialFraming {
|
|
16
17
|
/** World point to put at the centre of the viewport. */
|
|
17
18
|
center: [number, number];
|
|
@@ -35,6 +35,7 @@ export interface HeatmapGroups {
|
|
|
35
35
|
codes: Uint16Array;
|
|
36
36
|
categories: readonly string[];
|
|
37
37
|
}
|
|
38
|
+
/** Options for {@link heatmapMatrix}: the observations, scaling and size limits. */
|
|
38
39
|
export interface HeatmapMatrixOptions {
|
|
39
40
|
/** Observations to include; every one when absent (an ROI selection). */
|
|
40
41
|
indices?: Uint32Array;
|
|
@@ -62,6 +63,7 @@ export interface HeatmapMatrixOptions {
|
|
|
62
63
|
*/
|
|
63
64
|
maxCols?: number;
|
|
64
65
|
}
|
|
66
|
+
/** Mean expression of genes (rows) per group (columns), ready for a heatmap trace. */
|
|
65
67
|
export interface HeatmapMatrix {
|
|
66
68
|
/** Gene names, one per row, in the order given. */
|
|
67
69
|
rows: string[];
|