@fideus-labs/ngff-zarr 0.8.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm/browser-mod.d.ts +2 -2
- package/esm/browser-mod.d.ts.map +1 -1
- package/esm/browser-mod.js +2 -2
- package/esm/browser-mod.js.map +1 -1
- package/esm/mod.d.ts +1 -1
- package/esm/mod.d.ts.map +1 -1
- package/esm/mod.js +1 -1
- package/esm/mod.js.map +1 -1
- package/esm/utils/compute_omero-shared.d.ts +12 -0
- package/esm/utils/compute_omero-shared.d.ts.map +1 -1
- package/esm/utils/compute_omero-shared.js +28 -0
- package/esm/utils/compute_omero-shared.js.map +1 -1
- package/esm/utils/compute_omero.d.ts +10 -38
- package/esm/utils/compute_omero.d.ts.map +1 -1
- package/esm/utils/compute_omero.js +332 -79
- package/esm/utils/compute_omero.js.map +1 -1
- package/esm/utils/omero_worker_rpc.d.ts +37 -0
- package/esm/utils/omero_worker_rpc.d.ts.map +1 -0
- package/esm/utils/omero_worker_rpc.js +156 -0
- package/esm/utils/omero_worker_rpc.js.map +1 -0
- package/esm/workers/omero_codec_worker.d.ts +2 -0
- package/esm/workers/omero_codec_worker.d.ts.map +1 -0
- package/esm/workers/omero_codec_worker.js +215 -0
- package/esm/workers/omero_codec_worker.js.map +1 -0
- package/package.json +2 -3
- package/esm/utils/compute_omero-browser.d.ts +0 -45
- package/esm/utils/compute_omero-browser.d.ts.map +0 -1
- package/esm/utils/compute_omero-browser.js +0 -250
- package/esm/utils/compute_omero-browser.js.map +0 -1
- package/esm/workers/compute_omero_worker.d.ts +0 -47
- package/esm/workers/compute_omero_worker.d.ts.map +0 -1
- package/esm/workers/compute_omero_worker.js +0 -113
- package/esm/workers/compute_omero_worker.js.map +0 -1
|
@@ -1,117 +1,370 @@
|
|
|
1
1
|
// SPDX-FileCopyrightText: Copyright (c) Fideus Labs LLC
|
|
2
2
|
// SPDX-License-Identifier: MIT
|
|
3
|
-
|
|
3
|
+
/**
|
|
4
|
+
* Unified OMERO metadata computation using @fideus-labs/worker-pool.
|
|
5
|
+
*
|
|
6
|
+
* Works in Node.js, Deno, and browser environments. Each zarr chunk is
|
|
7
|
+
* decoded and its per-channel statistics computed in parallel via a
|
|
8
|
+
* WorkerPool. Decoded chunks are cached so that a subsequent zarrGet()
|
|
9
|
+
* with the same cache avoids redundant decompression.
|
|
10
|
+
*/
|
|
11
|
+
import { WorkerPool } from "@fideus-labs/worker-pool";
|
|
12
|
+
import { createCacheKey, readArrayMetadata } from "@fideus-labs/fizarrita";
|
|
13
|
+
import { buildOmeroFromAccumulators, createAccumulator, extractChannel, mergeAccumulators, updateAccumulator, validateColor, validateQuantiles, } from "./compute_omero-shared.js";
|
|
14
|
+
import { getMetaId, workerDecodeAndStats } from "./omero_worker_rpc.js";
|
|
4
15
|
// Re-export shared utilities for backward compatibility
|
|
5
16
|
export { computeChannelStatistics, extractChannel, getDefaultColors, GLASBEY_COLORS, QUANTILE_SAMPLE_SIZE, validateColor, validateQuantiles, } from "./compute_omero-shared.js";
|
|
6
|
-
//
|
|
7
|
-
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
// Worker pool for omero computation
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
/** Pool size for the omero worker pool. */
|
|
21
|
+
const POOL_SIZE = Math.min(typeof navigator !== "undefined" ? (navigator?.hardwareConcurrency || 4) : 4, 128);
|
|
22
|
+
/** Blob URL used by inlined browser builds — set by inline_worker.ts. */
|
|
23
|
+
let workerBlobUrl = null;
|
|
24
|
+
let _omeroPool = null;
|
|
25
|
+
function getOmeroPool() {
|
|
26
|
+
if (!_omeroPool) {
|
|
27
|
+
_omeroPool = new WorkerPool(POOL_SIZE);
|
|
28
|
+
}
|
|
29
|
+
return _omeroPool;
|
|
30
|
+
}
|
|
31
|
+
/** Create a new omero codec worker instance. */
|
|
32
|
+
function createOmeroWorker() {
|
|
33
|
+
return new Worker(new URL("../workers/omero_codec_worker.js", import.meta.url), { type: "module" });
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Terminate the omero computation worker pool and release resources.
|
|
37
|
+
* Call this when you're done with OMERO computations to free memory.
|
|
38
|
+
*/
|
|
39
|
+
export function terminateOmeroWorkerPool() {
|
|
40
|
+
if (_omeroPool) {
|
|
41
|
+
_omeroPool.terminateWorkers();
|
|
42
|
+
_omeroPool = null;
|
|
43
|
+
}
|
|
44
|
+
if (workerBlobUrl) {
|
|
45
|
+
URL.revokeObjectURL(workerBlobUrl);
|
|
46
|
+
workerBlobUrl = null;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// ---------------------------------------------------------------------------
|
|
50
|
+
// Chunk coordinate enumeration
|
|
51
|
+
// ---------------------------------------------------------------------------
|
|
52
|
+
/**
|
|
53
|
+
* Enumerate all chunk coordinates for a given array shape and chunk shape.
|
|
54
|
+
* Returns an array of coordinate tuples.
|
|
55
|
+
*/
|
|
56
|
+
function enumerateChunkCoords(shape, chunkShape) {
|
|
57
|
+
const gridDims = shape.map((s, i) => Math.ceil(s / chunkShape[i]));
|
|
58
|
+
const coords = [];
|
|
59
|
+
const ndim = gridDims.length;
|
|
60
|
+
// Recursive enumeration of all grid coordinates
|
|
61
|
+
function enumerate(dim, current) {
|
|
62
|
+
if (dim === ndim) {
|
|
63
|
+
coords.push([...current]);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
for (let i = 0; i < gridDims[dim]; i++) {
|
|
67
|
+
current[dim] = i;
|
|
68
|
+
enumerate(dim + 1, current);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
enumerate(0, new Array(ndim).fill(0));
|
|
72
|
+
return coords;
|
|
73
|
+
}
|
|
74
|
+
// ---------------------------------------------------------------------------
|
|
75
|
+
// Shared TextDecoder for metadata reading
|
|
76
|
+
// ---------------------------------------------------------------------------
|
|
77
|
+
const _textDecoder = new TextDecoder();
|
|
78
|
+
// ---------------------------------------------------------------------------
|
|
79
|
+
// Codec detection — skip workers for unsupported codecs
|
|
80
|
+
// ---------------------------------------------------------------------------
|
|
81
|
+
const UNSUPPORTED_CODEC_NAMES = new Set(["sharding_indexed"]);
|
|
82
|
+
// deno-lint-ignore no-explicit-any
|
|
83
|
+
const _codecCheckCache = new WeakMap();
|
|
84
|
+
async function hasUnsupportedCodecs(arr) {
|
|
85
|
+
let pathMap = _codecCheckCache.get(arr.store);
|
|
86
|
+
if (pathMap?.has(arr.path)) {
|
|
87
|
+
return pathMap.get(arr.path);
|
|
88
|
+
}
|
|
89
|
+
const zarrJsonPath = (arr.path === "/" ? "/zarr.json" : `${arr.path}/zarr.json`);
|
|
90
|
+
const bytes = await arr.store.get(zarrJsonPath);
|
|
91
|
+
let result = false;
|
|
92
|
+
if (bytes) {
|
|
93
|
+
try {
|
|
94
|
+
const meta = JSON.parse(_textDecoder.decode(bytes));
|
|
95
|
+
const codecs = meta.codecs ?? [];
|
|
96
|
+
result = codecs.some((c) => UNSUPPORTED_CODEC_NAMES.has(c.name));
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
result = false;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (!pathMap) {
|
|
103
|
+
pathMap = new Map();
|
|
104
|
+
_codecCheckCache.set(arr.store, pathMap);
|
|
105
|
+
}
|
|
106
|
+
pathMap.set(arr.path, result);
|
|
107
|
+
return result;
|
|
108
|
+
}
|
|
109
|
+
// ---------------------------------------------------------------------------
|
|
110
|
+
// Chunk key encoding (local fallback for when fizarrita metadata isn't usable)
|
|
111
|
+
// ---------------------------------------------------------------------------
|
|
112
|
+
function createChunkKeyEncoder(metadata, isV2) {
|
|
113
|
+
if (isV2) {
|
|
114
|
+
const separator = metadata.dimension_separator ?? ".";
|
|
115
|
+
return (chunk_coords) => chunk_coords.join(separator) || "0";
|
|
116
|
+
}
|
|
117
|
+
const encoding = metadata.chunk_key_encoding ?? { name: "default" };
|
|
118
|
+
if (encoding.name === "default") {
|
|
119
|
+
const separator = encoding.configuration?.separator ?? "/";
|
|
120
|
+
return (chunk_coords) => ["c", ...chunk_coords].join(separator);
|
|
121
|
+
}
|
|
122
|
+
if (encoding.name === "v2") {
|
|
123
|
+
const separator = encoding.configuration?.separator ?? ".";
|
|
124
|
+
return (chunk_coords) => chunk_coords.join(separator) || "0";
|
|
125
|
+
}
|
|
126
|
+
throw new Error(`Unknown chunk key encoding: ${encoding.name}`);
|
|
127
|
+
}
|
|
128
|
+
async function readLocalArrayMetadata(arr) {
|
|
129
|
+
const store = arr.store;
|
|
130
|
+
// Try v3 first: read zarr.json
|
|
131
|
+
const v3Path = (arr.path === "/" ? "/zarr.json" : `${arr.path}/zarr.json`);
|
|
132
|
+
const v3Bytes = await store.get(v3Path);
|
|
133
|
+
if (v3Bytes) {
|
|
134
|
+
const metadata = JSON.parse(_textDecoder.decode(v3Bytes));
|
|
135
|
+
return {
|
|
136
|
+
codecMeta: {
|
|
137
|
+
data_type: metadata.data_type,
|
|
138
|
+
chunk_shape: metadata.chunk_grid.configuration.chunk_shape,
|
|
139
|
+
codecs: metadata.codecs,
|
|
140
|
+
},
|
|
141
|
+
encodeChunkKey: createChunkKeyEncoder(metadata, false),
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
// Try v2: read .zarray
|
|
145
|
+
const v2Path = (arr.path === "/" ? "/.zarray" : `${arr.path}/.zarray`);
|
|
146
|
+
const v2Bytes = await store.get(v2Path);
|
|
147
|
+
if (v2Bytes) {
|
|
148
|
+
const metadata = JSON.parse(_textDecoder.decode(v2Bytes));
|
|
149
|
+
const codecs = [];
|
|
150
|
+
if (metadata.order === "F") {
|
|
151
|
+
codecs.push({ name: "transpose", configuration: { order: "F" } });
|
|
152
|
+
}
|
|
153
|
+
if (metadata.compressor) {
|
|
154
|
+
const { id, ...configuration } = metadata.compressor;
|
|
155
|
+
codecs.push({ name: id, configuration });
|
|
156
|
+
}
|
|
157
|
+
for (const { id, ...configuration } of metadata.filters ?? []) {
|
|
158
|
+
codecs.push({ name: id, configuration });
|
|
159
|
+
}
|
|
160
|
+
return {
|
|
161
|
+
codecMeta: {
|
|
162
|
+
data_type: arr.dtype,
|
|
163
|
+
chunk_shape: arr.chunks,
|
|
164
|
+
codecs: codecs.length > 0
|
|
165
|
+
? codecs
|
|
166
|
+
: [{ name: "bytes", configuration: { endian: "little" } }],
|
|
167
|
+
},
|
|
168
|
+
encodeChunkKey: createChunkKeyEncoder(metadata, true),
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
// Fallback
|
|
172
|
+
return {
|
|
173
|
+
codecMeta: {
|
|
174
|
+
data_type: arr.dtype,
|
|
175
|
+
chunk_shape: arr.chunks,
|
|
176
|
+
codecs: [{ name: "bytes", configuration: { endian: "little" } }],
|
|
177
|
+
},
|
|
178
|
+
encodeChunkKey: createChunkKeyEncoder({
|
|
179
|
+
chunk_key_encoding: { name: "default" },
|
|
180
|
+
}, false),
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
// ---------------------------------------------------------------------------
|
|
184
|
+
// Main-thread fallback for stats computation from a cached/decoded chunk
|
|
185
|
+
// ---------------------------------------------------------------------------
|
|
186
|
+
function computeStatsFromDecodedChunk(chunkData, chunkShape, nChannels, cIndex) {
|
|
187
|
+
const accumulators = [];
|
|
188
|
+
if (cIndex >= 0) {
|
|
189
|
+
for (let ch = 0; ch < nChannels; ch++) {
|
|
190
|
+
const channelData = extractChannel(chunkData, chunkShape, ch, cIndex);
|
|
191
|
+
const acc = createAccumulator();
|
|
192
|
+
updateAccumulator(acc, channelData);
|
|
193
|
+
accumulators.push(acc);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
const acc = createAccumulator();
|
|
198
|
+
updateAccumulator(acc, chunkData);
|
|
199
|
+
accumulators.push(acc);
|
|
200
|
+
}
|
|
201
|
+
return accumulators;
|
|
202
|
+
}
|
|
203
|
+
// ---------------------------------------------------------------------------
|
|
204
|
+
// Main-thread fallback for full computation (unsupported codecs)
|
|
205
|
+
// ---------------------------------------------------------------------------
|
|
206
|
+
async function computeOmeroMainThread(image, options = {}) {
|
|
207
|
+
// Lazy import to avoid circular dependency
|
|
208
|
+
const { zarrGet } = await import("./worker_pool.js");
|
|
209
|
+
const quantiles = options.quantiles ?? [0.02, 0.98];
|
|
210
|
+
validateQuantiles(quantiles);
|
|
211
|
+
const dims = image.dims;
|
|
212
|
+
const shape = image.data.shape;
|
|
213
|
+
const cIndex = dims.indexOf("c");
|
|
214
|
+
const hasChannelDim = cIndex !== -1;
|
|
215
|
+
const nChannels = hasChannelDim ? shape[cIndex] : 1;
|
|
216
|
+
const result = await zarrGet(image.data);
|
|
217
|
+
const fullData = result.data;
|
|
218
|
+
const accumulators = Array.from({ length: nChannels }, () => createAccumulator());
|
|
219
|
+
if (hasChannelDim) {
|
|
220
|
+
for (let chIdx = 0; chIdx < nChannels; chIdx++) {
|
|
221
|
+
const channelData = extractChannel(fullData, shape, chIdx, cIndex);
|
|
222
|
+
updateAccumulator(accumulators[chIdx], channelData);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
updateAccumulator(accumulators[0], fullData);
|
|
227
|
+
}
|
|
228
|
+
return buildOmeroFromAccumulators(accumulators, quantiles, options.colors, options.labels);
|
|
229
|
+
}
|
|
230
|
+
// ---------------------------------------------------------------------------
|
|
231
|
+
// Public API: computeOmeroFromNgffImage
|
|
232
|
+
// ---------------------------------------------------------------------------
|
|
8
233
|
/**
|
|
9
234
|
* Compute OMERO metadata from an NgffImage.
|
|
10
235
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* For multi-channel images (with 'c' dimension), statistics are computed
|
|
16
|
-
* separately for each channel, resulting in per-channel OMERO windows.
|
|
17
|
-
*
|
|
18
|
-
* Memory requirements: This function loads the entire image data into memory
|
|
19
|
-
* for statistics computation. For large images, use the lowest resolution
|
|
20
|
-
* image from a multiscales pyramid.
|
|
21
|
-
*
|
|
22
|
-
* Edge cases:
|
|
23
|
-
* - If all values in a channel are NaN, the statistics will be NaN.
|
|
24
|
-
* - If a channel has constant values, min/max/start/end will all be the same.
|
|
236
|
+
* Each zarr chunk is decoded and its per-channel statistics computed in
|
|
237
|
+
* parallel via a WorkerPool. Decoded chunks are optionally cached so that
|
|
238
|
+
* a subsequent zarrGet() with the same cache avoids redundant decompression.
|
|
25
239
|
*
|
|
26
240
|
* @param image - The NgffImage to compute metadata for
|
|
27
|
-
* @param options - Optional configuration for quantiles, colors, and
|
|
28
|
-
* - quantiles: Tuple of (low, high) quantile values. Must be between 0 and 1,
|
|
29
|
-
* with low < high. Default is [0.02, 0.98] for 2% and 98% quantiles.
|
|
30
|
-
* - colors: List of hex color strings (without #) for each channel.
|
|
31
|
-
* Must be 6-digit hexadecimal strings (e.g., "FF0000" for red).
|
|
32
|
-
* If not provided, uses white for single channel or Glasbey
|
|
33
|
-
* progression for multi-channel.
|
|
34
|
-
* - labels: List of label strings for each channel.
|
|
35
|
-
* If not provided, uses empty strings.
|
|
241
|
+
* @param options - Optional configuration for quantiles, colors, labels, and cache
|
|
36
242
|
* @returns Promise resolving to Omero metadata with computed window parameters
|
|
37
|
-
* @throws {Error} If quantiles are invalid, colors are invalid format,
|
|
38
|
-
* or not enough colors/labels provided.
|
|
39
|
-
*
|
|
40
|
-
* @example
|
|
41
|
-
* ```ts
|
|
42
|
-
* const omero = await computeOmeroFromNgffImage(image);
|
|
43
|
-
* multiscales.metadata.omero = omero;
|
|
44
|
-
* ```
|
|
45
243
|
*/
|
|
46
244
|
export async function computeOmeroFromNgffImage(image, options = {}) {
|
|
47
245
|
const quantiles = options.quantiles ?? [0.02, 0.98];
|
|
48
|
-
// Validate quantiles
|
|
49
246
|
validateQuantiles(quantiles);
|
|
50
247
|
const dims = image.dims;
|
|
51
248
|
const shape = image.data.shape;
|
|
52
|
-
|
|
53
|
-
const hasChannelDim =
|
|
54
|
-
const cIndex = hasChannelDim ? dims.indexOf("c") : -1;
|
|
249
|
+
const cIndex = dims.indexOf("c");
|
|
250
|
+
const hasChannelDim = cIndex !== -1;
|
|
55
251
|
const nChannels = hasChannelDim ? shape[cIndex] : 1;
|
|
56
|
-
//
|
|
57
|
-
let channelColors;
|
|
252
|
+
// Validate colors
|
|
58
253
|
if (options.colors !== undefined) {
|
|
59
254
|
if (options.colors.length < nChannels) {
|
|
60
255
|
throw new Error(`Not enough colors provided. Got ${options.colors.length}, need ${nChannels}.`);
|
|
61
256
|
}
|
|
62
|
-
// Validate each color
|
|
63
257
|
for (const color of options.colors.slice(0, nChannels)) {
|
|
64
258
|
validateColor(color);
|
|
65
259
|
}
|
|
66
|
-
channelColors = options.colors.slice(0, nChannels);
|
|
67
260
|
}
|
|
68
|
-
|
|
69
|
-
channelColors = getDefaultColors(nChannels);
|
|
70
|
-
}
|
|
71
|
-
// Get labels
|
|
72
|
-
let channelLabels;
|
|
261
|
+
// Validate labels
|
|
73
262
|
if (options.labels !== undefined) {
|
|
74
263
|
if (options.labels.length < nChannels) {
|
|
75
264
|
throw new Error(`Not enough labels provided. Got ${options.labels.length}, need ${nChannels}.`);
|
|
76
265
|
}
|
|
77
|
-
channelLabels = options.labels.slice(0, nChannels);
|
|
78
266
|
}
|
|
79
|
-
|
|
80
|
-
|
|
267
|
+
// Fall back to main-thread for unsupported codecs (e.g. sharding)
|
|
268
|
+
if (await hasUnsupportedCodecs(image.data)) {
|
|
269
|
+
return computeOmeroMainThread(image, options);
|
|
81
270
|
}
|
|
82
|
-
// Read
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
271
|
+
// Read array metadata for codec pipeline + chunk key encoding
|
|
272
|
+
let codecMeta;
|
|
273
|
+
let encodeChunkKey;
|
|
274
|
+
try {
|
|
275
|
+
const metadata = await readArrayMetadata(image.data);
|
|
276
|
+
codecMeta = metadata.codecMeta;
|
|
277
|
+
encodeChunkKey = metadata.encodeChunkKey;
|
|
278
|
+
}
|
|
279
|
+
catch {
|
|
280
|
+
// Fall back to local metadata reading if fizarrita's version fails
|
|
281
|
+
const localMeta = await readLocalArrayMetadata(image.data);
|
|
282
|
+
codecMeta = localMeta.codecMeta;
|
|
283
|
+
encodeChunkKey = localMeta.encodeChunkKey;
|
|
284
|
+
}
|
|
285
|
+
const chunkShape = codecMeta.chunk_shape;
|
|
286
|
+
const metaId = getMetaId(codecMeta);
|
|
287
|
+
// Optional cache for decoded chunks
|
|
288
|
+
const cache = options.cache;
|
|
289
|
+
// Enumerate all chunk coordinates
|
|
290
|
+
const allChunkCoords = enumerateChunkCoords(shape, chunkShape);
|
|
291
|
+
// Build worker pool tasks — one per chunk
|
|
292
|
+
const pool = getOmeroPool();
|
|
293
|
+
const tasks = [];
|
|
294
|
+
for (const chunk_coords of allChunkCoords) {
|
|
295
|
+
const chunkKey = encodeChunkKey(chunk_coords);
|
|
296
|
+
const chunkPath = image.data.resolve(chunkKey).path;
|
|
297
|
+
// Compute edge chunk shape
|
|
298
|
+
const edgeChunkShape = chunk_coords.map((coord, dim) => Math.min(chunkShape[dim], shape[dim] - coord * chunkShape[dim]));
|
|
299
|
+
// Check cache before building the task
|
|
300
|
+
const cacheKey = cache
|
|
301
|
+
? createCacheKey(image.data, encodeChunkKey, chunk_coords)
|
|
302
|
+
: "";
|
|
303
|
+
if (cache) {
|
|
304
|
+
const cachedChunk = cache.get(cacheKey);
|
|
305
|
+
if (cachedChunk) {
|
|
306
|
+
// Cache hit — compute stats from cached decoded chunk on main thread
|
|
307
|
+
const accs = computeStatsFromDecodedChunk(cachedChunk.data, cachedChunk.shape, nChannels, cIndex);
|
|
308
|
+
// No worker needed — return the slot directly for pool management.
|
|
309
|
+
// For cached results, we use the provided workerSlot if available,
|
|
310
|
+
// or create a worker to satisfy the type contract.
|
|
311
|
+
tasks.push((workerSlot) => {
|
|
312
|
+
const worker = workerSlot ?? createOmeroWorker();
|
|
313
|
+
return Promise.resolve({
|
|
314
|
+
worker,
|
|
315
|
+
result: accs,
|
|
316
|
+
});
|
|
317
|
+
});
|
|
318
|
+
continue;
|
|
319
|
+
}
|
|
92
320
|
}
|
|
93
|
-
|
|
94
|
-
|
|
321
|
+
tasks.push(async (workerSlot) => {
|
|
322
|
+
const worker = workerSlot ?? createOmeroWorker();
|
|
323
|
+
// Fetch raw bytes from store on main thread
|
|
324
|
+
const rawBytes = await image.data.store.get(chunkPath);
|
|
325
|
+
if (!rawBytes) {
|
|
326
|
+
// Missing chunk — fill with zeros, compute trivial stats
|
|
327
|
+
const accs = [];
|
|
328
|
+
for (let ch = 0; ch < nChannels; ch++) {
|
|
329
|
+
accs.push(createAccumulator());
|
|
330
|
+
}
|
|
331
|
+
return { worker, result: accs };
|
|
332
|
+
}
|
|
333
|
+
// Send to worker: decode + compute stats in one round-trip
|
|
334
|
+
const { chunk, accumulators } = await workerDecodeAndStats(worker, rawBytes, metaId, codecMeta, nChannels, cIndex, edgeChunkShape);
|
|
335
|
+
// Cache decoded chunk for future zarrGet reuse.
|
|
336
|
+
// Cast needed: jsr:zarrita vs npm:zarrita Chunk types are structurally
|
|
337
|
+
// identical but TypeScript sees differing #private class fields.
|
|
338
|
+
if (cache) {
|
|
339
|
+
// deno-lint-ignore no-explicit-any
|
|
340
|
+
cache.set(cacheKey, chunk);
|
|
341
|
+
}
|
|
342
|
+
return { worker, result: accumulators };
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
// Execute all tasks with bounded concurrency
|
|
346
|
+
let allAccumulators;
|
|
347
|
+
if (tasks.length > 0) {
|
|
348
|
+
const { promise } = pool.runTasks(tasks);
|
|
349
|
+
allAccumulators = await promise;
|
|
350
|
+
}
|
|
351
|
+
else {
|
|
352
|
+
allAccumulators = [];
|
|
353
|
+
}
|
|
354
|
+
// Merge partial accumulators across all chunks
|
|
355
|
+
const mergedAccumulators = Array.from({ length: nChannels }, () => createAccumulator());
|
|
356
|
+
for (const chunkAccs of allAccumulators) {
|
|
357
|
+
for (let ch = 0; ch < nChannels; ch++) {
|
|
358
|
+
if (chunkAccs[ch]) {
|
|
359
|
+
mergedAccumulators[ch] = mergeAccumulators(mergedAccumulators[ch], chunkAccs[ch]);
|
|
360
|
+
}
|
|
95
361
|
}
|
|
96
|
-
// Compute statistics
|
|
97
|
-
const stats = computeChannelStatistics(channelData, quantiles);
|
|
98
|
-
// Create OMERO window
|
|
99
|
-
const window = {
|
|
100
|
-
min: stats.min,
|
|
101
|
-
max: stats.max,
|
|
102
|
-
start: stats.qLow,
|
|
103
|
-
end: stats.qHigh,
|
|
104
|
-
};
|
|
105
|
-
// Create channel metadata
|
|
106
|
-
const channel = {
|
|
107
|
-
color: channelColors[chIdx],
|
|
108
|
-
window,
|
|
109
|
-
label: channelLabels[chIdx],
|
|
110
|
-
};
|
|
111
|
-
channels.push(channel);
|
|
112
362
|
}
|
|
113
|
-
return
|
|
363
|
+
return buildOmeroFromAccumulators(mergedAccumulators, quantiles, options.colors, options.labels);
|
|
114
364
|
}
|
|
365
|
+
// ---------------------------------------------------------------------------
|
|
366
|
+
// Public API: computeOmeroFromMultiscales
|
|
367
|
+
// ---------------------------------------------------------------------------
|
|
115
368
|
/**
|
|
116
369
|
* Compute OMERO metadata from a Multiscales object.
|
|
117
370
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compute_omero.js","sourceRoot":"","sources":["../../src/utils/compute_omero.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"compute_omero.js","sourceRoot":"","sources":["../../src/utils/compute_omero.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Main-thread RPC helpers for communicating with the omero codec worker.
|
|
3
|
+
*
|
|
4
|
+
* Follows the same persistent-dispatcher pattern as fizarrita's worker-rpc.ts:
|
|
5
|
+
* - One message listener per worker, routed by request ID
|
|
6
|
+
* - Meta-init protocol: codec metadata sent once per worker per array config
|
|
7
|
+
* - Zero-copy buffer transfer where possible
|
|
8
|
+
*
|
|
9
|
+
* Adds the `workerDecodeAndStats` function for the decode_and_stats message.
|
|
10
|
+
*/
|
|
11
|
+
import type { Chunk, DataType } from "zarrita";
|
|
12
|
+
import type { CodecChunkMeta } from "@fideus-labs/fizarrita";
|
|
13
|
+
import type { ChannelStatisticsAccumulator } from "./compute_omero-shared.js";
|
|
14
|
+
/**
|
|
15
|
+
* Get or create a stable metaId for the given codec metadata.
|
|
16
|
+
* Uses JSON.stringify as the dedup key — called once per unique array config.
|
|
17
|
+
*/
|
|
18
|
+
export declare function getMetaId(meta: CodecChunkMeta): number;
|
|
19
|
+
/**
|
|
20
|
+
* Send raw bytes to the omero codec worker for decoding AND per-channel
|
|
21
|
+
* statistics computation. Returns both the decoded chunk (for caching)
|
|
22
|
+
* and partial accumulators (for merging).
|
|
23
|
+
*
|
|
24
|
+
* @param worker - The Web Worker to send the message to
|
|
25
|
+
* @param bytes - Raw encoded chunk bytes from the store
|
|
26
|
+
* @param metaId - Stable ID for the codec metadata
|
|
27
|
+
* @param meta - Codec metadata for this array
|
|
28
|
+
* @param nChannels - Number of channels in the image
|
|
29
|
+
* @param cIndex - Index of the channel dimension (-1 if no channel dim)
|
|
30
|
+
* @param actualChunkShape - Edge chunk shape correction (optional)
|
|
31
|
+
* @returns The decoded chunk and per-channel accumulators
|
|
32
|
+
*/
|
|
33
|
+
export declare function workerDecodeAndStats<D extends DataType>(worker: Worker, bytes: Uint8Array, metaId: number, meta: CodecChunkMeta, nChannels: number, cIndex: number, actualChunkShape?: number[]): Promise<{
|
|
34
|
+
chunk: Chunk<D>;
|
|
35
|
+
accumulators: ChannelStatisticsAccumulator[];
|
|
36
|
+
}>;
|
|
37
|
+
//# sourceMappingURL=omero_worker_rpc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"omero_worker_rpc.d.ts","sourceRoot":"","sources":["../../src/utils/omero_worker_rpc.ts"],"names":[],"mappings":"AAGA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAyB,MAAM,SAAS,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAC;AA2G9E;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAStD;AA+CD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,oBAAoB,CAAC,CAAC,SAAS,QAAQ,EAC3D,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,cAAc,EACpB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,gBAAgB,CAAC,EAAE,MAAM,EAAE,GAC1B,OAAO,CAAC;IACT,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAChB,YAAY,EAAE,4BAA4B,EAAE,CAAC;CAC9C,CAAC,CA8CD"}
|