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