@jax-data-science/sci-image-visualizer 0.8.3 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +201 -460
- package/esm2022/index.mjs +28 -15
- package/esm2022/lib/channel-histogram/channel-histogram.component.mjs +163 -91
- package/esm2022/lib/contracts/capabilities.contract.mjs +4 -3
- package/esm2022/lib/contracts/cell-segmenter.contract.mjs +1 -1
- package/esm2022/lib/contracts/channel-histogram-api.contract.mjs +5 -1
- package/esm2022/lib/contracts/color.mjs +60 -0
- package/esm2022/lib/contracts/colormap-lut.mjs +213 -57
- package/esm2022/lib/contracts/coordinate-transform.contract.mjs +1 -1
- package/esm2022/lib/contracts/display-types.mjs +11 -1
- package/esm2022/lib/contracts/instance-segmenter.contract.mjs +1 -1
- package/esm2022/lib/contracts/intensity.mjs +48 -5
- package/esm2022/lib/contracts/plot-type-contribution.contract.mjs +1 -1
- package/esm2022/lib/contracts/plot-type.mjs +134 -17
- package/esm2022/lib/contracts/ports/image-state.port.mjs +4 -1
- package/esm2022/lib/contracts/ports/preferences.port.mjs +5 -1
- package/esm2022/lib/contracts/ports/region-io.port.mjs +2 -1
- package/esm2022/lib/contracts/ports/spatial-data.port.mjs +5 -1
- package/esm2022/lib/contracts/ports/tile-access.port.mjs +2 -1
- package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
- package/esm2022/lib/contracts/region-overlay.contract.mjs +1 -1
- package/esm2022/lib/contracts/sam.contract.mjs +1 -1
- package/esm2022/lib/contracts/semantic-segmenter.contract.mjs +1 -1
- package/esm2022/lib/contracts/spatial-dataset.contract.mjs +3 -1
- package/esm2022/lib/contracts/toolbar-tool.contract.mjs +6 -4
- package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
- package/esm2022/lib/contracts/viz-config.mjs +2 -1
- package/esm2022/lib/geometry/contour.mjs +63 -0
- package/esm2022/lib/geometry/raster.mjs +98 -0
- package/esm2022/lib/geometry/ring.mjs +201 -0
- package/esm2022/lib/hex-color-picker/hex-color-picker.component.mjs +202 -102
- package/esm2022/lib/implementations/base-store-visualizer.mjs +201 -48
- package/esm2022/lib/implementations/napari-js/napari-axes-gizmo.mjs +65 -0
- package/esm2022/lib/implementations/napari-js/napari-display-state.mjs +136 -0
- package/esm2022/lib/implementations/napari-js/napari-helpers.mjs +199 -0
- package/esm2022/lib/implementations/napari-js/napari-image-2d-scene.mjs +602 -0
- package/esm2022/lib/implementations/napari-js/napari-loading-badge.mjs +3 -4
- package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +66 -0
- package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +157 -591
- package/esm2022/lib/implementations/napari-js/napari-scene.mjs +2 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +614 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +769 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +199 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +263 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +159 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +106 -1408
- package/esm2022/lib/implementations/napari-js/napari-spatial-tooltip.mjs +2 -2
- package/esm2022/lib/implementations/napari-js/napari-surface-scene.mjs +271 -0
- package/esm2022/lib/implementations/napari-js/napari-tile-client.mjs +562 -0
- package/esm2022/lib/implementations/napari-js/napari-tool-bridge.mjs +344 -0
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +358 -4218
- package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +439 -0
- package/esm2022/lib/implementations/napari-js/napari-volume-z-handle.mjs +6 -6
- package/esm2022/lib/implementations/napari-js/region-overlay/overlay-projection.mjs +96 -0
- package/esm2022/lib/implementations/napari-js/region-overlay/region-edit.mjs +35 -0
- package/esm2022/lib/implementations/napari-js/region-overlay/region-svg-renderer.mjs +182 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/categorical-lookup.mjs +30 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +274 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/density-layer.mjs +144 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/layer-groups.mjs +165 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/plan-context.mjs +78 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-hover.mjs +182 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-jobs.mjs +369 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +306 -0
- package/esm2022/lib/implementations/osd/display-pipeline.mjs +102 -40
- package/esm2022/lib/implementations/osd/histogram-sampler.mjs +56 -31
- package/esm2022/lib/implementations/osd/openseadragon-viewer-options.mjs +128 -0
- package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +333 -1685
- package/esm2022/lib/implementations/osd/osd-coordinate-transform.mjs +1 -1
- package/esm2022/lib/implementations/osd/osd-coords.mjs +5 -6
- package/esm2022/lib/implementations/osd/osd-export.mjs +122 -0
- package/esm2022/lib/implementations/osd/osd-lib.mjs +15 -1
- package/esm2022/lib/implementations/osd/osd-navigator-chrome.mjs +205 -0
- package/esm2022/lib/implementations/osd/osd-pixel-readback.mjs +68 -0
- package/esm2022/lib/implementations/osd/osd-region-overlay-draw.mjs +153 -0
- package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +185 -718
- package/esm2022/lib/implementations/osd/osd-scale-bar.mjs +52 -60
- package/esm2022/lib/implementations/osd/osd-tile-source.mjs +105 -0
- package/esm2022/lib/implementations/osd/osd-viewer-like.mjs +2 -0
- package/esm2022/lib/implementations/osd/osd-viewer-mount.mjs +44 -0
- package/esm2022/lib/implementations/osd/osd-viewport.mjs +184 -0
- package/esm2022/lib/implementations/osd/osd-zoom.mjs +7 -1
- package/esm2022/lib/implementations/osd/simple-source.mjs +395 -0
- package/esm2022/lib/implementations/osd/slice-cache.mjs +53 -48
- package/esm2022/lib/implementations/osd/tile-client.mjs +32 -11
- package/esm2022/lib/implementations/osd/tile-recolor.mjs +330 -0
- package/esm2022/lib/implementations/plotly/omics-trace-builders.mjs +161 -73
- package/esm2022/lib/implementations/plotly/plotly-coordinate-transform.mjs +1 -1
- package/esm2022/lib/implementations/plotly/plotly-image-loader.mjs +112 -0
- package/esm2022/lib/implementations/plotly/plotly-image-recolor.mjs +178 -0
- package/esm2022/lib/implementations/plotly/plotly-intensity-inset.mjs +33 -0
- package/esm2022/lib/implementations/plotly/plotly-isosurface-controls.mjs +83 -0
- package/esm2022/lib/implementations/plotly/plotly-layouts.mjs +121 -0
- package/esm2022/lib/implementations/plotly/plotly-readback.mjs +117 -0
- package/esm2022/lib/implementations/plotly/plotly-region-overlay.mjs +19 -10
- package/esm2022/lib/implementations/plotly/plotly-shape-projection.mjs +223 -0
- package/esm2022/lib/implementations/plotly/plotly-trace-builders.mjs +79 -19
- package/esm2022/lib/implementations/plotly/plotly-zoom-controller.mjs +223 -0
- package/esm2022/lib/implementations/plotly/plotly.service.mjs +439 -1655
- package/esm2022/lib/implementations/region-centroids.mjs +47 -0
- package/esm2022/lib/implementations/simple-slice-access.service.mjs +22 -12
- package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +172 -92
- package/esm2022/lib/implementations/spatial-data-http/spatial-wire.mjs +103 -22
- package/esm2022/lib/implementations/tile-server/index.mjs +6 -0
- package/esm2022/lib/implementations/tile-server/native-histogram.mjs +30 -0
- package/esm2022/lib/implementations/tile-server/poll-descriptor.mjs +65 -0
- package/esm2022/lib/implementations/tile-server/tile-protocol.mjs +42 -0
- package/esm2022/lib/implementations/tile-server/transport.mjs +135 -0
- package/esm2022/lib/intensity/intensity-profile.mjs +107 -0
- package/esm2022/lib/intensity/intensity-profile.service.mjs +223 -0
- package/esm2022/lib/intensity-inset/intensity-inset.component.mjs +133 -0
- package/esm2022/lib/models/bezier.mjs +1 -11
- package/esm2022/lib/models/class-preset.mjs +41 -3
- package/esm2022/lib/models/geometry.mjs +27 -164
- package/esm2022/lib/models/polygon-edit.mjs +254 -0
- package/esm2022/lib/models/polygon-factory.mjs +118 -0
- package/esm2022/lib/models/region-clone.mjs +68 -0
- package/esm2022/lib/models/region-geojson.mjs +373 -0
- package/esm2022/lib/models/region.mjs +34 -33
- package/esm2022/lib/models/shape.mjs +18 -16
- package/esm2022/lib/plot-mode/contribution-host.mjs +297 -0
- package/esm2022/lib/plot-mode/plot-mode-controller.mjs +9 -6
- package/esm2022/lib/plot-mode/plot-type-menu.mjs +85 -0
- package/esm2022/lib/plot-mode/tool-params-model.mjs +87 -0
- package/esm2022/lib/plot.utilities.mjs +296 -473
- package/esm2022/lib/processing/image-crop.mjs +1 -1
- package/esm2022/lib/processing/processing-image.mjs +28 -15
- package/esm2022/lib/provide-visualization.mjs +40 -14
- package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +99 -0
- package/esm2022/lib/region-editor/file-stem.mjs +13 -0
- package/esm2022/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.mjs +118 -0
- package/esm2022/lib/region-editor/mask-export.service.mjs +98 -0
- package/esm2022/lib/region-editor/mask-raster.mjs +11 -5
- package/esm2022/lib/region-editor/region-color-dialog/region-color-dialog.component.mjs +56 -0
- package/esm2022/lib/region-editor/region-editor-help/region-editor-help.component.mjs +28 -0
- package/esm2022/lib/region-editor/region-editor.component.mjs +402 -651
- package/esm2022/lib/region-editor/region-metrics.mjs +68 -0
- package/esm2022/lib/region-editor/region-persistence.service.mjs +134 -0
- package/esm2022/lib/region-editor/region-table/region-table.component.mjs +153 -0
- package/esm2022/lib/region-editor/save-mask-dialog/save-mask-dialog.component.mjs +91 -0
- package/esm2022/lib/region-editor/save-regions-dialog/save-regions-dialog.component.mjs +92 -0
- package/esm2022/lib/region-ops.service.mjs +28 -70
- package/esm2022/lib/region-overlay/region-geometry.mjs +360 -0
- package/esm2022/lib/region-overlay/region-hit-test.mjs +103 -0
- package/esm2022/lib/region-overlay/svg-region-renderer.mjs +228 -0
- package/esm2022/lib/render-orchestrator.mjs +14 -11
- package/esm2022/lib/render-session.mjs +207 -0
- package/esm2022/lib/routing-visualizer.service.mjs +459 -411
- package/esm2022/lib/spatial/density-raster.mjs +14 -0
- package/esm2022/lib/spatial/embedding-compute-coordinator.mjs +239 -0
- package/esm2022/lib/spatial/embedding-compute.mjs +43 -10
- package/esm2022/lib/spatial/gene-search.mjs +1 -1
- package/esm2022/lib/spatial/glyphs.mjs +97 -0
- package/esm2022/lib/spatial/lod.mjs +187 -0
- package/esm2022/lib/spatial/spatial-controls.facade.mjs +200 -0
- package/esm2022/lib/spatial/spatial-density.mjs +25 -16
- package/esm2022/lib/spatial/spatial-encoding.mjs +26 -82
- package/esm2022/lib/spatial/spatial-expression.mjs +43 -42
- package/esm2022/lib/spatial/spatial-framing.mjs +1 -1
- package/esm2022/lib/spatial/spatial-heatmap.mjs +6 -3
- package/esm2022/lib/spatial/spatial-hover.mjs +5 -33
- package/esm2022/lib/spatial/spatial-panel-model.mjs +282 -0
- package/esm2022/lib/spatial/spatial-sections.mjs +1 -1
- package/esm2022/lib/spatial/spatial-selection.mjs +33 -46
- package/esm2022/lib/spatial/spatial-tile-merge.mjs +219 -0
- package/esm2022/lib/spatial/spatial-tiles.mjs +12 -648
- package/esm2022/lib/spatial/spatial-volume-image.mjs +2 -4
- package/esm2022/lib/spatial/stats.mjs +71 -0
- package/esm2022/lib/spatial/transcript-grouping.mjs +307 -0
- package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +150 -0
- package/esm2022/lib/spatial-controls/spatial-charts/chart-data-model.mjs +309 -0
- package/esm2022/lib/spatial-controls/spatial-charts/chart-help.mjs +145 -0
- package/esm2022/lib/spatial-controls/spatial-charts/plotly-chart-host.mjs +158 -0
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.mjs +47 -0
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +297 -802
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.mjs +89 -0
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.mjs +52 -0
- package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +143 -1238
- package/esm2022/lib/spatial-controls/spatial-gene-picker.mjs +153 -0
- package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +241 -0
- package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +193 -0
- package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +132 -0
- package/esm2022/lib/spatial-controls/spatial-key/spatial-key.model.mjs +67 -0
- package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +147 -0
- package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +300 -0
- package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +370 -0
- package/esm2022/lib/store/class-color.util.mjs +46 -3
- package/esm2022/lib/store/region-history.mjs +146 -0
- package/esm2022/lib/store/region-scope-cache.mjs +140 -0
- package/esm2022/lib/store/region-selection.mjs +82 -0
- package/esm2022/lib/store/region-store.service.mjs +279 -675
- package/esm2022/lib/store/spatial-selection.service.mjs +2 -2
- package/esm2022/lib/store/visualizer-store.service.mjs +49 -71
- package/esm2022/lib/toast-outlets.mjs +5 -4
- package/esm2022/lib/toolbar/brush/brush-tool.service.mjs +92 -434
- package/esm2022/lib/toolbar/canvas-tools.mjs +20 -0
- package/esm2022/lib/toolbar/crop/slide-crop.mjs +26 -42
- package/esm2022/lib/toolbar/plot-type-selector/plot-type-selector.component.mjs +85 -0
- package/esm2022/lib/toolbar/region-tools/region-tool-buttons.mjs +74 -0
- package/esm2022/lib/toolbar/region-tools/region-tools.component.mjs +114 -0
- package/esm2022/lib/toolbar/segmentation/cell-segment-tool.service.mjs +74 -78
- package/esm2022/lib/toolbar/segmentation/cellpose-segmenter.service.mjs +50 -8
- package/esm2022/lib/toolbar/segmentation/onnx-sam-session.mjs +61 -42
- package/esm2022/lib/toolbar/segmentation/pending-calls.mjs +47 -0
- package/esm2022/lib/toolbar/segmentation/sam-model-registry.mjs +12 -4
- package/esm2022/lib/toolbar/segmentation/sam-onnx-core.mjs +70 -14
- package/esm2022/lib/toolbar/segmentation/sam-point-tool.service.mjs +135 -172
- package/esm2022/lib/toolbar/segmentation/sam-prompt.mjs +9 -90
- package/esm2022/lib/toolbar/segmentation/sam-session.service.mjs +183 -0
- package/esm2022/lib/toolbar/segmentation/sam-tool.service.mjs +95 -150
- package/esm2022/lib/toolbar/segmentation/segmentation-commit.mjs +12 -0
- package/esm2022/lib/toolbar/segmentation/segmentation-runner.mjs +108 -0
- package/esm2022/lib/toolbar/segmentation-tools/segmentation-tools.component.mjs +155 -0
- package/esm2022/lib/toolbar/stack-controls/stack-controls.component.mjs +81 -0
- package/esm2022/lib/toolbar/tool-kit/async-tool-status.mjs +37 -0
- package/esm2022/lib/toolbar/tool-kit/canvas-tool-manager.mjs +63 -0
- package/esm2022/lib/toolbar/tool-kit/canvas-tool.mjs +2 -0
- package/esm2022/lib/toolbar/tool-kit/frame-pixels.mjs +108 -0
- package/esm2022/lib/toolbar/tool-kit/mask-stroke-editor.mjs +306 -0
- package/esm2022/lib/toolbar/tool-kit/matrix-frame.mjs +61 -0
- package/esm2022/lib/toolbar/tool-kit/tool-overlay.mjs +140 -0
- package/esm2022/lib/toolbar/tool-kit/undo-gesture.mjs +24 -0
- package/esm2022/lib/toolbar/tool-slider/tool-slider.component.mjs +63 -0
- package/esm2022/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.mjs +50 -0
- package/esm2022/lib/toolbar/toolbar.component.mjs +68 -117
- package/esm2022/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.mjs +93 -115
- package/esm2022/lib/toolbar/view-controls/view-controls.component.mjs +107 -0
- package/esm2022/lib/toolbar/wand/wand-region-grow.mjs +321 -0
- package/esm2022/lib/toolbar/wand/wand-tool.service.mjs +121 -416
- package/esm2022/lib/toolbar/wand/wand.service.mjs +30 -894
- package/esm2022/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.mjs +48 -90
- package/esm2022/lib/util/mark-for-check.mjs +17 -0
- package/esm2022/lib/util/supersede.mjs +56 -0
- package/esm2022/lib/visualization.module.mjs +39 -141
- package/esm2022/lib/visualizer/floating-drag.directive.mjs +58 -0
- package/esm2022/lib/visualizer/region-actions.mjs +149 -0
- package/esm2022/lib/visualizer/region-load.mjs +60 -0
- package/esm2022/lib/visualizer/spatial-dataset-binder.mjs +163 -0
- package/esm2022/lib/visualizer/tool-modes.mjs +113 -0
- package/esm2022/lib/visualizer/viewer-shortcuts.mjs +167 -0
- package/esm2022/lib/visualizer/visualizer-context-menu.mjs +119 -0
- package/esm2022/lib/visualizer.component.mjs +480 -1902
- package/esm2022/lib/workers/spatial-math-ops.mjs +43 -0
- package/esm2022/lib/workers/spatial-math-worker.mjs +10 -0
- package/esm2022/lib/workers/spatial-math.mjs +190 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs +41083 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs +238 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs +12 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +41 -34467
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
- package/fesm2022/mask.worker.js +36 -917
- package/fesm2022/onnx-sam.worker.js +52 -16
- package/fesm2022/spatial-math.worker.js +471 -0
- package/fesm2022/tsne.worker.js +32 -15
- package/index.d.ts +13 -10
- package/lib/channel-histogram/channel-histogram.component.d.ts +53 -43
- package/lib/contracts/capabilities.contract.d.ts +4 -2
- package/lib/contracts/cell-segmenter.contract.d.ts +1 -0
- package/lib/contracts/channel-histogram-api.contract.d.ts +4 -0
- package/lib/contracts/color.d.ts +27 -0
- package/lib/contracts/colormap-lut.d.ts +19 -4
- package/lib/contracts/coordinate-transform.contract.d.ts +3 -3
- package/lib/contracts/display-types.d.ts +21 -0
- package/lib/contracts/instance-segmenter.contract.d.ts +5 -0
- package/lib/contracts/intensity.d.ts +13 -2
- package/lib/contracts/plot-type.d.ts +3 -1
- package/lib/contracts/ports/image-state.port.d.ts +6 -2
- package/lib/contracts/ports/preferences.port.d.ts +4 -0
- package/lib/contracts/ports/region-io.port.d.ts +1 -0
- package/lib/contracts/ports/spatial-data.port.d.ts +4 -10
- package/lib/contracts/ports/tile-access.port.d.ts +1 -0
- package/lib/contracts/region-editor-api.contract.d.ts +1 -1
- package/lib/contracts/region-overlay.contract.d.ts +5 -0
- package/lib/contracts/sam.contract.d.ts +7 -0
- package/lib/contracts/semantic-segmenter.contract.d.ts +6 -0
- package/lib/contracts/spatial-dataset.contract.d.ts +19 -6
- package/lib/contracts/toolbar-tool.contract.d.ts +1 -0
- package/lib/contracts/visualizer.contract.d.ts +221 -54
- package/lib/contracts/viz-config.d.ts +1 -0
- package/lib/geometry/contour.d.ts +24 -0
- package/lib/geometry/raster.d.ts +42 -0
- package/lib/geometry/ring.d.ts +67 -0
- package/lib/hex-color-picker/hex-color-picker.component.d.ts +61 -27
- package/lib/implementations/base-store-visualizer.d.ts +61 -15
- package/lib/implementations/napari-js/napari-axes-gizmo.d.ts +36 -0
- package/lib/implementations/napari-js/napari-display-state.d.ts +76 -0
- package/lib/implementations/napari-js/napari-helpers.d.ts +129 -0
- package/lib/implementations/napari-js/napari-image-2d-scene.d.ts +162 -0
- package/lib/implementations/napari-js/napari-loading-badge.d.ts +0 -1
- package/lib/implementations/napari-js/napari-loading-state.d.ts +30 -0
- package/lib/implementations/napari-js/napari-region-overlay.d.ts +62 -70
- package/lib/implementations/napari-js/napari-scene.d.ts +93 -0
- package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +163 -0
- package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +212 -0
- package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +114 -0
- package/lib/implementations/napari-js/napari-spatial-hover.d.ts +89 -0
- package/lib/implementations/napari-js/napari-spatial-scene.d.ts +118 -0
- package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +56 -263
- package/lib/implementations/napari-js/napari-spatial-tooltip.d.ts +1 -1
- package/lib/implementations/napari-js/napari-surface-scene.d.ts +76 -0
- package/lib/implementations/napari-js/napari-tile-client.d.ts +214 -0
- package/lib/implementations/napari-js/napari-tool-bridge.d.ts +179 -0
- package/lib/implementations/napari-js/napari-visualizer.service.d.ts +121 -883
- package/lib/implementations/napari-js/napari-volume-scene.d.ts +104 -0
- package/lib/implementations/napari-js/napari-volume-z-handle.d.ts +8 -12
- package/lib/implementations/napari-js/region-overlay/overlay-projection.d.ts +59 -0
- package/lib/implementations/napari-js/region-overlay/region-edit.d.ts +15 -0
- package/lib/implementations/napari-js/region-overlay/region-svg-renderer.d.ts +54 -0
- package/lib/implementations/napari-js/spatial-tiles/categorical-lookup.d.ts +26 -0
- package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +70 -0
- package/lib/implementations/napari-js/spatial-tiles/density-layer.d.ts +61 -0
- package/lib/implementations/napari-js/spatial-tiles/layer-groups.d.ts +67 -0
- package/lib/implementations/napari-js/spatial-tiles/plan-context.d.ts +38 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-hover.d.ts +71 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-jobs.d.ts +105 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +56 -0
- package/lib/implementations/osd/display-pipeline.d.ts +38 -9
- package/lib/implementations/osd/histogram-sampler.d.ts +22 -12
- package/lib/implementations/osd/openseadragon-viewer-options.d.ts +35 -0
- package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +78 -354
- package/lib/implementations/osd/osd-coordinate-transform.d.ts +2 -1
- package/lib/implementations/osd/osd-coords.d.ts +6 -4
- package/lib/implementations/osd/osd-export.d.ts +36 -0
- package/lib/implementations/osd/osd-lib.d.ts +7 -0
- package/lib/implementations/osd/osd-navigator-chrome.d.ts +69 -0
- package/lib/implementations/osd/osd-pixel-readback.d.ts +22 -0
- package/lib/implementations/osd/osd-region-overlay-draw.d.ts +37 -0
- package/lib/implementations/osd/osd-region-overlay.d.ts +36 -48
- package/lib/implementations/osd/osd-scale-bar.d.ts +8 -6
- package/lib/implementations/osd/osd-tile-source.d.ts +49 -0
- package/lib/implementations/osd/osd-viewer-like.d.ts +100 -0
- package/lib/implementations/osd/osd-viewer-mount.d.ts +14 -0
- package/lib/implementations/osd/osd-viewport.d.ts +77 -0
- package/lib/implementations/osd/osd-zoom.d.ts +6 -0
- package/lib/implementations/osd/simple-source.d.ts +161 -0
- package/lib/implementations/osd/slice-cache.d.ts +12 -3
- package/lib/implementations/osd/tile-client.d.ts +11 -14
- package/lib/implementations/osd/tile-recolor.d.ts +141 -0
- package/lib/implementations/plotly/omics-trace-builders.d.ts +32 -20
- package/lib/implementations/plotly/plotly-image-loader.d.ts +49 -0
- package/lib/implementations/plotly/plotly-image-recolor.d.ts +75 -0
- package/lib/implementations/plotly/plotly-intensity-inset.d.ts +8 -0
- package/lib/implementations/plotly/plotly-isosurface-controls.d.ts +38 -0
- package/lib/implementations/plotly/plotly-layouts.d.ts +188 -0
- package/lib/implementations/plotly/plotly-readback.d.ts +41 -0
- package/lib/implementations/plotly/plotly-region-overlay.d.ts +2 -2
- package/lib/implementations/plotly/plotly-shape-projection.d.ts +92 -0
- package/lib/implementations/plotly/plotly-trace-builders.d.ts +23 -12
- package/lib/implementations/plotly/plotly-zoom-controller.d.ts +86 -0
- package/lib/implementations/plotly/plotly.service.d.ts +136 -401
- package/lib/implementations/region-centroids.d.ts +14 -0
- package/lib/implementations/simple-slice-access.service.d.ts +7 -4
- package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +42 -18
- package/lib/implementations/spatial-data-http/spatial-wire.d.ts +34 -9
- package/lib/implementations/tile-server/index.d.ts +5 -0
- package/lib/implementations/tile-server/native-histogram.d.ts +25 -0
- package/lib/implementations/tile-server/poll-descriptor.d.ts +39 -0
- package/lib/implementations/tile-server/tile-protocol.d.ts +80 -0
- package/lib/implementations/tile-server/transport.d.ts +62 -0
- package/lib/intensity/intensity-profile.d.ts +66 -0
- package/lib/intensity/intensity-profile.service.d.ts +108 -0
- package/lib/intensity-inset/intensity-inset.component.d.ts +58 -0
- package/lib/models/bezier.d.ts +0 -5
- package/lib/models/class-preset.d.ts +18 -0
- package/lib/models/geometry.d.ts +14 -48
- package/lib/models/polygon-edit.d.ts +72 -0
- package/lib/models/polygon-factory.d.ts +40 -0
- package/lib/models/region-clone.d.ts +20 -0
- package/lib/models/region-geojson.d.ts +17 -0
- package/lib/models/region.d.ts +40 -4
- package/lib/models/shape.d.ts +8 -0
- package/lib/plot-mode/contribution-host.d.ts +125 -0
- package/lib/plot-mode/plot-type-menu.d.ts +60 -0
- package/lib/plot-mode/tool-params-model.d.ts +49 -0
- package/lib/plot.utilities.d.ts +19 -30
- package/lib/processing/processing-image.d.ts +5 -2
- package/lib/provide-visualization.d.ts +19 -2
- package/lib/region-editor/classes-panel/classes-panel.component.d.ts +56 -0
- package/lib/region-editor/file-stem.d.ts +7 -0
- package/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.d.ts +45 -0
- package/lib/region-editor/mask-export.service.d.ts +54 -0
- package/lib/region-editor/mask-raster.d.ts +2 -8
- package/lib/region-editor/region-color-dialog/region-color-dialog.component.d.ts +29 -0
- package/lib/region-editor/region-editor-help/region-editor-help.component.d.ts +11 -0
- package/lib/region-editor/region-editor.component.d.ts +166 -199
- package/lib/region-editor/region-metrics.d.ts +26 -0
- package/lib/region-editor/region-persistence.service.d.ts +69 -0
- package/lib/region-editor/region-table/region-table.component.d.ts +83 -0
- package/lib/region-editor/save-mask-dialog/save-mask-dialog.component.d.ts +36 -0
- package/lib/region-editor/save-regions-dialog/save-regions-dialog.component.d.ts +37 -0
- package/lib/region-ops.service.d.ts +1 -7
- package/lib/region-overlay/region-geometry.d.ts +157 -0
- package/lib/region-overlay/region-hit-test.d.ts +38 -0
- package/lib/region-overlay/svg-region-renderer.d.ts +110 -0
- package/lib/render-orchestrator.d.ts +6 -2
- package/lib/render-session.d.ts +75 -0
- package/lib/routing-visualizer.service.d.ts +110 -58
- package/lib/spatial/density-raster.d.ts +6 -0
- package/lib/spatial/embedding-compute-coordinator.d.ts +123 -0
- package/lib/spatial/embedding-compute.d.ts +21 -2
- package/lib/spatial/glyphs.d.ts +16 -0
- package/lib/spatial/lod.d.ts +94 -0
- package/lib/spatial/spatial-controls.facade.d.ts +64 -0
- package/lib/spatial/spatial-density.d.ts +15 -5
- package/lib/spatial/spatial-encoding.d.ts +11 -44
- package/lib/spatial/spatial-expression.d.ts +40 -22
- package/lib/spatial/spatial-framing.d.ts +1 -0
- package/lib/spatial/spatial-heatmap.d.ts +2 -0
- package/lib/spatial/spatial-hover.d.ts +4 -16
- package/lib/spatial/spatial-panel-model.d.ts +135 -0
- package/lib/spatial/spatial-selection.d.ts +21 -26
- package/lib/spatial/spatial-tile-merge.d.ts +41 -0
- package/lib/spatial/spatial-tiles.d.ts +9 -256
- package/lib/spatial/stats.d.ts +38 -0
- package/lib/spatial/transcript-grouping.d.ts +119 -0
- package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +64 -0
- package/lib/spatial-controls/spatial-charts/chart-data-model.d.ts +153 -0
- package/lib/spatial-controls/spatial-charts/chart-help.d.ts +69 -0
- package/lib/spatial-controls/spatial-charts/plotly-chart-host.d.ts +98 -0
- package/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.d.ts +26 -0
- package/lib/spatial-controls/spatial-charts/spatial-charts.component.d.ts +101 -260
- package/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.d.ts +43 -0
- package/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.d.ts +27 -0
- package/lib/spatial-controls/spatial-controls.component.d.ts +68 -448
- package/lib/spatial-controls/spatial-gene-picker.d.ts +86 -0
- package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +102 -0
- package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +72 -0
- package/lib/spatial-controls/spatial-key/spatial-key.component.d.ts +66 -0
- package/lib/spatial-controls/spatial-key/spatial-key.model.d.ts +33 -0
- package/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.d.ts +64 -0
- package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +117 -0
- package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +142 -0
- package/lib/store/class-color.util.d.ts +35 -1
- package/lib/store/region-history.d.ts +66 -0
- package/lib/store/region-scope-cache.d.ts +63 -0
- package/lib/store/region-selection.d.ts +36 -0
- package/lib/store/region-store.service.d.ts +104 -112
- package/lib/store/visualizer-store.service.d.ts +22 -33
- package/lib/toast-outlets.d.ts +4 -3
- package/lib/toolbar/brush/brush-tool.service.d.ts +31 -98
- package/lib/toolbar/canvas-tools.d.ts +20 -0
- package/lib/toolbar/crop/slide-crop.d.ts +10 -4
- package/lib/toolbar/plot-type-selector/plot-type-selector.component.d.ts +38 -0
- package/lib/toolbar/region-tools/region-tool-buttons.d.ts +21 -0
- package/lib/toolbar/region-tools/region-tools.component.d.ts +60 -0
- package/lib/toolbar/segmentation/cell-segment-tool.service.d.ts +10 -14
- package/lib/toolbar/segmentation/cellpose-segmenter.service.d.ts +12 -2
- package/lib/toolbar/segmentation/onnx-sam-session.d.ts +22 -3
- package/lib/toolbar/segmentation/pending-calls.d.ts +31 -0
- package/lib/toolbar/segmentation/sam-model-registry.d.ts +9 -3
- package/lib/toolbar/segmentation/sam-onnx-core.d.ts +18 -5
- package/lib/toolbar/segmentation/sam-point-tool.service.d.ts +46 -32
- package/lib/toolbar/segmentation/sam-prompt.d.ts +7 -31
- package/lib/toolbar/segmentation/sam-session.service.d.ts +74 -0
- package/lib/toolbar/segmentation/sam-tool.service.d.ts +23 -30
- package/lib/toolbar/segmentation/segmentation-commit.d.ts +8 -0
- package/lib/toolbar/segmentation/segmentation-runner.d.ts +52 -0
- package/lib/toolbar/segmentation-tools/segmentation-tools.component.d.ts +87 -0
- package/lib/toolbar/stack-controls/stack-controls.component.d.ts +40 -0
- package/lib/toolbar/tool-kit/async-tool-status.d.ts +21 -0
- package/lib/toolbar/tool-kit/canvas-tool-manager.d.ts +36 -0
- package/lib/toolbar/tool-kit/canvas-tool.d.ts +86 -0
- package/lib/toolbar/tool-kit/frame-pixels.d.ts +45 -0
- package/lib/toolbar/tool-kit/mask-stroke-editor.d.ts +125 -0
- package/lib/toolbar/tool-kit/matrix-frame.d.ts +40 -0
- package/lib/toolbar/tool-kit/tool-overlay.d.ts +60 -0
- package/lib/toolbar/tool-kit/undo-gesture.d.ts +17 -0
- package/lib/toolbar/tool-slider/tool-slider.component.d.ts +33 -0
- package/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.d.ts +24 -0
- package/lib/toolbar/toolbar.component.d.ts +47 -83
- package/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.d.ts +33 -40
- package/lib/toolbar/view-controls/view-controls.component.d.ts +54 -0
- package/lib/toolbar/wand/wand-region-grow.d.ts +49 -0
- package/lib/toolbar/wand/wand-tool.service.d.ts +39 -124
- package/lib/toolbar/wand/wand.service.d.ts +22 -116
- package/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.d.ts +17 -37
- package/lib/util/mark-for-check.d.ts +11 -0
- package/lib/util/supersede.d.ts +53 -0
- package/lib/visualization.module.d.ts +18 -39
- package/lib/visualizer/floating-drag.directive.d.ts +30 -0
- package/lib/visualizer/region-actions.d.ts +54 -0
- package/lib/visualizer/region-load.d.ts +27 -0
- package/lib/visualizer/spatial-dataset-binder.d.ts +74 -0
- package/lib/visualizer/tool-modes.d.ts +49 -0
- package/lib/visualizer/viewer-shortcuts.d.ts +71 -0
- package/lib/visualizer/visualizer-context-menu.d.ts +55 -0
- package/lib/visualizer.component.d.ts +201 -447
- package/lib/workers/spatial-math-ops.d.ts +65 -0
- package/lib/workers/spatial-math-worker.d.ts +7 -0
- package/lib/workers/spatial-math.d.ts +74 -0
- package/package.json +12 -3
- package/src/lib/styles/_viz-icons-rules.scss +73 -0
- package/src/lib/styles/viz-icons.scss +14 -0
- package/esm2022/lib/implementations/napari-js/napari-axes-labels.mjs +0 -97
- package/esm2022/lib/implementations/napari-js/napari-navigator.mjs +0 -195
- package/esm2022/lib/implementations/napari-js/napari-scale-bar.mjs +0 -92
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs +0 -329
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs.map +0 -1
- package/lib/implementations/napari-js/napari-axes-labels.d.ts +0 -49
- package/lib/implementations/napari-js/napari-navigator.d.ts +0 -72
- package/lib/implementations/napari-js/napari-scale-bar.d.ts +0 -35
- package/src/lib/assets/cell-detection.svg +0 -37
- package/src/lib/assets/click.svg +0 -1
- package/src/lib/assets/colormap-luts.json +0 -1
- package/src/lib/assets/edit-selection-white.svg +0 -47
- package/src/lib/assets/icons/colormap-earth.png +0 -0
- package/src/lib/assets/icons/colormap-placeholder.png +0 -0
- package/src/lib/assets/icons/colormap-pubu.png +0 -0
- package/src/lib/assets/interactive-segmentation-cursor.svg +0 -1
- package/src/lib/assets/picture-segmentation.svg +0 -43
- package/src/lib/assets/test/download-379.svg +0 -1
- package/src/lib/assets/test/download-98.svg +0 -1
- package/src/lib/assets/test/json-1.svg +0 -1
- package/src/lib/assets/test/load-53.svg +0 -1
- package/src/lib/assets/test/mask-44.svg +0 -1
- package/src/lib/assets/test/mask-download-44.svg +0 -15
- package/src/lib/assets/test/mask-save-44.svg +0 -11
- package/src/lib/assets/test/overlay-1.svg +0 -1
- package/src/lib/assets/test/overlay-4.svg +0 -1
- package/src/lib/assets/test/region-26.svg +0 -1
- package/src/lib/assets/test/save-56.svg +0 -1
- package/src/lib/assets/test/upload-43.svg +0 -1
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { MultiChannelVolumeView } from 'napari-js';
|
|
2
|
+
import type { AxisLabelSpec } from 'napari-js/overlays';
|
|
3
|
+
import { IImageInfo } from '../../contracts/image.contract';
|
|
4
|
+
import { IHistogram } from '../../contracts/channel-histogram-api.contract';
|
|
5
|
+
import { IIsosurfaceControls, ISurface3dControls } from '../../contracts/visualizer.contract';
|
|
6
|
+
import { Axes3dGizmo, Box3 } from './napari-axes-gizmo';
|
|
7
|
+
import type { NapariScene, SceneContext } from './napari-scene';
|
|
8
|
+
/**
|
|
9
|
+
* NAPARI_VOLUME / NAPARI_ISOSURFACE (review Appendix B, cluster F): the stack assembled into a
|
|
10
|
+
* decimated volume — one additive, tinted `VolumeLayer` per channel for a multichannel image, a
|
|
11
|
+
* single grayscale volume otherwise — with the axes gizmo and the in-view Z-height handle.
|
|
12
|
+
*/
|
|
13
|
+
export declare class VolumeScene implements NapariScene {
|
|
14
|
+
private readonly ctx;
|
|
15
|
+
private readonly info;
|
|
16
|
+
private readonly rendering;
|
|
17
|
+
/** napari-js high-level view owning the volume layers. */
|
|
18
|
+
view: MultiChannelVolumeView | null;
|
|
19
|
+
/** True when the volume is composited from per-channel layers (vs a single grayscale volume). */
|
|
20
|
+
private multichannel;
|
|
21
|
+
/** Volume world box at Z-scale 1 (base) + the sampled voxel depth — enough to recompute the
|
|
22
|
+
* Z-axis voxel scale, axes depth, and overlay anchors as the handle stretches Z. */
|
|
23
|
+
private worldBase;
|
|
24
|
+
private sampledDepth;
|
|
25
|
+
private dims;
|
|
26
|
+
/** Assembled uint8 volume data per channel (key = channel index), kept for the volume intensity
|
|
27
|
+
* histogram. Key 0 holds the grayscale/composite volume in the single-channel case. */
|
|
28
|
+
private readonly channelData;
|
|
29
|
+
gizmo: Axes3dGizmo | null;
|
|
30
|
+
private zHandle;
|
|
31
|
+
private displaySub;
|
|
32
|
+
constructor(ctx: SceneContext, info: IImageInfo | undefined, rendering: 'iso' | 'mip');
|
|
33
|
+
/**
|
|
34
|
+
* Assemble and render the volume, then add the axes gizmo + labels and the Z handle and follow
|
|
35
|
+
* the display state.
|
|
36
|
+
*/
|
|
37
|
+
mount(): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Assemble each channel's volume from the server tiles (or the single grayscale volume) under
|
|
40
|
+
* the stack progress bar, with the display settings it is drawn with. `dims` is null when
|
|
41
|
+
* nothing was assembled (a Cancel, a new plot, or no slices).
|
|
42
|
+
*/
|
|
43
|
+
private assembleChannels;
|
|
44
|
+
/** The volume's world box for the assembled `dims`, independent of the decimate factor. */
|
|
45
|
+
private worldBox;
|
|
46
|
+
/**
|
|
47
|
+
* The whole stack is already on screen: no plane to step. (This used to write `viewer.dims.z`,
|
|
48
|
+
* which only a tiled 2D image reads — a volume raymarches every slice — and schedule a readback
|
|
49
|
+
* of a frame that had not changed. The toolbar shows no slice control in volume / isosurface
|
|
50
|
+
* mode, as Plotly's isosurface ignores the slice too.)
|
|
51
|
+
*/
|
|
52
|
+
setZ(): void;
|
|
53
|
+
/** The intensity histogram of the assembled (downsampled) uint8 volume for the requested
|
|
54
|
+
* channel (multichannel) or the single grayscale volume. */
|
|
55
|
+
histogram(channel: number, bins: number): IHistogram | null;
|
|
56
|
+
isoControls(): IIsosurfaceControls | null;
|
|
57
|
+
surface3dControls(): ISurface3dControls | null;
|
|
58
|
+
dispose(): void;
|
|
59
|
+
/**
|
|
60
|
+
* Restretch the volume's Z height live (driven by the in-view {@link NapariVolumeZHandle}). Only
|
|
61
|
+
* the per-axis `voxelSize` / axes depth change — the voxel textures are untouched — so dragging is
|
|
62
|
+
* smooth. `factor` is relative to the volume's natural proportions (1). Persists across re-mounts
|
|
63
|
+
* (resolution changes) so the chosen height sticks.
|
|
64
|
+
*/
|
|
65
|
+
setZScale(factor: number): void;
|
|
66
|
+
/** The X/Y/Z axis-end label specs for the gizmo. Anchors are in the volume's centred world box
|
|
67
|
+
* (matching the AxesLayer geometry); the scale text reflects the FULL image extent — physical µm
|
|
68
|
+
* when µm/pixel is known, else pixel (X/Y) / slice (Z) counts. */
|
|
69
|
+
axesLabels(vol: Box3): AxisLabelSpec[];
|
|
70
|
+
/**
|
|
71
|
+
* The image's declared extent in pixels/slices, and its physical spacing per
|
|
72
|
+
* axis in µm (0 = undeclared, and then that axis reads in pixels).
|
|
73
|
+
*
|
|
74
|
+
* One place, because the volume world box and the axis labels have to agree
|
|
75
|
+
* about what the image's real dimensions are — the sampled grid is decimated and
|
|
76
|
+
* says nothing about either.
|
|
77
|
+
*/
|
|
78
|
+
private imageExtent;
|
|
79
|
+
/** The store's colormap, reverse, invert and channel windows → the volume's transfer function:
|
|
80
|
+
* colour (channel tint or selected colormap), the intensity window (min/max → contrastLimits)
|
|
81
|
+
* and gamma, mirroring the grayscale image's display controls so the histogram pane drives the
|
|
82
|
+
* 3D render. */
|
|
83
|
+
private followDisplayState;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* NAPARI_SCATTER3D (review Appendix B, cluster H): the downsampled voxel grid as a 3D point cloud
|
|
87
|
+
* coloured by intensity (the napari-js analog of Plotly's voxel scatter3d). Assembles a coarse
|
|
88
|
+
* volume, then emits a flat-strided sample of voxels (capped at `SCATTER3D_MAX_POINTS`).
|
|
89
|
+
*/
|
|
90
|
+
export declare class Scatter3dScene implements NapariScene {
|
|
91
|
+
private readonly ctx;
|
|
92
|
+
private readonly info;
|
|
93
|
+
private layer;
|
|
94
|
+
/** The assembled volume (key 0), for the intensity histogram. */
|
|
95
|
+
private readonly channelData;
|
|
96
|
+
private displaySub;
|
|
97
|
+
constructor(ctx: SceneContext, info: IImageInfo | undefined);
|
|
98
|
+
mount(): Promise<void>;
|
|
99
|
+
/** The whole stack is already on screen: no plane to step. */
|
|
100
|
+
setZ(): void;
|
|
101
|
+
histogram(channel: number, bins: number): IHistogram | null;
|
|
102
|
+
surface3dControls(): ISurface3dControls | null;
|
|
103
|
+
dispose(): void;
|
|
104
|
+
}
|
|
@@ -1,14 +1,10 @@
|
|
|
1
|
-
/**
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
* Direct-manipulation counterpart of {@link NapariAxesLabels}: both are absolute-positioned overlays
|
|
9
|
-
* updated on every `camera3d.changed`, but this one accepts pointer input.
|
|
10
|
-
*/
|
|
11
|
-
import { AxesLabelCamera3D } from './napari-axes-labels';
|
|
1
|
+
/** The slice of napari's Camera3D the handle reads. `viewProjection` is column-major (gl-matrix). */
|
|
2
|
+
export interface ZHandleCamera3D {
|
|
3
|
+
viewProjection(vw: number, vh: number): ArrayLike<number>;
|
|
4
|
+
readonly changed: {
|
|
5
|
+
connect(listener: () => void): () => void;
|
|
6
|
+
};
|
|
7
|
+
}
|
|
12
8
|
export interface VolumeZHandleOptions {
|
|
13
9
|
/** Current top-face-centre world point (the box is centred at the origin, so `[0, 0, +halfZ]`). */
|
|
14
10
|
topAnchor: () => [number, number, number];
|
|
@@ -33,7 +29,7 @@ export declare class NapariVolumeZHandle {
|
|
|
33
29
|
private dragging;
|
|
34
30
|
private startY;
|
|
35
31
|
private startScale;
|
|
36
|
-
constructor(host: HTMLElement, camera3d:
|
|
32
|
+
constructor(host: HTMLElement, camera3d: ZHandleCamera3D, opts: VolumeZHandleOptions);
|
|
37
33
|
setVisible(visible: boolean): void;
|
|
38
34
|
/** Reproject the handle to the current top-face anchor. Called on camera move, resize, and after
|
|
39
35
|
* the host applies a new scale (so the grip follows the growing/shrinking box). */
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { ToScreen } from '../../../region-overlay/region-geometry';
|
|
2
|
+
import { Affine } from '../../../region-overlay/svg-region-renderer';
|
|
3
|
+
import type { OverlayViewer } from '../napari-region-overlay';
|
|
4
|
+
/**
|
|
5
|
+
* The region overlay's coordinate spaces: pointer CLIENT pixels, svg-LOCAL pixels and WORLD
|
|
6
|
+
* units, through the viewer's own transforms (see {@link OverlayViewer}).
|
|
7
|
+
*
|
|
8
|
+
* World → svg-local is the viewer's camera affine (`canvasTransform`), which reads no layout, so
|
|
9
|
+
* drawing and following the camera read none. Only a pointer, in client pixels, needs the svg's
|
|
10
|
+
* client origin: read once per {@link withOrigin} block (a gesture event), as an uncached read
|
|
11
|
+
* per vertex — interleaved with the elements a redraw appends — forced a synchronous layout per
|
|
12
|
+
* vertex (review NAPARI-BOUNDARY-10).
|
|
13
|
+
*/
|
|
14
|
+
export declare class OverlayProjection {
|
|
15
|
+
private readonly svg;
|
|
16
|
+
private readonly viewer;
|
|
17
|
+
/**
|
|
18
|
+
* How finely a drawn vertex may be placed, in world units.
|
|
19
|
+
*
|
|
20
|
+
* One by default, because for an image the world IS pixels and a region should align to
|
|
21
|
+
* them. A dataset whose coordinates are not pixels sets it finer — seqFISH's whole
|
|
22
|
+
* sample spans about 5 x 7 units, where whole-unit vertices leave roughly six by eight
|
|
23
|
+
* placeable positions and no ROI can be drawn at all.
|
|
24
|
+
*/
|
|
25
|
+
private worldQuantum;
|
|
26
|
+
/** The svg's client origin and the camera affine, cached while a {@link withOrigin} block runs. */
|
|
27
|
+
private origin;
|
|
28
|
+
private camera;
|
|
29
|
+
constructor(svg: SVGSVGElement, viewer: OverlayViewer);
|
|
30
|
+
setWorldQuantum(quantum: number): void;
|
|
31
|
+
/** Pointer client coords → world coords, snapped to the world quantum (for placing vertices). */
|
|
32
|
+
toImage(clientX: number, clientY: number): [number, number];
|
|
33
|
+
/** Pointer client coords → world coords, exact (for picking: snapping is for placing). */
|
|
34
|
+
toWorld(clientX: number, clientY: number): [number, number];
|
|
35
|
+
/**
|
|
36
|
+
* World units spanned by one screen pixel, measured through the viewer's own transform.
|
|
37
|
+
*
|
|
38
|
+
* Read from the transform rather than from the camera, so it holds for both the 2D and
|
|
39
|
+
* the 3D screen-space adapters without either having to expose a zoom. Falls back to 1
|
|
40
|
+
* if the transform gives nothing usable, which keeps the established pixel behaviour
|
|
41
|
+
* rather than collapsing the threshold to zero and recording a point per event.
|
|
42
|
+
*/
|
|
43
|
+
worldPerCanvasPixel(): number;
|
|
44
|
+
/** Run `fn` with the svg's client origin and the camera affine read once (nested calls reuse them). */
|
|
45
|
+
withOrigin<T>(fn: () => T): T;
|
|
46
|
+
/** Client px → SVG-local px. */
|
|
47
|
+
clientToLocal(clientX: number, clientY: number): [number, number];
|
|
48
|
+
/** World coords → SVG-local px, through the camera affine: no layout read. */
|
|
49
|
+
toLocal(imgX: number, imgY: number): [number, number];
|
|
50
|
+
/** {@link toLocal} as the shared region geometry takes it. */
|
|
51
|
+
readonly toScreen: ToScreen;
|
|
52
|
+
/** Screen distance (px) between a client point and a world point. */
|
|
53
|
+
screenDist(clientX: number, clientY: number, imgX: number, imgY: number): number;
|
|
54
|
+
/**
|
|
55
|
+
* The world → svg-local affine for the current camera: the viewer's `canvasTransform`, which
|
|
56
|
+
* reads no layout. The svg and the canvas share an origin (see {@link OverlayViewer}).
|
|
57
|
+
*/
|
|
58
|
+
affine(): Affine;
|
|
59
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { HandleHit } from '../../../region-overlay/region-geometry';
|
|
2
|
+
import type { RegionStore } from '../../../store/region-store.service';
|
|
3
|
+
/**
|
|
4
|
+
* A live drag of the select/move tools: the region's body, or one of its handles as the
|
|
5
|
+
* shared `hitHandle` names it (a rectangle corner with its fixed opposite `anchor`, or a
|
|
6
|
+
* vertex / bézier control point on `ring` -1 for the exterior, else a hole).
|
|
7
|
+
*/
|
|
8
|
+
export type RegionEdit = {
|
|
9
|
+
id: number;
|
|
10
|
+
last: [number, number];
|
|
11
|
+
} & ({
|
|
12
|
+
kind: 'body';
|
|
13
|
+
} | HandleHit);
|
|
14
|
+
/** Apply the drag of `edit` to the pointer at world point `(x, y)`, through the store's edit ops. */
|
|
15
|
+
export declare function applyRegionEdit(store: RegionStore, edit: RegionEdit, x: number, y: number): void;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { Region } from '../../../models/region';
|
|
2
|
+
import type { RegionStore } from '../../../store/region-store.service';
|
|
3
|
+
import { Affine } from '../../../region-overlay/svg-region-renderer';
|
|
4
|
+
/** Rendered handle size (screen px). */
|
|
5
|
+
export declare const HANDLE_SIZE = 7;
|
|
6
|
+
/** An axis-aligned box from a drag's start to its current point (any order). */
|
|
7
|
+
export interface DragBox {
|
|
8
|
+
x0: number;
|
|
9
|
+
y0: number;
|
|
10
|
+
x1: number;
|
|
11
|
+
y1: number;
|
|
12
|
+
}
|
|
13
|
+
/** A region being drawn: a rectangle drag, or a freehand / click-placed path. */
|
|
14
|
+
export interface RegionDraft {
|
|
15
|
+
rect: DragBox | null;
|
|
16
|
+
path: Array<[number, number]> | null;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* What the napari region overlay draws, over the shared {@link SvgRegionRenderer}: the regions
|
|
20
|
+
* in world coordinates (styled from the store's colours, labelled when labels are on), and in
|
|
21
|
+
* screen space the selected regions' grab handles (corners, vertices, bézier control points),
|
|
22
|
+
* the draft being drawn and the rubber-band marquee.
|
|
23
|
+
*/
|
|
24
|
+
export declare class NapariRegionSvgRenderer {
|
|
25
|
+
private readonly svg;
|
|
26
|
+
private readonly store;
|
|
27
|
+
private readonly renderer;
|
|
28
|
+
/** Dedicated marquee rect element, updated directly during the drag (no full region redraw). */
|
|
29
|
+
private marqueeEl;
|
|
30
|
+
constructor(svg: SVGSVGElement, store: RegionStore);
|
|
31
|
+
/** Follow the camera: one transform attribute plus the screen-space elements. */
|
|
32
|
+
setCamera(affine: Affine): void;
|
|
33
|
+
/** Rebuild the regions (world space) and their labels. */
|
|
34
|
+
render(regions: readonly Region[], selected: readonly number[]): void;
|
|
35
|
+
/** Rebuild the screen-space overlay only: the selected regions' handles and the draft. */
|
|
36
|
+
renderOverlay(regions: readonly Region[], selected: readonly number[], draft: RegionDraft): void;
|
|
37
|
+
/** Show the marquee over svg-local corners `(lx, ly)`–`(rx, ry)`, creating it on first use. */
|
|
38
|
+
showMarquee(lx: number, ly: number, rx: number, ry: number): void;
|
|
39
|
+
/** Remove the marquee element from the SVG. */
|
|
40
|
+
clearMarquee(): void;
|
|
41
|
+
/** A region's outline colour. */
|
|
42
|
+
private strokeOf;
|
|
43
|
+
/** Draw a region's classification label at its top-left, when labels are enabled (matches OSD). */
|
|
44
|
+
private drawLabel;
|
|
45
|
+
/** Draw grab handles for a selected region: rectangle corners or polygon vertices. */
|
|
46
|
+
private drawHandles;
|
|
47
|
+
/** Draw one bezier control point as a small circle connected to its anchor by a tangent line.
|
|
48
|
+
* `handle` is the control point's absolute position in image space. */
|
|
49
|
+
private drawBezierHandle;
|
|
50
|
+
private style;
|
|
51
|
+
/** Draw the in-progress rectangle / path preview. */
|
|
52
|
+
private drawDraft;
|
|
53
|
+
private styleDraft;
|
|
54
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { SpatialDataPort } from '../../../contracts/ports/spatial-data.port';
|
|
2
|
+
import type { SpatialViewState } from '../../../contracts/display-types';
|
|
3
|
+
import { SpatialColumn, SpatialDataset } from '../../../contracts/spatial-dataset.contract';
|
|
4
|
+
/** A categorical column's per-observation codes and its metadata (categories, colours). */
|
|
5
|
+
export interface CategoricalCodes {
|
|
6
|
+
codes: Uint16Array;
|
|
7
|
+
meta: SpatialColumn['meta'];
|
|
8
|
+
}
|
|
9
|
+
/** Per-observation group codes, and which codes are switched off (1) in the group list. */
|
|
10
|
+
export interface HiddenCodes {
|
|
11
|
+
codes: Uint16Array;
|
|
12
|
+
hidden: Uint8Array;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* The categorical columns the cells, the transcripts and the hover all read: the cell-type
|
|
16
|
+
* column's codes, and which of its groups the user switched off. A failed request rejects;
|
|
17
|
+
* the caller decides whether that fails its group of the plan or degrades to "no types".
|
|
18
|
+
*/
|
|
19
|
+
export declare class CategoricalLookup {
|
|
20
|
+
private readonly port;
|
|
21
|
+
constructor(port: SpatialDataPort);
|
|
22
|
+
/** Codes of the column `name`, or null when it is not categorical. */
|
|
23
|
+
codes(name: string): Promise<CategoricalCodes | null>;
|
|
24
|
+
/** Codes of the group column that are switched off, or null when none are. */
|
|
25
|
+
hiddenCodes(dataset: SpatialDataset, view: SpatialViewState): Promise<HiddenCodes | null>;
|
|
26
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { Rgb } from '../../../contracts/colormap-lut';
|
|
2
|
+
import type { SpatialDataPort } from '../../../contracts/ports/spatial-data.port';
|
|
3
|
+
import type { SpatialViewState } from '../../../contracts/display-types';
|
|
4
|
+
import { SpatialDataset } from '../../../contracts/spatial-dataset.contract';
|
|
5
|
+
import { SpatialSelectionMask } from '../../../spatial/spatial-selection';
|
|
6
|
+
import { DataRect } from '../../../spatial/lod';
|
|
7
|
+
import type { CategoricalLookup } from './categorical-lookup';
|
|
8
|
+
import type { OrderedLayerGroups, TileGroup } from './layer-groups';
|
|
9
|
+
import type { PlanContext } from './plan-context';
|
|
10
|
+
/** What the cell layers need from the service. */
|
|
11
|
+
export interface CellLayersHost {
|
|
12
|
+
/** The continuous LUT the view is using (so cells coloured by a gene match the markers). */
|
|
13
|
+
continuousLut(view: SpatialViewState): Rgb[];
|
|
14
|
+
/** Outlines appeared or disappeared: the markers' visibility follows. */
|
|
15
|
+
polygonsShownChanged(shown: boolean): void;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* The cell outlines of the 2D spatial view, at the polygon level the zoom calls for: a fill,
|
|
19
|
+
* an outline or both (plus nucleus outlines for the "both" cell set), coloured by the view's
|
|
20
|
+
* cell-colour mode, with switched-off groups left out of the geometry.
|
|
21
|
+
*
|
|
22
|
+
* Geometry and style are keyed apart, so a recolour (a new cell-type column, a selection)
|
|
23
|
+
* rewrites the per-shape values of the existing layers and never re-expands the rings.
|
|
24
|
+
*/
|
|
25
|
+
export declare class CellLayers {
|
|
26
|
+
private readonly port;
|
|
27
|
+
private readonly groups;
|
|
28
|
+
private readonly lookup;
|
|
29
|
+
private readonly host;
|
|
30
|
+
private polygonsShown;
|
|
31
|
+
/** Rings currently drawn and the (dataset, set, tiles) they came from. */
|
|
32
|
+
private currentRings;
|
|
33
|
+
private cellGeometryKey;
|
|
34
|
+
private currentNuclei;
|
|
35
|
+
private cellStyleKey;
|
|
36
|
+
/** Selection identity → revision, so a change key can name a selection cheaply. */
|
|
37
|
+
private lastSelection;
|
|
38
|
+
private selectionRevision;
|
|
39
|
+
/** Continuous colourings' windows, per (vector, clip, log): `contrastWindow` sorts every
|
|
40
|
+
* value, and a selection or opacity change recolours with the vector unchanged (SPATIAL-12). */
|
|
41
|
+
private readonly contrastWindows;
|
|
42
|
+
constructor(port: SpatialDataPort, groups: OrderedLayerGroups<TileGroup>, lookup: CategoricalLookup, host: CellLayersHost);
|
|
43
|
+
/** True while outlines are on screen — the service hides its dots then. */
|
|
44
|
+
get outlinesShown(): boolean;
|
|
45
|
+
/** The viewer went away (its layers with it): the outlines are no longer shown. */
|
|
46
|
+
detached(): void;
|
|
47
|
+
/** Draw the cells covering `rect` at the level `pxPerUnit` calls for, or drop them. */
|
|
48
|
+
plan(dataset: SpatialDataset, view: SpatialViewState, selection: SpatialSelectionMask, rect: DataRect, pxPerUnit: number, ctx: PlanContext): Promise<void>;
|
|
49
|
+
/**
|
|
50
|
+
* The cell layers: the fill and the outline the view's draw mode asks for, and with "both" the
|
|
51
|
+
* nucleus outlines over them. A geometry change builds new layers; a style change restyles them.
|
|
52
|
+
*/
|
|
53
|
+
private drawCells;
|
|
54
|
+
private selectionRev;
|
|
55
|
+
/**
|
|
56
|
+
* The rings' colours by their owners, by the view's cell-colour mode (Xenium Explorer's "Cell
|
|
57
|
+
* Color"): one RGBA per shape for a grouping, values + colormap for a measurement, one colour
|
|
58
|
+
* for "single". A selection mutes what it leaves out.
|
|
59
|
+
*/
|
|
60
|
+
private cellColors;
|
|
61
|
+
/**
|
|
62
|
+
* The cell rings (and, for "both", the nucleus rings) covering `rect` at `level`, minus
|
|
63
|
+
* the hidden groups — reused when nothing that decides them changed. Null when the
|
|
64
|
+
* view went stale or the dataset has no set to draw.
|
|
65
|
+
*/
|
|
66
|
+
private cellGeometry;
|
|
67
|
+
/** Remove the cell layers and forget what they showed. */
|
|
68
|
+
drop(): void;
|
|
69
|
+
private setPolygonsShown;
|
|
70
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { Viewer } from 'napari-js';
|
|
2
|
+
import { type SpatialDataPort } from '../../../contracts/ports/spatial-data.port';
|
|
3
|
+
import type { SpatialViewState } from '../../../contracts/display-types';
|
|
4
|
+
import type { SpatialDataset } from '../../../contracts/spatial-dataset.contract';
|
|
5
|
+
import type { OrderedLayerGroups, TileGroup } from './layer-groups';
|
|
6
|
+
import type { PlanContext } from './plan-context';
|
|
7
|
+
/** The density window in use and the densest bin (transcripts per unit area). */
|
|
8
|
+
export interface DensityStats {
|
|
9
|
+
lo: number;
|
|
10
|
+
hi: number;
|
|
11
|
+
max: number;
|
|
12
|
+
}
|
|
13
|
+
/** Xenium Explorer's "Estimated Transcript Points". */
|
|
14
|
+
export interface TranscriptEstimate {
|
|
15
|
+
/** Transcripts of the visible genes estimated to be in view. */
|
|
16
|
+
points: number;
|
|
17
|
+
/** The marker budget. */
|
|
18
|
+
max: number;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* The transcript density image of the 2D spatial view: the visible genes' summed density
|
|
22
|
+
* raster, one scalar layer in the `density` group, windowed and coloured on the GPU.
|
|
23
|
+
*
|
|
24
|
+
* Bins at or below the window's low end are transparent (`transparentBelow`), so a window,
|
|
25
|
+
* colormap or opacity change is a uniform or LUT update of the same layer: only new genes or a
|
|
26
|
+
* new bin size fetch and upload a raster.
|
|
27
|
+
*/
|
|
28
|
+
export declare class DensityLayer {
|
|
29
|
+
private readonly port;
|
|
30
|
+
private readonly groups;
|
|
31
|
+
private readonly changed;
|
|
32
|
+
/** The density window in use and the densest bin, for the panel's threshold control. */
|
|
33
|
+
stats: DensityStats | null;
|
|
34
|
+
/** The drawn raster in transcripts per unit area, its densest bin and its auto window. */
|
|
35
|
+
private raster;
|
|
36
|
+
/** The colormap the layer was given, so an unchanged one does not rebuild its LUT. */
|
|
37
|
+
private colormapKey;
|
|
38
|
+
constructor(port: SpatialDataPort, groups: OrderedLayerGroups<TileGroup>, changed: (stats: DensityStats) => void);
|
|
39
|
+
/** Draw the view's density, or drop it; an unchanged (genes, bin, window, colormap) is a no-op. */
|
|
40
|
+
plan(dataset: SpatialDataset, view: SpatialViewState, ctx: PlanContext): Promise<void>;
|
|
41
|
+
/** Window, colour and opacity onto the drawn layer: uniforms and a LUT, no re-upload. */
|
|
42
|
+
private restyle;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Transcripts in view for the visible genes, against the marker budget — it tells the user
|
|
46
|
+
* whether the budget will force grouping. Caches the per-gene dataset totals for the latest
|
|
47
|
+
* gene set.
|
|
48
|
+
*/
|
|
49
|
+
export declare class TranscriptEstimator {
|
|
50
|
+
private readonly port;
|
|
51
|
+
private readonly changed;
|
|
52
|
+
/** Per-gene dataset totals for the in-view estimate, for the latest gene set. */
|
|
53
|
+
private countsCache;
|
|
54
|
+
constructor(port: SpatialDataPort, changed: (estimate: TranscriptEstimate | null) => void);
|
|
55
|
+
/**
|
|
56
|
+
* Transcripts in view for the visible genes: each gene's dataset total times the share
|
|
57
|
+
* of the tissue on screen. An estimate — expression is not uniform — which is also what
|
|
58
|
+
* Xenium Explorer shows; it tells the user whether the budget will force grouping.
|
|
59
|
+
*/
|
|
60
|
+
plan(dataset: SpatialDataset, view: SpatialViewState, viewer: Viewer, w: number, h: number, ctx: PlanContext): Promise<void>;
|
|
61
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { Layer, Viewer } from 'napari-js';
|
|
2
|
+
import type { SpatialPolygons } from '../../../contracts/spatial-dataset.contract';
|
|
3
|
+
/** The layer groups of the 2D spatial tile view. */
|
|
4
|
+
export type TileGroup = 'density' | 'cellFill' | 'cellOutline' | 'nucleusOutline' | 'transcripts';
|
|
5
|
+
/**
|
|
6
|
+
* Bottom to top: cell fill, cell outline, nucleus outline, the transcript density, then the
|
|
7
|
+
* transcripts. The density goes OVER the service's observation markers on purpose: under 10^5
|
|
8
|
+
* dots it would only show in the gaps between cells.
|
|
9
|
+
*/
|
|
10
|
+
export declare const TILE_LAYER_ORDER: readonly TileGroup[];
|
|
11
|
+
/**
|
|
12
|
+
* One napari-js layer per named group, kept in a fixed bottom-to-top order, plus what each
|
|
13
|
+
* group currently shows (its key), so an unchanged plan is a no-op.
|
|
14
|
+
*
|
|
15
|
+
* Order is kept with `LayerList.move`, which restacks a layer without disposing its GPU visual
|
|
16
|
+
* (a remove + re-add would re-upload its whole buffer, review NAPARI-BOUNDARY-11). A plan still
|
|
17
|
+
* restores the order once, after all its groups are in place, and moves only the layers that
|
|
18
|
+
* are out of place ({@link restoreOrder}).
|
|
19
|
+
*/
|
|
20
|
+
export declare class OrderedLayerGroups<G extends string> {
|
|
21
|
+
private readonly order;
|
|
22
|
+
private current;
|
|
23
|
+
private readonly layers;
|
|
24
|
+
/** What each group currently shows, so an unchanged plan is a no-op. */
|
|
25
|
+
private readonly keys;
|
|
26
|
+
constructor(order: readonly G[]);
|
|
27
|
+
/** The viewer the groups are drawn into, while attached. */
|
|
28
|
+
get viewer(): Viewer | null;
|
|
29
|
+
attach(viewer: Viewer): void;
|
|
30
|
+
/** Remove every group's layer from the viewer and forget the layers, keys and viewer. */
|
|
31
|
+
detach(): void;
|
|
32
|
+
/** Whether `group` has a layer (on screen or not). */
|
|
33
|
+
has(group: G): boolean;
|
|
34
|
+
/** `group`'s layer (on screen or not), if it has one. */
|
|
35
|
+
layer(group: G): Layer | undefined;
|
|
36
|
+
/** Whether `group`'s layer is in the viewer now. */
|
|
37
|
+
shown(group: G): boolean;
|
|
38
|
+
/** What `group` currently shows, as its plan keyed it. */
|
|
39
|
+
key(group: G): string | undefined;
|
|
40
|
+
setKey(group: G, key: string): void;
|
|
41
|
+
/** Forget what `group` shows, so the next plan redraws it. */
|
|
42
|
+
forgetKey(group: G): void;
|
|
43
|
+
/** Whether `layer` is one of the groups' layers. */
|
|
44
|
+
owns(layer: Layer): boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Put a shapes layer in place for `group`: a geometry change builds a new layer, a
|
|
47
|
+
* colour-only change mutates the per-shape colours or values/colormap of the existing one.
|
|
48
|
+
*/
|
|
49
|
+
upsertShapes(group: G, wanted: boolean, geometryChanged: boolean, rings: SpatialPolygons, opts: Parameters<Viewer['addShapes']>[2] & object): void;
|
|
50
|
+
/**
|
|
51
|
+
* Install `layer` as `group`'s layer. The layer was just added by the caller, so it is on
|
|
52
|
+
* top: the plan puts the groups that belong above it back in place once it is done
|
|
53
|
+
* ({@link restoreOrder}), rather than after every replaced group.
|
|
54
|
+
*/
|
|
55
|
+
replace(group: G, layer: Layer): void;
|
|
56
|
+
/**
|
|
57
|
+
* Put the groups' layers in order, moving to the top only from the first one out of place
|
|
58
|
+
* (and, with `aboveOthers`, the first one under a layer that is not ours — the service's
|
|
59
|
+
* markers). Everything before that is already where it belongs. A move keeps each layer
|
|
60
|
+
* mounted (no `removed`/`added`), so nothing is re-uploaded.
|
|
61
|
+
*/
|
|
62
|
+
restoreOrder(aboveOthers: boolean): void;
|
|
63
|
+
/** Remove `group`'s layer and forget its key. */
|
|
64
|
+
drop(group: G): void;
|
|
65
|
+
/** Drop every group. */
|
|
66
|
+
dropAll(): void;
|
|
67
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loads in flight, per layer label ("Transcripts", "Cells"…), for the canvas loading badge.
|
|
3
|
+
* Shared by every plan: a label stays reported while any plan still loads it.
|
|
4
|
+
*/
|
|
5
|
+
export declare class LoadTracker {
|
|
6
|
+
private readonly changed;
|
|
7
|
+
private readonly loading;
|
|
8
|
+
constructor(changed: (labels: string[]) => void);
|
|
9
|
+
/** Report `label` loading while `work` is in flight. */
|
|
10
|
+
track<T>(label: string, work: Promise<T>): Promise<T>;
|
|
11
|
+
/** Forget every load (the viewer went away) and report none. */
|
|
12
|
+
clear(): void;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* One run of `NapariSpatialTileLayers.plan()`. Completeness belongs to the run that did the
|
|
16
|
+
* fetching: on the instance, a superseded run's failed tile marked the CURRENT run incomplete,
|
|
17
|
+
* which then skipped caching its keys and retried for nothing (review NAPARI-BOUNDARY-9).
|
|
18
|
+
*/
|
|
19
|
+
export declare class PlanContext {
|
|
20
|
+
private readonly isStale;
|
|
21
|
+
private readonly loads;
|
|
22
|
+
private failed;
|
|
23
|
+
/** `isStale` turns true once a newer plan started or the viewer changed. */
|
|
24
|
+
constructor(isStale: () => boolean, loads: LoadTracker);
|
|
25
|
+
/** True once a newer plan started or the viewer changed. */
|
|
26
|
+
stale(): boolean;
|
|
27
|
+
/** Set when a fetch of this run failed (see fetchAll): don't cache it as done; retry. */
|
|
28
|
+
get incomplete(): boolean;
|
|
29
|
+
/** A request of this run failed: what it drew must not be cached as done. */
|
|
30
|
+
markIncomplete(): void;
|
|
31
|
+
/** Report `label` loading while `work` is in flight. */
|
|
32
|
+
track<T>(label: string, work: Promise<T>): Promise<T>;
|
|
33
|
+
/**
|
|
34
|
+
* Fetch every tile, drawing what arrived. A failure does not fail the view, but it marks this
|
|
35
|
+
* run incomplete: the caller must not cache it as done, and `plan()` retries it.
|
|
36
|
+
*/
|
|
37
|
+
fetchAll<K, T>(keys: K[], load: (k: K) => Promise<T>): Promise<T[]>;
|
|
38
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { PointsLayer } from 'napari-js';
|
|
2
|
+
import type { SpatialDataPort } from '../../../contracts/ports/spatial-data.port';
|
|
3
|
+
import { SpatialTranscriptTile } from '../../../contracts/spatial-dataset.contract';
|
|
4
|
+
import type { CategoricalCodes } from './categorical-lookup';
|
|
5
|
+
/** What one transcript entry is — decides what hovering it says. */
|
|
6
|
+
export type TranscriptKind = 'genes' | 'individual' | 'bins';
|
|
7
|
+
/** A bin grid: its size and origin, so a hovered bin's square can be recovered. */
|
|
8
|
+
export interface TranscriptBin {
|
|
9
|
+
size: number;
|
|
10
|
+
origin: [number, number];
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Tooltips for the transcript markers of the 2D spatial view.
|
|
14
|
+
*
|
|
15
|
+
* Reads only what the transcript layer last drew — handed over one way through
|
|
16
|
+
* {@link setDrawn} / {@link setTypes} — and asks the server for the slower details (distinct
|
|
17
|
+
* genes in a group, its top genes and cells, the cell's display id) once the pointer has
|
|
18
|
+
* rested on a marker, caching them until the next draw.
|
|
19
|
+
*/
|
|
20
|
+
export declare class TranscriptHover {
|
|
21
|
+
private readonly port;
|
|
22
|
+
private readonly layerShown;
|
|
23
|
+
/** What the transcript layer currently shows (written by drawing, read by hover). */
|
|
24
|
+
private drawn;
|
|
25
|
+
/** The cell-type column, to name the cell a marker is in. */
|
|
26
|
+
private types;
|
|
27
|
+
/** µm per observation unit of the drawn dataset, for describing a grouped marker's area. */
|
|
28
|
+
private micronsPerUnit;
|
|
29
|
+
/** Details already fetched, by hovered entry. */
|
|
30
|
+
private readonly cache;
|
|
31
|
+
private key;
|
|
32
|
+
private timer;
|
|
33
|
+
/** `layerShown` says whether the transcript layer is on screen now (it may have been dropped). */
|
|
34
|
+
constructor(port: SpatialDataPort, layerShown: () => boolean);
|
|
35
|
+
/** The transcript layer was redrawn: hover names these entries now (cached details are dropped). */
|
|
36
|
+
setDrawn(drawn: DrawnTranscripts, micronsPerUnit: number | null): void;
|
|
37
|
+
/** The cell-type column the drawn entries' cells are named by, or null. */
|
|
38
|
+
setTypes(types: CategoricalCodes | null): void;
|
|
39
|
+
/** Nothing is drawn any more. */
|
|
40
|
+
clear(): void;
|
|
41
|
+
/** Stop a pending details request and forget what was drawn. */
|
|
42
|
+
dispose(): void;
|
|
43
|
+
/**
|
|
44
|
+
* Tooltip lines for the transcript marker under world point `(wx, wy)`, or null.
|
|
45
|
+
*
|
|
46
|
+
* The marker is napari-js's pick on the drawn layer: hit anywhere on it, or within
|
|
47
|
+
* `radiusWorld` of its centre when it is smaller than that, the NEAREST centre winning
|
|
48
|
+
* among several (an exact tie, such as two genes' groups on one bin centre, goes to the one
|
|
49
|
+
* drawn on top). Returns what is known at once (gene, count, cell type); anything that needs
|
|
50
|
+
* the server — distinct genes in a group, its top genes and cells, the cell's display id —
|
|
51
|
+
* arrives through `onDetails` once the pointer has rested on the marker briefly.
|
|
52
|
+
*/
|
|
53
|
+
hoverAt(wx: number, wy: number, radiusWorld: number, onDetails: (lines: string[]) => void): string[] | null;
|
|
54
|
+
private fetchDetails;
|
|
55
|
+
/** The tooltip text for entry `i`, with the server's details when they have arrived. */
|
|
56
|
+
private describe;
|
|
57
|
+
}
|
|
58
|
+
/** What the transcript layer currently shows — what hovering needs to name a marker. */
|
|
59
|
+
export interface DrawnTranscripts {
|
|
60
|
+
kind: TranscriptKind;
|
|
61
|
+
bin?: TranscriptBin;
|
|
62
|
+
merged: SpatialTranscriptTile;
|
|
63
|
+
/** The layer the entries are drawn in, one marker per entry in the same order. */
|
|
64
|
+
layer: PointsLayer;
|
|
65
|
+
genes: string[];
|
|
66
|
+
/** For a grouped gene selection: each entry's group, and the groups' names. */
|
|
67
|
+
entryGroup?: Int32Array;
|
|
68
|
+
groupNames?: string[];
|
|
69
|
+
/** Each group's genes, when the markers came from the density grids (for the hover). */
|
|
70
|
+
groupGenes?: string[][];
|
|
71
|
+
}
|