ngio 0.5.0a2__py3-none-any.whl → 0.5.0b1__py3-none-any.whl
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.
- ngio/__init__.py +2 -2
- ngio/common/__init__.py +11 -6
- ngio/common/_masking_roi.py +12 -41
- ngio/common/_pyramid.py +206 -76
- ngio/common/_roi.py +257 -329
- ngio/experimental/iterators/_feature.py +3 -3
- ngio/experimental/iterators/_rois_utils.py +10 -11
- ngio/hcs/_plate.py +50 -43
- ngio/images/_abstract_image.py +418 -35
- ngio/images/_create_synt_container.py +35 -42
- ngio/images/_create_utils.py +423 -0
- ngio/images/_image.py +162 -176
- ngio/images/_label.py +182 -137
- ngio/images/_ome_zarr_container.py +372 -197
- ngio/io_pipes/_io_pipes.py +9 -9
- ngio/io_pipes/_io_pipes_masked.py +7 -7
- ngio/io_pipes/_io_pipes_roi.py +6 -6
- ngio/io_pipes/_io_pipes_types.py +3 -3
- ngio/io_pipes/_match_shape.py +5 -4
- ngio/io_pipes/_ops_slices_utils.py +8 -5
- ngio/ome_zarr_meta/__init__.py +21 -18
- ngio/ome_zarr_meta/_meta_handlers.py +409 -701
- ngio/ome_zarr_meta/ngio_specs/__init__.py +2 -0
- ngio/ome_zarr_meta/ngio_specs/_axes.py +1 -0
- ngio/ome_zarr_meta/ngio_specs/_dataset.py +13 -22
- ngio/ome_zarr_meta/ngio_specs/_ngio_hcs.py +54 -61
- ngio/ome_zarr_meta/ngio_specs/_ngio_image.py +21 -68
- ngio/ome_zarr_meta/v04/__init__.py +5 -1
- ngio/ome_zarr_meta/v04/{_v04_spec_utils.py → _v04_spec.py} +49 -63
- ngio/ome_zarr_meta/v05/__init__.py +5 -1
- ngio/ome_zarr_meta/v05/{_v05_spec_utils.py → _v05_spec.py} +57 -64
- ngio/tables/_tables_container.py +2 -4
- ngio/tables/backends/_anndata.py +58 -8
- ngio/tables/backends/_anndata_utils.py +1 -6
- ngio/tables/backends/_csv.py +3 -19
- ngio/tables/backends/_json.py +10 -13
- ngio/tables/backends/_parquet.py +3 -31
- ngio/tables/backends/_py_arrow_backends.py +222 -0
- ngio/tables/v1/_roi_table.py +41 -24
- ngio/utils/__init__.py +4 -12
- ngio/utils/_zarr_utils.py +163 -53
- {ngio-0.5.0a2.dist-info → ngio-0.5.0b1.dist-info}/METADATA +6 -2
- ngio-0.5.0b1.dist-info/RECORD +88 -0
- {ngio-0.5.0a2.dist-info → ngio-0.5.0b1.dist-info}/WHEEL +1 -1
- ngio/images/_create.py +0 -287
- ngio/tables/backends/_non_zarr_backends.py +0 -196
- ngio/utils/_logger.py +0 -50
- ngio-0.5.0a2.dist-info/RECORD +0 -89
- {ngio-0.5.0a2.dist-info → ngio-0.5.0b1.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,33 +1,38 @@
|
|
|
1
1
|
"""Base class for handling OME-NGFF metadata in Zarr groups."""
|
|
2
2
|
|
|
3
|
-
from
|
|
4
|
-
|
|
5
|
-
from pydantic import ValidationError
|
|
3
|
+
from collections.abc import Callable
|
|
4
|
+
from typing import TypeVar
|
|
6
5
|
|
|
7
6
|
from ngio.ome_zarr_meta.ngio_specs import (
|
|
8
7
|
AxesSetup,
|
|
9
8
|
NgioImageMeta,
|
|
10
9
|
NgioLabelMeta,
|
|
10
|
+
NgioLabelsGroupMeta,
|
|
11
11
|
NgioPlateMeta,
|
|
12
12
|
NgioWellMeta,
|
|
13
13
|
)
|
|
14
|
+
from ngio.ome_zarr_meta.ngio_specs._ngio_image import NgffVersions
|
|
14
15
|
from ngio.ome_zarr_meta.v04 import (
|
|
15
16
|
ngio_to_v04_image_meta,
|
|
16
17
|
ngio_to_v04_label_meta,
|
|
18
|
+
ngio_to_v04_labels_group_meta,
|
|
17
19
|
ngio_to_v04_plate_meta,
|
|
18
20
|
ngio_to_v04_well_meta,
|
|
19
21
|
v04_to_ngio_image_meta,
|
|
20
22
|
v04_to_ngio_label_meta,
|
|
23
|
+
v04_to_ngio_labels_group_meta,
|
|
21
24
|
v04_to_ngio_plate_meta,
|
|
22
25
|
v04_to_ngio_well_meta,
|
|
23
26
|
)
|
|
24
27
|
from ngio.ome_zarr_meta.v05 import (
|
|
25
28
|
ngio_to_v05_image_meta,
|
|
26
29
|
ngio_to_v05_label_meta,
|
|
30
|
+
ngio_to_v05_labels_group_meta,
|
|
27
31
|
ngio_to_v05_plate_meta,
|
|
28
32
|
ngio_to_v05_well_meta,
|
|
29
33
|
v05_to_ngio_image_meta,
|
|
30
34
|
v05_to_ngio_label_meta,
|
|
35
|
+
v05_to_ngio_labels_group_meta,
|
|
31
36
|
v05_to_ngio_plate_meta,
|
|
32
37
|
v05_to_ngio_well_meta,
|
|
33
38
|
)
|
|
@@ -37,792 +42,495 @@ from ngio.utils import (
|
|
|
37
42
|
ZarrGroupHandler,
|
|
38
43
|
)
|
|
39
44
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
strict_canonical_order (bool, optional): Whether to enforce a strict
|
|
67
|
-
canonical order.
|
|
68
|
-
|
|
69
|
-
Returns:
|
|
70
|
-
tuple[bool, NgioImageMeta | ConverterError]: A tuple with a boolean
|
|
71
|
-
indicating whether the conversion was successful and the
|
|
72
|
-
NgioImageMeta object or an error.
|
|
73
|
-
|
|
74
|
-
"""
|
|
75
|
-
...
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
class ImageMetaExporter(Protocol):
|
|
79
|
-
def __call__(self, metadata: NgioImageMeta) -> dict: ...
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
class LabelMetaImporter(Protocol):
|
|
83
|
-
@staticmethod
|
|
84
|
-
def __call__(
|
|
85
|
-
metadata: dict,
|
|
86
|
-
axes_setup: AxesSetup | None = None,
|
|
87
|
-
allow_non_canonical_axes: bool = False,
|
|
88
|
-
strict_canonical_order: bool = True,
|
|
89
|
-
) -> tuple[bool, NgioLabelMeta | ConverterError]:
|
|
90
|
-
"""Convert the metadata to a NgioLabelMeta object.
|
|
91
|
-
|
|
92
|
-
Args:
|
|
93
|
-
metadata (dict): The metadata (typically from a Zarr group .attrs).
|
|
94
|
-
axes_setup (AxesSetup, optional): The axes setup.
|
|
95
|
-
This is used to map axes with non-canonical names.
|
|
96
|
-
allow_non_canonical_axes (bool, optional): Whether to allow non-canonical
|
|
97
|
-
axes.
|
|
98
|
-
strict_canonical_order (bool, optional): Whether to enforce a strict
|
|
99
|
-
canonical order.
|
|
100
|
-
|
|
101
|
-
Returns:
|
|
102
|
-
tuple[bool, NgioLabelMeta | ConverterError]: A tuple with a boolean
|
|
103
|
-
indicating whether the conversion was successful and the
|
|
104
|
-
NgioLabelMeta object or an error.
|
|
105
|
-
|
|
106
|
-
"""
|
|
107
|
-
...
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
class LabelMetaExporter(Protocol):
|
|
111
|
-
def __call__(self, metadata: NgioLabelMeta) -> dict: ...
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
class WellMetaImporter(Protocol):
|
|
115
|
-
def __call__(
|
|
116
|
-
self, metadata: dict
|
|
117
|
-
) -> tuple[bool, NgioWellMeta | ConverterError]: ...
|
|
45
|
+
# This could be replaced with a more dynamic registry if needed in the future
|
|
46
|
+
_image_encoder_registry = {"0.4": ngio_to_v04_image_meta, "0.5": ngio_to_v05_image_meta}
|
|
47
|
+
_image_decoder_registry = {"0.4": v04_to_ngio_image_meta, "0.5": v05_to_ngio_image_meta}
|
|
48
|
+
_label_encoder_registry = {"0.4": ngio_to_v04_label_meta, "0.5": ngio_to_v05_label_meta}
|
|
49
|
+
_label_decoder_registry = {"0.4": v04_to_ngio_label_meta, "0.5": v05_to_ngio_label_meta}
|
|
50
|
+
_plate_encoder_registry = {"0.4": ngio_to_v04_plate_meta, "0.5": ngio_to_v05_plate_meta}
|
|
51
|
+
_plate_decoder_registry = {"0.4": v04_to_ngio_plate_meta, "0.5": v05_to_ngio_plate_meta}
|
|
52
|
+
_well_encoder_registry = {"0.4": ngio_to_v04_well_meta, "0.5": ngio_to_v05_well_meta}
|
|
53
|
+
_well_decoder_registry = {"0.4": v04_to_ngio_well_meta, "0.5": v05_to_ngio_well_meta}
|
|
54
|
+
_labels_group_encoder_registry = {
|
|
55
|
+
"0.4": ngio_to_v04_labels_group_meta,
|
|
56
|
+
"0.5": ngio_to_v05_labels_group_meta,
|
|
57
|
+
}
|
|
58
|
+
_labels_group_decoder_registry = {
|
|
59
|
+
"0.4": v04_to_ngio_labels_group_meta,
|
|
60
|
+
"0.5": v05_to_ngio_labels_group_meta,
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
_meta_type = TypeVar(
|
|
64
|
+
"_meta_type",
|
|
65
|
+
NgioImageMeta,
|
|
66
|
+
NgioLabelMeta,
|
|
67
|
+
NgioLabelsGroupMeta,
|
|
68
|
+
NgioPlateMeta,
|
|
69
|
+
NgioWellMeta,
|
|
70
|
+
)
|
|
118
71
|
|
|
119
72
|
|
|
120
|
-
|
|
121
|
-
|
|
73
|
+
def _find_encoder_registry(
|
|
74
|
+
ngio_meta: _meta_type,
|
|
75
|
+
) -> dict[str, Callable]:
|
|
76
|
+
if isinstance(ngio_meta, NgioImageMeta):
|
|
77
|
+
return _image_encoder_registry
|
|
78
|
+
elif isinstance(ngio_meta, NgioLabelMeta):
|
|
79
|
+
return _label_encoder_registry
|
|
80
|
+
elif isinstance(ngio_meta, NgioPlateMeta):
|
|
81
|
+
return _plate_encoder_registry
|
|
82
|
+
elif isinstance(ngio_meta, NgioWellMeta):
|
|
83
|
+
return _well_encoder_registry
|
|
84
|
+
elif isinstance(ngio_meta, NgioLabelsGroupMeta):
|
|
85
|
+
return _labels_group_encoder_registry
|
|
86
|
+
else:
|
|
87
|
+
raise NgioValueError(f"Unsupported NGIO metadata type: {type(ngio_meta)}")
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def update_ngio_meta(
|
|
91
|
+
group_handler: ZarrGroupHandler,
|
|
92
|
+
ngio_meta: _meta_type,
|
|
93
|
+
) -> None:
|
|
94
|
+
"""Update the metadata in the Zarr group.
|
|
95
|
+
|
|
96
|
+
Args:
|
|
97
|
+
group_handler (ZarrGroupHandler): The Zarr group handler.
|
|
98
|
+
ngio_meta (_meta_type): The new NGIO metadata.
|
|
99
|
+
|
|
100
|
+
"""
|
|
101
|
+
registry = _find_encoder_registry(ngio_meta)
|
|
102
|
+
exporter = registry.get(ngio_meta.version)
|
|
103
|
+
if exporter is None:
|
|
104
|
+
raise NgioValueError(f"Unsupported NGFF version: {ngio_meta.version}")
|
|
105
|
+
|
|
106
|
+
zarr_meta = exporter(ngio_meta)
|
|
107
|
+
group_handler.write_attrs(zarr_meta)
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def _find_decoder_registry(
|
|
111
|
+
meta_type: type[_meta_type],
|
|
112
|
+
) -> dict[str, Callable]:
|
|
113
|
+
if meta_type is NgioImageMeta:
|
|
114
|
+
return _image_decoder_registry
|
|
115
|
+
elif meta_type is NgioLabelMeta:
|
|
116
|
+
return _label_decoder_registry
|
|
117
|
+
elif meta_type is NgioPlateMeta:
|
|
118
|
+
return _plate_decoder_registry
|
|
119
|
+
elif meta_type is NgioWellMeta:
|
|
120
|
+
return _well_decoder_registry
|
|
121
|
+
elif meta_type is NgioLabelsGroupMeta:
|
|
122
|
+
return _labels_group_decoder_registry
|
|
123
|
+
else:
|
|
124
|
+
raise NgioValueError(f"Unsupported NGIO metadata type: {meta_type}")
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def get_ngio_meta(
|
|
128
|
+
group_handler: ZarrGroupHandler,
|
|
129
|
+
meta_type: type[_meta_type],
|
|
130
|
+
version: str | None = None,
|
|
131
|
+
**kwargs,
|
|
132
|
+
) -> _meta_type:
|
|
133
|
+
"""Retrieve the NGIO metadata from the Zarr group.
|
|
134
|
+
|
|
135
|
+
Args:
|
|
136
|
+
group_handler (ZarrGroupHandler): The Zarr group handler.
|
|
137
|
+
meta_type (type[_meta_type]): The type of NGIO metadata to retrieve.
|
|
138
|
+
version (str | None): Optional NGFF version to use for decoding.
|
|
139
|
+
**kwargs: Additional arguments to pass to the decoder.
|
|
140
|
+
|
|
141
|
+
Returns:
|
|
142
|
+
_meta_type: The NGIO metadata.
|
|
143
|
+
"""
|
|
144
|
+
registry = _find_decoder_registry(meta_type)
|
|
145
|
+
if version is not None:
|
|
146
|
+
decoder = registry.get(version)
|
|
147
|
+
if decoder is None:
|
|
148
|
+
raise NgioValueError(f"Unsupported NGFF version: {version}")
|
|
149
|
+
versions_to_try = {version: decoder}
|
|
150
|
+
else:
|
|
151
|
+
versions_to_try = registry
|
|
152
|
+
|
|
153
|
+
attrs = group_handler.load_attrs()
|
|
154
|
+
all_errors = []
|
|
155
|
+
for version, decoder in versions_to_try.items():
|
|
156
|
+
try:
|
|
157
|
+
ngio_meta = decoder(attrs, **kwargs)
|
|
158
|
+
return ngio_meta
|
|
159
|
+
except Exception as e:
|
|
160
|
+
all_errors.append(f"Version {version}: {e}")
|
|
161
|
+
error_message = (
|
|
162
|
+
f"Failed to decode NGIO {meta_type.__name__} metadata:\n"
|
|
163
|
+
+ "\n".join(all_errors)
|
|
164
|
+
)
|
|
165
|
+
raise NgioValidationError(error_message)
|
|
122
166
|
|
|
123
167
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
168
|
+
##################################################
|
|
169
|
+
#
|
|
170
|
+
# Concrete implementations for NGIO metadata types
|
|
171
|
+
#
|
|
172
|
+
##################################################
|
|
128
173
|
|
|
129
174
|
|
|
130
|
-
|
|
131
|
-
|
|
175
|
+
def get_ngio_image_meta(
|
|
176
|
+
group_handler: ZarrGroupHandler,
|
|
177
|
+
version: str | None = None,
|
|
178
|
+
axes_setup: AxesSetup | None = None,
|
|
179
|
+
allow_non_canonical_axes: bool = False,
|
|
180
|
+
strict_canonical_order: bool = True,
|
|
181
|
+
) -> NgioImageMeta:
|
|
182
|
+
"""Retrieve the NGIO image metadata from the Zarr group.
|
|
183
|
+
|
|
184
|
+
Args:
|
|
185
|
+
group_handler (ZarrGroupHandler): The Zarr group handler.
|
|
186
|
+
version (str | None): Optional NGFF version to use for decoding.
|
|
187
|
+
axes_setup (AxesSetup | None): Optional axes setup for validation.
|
|
188
|
+
allow_non_canonical_axes (bool): Whether to allow non-canonical axes.
|
|
189
|
+
strict_canonical_order (bool): Whether to enforce strict canonical order.
|
|
190
|
+
|
|
191
|
+
Returns:
|
|
192
|
+
NgioImageMeta: The NGIO image metadata.
|
|
193
|
+
"""
|
|
194
|
+
return get_ngio_meta(
|
|
195
|
+
group_handler=group_handler,
|
|
196
|
+
meta_type=NgioImageMeta,
|
|
197
|
+
version=version,
|
|
198
|
+
axes_setup=axes_setup,
|
|
199
|
+
allow_non_canonical_axes=allow_non_canonical_axes,
|
|
200
|
+
strict_canonical_order=strict_canonical_order,
|
|
201
|
+
)
|
|
132
202
|
|
|
133
203
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
204
|
+
def update_ngio_image_meta(
|
|
205
|
+
group_handler: ZarrGroupHandler,
|
|
206
|
+
ngio_meta: NgioImageMeta,
|
|
207
|
+
) -> None:
|
|
208
|
+
"""Update the NGIO image metadata in the Zarr group.
|
|
139
209
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
)
|
|
144
|
-
_image_meta_exporter = TypeVar(
|
|
145
|
-
"_image_meta_exporter", ImageMetaExporter, LabelMetaExporter
|
|
146
|
-
)
|
|
210
|
+
Args:
|
|
211
|
+
group_handler (ZarrGroupHandler): The Zarr group handler.
|
|
212
|
+
ngio_meta (NgioImageMeta): The new NGIO image metadata.
|
|
147
213
|
|
|
214
|
+
"""
|
|
215
|
+
update_ngio_meta(
|
|
216
|
+
group_handler=group_handler,
|
|
217
|
+
ngio_meta=ngio_meta,
|
|
218
|
+
)
|
|
148
219
|
|
|
149
|
-
class GenericMetaHandler(
|
|
150
|
-
Generic[_image_meta, _image_meta_importer, _image_meta_exporter]
|
|
151
|
-
):
|
|
152
|
-
"""Generic class for handling OME-Zarr metadata in Zarr groups."""
|
|
153
220
|
|
|
221
|
+
class ImageMetaHandler:
|
|
154
222
|
def __init__(
|
|
155
223
|
self,
|
|
156
|
-
meta_importer: _image_meta_importer,
|
|
157
|
-
meta_exporter: _image_meta_exporter,
|
|
158
224
|
group_handler: ZarrGroupHandler,
|
|
225
|
+
version: str | None = None,
|
|
159
226
|
axes_setup: AxesSetup | None = None,
|
|
160
227
|
allow_non_canonical_axes: bool = False,
|
|
161
228
|
strict_canonical_order: bool = True,
|
|
162
229
|
):
|
|
163
|
-
"""Initialize the handler.
|
|
164
|
-
|
|
165
|
-
Args:
|
|
166
|
-
meta_importer (MetaImporter): The metadata importer.
|
|
167
|
-
meta_exporter (MetaExporter): The metadata exporter.
|
|
168
|
-
group_handler (ZarrGroupHandler): The Zarr group handler.
|
|
169
|
-
axes_setup (AxesSetup, optional): The axes setup.
|
|
170
|
-
This is used to map axes with non-canonical names.
|
|
171
|
-
allow_non_canonical_axes (bool, optional): Whether to allow non-canonical
|
|
172
|
-
axes.
|
|
173
|
-
strict_canonical_order (bool, optional): Whether to enforce a strict
|
|
174
|
-
canonical order.
|
|
175
|
-
"""
|
|
176
230
|
self._group_handler = group_handler
|
|
177
|
-
self.
|
|
178
|
-
self._meta_exporter = meta_exporter
|
|
231
|
+
self._version = version
|
|
179
232
|
self._axes_setup = axes_setup
|
|
180
233
|
self._allow_non_canonical_axes = allow_non_canonical_axes
|
|
181
234
|
self._strict_canonical_order = strict_canonical_order
|
|
182
235
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
236
|
+
# Validate metadata
|
|
237
|
+
meta = self.get_meta()
|
|
238
|
+
# Store the resolved version
|
|
239
|
+
self._version = meta.version
|
|
240
|
+
|
|
241
|
+
def get_meta(self) -> NgioImageMeta:
|
|
242
|
+
"""Retrieve the NGIO image metadata."""
|
|
243
|
+
return get_ngio_image_meta(
|
|
244
|
+
group_handler=self._group_handler,
|
|
245
|
+
version=self._version,
|
|
188
246
|
axes_setup=self._axes_setup,
|
|
189
247
|
allow_non_canonical_axes=self._allow_non_canonical_axes,
|
|
190
248
|
strict_canonical_order=self._strict_canonical_order,
|
|
191
249
|
)
|
|
192
|
-
if is_valid:
|
|
193
|
-
return meta_or_error
|
|
194
|
-
|
|
195
|
-
if return_error:
|
|
196
|
-
return meta_or_error
|
|
197
|
-
|
|
198
|
-
raise NgioValueError(f"Could not load metadata: {meta_or_error}")
|
|
199
|
-
|
|
200
|
-
def _write_meta(self, meta) -> None:
|
|
201
|
-
"""Write the metadata to the store."""
|
|
202
|
-
_meta = self._meta_exporter(metadata=meta)
|
|
203
|
-
self._group_handler.write_attrs(_meta)
|
|
204
250
|
|
|
205
|
-
def
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
raise NotImplementedError("This method should be implemented in a subclass.")
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
class ImageMetaHandler(
|
|
215
|
-
GenericMetaHandler[NgioImageMeta, ImageMetaImporter, ImageMetaExporter]
|
|
216
|
-
):
|
|
217
|
-
"""Generic class for handling OME-Zarr metadata in Zarr groups."""
|
|
218
|
-
|
|
219
|
-
@property
|
|
220
|
-
def meta(self) -> NgioImageMeta:
|
|
221
|
-
meta = self._load_meta()
|
|
222
|
-
if isinstance(meta, NgioImageMeta):
|
|
223
|
-
return meta
|
|
224
|
-
raise NgioValueError(f"Could not load metadata: {meta}")
|
|
225
|
-
|
|
226
|
-
def safe_load_meta(self) -> NgioImageMeta | ConverterError:
|
|
227
|
-
"""Load the metadata from the store."""
|
|
228
|
-
return self._load_meta(return_error=True)
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
class LabelMetaHandler(
|
|
232
|
-
GenericMetaHandler[NgioLabelMeta, LabelMetaImporter, LabelMetaExporter]
|
|
233
|
-
):
|
|
234
|
-
"""Generic class for handling OME-Zarr metadata in Zarr groups."""
|
|
251
|
+
def update_meta(self, ngio_meta: NgioImageMeta) -> None:
|
|
252
|
+
"""Update the NGIO image metadata."""
|
|
253
|
+
update_ngio_meta(
|
|
254
|
+
group_handler=self._group_handler,
|
|
255
|
+
ngio_meta=ngio_meta,
|
|
256
|
+
)
|
|
235
257
|
|
|
236
|
-
@property
|
|
237
|
-
def meta(self) -> NgioLabelMeta:
|
|
238
|
-
meta = self._load_meta()
|
|
239
|
-
if isinstance(meta, NgioLabelMeta):
|
|
240
|
-
return meta
|
|
241
|
-
raise NgioValueError(f"Could not load metadata: {meta}")
|
|
242
258
|
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
259
|
+
def get_ngio_label_meta(
|
|
260
|
+
group_handler: ZarrGroupHandler,
|
|
261
|
+
version: str | None = None,
|
|
262
|
+
axes_setup: AxesSetup | None = None,
|
|
263
|
+
allow_non_canonical_axes: bool = False,
|
|
264
|
+
strict_canonical_order: bool = True,
|
|
265
|
+
) -> NgioLabelMeta:
|
|
266
|
+
"""Retrieve the NGIO label metadata from the Zarr group.
|
|
267
|
+
|
|
268
|
+
Args:
|
|
269
|
+
group_handler (ZarrGroupHandler): The Zarr group handler.
|
|
270
|
+
version (str | None): Optional NGFF version to use for decoding.
|
|
271
|
+
axes_setup (AxesSetup | None): Optional axes setup for validation.
|
|
272
|
+
allow_non_canonical_axes (bool): Whether to allow non-canonical axes.
|
|
273
|
+
strict_canonical_order (bool): Whether to enforce strict canonical order.
|
|
274
|
+
|
|
275
|
+
Returns:
|
|
276
|
+
NgioLabelMeta: The NGIO label metadata.
|
|
277
|
+
"""
|
|
278
|
+
return get_ngio_meta(
|
|
279
|
+
group_handler=group_handler,
|
|
280
|
+
meta_type=NgioLabelMeta,
|
|
281
|
+
version=version,
|
|
282
|
+
axes_setup=axes_setup,
|
|
283
|
+
allow_non_canonical_axes=allow_non_canonical_axes,
|
|
284
|
+
strict_canonical_order=strict_canonical_order,
|
|
285
|
+
)
|
|
246
286
|
|
|
247
287
|
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
288
|
+
def update_ngio_label_meta(
|
|
289
|
+
group_handler: ZarrGroupHandler,
|
|
290
|
+
ngio_meta: NgioLabelMeta,
|
|
291
|
+
) -> None:
|
|
292
|
+
"""Update the NGIO label metadata in the Zarr group.
|
|
253
293
|
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
294
|
+
Args:
|
|
295
|
+
group_handler (ZarrGroupHandler): The Zarr group handler.
|
|
296
|
+
ngio_meta (NgioLabelMeta): The new NGIO label metadata.
|
|
257
297
|
|
|
298
|
+
"""
|
|
299
|
+
update_ngio_meta(
|
|
300
|
+
group_handler=group_handler,
|
|
301
|
+
ngio_meta=ngio_meta,
|
|
302
|
+
)
|
|
258
303
|
|
|
259
|
-
class GenericHCSMetaHandler(Generic[_hcs_meta, _hcs_meta_importer, _hcs_meta_exporter]):
|
|
260
|
-
"""Generic class for handling OME-Zarr metadata in Zarr groups."""
|
|
261
304
|
|
|
305
|
+
class LabelMetaHandler:
|
|
262
306
|
def __init__(
|
|
263
307
|
self,
|
|
264
|
-
meta_importer: _hcs_meta_importer,
|
|
265
|
-
meta_exporter: _hcs_meta_exporter,
|
|
266
308
|
group_handler: ZarrGroupHandler,
|
|
309
|
+
version: str | None = None,
|
|
310
|
+
axes_setup: AxesSetup | None = None,
|
|
311
|
+
allow_non_canonical_axes: bool = False,
|
|
312
|
+
strict_canonical_order: bool = True,
|
|
267
313
|
):
|
|
268
314
|
self._group_handler = group_handler
|
|
269
|
-
self.
|
|
270
|
-
self.
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
"""Load the metadata from the store."""
|
|
274
|
-
attrs = self._group_handler.load_attrs()
|
|
275
|
-
is_valid, meta_or_error = self._meta_importer(metadata=attrs)
|
|
276
|
-
if is_valid:
|
|
277
|
-
return meta_or_error
|
|
278
|
-
|
|
279
|
-
if return_error:
|
|
280
|
-
return meta_or_error
|
|
281
|
-
|
|
282
|
-
raise NgioValueError(f"Could not load metadata: {meta_or_error}")
|
|
283
|
-
|
|
284
|
-
def _write_meta(self, meta) -> None:
|
|
285
|
-
_meta = self._meta_exporter(metadata=meta)
|
|
286
|
-
self._group_handler.write_attrs(_meta)
|
|
287
|
-
|
|
288
|
-
def write_meta(self, meta: _hcs_meta) -> None:
|
|
289
|
-
self._write_meta(meta)
|
|
290
|
-
|
|
291
|
-
@property
|
|
292
|
-
def meta(self) -> _hcs_meta:
|
|
293
|
-
raise NotImplementedError("This method should be implemented in a subclass.")
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
class WellMetaHandler(
|
|
297
|
-
GenericHCSMetaHandler[NgioWellMeta, WellMetaImporter, WellMetaExporter]
|
|
298
|
-
):
|
|
299
|
-
"""Generic class for handling OME-Zarr metadata in Zarr groups."""
|
|
300
|
-
|
|
301
|
-
@property
|
|
302
|
-
def meta(self) -> NgioWellMeta:
|
|
303
|
-
meta = self._load_meta()
|
|
304
|
-
if isinstance(meta, NgioWellMeta):
|
|
305
|
-
return meta
|
|
306
|
-
raise NgioValueError(f"Could not load metadata: {meta}")
|
|
315
|
+
self._version = version
|
|
316
|
+
self._axes_setup = axes_setup
|
|
317
|
+
self._allow_non_canonical_axes = allow_non_canonical_axes
|
|
318
|
+
self._strict_canonical_order = strict_canonical_order
|
|
307
319
|
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
320
|
+
# Validate metadata
|
|
321
|
+
meta = self.get_meta()
|
|
322
|
+
# Store the resolved version
|
|
323
|
+
self._version = meta.version
|
|
311
324
|
|
|
325
|
+
def get_meta(self) -> NgioLabelMeta:
|
|
326
|
+
"""Retrieve the NGIO label metadata."""
|
|
327
|
+
return get_ngio_label_meta(
|
|
328
|
+
group_handler=self._group_handler,
|
|
329
|
+
version=self._version,
|
|
330
|
+
axes_setup=self._axes_setup,
|
|
331
|
+
allow_non_canonical_axes=self._allow_non_canonical_axes,
|
|
332
|
+
strict_canonical_order=self._strict_canonical_order,
|
|
333
|
+
)
|
|
312
334
|
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
335
|
+
def update_meta(self, ngio_meta: NgioLabelMeta) -> None:
|
|
336
|
+
"""Update the NGIO label metadata."""
|
|
337
|
+
update_ngio_meta(
|
|
338
|
+
group_handler=self._group_handler,
|
|
339
|
+
ngio_meta=ngio_meta,
|
|
340
|
+
)
|
|
317
341
|
|
|
318
|
-
@property
|
|
319
|
-
def meta(self) -> NgioPlateMeta:
|
|
320
|
-
meta = self._load_meta()
|
|
321
|
-
if isinstance(meta, NgioPlateMeta):
|
|
322
|
-
return meta
|
|
323
|
-
raise NgioValueError(f"Could not load metadata: {meta}")
|
|
324
342
|
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
343
|
+
def get_ngio_plate_meta(
|
|
344
|
+
group_handler: ZarrGroupHandler,
|
|
345
|
+
version: str | None = None,
|
|
346
|
+
) -> NgioPlateMeta:
|
|
347
|
+
"""Retrieve the NGIO plate metadata from the Zarr group.
|
|
348
|
+
|
|
349
|
+
Args:
|
|
350
|
+
group_handler (ZarrGroupHandler): The Zarr group handler.
|
|
351
|
+
version (str | None): Optional NGFF version to use for decoding.
|
|
352
|
+
|
|
353
|
+
Returns:
|
|
354
|
+
NgioPlateMeta: The NGIO plate metadata.
|
|
355
|
+
"""
|
|
356
|
+
return get_ngio_meta(
|
|
357
|
+
group_handler=group_handler,
|
|
358
|
+
meta_type=NgioPlateMeta,
|
|
359
|
+
version=version,
|
|
360
|
+
)
|
|
328
361
|
|
|
329
362
|
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
363
|
+
def update_ngio_plate_meta(
|
|
364
|
+
group_handler: ZarrGroupHandler,
|
|
365
|
+
ngio_meta: NgioPlateMeta,
|
|
366
|
+
) -> None:
|
|
367
|
+
"""Update the NGIO plate metadata in the Zarr group.
|
|
335
368
|
|
|
369
|
+
Args:
|
|
370
|
+
group_handler (ZarrGroupHandler): The Zarr group handler.
|
|
371
|
+
ngio_meta (NgioPlateMeta): The new NGIO plate metadata.
|
|
336
372
|
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
PlateMetaExporter,
|
|
343
|
-
)
|
|
344
|
-
_meta_importer = TypeVar(
|
|
345
|
-
"_meta_importer",
|
|
346
|
-
ImageMetaImporter,
|
|
347
|
-
LabelMetaImporter,
|
|
348
|
-
WellMetaImporter,
|
|
349
|
-
PlateMetaImporter,
|
|
350
|
-
)
|
|
373
|
+
"""
|
|
374
|
+
update_ngio_meta(
|
|
375
|
+
group_handler=group_handler,
|
|
376
|
+
ngio_meta=ngio_meta,
|
|
377
|
+
)
|
|
351
378
|
|
|
352
379
|
|
|
353
|
-
class
|
|
380
|
+
class PlateMetaHandler:
|
|
354
381
|
def __init__(
|
|
355
|
-
self,
|
|
356
|
-
version: str,
|
|
357
|
-
importer: _meta_importer,
|
|
358
|
-
exporter: _meta_exporter,
|
|
359
|
-
):
|
|
360
|
-
self.importer = importer
|
|
361
|
-
self.exporter = exporter
|
|
362
|
-
self.version = version
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
ImageImporterExporter = _ImporterExporter[ImageMetaImporter, ImageMetaExporter]
|
|
366
|
-
LabelImporterExporter = _ImporterExporter[LabelMetaImporter, LabelMetaExporter]
|
|
367
|
-
WellImporterExporter = _ImporterExporter[WellMetaImporter, WellMetaExporter]
|
|
368
|
-
PlateImporterExporter = _ImporterExporter[PlateMetaImporter, PlateMetaExporter]
|
|
369
|
-
|
|
370
|
-
_importer_exporter = TypeVar(
|
|
371
|
-
"_importer_exporter",
|
|
372
|
-
ImageImporterExporter,
|
|
373
|
-
LabelImporterExporter,
|
|
374
|
-
WellImporterExporter,
|
|
375
|
-
PlateImporterExporter,
|
|
376
|
-
)
|
|
377
|
-
_image_handler = TypeVar("_image_handler", ImageMetaHandler, LabelMetaHandler)
|
|
378
|
-
_hcs_handler = TypeVar("_hcs_handler", WellMetaHandler, PlateMetaHandler)
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
class ImplementedMetaImporterExporter:
|
|
382
|
-
_instance = None
|
|
383
|
-
_image_ie: dict[str, ImageImporterExporter]
|
|
384
|
-
_label_ie: dict[str, LabelImporterExporter]
|
|
385
|
-
_well_ie: dict[str, WellImporterExporter]
|
|
386
|
-
_plate_ie: dict[str, PlateImporterExporter]
|
|
387
|
-
|
|
388
|
-
def __new__(cls):
|
|
389
|
-
"""Create a new instance of the class if it does not exist."""
|
|
390
|
-
if cls._instance is None:
|
|
391
|
-
cls._instance = super().__new__(cls)
|
|
392
|
-
cls._image_ie = {}
|
|
393
|
-
cls._label_ie = {}
|
|
394
|
-
cls._well_ie = {}
|
|
395
|
-
cls._plate_ie = {}
|
|
396
|
-
return cls._instance
|
|
397
|
-
|
|
398
|
-
def _find_image_handler(
|
|
399
|
-
self,
|
|
400
|
-
group_handler: ZarrGroupHandler,
|
|
401
|
-
axes_setup: AxesSetup | None = None,
|
|
402
|
-
allow_non_canonical_axes: bool = False,
|
|
403
|
-
strict_canonical_order: bool = True,
|
|
404
|
-
_ie_name: str = "_image_ie",
|
|
405
|
-
_handler: type[_image_handler] = ImageMetaHandler,
|
|
406
|
-
) -> _image_handler:
|
|
407
|
-
"""Get an image metadata handler."""
|
|
408
|
-
_errors = {}
|
|
409
|
-
|
|
410
|
-
dict_ie = self.__getattribute__(_ie_name)
|
|
411
|
-
|
|
412
|
-
for ie in reversed(dict_ie.values()):
|
|
413
|
-
handler = _handler(
|
|
414
|
-
meta_importer=ie.importer,
|
|
415
|
-
meta_exporter=ie.exporter,
|
|
416
|
-
group_handler=group_handler,
|
|
417
|
-
axes_setup=axes_setup,
|
|
418
|
-
allow_non_canonical_axes=allow_non_canonical_axes,
|
|
419
|
-
strict_canonical_order=strict_canonical_order,
|
|
420
|
-
)
|
|
421
|
-
meta = handler.safe_load_meta()
|
|
422
|
-
if isinstance(meta, ValidationError):
|
|
423
|
-
_errors[ie.version] = meta
|
|
424
|
-
continue
|
|
425
|
-
return handler
|
|
426
|
-
|
|
427
|
-
raise NgioValidationError(
|
|
428
|
-
f"Could not load metadata from any known version. Errors: {_errors}"
|
|
429
|
-
)
|
|
430
|
-
|
|
431
|
-
def find_image_handler(
|
|
432
382
|
self,
|
|
433
383
|
group_handler: ZarrGroupHandler,
|
|
434
|
-
|
|
435
|
-
allow_non_canonical_axes: bool = False,
|
|
436
|
-
strict_canonical_order: bool = True,
|
|
437
|
-
) -> ImageMetaHandler:
|
|
438
|
-
"""Get an image metadata handler."""
|
|
439
|
-
return self._find_image_handler(
|
|
440
|
-
group_handler=group_handler,
|
|
441
|
-
axes_setup=axes_setup,
|
|
442
|
-
allow_non_canonical_axes=allow_non_canonical_axes,
|
|
443
|
-
strict_canonical_order=strict_canonical_order,
|
|
444
|
-
_ie_name="_image_ie",
|
|
445
|
-
_handler=ImageMetaHandler,
|
|
446
|
-
)
|
|
447
|
-
|
|
448
|
-
def get_image_meta_handler(
|
|
449
|
-
self,
|
|
450
|
-
group_handler: ZarrGroupHandler,
|
|
451
|
-
version: str,
|
|
452
|
-
axes_setup: AxesSetup | None = None,
|
|
453
|
-
allow_non_canonical_axes: bool = False,
|
|
454
|
-
strict_canonical_order: bool = True,
|
|
455
|
-
) -> ImageMetaHandler:
|
|
456
|
-
"""Get an image metadata handler."""
|
|
457
|
-
if version not in self._image_ie:
|
|
458
|
-
raise NgioValueError(f"Image handler for version {version} does not exist.")
|
|
459
|
-
|
|
460
|
-
image_ie = self._image_ie[version]
|
|
461
|
-
return ImageMetaHandler(
|
|
462
|
-
meta_importer=image_ie.importer,
|
|
463
|
-
meta_exporter=image_ie.exporter,
|
|
464
|
-
group_handler=group_handler,
|
|
465
|
-
axes_setup=axes_setup,
|
|
466
|
-
allow_non_canonical_axes=allow_non_canonical_axes,
|
|
467
|
-
strict_canonical_order=strict_canonical_order,
|
|
468
|
-
)
|
|
469
|
-
|
|
470
|
-
def _register(
|
|
471
|
-
self,
|
|
472
|
-
version: str,
|
|
473
|
-
importer: _importer_exporter,
|
|
474
|
-
overwrite: bool = False,
|
|
475
|
-
_ie_name: str = "_image_ie",
|
|
476
|
-
):
|
|
477
|
-
"""Register an importer/exporter."""
|
|
478
|
-
ie_dict = self.__getattribute__(_ie_name)
|
|
479
|
-
if version in ie_dict and not overwrite:
|
|
480
|
-
raise NgioValueError(
|
|
481
|
-
f"Importer/exporter for version {version} already exists. "
|
|
482
|
-
"Use 'overwrite=True' to overwrite."
|
|
483
|
-
)
|
|
484
|
-
ie_dict[version] = importer
|
|
485
|
-
|
|
486
|
-
def register_image_ie(
|
|
487
|
-
self,
|
|
488
|
-
version: str,
|
|
489
|
-
importer: ImageMetaImporter,
|
|
490
|
-
exporter: ImageMetaExporter,
|
|
491
|
-
overwrite: bool = False,
|
|
384
|
+
version: str | None = None,
|
|
492
385
|
):
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
self.
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
386
|
+
self._group_handler = group_handler
|
|
387
|
+
self._version = version
|
|
388
|
+
|
|
389
|
+
# Validate metadata
|
|
390
|
+
_ = self.get_meta()
|
|
391
|
+
# Store the resolved version
|
|
392
|
+
# self._version = meta.version
|
|
393
|
+
|
|
394
|
+
def get_meta(self) -> NgioPlateMeta:
|
|
395
|
+
"""Retrieve the NGIO plate metadata."""
|
|
396
|
+
return get_ngio_plate_meta(
|
|
397
|
+
group_handler=self._group_handler,
|
|
398
|
+
version=self._version,
|
|
502
399
|
)
|
|
503
400
|
|
|
504
|
-
def
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
strict_canonical_order: bool = True,
|
|
510
|
-
) -> LabelMetaHandler:
|
|
511
|
-
"""Get a label metadata handler."""
|
|
512
|
-
return self._find_image_handler(
|
|
513
|
-
group_handler=group_handler,
|
|
514
|
-
axes_setup=axes_setup,
|
|
515
|
-
allow_non_canonical_axes=allow_non_canonical_axes,
|
|
516
|
-
strict_canonical_order=strict_canonical_order,
|
|
517
|
-
_ie_name="_label_ie",
|
|
518
|
-
_handler=LabelMetaHandler,
|
|
401
|
+
def update_meta(self, ngio_meta: NgioPlateMeta) -> None:
|
|
402
|
+
"""Update the NGIO plate metadata."""
|
|
403
|
+
update_ngio_meta(
|
|
404
|
+
group_handler=self._group_handler,
|
|
405
|
+
ngio_meta=ngio_meta,
|
|
519
406
|
)
|
|
520
407
|
|
|
521
|
-
def get_label_meta_handler(
|
|
522
|
-
self,
|
|
523
|
-
group_handler: ZarrGroupHandler,
|
|
524
|
-
version: str,
|
|
525
|
-
axes_setup: AxesSetup | None = None,
|
|
526
|
-
allow_non_canonical_axes: bool = False,
|
|
527
|
-
strict_canonical_order: bool = True,
|
|
528
|
-
) -> LabelMetaHandler:
|
|
529
|
-
"""Get a label metadata handler."""
|
|
530
|
-
if version not in self._label_ie:
|
|
531
|
-
raise NgioValueError(f"Label handler for version {version} does not exist.")
|
|
532
|
-
|
|
533
|
-
label_ie = self._label_ie[version]
|
|
534
|
-
return LabelMetaHandler(
|
|
535
|
-
meta_importer=label_ie.importer,
|
|
536
|
-
meta_exporter=label_ie.exporter,
|
|
537
|
-
group_handler=group_handler,
|
|
538
|
-
axes_setup=axes_setup,
|
|
539
|
-
allow_non_canonical_axes=allow_non_canonical_axes,
|
|
540
|
-
strict_canonical_order=strict_canonical_order,
|
|
541
|
-
)
|
|
542
408
|
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
409
|
+
def get_ngio_well_meta(
|
|
410
|
+
group_handler: ZarrGroupHandler,
|
|
411
|
+
version: str | None = None,
|
|
412
|
+
) -> NgioWellMeta:
|
|
413
|
+
"""Retrieve the NGIO well metadata from the Zarr group.
|
|
414
|
+
|
|
415
|
+
Args:
|
|
416
|
+
group_handler (ZarrGroupHandler): The Zarr group handler.
|
|
417
|
+
version (str | None): Optional NGFF version to use for decoding.
|
|
418
|
+
|
|
419
|
+
Returns:
|
|
420
|
+
NgioWellMeta: The NGIO well metadata.
|
|
421
|
+
"""
|
|
422
|
+
return get_ngio_meta(
|
|
423
|
+
group_handler=group_handler,
|
|
424
|
+
meta_type=NgioWellMeta,
|
|
425
|
+
version=version,
|
|
426
|
+
)
|
|
560
427
|
|
|
561
|
-
def _find_hcs_handler(
|
|
562
|
-
self,
|
|
563
|
-
group_handler: ZarrGroupHandler,
|
|
564
|
-
_ie_name: str = "_well_ie",
|
|
565
|
-
_handler: type[_hcs_handler] = WellMetaHandler,
|
|
566
|
-
) -> _hcs_handler:
|
|
567
|
-
"""Get a handler for a HCS metadata."""
|
|
568
|
-
_errors = {}
|
|
569
|
-
|
|
570
|
-
dict_ie = self.__getattribute__(_ie_name)
|
|
571
|
-
|
|
572
|
-
for ie in reversed(dict_ie.values()):
|
|
573
|
-
handler = _handler(
|
|
574
|
-
meta_importer=ie.importer,
|
|
575
|
-
meta_exporter=ie.exporter,
|
|
576
|
-
group_handler=group_handler,
|
|
577
|
-
)
|
|
578
|
-
meta = handler.safe_load_meta()
|
|
579
|
-
if isinstance(meta, ValidationError):
|
|
580
|
-
_errors[ie.version] = meta
|
|
581
|
-
continue
|
|
582
|
-
return handler
|
|
583
|
-
|
|
584
|
-
raise NgioValidationError(
|
|
585
|
-
f"Could not load metadata from any known version. Errors: {_errors}"
|
|
586
|
-
)
|
|
587
428
|
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
return self._find_hcs_handler(
|
|
594
|
-
group_handler=group_handler,
|
|
595
|
-
_ie_name="_well_ie",
|
|
596
|
-
_handler=WellMetaHandler,
|
|
597
|
-
)
|
|
429
|
+
def update_ngio_well_meta(
|
|
430
|
+
group_handler: ZarrGroupHandler,
|
|
431
|
+
ngio_meta: NgioWellMeta,
|
|
432
|
+
) -> None:
|
|
433
|
+
"""Update the NGIO well metadata in the Zarr group.
|
|
598
434
|
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
version: str,
|
|
603
|
-
) -> WellMetaHandler:
|
|
604
|
-
"""Get a well metadata handler."""
|
|
605
|
-
if version not in self._well_ie:
|
|
606
|
-
raise NgioValueError(f"Well handler for version {version} does not exist.")
|
|
607
|
-
|
|
608
|
-
well_ie = self._well_ie[version]
|
|
609
|
-
return WellMetaHandler(
|
|
610
|
-
meta_importer=well_ie.importer,
|
|
611
|
-
meta_exporter=well_ie.exporter,
|
|
612
|
-
group_handler=group_handler,
|
|
613
|
-
)
|
|
435
|
+
Args:
|
|
436
|
+
group_handler (ZarrGroupHandler): The Zarr group handler.
|
|
437
|
+
ngio_meta (NgioWellMeta): The new NGIO well metadata.
|
|
614
438
|
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
overwrite: bool = False,
|
|
621
|
-
):
|
|
622
|
-
"""Register an importer/exporter."""
|
|
623
|
-
importer_exporter = WellImporterExporter(
|
|
624
|
-
version=version, importer=importer, exporter=exporter
|
|
625
|
-
)
|
|
626
|
-
self._register(
|
|
627
|
-
version=version,
|
|
628
|
-
importer=importer_exporter,
|
|
629
|
-
overwrite=overwrite,
|
|
630
|
-
_ie_name="_well_ie",
|
|
631
|
-
)
|
|
439
|
+
"""
|
|
440
|
+
update_ngio_meta(
|
|
441
|
+
group_handler=group_handler,
|
|
442
|
+
ngio_meta=ngio_meta,
|
|
443
|
+
)
|
|
632
444
|
|
|
633
|
-
def find_plate_handler(
|
|
634
|
-
self,
|
|
635
|
-
group_handler: ZarrGroupHandler,
|
|
636
|
-
) -> PlateMetaHandler:
|
|
637
|
-
"""Get a plate metadata handler."""
|
|
638
|
-
return self._find_hcs_handler(
|
|
639
|
-
group_handler=group_handler,
|
|
640
|
-
_ie_name="_plate_ie",
|
|
641
|
-
_handler=PlateMetaHandler,
|
|
642
|
-
)
|
|
643
445
|
|
|
644
|
-
|
|
446
|
+
class WellMetaHandler:
|
|
447
|
+
def __init__(
|
|
645
448
|
self,
|
|
646
449
|
group_handler: ZarrGroupHandler,
|
|
647
|
-
version: str,
|
|
648
|
-
) -> PlateMetaHandler:
|
|
649
|
-
"""Get a plate metadata handler."""
|
|
650
|
-
if version not in self._plate_ie:
|
|
651
|
-
raise NgioValueError(f"Plate handler for version {version} does not exist.")
|
|
652
|
-
|
|
653
|
-
plate_ie = self._plate_ie[version]
|
|
654
|
-
return PlateMetaHandler(
|
|
655
|
-
meta_importer=plate_ie.importer,
|
|
656
|
-
meta_exporter=plate_ie.exporter,
|
|
657
|
-
group_handler=group_handler,
|
|
658
|
-
)
|
|
659
|
-
|
|
660
|
-
def register_plate_ie(
|
|
661
|
-
self,
|
|
662
|
-
version: str,
|
|
663
|
-
importer: PlateMetaImporter,
|
|
664
|
-
exporter: PlateMetaExporter,
|
|
665
|
-
overwrite: bool = False,
|
|
450
|
+
version: str | None = None,
|
|
666
451
|
):
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
self.
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
452
|
+
self._group_handler = group_handler
|
|
453
|
+
self._version = version
|
|
454
|
+
|
|
455
|
+
# Validate metadata
|
|
456
|
+
_ = self.get_meta()
|
|
457
|
+
# Store the resolved version
|
|
458
|
+
# self._version = meta.version
|
|
459
|
+
|
|
460
|
+
def get_meta(self) -> NgioWellMeta:
|
|
461
|
+
"""Retrieve the NGIO well metadata."""
|
|
462
|
+
return get_ngio_well_meta(
|
|
463
|
+
group_handler=self._group_handler,
|
|
464
|
+
version=self._version,
|
|
676
465
|
)
|
|
677
466
|
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
ImplementedMetaImporterExporter().register_image_ie(
|
|
687
|
-
version="0.4",
|
|
688
|
-
importer=v04_to_ngio_image_meta,
|
|
689
|
-
exporter=ngio_to_v04_image_meta,
|
|
690
|
-
)
|
|
691
|
-
|
|
692
|
-
ImplementedMetaImporterExporter().register_label_ie(
|
|
693
|
-
version="0.5",
|
|
694
|
-
importer=v05_to_ngio_label_meta,
|
|
695
|
-
exporter=ngio_to_v05_label_meta,
|
|
696
|
-
)
|
|
697
|
-
|
|
698
|
-
ImplementedMetaImporterExporter().register_label_ie(
|
|
699
|
-
version="0.4",
|
|
700
|
-
importer=v04_to_ngio_label_meta,
|
|
701
|
-
exporter=ngio_to_v04_label_meta,
|
|
702
|
-
)
|
|
703
|
-
ImplementedMetaImporterExporter().register_image_ie(
|
|
704
|
-
version="0.5",
|
|
705
|
-
importer=v05_to_ngio_image_meta,
|
|
706
|
-
exporter=ngio_to_v05_image_meta,
|
|
707
|
-
)
|
|
708
|
-
|
|
709
|
-
ImplementedMetaImporterExporter().register_well_ie(
|
|
710
|
-
version="0.4", importer=v04_to_ngio_well_meta, exporter=ngio_to_v04_well_meta
|
|
711
|
-
)
|
|
712
|
-
ImplementedMetaImporterExporter().register_well_ie(
|
|
713
|
-
version="0.5", importer=v05_to_ngio_well_meta, exporter=ngio_to_v05_well_meta
|
|
714
|
-
)
|
|
715
|
-
ImplementedMetaImporterExporter().register_plate_ie(
|
|
716
|
-
version="0.4", importer=v04_to_ngio_plate_meta, exporter=ngio_to_v04_plate_meta
|
|
717
|
-
)
|
|
718
|
-
ImplementedMetaImporterExporter().register_plate_ie(
|
|
719
|
-
version="0.5", importer=v05_to_ngio_plate_meta, exporter=ngio_to_v05_plate_meta
|
|
720
|
-
)
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
###########################################################################
|
|
724
|
-
#
|
|
725
|
-
# Public functions to avoid direct access to the importer/exporter
|
|
726
|
-
# registration methods
|
|
727
|
-
#
|
|
728
|
-
###########################################################################
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
def find_image_meta_handler(
|
|
732
|
-
group_handler: ZarrGroupHandler,
|
|
733
|
-
axes_setup: AxesSetup | None = None,
|
|
734
|
-
allow_non_canonical_axes: bool = False,
|
|
735
|
-
strict_canonical_order: bool = True,
|
|
736
|
-
) -> ImageMetaHandler:
|
|
737
|
-
"""Open an image metadata handler."""
|
|
738
|
-
return ImplementedMetaImporterExporter().find_image_handler(
|
|
739
|
-
group_handler=group_handler,
|
|
740
|
-
axes_setup=axes_setup,
|
|
741
|
-
allow_non_canonical_axes=allow_non_canonical_axes,
|
|
742
|
-
strict_canonical_order=strict_canonical_order,
|
|
743
|
-
)
|
|
467
|
+
def update_meta(self, ngio_meta: NgioWellMeta) -> None:
|
|
468
|
+
"""Update the NGIO well metadata."""
|
|
469
|
+
update_ngio_meta(
|
|
470
|
+
group_handler=self._group_handler,
|
|
471
|
+
ngio_meta=ngio_meta,
|
|
472
|
+
)
|
|
744
473
|
|
|
745
474
|
|
|
746
|
-
def
|
|
475
|
+
def get_ngio_labels_group_meta(
|
|
747
476
|
group_handler: ZarrGroupHandler,
|
|
748
|
-
version: str,
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
477
|
+
version: str | None = None,
|
|
478
|
+
) -> NgioLabelsGroupMeta:
|
|
479
|
+
"""Retrieve the NGIO labels group metadata from the Zarr group.
|
|
480
|
+
|
|
481
|
+
Args:
|
|
482
|
+
group_handler (ZarrGroupHandler): The Zarr group handler.
|
|
483
|
+
version (str | None): Optional NGFF version to use for decoding.
|
|
484
|
+
|
|
485
|
+
Returns:
|
|
486
|
+
NgioLabelsGroupMeta: The NGIO labels group metadata.
|
|
487
|
+
"""
|
|
488
|
+
return get_ngio_meta(
|
|
755
489
|
group_handler=group_handler,
|
|
490
|
+
meta_type=NgioLabelsGroupMeta,
|
|
756
491
|
version=version,
|
|
757
|
-
axes_setup=axes_setup,
|
|
758
|
-
allow_non_canonical_axes=allow_non_canonical_axes,
|
|
759
|
-
strict_canonical_order=strict_canonical_order,
|
|
760
|
-
)
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
def find_label_meta_handler(
|
|
764
|
-
group_handler: ZarrGroupHandler,
|
|
765
|
-
axes_setup: AxesSetup | None = None,
|
|
766
|
-
allow_non_canonical_axes: bool = False,
|
|
767
|
-
strict_canonical_order: bool = True,
|
|
768
|
-
) -> LabelMetaHandler:
|
|
769
|
-
"""Open a label metadata handler."""
|
|
770
|
-
return ImplementedMetaImporterExporter().find_label_handler(
|
|
771
|
-
group_handler=group_handler,
|
|
772
|
-
axes_setup=axes_setup,
|
|
773
|
-
allow_non_canonical_axes=allow_non_canonical_axes,
|
|
774
|
-
strict_canonical_order=strict_canonical_order,
|
|
775
492
|
)
|
|
776
493
|
|
|
777
494
|
|
|
778
|
-
def
|
|
495
|
+
def update_ngio_labels_group_meta(
|
|
779
496
|
group_handler: ZarrGroupHandler,
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
strict_canonical_order: bool = True,
|
|
784
|
-
) -> LabelMetaHandler:
|
|
785
|
-
"""Open a label metadata handler."""
|
|
786
|
-
return ImplementedMetaImporterExporter().get_label_meta_handler(
|
|
787
|
-
group_handler=group_handler,
|
|
788
|
-
version=version,
|
|
789
|
-
axes_setup=axes_setup,
|
|
790
|
-
allow_non_canonical_axes=allow_non_canonical_axes,
|
|
791
|
-
strict_canonical_order=strict_canonical_order,
|
|
792
|
-
)
|
|
497
|
+
ngio_meta: NgioLabelsGroupMeta,
|
|
498
|
+
) -> None:
|
|
499
|
+
"""Update the NGIO labels group metadata in the Zarr group.
|
|
793
500
|
|
|
501
|
+
Args:
|
|
502
|
+
group_handler (ZarrGroupHandler): The Zarr group handler.
|
|
503
|
+
ngio_meta (NgioLabelsGroupMeta): The new NGIO labels group metadata.
|
|
794
504
|
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
return ImplementedMetaImporterExporter().find_well_handler(
|
|
505
|
+
"""
|
|
506
|
+
update_ngio_meta(
|
|
798
507
|
group_handler=group_handler,
|
|
508
|
+
ngio_meta=ngio_meta,
|
|
799
509
|
)
|
|
800
510
|
|
|
801
511
|
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
)
|
|
811
|
-
|
|
512
|
+
class LabelsGroupMetaHandler:
|
|
513
|
+
def __init__(
|
|
514
|
+
self,
|
|
515
|
+
group_handler: ZarrGroupHandler,
|
|
516
|
+
version: NgffVersions | None = None,
|
|
517
|
+
):
|
|
518
|
+
self._group_handler = group_handler
|
|
519
|
+
self._version = version
|
|
812
520
|
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
return ImplementedMetaImporterExporter().find_plate_handler(
|
|
816
|
-
group_handler=group_handler
|
|
817
|
-
)
|
|
521
|
+
meta = self.get_meta()
|
|
522
|
+
self._version = meta.version
|
|
818
523
|
|
|
524
|
+
def get_meta(self) -> NgioLabelsGroupMeta:
|
|
525
|
+
"""Retrieve the NGIO labels group metadata."""
|
|
526
|
+
return get_ngio_labels_group_meta(
|
|
527
|
+
group_handler=self._group_handler,
|
|
528
|
+
version=self._version,
|
|
529
|
+
)
|
|
819
530
|
|
|
820
|
-
def
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
group_handler=group_handler,
|
|
827
|
-
version=version,
|
|
828
|
-
)
|
|
531
|
+
def update_meta(self, ngio_meta: NgioLabelsGroupMeta) -> None:
|
|
532
|
+
"""Update the NGIO labels group metadata."""
|
|
533
|
+
update_ngio_labels_group_meta(
|
|
534
|
+
group_handler=self._group_handler,
|
|
535
|
+
ngio_meta=ngio_meta,
|
|
536
|
+
)
|