@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,14 @@
|
|
|
1
|
+
import { Region } from '../models/region';
|
|
2
|
+
/**
|
|
3
|
+
* Region centroids for the backends' "region centroid" scatter views (napari-js points, Plotly
|
|
4
|
+
* markers), computed once here instead of in each backend. The centroid is the VERTEX MEAN, not the
|
|
5
|
+
* area centroid: cheap, and what both views have always shown.
|
|
6
|
+
*/
|
|
7
|
+
/** Vertex mean of one ring, or null when it has no vertices. */
|
|
8
|
+
export declare function polygonCentroid(xs: ArrayLike<number>, ys: ArrayLike<number>): [number, number] | null;
|
|
9
|
+
/**
|
|
10
|
+
* Centroids of `regions` as flat `[x, y, x, y, …]` data coordinates: a rectangle's centre, a
|
|
11
|
+
* polygon's vertex mean, and one point per part of a multipolygon. Regions without geometry (or
|
|
12
|
+
* with an empty ring) contribute nothing.
|
|
13
|
+
*/
|
|
14
|
+
export declare function regionCentroids(regions: ReadonlyArray<Pick<Region, 'bounds'>>): Float32Array;
|
|
@@ -24,10 +24,12 @@ import * as i0 from "@angular/core";
|
|
|
24
24
|
*/
|
|
25
25
|
export declare class SimpleSliceAccessService {
|
|
26
26
|
private http;
|
|
27
|
-
/** raw slice URL →
|
|
28
|
-
* URL (OSD) doesn't repeat the auth round-trip revisiting a
|
|
29
|
-
* back, the small→large tier re-fetch)
|
|
30
|
-
*
|
|
27
|
+
/** raw slice URL → its (possibly still in-flight) blob: URL, so a backend
|
|
28
|
+
* that opens a URL (OSD) doesn't repeat the auth round-trip revisiting a
|
|
29
|
+
* slice (scrub back, the small→large tier re-fetch), and two concurrent
|
|
30
|
+
* requests for one slice share a fetch (and a blob: URL). Shared across
|
|
31
|
+
* backends: switching plot types on the same file (e.g. Image → Volume)
|
|
32
|
+
* reuses entries. */
|
|
31
33
|
private readonly blobUrls;
|
|
32
34
|
private currentFileName;
|
|
33
35
|
constructor(http: HttpClient);
|
|
@@ -58,6 +60,7 @@ export declare class SimpleSliceAccessService {
|
|
|
58
60
|
* via the browser. Only real server URLs go through HttpClient so the auth
|
|
59
61
|
* interceptor applies. Mirrors {@link fetchAsBlobUrl}'s blob:/data: branch. */
|
|
60
62
|
fetchAsBitmap(rawUrl: string): Promise<ImageBitmap>;
|
|
63
|
+
/** Revoke every cached blob: URL — an in-flight one once it resolves. */
|
|
61
64
|
private revokeAll;
|
|
62
65
|
static ɵfac: i0.ɵɵFactoryDeclaration<SimpleSliceAccessService, never>;
|
|
63
66
|
static ɵprov: i0.ɵɵInjectableDeclaration<SimpleSliceAccessService>;
|
|
@@ -4,6 +4,15 @@ import { SpatialDataPort, TranscriptTileQuery } from '../../contracts/ports/spat
|
|
|
4
4
|
import { SpatialColumn, SpatialDataset, SpatialDensityRaster, SpatialEmbedding, SpatialPolygonTile, SpatialPolygons, CategoricalColumnMeta, SpatialMarkerGenes, SpatialTranscriptCounts, SpatialTranscriptSummary, SpatialTranscriptTile } from '../../contracts/spatial-dataset.contract';
|
|
5
5
|
import { SpatialDatasetSummary, SpatialManifest } from './spatial-wire';
|
|
6
6
|
import * as i0 from "@angular/core";
|
|
7
|
+
/**
|
|
8
|
+
* A dataset selection that a newer selection (or a `clear`) overtook.
|
|
9
|
+
*
|
|
10
|
+
* Thrown rather than resolved so a caller cannot mistake it for "this dataset is
|
|
11
|
+
* now loaded": nothing was published, on purpose.
|
|
12
|
+
*/
|
|
13
|
+
export declare class SupersededError extends Error {
|
|
14
|
+
constructor(id: string);
|
|
15
|
+
}
|
|
7
16
|
/**
|
|
8
17
|
* Reference {@link SpatialDataPort} adapter for the wire format the bundled
|
|
9
18
|
* example server speaks (see `spatial-wire.ts` and
|
|
@@ -27,15 +36,6 @@ import * as i0 from "@angular/core";
|
|
|
27
36
|
* Requests go through Angular's `HttpClient` (not `fetch`) so the host's
|
|
28
37
|
* interceptors — auth headers above all — apply, matching `tile-client.ts`.
|
|
29
38
|
*/
|
|
30
|
-
/**
|
|
31
|
-
* A dataset selection that a newer selection (or a `clear`) overtook.
|
|
32
|
-
*
|
|
33
|
-
* Thrown rather than resolved so a caller cannot mistake it for "this dataset is
|
|
34
|
-
* now loaded": nothing was published, on purpose.
|
|
35
|
-
*/
|
|
36
|
-
export declare class SupersededError extends Error {
|
|
37
|
-
constructor(id: string);
|
|
38
|
-
}
|
|
39
39
|
export declare class SpatialDataHttpService implements SpatialDataPort {
|
|
40
40
|
private http;
|
|
41
41
|
/** Server root, normalised to end with exactly one `/`. */
|
|
@@ -45,17 +45,24 @@ export declare class SpatialDataHttpService implements SpatialDataPort {
|
|
|
45
45
|
private timeoutMs;
|
|
46
46
|
private readonly dataset$;
|
|
47
47
|
private manifest;
|
|
48
|
-
/**
|
|
49
|
-
* finishes after a newer intent can tell and drop what it fetched.
|
|
50
|
-
|
|
48
|
+
/** Advanced by every `selectDataset` and every `clear`, so a selection that
|
|
49
|
+
* finishes after a newer intent can tell and drop what it fetched. Cache fills
|
|
50
|
+
* take a {@link Supersede.current snapshot} of it, so a vector or tile that lands
|
|
51
|
+
* after a switch is returned to its caller but never kept for the next dataset. */
|
|
52
|
+
private readonly selection;
|
|
51
53
|
/**
|
|
52
54
|
* Loaded vectors, keyed `column:<name>` / `feature:<name>`. Bounded LRU:
|
|
53
55
|
* colouring by cluster → by a gene → back by cluster must not refetch, but an
|
|
54
|
-
* afternoon of browsing genes must not grow without limit either
|
|
55
|
-
*
|
|
56
|
+
* afternoon of browsing genes must not grow without limit either.
|
|
57
|
+
*
|
|
58
|
+
* Bounded by BYTES as well as entries: one vector is `4·N` bytes — 2 MB at 500k
|
|
59
|
+
* cells, but 14.8 MB at 3.7M, where 32 entries (an embedding is two or three
|
|
60
|
+
* vectors) could pin close to half a gigabyte.
|
|
56
61
|
*/
|
|
57
62
|
private readonly cache;
|
|
63
|
+
private cachedBytes;
|
|
58
64
|
private static readonly CACHE_LIMIT;
|
|
65
|
+
private cacheBytes;
|
|
59
66
|
/** In-flight requests, so double-clicking a gene issues one fetch. */
|
|
60
67
|
private readonly inFlight;
|
|
61
68
|
/**
|
|
@@ -64,13 +71,24 @@ export declare class SpatialDataHttpService implements SpatialDataPort {
|
|
|
64
71
|
*/
|
|
65
72
|
private readonly tileCache;
|
|
66
73
|
private static readonly TILE_CACHE_LIMIT;
|
|
74
|
+
/** Bytes of each RESOLVED tile in {@link tileCache}; a pending one counts once it lands. */
|
|
75
|
+
private readonly tileBytes;
|
|
76
|
+
private tileBytesTotal;
|
|
77
|
+
private tileCacheBytes;
|
|
67
78
|
private volumePromise;
|
|
68
79
|
private polygonsPromise;
|
|
69
80
|
constructor(http: HttpClient);
|
|
70
|
-
/**
|
|
81
|
+
/**
|
|
82
|
+
* Point the adapter at a server. Clears any loaded dataset.
|
|
83
|
+
*
|
|
84
|
+
* `cacheBytes` / `tileCacheBytes` cap the decoded vectors (default 256 MiB) and tiles
|
|
85
|
+
* (default 128 MiB) kept for reuse; the most recent entry is always kept.
|
|
86
|
+
*/
|
|
71
87
|
configure(options: {
|
|
72
88
|
baseUrl: string;
|
|
73
89
|
timeoutMs?: number;
|
|
90
|
+
cacheBytes?: number;
|
|
91
|
+
tileCacheBytes?: number;
|
|
74
92
|
}): void;
|
|
75
93
|
/** Datasets this server offers, for a host-side picker. */
|
|
76
94
|
listDatasets(): Promise<SpatialDatasetSummary[]>;
|
|
@@ -83,8 +101,8 @@ export declare class SpatialDataHttpService implements SpatialDataPort {
|
|
|
83
101
|
readManifest(id: string): Promise<SpatialManifest>;
|
|
84
102
|
/**
|
|
85
103
|
* Load a dataset and publish it on {@link getDataset$}. Fetches the manifest,
|
|
86
|
-
* then the vectors that are always needed (coordinates, and
|
|
87
|
-
* the manifest says they exist) — nothing else.
|
|
104
|
+
* then, in parallel, the vectors that are always needed (coordinates, and
|
|
105
|
+
* ids/radius when the manifest says they exist) — nothing else.
|
|
88
106
|
*/
|
|
89
107
|
selectDataset(id: string): Promise<SpatialDataset>;
|
|
90
108
|
/** Drop the loaded dataset and every cached vector. */
|
|
@@ -99,7 +117,8 @@ export declare class SpatialDataHttpService implements SpatialDataPort {
|
|
|
99
117
|
getTranscriptTile(level: number, gx: number, gy: number, query: TranscriptTileQuery): Promise<SpatialTranscriptTile>;
|
|
100
118
|
getTranscriptGeneBins(level: number, tx: number, ty: number, genes: string[]): Promise<SpatialTranscriptTile>;
|
|
101
119
|
getTranscriptBins(level: number, tx: number, ty: number): Promise<SpatialTranscriptTile>;
|
|
102
|
-
/** Small JSON answers, keyed by URL — hovering back and forth must not refetch.
|
|
120
|
+
/** Small JSON answers, keyed by URL — hovering back and forth must not refetch. Least recently
|
|
121
|
+
* USED goes first, so the summary under the pointer stays while others are evicted. */
|
|
103
122
|
private readonly summaryCache;
|
|
104
123
|
getTranscriptSummary(query: {
|
|
105
124
|
box?: [number, number, number, number];
|
|
@@ -115,6 +134,9 @@ export declare class SpatialDataHttpService implements SpatialDataPort {
|
|
|
115
134
|
getTranscriptCounts(genes: string[]): Promise<SpatialTranscriptCounts>;
|
|
116
135
|
/** LRU over tile promises, so concurrent asks share one request and a failure is not kept. */
|
|
117
136
|
private cachedTile;
|
|
137
|
+
/** Oldest first, past the entry cap or the byte budget, keeping the newest. */
|
|
138
|
+
private evictTiles;
|
|
139
|
+
private dropTile;
|
|
118
140
|
/**
|
|
119
141
|
* The reference volume's voxels, single-flighted like the polygons.
|
|
120
142
|
*
|
|
@@ -141,7 +163,9 @@ export declare class SpatialDataHttpService implements SpatialDataPort {
|
|
|
141
163
|
* entry a newer request for the same key is already sharing.
|
|
142
164
|
*/
|
|
143
165
|
private fetchCached;
|
|
166
|
+
/** Oldest first, past the entry cap or the byte budget, keeping the newest. */
|
|
144
167
|
private evict;
|
|
168
|
+
private uncache;
|
|
145
169
|
private getJson;
|
|
146
170
|
private getBinary;
|
|
147
171
|
static ɵfac: i0.ɵɵFactoryDeclaration<SpatialDataHttpService, never>;
|
|
@@ -23,6 +23,8 @@ import { SpatialColumn, SpatialColumnMeta, SpatialDataset, SpatialDensityMeta, S
|
|
|
23
23
|
*
|
|
24
24
|
* ENDPOINTS (base = the server root)
|
|
25
25
|
* ----------------------------------
|
|
26
|
+
* Every route `SpatialDataHttpService` calls. `{id}` is the dataset id; names and
|
|
27
|
+
* gene lists are URI-encoded.
|
|
26
28
|
* ```
|
|
27
29
|
* GET {base}/spatial/datasets -> { datasets: [{ id, name, count }] }
|
|
28
30
|
* GET {base}/spatial/{id}/manifest -> SpatialManifest
|
|
@@ -32,19 +34,28 @@ import { SpatialColumn, SpatialColumnMeta, SpatialDataset, SpatialDensityMeta, S
|
|
|
32
34
|
* GET {base}/spatial/{id}/column/{name} -> u16[N] codes | f32[N] values
|
|
33
35
|
* GET {base}/spatial/{id}/feature/{name} -> f32[N]
|
|
34
36
|
* GET {base}/spatial/{id}/features?q=&limit= -> { names: string[] }
|
|
37
|
+
* GET {base}/spatial/{id}/embedding/{name} -> f32[N] per dimension, see decodeEmbedding
|
|
35
38
|
* GET {base}/spatial/{id}/polygons -> u32 count, u32[count+1] offsets, f32[2*rings] coords
|
|
39
|
+
* GET {base}/spatial/{id}/volume -> u8[width*height*depth] (manifest.volume only)
|
|
36
40
|
* GET {base}/spatial/{id}/polygon-tile/{set}/{level}/{gx}/{gy}
|
|
37
41
|
* -> u32 count, u32[count] obs, u32[count+1] offsets, f32 coords
|
|
38
|
-
* GET {base}/spatial/{id}/transcript-tile/{level}/{gx}/{gy}?genes=A,B&quality=high|all
|
|
42
|
+
* GET {base}/spatial/{id}/transcript-tile/{level}/{gx}/{gy}?genes=A,B&quality=high|all&box=
|
|
39
43
|
* -> see decodeTranscriptTile
|
|
40
|
-
* GET {base}/spatial/{id}/density?genes=A,B -> f32[rows*cols]
|
|
41
44
|
* GET {base}/spatial/{id}/transcript-bins/{level}/{tx}/{ty}
|
|
42
45
|
* -> transcript-tile layout, one entry per bin
|
|
46
|
+
* GET {base}/spatial/{id}/gene-bins/{level}/{tx}/{ty}?genes=A,B
|
|
47
|
+
* -> transcript-tile layout, per-gene bins
|
|
48
|
+
* GET {base}/spatial/{id}/density?genes=A,B&bin= -> see decodeDensity
|
|
49
|
+
* GET {base}/spatial/{id}/transcript-summary?box=&genes=&cells= -> SpatialTranscriptSummary
|
|
50
|
+
* GET {base}/spatial/{id}/transcript-counts?genes=A,B -> SpatialTranscriptCounts
|
|
51
|
+
* GET {base}/spatial/{id}/markers/{column}?n= -> SpatialMarkerGenes
|
|
52
|
+
* POST {base}/spatial/{id}/groups?name= (text/csv `cell_id,group`)
|
|
53
|
+
* -> { column: CategoricalColumnMeta, matched }
|
|
43
54
|
* ```
|
|
44
55
|
*
|
|
45
|
-
* The
|
|
46
|
-
*
|
|
47
|
-
* sees them requested.
|
|
56
|
+
* The optional routes are advertised in the manifest (`polygons`, `volume`,
|
|
57
|
+
* `polygonTiles`, `transcriptTiles`, `transcriptBins`, `transcriptGeneBins`,
|
|
58
|
+
* `density`); a server without them never sees them requested.
|
|
48
59
|
*/
|
|
49
60
|
/** Bumped when the layout changes incompatibly; the client refuses anything else. */
|
|
50
61
|
export declare const SPATIAL_WIRE_VERSION = 1;
|
|
@@ -89,7 +100,13 @@ export interface SpatialDatasetSummary {
|
|
|
89
100
|
}
|
|
90
101
|
/** True on a little-endian host. */
|
|
91
102
|
export declare function isLittleEndian(): boolean;
|
|
92
|
-
/**
|
|
103
|
+
/**
|
|
104
|
+
* Reject a manifest this client cannot read, with a message naming the fix.
|
|
105
|
+
*
|
|
106
|
+
* Besides the version, the values every decoder sizes its views from: an observation
|
|
107
|
+
* count that is not a non-negative integer, or an embedding that is not 2-D or 3-D, would
|
|
108
|
+
* otherwise surface later as a RangeError deep inside a renderer.
|
|
109
|
+
*/
|
|
93
110
|
export declare function assertManifestVersion(manifest: SpatialManifest): void;
|
|
94
111
|
/**
|
|
95
112
|
* `GET /coords` → x/y(/z). One request rather than two or three: the vectors
|
|
@@ -99,7 +116,6 @@ export declare function assertManifestVersion(manifest: SpatialManifest): void;
|
|
|
99
116
|
export declare function decodeCoords(buf: ArrayBuffer, count: number, hasZ?: boolean): Pick<SpatialObservations, 'x' | 'y' | 'z'>;
|
|
100
117
|
/** `GET /radius` → per-observation radii in image pixels. */
|
|
101
118
|
export declare function decodeRadius(buf: ArrayBuffer, count: number): Float32Array;
|
|
102
|
-
/** `GET /feature/{name}` → one gene's expression vector. */
|
|
103
119
|
/**
|
|
104
120
|
* `GET /spatial/{id}/embedding/{name}` — one plane per dimension, same layout as coords.
|
|
105
121
|
*
|
|
@@ -107,6 +123,7 @@ export declare function decodeRadius(buf: ArrayBuffer, count: number): Float32Ar
|
|
|
107
123
|
* the renderer as a view with no copy and no stride.
|
|
108
124
|
*/
|
|
109
125
|
export declare function decodeEmbedding(buf: ArrayBuffer, meta: SpatialEmbeddingMeta, count: number): SpatialEmbedding;
|
|
126
|
+
/** `GET /feature/{name}` → one gene's expression vector. */
|
|
110
127
|
export declare function decodeFeatureVector(buf: ArrayBuffer, count: number): Float32Array;
|
|
111
128
|
/**
|
|
112
129
|
* `GET /column/{name}` → a loaded column, typed by its descriptor: `u16` codes
|
|
@@ -124,14 +141,22 @@ export declare function decodePolygons(buf: ArrayBuffer): SpatialPolygons;
|
|
|
124
141
|
/**
|
|
125
142
|
* `GET /polygon-tile/...` → one tile of rings with their owning observations. Layout
|
|
126
143
|
* `[u32 count][u32 obs × count][u32 offsets × (count+1)][f32 coords × 2·offsets[count]]`.
|
|
144
|
+
*
|
|
145
|
+
* `observations` is the dataset's N; when given, every owner must be below it.
|
|
127
146
|
*/
|
|
128
|
-
export declare function decodePolygonTile(buf: ArrayBuffer): SpatialPolygonTile;
|
|
147
|
+
export declare function decodePolygonTile(buf: ArrayBuffer, observations?: number): SpatialPolygonTile;
|
|
129
148
|
/**
|
|
130
149
|
* `GET /transcript-tile/...` → transcripts or aggregates. Layout, 4-byte aligned:
|
|
131
150
|
* `[u32 n][u32 flags][f32 x·n][f32 y·n][f32 z·n][u32 weight·n][u32 obs·n][u16 gene·n, padded]`;
|
|
132
151
|
* flags bit 0 marks an aggregated level.
|
|
152
|
+
*
|
|
153
|
+
* `limits` bounds the indices when the caller knows them: `observations` is the dataset's
|
|
154
|
+
* N, and `genes` the length of the gene list the codes index (omit it for `ALL_GENES`).
|
|
133
155
|
*/
|
|
134
|
-
export declare function decodeTranscriptTile(buf: ArrayBuffer
|
|
156
|
+
export declare function decodeTranscriptTile(buf: ArrayBuffer, limits?: {
|
|
157
|
+
observations?: number;
|
|
158
|
+
genes?: number;
|
|
159
|
+
}): SpatialTranscriptTile;
|
|
135
160
|
/**
|
|
136
161
|
* `GET /density?genes=&bin=` → the summed raster. Layout
|
|
137
162
|
* `[u32 rows][u32 cols][f32 cellW][f32 cellH][f32 originX][f32 originY][f32 rows·cols]`:
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { IHistogram } from '../../contracts/channel-histogram-api.contract';
|
|
2
|
+
import { NativeHistogramRequest } from './tile-protocol';
|
|
3
|
+
import { FetchJson } from './transport';
|
|
4
|
+
/** The server's `/histogram` answer (HistogramInfo). */
|
|
5
|
+
export interface NativeHistogramWire {
|
|
6
|
+
bitDepth: number;
|
|
7
|
+
rangeMin: number;
|
|
8
|
+
rangeMax: number;
|
|
9
|
+
observedMin: number;
|
|
10
|
+
observedMax: number;
|
|
11
|
+
binWidth: number;
|
|
12
|
+
counts: number[];
|
|
13
|
+
}
|
|
14
|
+
/** Map the server's HistogramInfo to an {@link IHistogram} with native bin left-edges
|
|
15
|
+
* (`rangeMin + i * binWidth`). */
|
|
16
|
+
export declare function toNativeHistogram(hi: NativeHistogramWire): IHistogram;
|
|
17
|
+
/**
|
|
18
|
+
* One channel's native-bit-depth histogram from `GET /histogram` (>8-bit images: the 8-bit display
|
|
19
|
+
* tiles cannot carry 16-bit values). The URL carries the per-app-load cache-buster.
|
|
20
|
+
*
|
|
21
|
+
* Resolves null when the server has no answer yet (202 while caching, or another status, or no
|
|
22
|
+
* counts) — the caller's pane retries. Transport failures propagate, so each backend keeps its
|
|
23
|
+
* own tagged catch; caching is the caller's too.
|
|
24
|
+
*/
|
|
25
|
+
export declare function nativeHistogram(fetchJson: FetchJson, api: string, infoB64: string, req: NativeHistogramRequest, signal?: AbortSignal): Promise<IHistogram | null>;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { TileDescriptor } from './tile-protocol';
|
|
2
|
+
import { FetchJson } from './transport';
|
|
3
|
+
/** Timing of one {@link pollDescriptor} run. */
|
|
4
|
+
export interface PollDescriptorOptions {
|
|
5
|
+
/** Give up (resolve null) once this long has passed without a descriptor. */
|
|
6
|
+
deadlineMs: number;
|
|
7
|
+
/** Wait between two polls while the server answers 202. */
|
|
8
|
+
intervalMs: number;
|
|
9
|
+
/** Per-request timeout, so a hung request cannot outlive the deadline. Default 45 s. */
|
|
10
|
+
requestTimeoutMs?: number;
|
|
11
|
+
/** Abort the whole poll: it then rejects with an `AbortError`. */
|
|
12
|
+
signal?: AbortSignal;
|
|
13
|
+
/** Log prefix for the poll's warnings, e.g. `[OSD]`. */
|
|
14
|
+
tag?: string;
|
|
15
|
+
}
|
|
16
|
+
/** Default per-request timeout of {@link pollDescriptor}. */
|
|
17
|
+
export declare const DESCRIPTOR_REQUEST_TIMEOUT_MS = 45000;
|
|
18
|
+
/**
|
|
19
|
+
* Poll `GET /tiles/info` until the server describes the source.
|
|
20
|
+
*
|
|
21
|
+
* The server answers 202 while it is still caching the source (GCS → PVC, which can take minutes
|
|
22
|
+
* for a cold whole-slide image) and 200 with the descriptor once ready. So:
|
|
23
|
+
* - **202** → wait `intervalMs` and poll again, until `deadlineMs`;
|
|
24
|
+
* - **200 with levels** → the descriptor;
|
|
25
|
+
* - **any other status**, or a 200 without levels → `null` at once: this server will not describe
|
|
26
|
+
* the source, and polling it for minutes only delays the caller's fallback (NAPARI-SVC-3);
|
|
27
|
+
* - a **transport failure** (network error, per-request timeout) → retried like a 202: a large
|
|
28
|
+
* image always passes through a busy window, and one bad poll must not abandon it;
|
|
29
|
+
* - the **deadline** passing → `null`.
|
|
30
|
+
*
|
|
31
|
+
* The first request is issued synchronously, before the returned promise first awaits. Rejects
|
|
32
|
+
* with an `AbortError` as soon as `signal` aborts (between polls, or mid-request when the
|
|
33
|
+
* transport honours the signal).
|
|
34
|
+
*
|
|
35
|
+
* These are the napari-js backend's hardened semantics; the OpenSeadragon backend used to throw on
|
|
36
|
+
* the deadline and to retry every error status. It now shares this answer and turns `null` into
|
|
37
|
+
* its own load failure (see `OpenSeadragonVisualizerService.load`).
|
|
38
|
+
*/
|
|
39
|
+
export declare function pollDescriptor(fetchJson: FetchJson, url: string, opts: PollDescriptorOptions): Promise<TileDescriptor | null>;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The jit-service tile protocol, shared by the OpenSeadragon and napari-js backends: the
|
|
3
|
+
* `/tiles/info` descriptor, and the URLs of `/tiles/info`, `/tile`, `/histogram` and
|
|
4
|
+
* `/export/tiff`. Each URL shape lives here once — the backends used to string-build them
|
|
5
|
+
* separately and had already drifted (napari's `/histogram` lacked the cache-buster).
|
|
6
|
+
*/
|
|
7
|
+
/** One pyramid level from `GET /tiles/info` (res 0 = full resolution). */
|
|
8
|
+
export interface TileLevel {
|
|
9
|
+
res: number;
|
|
10
|
+
width: number;
|
|
11
|
+
height: number;
|
|
12
|
+
}
|
|
13
|
+
/** Tile-source descriptor returned by `GET /tiles/info`. */
|
|
14
|
+
export interface TileDescriptor {
|
|
15
|
+
width: number;
|
|
16
|
+
height: number;
|
|
17
|
+
tileSize: number;
|
|
18
|
+
z: number;
|
|
19
|
+
channels: number;
|
|
20
|
+
/** True only for genuine multi-channel composites (indexed/LUT-bearing
|
|
21
|
+
* fluorescence stacks) the client should split into per-channel layers. The
|
|
22
|
+
* server sets it; an RGB photo read as separated planes has channels>1 but
|
|
23
|
+
* multichannel=false, so it stays a single composite tile source. */
|
|
24
|
+
multichannel?: boolean;
|
|
25
|
+
/** Real Bio-Formats resolution levels at the front of `levels`; the remaining
|
|
26
|
+
* levels are synthetic composited overviews (no per-channel tiles). */
|
|
27
|
+
realLevels?: number;
|
|
28
|
+
/** Per-channel metadata (name/color/bitDepth/min-maxAllowed) for native 16-bit
|
|
29
|
+
* windowing + histogram; null for plain 8-bit/RGB sources. */
|
|
30
|
+
channelInfo?: Array<{
|
|
31
|
+
name?: string;
|
|
32
|
+
color?: string;
|
|
33
|
+
bitDepth?: number;
|
|
34
|
+
minAllowed?: number;
|
|
35
|
+
maxAllowed?: number;
|
|
36
|
+
}> | null;
|
|
37
|
+
levels: TileLevel[];
|
|
38
|
+
/** Physical pixel size in µm (0 when the format doesn't report it). */
|
|
39
|
+
mppX?: number;
|
|
40
|
+
mppY?: number;
|
|
41
|
+
}
|
|
42
|
+
/** Tile coordinates for one `/tile` request. `channel == null` (or omitted)
|
|
43
|
+
* requests the server-composited tile; an index (including 0) requests that
|
|
44
|
+
* single channel as grayscale. */
|
|
45
|
+
export interface TileCoords {
|
|
46
|
+
res: number;
|
|
47
|
+
col: number;
|
|
48
|
+
row: number;
|
|
49
|
+
z: number;
|
|
50
|
+
tileSize: number;
|
|
51
|
+
channel?: number | null;
|
|
52
|
+
}
|
|
53
|
+
/** The `/tiles/info` descriptor URL for one source. */
|
|
54
|
+
export declare function tilesInfoUrl(api: string, infoB64: string): string;
|
|
55
|
+
/** Build the `/tile` request URL — the one place its query shape lives (the
|
|
56
|
+
* server caches on the exact parameter order). */
|
|
57
|
+
export declare function buildTileUrl(api: string, infoB64: string, c: TileCoords): string;
|
|
58
|
+
/**
|
|
59
|
+
* Per-app-load cache-buster for `/histogram`. The server marks the response
|
|
60
|
+
* cacheable for 24 h, and a hard refresh can't bust a post-load XHR. A token
|
|
61
|
+
* stable within a session (so the backends' in-session caches still dedupe) but
|
|
62
|
+
* new on each full load always reflects the live backend after a reload.
|
|
63
|
+
*/
|
|
64
|
+
export declare const HISTOGRAM_CACHE_BUSTER: number;
|
|
65
|
+
/** Where one channel's native-bit-depth histogram is read. */
|
|
66
|
+
export interface NativeHistogramRequest {
|
|
67
|
+
z: number;
|
|
68
|
+
channel: number;
|
|
69
|
+
bins: number;
|
|
70
|
+
}
|
|
71
|
+
/** The `/histogram` URL, with the cache-buster (see {@link HISTOGRAM_CACHE_BUSTER}). */
|
|
72
|
+
export declare function nativeHistogramUrl(api: string, infoB64: string, r: NativeHistogramRequest, cacheBuster?: number): string;
|
|
73
|
+
/**
|
|
74
|
+
* The `/export/tiff` URL for slice `z`. `visible` are the channel indices to
|
|
75
|
+
* export; the `channels` param is omitted when every one of the `channelCount`
|
|
76
|
+
* channels is visible (or none is), which is the server default (all).
|
|
77
|
+
*/
|
|
78
|
+
export declare function exportTiffUrl(api: string, infoB64: string, z: number, visible: readonly number[], channelCount: number): string;
|
|
79
|
+
/** The saved name of a native-bit-depth TIFF export of `fileName`. */
|
|
80
|
+
export declare function exportTiffFilename(fileName: string | null | undefined): string;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { HttpClient } from '@angular/common/http';
|
|
2
|
+
import { Observable } from 'rxjs';
|
|
3
|
+
/**
|
|
4
|
+
* Transport for the jit-service tile protocol.
|
|
5
|
+
*
|
|
6
|
+
* Two transports exist on purpose, and each backend uses exactly one:
|
|
7
|
+
* - **napari-js** fetches with the browser's `fetch` (its tile loader, the worker-free slice
|
|
8
|
+
* stitcher and the volume preload all need a `Response`), through {@link fetchWithAuth}: the one
|
|
9
|
+
* place the host's `getAuthHeaders()` is resolved, with its "no token → cookie auth" fallback.
|
|
10
|
+
* - **OpenSeadragon** keeps Angular's `HttpClient`, so the host's interceptors (auth, retry,
|
|
11
|
+
* logging) apply exactly as before; {@link httpFetchJson} adapts it.
|
|
12
|
+
*
|
|
13
|
+
* The protocol helpers ({@link pollDescriptor}, {@link nativeHistogram}) take a {@link FetchJson}
|
|
14
|
+
* and so run the same code over either one.
|
|
15
|
+
*/
|
|
16
|
+
/** Auth header provider — the subset of `TileAccessPort` the transport needs. */
|
|
17
|
+
export interface AuthHeaderSource {
|
|
18
|
+
getAuthHeaders(): Promise<Record<string, string>>;
|
|
19
|
+
}
|
|
20
|
+
/** Resolve the host's auth headers; a failure means cookie / anonymous auth (`{}`). */
|
|
21
|
+
export declare function resolveAuthHeaders(src: AuthHeaderSource): Promise<Record<string, string>>;
|
|
22
|
+
/** `fetch` with the host's auth headers (merged under any `init.headers`). */
|
|
23
|
+
export declare function fetchWithAuth(auth: AuthHeaderSource, url: string, init?: RequestInit): Promise<Response>;
|
|
24
|
+
/** A JSON GET's status and parsed body (null when there is none, or it is not JSON). */
|
|
25
|
+
export interface JsonResponse<T> {
|
|
26
|
+
status: number;
|
|
27
|
+
body: T | null;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* A JSON GET. Resolves with any HTTP status the server answered (2xx or not); rejects on a
|
|
31
|
+
* transport failure (network error, CORS) and as soon as `signal` aborts.
|
|
32
|
+
*/
|
|
33
|
+
export type FetchJson = <T>(url: string, signal?: AbortSignal) => Promise<JsonResponse<T>>;
|
|
34
|
+
/** {@link FetchJson} over {@link fetchWithAuth}. */
|
|
35
|
+
export declare function fetchJsonWithAuth(auth: AuthHeaderSource): FetchJson;
|
|
36
|
+
/**
|
|
37
|
+
* {@link FetchJson} over Angular's `HttpClient` (its interceptors apply). An HTTP error status is
|
|
38
|
+
* resolved, not thrown; status 0 (no response at all) stays a rejection. An abort unsubscribes,
|
|
39
|
+
* which cancels the XHR.
|
|
40
|
+
*/
|
|
41
|
+
export declare function httpFetchJson(http: HttpClient): FetchJson;
|
|
42
|
+
/**
|
|
43
|
+
* `firstValueFrom` that unsubscribes (for `HttpClient`, cancels the XHR) and rejects with an
|
|
44
|
+
* {@link abortError} as soon as `signal` aborts. The subscription is made synchronously.
|
|
45
|
+
*/
|
|
46
|
+
export declare function firstValueFromAbortable<T>(source: Observable<T>, signal?: AbortSignal): Promise<T>;
|
|
47
|
+
/** The error an aborted operation rejects with (`name === 'AbortError'`, as `fetch` uses). */
|
|
48
|
+
export declare function abortError(): Error;
|
|
49
|
+
/** Whether `err` is an abort (from {@link abortError}, `fetch`, or `AbortSignal.reason`). */
|
|
50
|
+
export declare function isAbortError(err: unknown): boolean;
|
|
51
|
+
/** Throw an {@link abortError} when `signal` has aborted. */
|
|
52
|
+
export declare function throwIfAborted(signal: AbortSignal | undefined): void;
|
|
53
|
+
/** Resolve after `ms`, or reject with an {@link abortError} as soon as `signal` aborts. */
|
|
54
|
+
export declare function abortableDelay(ms: number, signal?: AbortSignal): Promise<void>;
|
|
55
|
+
/**
|
|
56
|
+
* A signal that aborts when `parent` does, or after `timeoutMs`. Call `done()` once the guarded
|
|
57
|
+
* request settles, to clear the timer and the parent listener.
|
|
58
|
+
*/
|
|
59
|
+
export declare function timeoutSignal(parent: AbortSignal | undefined, timeoutMs: number): {
|
|
60
|
+
signal: AbortSignal;
|
|
61
|
+
done(): void;
|
|
62
|
+
};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { IntensityProfile } from '../contracts/visualizer.contract';
|
|
2
|
+
import { IImageMetadata } from '../contracts/image.contract';
|
|
3
|
+
import { Region } from '../models/region';
|
|
4
|
+
/**
|
|
5
|
+
* Pure intensity-profile math: sampling a line through a pixel frame, placing a
|
|
6
|
+
* new profile line, and the image's physical pixel size. Frames are row-major
|
|
7
|
+
* matrices: grayscale cells are numbers, RGB cells are `[r, g, b]`.
|
|
8
|
+
*/
|
|
9
|
+
/** Bright, well-separated colours cycled as the user adds profile lines.
|
|
10
|
+
* The matching inset trace is drawn in the same colour. */
|
|
11
|
+
export declare const PROFILE_PALETTE: readonly string[];
|
|
12
|
+
/** A sampling line in image (data) coordinates. */
|
|
13
|
+
export interface ProfileLine {
|
|
14
|
+
x0: number;
|
|
15
|
+
y0: number;
|
|
16
|
+
x1: number;
|
|
17
|
+
y1: number;
|
|
18
|
+
}
|
|
19
|
+
/** One frame to sample and how it maps onto the image. */
|
|
20
|
+
export interface SamplingFrame {
|
|
21
|
+
/** The pixel matrix (row-major). */
|
|
22
|
+
frame: any[];
|
|
23
|
+
/** [xRatio, yRatio]: image units per frame pixel. */
|
|
24
|
+
ratios: number[];
|
|
25
|
+
/** Image coordinate of the frame's pixel (0,0): [0,0] for the full image, a
|
|
26
|
+
* crop's top-left for a zoom crop. */
|
|
27
|
+
origin: [number, number];
|
|
28
|
+
}
|
|
29
|
+
/** Physical pixel size (microns/pixel), if known. mpp is constant across
|
|
30
|
+
* frames/channels, so the first metadata entry with a positive mppX wins. */
|
|
31
|
+
export declare function imageMpp(meta: IImageMetadata[] | undefined): {
|
|
32
|
+
mppX: number | null;
|
|
33
|
+
mppY: number | null;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Sample a frame's intensity (grayscale value or RGB luminance) along `line`.
|
|
37
|
+
* Positions are the distance along the line, in microns when `mpp` is known
|
|
38
|
+
* (anisotropic mppX/mppY applied per axis, so diagonals measure their true
|
|
39
|
+
* length), otherwise in image pixels. One sample per frame pixel along the line.
|
|
40
|
+
*/
|
|
41
|
+
export declare function sampleLine(src: SamplingFrame, line: ProfileLine, mpp: {
|
|
42
|
+
mppX: number | null;
|
|
43
|
+
mppY: number | null;
|
|
44
|
+
}): IntensityProfile;
|
|
45
|
+
/** A profile-line region's two endpoints, or null when it has no polyline.
|
|
46
|
+
* Duck-typed (not `instanceof Polygon`): after a drag round-trips through the
|
|
47
|
+
* store the bounds can be a plain object, so this matches on the point arrays. */
|
|
48
|
+
export declare function profileLineOf(region: Region): ProfileLine | null;
|
|
49
|
+
/** An image-pixel rectangle. */
|
|
50
|
+
export interface PixelRect {
|
|
51
|
+
x: number;
|
|
52
|
+
y: number;
|
|
53
|
+
width: number;
|
|
54
|
+
height: number;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Where the `count`-th profile line goes: a horizontal line spanning 2/3 of
|
|
58
|
+
* the visible part of the image (`roi`, when it overlaps the image extent
|
|
59
|
+
* `[x0, x1, y0, y1]`; else the whole image), centred, staggered down the visible
|
|
60
|
+
* band so successive lines stay distinct.
|
|
61
|
+
*/
|
|
62
|
+
export declare function placeProfileLine(extent: number[], roi: PixelRect | null, count: number): {
|
|
63
|
+
x0: number;
|
|
64
|
+
x1: number;
|
|
65
|
+
y: number;
|
|
66
|
+
};
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { OnDestroy } from '@angular/core';
|
|
2
|
+
import { HttpClient } from '@angular/common/http';
|
|
3
|
+
import { Observable } from 'rxjs';
|
|
4
|
+
import { IIntensityControls, IntensityProfile } from '../contracts/visualizer.contract';
|
|
5
|
+
import { IImageInfo } from '../contracts/image.contract';
|
|
6
|
+
import { TileAccessPort } from '../contracts/ports/tile-access.port';
|
|
7
|
+
import { ImageStatePort } from '../contracts/ports/image-state.port';
|
|
8
|
+
import { Region } from '../models/region';
|
|
9
|
+
import { RegionStore } from '../store/region-store.service';
|
|
10
|
+
import { ProfileLine } from './intensity-profile';
|
|
11
|
+
import * as i0 from "@angular/core";
|
|
12
|
+
/** The pixels the profiles are sampled from, and the image they belong to. */
|
|
13
|
+
export interface IntensityFrames {
|
|
14
|
+
/** Per-z-plane pixel matrices (grayscale numbers or `[r, g, b]` cells). */
|
|
15
|
+
frames: any[];
|
|
16
|
+
/** [xRatio, yRatio]: image units per frame pixel. */
|
|
17
|
+
ratios: number[];
|
|
18
|
+
/** Image coordinate of the frames' pixel (0,0); [0,0] unless a zoom crop. */
|
|
19
|
+
origin?: [number, number];
|
|
20
|
+
}
|
|
21
|
+
/** The image the frames come from: its extent (for line placement) and its
|
|
22
|
+
* metadata (pixel size, grayscale). */
|
|
23
|
+
export interface IntensityImage {
|
|
24
|
+
imageInfo: IImageInfo;
|
|
25
|
+
/** [x0, x1, y0, y1] in image units. */
|
|
26
|
+
extent: number[];
|
|
27
|
+
/** The displayed z-plane, when the frames hold a stack. */
|
|
28
|
+
frameIndex?: () => number;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Intensity profiles along line ROIs (PlotType.LINE), for every backend.
|
|
32
|
+
*
|
|
33
|
+
* Profile lines are ordinary RegionStore regions tagged `kind: 'profile'`; any
|
|
34
|
+
* region change re-samples and re-emits every line's profile. The service owns
|
|
35
|
+
* its OWN sampling frames — a backend's tool readback never doubles as the
|
|
36
|
+
* profile source (OSD-PLOTLY-2) — filled by Plotly when it renders or high-def
|
|
37
|
+
* zooms, and fetched here for the other backends: the displayed slice
|
|
38
|
+
* ({@link ensureIntensitySampling}) and, on zoom/pan, a display-resolution
|
|
39
|
+
* crop of the visible region ({@link refreshIntensitySamplingForRoi}). Every
|
|
40
|
+
* sampling write supersedes the async ones before it.
|
|
41
|
+
*
|
|
42
|
+
* Per viewer: listed in `provideVisualization()` with the RegionStore it
|
|
43
|
+
* listens to.
|
|
44
|
+
*/
|
|
45
|
+
export declare class IntensityProfileService implements IIntensityControls, OnDestroy {
|
|
46
|
+
private readonly http;
|
|
47
|
+
private readonly tiles;
|
|
48
|
+
private readonly regionStore;
|
|
49
|
+
private frames;
|
|
50
|
+
private image;
|
|
51
|
+
/** The last visible image-pixel rect a backend reported (new lines go there). */
|
|
52
|
+
private lastVisibleRoi;
|
|
53
|
+
/** Palette cursor (never reset on delete, so colours keep cycling). */
|
|
54
|
+
private colorSeq;
|
|
55
|
+
/** Bumped by every sampling write request: an async fetch lands only if no
|
|
56
|
+
* newer one was requested meanwhile. */
|
|
57
|
+
private gen;
|
|
58
|
+
/** The element whose parent sizes a crop request (the viewer's plot div). */
|
|
59
|
+
private elementId;
|
|
60
|
+
/** The host's selected file, so a crop for a previous file is dropped. */
|
|
61
|
+
private fileName;
|
|
62
|
+
private readonly profiles$;
|
|
63
|
+
private readonly subs;
|
|
64
|
+
private readonly utils;
|
|
65
|
+
constructor(http: HttpClient, tiles: TileAccessPort, state: ImageStatePort, regionStore: RegionStore);
|
|
66
|
+
ngOnDestroy(): void;
|
|
67
|
+
/** Every profile line's profile, re-emitted whenever one is added, moved or removed. */
|
|
68
|
+
getIntensityProfile$(): Observable<IntensityProfile[]>;
|
|
69
|
+
/** The element (by id) whose size a crop request is made for. */
|
|
70
|
+
setSamplingElement(id: string): void;
|
|
71
|
+
/** Supersede every sampling fetch in flight; returns the new generation. */
|
|
72
|
+
supersede(): number;
|
|
73
|
+
/** Whether `gen` (from {@link supersede}) is still the latest sampling request. */
|
|
74
|
+
isCurrent(gen: number): boolean;
|
|
75
|
+
/** Sample from these frames from now on — of `image`, or of the image already set. */
|
|
76
|
+
setFrames(frames: IntensityFrames, image?: IntensityImage): void;
|
|
77
|
+
/**
|
|
78
|
+
* Fetch the displayed slice's preview for sampling (the same pixels a heatmap
|
|
79
|
+
* would sample), for a backend that has no frames of its own (OpenSeadragon,
|
|
80
|
+
* napari-js). Re-emits the profiles once loaded.
|
|
81
|
+
*/
|
|
82
|
+
ensureIntensitySampling(imageInfo: IImageInfo, zIndex: number): Promise<void>;
|
|
83
|
+
/**
|
|
84
|
+
* Re-fetch the given image-pixel ROI at the display resolution and sample from
|
|
85
|
+
* it, so the profile reflects the data at the current zoom level. Also
|
|
86
|
+
* remembers the ROI, so a new line is placed inside it.
|
|
87
|
+
*/
|
|
88
|
+
refreshIntensitySamplingForRoi(x: number, y: number, width: number, height: number, zIndex: number): void;
|
|
89
|
+
/**
|
|
90
|
+
* Add another profile line: a horizontal open 2-point polyline in the next
|
|
91
|
+
* palette colour, placed by {@link placeProfileLine}, added to the shared
|
|
92
|
+
* store so every backend renders and drags it (and excluded from the Regions
|
|
93
|
+
* tab and exports by its kind). Null until an image extent is known.
|
|
94
|
+
*/
|
|
95
|
+
addProfileLine(): Region | null;
|
|
96
|
+
/** Recompute and broadcast every profile line's profile (tagged with the
|
|
97
|
+
* line's id and colour, so the inset trace matches its line). */
|
|
98
|
+
emitProfiles(): void;
|
|
99
|
+
/** Sample the active frame along `line` (see sampleLine). */
|
|
100
|
+
computeIntensityProfile(line: ProfileLine): IntensityProfile;
|
|
101
|
+
/** The profile-line regions in the store. */
|
|
102
|
+
private profileRegions;
|
|
103
|
+
/** Fetch one slice through HttpClient (auth interceptors apply) and decode it. */
|
|
104
|
+
private loadSlice;
|
|
105
|
+
private toMatrix;
|
|
106
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<IntensityProfileService, never>;
|
|
107
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<IntensityProfileService>;
|
|
108
|
+
}
|