@jax-data-science/sci-image-visualizer 0.8.3 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +201 -460
- package/esm2022/index.mjs +34 -15
- package/esm2022/lib/channel-histogram/channel-histogram.component.mjs +163 -91
- package/esm2022/lib/contracts/capabilities.contract.mjs +4 -3
- package/esm2022/lib/contracts/cell-segmenter.contract.mjs +1 -1
- package/esm2022/lib/contracts/channel-histogram-api.contract.mjs +5 -1
- package/esm2022/lib/contracts/color.mjs +60 -0
- package/esm2022/lib/contracts/colormap-lut.mjs +213 -57
- package/esm2022/lib/contracts/coordinate-transform.contract.mjs +1 -1
- package/esm2022/lib/contracts/display-types.mjs +11 -1
- package/esm2022/lib/contracts/image.contract.mjs +1 -1
- package/esm2022/lib/contracts/instance-segmenter.contract.mjs +1 -1
- package/esm2022/lib/contracts/intensity.mjs +48 -5
- package/esm2022/lib/contracts/plot-type-contribution.contract.mjs +1 -1
- package/esm2022/lib/contracts/plot-type.mjs +134 -17
- package/esm2022/lib/contracts/ports/image-state.port.mjs +4 -1
- package/esm2022/lib/contracts/ports/preferences.port.mjs +5 -1
- package/esm2022/lib/contracts/ports/region-io.port.mjs +2 -1
- package/esm2022/lib/contracts/ports/spatial-data.port.mjs +5 -1
- package/esm2022/lib/contracts/ports/tile-access.port.mjs +2 -1
- package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
- package/esm2022/lib/contracts/region-overlay.contract.mjs +1 -1
- package/esm2022/lib/contracts/region-store.contract.mjs +1 -1
- package/esm2022/lib/contracts/sam.contract.mjs +1 -1
- package/esm2022/lib/contracts/section-view.contract.mjs +2 -0
- package/esm2022/lib/contracts/semantic-segmenter.contract.mjs +1 -1
- package/esm2022/lib/contracts/spatial-dataset.contract.mjs +3 -1
- package/esm2022/lib/contracts/toolbar-tool.contract.mjs +6 -4
- package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
- package/esm2022/lib/contracts/viz-config.mjs +2 -1
- package/esm2022/lib/geometry/contour.mjs +63 -0
- package/esm2022/lib/geometry/loft.mjs +128 -0
- package/esm2022/lib/geometry/polylabel.mjs +156 -0
- package/esm2022/lib/geometry/raster.mjs +98 -0
- package/esm2022/lib/geometry/reconstruct.mjs +315 -0
- package/esm2022/lib/geometry/reslice-image.mjs +57 -0
- package/esm2022/lib/geometry/ring.mjs +201 -0
- package/esm2022/lib/geometry/section.mjs +215 -0
- package/esm2022/lib/hex-color-picker/hex-color-picker.component.mjs +202 -102
- package/esm2022/lib/implementations/base-store-visualizer.mjs +201 -48
- package/esm2022/lib/implementations/napari-js/napari-axes-gizmo.mjs +65 -0
- package/esm2022/lib/implementations/napari-js/napari-display-state.mjs +136 -0
- package/esm2022/lib/implementations/napari-js/napari-helpers.mjs +199 -0
- package/esm2022/lib/implementations/napari-js/napari-image-2d-scene.mjs +602 -0
- package/esm2022/lib/implementations/napari-js/napari-loading-badge.mjs +12 -9
- package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +83 -0
- package/esm2022/lib/implementations/napari-js/napari-region-mesh-pointer.mjs +100 -0
- package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +180 -591
- package/esm2022/lib/implementations/napari-js/napari-scene.mjs +2 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +614 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +769 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +199 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +270 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +159 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +106 -1408
- package/esm2022/lib/implementations/napari-js/napari-spatial-tooltip.mjs +2 -2
- package/esm2022/lib/implementations/napari-js/napari-surface-scene.mjs +271 -0
- package/esm2022/lib/implementations/napari-js/napari-tile-client.mjs +562 -0
- package/esm2022/lib/implementations/napari-js/napari-tool-bridge.mjs +347 -0
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +427 -4207
- package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +129 -0
- package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +550 -0
- package/esm2022/lib/implementations/napari-js/napari-volume-slice-planes.mjs +103 -0
- package/esm2022/lib/implementations/napari-js/napari-volume-z-handle.mjs +6 -6
- package/esm2022/lib/implementations/napari-js/region-overlay/overlay-projection.mjs +96 -0
- package/esm2022/lib/implementations/napari-js/region-overlay/region-edit.mjs +35 -0
- package/esm2022/lib/implementations/napari-js/region-overlay/region-svg-renderer.mjs +194 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/categorical-lookup.mjs +30 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +274 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/density-layer.mjs +144 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/layer-groups.mjs +165 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/plan-context.mjs +78 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-hover.mjs +182 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-jobs.mjs +369 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +306 -0
- package/esm2022/lib/implementations/osd/display-pipeline.mjs +102 -40
- package/esm2022/lib/implementations/osd/histogram-sampler.mjs +56 -31
- package/esm2022/lib/implementations/osd/openseadragon-viewer-options.mjs +128 -0
- package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +333 -1685
- package/esm2022/lib/implementations/osd/osd-coordinate-transform.mjs +1 -1
- package/esm2022/lib/implementations/osd/osd-coords.mjs +5 -6
- package/esm2022/lib/implementations/osd/osd-export.mjs +122 -0
- package/esm2022/lib/implementations/osd/osd-lib.mjs +15 -1
- package/esm2022/lib/implementations/osd/osd-navigator-chrome.mjs +205 -0
- package/esm2022/lib/implementations/osd/osd-pixel-readback.mjs +68 -0
- package/esm2022/lib/implementations/osd/osd-region-overlay-draw.mjs +164 -0
- package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +213 -716
- package/esm2022/lib/implementations/osd/osd-scale-bar.mjs +52 -60
- package/esm2022/lib/implementations/osd/osd-tile-source.mjs +105 -0
- package/esm2022/lib/implementations/osd/osd-viewer-like.mjs +2 -0
- package/esm2022/lib/implementations/osd/osd-viewer-mount.mjs +44 -0
- package/esm2022/lib/implementations/osd/osd-viewport.mjs +184 -0
- package/esm2022/lib/implementations/osd/osd-zoom.mjs +7 -1
- package/esm2022/lib/implementations/osd/simple-source.mjs +395 -0
- package/esm2022/lib/implementations/osd/slice-cache.mjs +53 -48
- package/esm2022/lib/implementations/osd/tile-client.mjs +32 -11
- package/esm2022/lib/implementations/osd/tile-recolor.mjs +330 -0
- package/esm2022/lib/implementations/plotly/omics-trace-builders.mjs +161 -73
- package/esm2022/lib/implementations/plotly/plotly-coordinate-transform.mjs +1 -1
- package/esm2022/lib/implementations/plotly/plotly-image-loader.mjs +112 -0
- package/esm2022/lib/implementations/plotly/plotly-image-recolor.mjs +178 -0
- package/esm2022/lib/implementations/plotly/plotly-intensity-inset.mjs +33 -0
- package/esm2022/lib/implementations/plotly/plotly-isosurface-controls.mjs +83 -0
- package/esm2022/lib/implementations/plotly/plotly-layouts.mjs +121 -0
- package/esm2022/lib/implementations/plotly/plotly-readback.mjs +117 -0
- package/esm2022/lib/implementations/plotly/plotly-region-overlay.mjs +19 -10
- package/esm2022/lib/implementations/plotly/plotly-shape-projection.mjs +223 -0
- package/esm2022/lib/implementations/plotly/plotly-trace-builders.mjs +79 -19
- package/esm2022/lib/implementations/plotly/plotly-zoom-controller.mjs +223 -0
- package/esm2022/lib/implementations/plotly/plotly.service.mjs +439 -1655
- package/esm2022/lib/implementations/region-centroids.mjs +47 -0
- package/esm2022/lib/implementations/simple-slice-access.service.mjs +22 -12
- package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +172 -92
- package/esm2022/lib/implementations/spatial-data-http/spatial-wire.mjs +103 -22
- package/esm2022/lib/implementations/tile-server/index.mjs +6 -0
- package/esm2022/lib/implementations/tile-server/native-histogram.mjs +30 -0
- package/esm2022/lib/implementations/tile-server/poll-descriptor.mjs +65 -0
- package/esm2022/lib/implementations/tile-server/tile-protocol.mjs +42 -0
- package/esm2022/lib/implementations/tile-server/transport.mjs +135 -0
- package/esm2022/lib/intensity/intensity-profile.mjs +107 -0
- package/esm2022/lib/intensity/intensity-profile.service.mjs +223 -0
- package/esm2022/lib/intensity-inset/intensity-inset.component.mjs +133 -0
- package/esm2022/lib/models/bezier.mjs +1 -11
- package/esm2022/lib/models/class-preset.mjs +41 -3
- package/esm2022/lib/models/geometry.mjs +27 -164
- package/esm2022/lib/models/polygon-edit.mjs +254 -0
- package/esm2022/lib/models/polygon-factory.mjs +134 -0
- package/esm2022/lib/models/region-clone.mjs +68 -0
- package/esm2022/lib/models/region-geojson.mjs +411 -0
- package/esm2022/lib/models/region.mjs +34 -33
- package/esm2022/lib/models/shape.mjs +18 -16
- package/esm2022/lib/plot-mode/contribution-host.mjs +297 -0
- package/esm2022/lib/plot-mode/plot-mode-controller.mjs +9 -6
- package/esm2022/lib/plot-mode/plot-type-menu.mjs +85 -0
- package/esm2022/lib/plot-mode/tool-params-model.mjs +87 -0
- package/esm2022/lib/plot.utilities.mjs +296 -473
- package/esm2022/lib/processing/image-crop.mjs +1 -1
- package/esm2022/lib/processing/processing-image.mjs +28 -15
- package/esm2022/lib/provide-visualization.mjs +40 -14
- package/esm2022/lib/region-editor/class-tree/class-tree.component.mjs +156 -0
- package/esm2022/lib/region-editor/class-tree/class-tree.mjs +108 -0
- package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +163 -0
- package/esm2022/lib/region-editor/file-stem.mjs +13 -0
- package/esm2022/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.mjs +118 -0
- package/esm2022/lib/region-editor/mask-export.service.mjs +98 -0
- package/esm2022/lib/region-editor/mask-raster.mjs +11 -5
- package/esm2022/lib/region-editor/region-color-dialog/region-color-dialog.component.mjs +56 -0
- package/esm2022/lib/region-editor/region-editor-help/region-editor-help.component.mjs +28 -0
- package/esm2022/lib/region-editor/region-editor.component.mjs +896 -660
- package/esm2022/lib/region-editor/region-metrics.mjs +86 -0
- package/esm2022/lib/region-editor/region-persistence.service.mjs +160 -0
- package/esm2022/lib/region-editor/region-table/region-table.component.mjs +169 -0
- package/esm2022/lib/region-editor/save-mask-dialog/save-mask-dialog.component.mjs +91 -0
- package/esm2022/lib/region-editor/save-regions-dialog/save-regions-dialog.component.mjs +92 -0
- package/esm2022/lib/region-ops.service.mjs +28 -70
- package/esm2022/lib/region-overlay/region-geometry.mjs +360 -0
- package/esm2022/lib/region-overlay/region-hit-test.mjs +103 -0
- package/esm2022/lib/region-overlay/region-source-layer.mjs +378 -0
- package/esm2022/lib/region-overlay/region-style.mjs +97 -0
- package/esm2022/lib/region-overlay/svg-region-renderer.mjs +228 -0
- package/esm2022/lib/region-source/http-region-source.mjs +104 -0
- package/esm2022/lib/region-source/region-source-ops.mjs +53 -0
- package/esm2022/lib/region-source/region-source-worker.mjs +10 -0
- package/esm2022/lib/region-source/region-source.mjs +67 -0
- package/esm2022/lib/region-source/region-tiles.mjs +708 -0
- package/esm2022/lib/region-source/worker-region-source.mjs +229 -0
- package/esm2022/lib/render-orchestrator.mjs +14 -11
- package/esm2022/lib/render-session.mjs +207 -0
- package/esm2022/lib/routing-visualizer.service.mjs +858 -414
- package/esm2022/lib/section-pane/section-pane.component.mjs +299 -0
- package/esm2022/lib/spatial/density-raster.mjs +14 -0
- package/esm2022/lib/spatial/embedding-compute-coordinator.mjs +239 -0
- package/esm2022/lib/spatial/embedding-compute.mjs +43 -10
- package/esm2022/lib/spatial/gene-search.mjs +1 -1
- package/esm2022/lib/spatial/glyphs.mjs +97 -0
- package/esm2022/lib/spatial/lod.mjs +187 -0
- package/esm2022/lib/spatial/spatial-controls.facade.mjs +200 -0
- package/esm2022/lib/spatial/spatial-density.mjs +25 -16
- package/esm2022/lib/spatial/spatial-encoding.mjs +26 -82
- package/esm2022/lib/spatial/spatial-expression.mjs +43 -42
- package/esm2022/lib/spatial/spatial-framing.mjs +1 -1
- package/esm2022/lib/spatial/spatial-heatmap.mjs +6 -3
- package/esm2022/lib/spatial/spatial-hover.mjs +5 -33
- package/esm2022/lib/spatial/spatial-panel-model.mjs +282 -0
- package/esm2022/lib/spatial/spatial-sections.mjs +1 -1
- package/esm2022/lib/spatial/spatial-selection.mjs +33 -46
- package/esm2022/lib/spatial/spatial-tile-merge.mjs +219 -0
- package/esm2022/lib/spatial/spatial-tiles.mjs +12 -648
- package/esm2022/lib/spatial/spatial-volume-image.mjs +2 -4
- package/esm2022/lib/spatial/stats.mjs +71 -0
- package/esm2022/lib/spatial/transcript-grouping.mjs +307 -0
- package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +150 -0
- package/esm2022/lib/spatial-controls/spatial-charts/chart-data-model.mjs +309 -0
- package/esm2022/lib/spatial-controls/spatial-charts/chart-help.mjs +145 -0
- package/esm2022/lib/spatial-controls/spatial-charts/plotly-chart-host.mjs +158 -0
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.mjs +47 -0
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +297 -802
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.mjs +89 -0
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.mjs +52 -0
- package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +143 -1238
- package/esm2022/lib/spatial-controls/spatial-gene-picker.mjs +153 -0
- package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +241 -0
- package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +193 -0
- package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +132 -0
- package/esm2022/lib/spatial-controls/spatial-key/spatial-key.model.mjs +67 -0
- package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +147 -0
- package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +300 -0
- package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +370 -0
- package/esm2022/lib/store/class-color.util.mjs +53 -5
- package/esm2022/lib/store/class-signatures.mjs +63 -0
- package/esm2022/lib/store/region-history.mjs +146 -0
- package/esm2022/lib/store/region-scope-cache.mjs +144 -0
- package/esm2022/lib/store/region-selection.mjs +82 -0
- package/esm2022/lib/store/region-source-scope.mjs +171 -0
- package/esm2022/lib/store/region-store.service.mjs +986 -670
- package/esm2022/lib/store/spatial-selection.service.mjs +2 -2
- package/esm2022/lib/store/visualizer-store.service.mjs +81 -76
- package/esm2022/lib/toast-outlets.mjs +5 -4
- package/esm2022/lib/toolbar/brush/brush-tool.service.mjs +92 -434
- package/esm2022/lib/toolbar/canvas-tools.mjs +20 -0
- package/esm2022/lib/toolbar/crop/slide-crop.mjs +26 -42
- package/esm2022/lib/toolbar/plot-type-selector/plot-type-selector.component.mjs +85 -0
- package/esm2022/lib/toolbar/region-tools/region-tool-buttons.mjs +74 -0
- package/esm2022/lib/toolbar/region-tools/region-tools.component.mjs +120 -0
- package/esm2022/lib/toolbar/segmentation/cell-segment-tool.service.mjs +74 -78
- package/esm2022/lib/toolbar/segmentation/cellpose-segmenter.service.mjs +50 -8
- package/esm2022/lib/toolbar/segmentation/onnx-sam-session.mjs +61 -42
- package/esm2022/lib/toolbar/segmentation/pending-calls.mjs +47 -0
- package/esm2022/lib/toolbar/segmentation/sam-model-registry.mjs +12 -4
- package/esm2022/lib/toolbar/segmentation/sam-onnx-core.mjs +70 -14
- package/esm2022/lib/toolbar/segmentation/sam-point-tool.service.mjs +135 -172
- package/esm2022/lib/toolbar/segmentation/sam-prompt.mjs +9 -90
- package/esm2022/lib/toolbar/segmentation/sam-session.service.mjs +183 -0
- package/esm2022/lib/toolbar/segmentation/sam-tool.service.mjs +95 -150
- package/esm2022/lib/toolbar/segmentation/segmentation-commit.mjs +12 -0
- package/esm2022/lib/toolbar/segmentation/segmentation-runner.mjs +108 -0
- package/esm2022/lib/toolbar/segmentation-tools/segmentation-tools.component.mjs +155 -0
- package/esm2022/lib/toolbar/stack-controls/stack-controls.component.mjs +121 -0
- package/esm2022/lib/toolbar/tool-kit/async-tool-status.mjs +37 -0
- package/esm2022/lib/toolbar/tool-kit/canvas-tool-manager.mjs +63 -0
- package/esm2022/lib/toolbar/tool-kit/canvas-tool.mjs +2 -0
- package/esm2022/lib/toolbar/tool-kit/frame-pixels.mjs +108 -0
- package/esm2022/lib/toolbar/tool-kit/mask-stroke-editor.mjs +306 -0
- package/esm2022/lib/toolbar/tool-kit/matrix-frame.mjs +61 -0
- package/esm2022/lib/toolbar/tool-kit/tool-overlay.mjs +140 -0
- package/esm2022/lib/toolbar/tool-kit/undo-gesture.mjs +24 -0
- package/esm2022/lib/toolbar/tool-slider/tool-slider.component.mjs +63 -0
- package/esm2022/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.mjs +50 -0
- package/esm2022/lib/toolbar/toolbar.component.mjs +84 -119
- package/esm2022/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.mjs +93 -115
- package/esm2022/lib/toolbar/view-controls/view-controls.component.mjs +107 -0
- package/esm2022/lib/toolbar/wand/wand-region-grow.mjs +321 -0
- package/esm2022/lib/toolbar/wand/wand-tool.service.mjs +121 -416
- package/esm2022/lib/toolbar/wand/wand.service.mjs +30 -894
- package/esm2022/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.mjs +48 -90
- package/esm2022/lib/util/mark-for-check.mjs +17 -0
- package/esm2022/lib/util/supersede.mjs +56 -0
- package/esm2022/lib/visualization.module.mjs +39 -141
- package/esm2022/lib/visualizer/floating-drag.directive.mjs +58 -0
- package/esm2022/lib/visualizer/region-actions.mjs +149 -0
- package/esm2022/lib/visualizer/region-load.mjs +123 -0
- package/esm2022/lib/visualizer/spatial-dataset-binder.mjs +163 -0
- package/esm2022/lib/visualizer/tool-modes.mjs +113 -0
- package/esm2022/lib/visualizer/viewer-shortcuts.mjs +167 -0
- package/esm2022/lib/visualizer/visualizer-context-menu.mjs +119 -0
- package/esm2022/lib/visualizer/volume-sections.mjs +175 -0
- package/esm2022/lib/visualizer.component.mjs +602 -1902
- package/esm2022/lib/workers/spatial-math-ops.mjs +43 -0
- package/esm2022/lib/workers/spatial-math-worker.mjs +10 -0
- package/esm2022/lib/workers/spatial-math.mjs +190 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BKQhpbHv.mjs +47169 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BKQhpbHv.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-z1IN-F7w.mjs +238 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-z1IN-F7w.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.mjs +12 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs +12 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +41 -34467
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
- package/fesm2022/mask.worker.js +36 -917
- package/fesm2022/onnx-sam.worker.js +52 -16
- package/fesm2022/region-source.worker.js +1067 -0
- package/fesm2022/spatial-math.worker.js +471 -0
- package/fesm2022/tsne.worker.js +32 -15
- package/index.d.ts +19 -10
- package/lib/channel-histogram/channel-histogram.component.d.ts +53 -43
- package/lib/contracts/capabilities.contract.d.ts +4 -2
- package/lib/contracts/cell-segmenter.contract.d.ts +1 -0
- package/lib/contracts/channel-histogram-api.contract.d.ts +4 -0
- package/lib/contracts/color.d.ts +27 -0
- package/lib/contracts/colormap-lut.d.ts +19 -4
- package/lib/contracts/coordinate-transform.contract.d.ts +3 -3
- package/lib/contracts/display-types.d.ts +21 -0
- package/lib/contracts/image.contract.d.ts +4 -0
- package/lib/contracts/instance-segmenter.contract.d.ts +5 -0
- package/lib/contracts/intensity.d.ts +13 -2
- package/lib/contracts/plot-type.d.ts +3 -1
- package/lib/contracts/ports/image-state.port.d.ts +6 -2
- package/lib/contracts/ports/preferences.port.d.ts +4 -0
- package/lib/contracts/ports/region-io.port.d.ts +1 -0
- package/lib/contracts/ports/spatial-data.port.d.ts +4 -10
- package/lib/contracts/ports/tile-access.port.d.ts +1 -0
- package/lib/contracts/region-editor-api.contract.d.ts +85 -1
- package/lib/contracts/region-overlay.contract.d.ts +5 -0
- package/lib/contracts/region-store.contract.d.ts +22 -0
- package/lib/contracts/sam.contract.d.ts +7 -0
- package/lib/contracts/section-view.contract.d.ts +44 -0
- package/lib/contracts/semantic-segmenter.contract.d.ts +6 -0
- package/lib/contracts/spatial-dataset.contract.d.ts +19 -6
- package/lib/contracts/toolbar-tool.contract.d.ts +1 -0
- package/lib/contracts/visualizer.contract.d.ts +231 -54
- package/lib/contracts/viz-config.d.ts +9 -0
- package/lib/geometry/contour.d.ts +24 -0
- package/lib/geometry/loft.d.ts +22 -0
- package/lib/geometry/polylabel.d.ts +23 -0
- package/lib/geometry/raster.d.ts +42 -0
- package/lib/geometry/reconstruct.d.ts +54 -0
- package/lib/geometry/reslice-image.d.ts +33 -0
- package/lib/geometry/ring.d.ts +67 -0
- package/lib/geometry/section.d.ts +52 -0
- package/lib/hex-color-picker/hex-color-picker.component.d.ts +61 -27
- package/lib/implementations/base-store-visualizer.d.ts +61 -15
- package/lib/implementations/napari-js/napari-axes-gizmo.d.ts +36 -0
- package/lib/implementations/napari-js/napari-display-state.d.ts +76 -0
- package/lib/implementations/napari-js/napari-helpers.d.ts +129 -0
- package/lib/implementations/napari-js/napari-image-2d-scene.d.ts +162 -0
- package/lib/implementations/napari-js/napari-loading-badge.d.ts +4 -3
- package/lib/implementations/napari-js/napari-loading-state.d.ts +37 -0
- package/lib/implementations/napari-js/napari-region-mesh-pointer.d.ts +32 -0
- package/lib/implementations/napari-js/napari-region-overlay.d.ts +68 -71
- package/lib/implementations/napari-js/napari-scene.d.ts +126 -0
- package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +163 -0
- package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +212 -0
- package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +114 -0
- package/lib/implementations/napari-js/napari-spatial-hover.d.ts +91 -0
- package/lib/implementations/napari-js/napari-spatial-scene.d.ts +118 -0
- package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +56 -263
- package/lib/implementations/napari-js/napari-spatial-tooltip.d.ts +1 -1
- package/lib/implementations/napari-js/napari-surface-scene.d.ts +76 -0
- package/lib/implementations/napari-js/napari-tile-client.d.ts +214 -0
- package/lib/implementations/napari-js/napari-tool-bridge.d.ts +179 -0
- package/lib/implementations/napari-js/napari-visualizer.service.d.ts +169 -883
- package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +66 -0
- package/lib/implementations/napari-js/napari-volume-scene.d.ts +148 -0
- package/lib/implementations/napari-js/napari-volume-slice-planes.d.ts +43 -0
- package/lib/implementations/napari-js/napari-volume-z-handle.d.ts +8 -12
- package/lib/implementations/napari-js/region-overlay/overlay-projection.d.ts +59 -0
- package/lib/implementations/napari-js/region-overlay/region-edit.d.ts +15 -0
- package/lib/implementations/napari-js/region-overlay/region-svg-renderer.d.ts +54 -0
- package/lib/implementations/napari-js/spatial-tiles/categorical-lookup.d.ts +26 -0
- package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +70 -0
- package/lib/implementations/napari-js/spatial-tiles/density-layer.d.ts +61 -0
- package/lib/implementations/napari-js/spatial-tiles/layer-groups.d.ts +67 -0
- package/lib/implementations/napari-js/spatial-tiles/plan-context.d.ts +38 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-hover.d.ts +71 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-jobs.d.ts +105 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +56 -0
- package/lib/implementations/osd/display-pipeline.d.ts +38 -9
- package/lib/implementations/osd/histogram-sampler.d.ts +22 -12
- package/lib/implementations/osd/openseadragon-viewer-options.d.ts +35 -0
- package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +78 -354
- package/lib/implementations/osd/osd-coordinate-transform.d.ts +2 -1
- package/lib/implementations/osd/osd-coords.d.ts +6 -4
- package/lib/implementations/osd/osd-export.d.ts +36 -0
- package/lib/implementations/osd/osd-lib.d.ts +7 -0
- package/lib/implementations/osd/osd-navigator-chrome.d.ts +69 -0
- package/lib/implementations/osd/osd-pixel-readback.d.ts +22 -0
- package/lib/implementations/osd/osd-region-overlay-draw.d.ts +38 -0
- package/lib/implementations/osd/osd-region-overlay.d.ts +46 -51
- package/lib/implementations/osd/osd-scale-bar.d.ts +8 -6
- package/lib/implementations/osd/osd-tile-source.d.ts +49 -0
- package/lib/implementations/osd/osd-viewer-like.d.ts +100 -0
- package/lib/implementations/osd/osd-viewer-mount.d.ts +14 -0
- package/lib/implementations/osd/osd-viewport.d.ts +77 -0
- package/lib/implementations/osd/osd-zoom.d.ts +6 -0
- package/lib/implementations/osd/simple-source.d.ts +161 -0
- package/lib/implementations/osd/slice-cache.d.ts +12 -3
- package/lib/implementations/osd/tile-client.d.ts +11 -14
- package/lib/implementations/osd/tile-recolor.d.ts +141 -0
- package/lib/implementations/plotly/omics-trace-builders.d.ts +32 -20
- package/lib/implementations/plotly/plotly-image-loader.d.ts +49 -0
- package/lib/implementations/plotly/plotly-image-recolor.d.ts +75 -0
- package/lib/implementations/plotly/plotly-intensity-inset.d.ts +8 -0
- package/lib/implementations/plotly/plotly-isosurface-controls.d.ts +38 -0
- package/lib/implementations/plotly/plotly-layouts.d.ts +188 -0
- package/lib/implementations/plotly/plotly-readback.d.ts +41 -0
- package/lib/implementations/plotly/plotly-region-overlay.d.ts +2 -2
- package/lib/implementations/plotly/plotly-shape-projection.d.ts +92 -0
- package/lib/implementations/plotly/plotly-trace-builders.d.ts +23 -12
- package/lib/implementations/plotly/plotly-zoom-controller.d.ts +86 -0
- package/lib/implementations/plotly/plotly.service.d.ts +136 -401
- package/lib/implementations/region-centroids.d.ts +14 -0
- package/lib/implementations/simple-slice-access.service.d.ts +7 -4
- package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +42 -18
- package/lib/implementations/spatial-data-http/spatial-wire.d.ts +34 -9
- package/lib/implementations/tile-server/index.d.ts +5 -0
- package/lib/implementations/tile-server/native-histogram.d.ts +25 -0
- package/lib/implementations/tile-server/poll-descriptor.d.ts +39 -0
- package/lib/implementations/tile-server/tile-protocol.d.ts +83 -0
- package/lib/implementations/tile-server/transport.d.ts +62 -0
- package/lib/intensity/intensity-profile.d.ts +66 -0
- package/lib/intensity/intensity-profile.service.d.ts +108 -0
- package/lib/intensity-inset/intensity-inset.component.d.ts +58 -0
- package/lib/models/bezier.d.ts +0 -5
- package/lib/models/class-preset.d.ts +25 -0
- package/lib/models/geometry.d.ts +14 -48
- package/lib/models/polygon-edit.d.ts +72 -0
- package/lib/models/polygon-factory.d.ts +45 -0
- package/lib/models/region-clone.d.ts +20 -0
- package/lib/models/region-geojson.d.ts +57 -0
- package/lib/models/region.d.ts +59 -4
- package/lib/models/shape.d.ts +8 -0
- package/lib/plot-mode/contribution-host.d.ts +125 -0
- package/lib/plot-mode/plot-type-menu.d.ts +60 -0
- package/lib/plot-mode/tool-params-model.d.ts +49 -0
- package/lib/plot.utilities.d.ts +19 -30
- package/lib/processing/processing-image.d.ts +5 -2
- package/lib/provide-visualization.d.ts +19 -2
- package/lib/region-editor/class-tree/class-tree.component.d.ts +78 -0
- package/lib/region-editor/class-tree/class-tree.d.ts +31 -0
- package/lib/region-editor/classes-panel/classes-panel.component.d.ts +86 -0
- package/lib/region-editor/file-stem.d.ts +7 -0
- package/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.d.ts +45 -0
- package/lib/region-editor/mask-export.service.d.ts +54 -0
- package/lib/region-editor/mask-raster.d.ts +2 -8
- package/lib/region-editor/region-color-dialog/region-color-dialog.component.d.ts +29 -0
- package/lib/region-editor/region-editor-help/region-editor-help.component.d.ts +11 -0
- package/lib/region-editor/region-editor.component.d.ts +283 -200
- package/lib/region-editor/region-metrics.d.ts +34 -0
- package/lib/region-editor/region-persistence.service.d.ts +77 -0
- package/lib/region-editor/region-table/region-table.component.d.ts +89 -0
- package/lib/region-editor/save-mask-dialog/save-mask-dialog.component.d.ts +36 -0
- package/lib/region-editor/save-regions-dialog/save-regions-dialog.component.d.ts +37 -0
- package/lib/region-ops.service.d.ts +1 -7
- package/lib/region-overlay/region-geometry.d.ts +158 -0
- package/lib/region-overlay/region-hit-test.d.ts +38 -0
- package/lib/region-overlay/region-source-layer.d.ts +96 -0
- package/lib/region-overlay/region-style.d.ts +52 -0
- package/lib/region-overlay/svg-region-renderer.d.ts +110 -0
- package/lib/region-source/http-region-source.d.ts +45 -0
- package/lib/region-source/region-source-ops.d.ts +89 -0
- package/lib/region-source/region-source-worker.d.ts +7 -0
- package/lib/region-source/region-source.d.ts +82 -0
- package/lib/region-source/region-tiles.d.ts +289 -0
- package/lib/region-source/worker-region-source.d.ts +65 -0
- package/lib/render-orchestrator.d.ts +6 -2
- package/lib/render-session.d.ts +75 -0
- package/lib/routing-visualizer.service.d.ts +248 -59
- package/lib/section-pane/section-pane.component.d.ts +47 -0
- package/lib/spatial/density-raster.d.ts +6 -0
- package/lib/spatial/embedding-compute-coordinator.d.ts +123 -0
- package/lib/spatial/embedding-compute.d.ts +21 -2
- package/lib/spatial/glyphs.d.ts +16 -0
- package/lib/spatial/lod.d.ts +94 -0
- package/lib/spatial/spatial-controls.facade.d.ts +64 -0
- package/lib/spatial/spatial-density.d.ts +15 -5
- package/lib/spatial/spatial-encoding.d.ts +11 -44
- package/lib/spatial/spatial-expression.d.ts +40 -22
- package/lib/spatial/spatial-framing.d.ts +1 -0
- package/lib/spatial/spatial-heatmap.d.ts +2 -0
- package/lib/spatial/spatial-hover.d.ts +4 -16
- package/lib/spatial/spatial-panel-model.d.ts +135 -0
- package/lib/spatial/spatial-selection.d.ts +21 -26
- package/lib/spatial/spatial-tile-merge.d.ts +41 -0
- package/lib/spatial/spatial-tiles.d.ts +9 -256
- package/lib/spatial/stats.d.ts +38 -0
- package/lib/spatial/transcript-grouping.d.ts +119 -0
- package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +64 -0
- package/lib/spatial-controls/spatial-charts/chart-data-model.d.ts +153 -0
- package/lib/spatial-controls/spatial-charts/chart-help.d.ts +69 -0
- package/lib/spatial-controls/spatial-charts/plotly-chart-host.d.ts +98 -0
- package/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.d.ts +26 -0
- package/lib/spatial-controls/spatial-charts/spatial-charts.component.d.ts +101 -260
- package/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.d.ts +43 -0
- package/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.d.ts +27 -0
- package/lib/spatial-controls/spatial-controls.component.d.ts +68 -448
- package/lib/spatial-controls/spatial-gene-picker.d.ts +86 -0
- package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +102 -0
- package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +72 -0
- package/lib/spatial-controls/spatial-key/spatial-key.component.d.ts +66 -0
- package/lib/spatial-controls/spatial-key/spatial-key.model.d.ts +33 -0
- package/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.d.ts +64 -0
- package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +117 -0
- package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +142 -0
- package/lib/store/class-color.util.d.ts +39 -2
- package/lib/store/class-signatures.d.ts +11 -0
- package/lib/store/region-history.d.ts +66 -0
- package/lib/store/region-scope-cache.d.ts +65 -0
- package/lib/store/region-selection.d.ts +36 -0
- package/lib/store/region-source-scope.d.ts +68 -0
- package/lib/store/region-store.service.d.ts +312 -116
- package/lib/store/visualizer-store.service.d.ts +32 -33
- package/lib/toast-outlets.d.ts +4 -3
- package/lib/toolbar/brush/brush-tool.service.d.ts +31 -98
- package/lib/toolbar/canvas-tools.d.ts +20 -0
- package/lib/toolbar/crop/slide-crop.d.ts +10 -4
- package/lib/toolbar/plot-type-selector/plot-type-selector.component.d.ts +38 -0
- package/lib/toolbar/region-tools/region-tool-buttons.d.ts +21 -0
- package/lib/toolbar/region-tools/region-tools.component.d.ts +62 -0
- package/lib/toolbar/segmentation/cell-segment-tool.service.d.ts +10 -14
- package/lib/toolbar/segmentation/cellpose-segmenter.service.d.ts +12 -2
- package/lib/toolbar/segmentation/onnx-sam-session.d.ts +22 -3
- package/lib/toolbar/segmentation/pending-calls.d.ts +31 -0
- package/lib/toolbar/segmentation/sam-model-registry.d.ts +9 -3
- package/lib/toolbar/segmentation/sam-onnx-core.d.ts +18 -5
- package/lib/toolbar/segmentation/sam-point-tool.service.d.ts +46 -32
- package/lib/toolbar/segmentation/sam-prompt.d.ts +7 -31
- package/lib/toolbar/segmentation/sam-session.service.d.ts +74 -0
- package/lib/toolbar/segmentation/sam-tool.service.d.ts +23 -30
- package/lib/toolbar/segmentation/segmentation-commit.d.ts +8 -0
- package/lib/toolbar/segmentation/segmentation-runner.d.ts +52 -0
- package/lib/toolbar/segmentation-tools/segmentation-tools.component.d.ts +87 -0
- package/lib/toolbar/stack-controls/stack-controls.component.d.ts +51 -0
- package/lib/toolbar/tool-kit/async-tool-status.d.ts +21 -0
- package/lib/toolbar/tool-kit/canvas-tool-manager.d.ts +36 -0
- package/lib/toolbar/tool-kit/canvas-tool.d.ts +86 -0
- package/lib/toolbar/tool-kit/frame-pixels.d.ts +45 -0
- package/lib/toolbar/tool-kit/mask-stroke-editor.d.ts +125 -0
- package/lib/toolbar/tool-kit/matrix-frame.d.ts +40 -0
- package/lib/toolbar/tool-kit/tool-overlay.d.ts +60 -0
- package/lib/toolbar/tool-kit/undo-gesture.d.ts +17 -0
- package/lib/toolbar/tool-slider/tool-slider.component.d.ts +33 -0
- package/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.d.ts +24 -0
- package/lib/toolbar/toolbar.component.d.ts +55 -84
- package/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.d.ts +33 -40
- package/lib/toolbar/view-controls/view-controls.component.d.ts +54 -0
- package/lib/toolbar/wand/wand-region-grow.d.ts +49 -0
- package/lib/toolbar/wand/wand-tool.service.d.ts +39 -124
- package/lib/toolbar/wand/wand.service.d.ts +22 -116
- package/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.d.ts +17 -37
- package/lib/util/mark-for-check.d.ts +11 -0
- package/lib/util/supersede.d.ts +53 -0
- package/lib/visualization.module.d.ts +18 -39
- package/lib/visualizer/floating-drag.directive.d.ts +30 -0
- package/lib/visualizer/region-actions.d.ts +54 -0
- package/lib/visualizer/region-load.d.ts +46 -0
- package/lib/visualizer/spatial-dataset-binder.d.ts +74 -0
- package/lib/visualizer/tool-modes.d.ts +49 -0
- package/lib/visualizer/viewer-shortcuts.d.ts +71 -0
- package/lib/visualizer/visualizer-context-menu.d.ts +55 -0
- package/lib/visualizer/volume-sections.d.ts +64 -0
- package/lib/visualizer.component.d.ts +232 -447
- package/lib/workers/spatial-math-ops.d.ts +65 -0
- package/lib/workers/spatial-math-worker.d.ts +7 -0
- package/lib/workers/spatial-math.d.ts +74 -0
- package/package.json +12 -3
- package/src/lib/assets/slice.svg +23 -0
- package/src/lib/styles/_viz-icons-rules.scss +73 -0
- package/src/lib/styles/viz-icons.scss +14 -0
- package/esm2022/lib/implementations/napari-js/napari-axes-labels.mjs +0 -97
- package/esm2022/lib/implementations/napari-js/napari-navigator.mjs +0 -195
- package/esm2022/lib/implementations/napari-js/napari-scale-bar.mjs +0 -92
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs +0 -329
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs.map +0 -1
- package/lib/implementations/napari-js/napari-axes-labels.d.ts +0 -49
- package/lib/implementations/napari-js/napari-navigator.d.ts +0 -72
- package/lib/implementations/napari-js/napari-scale-bar.d.ts +0 -35
- package/src/lib/assets/cell-detection.svg +0 -37
- package/src/lib/assets/click.svg +0 -1
- package/src/lib/assets/colormap-luts.json +0 -1
- package/src/lib/assets/edit-selection-white.svg +0 -47
- package/src/lib/assets/icons/colormap-earth.png +0 -0
- package/src/lib/assets/icons/colormap-placeholder.png +0 -0
- package/src/lib/assets/icons/colormap-pubu.png +0 -0
- package/src/lib/assets/interactive-segmentation-cursor.svg +0 -1
- package/src/lib/assets/picture-segmentation.svg +0 -43
- package/src/lib/assets/test/download-379.svg +0 -1
- package/src/lib/assets/test/download-98.svg +0 -1
- package/src/lib/assets/test/json-1.svg +0 -1
- package/src/lib/assets/test/load-53.svg +0 -1
- package/src/lib/assets/test/mask-44.svg +0 -1
- package/src/lib/assets/test/mask-download-44.svg +0 -15
- package/src/lib/assets/test/mask-save-44.svg +0 -11
- package/src/lib/assets/test/overlay-1.svg +0 -1
- package/src/lib/assets/test/overlay-4.svg +0 -1
- package/src/lib/assets/test/region-26.svg +0 -1
- package/src/lib/assets/test/save-56.svg +0 -1
- package/src/lib/assets/test/upload-43.svg +0 -1
|
@@ -0,0 +1,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,83 @@
|
|
|
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
|
+
/** Spacing between z slices in µm (0 or absent when the format doesn't report it): what
|
|
42
|
+
* lets a z-stack be drawn as a volume to scale. */
|
|
43
|
+
mppZ?: number;
|
|
44
|
+
}
|
|
45
|
+
/** Tile coordinates for one `/tile` request. `channel == null` (or omitted)
|
|
46
|
+
* requests the server-composited tile; an index (including 0) requests that
|
|
47
|
+
* single channel as grayscale. */
|
|
48
|
+
export interface TileCoords {
|
|
49
|
+
res: number;
|
|
50
|
+
col: number;
|
|
51
|
+
row: number;
|
|
52
|
+
z: number;
|
|
53
|
+
tileSize: number;
|
|
54
|
+
channel?: number | null;
|
|
55
|
+
}
|
|
56
|
+
/** The `/tiles/info` descriptor URL for one source. */
|
|
57
|
+
export declare function tilesInfoUrl(api: string, infoB64: string): string;
|
|
58
|
+
/** Build the `/tile` request URL — the one place its query shape lives (the
|
|
59
|
+
* server caches on the exact parameter order). */
|
|
60
|
+
export declare function buildTileUrl(api: string, infoB64: string, c: TileCoords): string;
|
|
61
|
+
/**
|
|
62
|
+
* Per-app-load cache-buster for `/histogram`. The server marks the response
|
|
63
|
+
* cacheable for 24 h, and a hard refresh can't bust a post-load XHR. A token
|
|
64
|
+
* stable within a session (so the backends' in-session caches still dedupe) but
|
|
65
|
+
* new on each full load always reflects the live backend after a reload.
|
|
66
|
+
*/
|
|
67
|
+
export declare const HISTOGRAM_CACHE_BUSTER: number;
|
|
68
|
+
/** Where one channel's native-bit-depth histogram is read. */
|
|
69
|
+
export interface NativeHistogramRequest {
|
|
70
|
+
z: number;
|
|
71
|
+
channel: number;
|
|
72
|
+
bins: number;
|
|
73
|
+
}
|
|
74
|
+
/** The `/histogram` URL, with the cache-buster (see {@link HISTOGRAM_CACHE_BUSTER}). */
|
|
75
|
+
export declare function nativeHistogramUrl(api: string, infoB64: string, r: NativeHistogramRequest, cacheBuster?: number): string;
|
|
76
|
+
/**
|
|
77
|
+
* The `/export/tiff` URL for slice `z`. `visible` are the channel indices to
|
|
78
|
+
* export; the `channels` param is omitted when every one of the `channelCount`
|
|
79
|
+
* channels is visible (or none is), which is the server default (all).
|
|
80
|
+
*/
|
|
81
|
+
export declare function exportTiffUrl(api: string, infoB64: string, z: number, visible: readonly number[], channelCount: number): string;
|
|
82
|
+
/** The saved name of a native-bit-depth TIFF export of `fileName`. */
|
|
83
|
+
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
|
+
};
|