@fideus-labs/ngff-zarr 0.2.8 → 0.4.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 +5 -3
- package/esm/browser-mod.d.ts.map +1 -1
- package/esm/browser-mod.js +4 -4
- package/esm/browser-mod.js.map +1 -1
- package/esm/io/from_ngff_zarr.d.ts.map +1 -1
- package/esm/io/from_ngff_zarr.js +34 -116
- package/esm/io/from_ngff_zarr.js.map +1 -1
- package/esm/io/rfc9_zip.d.ts +80 -0
- package/esm/io/rfc9_zip.d.ts.map +1 -0
- package/esm/io/rfc9_zip.js +337 -0
- package/esm/io/rfc9_zip.js.map +1 -0
- package/esm/io/to_ngff_zarr-browser.d.ts +26 -0
- package/esm/io/to_ngff_zarr-browser.d.ts.map +1 -1
- package/esm/io/to_ngff_zarr-browser.js +37 -6
- package/esm/io/to_ngff_zarr-browser.js.map +1 -1
- package/esm/io/to_ngff_zarr.d.ts +76 -0
- package/esm/io/to_ngff_zarr.d.ts.map +1 -1
- package/esm/io/to_ngff_zarr.js +129 -7
- package/esm/io/to_ngff_zarr.js.map +1 -1
- package/esm/io/to_ngff_zarr_ozx_common.d.ts +51 -0
- package/esm/io/to_ngff_zarr_ozx_common.d.ts.map +1 -0
- package/esm/io/to_ngff_zarr_ozx_common.js +126 -0
- package/esm/io/to_ngff_zarr_ozx_common.js.map +1 -0
- package/esm/methods/itkwasm-browser.d.ts.map +1 -1
- package/esm/methods/itkwasm-browser.js +262 -4
- package/esm/methods/itkwasm-browser.js.map +1 -1
- package/esm/methods/itkwasm-node.d.ts.map +1 -1
- package/esm/methods/itkwasm-node.js +262 -4
- package/esm/methods/itkwasm-node.js.map +1 -1
- package/esm/methods/itkwasm-shared.d.ts +6 -0
- package/esm/methods/itkwasm-shared.d.ts.map +1 -1
- package/esm/methods/itkwasm-shared.js +6 -0
- package/esm/methods/itkwasm-shared.js.map +1 -1
- package/esm/mod.d.ts +7 -0
- package/esm/mod.d.ts.map +1 -1
- package/esm/mod.js +6 -0
- package/esm/mod.js.map +1 -1
- package/esm/process/to_multiscales-shared.d.ts.map +1 -1
- package/esm/process/to_multiscales-shared.js +3 -2
- package/esm/process/to_multiscales-shared.js.map +1 -1
- package/esm/types/supported_versions.d.ts +20 -0
- package/esm/types/supported_versions.d.ts.map +1 -0
- package/esm/types/supported_versions.js +31 -0
- package/esm/types/supported_versions.js.map +1 -0
- package/esm/types/zarr_metadata.d.ts +43 -1
- package/esm/types/zarr_metadata.d.ts.map +1 -1
- package/esm/types/zarr_metadata.js +40 -0
- package/esm/types/zarr_metadata.js.map +1 -1
- package/esm/utils/compute_omero.d.ts +89 -0
- package/esm/utils/compute_omero.d.ts.map +1 -0
- package/esm/utils/compute_omero.js +541 -0
- package/esm/utils/compute_omero.js.map +1 -0
- package/esm/utils/factory.d.ts +3 -2
- package/esm/utils/factory.d.ts.map +1 -1
- package/esm/utils/factory.js +6 -2
- package/esm/utils/factory.js.map +1 -1
- package/esm/utils/from_zarr_attrs.d.ts +21 -0
- package/esm/utils/from_zarr_attrs.d.ts.map +1 -0
- package/esm/utils/from_zarr_attrs.js +326 -0
- package/esm/utils/from_zarr_attrs.js.map +1 -0
- package/esm/utils/parse_metadata.d.ts +27 -0
- package/esm/utils/parse_metadata.d.ts.map +1 -0
- package/esm/utils/parse_metadata.js +138 -0
- package/esm/utils/parse_metadata.js.map +1 -0
- package/esm/utils/rfc4_validation.d.ts +20 -0
- package/esm/utils/rfc4_validation.d.ts.map +1 -0
- package/esm/utils/rfc4_validation.js +98 -0
- package/esm/utils/rfc4_validation.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: Copyright (c) Fideus Labs LLC
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
/**
|
|
4
|
+
* Functions for parsing Metadata from zarr store attributes.
|
|
5
|
+
*/
|
|
6
|
+
import * as zarr from "zarrita";
|
|
7
|
+
import { SUPPORTED_DIMS } from "../types/zarr_metadata.js";
|
|
8
|
+
import { NgffImage } from "../types/ngff_image.js";
|
|
9
|
+
import { parseOmero } from "./parse_metadata.js";
|
|
10
|
+
import { hasRfc4OrientationMetadata, validateRfc4Orientation, } from "./rfc4_validation.js";
|
|
11
|
+
import { AnatomicalOrientationValues } from "../types/rfc4.js";
|
|
12
|
+
/**
|
|
13
|
+
* Map string orientation values to enum values
|
|
14
|
+
*/
|
|
15
|
+
const ORIENTATION_VALUE_MAP = {
|
|
16
|
+
"left-to-right": AnatomicalOrientationValues.LeftToRight,
|
|
17
|
+
"right-to-left": AnatomicalOrientationValues.RightToLeft,
|
|
18
|
+
"anterior-to-posterior": AnatomicalOrientationValues.AnteriorToPosterior,
|
|
19
|
+
"posterior-to-anterior": AnatomicalOrientationValues.PosteriorToAnterior,
|
|
20
|
+
"inferior-to-superior": AnatomicalOrientationValues.InferiorToSuperior,
|
|
21
|
+
"superior-to-inferior": AnatomicalOrientationValues.SuperiorToInferior,
|
|
22
|
+
"dorsal-to-ventral": AnatomicalOrientationValues.DorsalToVentral,
|
|
23
|
+
"ventral-to-dorsal": AnatomicalOrientationValues.VentralToDorsal,
|
|
24
|
+
"dorsal-to-palmar": AnatomicalOrientationValues.DorsalToPalmar,
|
|
25
|
+
"palmar-to-dorsal": AnatomicalOrientationValues.PalmarToDorsal,
|
|
26
|
+
"dorsal-to-plantar": AnatomicalOrientationValues.DorsalToPlantar,
|
|
27
|
+
"plantar-to-dorsal": AnatomicalOrientationValues.PlantarToDorsal,
|
|
28
|
+
"rostral-to-caudal": AnatomicalOrientationValues.RostralToCaudal,
|
|
29
|
+
"caudal-to-rostral": AnatomicalOrientationValues.CaudalToRostral,
|
|
30
|
+
"cranial-to-caudal": AnatomicalOrientationValues.CranialToCaudal,
|
|
31
|
+
"caudal-to-cranial": AnatomicalOrientationValues.CaudalToCranial,
|
|
32
|
+
"proximal-to-distal": AnatomicalOrientationValues.ProximalToDistal,
|
|
33
|
+
"distal-to-proximal": AnatomicalOrientationValues.DistalToProximal,
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Extract anatomical orientations from axes metadata.
|
|
37
|
+
* Returns a record mapping axis names to their orientations, or undefined if no orientations.
|
|
38
|
+
*/
|
|
39
|
+
function extractOrientationsFromAxes(axesData) {
|
|
40
|
+
const orientations = {};
|
|
41
|
+
let hasOrientation = false;
|
|
42
|
+
for (const axis of axesData) {
|
|
43
|
+
if (typeof axis === "object" && axis !== null) {
|
|
44
|
+
const axisObj = axis;
|
|
45
|
+
const name = axisObj.name;
|
|
46
|
+
const orientation = axisObj.orientation;
|
|
47
|
+
if (orientation &&
|
|
48
|
+
typeof orientation === "object" &&
|
|
49
|
+
orientation.type === "anatomical") {
|
|
50
|
+
const enumValue = ORIENTATION_VALUE_MAP[orientation.value];
|
|
51
|
+
if (enumValue) {
|
|
52
|
+
orientations[name] = {
|
|
53
|
+
type: "anatomical",
|
|
54
|
+
value: enumValue,
|
|
55
|
+
};
|
|
56
|
+
hasOrientation = true;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return hasOrientation ? orientations : undefined;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Parse Metadata and NgffImages from OME-Zarr v0.4 root attributes.
|
|
65
|
+
*
|
|
66
|
+
* This mirrors the Python `Metadata._from_zarr_attrs` class method.
|
|
67
|
+
*/
|
|
68
|
+
export async function fromZarrAttrsV04(rootAttrs, store, validate = false) {
|
|
69
|
+
// Extract the multiscales metadata
|
|
70
|
+
const multiscalesArray = rootAttrs.multiscales;
|
|
71
|
+
if (!Array.isArray(multiscalesArray) || multiscalesArray.length === 0) {
|
|
72
|
+
throw new Error("No multiscales metadata found in root attributes");
|
|
73
|
+
}
|
|
74
|
+
const multiscalesMetadata = multiscalesArray[0];
|
|
75
|
+
// Validate the root attributes against the OME-Zarr v0.4 schema
|
|
76
|
+
if (validate) {
|
|
77
|
+
// Basic structural validation
|
|
78
|
+
if (!("multiscales" in rootAttrs)) {
|
|
79
|
+
throw new Error("Invalid OME-Zarr metadata: missing 'multiscales' key");
|
|
80
|
+
}
|
|
81
|
+
if (!Array.isArray(rootAttrs.multiscales) ||
|
|
82
|
+
rootAttrs.multiscales.length === 0) {
|
|
83
|
+
throw new Error("Invalid OME-Zarr metadata: 'multiscales' must be a non-empty array");
|
|
84
|
+
}
|
|
85
|
+
// Validate datasets exist
|
|
86
|
+
const datasets = multiscalesMetadata.datasets;
|
|
87
|
+
if (!Array.isArray(datasets) || datasets.length === 0) {
|
|
88
|
+
throw new Error("Invalid OME-Zarr metadata: 'datasets' must be a non-empty array");
|
|
89
|
+
}
|
|
90
|
+
// RFC 4 validation for anatomical orientation
|
|
91
|
+
if ("axes" in multiscalesMetadata &&
|
|
92
|
+
Array.isArray(multiscalesMetadata.axes)) {
|
|
93
|
+
const axesData = multiscalesMetadata.axes;
|
|
94
|
+
// Filter to only dict-style axes for RFC4 validation
|
|
95
|
+
const axesDicts = axesData.filter((axis) => typeof axis === "object" && axis !== null);
|
|
96
|
+
if (axesDicts.length > 0 && hasRfc4OrientationMetadata(axesDicts)) {
|
|
97
|
+
validateRfc4Orientation(axesDicts);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Parse OMERO metadata
|
|
102
|
+
const omero = parseOmero(rootAttrs.omero);
|
|
103
|
+
// Handle backwards compatibility for version <= 0.3
|
|
104
|
+
let dims;
|
|
105
|
+
let axes;
|
|
106
|
+
let units;
|
|
107
|
+
if (!("axes" in multiscalesMetadata)) {
|
|
108
|
+
// Version <= 0.3 - use default dims
|
|
109
|
+
dims = [...SUPPORTED_DIMS].reverse();
|
|
110
|
+
axes = [
|
|
111
|
+
{ name: "t", type: "time", unit: undefined },
|
|
112
|
+
{
|
|
113
|
+
name: "c",
|
|
114
|
+
type: "channel",
|
|
115
|
+
unit: undefined,
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
name: "z",
|
|
119
|
+
type: "space",
|
|
120
|
+
unit: undefined,
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
name: "y",
|
|
124
|
+
type: "space",
|
|
125
|
+
unit: undefined,
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
name: "x",
|
|
129
|
+
type: "space",
|
|
130
|
+
unit: undefined,
|
|
131
|
+
},
|
|
132
|
+
];
|
|
133
|
+
units = Object.fromEntries(dims.map((d) => [d, undefined]));
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
const axesData = multiscalesMetadata.axes;
|
|
137
|
+
dims = axesData.map((a) => typeof a === "object" && "name" in a ? String(a.name) : String(a));
|
|
138
|
+
// Check if axes have names (v0.4+) or are just strings (v0.3)
|
|
139
|
+
if (typeof axesData[0] === "object" && "name" in axesData[0]) {
|
|
140
|
+
axes = axesData.map((axis) => {
|
|
141
|
+
const axisObj = axis;
|
|
142
|
+
return {
|
|
143
|
+
name: String(axisObj.name),
|
|
144
|
+
type: String(axisObj.type),
|
|
145
|
+
unit: axisObj.unit,
|
|
146
|
+
};
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
// v0.3 - string axes
|
|
151
|
+
const typeDict = {
|
|
152
|
+
t: "time",
|
|
153
|
+
c: "channel",
|
|
154
|
+
z: "space",
|
|
155
|
+
y: "space",
|
|
156
|
+
x: "space",
|
|
157
|
+
};
|
|
158
|
+
axes = axesData.map((axis) => {
|
|
159
|
+
const name = String(axis);
|
|
160
|
+
return {
|
|
161
|
+
name,
|
|
162
|
+
type: typeDict[name] ?? "space",
|
|
163
|
+
unit: undefined,
|
|
164
|
+
};
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
// Extract units from axes
|
|
168
|
+
units = Object.fromEntries(dims.map((d) => [d, undefined]));
|
|
169
|
+
for (const axis of axesData) {
|
|
170
|
+
if (typeof axis === "object") {
|
|
171
|
+
const axisObj = axis;
|
|
172
|
+
const name = axisObj.name;
|
|
173
|
+
const unit = axisObj.unit;
|
|
174
|
+
if (name !== undefined && unit !== undefined) {
|
|
175
|
+
units[name] = unit;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
// Extract anatomical orientations from axes (RFC 4)
|
|
181
|
+
let axesOrientations;
|
|
182
|
+
if ("axes" in multiscalesMetadata && Array.isArray(multiscalesMetadata.axes)) {
|
|
183
|
+
const axesData = multiscalesMetadata.axes;
|
|
184
|
+
axesOrientations = extractOrientationsFromAxes(axesData);
|
|
185
|
+
}
|
|
186
|
+
// Parse datasets and create NgffImages
|
|
187
|
+
const images = [];
|
|
188
|
+
const datasets = [];
|
|
189
|
+
const datasetsData = multiscalesMetadata.datasets;
|
|
190
|
+
// Open root group for array access
|
|
191
|
+
let optimizedStore;
|
|
192
|
+
try {
|
|
193
|
+
const tryWithConsolidated = zarr
|
|
194
|
+
.tryWithConsolidated;
|
|
195
|
+
if (tryWithConsolidated) {
|
|
196
|
+
optimizedStore = (await tryWithConsolidated(store));
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
optimizedStore = store;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
optimizedStore = store;
|
|
204
|
+
}
|
|
205
|
+
const root = await zarr.open(optimizedStore, {
|
|
206
|
+
kind: "group",
|
|
207
|
+
});
|
|
208
|
+
for (const dataset of datasetsData) {
|
|
209
|
+
const path = String(dataset.path);
|
|
210
|
+
// Open the zarr array
|
|
211
|
+
const zarrArray = (await zarr.open(root.resolve(path), {
|
|
212
|
+
kind: "array",
|
|
213
|
+
}));
|
|
214
|
+
// Parse coordinate transformations
|
|
215
|
+
const scale = Object.fromEntries(dims.map((d) => [d, 1.0]));
|
|
216
|
+
const translation = Object.fromEntries(dims.map((d) => [d, 0.0]));
|
|
217
|
+
const coordinateTransformations = [];
|
|
218
|
+
if ("coordinateTransformations" in dataset) {
|
|
219
|
+
const transforms = dataset.coordinateTransformations;
|
|
220
|
+
for (const transformation of transforms) {
|
|
221
|
+
if ("scale" in transformation) {
|
|
222
|
+
const scaleValues = transformation.scale;
|
|
223
|
+
dims.forEach((dim, i) => {
|
|
224
|
+
if (i < scaleValues.length) {
|
|
225
|
+
scale[dim] = scaleValues[i];
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
coordinateTransformations.push({
|
|
229
|
+
type: "scale",
|
|
230
|
+
scale: scaleValues,
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
else if ("translation" in transformation) {
|
|
234
|
+
const translationValues = transformation.translation;
|
|
235
|
+
dims.forEach((dim, i) => {
|
|
236
|
+
if (i < translationValues.length) {
|
|
237
|
+
translation[dim] = translationValues[i];
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
coordinateTransformations.push({
|
|
241
|
+
type: "translation",
|
|
242
|
+
translation: translationValues,
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
datasets.push({
|
|
248
|
+
path,
|
|
249
|
+
coordinateTransformations,
|
|
250
|
+
});
|
|
251
|
+
const filteredUnits = {};
|
|
252
|
+
for (const [axis, unit] of Object.entries(units)) {
|
|
253
|
+
if (unit !== undefined && unit !== null) {
|
|
254
|
+
filteredUnits[axis] = unit;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
const ngffImage = new NgffImage({
|
|
258
|
+
data: zarrArray,
|
|
259
|
+
dims,
|
|
260
|
+
scale,
|
|
261
|
+
translation,
|
|
262
|
+
name: multiscalesMetadata.name ?? "image",
|
|
263
|
+
axesUnits: Object.keys(filteredUnits).length > 0
|
|
264
|
+
? filteredUnits
|
|
265
|
+
: undefined,
|
|
266
|
+
axesOrientations,
|
|
267
|
+
computedCallbacks: undefined,
|
|
268
|
+
});
|
|
269
|
+
images.push(ngffImage);
|
|
270
|
+
}
|
|
271
|
+
// Build the metadata object - use spread to only include optional properties if defined
|
|
272
|
+
const metadata = {
|
|
273
|
+
axes,
|
|
274
|
+
datasets,
|
|
275
|
+
name: multiscalesMetadata.name ?? "image",
|
|
276
|
+
version: multiscalesMetadata.version ?? "0.4",
|
|
277
|
+
omero,
|
|
278
|
+
coordinateTransformations: multiscalesMetadata.coordinateTransformations ??
|
|
279
|
+
undefined,
|
|
280
|
+
...(multiscalesMetadata.type !== undefined &&
|
|
281
|
+
multiscalesMetadata.type !== null
|
|
282
|
+
? { type: String(multiscalesMetadata.type) }
|
|
283
|
+
: {}),
|
|
284
|
+
...(multiscalesMetadata.metadata !== undefined &&
|
|
285
|
+
multiscalesMetadata.metadata !== null
|
|
286
|
+
? {
|
|
287
|
+
metadata: multiscalesMetadata.metadata,
|
|
288
|
+
}
|
|
289
|
+
: {}),
|
|
290
|
+
};
|
|
291
|
+
return { metadata, images };
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Parse Metadata and NgffImages from OME-Zarr v0.5 root attributes.
|
|
295
|
+
*
|
|
296
|
+
* The v0.5 format typically wraps multiscales under the "ome" key,
|
|
297
|
+
* but for compatibility we also handle the case where multiscales
|
|
298
|
+
* is at the root level (as written by toNgffZarr).
|
|
299
|
+
*/
|
|
300
|
+
export async function fromZarrAttrsV05(rootAttrs, store, validate = false) {
|
|
301
|
+
// v0.5 may wrap everything under "ome" key, or may have multiscales at root
|
|
302
|
+
const omeData = rootAttrs.ome;
|
|
303
|
+
let v04Attrs;
|
|
304
|
+
if (omeData && "multiscales" in omeData) {
|
|
305
|
+
// Standard v0.5 format with "ome" wrapper
|
|
306
|
+
v04Attrs = {
|
|
307
|
+
multiscales: omeData.multiscales,
|
|
308
|
+
omero: omeData.omero ?? rootAttrs.omero,
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
else if ("multiscales" in rootAttrs) {
|
|
312
|
+
// Compatibility mode: multiscales at root level (as written by toNgffZarr)
|
|
313
|
+
v04Attrs = {
|
|
314
|
+
multiscales: rootAttrs.multiscales,
|
|
315
|
+
omero: rootAttrs.omero,
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
else {
|
|
319
|
+
throw new Error("No multiscales metadata found in root attributes for v0.5 format");
|
|
320
|
+
}
|
|
321
|
+
const result = await fromZarrAttrsV04(v04Attrs, store, validate);
|
|
322
|
+
// Update version to 0.5
|
|
323
|
+
result.metadata.version = "0.5";
|
|
324
|
+
return result;
|
|
325
|
+
}
|
|
326
|
+
//# sourceMappingURL=from_zarr_attrs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"from_zarr_attrs.js","sourceRoot":"","sources":["../../src/utils/from_zarr_attrs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utilities for parsing OME-Zarr metadata from zarr attributes.
|
|
3
|
+
*/
|
|
4
|
+
import { NgffVersion } from "../types/supported_versions.js";
|
|
5
|
+
import type { Methods } from "../types/methods.js";
|
|
6
|
+
import type { MethodMetadata, Omero } from "../types/zarr_metadata.js";
|
|
7
|
+
/**
|
|
8
|
+
* Result from extracting method metadata
|
|
9
|
+
*/
|
|
10
|
+
export interface MethodMetadataResult {
|
|
11
|
+
method: Methods | undefined;
|
|
12
|
+
methodType: string | undefined;
|
|
13
|
+
methodMetadata: MethodMetadata | undefined;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Extract method type and convert to Methods enum.
|
|
17
|
+
*/
|
|
18
|
+
export declare function extractMethodMetadata(metadataDict: Record<string, unknown>): MethodMetadataResult;
|
|
19
|
+
/**
|
|
20
|
+
* Parse OMERO metadata dictionary into Omero interface.
|
|
21
|
+
*/
|
|
22
|
+
export declare function parseOmero(omeroData: Record<string, unknown> | undefined | null): Omero | undefined;
|
|
23
|
+
/**
|
|
24
|
+
* Detect NGFF version from root attributes.
|
|
25
|
+
*/
|
|
26
|
+
export declare function detectVersion(rootAttrs: Record<string, unknown>): NgffVersion;
|
|
27
|
+
//# sourceMappingURL=parse_metadata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse_metadata.d.ts","sourceRoot":"","sources":["../../src/utils/parse_metadata.ts"],"names":[],"mappings":"AAGA;;GAEG;AAEH,OAAO,EAEL,WAAW,EACZ,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,KAAK,EACV,cAAc,EACd,KAAK,EAGN,MAAM,2BAA2B,CAAC;AAEnC;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5B,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,cAAc,EAAE,cAAc,GAAG,SAAS,CAAC;CAC5C;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACpC,oBAAoB,CA4BtB;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,IAAI,GACpD,KAAK,GAAG,SAAS,CAmFnB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,WAAW,CA0Bb"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: Copyright (c) Fideus Labs LLC
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
/**
|
|
4
|
+
* Utilities for parsing OME-Zarr metadata from zarr attributes.
|
|
5
|
+
*/
|
|
6
|
+
import { isSupportedVersion, } from "../types/supported_versions.js";
|
|
7
|
+
import { methodsValues } from "../types/methods.js";
|
|
8
|
+
/**
|
|
9
|
+
* Extract method type and convert to Methods enum.
|
|
10
|
+
*/
|
|
11
|
+
export function extractMethodMetadata(metadataDict) {
|
|
12
|
+
let method = undefined;
|
|
13
|
+
let methodType = undefined;
|
|
14
|
+
let methodMetadata = undefined;
|
|
15
|
+
if (metadataDict && typeof metadataDict === "object") {
|
|
16
|
+
if ("type" in metadataDict && metadataDict.type !== null) {
|
|
17
|
+
methodType = metadataDict.type;
|
|
18
|
+
// Find the corresponding Methods enum
|
|
19
|
+
if (methodsValues.includes(methodType)) {
|
|
20
|
+
method = methodType;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
// Extract method metadata if present
|
|
24
|
+
if ("metadata" in metadataDict && metadataDict.metadata !== null) {
|
|
25
|
+
const metadata = metadataDict.metadata;
|
|
26
|
+
if (metadata && typeof metadata === "object") {
|
|
27
|
+
methodMetadata = {
|
|
28
|
+
description: String(metadata.description ?? ""),
|
|
29
|
+
method: String(metadata.method ?? ""),
|
|
30
|
+
version: String(metadata.version ?? ""),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return { method, methodType, methodMetadata };
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Parse OMERO metadata dictionary into Omero interface.
|
|
39
|
+
*/
|
|
40
|
+
export function parseOmero(omeroData) {
|
|
41
|
+
if (!omeroData || typeof omeroData !== "object") {
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
if (!("channels" in omeroData) || !Array.isArray(omeroData.channels)) {
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
const channels = [];
|
|
48
|
+
for (const channel of omeroData.channels) {
|
|
49
|
+
if (!channel ||
|
|
50
|
+
typeof channel !== "object" ||
|
|
51
|
+
!("window" in channel) ||
|
|
52
|
+
!channel.window) {
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
const windowData = channel.window;
|
|
56
|
+
if (typeof windowData !== "object") {
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
// Handle backward compatibility for OMERO window metadata
|
|
60
|
+
// Prefer start/end format, fall back to min/max, use one as the other if needed
|
|
61
|
+
let start;
|
|
62
|
+
let end;
|
|
63
|
+
let minVal;
|
|
64
|
+
let maxVal;
|
|
65
|
+
if ("start" in windowData && "end" in windowData) {
|
|
66
|
+
// New format with start/end
|
|
67
|
+
start = Number(windowData.start);
|
|
68
|
+
end = Number(windowData.end);
|
|
69
|
+
// Use start/end as min/max if not present
|
|
70
|
+
minVal = ("min" in windowData) ? Number(windowData.min) : start;
|
|
71
|
+
maxVal = ("max" in windowData) ? Number(windowData.max) : end;
|
|
72
|
+
}
|
|
73
|
+
else if ("min" in windowData && "max" in windowData) {
|
|
74
|
+
// Old format with min/max only
|
|
75
|
+
minVal = Number(windowData.min);
|
|
76
|
+
maxVal = Number(windowData.max);
|
|
77
|
+
// Use min/max as start/end for backward compatibility
|
|
78
|
+
start = minVal;
|
|
79
|
+
end = maxVal;
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
// Invalid window data, skip this channel
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
const window = {
|
|
86
|
+
min: minVal,
|
|
87
|
+
max: maxVal,
|
|
88
|
+
start: start,
|
|
89
|
+
end: end,
|
|
90
|
+
};
|
|
91
|
+
const omeroChannel = {
|
|
92
|
+
color: String(channel.color),
|
|
93
|
+
window,
|
|
94
|
+
...(channel.label !== undefined && channel.label !== null
|
|
95
|
+
? { label: String(channel.label) }
|
|
96
|
+
: {}),
|
|
97
|
+
...(typeof channel.active === "boolean"
|
|
98
|
+
? { active: channel.active }
|
|
99
|
+
: {}),
|
|
100
|
+
};
|
|
101
|
+
channels.push(omeroChannel);
|
|
102
|
+
}
|
|
103
|
+
if (channels.length === 0) {
|
|
104
|
+
return undefined;
|
|
105
|
+
}
|
|
106
|
+
return {
|
|
107
|
+
channels,
|
|
108
|
+
...(typeof omeroData.version === "string"
|
|
109
|
+
? { version: omeroData.version }
|
|
110
|
+
: {}),
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Detect NGFF version from root attributes.
|
|
115
|
+
*/
|
|
116
|
+
export function detectVersion(rootAttrs) {
|
|
117
|
+
let versionStr = undefined;
|
|
118
|
+
if ("ome" in rootAttrs && rootAttrs.ome) {
|
|
119
|
+
const ome = rootAttrs.ome;
|
|
120
|
+
versionStr = ome.version;
|
|
121
|
+
}
|
|
122
|
+
// Fall back to multiscales if version not found in ome
|
|
123
|
+
if (versionStr === undefined) {
|
|
124
|
+
const multiscales = rootAttrs.multiscales;
|
|
125
|
+
if (multiscales && Array.isArray(multiscales) && multiscales.length > 0) {
|
|
126
|
+
const firstMultiscale = multiscales[0];
|
|
127
|
+
versionStr = firstMultiscale.version ?? "0.4";
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (versionStr === undefined) {
|
|
131
|
+
throw new Error("Could not detect NGFF version from root attributes.");
|
|
132
|
+
}
|
|
133
|
+
if (!isSupportedVersion(versionStr)) {
|
|
134
|
+
throw new Error(`Unsupported NGFF version: ${versionStr}`);
|
|
135
|
+
}
|
|
136
|
+
return versionStr;
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=parse_metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse_metadata.js","sourceRoot":"","sources":["../../src/utils/parse_metadata.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RFC 4 validation for anatomical orientation in OME-NGFF.
|
|
3
|
+
*
|
|
4
|
+
* This module provides validation for RFC 4 anatomical orientation metadata.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Check if the axes contain RFC 4 anatomical orientation metadata.
|
|
8
|
+
*
|
|
9
|
+
* @param axes - List of axis metadata objects
|
|
10
|
+
* @returns True if any spatial axis has orientation metadata
|
|
11
|
+
*/
|
|
12
|
+
export declare function hasRfc4OrientationMetadata(axes: Array<Record<string, unknown>>): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Validate RFC 4 anatomical orientation metadata.
|
|
15
|
+
*
|
|
16
|
+
* @param axes - List of axis metadata dictionaries to validate
|
|
17
|
+
* @throws Error if the orientation metadata is invalid or inconsistent
|
|
18
|
+
*/
|
|
19
|
+
export declare function validateRfc4Orientation(axes: Array<Record<string, unknown>>): void;
|
|
20
|
+
//# sourceMappingURL=rfc4_validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rfc4_validation.d.ts","sourceRoot":"","sources":["../../src/utils/rfc4_validation.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AA0BH;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GACnC,OAAO,CAYT;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GACnC,IAAI,CA0DN"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: Copyright (c) Fideus Labs LLC
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
/**
|
|
4
|
+
* RFC 4 validation for anatomical orientation in OME-NGFF.
|
|
5
|
+
*
|
|
6
|
+
* This module provides validation for RFC 4 anatomical orientation metadata.
|
|
7
|
+
*/
|
|
8
|
+
import { AnatomicalOrientationValuesSchema } from "../schemas/rfc4.js";
|
|
9
|
+
/** Valid anatomical orientation values */
|
|
10
|
+
const VALID_ORIENTATION_VALUES = new Set([
|
|
11
|
+
"left-to-right",
|
|
12
|
+
"right-to-left",
|
|
13
|
+
"anterior-to-posterior",
|
|
14
|
+
"posterior-to-anterior",
|
|
15
|
+
"inferior-to-superior",
|
|
16
|
+
"superior-to-inferior",
|
|
17
|
+
"dorsal-to-ventral",
|
|
18
|
+
"ventral-to-dorsal",
|
|
19
|
+
"dorsal-to-palmar",
|
|
20
|
+
"palmar-to-dorsal",
|
|
21
|
+
"dorsal-to-plantar",
|
|
22
|
+
"plantar-to-dorsal",
|
|
23
|
+
"rostral-to-caudal",
|
|
24
|
+
"caudal-to-rostral",
|
|
25
|
+
"cranial-to-caudal",
|
|
26
|
+
"caudal-to-cranial",
|
|
27
|
+
"proximal-to-distal",
|
|
28
|
+
"distal-to-proximal",
|
|
29
|
+
]);
|
|
30
|
+
/**
|
|
31
|
+
* Check if the axes contain RFC 4 anatomical orientation metadata.
|
|
32
|
+
*
|
|
33
|
+
* @param axes - List of axis metadata objects
|
|
34
|
+
* @returns True if any spatial axis has orientation metadata
|
|
35
|
+
*/
|
|
36
|
+
export function hasRfc4OrientationMetadata(axes) {
|
|
37
|
+
for (const axis of axes) {
|
|
38
|
+
if (typeof axis === "object" &&
|
|
39
|
+
axis !== null &&
|
|
40
|
+
axis.type === "space" &&
|
|
41
|
+
"orientation" in axis) {
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Validate RFC 4 anatomical orientation metadata.
|
|
49
|
+
*
|
|
50
|
+
* @param axes - List of axis metadata dictionaries to validate
|
|
51
|
+
* @throws Error if the orientation metadata is invalid or inconsistent
|
|
52
|
+
*/
|
|
53
|
+
export function validateRfc4Orientation(axes) {
|
|
54
|
+
let hasOrientation = false;
|
|
55
|
+
let orientationType = null;
|
|
56
|
+
const spatialAxesWithOrientation = [];
|
|
57
|
+
const spatialAxesWithoutOrientation = [];
|
|
58
|
+
for (const axis of axes) {
|
|
59
|
+
if (typeof axis === "object" && axis !== null && axis.type === "space") {
|
|
60
|
+
const axisName = String(axis.name ?? "unknown");
|
|
61
|
+
if ("orientation" in axis && axis.orientation !== null) {
|
|
62
|
+
hasOrientation = true;
|
|
63
|
+
spatialAxesWithOrientation.push(axisName);
|
|
64
|
+
const orientation = axis.orientation;
|
|
65
|
+
// Check that all orientations have the same type
|
|
66
|
+
const currentType = orientation.type;
|
|
67
|
+
if (orientationType === null) {
|
|
68
|
+
orientationType = currentType ?? null;
|
|
69
|
+
}
|
|
70
|
+
else if (currentType !== orientationType) {
|
|
71
|
+
throw new Error(`All spatial axis orientations must have the same type. ` +
|
|
72
|
+
`Found types: ${orientationType} and ${currentType}`);
|
|
73
|
+
}
|
|
74
|
+
// Validate the orientation value using the schema
|
|
75
|
+
const orientationValue = orientation.value;
|
|
76
|
+
if (orientationValue !== undefined) {
|
|
77
|
+
const result = AnatomicalOrientationValuesSchema.safeParse(orientationValue);
|
|
78
|
+
if (!result.success) {
|
|
79
|
+
throw new Error(`Invalid orientation value '${orientationValue}' for axis '${axisName}'. ` +
|
|
80
|
+
`Valid values are: ${[...VALID_ORIENTATION_VALUES].sort().join(", ")}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
spatialAxesWithoutOrientation.push(axisName);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// RFC 4 requirement: if orientation is defined for one spatial axis,
|
|
90
|
+
// it must be defined for all spatial axes
|
|
91
|
+
if (hasOrientation && spatialAxesWithoutOrientation.length > 0) {
|
|
92
|
+
throw new Error(`RFC 4 requires that if orientation is defined for one spatial axis, ` +
|
|
93
|
+
`it must be defined for all spatial axes. ` +
|
|
94
|
+
`Axes with orientation: ${spatialAxesWithOrientation.join(", ")}, ` +
|
|
95
|
+
`axes without orientation: ${spatialAxesWithoutOrientation.join(", ")}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=rfc4_validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rfc4_validation.js","sourceRoot":"","sources":["../../src/utils/rfc4_validation.ts"],"names":[],"mappings":"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"}
|