@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.
Files changed (525) hide show
  1. package/README.md +201 -460
  2. package/esm2022/index.mjs +28 -15
  3. package/esm2022/lib/channel-histogram/channel-histogram.component.mjs +163 -91
  4. package/esm2022/lib/contracts/capabilities.contract.mjs +4 -3
  5. package/esm2022/lib/contracts/cell-segmenter.contract.mjs +1 -1
  6. package/esm2022/lib/contracts/channel-histogram-api.contract.mjs +5 -1
  7. package/esm2022/lib/contracts/color.mjs +60 -0
  8. package/esm2022/lib/contracts/colormap-lut.mjs +213 -57
  9. package/esm2022/lib/contracts/coordinate-transform.contract.mjs +1 -1
  10. package/esm2022/lib/contracts/display-types.mjs +11 -1
  11. package/esm2022/lib/contracts/instance-segmenter.contract.mjs +1 -1
  12. package/esm2022/lib/contracts/intensity.mjs +48 -5
  13. package/esm2022/lib/contracts/plot-type-contribution.contract.mjs +1 -1
  14. package/esm2022/lib/contracts/plot-type.mjs +134 -17
  15. package/esm2022/lib/contracts/ports/image-state.port.mjs +4 -1
  16. package/esm2022/lib/contracts/ports/preferences.port.mjs +5 -1
  17. package/esm2022/lib/contracts/ports/region-io.port.mjs +2 -1
  18. package/esm2022/lib/contracts/ports/spatial-data.port.mjs +5 -1
  19. package/esm2022/lib/contracts/ports/tile-access.port.mjs +2 -1
  20. package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
  21. package/esm2022/lib/contracts/region-overlay.contract.mjs +1 -1
  22. package/esm2022/lib/contracts/sam.contract.mjs +1 -1
  23. package/esm2022/lib/contracts/semantic-segmenter.contract.mjs +1 -1
  24. package/esm2022/lib/contracts/spatial-dataset.contract.mjs +3 -1
  25. package/esm2022/lib/contracts/toolbar-tool.contract.mjs +6 -4
  26. package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
  27. package/esm2022/lib/contracts/viz-config.mjs +2 -1
  28. package/esm2022/lib/geometry/contour.mjs +63 -0
  29. package/esm2022/lib/geometry/raster.mjs +98 -0
  30. package/esm2022/lib/geometry/ring.mjs +201 -0
  31. package/esm2022/lib/hex-color-picker/hex-color-picker.component.mjs +202 -102
  32. package/esm2022/lib/implementations/base-store-visualizer.mjs +201 -48
  33. package/esm2022/lib/implementations/napari-js/napari-axes-gizmo.mjs +65 -0
  34. package/esm2022/lib/implementations/napari-js/napari-display-state.mjs +136 -0
  35. package/esm2022/lib/implementations/napari-js/napari-helpers.mjs +199 -0
  36. package/esm2022/lib/implementations/napari-js/napari-image-2d-scene.mjs +602 -0
  37. package/esm2022/lib/implementations/napari-js/napari-loading-badge.mjs +3 -4
  38. package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +66 -0
  39. package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +157 -591
  40. package/esm2022/lib/implementations/napari-js/napari-scene.mjs +2 -0
  41. package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +614 -0
  42. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +769 -0
  43. package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +199 -0
  44. package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +263 -0
  45. package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +159 -0
  46. package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +106 -1408
  47. package/esm2022/lib/implementations/napari-js/napari-spatial-tooltip.mjs +2 -2
  48. package/esm2022/lib/implementations/napari-js/napari-surface-scene.mjs +271 -0
  49. package/esm2022/lib/implementations/napari-js/napari-tile-client.mjs +562 -0
  50. package/esm2022/lib/implementations/napari-js/napari-tool-bridge.mjs +344 -0
  51. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +358 -4218
  52. package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +439 -0
  53. package/esm2022/lib/implementations/napari-js/napari-volume-z-handle.mjs +6 -6
  54. package/esm2022/lib/implementations/napari-js/region-overlay/overlay-projection.mjs +96 -0
  55. package/esm2022/lib/implementations/napari-js/region-overlay/region-edit.mjs +35 -0
  56. package/esm2022/lib/implementations/napari-js/region-overlay/region-svg-renderer.mjs +182 -0
  57. package/esm2022/lib/implementations/napari-js/spatial-tiles/categorical-lookup.mjs +30 -0
  58. package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +274 -0
  59. package/esm2022/lib/implementations/napari-js/spatial-tiles/density-layer.mjs +144 -0
  60. package/esm2022/lib/implementations/napari-js/spatial-tiles/layer-groups.mjs +165 -0
  61. package/esm2022/lib/implementations/napari-js/spatial-tiles/plan-context.mjs +78 -0
  62. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-hover.mjs +182 -0
  63. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-jobs.mjs +369 -0
  64. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +306 -0
  65. package/esm2022/lib/implementations/osd/display-pipeline.mjs +102 -40
  66. package/esm2022/lib/implementations/osd/histogram-sampler.mjs +56 -31
  67. package/esm2022/lib/implementations/osd/openseadragon-viewer-options.mjs +128 -0
  68. package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +333 -1685
  69. package/esm2022/lib/implementations/osd/osd-coordinate-transform.mjs +1 -1
  70. package/esm2022/lib/implementations/osd/osd-coords.mjs +5 -6
  71. package/esm2022/lib/implementations/osd/osd-export.mjs +122 -0
  72. package/esm2022/lib/implementations/osd/osd-lib.mjs +15 -1
  73. package/esm2022/lib/implementations/osd/osd-navigator-chrome.mjs +205 -0
  74. package/esm2022/lib/implementations/osd/osd-pixel-readback.mjs +68 -0
  75. package/esm2022/lib/implementations/osd/osd-region-overlay-draw.mjs +153 -0
  76. package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +185 -718
  77. package/esm2022/lib/implementations/osd/osd-scale-bar.mjs +52 -60
  78. package/esm2022/lib/implementations/osd/osd-tile-source.mjs +105 -0
  79. package/esm2022/lib/implementations/osd/osd-viewer-like.mjs +2 -0
  80. package/esm2022/lib/implementations/osd/osd-viewer-mount.mjs +44 -0
  81. package/esm2022/lib/implementations/osd/osd-viewport.mjs +184 -0
  82. package/esm2022/lib/implementations/osd/osd-zoom.mjs +7 -1
  83. package/esm2022/lib/implementations/osd/simple-source.mjs +395 -0
  84. package/esm2022/lib/implementations/osd/slice-cache.mjs +53 -48
  85. package/esm2022/lib/implementations/osd/tile-client.mjs +32 -11
  86. package/esm2022/lib/implementations/osd/tile-recolor.mjs +330 -0
  87. package/esm2022/lib/implementations/plotly/omics-trace-builders.mjs +161 -73
  88. package/esm2022/lib/implementations/plotly/plotly-coordinate-transform.mjs +1 -1
  89. package/esm2022/lib/implementations/plotly/plotly-image-loader.mjs +112 -0
  90. package/esm2022/lib/implementations/plotly/plotly-image-recolor.mjs +178 -0
  91. package/esm2022/lib/implementations/plotly/plotly-intensity-inset.mjs +33 -0
  92. package/esm2022/lib/implementations/plotly/plotly-isosurface-controls.mjs +83 -0
  93. package/esm2022/lib/implementations/plotly/plotly-layouts.mjs +121 -0
  94. package/esm2022/lib/implementations/plotly/plotly-readback.mjs +117 -0
  95. package/esm2022/lib/implementations/plotly/plotly-region-overlay.mjs +19 -10
  96. package/esm2022/lib/implementations/plotly/plotly-shape-projection.mjs +223 -0
  97. package/esm2022/lib/implementations/plotly/plotly-trace-builders.mjs +79 -19
  98. package/esm2022/lib/implementations/plotly/plotly-zoom-controller.mjs +223 -0
  99. package/esm2022/lib/implementations/plotly/plotly.service.mjs +439 -1655
  100. package/esm2022/lib/implementations/region-centroids.mjs +47 -0
  101. package/esm2022/lib/implementations/simple-slice-access.service.mjs +22 -12
  102. package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +172 -92
  103. package/esm2022/lib/implementations/spatial-data-http/spatial-wire.mjs +103 -22
  104. package/esm2022/lib/implementations/tile-server/index.mjs +6 -0
  105. package/esm2022/lib/implementations/tile-server/native-histogram.mjs +30 -0
  106. package/esm2022/lib/implementations/tile-server/poll-descriptor.mjs +65 -0
  107. package/esm2022/lib/implementations/tile-server/tile-protocol.mjs +42 -0
  108. package/esm2022/lib/implementations/tile-server/transport.mjs +135 -0
  109. package/esm2022/lib/intensity/intensity-profile.mjs +107 -0
  110. package/esm2022/lib/intensity/intensity-profile.service.mjs +223 -0
  111. package/esm2022/lib/intensity-inset/intensity-inset.component.mjs +133 -0
  112. package/esm2022/lib/models/bezier.mjs +1 -11
  113. package/esm2022/lib/models/class-preset.mjs +41 -3
  114. package/esm2022/lib/models/geometry.mjs +27 -164
  115. package/esm2022/lib/models/polygon-edit.mjs +254 -0
  116. package/esm2022/lib/models/polygon-factory.mjs +118 -0
  117. package/esm2022/lib/models/region-clone.mjs +68 -0
  118. package/esm2022/lib/models/region-geojson.mjs +373 -0
  119. package/esm2022/lib/models/region.mjs +34 -33
  120. package/esm2022/lib/models/shape.mjs +18 -16
  121. package/esm2022/lib/plot-mode/contribution-host.mjs +297 -0
  122. package/esm2022/lib/plot-mode/plot-mode-controller.mjs +9 -6
  123. package/esm2022/lib/plot-mode/plot-type-menu.mjs +85 -0
  124. package/esm2022/lib/plot-mode/tool-params-model.mjs +87 -0
  125. package/esm2022/lib/plot.utilities.mjs +296 -473
  126. package/esm2022/lib/processing/image-crop.mjs +1 -1
  127. package/esm2022/lib/processing/processing-image.mjs +28 -15
  128. package/esm2022/lib/provide-visualization.mjs +40 -14
  129. package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +99 -0
  130. package/esm2022/lib/region-editor/file-stem.mjs +13 -0
  131. package/esm2022/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.mjs +118 -0
  132. package/esm2022/lib/region-editor/mask-export.service.mjs +98 -0
  133. package/esm2022/lib/region-editor/mask-raster.mjs +11 -5
  134. package/esm2022/lib/region-editor/region-color-dialog/region-color-dialog.component.mjs +56 -0
  135. package/esm2022/lib/region-editor/region-editor-help/region-editor-help.component.mjs +28 -0
  136. package/esm2022/lib/region-editor/region-editor.component.mjs +402 -651
  137. package/esm2022/lib/region-editor/region-metrics.mjs +68 -0
  138. package/esm2022/lib/region-editor/region-persistence.service.mjs +134 -0
  139. package/esm2022/lib/region-editor/region-table/region-table.component.mjs +153 -0
  140. package/esm2022/lib/region-editor/save-mask-dialog/save-mask-dialog.component.mjs +91 -0
  141. package/esm2022/lib/region-editor/save-regions-dialog/save-regions-dialog.component.mjs +92 -0
  142. package/esm2022/lib/region-ops.service.mjs +28 -70
  143. package/esm2022/lib/region-overlay/region-geometry.mjs +360 -0
  144. package/esm2022/lib/region-overlay/region-hit-test.mjs +103 -0
  145. package/esm2022/lib/region-overlay/svg-region-renderer.mjs +228 -0
  146. package/esm2022/lib/render-orchestrator.mjs +14 -11
  147. package/esm2022/lib/render-session.mjs +207 -0
  148. package/esm2022/lib/routing-visualizer.service.mjs +459 -411
  149. package/esm2022/lib/spatial/density-raster.mjs +14 -0
  150. package/esm2022/lib/spatial/embedding-compute-coordinator.mjs +239 -0
  151. package/esm2022/lib/spatial/embedding-compute.mjs +43 -10
  152. package/esm2022/lib/spatial/gene-search.mjs +1 -1
  153. package/esm2022/lib/spatial/glyphs.mjs +97 -0
  154. package/esm2022/lib/spatial/lod.mjs +187 -0
  155. package/esm2022/lib/spatial/spatial-controls.facade.mjs +200 -0
  156. package/esm2022/lib/spatial/spatial-density.mjs +25 -16
  157. package/esm2022/lib/spatial/spatial-encoding.mjs +26 -82
  158. package/esm2022/lib/spatial/spatial-expression.mjs +43 -42
  159. package/esm2022/lib/spatial/spatial-framing.mjs +1 -1
  160. package/esm2022/lib/spatial/spatial-heatmap.mjs +6 -3
  161. package/esm2022/lib/spatial/spatial-hover.mjs +5 -33
  162. package/esm2022/lib/spatial/spatial-panel-model.mjs +282 -0
  163. package/esm2022/lib/spatial/spatial-sections.mjs +1 -1
  164. package/esm2022/lib/spatial/spatial-selection.mjs +33 -46
  165. package/esm2022/lib/spatial/spatial-tile-merge.mjs +219 -0
  166. package/esm2022/lib/spatial/spatial-tiles.mjs +12 -648
  167. package/esm2022/lib/spatial/spatial-volume-image.mjs +2 -4
  168. package/esm2022/lib/spatial/stats.mjs +71 -0
  169. package/esm2022/lib/spatial/transcript-grouping.mjs +307 -0
  170. package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +150 -0
  171. package/esm2022/lib/spatial-controls/spatial-charts/chart-data-model.mjs +309 -0
  172. package/esm2022/lib/spatial-controls/spatial-charts/chart-help.mjs +145 -0
  173. package/esm2022/lib/spatial-controls/spatial-charts/plotly-chart-host.mjs +158 -0
  174. package/esm2022/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.mjs +47 -0
  175. package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +297 -802
  176. package/esm2022/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.mjs +89 -0
  177. package/esm2022/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.mjs +52 -0
  178. package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +143 -1238
  179. package/esm2022/lib/spatial-controls/spatial-gene-picker.mjs +153 -0
  180. package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +241 -0
  181. package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +193 -0
  182. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +132 -0
  183. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.model.mjs +67 -0
  184. package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +147 -0
  185. package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +300 -0
  186. package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +370 -0
  187. package/esm2022/lib/store/class-color.util.mjs +46 -3
  188. package/esm2022/lib/store/region-history.mjs +146 -0
  189. package/esm2022/lib/store/region-scope-cache.mjs +140 -0
  190. package/esm2022/lib/store/region-selection.mjs +82 -0
  191. package/esm2022/lib/store/region-store.service.mjs +279 -675
  192. package/esm2022/lib/store/spatial-selection.service.mjs +2 -2
  193. package/esm2022/lib/store/visualizer-store.service.mjs +49 -71
  194. package/esm2022/lib/toast-outlets.mjs +5 -4
  195. package/esm2022/lib/toolbar/brush/brush-tool.service.mjs +92 -434
  196. package/esm2022/lib/toolbar/canvas-tools.mjs +20 -0
  197. package/esm2022/lib/toolbar/crop/slide-crop.mjs +26 -42
  198. package/esm2022/lib/toolbar/plot-type-selector/plot-type-selector.component.mjs +85 -0
  199. package/esm2022/lib/toolbar/region-tools/region-tool-buttons.mjs +74 -0
  200. package/esm2022/lib/toolbar/region-tools/region-tools.component.mjs +114 -0
  201. package/esm2022/lib/toolbar/segmentation/cell-segment-tool.service.mjs +74 -78
  202. package/esm2022/lib/toolbar/segmentation/cellpose-segmenter.service.mjs +50 -8
  203. package/esm2022/lib/toolbar/segmentation/onnx-sam-session.mjs +61 -42
  204. package/esm2022/lib/toolbar/segmentation/pending-calls.mjs +47 -0
  205. package/esm2022/lib/toolbar/segmentation/sam-model-registry.mjs +12 -4
  206. package/esm2022/lib/toolbar/segmentation/sam-onnx-core.mjs +70 -14
  207. package/esm2022/lib/toolbar/segmentation/sam-point-tool.service.mjs +135 -172
  208. package/esm2022/lib/toolbar/segmentation/sam-prompt.mjs +9 -90
  209. package/esm2022/lib/toolbar/segmentation/sam-session.service.mjs +183 -0
  210. package/esm2022/lib/toolbar/segmentation/sam-tool.service.mjs +95 -150
  211. package/esm2022/lib/toolbar/segmentation/segmentation-commit.mjs +12 -0
  212. package/esm2022/lib/toolbar/segmentation/segmentation-runner.mjs +108 -0
  213. package/esm2022/lib/toolbar/segmentation-tools/segmentation-tools.component.mjs +155 -0
  214. package/esm2022/lib/toolbar/stack-controls/stack-controls.component.mjs +81 -0
  215. package/esm2022/lib/toolbar/tool-kit/async-tool-status.mjs +37 -0
  216. package/esm2022/lib/toolbar/tool-kit/canvas-tool-manager.mjs +63 -0
  217. package/esm2022/lib/toolbar/tool-kit/canvas-tool.mjs +2 -0
  218. package/esm2022/lib/toolbar/tool-kit/frame-pixels.mjs +108 -0
  219. package/esm2022/lib/toolbar/tool-kit/mask-stroke-editor.mjs +306 -0
  220. package/esm2022/lib/toolbar/tool-kit/matrix-frame.mjs +61 -0
  221. package/esm2022/lib/toolbar/tool-kit/tool-overlay.mjs +140 -0
  222. package/esm2022/lib/toolbar/tool-kit/undo-gesture.mjs +24 -0
  223. package/esm2022/lib/toolbar/tool-slider/tool-slider.component.mjs +63 -0
  224. package/esm2022/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.mjs +50 -0
  225. package/esm2022/lib/toolbar/toolbar.component.mjs +68 -117
  226. package/esm2022/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.mjs +93 -115
  227. package/esm2022/lib/toolbar/view-controls/view-controls.component.mjs +107 -0
  228. package/esm2022/lib/toolbar/wand/wand-region-grow.mjs +321 -0
  229. package/esm2022/lib/toolbar/wand/wand-tool.service.mjs +121 -416
  230. package/esm2022/lib/toolbar/wand/wand.service.mjs +30 -894
  231. package/esm2022/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.mjs +48 -90
  232. package/esm2022/lib/util/mark-for-check.mjs +17 -0
  233. package/esm2022/lib/util/supersede.mjs +56 -0
  234. package/esm2022/lib/visualization.module.mjs +39 -141
  235. package/esm2022/lib/visualizer/floating-drag.directive.mjs +58 -0
  236. package/esm2022/lib/visualizer/region-actions.mjs +149 -0
  237. package/esm2022/lib/visualizer/region-load.mjs +60 -0
  238. package/esm2022/lib/visualizer/spatial-dataset-binder.mjs +163 -0
  239. package/esm2022/lib/visualizer/tool-modes.mjs +113 -0
  240. package/esm2022/lib/visualizer/viewer-shortcuts.mjs +167 -0
  241. package/esm2022/lib/visualizer/visualizer-context-menu.mjs +119 -0
  242. package/esm2022/lib/visualizer.component.mjs +480 -1902
  243. package/esm2022/lib/workers/spatial-math-ops.mjs +43 -0
  244. package/esm2022/lib/workers/spatial-math-worker.mjs +10 -0
  245. package/esm2022/lib/workers/spatial-math.mjs +190 -0
  246. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs +41083 -0
  247. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs.map +1 -0
  248. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs +238 -0
  249. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs.map +1 -0
  250. package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs +12 -0
  251. package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs.map +1 -0
  252. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +41 -34467
  253. package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
  254. package/fesm2022/mask.worker.js +36 -917
  255. package/fesm2022/onnx-sam.worker.js +52 -16
  256. package/fesm2022/spatial-math.worker.js +471 -0
  257. package/fesm2022/tsne.worker.js +32 -15
  258. package/index.d.ts +13 -10
  259. package/lib/channel-histogram/channel-histogram.component.d.ts +53 -43
  260. package/lib/contracts/capabilities.contract.d.ts +4 -2
  261. package/lib/contracts/cell-segmenter.contract.d.ts +1 -0
  262. package/lib/contracts/channel-histogram-api.contract.d.ts +4 -0
  263. package/lib/contracts/color.d.ts +27 -0
  264. package/lib/contracts/colormap-lut.d.ts +19 -4
  265. package/lib/contracts/coordinate-transform.contract.d.ts +3 -3
  266. package/lib/contracts/display-types.d.ts +21 -0
  267. package/lib/contracts/instance-segmenter.contract.d.ts +5 -0
  268. package/lib/contracts/intensity.d.ts +13 -2
  269. package/lib/contracts/plot-type.d.ts +3 -1
  270. package/lib/contracts/ports/image-state.port.d.ts +6 -2
  271. package/lib/contracts/ports/preferences.port.d.ts +4 -0
  272. package/lib/contracts/ports/region-io.port.d.ts +1 -0
  273. package/lib/contracts/ports/spatial-data.port.d.ts +4 -10
  274. package/lib/contracts/ports/tile-access.port.d.ts +1 -0
  275. package/lib/contracts/region-editor-api.contract.d.ts +1 -1
  276. package/lib/contracts/region-overlay.contract.d.ts +5 -0
  277. package/lib/contracts/sam.contract.d.ts +7 -0
  278. package/lib/contracts/semantic-segmenter.contract.d.ts +6 -0
  279. package/lib/contracts/spatial-dataset.contract.d.ts +19 -6
  280. package/lib/contracts/toolbar-tool.contract.d.ts +1 -0
  281. package/lib/contracts/visualizer.contract.d.ts +221 -54
  282. package/lib/contracts/viz-config.d.ts +1 -0
  283. package/lib/geometry/contour.d.ts +24 -0
  284. package/lib/geometry/raster.d.ts +42 -0
  285. package/lib/geometry/ring.d.ts +67 -0
  286. package/lib/hex-color-picker/hex-color-picker.component.d.ts +61 -27
  287. package/lib/implementations/base-store-visualizer.d.ts +61 -15
  288. package/lib/implementations/napari-js/napari-axes-gizmo.d.ts +36 -0
  289. package/lib/implementations/napari-js/napari-display-state.d.ts +76 -0
  290. package/lib/implementations/napari-js/napari-helpers.d.ts +129 -0
  291. package/lib/implementations/napari-js/napari-image-2d-scene.d.ts +162 -0
  292. package/lib/implementations/napari-js/napari-loading-badge.d.ts +0 -1
  293. package/lib/implementations/napari-js/napari-loading-state.d.ts +30 -0
  294. package/lib/implementations/napari-js/napari-region-overlay.d.ts +62 -70
  295. package/lib/implementations/napari-js/napari-scene.d.ts +93 -0
  296. package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +163 -0
  297. package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +212 -0
  298. package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +114 -0
  299. package/lib/implementations/napari-js/napari-spatial-hover.d.ts +89 -0
  300. package/lib/implementations/napari-js/napari-spatial-scene.d.ts +118 -0
  301. package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +56 -263
  302. package/lib/implementations/napari-js/napari-spatial-tooltip.d.ts +1 -1
  303. package/lib/implementations/napari-js/napari-surface-scene.d.ts +76 -0
  304. package/lib/implementations/napari-js/napari-tile-client.d.ts +214 -0
  305. package/lib/implementations/napari-js/napari-tool-bridge.d.ts +179 -0
  306. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +121 -883
  307. package/lib/implementations/napari-js/napari-volume-scene.d.ts +104 -0
  308. package/lib/implementations/napari-js/napari-volume-z-handle.d.ts +8 -12
  309. package/lib/implementations/napari-js/region-overlay/overlay-projection.d.ts +59 -0
  310. package/lib/implementations/napari-js/region-overlay/region-edit.d.ts +15 -0
  311. package/lib/implementations/napari-js/region-overlay/region-svg-renderer.d.ts +54 -0
  312. package/lib/implementations/napari-js/spatial-tiles/categorical-lookup.d.ts +26 -0
  313. package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +70 -0
  314. package/lib/implementations/napari-js/spatial-tiles/density-layer.d.ts +61 -0
  315. package/lib/implementations/napari-js/spatial-tiles/layer-groups.d.ts +67 -0
  316. package/lib/implementations/napari-js/spatial-tiles/plan-context.d.ts +38 -0
  317. package/lib/implementations/napari-js/spatial-tiles/transcript-hover.d.ts +71 -0
  318. package/lib/implementations/napari-js/spatial-tiles/transcript-jobs.d.ts +105 -0
  319. package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +56 -0
  320. package/lib/implementations/osd/display-pipeline.d.ts +38 -9
  321. package/lib/implementations/osd/histogram-sampler.d.ts +22 -12
  322. package/lib/implementations/osd/openseadragon-viewer-options.d.ts +35 -0
  323. package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +78 -354
  324. package/lib/implementations/osd/osd-coordinate-transform.d.ts +2 -1
  325. package/lib/implementations/osd/osd-coords.d.ts +6 -4
  326. package/lib/implementations/osd/osd-export.d.ts +36 -0
  327. package/lib/implementations/osd/osd-lib.d.ts +7 -0
  328. package/lib/implementations/osd/osd-navigator-chrome.d.ts +69 -0
  329. package/lib/implementations/osd/osd-pixel-readback.d.ts +22 -0
  330. package/lib/implementations/osd/osd-region-overlay-draw.d.ts +37 -0
  331. package/lib/implementations/osd/osd-region-overlay.d.ts +36 -48
  332. package/lib/implementations/osd/osd-scale-bar.d.ts +8 -6
  333. package/lib/implementations/osd/osd-tile-source.d.ts +49 -0
  334. package/lib/implementations/osd/osd-viewer-like.d.ts +100 -0
  335. package/lib/implementations/osd/osd-viewer-mount.d.ts +14 -0
  336. package/lib/implementations/osd/osd-viewport.d.ts +77 -0
  337. package/lib/implementations/osd/osd-zoom.d.ts +6 -0
  338. package/lib/implementations/osd/simple-source.d.ts +161 -0
  339. package/lib/implementations/osd/slice-cache.d.ts +12 -3
  340. package/lib/implementations/osd/tile-client.d.ts +11 -14
  341. package/lib/implementations/osd/tile-recolor.d.ts +141 -0
  342. package/lib/implementations/plotly/omics-trace-builders.d.ts +32 -20
  343. package/lib/implementations/plotly/plotly-image-loader.d.ts +49 -0
  344. package/lib/implementations/plotly/plotly-image-recolor.d.ts +75 -0
  345. package/lib/implementations/plotly/plotly-intensity-inset.d.ts +8 -0
  346. package/lib/implementations/plotly/plotly-isosurface-controls.d.ts +38 -0
  347. package/lib/implementations/plotly/plotly-layouts.d.ts +188 -0
  348. package/lib/implementations/plotly/plotly-readback.d.ts +41 -0
  349. package/lib/implementations/plotly/plotly-region-overlay.d.ts +2 -2
  350. package/lib/implementations/plotly/plotly-shape-projection.d.ts +92 -0
  351. package/lib/implementations/plotly/plotly-trace-builders.d.ts +23 -12
  352. package/lib/implementations/plotly/plotly-zoom-controller.d.ts +86 -0
  353. package/lib/implementations/plotly/plotly.service.d.ts +136 -401
  354. package/lib/implementations/region-centroids.d.ts +14 -0
  355. package/lib/implementations/simple-slice-access.service.d.ts +7 -4
  356. package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +42 -18
  357. package/lib/implementations/spatial-data-http/spatial-wire.d.ts +34 -9
  358. package/lib/implementations/tile-server/index.d.ts +5 -0
  359. package/lib/implementations/tile-server/native-histogram.d.ts +25 -0
  360. package/lib/implementations/tile-server/poll-descriptor.d.ts +39 -0
  361. package/lib/implementations/tile-server/tile-protocol.d.ts +80 -0
  362. package/lib/implementations/tile-server/transport.d.ts +62 -0
  363. package/lib/intensity/intensity-profile.d.ts +66 -0
  364. package/lib/intensity/intensity-profile.service.d.ts +108 -0
  365. package/lib/intensity-inset/intensity-inset.component.d.ts +58 -0
  366. package/lib/models/bezier.d.ts +0 -5
  367. package/lib/models/class-preset.d.ts +18 -0
  368. package/lib/models/geometry.d.ts +14 -48
  369. package/lib/models/polygon-edit.d.ts +72 -0
  370. package/lib/models/polygon-factory.d.ts +40 -0
  371. package/lib/models/region-clone.d.ts +20 -0
  372. package/lib/models/region-geojson.d.ts +17 -0
  373. package/lib/models/region.d.ts +40 -4
  374. package/lib/models/shape.d.ts +8 -0
  375. package/lib/plot-mode/contribution-host.d.ts +125 -0
  376. package/lib/plot-mode/plot-type-menu.d.ts +60 -0
  377. package/lib/plot-mode/tool-params-model.d.ts +49 -0
  378. package/lib/plot.utilities.d.ts +19 -30
  379. package/lib/processing/processing-image.d.ts +5 -2
  380. package/lib/provide-visualization.d.ts +19 -2
  381. package/lib/region-editor/classes-panel/classes-panel.component.d.ts +56 -0
  382. package/lib/region-editor/file-stem.d.ts +7 -0
  383. package/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.d.ts +45 -0
  384. package/lib/region-editor/mask-export.service.d.ts +54 -0
  385. package/lib/region-editor/mask-raster.d.ts +2 -8
  386. package/lib/region-editor/region-color-dialog/region-color-dialog.component.d.ts +29 -0
  387. package/lib/region-editor/region-editor-help/region-editor-help.component.d.ts +11 -0
  388. package/lib/region-editor/region-editor.component.d.ts +166 -199
  389. package/lib/region-editor/region-metrics.d.ts +26 -0
  390. package/lib/region-editor/region-persistence.service.d.ts +69 -0
  391. package/lib/region-editor/region-table/region-table.component.d.ts +83 -0
  392. package/lib/region-editor/save-mask-dialog/save-mask-dialog.component.d.ts +36 -0
  393. package/lib/region-editor/save-regions-dialog/save-regions-dialog.component.d.ts +37 -0
  394. package/lib/region-ops.service.d.ts +1 -7
  395. package/lib/region-overlay/region-geometry.d.ts +157 -0
  396. package/lib/region-overlay/region-hit-test.d.ts +38 -0
  397. package/lib/region-overlay/svg-region-renderer.d.ts +110 -0
  398. package/lib/render-orchestrator.d.ts +6 -2
  399. package/lib/render-session.d.ts +75 -0
  400. package/lib/routing-visualizer.service.d.ts +110 -58
  401. package/lib/spatial/density-raster.d.ts +6 -0
  402. package/lib/spatial/embedding-compute-coordinator.d.ts +123 -0
  403. package/lib/spatial/embedding-compute.d.ts +21 -2
  404. package/lib/spatial/glyphs.d.ts +16 -0
  405. package/lib/spatial/lod.d.ts +94 -0
  406. package/lib/spatial/spatial-controls.facade.d.ts +64 -0
  407. package/lib/spatial/spatial-density.d.ts +15 -5
  408. package/lib/spatial/spatial-encoding.d.ts +11 -44
  409. package/lib/spatial/spatial-expression.d.ts +40 -22
  410. package/lib/spatial/spatial-framing.d.ts +1 -0
  411. package/lib/spatial/spatial-heatmap.d.ts +2 -0
  412. package/lib/spatial/spatial-hover.d.ts +4 -16
  413. package/lib/spatial/spatial-panel-model.d.ts +135 -0
  414. package/lib/spatial/spatial-selection.d.ts +21 -26
  415. package/lib/spatial/spatial-tile-merge.d.ts +41 -0
  416. package/lib/spatial/spatial-tiles.d.ts +9 -256
  417. package/lib/spatial/stats.d.ts +38 -0
  418. package/lib/spatial/transcript-grouping.d.ts +119 -0
  419. package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +64 -0
  420. package/lib/spatial-controls/spatial-charts/chart-data-model.d.ts +153 -0
  421. package/lib/spatial-controls/spatial-charts/chart-help.d.ts +69 -0
  422. package/lib/spatial-controls/spatial-charts/plotly-chart-host.d.ts +98 -0
  423. package/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.d.ts +26 -0
  424. package/lib/spatial-controls/spatial-charts/spatial-charts.component.d.ts +101 -260
  425. package/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.d.ts +43 -0
  426. package/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.d.ts +27 -0
  427. package/lib/spatial-controls/spatial-controls.component.d.ts +68 -448
  428. package/lib/spatial-controls/spatial-gene-picker.d.ts +86 -0
  429. package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +102 -0
  430. package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +72 -0
  431. package/lib/spatial-controls/spatial-key/spatial-key.component.d.ts +66 -0
  432. package/lib/spatial-controls/spatial-key/spatial-key.model.d.ts +33 -0
  433. package/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.d.ts +64 -0
  434. package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +117 -0
  435. package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +142 -0
  436. package/lib/store/class-color.util.d.ts +35 -1
  437. package/lib/store/region-history.d.ts +66 -0
  438. package/lib/store/region-scope-cache.d.ts +63 -0
  439. package/lib/store/region-selection.d.ts +36 -0
  440. package/lib/store/region-store.service.d.ts +104 -112
  441. package/lib/store/visualizer-store.service.d.ts +22 -33
  442. package/lib/toast-outlets.d.ts +4 -3
  443. package/lib/toolbar/brush/brush-tool.service.d.ts +31 -98
  444. package/lib/toolbar/canvas-tools.d.ts +20 -0
  445. package/lib/toolbar/crop/slide-crop.d.ts +10 -4
  446. package/lib/toolbar/plot-type-selector/plot-type-selector.component.d.ts +38 -0
  447. package/lib/toolbar/region-tools/region-tool-buttons.d.ts +21 -0
  448. package/lib/toolbar/region-tools/region-tools.component.d.ts +60 -0
  449. package/lib/toolbar/segmentation/cell-segment-tool.service.d.ts +10 -14
  450. package/lib/toolbar/segmentation/cellpose-segmenter.service.d.ts +12 -2
  451. package/lib/toolbar/segmentation/onnx-sam-session.d.ts +22 -3
  452. package/lib/toolbar/segmentation/pending-calls.d.ts +31 -0
  453. package/lib/toolbar/segmentation/sam-model-registry.d.ts +9 -3
  454. package/lib/toolbar/segmentation/sam-onnx-core.d.ts +18 -5
  455. package/lib/toolbar/segmentation/sam-point-tool.service.d.ts +46 -32
  456. package/lib/toolbar/segmentation/sam-prompt.d.ts +7 -31
  457. package/lib/toolbar/segmentation/sam-session.service.d.ts +74 -0
  458. package/lib/toolbar/segmentation/sam-tool.service.d.ts +23 -30
  459. package/lib/toolbar/segmentation/segmentation-commit.d.ts +8 -0
  460. package/lib/toolbar/segmentation/segmentation-runner.d.ts +52 -0
  461. package/lib/toolbar/segmentation-tools/segmentation-tools.component.d.ts +87 -0
  462. package/lib/toolbar/stack-controls/stack-controls.component.d.ts +40 -0
  463. package/lib/toolbar/tool-kit/async-tool-status.d.ts +21 -0
  464. package/lib/toolbar/tool-kit/canvas-tool-manager.d.ts +36 -0
  465. package/lib/toolbar/tool-kit/canvas-tool.d.ts +86 -0
  466. package/lib/toolbar/tool-kit/frame-pixels.d.ts +45 -0
  467. package/lib/toolbar/tool-kit/mask-stroke-editor.d.ts +125 -0
  468. package/lib/toolbar/tool-kit/matrix-frame.d.ts +40 -0
  469. package/lib/toolbar/tool-kit/tool-overlay.d.ts +60 -0
  470. package/lib/toolbar/tool-kit/undo-gesture.d.ts +17 -0
  471. package/lib/toolbar/tool-slider/tool-slider.component.d.ts +33 -0
  472. package/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.d.ts +24 -0
  473. package/lib/toolbar/toolbar.component.d.ts +47 -83
  474. package/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.d.ts +33 -40
  475. package/lib/toolbar/view-controls/view-controls.component.d.ts +54 -0
  476. package/lib/toolbar/wand/wand-region-grow.d.ts +49 -0
  477. package/lib/toolbar/wand/wand-tool.service.d.ts +39 -124
  478. package/lib/toolbar/wand/wand.service.d.ts +22 -116
  479. package/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.d.ts +17 -37
  480. package/lib/util/mark-for-check.d.ts +11 -0
  481. package/lib/util/supersede.d.ts +53 -0
  482. package/lib/visualization.module.d.ts +18 -39
  483. package/lib/visualizer/floating-drag.directive.d.ts +30 -0
  484. package/lib/visualizer/region-actions.d.ts +54 -0
  485. package/lib/visualizer/region-load.d.ts +27 -0
  486. package/lib/visualizer/spatial-dataset-binder.d.ts +74 -0
  487. package/lib/visualizer/tool-modes.d.ts +49 -0
  488. package/lib/visualizer/viewer-shortcuts.d.ts +71 -0
  489. package/lib/visualizer/visualizer-context-menu.d.ts +55 -0
  490. package/lib/visualizer.component.d.ts +201 -447
  491. package/lib/workers/spatial-math-ops.d.ts +65 -0
  492. package/lib/workers/spatial-math-worker.d.ts +7 -0
  493. package/lib/workers/spatial-math.d.ts +74 -0
  494. package/package.json +12 -3
  495. package/src/lib/styles/_viz-icons-rules.scss +73 -0
  496. package/src/lib/styles/viz-icons.scss +14 -0
  497. package/esm2022/lib/implementations/napari-js/napari-axes-labels.mjs +0 -97
  498. package/esm2022/lib/implementations/napari-js/napari-navigator.mjs +0 -195
  499. package/esm2022/lib/implementations/napari-js/napari-scale-bar.mjs +0 -92
  500. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs +0 -329
  501. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs.map +0 -1
  502. package/lib/implementations/napari-js/napari-axes-labels.d.ts +0 -49
  503. package/lib/implementations/napari-js/napari-navigator.d.ts +0 -72
  504. package/lib/implementations/napari-js/napari-scale-bar.d.ts +0 -35
  505. package/src/lib/assets/cell-detection.svg +0 -37
  506. package/src/lib/assets/click.svg +0 -1
  507. package/src/lib/assets/colormap-luts.json +0 -1
  508. package/src/lib/assets/edit-selection-white.svg +0 -47
  509. package/src/lib/assets/icons/colormap-earth.png +0 -0
  510. package/src/lib/assets/icons/colormap-placeholder.png +0 -0
  511. package/src/lib/assets/icons/colormap-pubu.png +0 -0
  512. package/src/lib/assets/interactive-segmentation-cursor.svg +0 -1
  513. package/src/lib/assets/picture-segmentation.svg +0 -43
  514. package/src/lib/assets/test/download-379.svg +0 -1
  515. package/src/lib/assets/test/download-98.svg +0 -1
  516. package/src/lib/assets/test/json-1.svg +0 -1
  517. package/src/lib/assets/test/load-53.svg +0 -1
  518. package/src/lib/assets/test/mask-44.svg +0 -1
  519. package/src/lib/assets/test/mask-download-44.svg +0 -15
  520. package/src/lib/assets/test/mask-save-44.svg +0 -11
  521. package/src/lib/assets/test/overlay-1.svg +0 -1
  522. package/src/lib/assets/test/overlay-4.svg +0 -1
  523. package/src/lib/assets/test/region-26.svg +0 -1
  524. package/src/lib/assets/test/save-56.svg +0 -1
  525. 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 → already-fetched blob: URL, so a backend that opens a
28
- * URL (OSD) doesn't repeat the auth round-trip revisiting a slice (scrub
29
- * back, the small→large tier re-fetch). Shared across backends: switching
30
- * plot types on the same file (e.g. Image → Volume) reuses entries. */
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
- /** Bumped by every `selectDataset` and every `clear`, so a selection that
49
- * finishes after a newer intent can tell and drop what it fetched. */
50
- private selectToken;
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 (one vector
55
- * is `4·N` bytes — 2 MB at 500k cells).
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
- /** Point the adapter at a server. Clears any loaded dataset. */
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 ids/radius when
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 three tiled routes are optional and advertised in the manifest
46
- * (`polygonTiles`, `transcriptTiles`, `density`); a server without them never
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
- /** Reject a manifest this client cannot read, with a message naming the fix. */
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): SpatialTranscriptTile;
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,5 @@
1
+ /** Shared jit-service tile client (OSD-PLOTLY-15 / NAPARI-SVC-20). */
2
+ export * from './tile-protocol';
3
+ export * from './transport';
4
+ export * from './poll-descriptor';
5
+ export * from './native-histogram';
@@ -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
+ }