@jax-data-science/sci-image-visualizer 0.8.2 → 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 +361 -4184
- 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 -34430
- 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 -878
- 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,13 +1,15 @@
|
|
|
1
|
+
import { OnDestroy } from '@angular/core';
|
|
1
2
|
import { Observable } from 'rxjs';
|
|
2
3
|
import { Image } from 'image-js';
|
|
3
4
|
import { IImageInfo, IImageMetadata } from './contracts/image.contract';
|
|
4
|
-
import { Region } from './models/region';
|
|
5
|
+
import { Polygon, Region } from './models/region';
|
|
5
6
|
import { ClassPreset, PresetSet } from './models/class-preset';
|
|
6
7
|
import { PlotlyService } from './implementations/plotly/plotly.service';
|
|
7
8
|
import { OpenSeadragonVisualizerService } from './implementations/osd/openseadragon-visualizer.service';
|
|
8
9
|
import { PlotType, PlotTypeDescriptor } from './contracts/plot-type';
|
|
9
|
-
import { IVisualizer, PixelData, IntensityProfile, IIsosurfaceControls, IIntensityControls, ISurface3dControls, ISpatialControls } from './contracts/visualizer.contract';
|
|
10
|
+
import { IVisualizer, LoadedImage, PixelData, IntensityProfile, IIsosurfaceControls, IIntensityControls, ISurface3dControls, ISpatialControls, IIntensitySampling, IOsdViewOptions, IVolumeResolution } from './contracts/visualizer.contract';
|
|
10
11
|
import { SpatialDataPort } from './contracts/ports/spatial-data.port';
|
|
12
|
+
import { CanvasToolOptions, ColormapNode, IBrushOptions, IWandOptions } from './contracts/display-types';
|
|
11
13
|
import { RegionStore } from './store/region-store.service';
|
|
12
14
|
import { SpatialSelectionStore } from './store/spatial-selection.service';
|
|
13
15
|
import { ViewerCapabilities } from './contracts/capabilities.contract';
|
|
@@ -18,8 +20,30 @@ import { VisualizerStore } from './store/visualizer-store.service';
|
|
|
18
20
|
import { NapariVisualizerService } from './implementations/napari-js/napari-visualizer.service';
|
|
19
21
|
import { VizConfig } from './contracts/viz-config';
|
|
20
22
|
import { PlotModeViewport } from './contracts/plot-type-contribution.contract';
|
|
23
|
+
import { IntensityProfileService } from './intensity/intensity-profile.service';
|
|
21
24
|
import * as i0 from "@angular/core";
|
|
22
|
-
|
|
25
|
+
/**
|
|
26
|
+
* The visualizer chain's front door: implements `IVisualizer`, `IRegionEditorApi`
|
|
27
|
+
* and `IChannelHistogramApi` (bound to the `VISUALIZER` / `REGION_EDITOR_API` /
|
|
28
|
+
* `CHANNEL_HISTOGRAM_API` tokens) over three rendering backends, chosen per plot type:
|
|
29
|
+
* - **Image** renders through OpenSeadragon (natively tiled, region tools,
|
|
30
|
+
* client-side colormap), or through napari-js when `VizConfig.useNapariRenderer`
|
|
31
|
+
* opts in; the napari image types and the 2D spatial-omics mode render through
|
|
32
|
+
* napari-js. A failed load falls back napari-js → OSD → Plotly for that image only
|
|
33
|
+
* (see `napariFellBack` / `osdFellBack`, cleared by `reset()`).
|
|
34
|
+
* - the napari 3D types (volume, isosurface, surface, 3D scatter, the 3D spatial
|
|
35
|
+
* cloud) render through napari-js, falling back to Plotly.
|
|
36
|
+
* - every other plot type (heatmap, contour, surface, scatter, line, …) renders
|
|
37
|
+
* through Plotly.
|
|
38
|
+
*
|
|
39
|
+
* Only rendering and the viewport are routed to the backend on screen. Region state
|
|
40
|
+
* lives in the shared `RegionStore` and display state (colormap, channels, presets,
|
|
41
|
+
* spatial view) in the shared `VisualizerStore`, so every backend sees the same
|
|
42
|
+
* values; the backends subscribe to them to redraw.
|
|
43
|
+
*
|
|
44
|
+
* Package-internal: hosts depend on the tokens, not on this class.
|
|
45
|
+
*/
|
|
46
|
+
export declare class RoutingVisualizerService implements IVisualizer, IRegionEditorApi, IChannelHistogramApi, OnDestroy {
|
|
23
47
|
private plotly;
|
|
24
48
|
private osd;
|
|
25
49
|
private napari;
|
|
@@ -27,6 +51,7 @@ export declare class RoutingVisualizerService implements IVisualizer, IRegionEdi
|
|
|
27
51
|
private config;
|
|
28
52
|
private regionStore;
|
|
29
53
|
private selectionStore;
|
|
54
|
+
private intensity;
|
|
30
55
|
private spatialData;
|
|
31
56
|
private currentPlotType;
|
|
32
57
|
private lastRendered;
|
|
@@ -39,7 +64,11 @@ export declare class RoutingVisualizerService implements IVisualizer, IRegionEdi
|
|
|
39
64
|
/** napari-js failed for the current render cycle → fall back to OSD (then Plotly).
|
|
40
65
|
* Reset by reset() at the start of every cycle, like {@link osdFellBack}. */
|
|
41
66
|
private napariFellBack;
|
|
42
|
-
|
|
67
|
+
/** The file name of the image last plotted (names a GeoJSON export). */
|
|
68
|
+
private plottedFileName;
|
|
69
|
+
/** The div the backends render into (every backend shares it); '' before the first plot. */
|
|
70
|
+
private plotDiv;
|
|
71
|
+
constructor(plotly: PlotlyService, osd: OpenSeadragonVisualizerService, napari: NapariVisualizerService, store: VisualizerStore, config: VizConfig, regionStore: RegionStore, selectionStore: SpatialSelectionStore, intensity: IntensityProfileService, spatialData?: SpatialDataPort | null);
|
|
43
72
|
private isImageType;
|
|
44
73
|
/** The 2D napari types (image, region-centroid scatter, spatial omics) — a 2D fallback chain
|
|
45
74
|
* (OSD, then Plotly).
|
|
@@ -64,19 +93,33 @@ export declare class RoutingVisualizerService implements IVisualizer, IRegionEdi
|
|
|
64
93
|
/** Backend currently on screen — what ongoing zoom/tool/region ops act on. */
|
|
65
94
|
private renderer;
|
|
66
95
|
get capabilities(): ViewerCapabilities;
|
|
67
|
-
load(imageInfo: IImageInfo, zIndex: number): Promise<
|
|
96
|
+
load(imageInfo: IImageInfo, zIndex: number, signal?: AbortSignal): Promise<LoadedImage>;
|
|
68
97
|
/** Try OSD; on failure fall back to Plotly for this image (not permanent — see reset()). */
|
|
69
98
|
private loadViaOsdThenPlotly;
|
|
70
|
-
plot(plotDiv: string, imageLoaded:
|
|
99
|
+
plot(plotDiv: string, imageLoaded: unknown, imageInfo: IImageInfo, screenHeight: number, plotType: PlotType, inPlace?: boolean): Promise<boolean>;
|
|
71
100
|
reloadAndPlot(): void;
|
|
72
101
|
reset(): void;
|
|
73
102
|
relayout(trueImageSize?: number[]): void;
|
|
74
103
|
resetAxes(): void;
|
|
104
|
+
fitToView(): void;
|
|
105
|
+
/** @deprecated Use {@link fitToView}. */
|
|
75
106
|
autoscale(): void;
|
|
76
107
|
zoomIn(): void;
|
|
77
108
|
zoomOut(): void;
|
|
78
109
|
setDragMode(mode: string | false): void;
|
|
110
|
+
/** Every backend, on screen or not. */
|
|
111
|
+
private backends;
|
|
112
|
+
/**
|
|
113
|
+
* The navigator / smoothing options, applied to EVERY backend that has them (not
|
|
114
|
+
* just the active renderer): consumers set them before the first render, when
|
|
115
|
+
* `renderer()` is still the Plotly default, and OSD/napari-js must receive them
|
|
116
|
+
* to honour them at viewer creation.
|
|
117
|
+
*/
|
|
118
|
+
getOsdViewOptions(): IOsdViewOptions;
|
|
119
|
+
private readonly viewOptions;
|
|
120
|
+
/** @deprecated Use `getOsdViewOptions().setNavigatorVisible()`. */
|
|
79
121
|
setNavigatorVisible(visible: boolean): void;
|
|
122
|
+
/** @deprecated Use `getOsdViewOptions().setImageSmoothingEnabled()`. */
|
|
80
123
|
setImageSmoothingEnabled(enabled: boolean): void;
|
|
81
124
|
setShowStack(showstack: boolean): void;
|
|
82
125
|
setZIndex(zIndex: number): void;
|
|
@@ -95,9 +138,15 @@ export declare class RoutingVisualizerService implements IVisualizer, IRegionEdi
|
|
|
95
138
|
downloadImage(): void;
|
|
96
139
|
exportComposite(): void;
|
|
97
140
|
setPlotType(plotType: PlotType): void;
|
|
141
|
+
/** @deprecated Use `getSurface3dControls()`. */
|
|
98
142
|
setSurfaceDragMode(mode: string): void;
|
|
143
|
+
/** @deprecated Use `getSurface3dControls()`. */
|
|
99
144
|
resetSurfaceCamera(): void;
|
|
145
|
+
/** The 3D decimate factor of the backend on screen (napari-js), else null. */
|
|
146
|
+
getVolumeResolution(): IVolumeResolution | null;
|
|
147
|
+
/** @deprecated Use `getVolumeResolution()?.set()`. */
|
|
100
148
|
setResolutionScale(scale: number): void;
|
|
149
|
+
/** @deprecated Use `getVolumeResolution()?.get()`. */
|
|
101
150
|
getResolutionScale(): number;
|
|
102
151
|
/** The viewport of the backend on screen, for a contributed plot mode. Null
|
|
103
152
|
* when that backend cannot provide one (e.g. OSD fell back to Plotly). */
|
|
@@ -107,13 +156,14 @@ export declare class RoutingVisualizerService implements IVisualizer, IRegionEdi
|
|
|
107
156
|
cancelLoading(): void;
|
|
108
157
|
isStackLoading(): Observable<boolean>;
|
|
109
158
|
getStackLoadingProgress(): Observable<number>;
|
|
110
|
-
getAutoscaleEvent(): Observable<
|
|
159
|
+
getAutoscaleEvent(): Observable<void>;
|
|
160
|
+
/** The line-ROI profiles: sampled by the backend-neutral IntensityProfileService. */
|
|
111
161
|
getIntensityProfile$(): Observable<IntensityProfile[]>;
|
|
112
162
|
renderIntensityInset(divId: string, profiles: IntensityProfile[]): void;
|
|
113
163
|
setRegions(regions: Region[], showRegionLabel?: boolean, isRegionSaveOn?: boolean, fillColor?: string, append?: boolean): void;
|
|
114
164
|
getRegions(): Region[];
|
|
115
|
-
getRegionPolygons():
|
|
116
|
-
getRegionUpdateEvent(): Observable<
|
|
165
|
+
getRegionPolygons(): Polygon[];
|
|
166
|
+
getRegionUpdateEvent(): Observable<Region[]>;
|
|
117
167
|
setSelectedShapeIndices(indices: number[]): void;
|
|
118
168
|
selectRegion(region: Region): void;
|
|
119
169
|
getSelectedShapeIndices$(): Observable<number[]>;
|
|
@@ -129,9 +179,6 @@ export declare class RoutingVisualizerService implements IVisualizer, IRegionEdi
|
|
|
129
179
|
upsertClass(preset: ClassPreset): void;
|
|
130
180
|
removeClass(name: string): void;
|
|
131
181
|
resetPresets(): void;
|
|
132
|
-
plotPreviousShapes(): void;
|
|
133
|
-
setPreviousShapes(shapes: any[]): void;
|
|
134
|
-
getPreviousShapes(): any[];
|
|
135
182
|
undo(): void;
|
|
136
183
|
redo(): void;
|
|
137
184
|
canUndo(): boolean;
|
|
@@ -140,6 +187,7 @@ export declare class RoutingVisualizerService implements IVisualizer, IRegionEdi
|
|
|
140
187
|
getCanRedo$(): Observable<boolean>;
|
|
141
188
|
resetUndoHistory(): void;
|
|
142
189
|
importRegions(geoJsonStr: string): Region[];
|
|
190
|
+
/** Download `regions` as GeoJSON, named after the image last plotted. */
|
|
143
191
|
exportRegions(regions: Region[]): void;
|
|
144
192
|
getGeoJsonString(regions: Region[]): string;
|
|
145
193
|
enterStackMode(slices: Map<number, Region[]>, initialZ?: number, saveLayout?: 'combined' | 'per-slice-file'): void;
|
|
@@ -170,26 +218,32 @@ export declare class RoutingVisualizerService implements IVisualizer, IRegionEdi
|
|
|
170
218
|
setAnnotationRegions(regions: Region[], showRegionLabel?: boolean, isRegionSaveOn?: boolean, fillColor?: string): void;
|
|
171
219
|
getSelectedRegions$(): Observable<Region[]>;
|
|
172
220
|
setSelectedRegions(regions: Region[]): void;
|
|
173
|
-
|
|
174
|
-
|
|
221
|
+
setActiveTool(id: string | null, options?: CanvasToolOptions): void;
|
|
222
|
+
/** @deprecated Use {@link setActiveTool}. */
|
|
223
|
+
setWandMode(active: boolean, options?: IWandOptions): void;
|
|
224
|
+
setWandOptions(options: IWandOptions): void;
|
|
175
225
|
clearActiveWandRegion(): void;
|
|
176
|
-
|
|
177
|
-
|
|
226
|
+
/** @deprecated Use {@link setActiveTool}. */
|
|
227
|
+
setBrushMode(active: boolean, options?: IBrushOptions): void;
|
|
228
|
+
setBrushOptions(options: IBrushOptions): void;
|
|
229
|
+
/** @deprecated Use {@link setActiveTool}. */
|
|
178
230
|
setVertexEraserMode(active: boolean): void;
|
|
179
231
|
setVertexEraserRadius(radius: number): void;
|
|
232
|
+
/** @deprecated Use {@link setActiveTool}. */
|
|
180
233
|
setZoomToBoxMode(active: boolean): void;
|
|
181
234
|
segmentRectangles(): Promise<number>;
|
|
182
235
|
segmentRectanglesCellpose(): Promise<number>;
|
|
183
236
|
setSamModel(id: string): void;
|
|
237
|
+
/** @deprecated Use {@link setActiveTool}. */
|
|
184
238
|
setSamPointMode(active: boolean): void;
|
|
185
239
|
commitSamPoints(): void;
|
|
186
240
|
clearSamPoints(): void;
|
|
187
|
-
getColormap(): Observable<
|
|
188
|
-
setColormap(colormap:
|
|
189
|
-
getColormapOptions():
|
|
241
|
+
getColormap(): Observable<ColormapNode | null>;
|
|
242
|
+
setColormap(colormap: ColormapNode): void;
|
|
243
|
+
getColormapOptions(): ColormapNode[];
|
|
190
244
|
getReverseScale(): Observable<boolean>;
|
|
191
|
-
setReverseScale(
|
|
192
|
-
setImageMeta(imageMeta: IImageMetadata[]): void;
|
|
245
|
+
setReverseScale(reverse: boolean): void;
|
|
246
|
+
setImageMeta(imageMeta: IImageMetadata[], imageKey?: string): void;
|
|
193
247
|
getImageMeta(): Observable<IImageMetadata[]>;
|
|
194
248
|
getHistogram(channelIndex: number, bins: number): IHistogram | null;
|
|
195
249
|
getHistogram$(channelIndex: number, bins: number): Observable<IHistogram | null>;
|
|
@@ -212,60 +266,58 @@ export declare class RoutingVisualizerService implements IVisualizer, IRegionEdi
|
|
|
212
266
|
* usable overlay.
|
|
213
267
|
*/
|
|
214
268
|
getRegionOverlay(): IRegionOverlay;
|
|
215
|
-
/**
|
|
216
|
-
* Isosurface controls when available — always Plotly's, since the isosurface
|
|
217
|
-
* plot type renders on Plotly (OSD only handles the image type).
|
|
218
|
-
*/
|
|
269
|
+
/** Isosurface controls of the backend on screen, when it renders isosurfaces. */
|
|
219
270
|
getIsosurfaceControls(): IIsosurfaceControls | null;
|
|
220
|
-
/** 3D scene controls
|
|
221
|
-
*
|
|
271
|
+
/** 3D scene controls of the backend on screen (Plotly or napari-js), or null on a
|
|
272
|
+
* 2D-only one. */
|
|
222
273
|
getSurface3dControls(): ISurface3dControls | null;
|
|
223
|
-
/** Intensity (line-ROI) controls
|
|
224
|
-
*
|
|
274
|
+
/** Intensity (line-ROI) controls, whichever backend draws the image: the
|
|
275
|
+
* IntensityProfileService adds the line to the store, and every backend
|
|
276
|
+
* (Plotly included) draws it from the store's update event. */
|
|
225
277
|
getIntensityControls(): IIntensityControls | null;
|
|
226
278
|
/**
|
|
227
|
-
* Spatial-omics controls, or null when no `SPATIAL_DATA_PORT` is bound.
|
|
228
|
-
*
|
|
229
|
-
*
|
|
230
|
-
* backend-neutral: the view state lives in the shared `VisualizerStore` (like
|
|
231
|
-
* the colormap), so the controls keep working across a plot-type switch and a
|
|
232
|
-
* host can drive them before any backend has mounted.
|
|
279
|
+
* Spatial-omics controls, or null when no `SPATIAL_DATA_PORT` is bound. Served by a
|
|
280
|
+
* backend-neutral {@link SpatialControlsFacade} (state in the shared stores), so the
|
|
281
|
+
* controls work across a plot-type switch and before any backend has mounted.
|
|
233
282
|
*/
|
|
234
283
|
getSpatialControls(): ISpatialControls | null;
|
|
235
|
-
/**
|
|
236
|
-
|
|
237
|
-
*
|
|
238
|
-
* A column is checkable against the declared list. A gene is checkable only when
|
|
239
|
-
* the dataset inlines its feature names — a dataset too wide to inline them
|
|
240
|
-
* (typeahead-only) keeps the source, and a name that turns out not to exist
|
|
241
|
-
* surfaces as the chart's "could not be charted" rather than as a silent reset.
|
|
242
|
-
*/
|
|
243
|
-
private canColorBy;
|
|
244
|
-
/** Memoised so consumers can hold the object across calls. */
|
|
245
|
-
private spatialControls;
|
|
246
|
-
/** Latest dataset, mirrored so `selectFromRegions()` can answer synchronously
|
|
247
|
-
* — it runs from a button click and must not await a round-trip. */
|
|
248
|
-
private currentSpatialDataset;
|
|
284
|
+
/** Created on first use; owns the dataset subscription. */
|
|
285
|
+
private spatialFacade;
|
|
249
286
|
/** Displayed slice. Only a volume-backed spatial dataset reads it, to keep a
|
|
250
287
|
* region drawn over one section from selecting the whole depth behind it. */
|
|
251
288
|
private currentZIndex;
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
*
|
|
289
|
+
/** Angular calls this when the injector providing the router is destroyed — the host
|
|
290
|
+
* component for a `provideVisualization()` chain. The dataset subscription would
|
|
291
|
+
* otherwise keep the whole isolated chain reachable from the root data port. */
|
|
292
|
+
ngOnDestroy(): void;
|
|
293
|
+
/**
|
|
294
|
+
* Intensity-profile sampling, whichever backend is on screen: the sampling is the
|
|
295
|
+
* backend-neutral IntensityProfileService's; the viewport changes come from every
|
|
296
|
+
* backend that reports them (OpenSeadragon, napari-js), merged into one stable
|
|
297
|
+
* stream the inset subscribes to once.
|
|
298
|
+
*/
|
|
299
|
+
getIntensitySampling(): IIntensitySampling;
|
|
300
|
+
private readonly intensitySampling;
|
|
301
|
+
/** @deprecated Use `getIntensitySampling().ensureIntensitySampling()`. */
|
|
255
302
|
ensureIntensitySampling(imageInfo: IImageInfo, zIndex: number): Promise<void>;
|
|
256
|
-
/**
|
|
257
|
-
|
|
258
|
-
|
|
303
|
+
/** Crops for sampling are sized from the plot div (whichever backend renders into it). */
|
|
304
|
+
private pointSamplingAtPlot;
|
|
305
|
+
/** @deprecated Use `getIntensitySampling().getViewportChange$()`. */
|
|
259
306
|
getViewportChange$(): Observable<{
|
|
260
307
|
x: number;
|
|
261
308
|
y: number;
|
|
262
309
|
width: number;
|
|
263
310
|
height: number;
|
|
264
311
|
}>;
|
|
265
|
-
/**
|
|
266
|
-
* ROI at display resolution (sampling always lives in Plotly). */
|
|
312
|
+
/** @deprecated Use `getIntensitySampling().refreshIntensitySamplingForRoi()`. */
|
|
267
313
|
refreshIntensitySamplingForRoi(x: number, y: number, width: number, height: number, zIndex: number): void;
|
|
314
|
+
/** The visualizer view is going away: detach every backend — dropping their view-bound
|
|
315
|
+
* subscriptions and disposing the napari-js viewer, whose canvas, render loop and GPU
|
|
316
|
+
* buffers would otherwise outlive the view (for a component-scoped chain, forever).
|
|
317
|
+
* Nothing is on screen afterwards, so the next plot starts from the default backend. */
|
|
318
|
+
detach(): void;
|
|
319
|
+
/** @deprecated Use {@link detach}. */
|
|
268
320
|
unsubscribe(): void;
|
|
269
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<RoutingVisualizerService, [null, null, null, null, null, null, null, { optional: true; }]>;
|
|
321
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<RoutingVisualizerService, [null, null, null, null, null, null, null, null, { optional: true; }]>;
|
|
270
322
|
static ɵprov: i0.ɵɵInjectableDeclaration<RoutingVisualizerService>;
|
|
271
323
|
}
|
|
@@ -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
|
+
}
|