@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,161 @@
|
|
|
1
|
+
import type * as OpenSeadragon from 'openseadragon';
|
|
2
|
+
import { DisplayPipeline } from './display-pipeline';
|
|
3
|
+
import { HistogramSampler } from './histogram-sampler';
|
|
4
|
+
import { TileDescriptor } from '../tile-server';
|
|
5
|
+
import { IImageInfo } from '../../contracts/image.contract';
|
|
6
|
+
import { IChannelState } from '../../contracts/channel-histogram-api.contract';
|
|
7
|
+
import { SimpleSliceAccessService } from '../simple-slice-access.service';
|
|
8
|
+
/** One decoded single-band channel plane (serverless multichannel). */
|
|
9
|
+
export interface SimplePlane {
|
|
10
|
+
data: Uint8ClampedArray;
|
|
11
|
+
width: number;
|
|
12
|
+
height: number;
|
|
13
|
+
}
|
|
14
|
+
/** What `load()` hands to `plot()`. `load()` only computes it: the image on
|
|
15
|
+
* screen keeps its own state until `plot()` commits this payload. */
|
|
16
|
+
export interface OsdLoaded {
|
|
17
|
+
descriptor: TileDescriptor | null;
|
|
18
|
+
infoB64: string;
|
|
19
|
+
z: number;
|
|
20
|
+
/** Mirrors the loaded image's filename — the diagram's render pipeline
|
|
21
|
+
* guards on `loaded.filename === phaseInfo.fileName` before calling plot(). */
|
|
22
|
+
filename: string | undefined;
|
|
23
|
+
/** Simple (non-tiled) image: `plot()` opens {@link url} directly via OSD's
|
|
24
|
+
* single-image source — no tile pyramid, no server. Set when the image
|
|
25
|
+
* carries `tiled === false` (see {@link IImageInfo.tiled}). */
|
|
26
|
+
simple?: boolean;
|
|
27
|
+
/** The directly-loadable image URL (`blob:`/`data:`/`http`) for simple mode. */
|
|
28
|
+
url?: string;
|
|
29
|
+
/** Serverless multichannel only: every slice's per-channel plane URLs, and
|
|
30
|
+
* the loaded slice's decoded planes ({@link url} is their composite). */
|
|
31
|
+
channelUrls?: string[][];
|
|
32
|
+
channelPlanes?: SimplePlane[];
|
|
33
|
+
}
|
|
34
|
+
/** The service state the simple source reads and drives. */
|
|
35
|
+
export interface SimpleSourceHost {
|
|
36
|
+
viewer(): OpenSeadragon.Viewer | null;
|
|
37
|
+
descriptor(): TileDescriptor | null;
|
|
38
|
+
isGrayscale(): boolean;
|
|
39
|
+
currentZ(): number;
|
|
40
|
+
/** Show slice `z`: the service records it and drops its slice-specific readback. */
|
|
41
|
+
setCurrentZ(z: number): void;
|
|
42
|
+
sampler(): HistogramSampler;
|
|
43
|
+
display(): DisplayPipeline;
|
|
44
|
+
channelStates(): IChannelState[];
|
|
45
|
+
/** Whether display round `token` is still the current one (see OsdTileRecolorer). */
|
|
46
|
+
isCurrentDisplay(token: number): boolean;
|
|
47
|
+
/** Queue a coalesced display round (for the serverless multichannel recomposite). */
|
|
48
|
+
scheduleInvalidate(): void;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* The "simple" (`tiled: false`) image source: self-contained per-slice URLs and
|
|
52
|
+
* no tile server — e.g. a numbered image series assembled client-side into a
|
|
53
|
+
* stack, or the processing-pipeline preview. Each slice is resampled to the
|
|
54
|
+
* full-resolution size so regions align and opened as OSD's single-image source;
|
|
55
|
+
* a SERVERLESS multichannel image is composited client-side from its per-channel
|
|
56
|
+
* planes (kept OFF the tiled per-channel path).
|
|
57
|
+
*
|
|
58
|
+
* Owns every piece of simple-mode state and is the single place that resets it,
|
|
59
|
+
* so none of it can outlive the simple image (OSD-PLOTLY-1).
|
|
60
|
+
*/
|
|
61
|
+
export declare class OsdSimpleSource {
|
|
62
|
+
private readonly host;
|
|
63
|
+
private readonly simpleStack;
|
|
64
|
+
/** True while the mounted image is simple: setZIndex re-opens the viewer on
|
|
65
|
+
* the new slice's URL instead of toggling a tiled slice. */
|
|
66
|
+
active: boolean;
|
|
67
|
+
/** urls[] of the mounted simple image, for the slice being scrubbed to. */
|
|
68
|
+
urls: string[];
|
|
69
|
+
/** preview blob URL → full-res resampled blob URL (see toFullResUrl), so
|
|
70
|
+
* re-visiting a slice doesn't re-resample. Revoked on file change. */
|
|
71
|
+
private readonly fullResUrls;
|
|
72
|
+
/** SERVERLESS multichannel (tiled:false + channelCount>1): the stack's
|
|
73
|
+
* per-slice per-channel plane URLs, the current slice's decoded planes, and
|
|
74
|
+
* the displayed composite blob URL. */
|
|
75
|
+
multichannel: boolean;
|
|
76
|
+
channelUrls: string[][];
|
|
77
|
+
channelPlanes: SimplePlane[];
|
|
78
|
+
compositeUrl: string | null;
|
|
79
|
+
constructor(host: SimpleSourceHost, simpleStack: SimpleSliceAccessService);
|
|
80
|
+
/** Forget the simple image's state: mode, slice URLs and the serverless-
|
|
81
|
+
* multichannel flag, URLs and decoded planes. Called when a tiled image is
|
|
82
|
+
* mounted and on teardown; {@link commit} sets it from an {@link OsdLoaded}. */
|
|
83
|
+
reset(): void;
|
|
84
|
+
/** Revoke every blob URL this source created (a different file was selected). */
|
|
85
|
+
revokeUrls(): void;
|
|
86
|
+
/** Build the `plot()` payload for a simple (tiled:false) image: a single-level
|
|
87
|
+
* descriptor sized from `trueImageSize`, plus the directly-loadable URL —
|
|
88
|
+
* resolved and fetched via {@link SimpleSliceAccessService} (shared with
|
|
89
|
+
* napari-js; see its docs for why this can't be a raw `fetch()`/`<img>`).
|
|
90
|
+
* Those fetches take no signal, so an abort is honoured once they settle. */
|
|
91
|
+
load(imageInfo: IImageInfo, zIndex: number, signal?: AbortSignal): Promise<OsdLoaded>;
|
|
92
|
+
/** Commit a mounted image's simple-mode state from its {@link OsdLoaded}
|
|
93
|
+
* payload (cleared for a tiled one). */
|
|
94
|
+
commit(loaded: OsdLoaded, imageInfo: IImageInfo): void;
|
|
95
|
+
/** The simple image's new viewer is about to open `loaded.url` (the old viewer
|
|
96
|
+
* is gone): take ownership of its composite and bin its histograms — after
|
|
97
|
+
* the service's destroyViewer, whose last act is clearing the sampler. */
|
|
98
|
+
mount(loaded: OsdLoaded): void;
|
|
99
|
+
/**
|
|
100
|
+
* The in-place (large-tier) pass for a mounted simple image. Simple mode has
|
|
101
|
+
* no pyramid to fall back on: it displays literally whatever URL was last
|
|
102
|
+
* opened, so without this swap the small tier's 128px placeholder would stay
|
|
103
|
+
* on screen forever (pixelated, never "sharpening" like the tiled path).
|
|
104
|
+
*/
|
|
105
|
+
refreshInPlace(loaded: OsdLoaded, imageInfo: IImageInfo): void;
|
|
106
|
+
/**
|
|
107
|
+
* Show slice `z` of the mounted simple image. Each slice is its own complete
|
|
108
|
+
* image (no pyramid to toggle opacity on), so this re-opens the viewer on the
|
|
109
|
+
* new slice's URL; the viewer's preserveViewport keeps the current zoom/pan.
|
|
110
|
+
* Scrubs can resolve out of order: only the current slice may land.
|
|
111
|
+
*/
|
|
112
|
+
setZIndex(z: number): void;
|
|
113
|
+
/**
|
|
114
|
+
* OSD's `{type:'image'}` source sizes its coordinate world to the image's
|
|
115
|
+
* NATURAL pixels. A folder-stack slice is a server `/preview` whose pixel size
|
|
116
|
+
* needn't match the full-resolution image — it may be downscaled (large
|
|
117
|
+
* images) OR larger than the dimensions `/metadata` reports. Either way OSD's
|
|
118
|
+
* world would differ from the full-res ROI coordinate space (QuPath geojson,
|
|
119
|
+
* in level-0 pixels): a smaller preview renders ROIs oversized, a larger one
|
|
120
|
+
* renders them undersized/offset. Resample the preview to EXACTLY the
|
|
121
|
+
* full-resolution dimensions (blurry but positionally exact — scaling up or
|
|
122
|
+
* down as needed) so OSD's world matches the ROI coordinate space, while still
|
|
123
|
+
* using OSD's reliable single-image renderer. Cached per preview URL (revoked
|
|
124
|
+
* on file change); a no-op when the preview is already exactly full-res (small
|
|
125
|
+
* images, in-memory pipeline blobs), when the dims are unknown, or when
|
|
126
|
+
* they're implausibly large (guards against an enormous canvas). (jit-ui#93)
|
|
127
|
+
*/
|
|
128
|
+
toFullResUrl(previewUrl: string, width: number, height: number): Promise<string>;
|
|
129
|
+
/** Sample a slice's own decoded pixels into the histogram — the serverless
|
|
130
|
+
* analog of the tiled samplers (no tile server). Fire-and-forget; a decode
|
|
131
|
+
* failure just leaves the pane empty rather than throwing. */
|
|
132
|
+
private sampleHistogram;
|
|
133
|
+
/** Fetch + decode a slice's per-channel planes (single-band grayscale) into
|
|
134
|
+
* pixel buffers, for the serverless multichannel compositor. Auth-safe: goes
|
|
135
|
+
* through SimpleSliceAccessService (blob:/data: as-is; http via HttpClient).
|
|
136
|
+
* The channels are fetched in parallel; plane c stays at index c, and a
|
|
137
|
+
* plane that fails to load is empty (the compositor skips it). */
|
|
138
|
+
loadChannelPlanes(urls: string[] | undefined): Promise<SimplePlane[]>;
|
|
139
|
+
/** Composite per-channel planes into ONE RGBA image using the current channel
|
|
140
|
+
* states (colour/window/gamma/visibility) — the client-side analog of the
|
|
141
|
+
* tiled per-channel 'lighter' compositor (same display.channelRgbLut math as
|
|
142
|
+
* the channel-tile recolor, applied per-plane). Returns a new blob: URL of the
|
|
143
|
+
* composite PNG, owned by the caller (see {@link openComposite}). */
|
|
144
|
+
composite(planes: SimplePlane[]): Promise<string | undefined>;
|
|
145
|
+
/** Re-composite the current slice from its cached planes (new channel states)
|
|
146
|
+
* and re-open — the serverless analog of the tiled invalidate-on-channel-change.
|
|
147
|
+
* Runs from the recolorer's invalidateDisplay, so it is coalesced per frame,
|
|
148
|
+
* and drops its composite once a newer display round (`token`) has started. */
|
|
149
|
+
recompositeAndOpen(token: number): Promise<void>;
|
|
150
|
+
/** Open a serverless-multichannel composite and take ownership of its URL. The
|
|
151
|
+
* previously displayed composite is revoked only once this open settles: an
|
|
152
|
+
* `open()` still decoding a revoked blob: URL fails. */
|
|
153
|
+
private openComposite;
|
|
154
|
+
/** Commit the serverless-multichannel part of an {@link OsdLoaded} payload. */
|
|
155
|
+
private commitMultichannel;
|
|
156
|
+
/** Decode an image URL to RGBA pixels (null for an empty image or no 2d
|
|
157
|
+
* context). Throws when the URL can't be decoded. */
|
|
158
|
+
decodeUrlToRgba(url: string): Promise<ImageData | null>;
|
|
159
|
+
/** Load a URL into an HTMLImageElement (resolves once decoded). */
|
|
160
|
+
loadImageEl(url: string): Promise<HTMLImageElement>;
|
|
161
|
+
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { OsdTiledImageLike, OsdViewerLike } from './osd-viewer-like';
|
|
1
2
|
/**
|
|
2
3
|
* Stack-slice cache for the OpenSeadragon backend (refactoring plan, Step 3 —
|
|
3
4
|
* a pure move of the cache cluster out of the visualizer service).
|
|
@@ -17,7 +18,7 @@
|
|
|
17
18
|
* viewer/descriptor/z — matching the field reads it replaced. */
|
|
18
19
|
export interface SliceCacheHost {
|
|
19
20
|
/** The mounted viewer, or null. */
|
|
20
|
-
viewer():
|
|
21
|
+
viewer(): OsdViewerLike | null;
|
|
21
22
|
/** True when a viewer, descriptor and infoB64 are all present. */
|
|
22
23
|
hasImage(): boolean;
|
|
23
24
|
/** Stack depth (descriptor.z, 1 for single images). */
|
|
@@ -31,7 +32,7 @@ export interface SliceCacheHost {
|
|
|
31
32
|
/** Channel visibility (drives group reveal opacity). */
|
|
32
33
|
channelVisible(c: number): boolean;
|
|
33
34
|
/** Tile source for slice z (optionally one channel). */
|
|
34
|
-
buildTileSource(z: number, channel?: number):
|
|
35
|
+
buildTileSource(z: number, channel?: number): string | object;
|
|
35
36
|
/** A composite slice landed in the world — the service samples its window. */
|
|
36
37
|
onCompositeSliceAdded(z: number): void;
|
|
37
38
|
}
|
|
@@ -84,9 +85,17 @@ export declare class SliceCache {
|
|
|
84
85
|
maxSlices(): number;
|
|
85
86
|
/** Drop the per-channel groups (on a fresh plot). */
|
|
86
87
|
clearChannelGroups(): void;
|
|
88
|
+
/**
|
|
89
|
+
* Take over the slice the viewer just opened (world item 0). Composite: seed
|
|
90
|
+
* the cache with it, so scrubbing back to it later is an instant opacity
|
|
91
|
+
* toggle, not a re-open. Multichannel: drop that single (channel-0) image and
|
|
92
|
+
* add the slice's channel group instead; the background loader / LRU then
|
|
93
|
+
* pre-fills the other slices' groups so z-scrub is flicker-free.
|
|
94
|
+
*/
|
|
95
|
+
adoptOpenedSlice(z: number): void;
|
|
87
96
|
/** Seed the cache with the just-opened composite slice (world item 0), so
|
|
88
97
|
* scrubbing back to it later is an instant opacity toggle, not a re-open. */
|
|
89
|
-
seedComposite(z: number, item:
|
|
98
|
+
seedComposite(z: number, item: OsdTiledImageLike): void;
|
|
90
99
|
/** Show slice z: reveal it instantly when cached (re-tinting a stale
|
|
91
100
|
* multichannel group), otherwise add it once. The current slice stays
|
|
92
101
|
* visible until the new one is in — no white-flicker. */
|
|
@@ -3,26 +3,19 @@ import { HttpClient } from '@angular/common/http';
|
|
|
3
3
|
* Single source of truth for jit-service `/tile` access from the OSD backend
|
|
4
4
|
* (refactoring plan, Step 2). Before this module the tile URL was string-built
|
|
5
5
|
* in four places and the fetch→decode pipeline copy-pasted in three — every
|
|
6
|
-
* query-param change had to be repeated per site.
|
|
6
|
+
* query-param change had to be repeated per site. The URL itself now lives in
|
|
7
|
+
* the shared `tile-server/` client.
|
|
7
8
|
*
|
|
8
9
|
* Error handling is deliberately left to the CALL SITES: these helpers
|
|
9
10
|
* propagate failures so each caller keeps its own tagged catch
|
|
10
11
|
* (`[viz:histogram]`, `[viz:window]`, `[viz:export]`) and its own
|
|
11
12
|
* skip/fallback semantics.
|
|
12
13
|
*/
|
|
13
|
-
/**
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
export
|
|
17
|
-
|
|
18
|
-
col: number;
|
|
19
|
-
row: number;
|
|
20
|
-
z: number;
|
|
21
|
-
tileSize: number;
|
|
22
|
-
channel?: number | null;
|
|
23
|
-
}
|
|
24
|
-
/** Build the `/tile` request URL — the one place its query shape lives. */
|
|
25
|
-
export declare function buildTileUrl(api: string, infoB64: string, c: TileCoords): string;
|
|
14
|
+
/** The `/tile` URL shape moved to the backend-neutral jit-service client
|
|
15
|
+
* (`implementations/tile-server/`), shared with napari-js; re-exported so the OSD
|
|
16
|
+
* modules keep importing it from here. */
|
|
17
|
+
export { buildTileUrl } from '../tile-server/tile-protocol';
|
|
18
|
+
export type { TileCoords } from '../tile-server/tile-protocol';
|
|
26
19
|
/** Fetch a tile PNG and decode it to an ImageBitmap. The caller owns the
|
|
27
20
|
* bitmap (call `close()` when done). Throws on network/decode failure. */
|
|
28
21
|
export declare function fetchTileBitmap(http: HttpClient, url: string, timeoutMs: number): Promise<ImageBitmap>;
|
|
@@ -30,3 +23,7 @@ export declare function fetchTileBitmap(http: HttpClient, url: string, timeoutMs
|
|
|
30
23
|
* canvas). Returns null only when a 2d context can't be created; throws on
|
|
31
24
|
* network/decode failure (the caller's tagged catch handles it). */
|
|
32
25
|
export declare function fetchTileRgba(http: HttpClient, url: string, timeoutMs: number): Promise<ImageData | null>;
|
|
26
|
+
/** Draw a decoded image (bitmap, `<img>`, canvas) onto a scratch canvas and
|
|
27
|
+
* read its pixels back as RGBA ImageData. Null when a 2d context can't be
|
|
28
|
+
* created. */
|
|
29
|
+
export declare function readRgba(src: CanvasImageSource, width: number, height: number): ImageData | null;
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import type * as OpenSeadragon from 'openseadragon';
|
|
2
|
+
import { DisplayPipeline } from './display-pipeline';
|
|
3
|
+
import { VisualizerStore } from '../../store/visualizer-store.service';
|
|
4
|
+
import { Rgb } from '../../contracts/colormap-lut';
|
|
5
|
+
import { IChannelState } from '../../contracts/channel-histogram-api.contract';
|
|
6
|
+
/** The service state the recolorer reads — live, so it follows a viewer rebuild. */
|
|
7
|
+
export interface TileRecolorHost {
|
|
8
|
+
viewer(): OpenSeadragon.Viewer | null;
|
|
9
|
+
isGrayscale(): boolean;
|
|
10
|
+
isMultiChannel(): boolean;
|
|
11
|
+
/** Serverless multichannel: recolor by re-compositing the cached planes. */
|
|
12
|
+
isSimpleMultichannel(): boolean;
|
|
13
|
+
currentZ(): number;
|
|
14
|
+
/** Re-apply the current slice's per-channel visibility (multichannel). */
|
|
15
|
+
revealChannelSlice(z: number): void;
|
|
16
|
+
/** Invalidate only the visible slice's channel images (multichannel). */
|
|
17
|
+
invalidateChannelDisplay(z: number): void;
|
|
18
|
+
/** Re-composite the serverless-multichannel planes for display round `token`. */
|
|
19
|
+
recomposite(token: number): void;
|
|
20
|
+
}
|
|
21
|
+
/** The tile-invalidated event's pixel accessors (OSD 5+/6), as used here. */
|
|
22
|
+
interface TileEvent {
|
|
23
|
+
tile?: {
|
|
24
|
+
getUrl?: () => string;
|
|
25
|
+
url?: string;
|
|
26
|
+
};
|
|
27
|
+
getData(type: string): Promise<unknown>;
|
|
28
|
+
setData(data: unknown, type: string): Promise<unknown>;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Client-side display for OpenSeadragon tiles: window/gamma/colormap/invert and
|
|
32
|
+
* per-channel tints, applied through OSD's `tile-invalidated` pixel pipeline.
|
|
33
|
+
*
|
|
34
|
+
* Owns the display state mirrored from the shared {@link VisualizerStore} (the
|
|
35
|
+
* LUT, the channel states, invert) and the recolor invariant: invalidations are
|
|
36
|
+
* coalesced to one per animation frame, and every round captures
|
|
37
|
+
* {@link displayToken} — a round that a newer one has superseded must not write
|
|
38
|
+
* its pixels back.
|
|
39
|
+
*/
|
|
40
|
+
export declare class OsdTileRecolorer {
|
|
41
|
+
private readonly host;
|
|
42
|
+
private readonly store;
|
|
43
|
+
/** Pixel display pipeline (window/gamma/invert/colormap + additive tint) —
|
|
44
|
+
* shared by tile recoloring, the serverless compositor and the composite
|
|
45
|
+
* export so they stay identical (see DisplayPipeline). */
|
|
46
|
+
readonly display: DisplayPipeline;
|
|
47
|
+
/** 256-entry RGB LUT for the active colormap, applied to grayscale tiles
|
|
48
|
+
* (mirrors Plotly's heatmap colorscale). Null while options resolve;
|
|
49
|
+
* recoloring is skipped until it's built. */
|
|
50
|
+
colorLut: Rgb[] | null;
|
|
51
|
+
/** Latest per-channel display state (window/gamma/visibility) from the store,
|
|
52
|
+
* read synchronously by recolorTile. Channel 0 drives grayscale windowing;
|
|
53
|
+
* R/G/B (indices 0-2) drive RGB per-channel windowing. */
|
|
54
|
+
channelStates: IChannelState[];
|
|
55
|
+
/** Inverted background (white = zero): inverts the windowed value before the
|
|
56
|
+
* gamma and the LUT (grayscale) / per channel before the additive merge (RGB
|
|
57
|
+
* and multichannel), as napari-js does. */
|
|
58
|
+
invertBg: boolean;
|
|
59
|
+
/** Bumped by every display invalidation. A recolor round captures it and, after
|
|
60
|
+
* each `await`, abandons the tile once a newer round has started. Writing a
|
|
61
|
+
* superseded context back is not merely wasted work: OSD's conversion sees a
|
|
62
|
+
* canvas the newer round already replaced, throws `DOMException`, and
|
|
63
|
+
* `_handleConversionError` DESTROYS the cache record and unloads the tile
|
|
64
|
+
* (unlike the drawer's rasterBlob path, it does not re-prepare). Enough of
|
|
65
|
+
* those and the viewer goes white mid-drag. */
|
|
66
|
+
displayToken: number;
|
|
67
|
+
/** Pending coalesced invalidation (see {@link scheduleInvalidate}). */
|
|
68
|
+
private invalidateHandle;
|
|
69
|
+
private sub;
|
|
70
|
+
constructor(host: TileRecolorHost, store: VisualizerStore);
|
|
71
|
+
/** Whether display round `token` is still the current one. */
|
|
72
|
+
isCurrent(token: number): boolean;
|
|
73
|
+
/**
|
|
74
|
+
* Subscribe to the shared VisualizerStore colormap/reverse so OSD recolors in
|
|
75
|
+
* lock-step with Plotly. Idempotent and self-healing: the service is a root
|
|
76
|
+
* singleton, but `unsubscribe()` (called on VisualizerComponent destroy)
|
|
77
|
+
* tears the subscription down — and the constructor never runs again. So
|
|
78
|
+
* `plot()` calls this to re-establish it after a component teardown/recreate
|
|
79
|
+
* (e.g. switching images), otherwise colormap changes would be silently
|
|
80
|
+
* dropped on every image after the first switch.
|
|
81
|
+
*/
|
|
82
|
+
ensureSubscription(): void;
|
|
83
|
+
/** Tear the store subscription down and drop a queued invalidation, so it
|
|
84
|
+
* can't fire against a torn-down viewer. */
|
|
85
|
+
unsubscribe(): void;
|
|
86
|
+
/** Seed the Intensity channel with a measured auto-window while it's still
|
|
87
|
+
* at full range (never clobber the user's manual window); if the user
|
|
88
|
+
* already windowed, just re-invalidate so painted tiles pick the LUT up. */
|
|
89
|
+
seedGrayWindow(min: number, max: number): void;
|
|
90
|
+
/**
|
|
91
|
+
* Hook a freshly opened viewer (and its navigator, a separate mini-viewer with
|
|
92
|
+
* its own tiles that doesn't receive the main viewer's events) into the pixel
|
|
93
|
+
* pipeline, and paint what is already loaded when there is anything to apply.
|
|
94
|
+
*/
|
|
95
|
+
attach(viewer: OpenSeadragon.Viewer): void;
|
|
96
|
+
/** Collapse a burst of display-state changes into ONE invalidation on the next
|
|
97
|
+
* frame. Dragging a window slider emits per pixel of travel, and each round
|
|
98
|
+
* restores and re-processes every tile of every channel — so the burst is both
|
|
99
|
+
* wasted work and the race that breaks cache records (see {@link displayToken}).
|
|
100
|
+
* The store write stays live, so the pane itself remains responsive. */
|
|
101
|
+
scheduleInvalidate(): void;
|
|
102
|
+
/** Re-apply the display pipeline (window/gamma/colour/invert) after a state change.
|
|
103
|
+
* Multichannel invalidates ONLY the visible slice's channel images — invalidating
|
|
104
|
+
* the whole world would re-process every hidden/preloaded slice's tiles (hundreds),
|
|
105
|
+
* flooding OSD with "[CacheRecord] … InvalidStateError" and wasting work on tiles
|
|
106
|
+
* that aren't on screen. The other cached slices are marked stale and re-tinted
|
|
107
|
+
* lazily when revealed. Composite/grayscale invalidate the world; serverless
|
|
108
|
+
* multichannel re-composites its cached planes. */
|
|
109
|
+
invalidateDisplay(): void;
|
|
110
|
+
/** Restore and re-recolor every tile of the main viewer and the navigator. */
|
|
111
|
+
invalidateWorld(): void;
|
|
112
|
+
/**
|
|
113
|
+
* Recolor a grayscale tile through the active colormap LUT, using OSD's
|
|
114
|
+
* tile-invalidated pixel pipeline (OSD 5+/6). Maps each pixel's grayscale
|
|
115
|
+
* value (r==g==b) to the LUT's RGB. No-op for RGB images or until the LUT is
|
|
116
|
+
* built. Handler is async — OSD awaits it (raiseEventAwaiting).
|
|
117
|
+
*/
|
|
118
|
+
recolorTile(event: TileEvent): Promise<void>;
|
|
119
|
+
/**
|
|
120
|
+
* Tint a single channel's tile in place. Each channel is its own OpenSeadragon
|
|
121
|
+
* TiledImage (a single-band grayscale tile); OSD composites the N images
|
|
122
|
+
* additively ('lighter') in its drawer — so this just maps the tile's intensity
|
|
123
|
+
* through the channel's window/gamma and its pseudo-colour. Synchronous (no
|
|
124
|
+
* cross-tile fetch) → no race, no seams. Channel is parsed from the tile URL.
|
|
125
|
+
*/
|
|
126
|
+
recolorChannelTile(event: TileEvent): Promise<void>;
|
|
127
|
+
/**
|
|
128
|
+
* Read a tile's pixels for recoloring. Prefers the tile's rendering context,
|
|
129
|
+
* but some tile caches (ajax PNG blobs) convert to an *empty* context2d —
|
|
130
|
+
* recoloring that would blank the tile (white canvas). So if the context has
|
|
131
|
+
* no opaque pixels, the tile's own bitmap/image is drawn to a scratch canvas
|
|
132
|
+
* and read instead. Null when no pixels can be read: leave the tile untouched.
|
|
133
|
+
*/
|
|
134
|
+
private readTilePixels;
|
|
135
|
+
/** Write recolored pixels back to the tile — unless a newer display round
|
|
136
|
+
* (`token`, see {@link displayToken}) has already restored it: writing a
|
|
137
|
+
* superseded context back makes OSD's conversion throw DOMException, which
|
|
138
|
+
* destroys the cache record and unloads the tile. */
|
|
139
|
+
private writeTilePixels;
|
|
140
|
+
}
|
|
141
|
+
export {};
|
|
@@ -18,6 +18,12 @@ export interface OmicsGrouping {
|
|
|
18
18
|
/** `#rrggbb` per category, index-aligned — the same colours the map uses. */
|
|
19
19
|
colors: string[];
|
|
20
20
|
}
|
|
21
|
+
/**
|
|
22
|
+
* What {@link buildOmicsTraces} / {@link omicsLayout} chart: one value per
|
|
23
|
+
* observation (cell/spot), with the optional grouping and selection
|
|
24
|
+
* index-aligned to it. Non-finite values (NaN for a missing measurement) are
|
|
25
|
+
* left out of every chart.
|
|
26
|
+
*/
|
|
21
27
|
export interface OmicsTraceInput {
|
|
22
28
|
/** The values being charted (an annotation column or a gene vector). */
|
|
23
29
|
values: Float32Array;
|
|
@@ -34,7 +40,7 @@ export interface OmicsTraceInput {
|
|
|
34
40
|
/**
|
|
35
41
|
* Traces for one chart kind.
|
|
36
42
|
*
|
|
37
|
-
* - **histogram** — the full distribution, plus an overlaid *Selected* trace
|
|
43
|
+
* - **histogram** — the full distribution as pre-binned bars, plus an overlaid *Selected* trace
|
|
38
44
|
* when a selection exists, so the two are directly comparable. That
|
|
39
45
|
* comparison is the whole point of linking the chart to the map.
|
|
40
46
|
* - **violin / box** — one per category when grouped, otherwise a single trace.
|
|
@@ -55,13 +61,15 @@ export interface OmicsCountInput {
|
|
|
55
61
|
/** Bars before the tail is aggregated. */
|
|
56
62
|
max?: number;
|
|
57
63
|
}
|
|
58
|
-
/**
|
|
59
|
-
export
|
|
64
|
+
/** What {@link countByCategory} returns. */
|
|
65
|
+
export interface CategoryCounts {
|
|
60
66
|
labels: string[];
|
|
61
67
|
colors: string[];
|
|
62
68
|
totals: number[];
|
|
63
69
|
selected: number[];
|
|
64
|
-
}
|
|
70
|
+
}
|
|
71
|
+
/** Per-category counts, biggest first, with the tail folded into one bar. */
|
|
72
|
+
export declare function countByCategory(input: OmicsCountInput): CategoryCounts;
|
|
65
73
|
/**
|
|
66
74
|
* Bars of per-category cell counts — the distribution a CATEGORICAL colour
|
|
67
75
|
* source has.
|
|
@@ -71,24 +79,14 @@ export declare function countByCategory(input: OmicsCountInput): {
|
|
|
71
79
|
* the legend implies without answering. Horizontal, because taxonomy labels are
|
|
72
80
|
* long, and sorted, because rank is what the chart is read for.
|
|
73
81
|
*/
|
|
74
|
-
export declare function buildCountTraces(input: OmicsCountInput): unknown[];
|
|
75
|
-
export declare function countsLayout(input: OmicsCountInput & {
|
|
76
|
-
name: string;
|
|
77
|
-
}): unknown;
|
|
82
|
+
export declare function buildCountTraces(input: OmicsCountInput, counts?: CategoryCounts): unknown[];
|
|
78
83
|
/**
|
|
79
|
-
*
|
|
80
|
-
*
|
|
81
|
-
* The matrix itself is computed by the pure `heatmapMatrix` in
|
|
82
|
-
* `spatial/spatial-heatmap.ts`; this only shapes it for Plotly. Kept in the
|
|
83
|
-
* matrix's own row-major order and flipped once here, because Plotly draws
|
|
84
|
-
* `z[0]` at the BOTTOM of the y axis while the caller lists genes top-down.
|
|
85
|
-
*
|
|
86
|
-
* The colour scale is its own, NOT the map's `continuousColormap`. This is a
|
|
87
|
-
* different quantity — a z-scored mean per group, not a per-cell value — so
|
|
88
|
-
* sharing one scale would invite reading a heatmap cell as if it were a marker
|
|
89
|
-
* colour. Diverging and centred on zero, because after z-scoring the sign is
|
|
90
|
-
* the reading: above or below this gene's average across the groups.
|
|
84
|
+
* Layout for {@link buildCountTraces}. Pass the same `counts` to both rather than letting
|
|
85
|
+
* each run its own full pass over the codes.
|
|
91
86
|
*/
|
|
87
|
+
export declare function countsLayout(input: OmicsCountInput & {
|
|
88
|
+
name: string;
|
|
89
|
+
}, counts?: CategoryCounts): unknown;
|
|
92
90
|
/**
|
|
93
91
|
* An embedding scatter — a UMAP, t-SNE or PCA plane over the same observations.
|
|
94
92
|
*
|
|
@@ -189,5 +187,19 @@ export interface OmicsHeatmapInput {
|
|
|
189
187
|
/** Column axis title — the grouping column's name, or "cell". */
|
|
190
188
|
groupLabel?: string;
|
|
191
189
|
}
|
|
190
|
+
/**
|
|
191
|
+
* Genes × groups mean expression, as a Plotly heatmap.
|
|
192
|
+
*
|
|
193
|
+
* The matrix itself is computed by the pure `heatmapMatrix` in
|
|
194
|
+
* `spatial/spatial-heatmap.ts`; this only shapes it for Plotly. Kept in the
|
|
195
|
+
* matrix's own row-major order and flipped once here, because Plotly draws
|
|
196
|
+
* `z[0]` at the BOTTOM of the y axis while the caller lists genes top-down.
|
|
197
|
+
*
|
|
198
|
+
* The colour scale is its own, NOT the map's `continuousColormap`. This is a
|
|
199
|
+
* different quantity — a z-scored mean per group, not a per-cell value — so
|
|
200
|
+
* sharing one scale would invite reading a heatmap cell as if it were a marker
|
|
201
|
+
* colour. Diverging and centred on zero, because after z-scoring the sign is
|
|
202
|
+
* the reading: above or below this gene's average across the groups.
|
|
203
|
+
*/
|
|
192
204
|
export declare function buildHeatmapTraces(input: OmicsHeatmapInput): unknown[];
|
|
193
205
|
export declare function heatmapLayout(input: OmicsHeatmapInput): unknown;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { HttpClient } from '@angular/common/http';
|
|
2
|
+
import { BehaviorSubject } from 'rxjs';
|
|
3
|
+
import { Image } from 'image-js';
|
|
4
|
+
import { IImageInfo } from '../../contracts/image.contract';
|
|
5
|
+
/** What Plotly's `load()` hands to `plot()`: per-slice pixel matrices. */
|
|
6
|
+
export interface PlotlyLoaded {
|
|
7
|
+
/** One row-major matrix per slice: grayscale numbers or `[r, g, b]` cells. */
|
|
8
|
+
data: any[];
|
|
9
|
+
/** [xRatio, yRatio]: image units per decoded pixel. */
|
|
10
|
+
ratios: number[];
|
|
11
|
+
/** [width, height] of a decoded slice. */
|
|
12
|
+
sizes: number[];
|
|
13
|
+
filename: string | undefined;
|
|
14
|
+
/** A serverless multichannel stack's raw channel planes (one byte per pixel), per loaded
|
|
15
|
+
* slice (aligned with `data`) and channel — what its `image` trace is composited from. */
|
|
16
|
+
channelPlanes?: Uint8Array[][];
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Plotly's image source: fetches slices through HttpClient (so the auth
|
|
20
|
+
* interceptors apply — a raw fetch() fails behind an OAuth2 proxy), decodes
|
|
21
|
+
* them with image-js into pixel matrices, and loads a stack through a small
|
|
22
|
+
* worker pool, reporting progress. Owns the stack-loading flag and progress.
|
|
23
|
+
*/
|
|
24
|
+
export declare class PlotlyImageLoader {
|
|
25
|
+
private readonly http;
|
|
26
|
+
/** Whether the whole stack is (to be) loaded; switching it off stops a stack load. */
|
|
27
|
+
readonly stackLoading$: BehaviorSubject<boolean>;
|
|
28
|
+
/** Stack load progress, 0–100 (0 when idle). */
|
|
29
|
+
readonly stackLoadingProgress$: BehaviorSubject<number>;
|
|
30
|
+
private readonly utils;
|
|
31
|
+
constructor(http: HttpClient);
|
|
32
|
+
/** Fetch one image via HttpClient and decode it. */
|
|
33
|
+
loadImage(url: string, signal?: AbortSignal): Promise<Image>;
|
|
34
|
+
/**
|
|
35
|
+
* Load slice `zIndex` — or, for a shown stack, every slice (in parallel,
|
|
36
|
+
* keeping slice order). `onProbe` runs once the displayed slice has decoded;
|
|
37
|
+
* the stack load stops early when `stillWanted()` turns false (another file),
|
|
38
|
+
* stack loading is switched off, or `signal` aborts (it then rejects with an
|
|
39
|
+
* `AbortError`). A stopped load keeps the contiguous run of slices from the start.
|
|
40
|
+
*/
|
|
41
|
+
load(imageInfo: IImageInfo, zIndex: number, signal: AbortSignal | undefined, onProbe: () => void, stillWanted: () => boolean): Promise<PlotlyLoaded>;
|
|
42
|
+
/** A slice's channel planes (`channelUrls[z]`), fetched in parallel and decoded to one byte per
|
|
43
|
+
* pixel (a 16-bit plane to its high byte, as a canvas decodes it for OSD). */
|
|
44
|
+
private loadChannelPlanes;
|
|
45
|
+
/** Grayscale: the scalar matrix. Colour: `[r, g, b]` cells in 0..255, the only range an
|
|
46
|
+
* `image` trace draws — a 16-bit image keeps each sample's high byte, as the browser decodes
|
|
47
|
+
* it for OSD and napari-js (its full values saturated every cell). */
|
|
48
|
+
private toMatrix;
|
|
49
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { IChannelState } from '../../contracts/channel-histogram-api.contract';
|
|
2
|
+
import { IImageInfo } from '../../contracts/image.contract';
|
|
3
|
+
import { PixelData } from '../../contracts/visualizer.contract';
|
|
4
|
+
/** How the Plotly `image` trace of an image follows the Channels & Histogram dialog. */
|
|
5
|
+
export type RecolorKind = 'rgb' | 'multichannel';
|
|
6
|
+
/** RGBA8 pixels → an `image` trace's `source` (a `data:image/…;base64,` URI). */
|
|
7
|
+
export type ImageEncoder = (rgba: Uint8ClampedArray, width: number, height: number) => Promise<string>;
|
|
8
|
+
/** A serverless multichannel stack's per-channel plane URLs (`channelUrls[z][c]`), or null: the
|
|
9
|
+
* criterion OSD's simple source and napari-js's stitch path use. */
|
|
10
|
+
export declare function channelPlaneUrls(info: IImageInfo | undefined): string[][] | null;
|
|
11
|
+
/**
|
|
12
|
+
* Which channel display the `image` trace of `info` gets: `multichannel` when the slices'
|
|
13
|
+
* channel planes were loaded, `rgb` for an RGB image (its channels are R, G and B — the store's
|
|
14
|
+
* channel model for `rgbChannels ≥ 3`), else none. A tiled multichannel image is plotted from
|
|
15
|
+
* the server's flat composite preview, with no per-channel pixels to recolour: none.
|
|
16
|
+
*/
|
|
17
|
+
export declare function recolorKind(info: IImageInfo | undefined, hasPlanes: boolean): RecolorKind | null;
|
|
18
|
+
/** A Plotly `image` frame (rows of `[r, g, b(, a)]` cells) as opaque RGBA8 pixels. */
|
|
19
|
+
export declare function matrixToRgba(frame: number[][][], width: number, height: number): Uint8ClampedArray;
|
|
20
|
+
/** The browser's PNG encoder, off the main thread where it can be (`convertToBlob`/`toBlob`
|
|
21
|
+
* encode asynchronously), read back as a data URI. */
|
|
22
|
+
export declare const encodePng: ImageEncoder;
|
|
23
|
+
/**
|
|
24
|
+
* The channel display of Plotly's colour `image` trace (#46 browser testing): what OSD's
|
|
25
|
+
* {@link DisplayPipeline} does to its tiles, run on the CPU over the frames Plotly plots, so one
|
|
26
|
+
* channel state draws the same picture on both (window → invert → gamma → tint, additive merge).
|
|
27
|
+
* - multichannel (a serverless stack's `channelUrls`): the slice's raw channel planes merged by
|
|
28
|
+
* `compositeChannels`;
|
|
29
|
+
* - RGB: the raw frame's R, G and B through their channels (`applyToRgba`) — the raw frame as it
|
|
30
|
+
* is while the channel states leave it so ({@link rgbNeedsRecolor}).
|
|
31
|
+
*
|
|
32
|
+
* Always from the RAW pixels the plot was built from, never from a recoloured frame, so repeated
|
|
33
|
+
* edits never compound. The raw frames stay what the pixel tools, the profiles and the histogram
|
|
34
|
+
* read; only the trace's picture changes.
|
|
35
|
+
*
|
|
36
|
+
* The trace draws a PNG `source`, not a `z` matrix: Plotly paints a `z` image one `fillRect` per
|
|
37
|
+
* pixel (~0.7 s for a 1-megapixel slice, on every edit), while a `source` is drawn by the browser
|
|
38
|
+
* and encoded off the main thread. A stack recolours the slice on screen, and each other slice
|
|
39
|
+
* when it is shown ({@link frame} reports a stale one).
|
|
40
|
+
*/
|
|
41
|
+
export declare class PlotlyImageRecolor {
|
|
42
|
+
private readonly host;
|
|
43
|
+
private readonly encode;
|
|
44
|
+
private kind;
|
|
45
|
+
private frames;
|
|
46
|
+
private planes;
|
|
47
|
+
/** Per frame: the display key of the latest picture asked for it. */
|
|
48
|
+
private shown;
|
|
49
|
+
/** Bumped by every plot/clear: a picture encoded for an older plot is dropped. */
|
|
50
|
+
private generation;
|
|
51
|
+
private readonly pipeline;
|
|
52
|
+
constructor(host: {
|
|
53
|
+
channelStates(): IChannelState[];
|
|
54
|
+
invert(): boolean;
|
|
55
|
+
}, encode?: ImageEncoder);
|
|
56
|
+
/** Whether the traces on screen follow the channel states. */
|
|
57
|
+
get active(): boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Start following the channel states for the `image` traces about to be plotted from `frames`
|
|
60
|
+
* (raw, one per slice) and, for `multichannel`, each slice's raw channel `planes`. Resolves to
|
|
61
|
+
* each slice's `source` in the current display; null for `kind` null (the traces draw `z`), or
|
|
62
|
+
* when a newer plot superseded this one.
|
|
63
|
+
*/
|
|
64
|
+
plot(kind: RecolorKind | null, frames: number[][][][], planes?: Array<Uint8Array[] | undefined>): Promise<string[] | null>;
|
|
65
|
+
/** Stop following (the plot was replaced by a non-image one, or purged). */
|
|
66
|
+
clear(): void;
|
|
67
|
+
/** Slice `index`'s `source` in the current channel display, or null when the picture asked for
|
|
68
|
+
* last already shows it, or a newer picture or plot superseded this one. */
|
|
69
|
+
frame(index: number): Promise<string | null>;
|
|
70
|
+
/** Slice `index`'s displayed pixels (`getDisplayedPixelData` of a trace drawn from its `source`),
|
|
71
|
+
* as `[r, g, b]` like a `z` trace's; null when no trace follows the channel states. */
|
|
72
|
+
displayedPixels(index: number): PixelData | null;
|
|
73
|
+
/** Slice `index` in the current channel display, as RGBA8, from its raw pixels. */
|
|
74
|
+
private pixels;
|
|
75
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { IntensityProfile } from '../../contracts/visualizer.contract';
|
|
2
|
+
/**
|
|
3
|
+
* Render the floating intensity-profile inset chart into `divId` — one line
|
|
4
|
+
* trace per profile line, each drawn in its line's colour. The x axis is in
|
|
5
|
+
* microns when the sampler tagged the profiles so (the image carries a pixel
|
|
6
|
+
* size), otherwise in pixels. A no-op when the element is missing.
|
|
7
|
+
*/
|
|
8
|
+
export declare function renderIntensityInset(divId: string, profiles: IntensityProfile[]): void;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { IIsosurfaceControls } from '../../contracts/visualizer.contract';
|
|
2
|
+
/** Min/max intensity over every voxel of the frames (RGB → luminance), or null
|
|
3
|
+
* for empty or flat input. */
|
|
4
|
+
export declare function measureIntensityRange(frames: any[], isGrayscale: boolean): [number, number] | null;
|
|
5
|
+
/**
|
|
6
|
+
* The ISOSURFACE intensity band. The slider is a fixed 0–255, but a stack often
|
|
7
|
+
* occupies only a narrow sub-range (e.g. an EDOF volume at ~2–50 with structure
|
|
8
|
+
* near 6–10), so the band is mapped onto the volume's measured range: every
|
|
9
|
+
* intensity is easy to reach and the band always lands inside the data — a
|
|
10
|
+
* small inset keeps the extreme surfaces off the exact data edges, which are
|
|
11
|
+
* degenerate and draw nothing.
|
|
12
|
+
*/
|
|
13
|
+
export declare class PlotlyIsosurfaceControls implements IIsosurfaceControls {
|
|
14
|
+
private readonly isLive;
|
|
15
|
+
private readonly restyle;
|
|
16
|
+
/** The band as 0–255 slider positions. Defaults to the full range so the
|
|
17
|
+
* first render shows the whole structure. */
|
|
18
|
+
private isoMin;
|
|
19
|
+
private isoMax;
|
|
20
|
+
/** The measured [min, max] of the volume on screen; null until measured. */
|
|
21
|
+
private dataRange;
|
|
22
|
+
/**
|
|
23
|
+
* @param isLive whether an isosurface is on screen now
|
|
24
|
+
* @param restyle restyles the live isosurface's `isomin`/`isomax`
|
|
25
|
+
*/
|
|
26
|
+
constructor(isLive: () => boolean, restyle: (update: {
|
|
27
|
+
isomin: number[];
|
|
28
|
+
isomax: number[];
|
|
29
|
+
}) => void);
|
|
30
|
+
/** Measure the volume about to be rendered, so the band maps onto its range. */
|
|
31
|
+
measure(frames: any[], isGrayscale: boolean): void;
|
|
32
|
+
/** The current band in data units, for the next render. */
|
|
33
|
+
band(): [number, number];
|
|
34
|
+
/** Update the band; a live isosurface is restyled in place (no volume rebuild). */
|
|
35
|
+
setIsoRange(isoMin: number, isoMax: number): void;
|
|
36
|
+
/** Slider band → data units, through the measured range (as-is before one). */
|
|
37
|
+
private mapBand;
|
|
38
|
+
}
|