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.
Files changed (56) hide show
  1. ngio/__init__.py +5 -2
  2. ngio/common/__init__.py +11 -6
  3. ngio/common/_masking_roi.py +34 -54
  4. ngio/common/_pyramid.py +322 -75
  5. ngio/common/_roi.py +258 -330
  6. ngio/experimental/iterators/_feature.py +3 -3
  7. ngio/experimental/iterators/_rois_utils.py +10 -11
  8. ngio/hcs/_plate.py +192 -136
  9. ngio/images/_abstract_image.py +539 -35
  10. ngio/images/_create_synt_container.py +45 -47
  11. ngio/images/_create_utils.py +406 -0
  12. ngio/images/_image.py +524 -248
  13. ngio/images/_label.py +257 -180
  14. ngio/images/_masked_image.py +2 -2
  15. ngio/images/_ome_zarr_container.py +658 -255
  16. ngio/io_pipes/_io_pipes.py +9 -9
  17. ngio/io_pipes/_io_pipes_masked.py +7 -7
  18. ngio/io_pipes/_io_pipes_roi.py +6 -6
  19. ngio/io_pipes/_io_pipes_types.py +3 -3
  20. ngio/io_pipes/_match_shape.py +6 -8
  21. ngio/io_pipes/_ops_slices_utils.py +8 -5
  22. ngio/ome_zarr_meta/__init__.py +29 -18
  23. ngio/ome_zarr_meta/_meta_handlers.py +402 -689
  24. ngio/ome_zarr_meta/ngio_specs/__init__.py +4 -0
  25. ngio/ome_zarr_meta/ngio_specs/_axes.py +152 -51
  26. ngio/ome_zarr_meta/ngio_specs/_dataset.py +13 -22
  27. ngio/ome_zarr_meta/ngio_specs/_ngio_hcs.py +129 -91
  28. ngio/ome_zarr_meta/ngio_specs/_ngio_image.py +69 -69
  29. ngio/ome_zarr_meta/v04/__init__.py +5 -1
  30. ngio/ome_zarr_meta/v04/{_v04_spec_utils.py → _v04_spec.py} +55 -86
  31. ngio/ome_zarr_meta/v05/__init__.py +27 -0
  32. ngio/ome_zarr_meta/v05/_custom_models.py +18 -0
  33. ngio/ome_zarr_meta/v05/_v05_spec.py +495 -0
  34. ngio/resources/__init__.py +1 -1
  35. ngio/resources/resource_model.py +1 -1
  36. ngio/tables/_tables_container.py +82 -24
  37. ngio/tables/backends/_abstract_backend.py +7 -0
  38. ngio/tables/backends/_anndata.py +60 -7
  39. ngio/tables/backends/_anndata_utils.py +2 -4
  40. ngio/tables/backends/_csv.py +3 -19
  41. ngio/tables/backends/_json.py +10 -13
  42. ngio/tables/backends/_parquet.py +3 -31
  43. ngio/tables/backends/_py_arrow_backends.py +222 -0
  44. ngio/tables/backends/_utils.py +1 -1
  45. ngio/tables/v1/_roi_table.py +41 -24
  46. ngio/utils/__init__.py +8 -12
  47. ngio/utils/_cache.py +48 -0
  48. ngio/utils/_zarr_utils.py +354 -236
  49. {ngio-0.4.8.dist-info → ngio-0.5.0.dist-info}/METADATA +12 -5
  50. ngio-0.5.0.dist-info/RECORD +88 -0
  51. ngio/images/_create.py +0 -276
  52. ngio/tables/backends/_non_zarr_backends.py +0 -196
  53. ngio/utils/_logger.py +0 -50
  54. ngio-0.4.8.dist-info/RECORD +0 -85
  55. {ngio-0.4.8.dist-info → ngio-0.5.0.dist-info}/WHEEL +0 -0
  56. {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 typing import Generic, Protocol, TypeVar
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
- ConverterError = ValidationError | Exception | None
31
-
32
- ###########################################################################
33
- #
34
- # The code below implements a generic class for handling OME-Zarr metadata
35
- # in Zarr groups.
36
- #
37
- ###########################################################################
38
-
39
-
40
- class ImageMetaImporter(Protocol):
41
- @staticmethod
42
- def __call__(
43
- metadata: dict,
44
- axes_setup: AxesSetup | None = None,
45
- allow_non_canonical_axes: bool = False,
46
- strict_canonical_order: bool = True,
47
- ) -> tuple[bool, NgioImageMeta | ConverterError]:
48
- """Convert the metadata to a NgioImageMeta object.
49
-
50
- Args:
51
- metadata (dict): The metadata (typically from a Zarr group .attrs).
52
- axes_setup (AxesSetup, optional): The axes setup.
53
- This is used to map axes with non-canonical names.
54
- allow_non_canonical_axes (bool, optional): Whether to allow non-canonical
55
- axes.
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
- class WellMetaExporter(Protocol):
111
- def __call__(self, metadata: NgioWellMeta) -> dict: ...
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
- class PlateMetaImporter(Protocol):
115
- def __call__(
116
- self, metadata: dict
117
- ) -> tuple[bool, NgioPlateMeta | ConverterError]: ...
168
+ ##################################################
169
+ #
170
+ # Concrete implementations for NGIO metadata types
171
+ #
172
+ ##################################################
118
173
 
119
174
 
120
- class PlateMetaExporter(Protocol):
121
- def __call__(self, metadata: NgioPlateMeta) -> dict: ...
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
- # Image and label metadata handlers
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
- _image_meta = TypeVar("_image_meta", NgioImageMeta, NgioLabelMeta)
131
- _image_meta_importer = TypeVar(
132
- "_image_meta_importer", ImageMetaImporter, LabelMetaImporter
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._meta_importer = meta_importer
168
- self._meta_exporter = meta_exporter
224
+ self._version = version
169
225
  self._axes_setup = axes_setup
170
- self._allow_non_canonical_axes = allow_non_canonical_axes
171
- self._strict_canonical_order = strict_canonical_order
172
-
173
- def _load_meta(self, return_error: bool = False):
174
- """Load the metadata from the store."""
175
- attrs = self._group_handler.load_attrs()
176
- is_valid, meta_or_error = self._meta_importer(
177
- metadata=attrs,
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
- class ImageMetaHandler(
205
- GenericMetaHandler[NgioImageMeta, ImageMetaImporter, ImageMetaExporter]
206
- ):
207
- """Generic class for handling OME-Zarr metadata in Zarr groups."""
208
-
209
- @property
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
- def safe_load_meta(self) -> NgioLabelMeta | ConverterError:
234
- """Load the metadata from the store."""
235
- return self._load_meta(return_error=True)
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
- # Well and plate metadata handlers
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
- _hcs_meta = TypeVar("_hcs_meta", NgioWellMeta, NgioPlateMeta)
245
- _hcs_meta_importer = TypeVar("_hcs_meta_importer", WellMetaImporter, PlateMetaImporter)
246
- _hcs_meta_exporter = TypeVar("_hcs_meta_exporter", WellMetaExporter, PlateMetaExporter)
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._meta_importer = meta_importer
260
- self._meta_exporter = meta_exporter
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
- def safe_load_meta(self) -> NgioWellMeta | ConverterError:
299
- """Load the metadata from the store."""
300
- return self._load_meta(return_error=True)
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
- class PlateMetaHandler(
304
- GenericHCSMetaHandler[NgioPlateMeta, PlateMetaImporter, PlateMetaExporter]
305
- ):
306
- """Generic class for handling OME-Zarr metadata in Zarr groups."""
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
- def safe_load_meta(self) -> NgioPlateMeta | ConverterError:
316
- """Load the metadata from the store."""
317
- return self._load_meta(return_error=True)
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
- # Metadata importer/exporter registration & builder classes
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
- _meta_exporter = TypeVar(
328
- "_meta_exporter",
329
- ImageMetaExporter,
330
- LabelMetaExporter,
331
- WellMetaExporter,
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 _ImporterExporter(Generic[_meta_importer, _meta_exporter]):
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
- """Register an importer/exporter."""
468
- ie_dict = self.__getattribute__(_ie_name)
469
- if version in ie_dict and not overwrite:
470
- raise NgioValueError(
471
- f"Importer/exporter for version {version} already exists. "
472
- "Use 'overwrite=True' to overwrite."
473
- )
474
- ie_dict[version] = importer
475
-
476
- def register_image_ie(
477
- self,
478
- version: str,
479
- importer: ImageMetaImporter,
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 find_label_handler(
495
- self,
496
- group_handler: ZarrGroupHandler,
497
- axes_setup: AxesSetup | None = None,
498
- allow_non_canonical_axes: bool = False,
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
- def register_label_ie(
534
- self,
535
- version: str,
536
- importer: LabelMetaImporter,
537
- exporter: LabelMetaExporter,
538
- overwrite: bool = False,
539
- ):
540
- """Register an importer/exporter."""
541
- importer_exporter = LabelImporterExporter(
542
- version=version, importer=importer, exporter=exporter
543
- )
544
- self._register(
545
- version=version,
546
- importer=importer_exporter,
547
- overwrite=overwrite,
548
- _ie_name="_label_ie",
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
- def find_well_handler(
579
- self,
580
- group_handler: ZarrGroupHandler,
581
- ) -> WellMetaHandler:
582
- """Get a well metadata handler."""
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
- def get_well_meta_handler(
590
- self,
591
- group_handler: ZarrGroupHandler,
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
- def register_well_ie(
606
- self,
607
- version: str,
608
- importer: WellMetaImporter,
609
- exporter: WellMetaExporter,
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
- def get_plate_meta_handler(
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
- """Register an importer/exporter."""
658
- importer_exporter = PlateImporterExporter(
659
- version=version, importer=importer, exporter=exporter
660
- )
661
- self._register(
662
- version=version,
663
- importer=importer_exporter,
664
- overwrite=overwrite,
665
- _ie_name="_plate_ie",
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
- # Register metadata importers/exporters
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 get_image_meta_handler(
451
+ def get_ngio_labels_group_meta(
718
452
  group_handler: ZarrGroupHandler,
719
- version: str,
720
- axes_setup: AxesSetup | None = None,
721
- allow_non_canonical_axes: bool = False,
722
- strict_canonical_order: bool = True,
723
- ) -> ImageMetaHandler:
724
- """Open an image metadata handler."""
725
- return ImplementedMetaImporterExporter().get_image_meta_handler(
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 find_label_meta_handler(
471
+ def update_ngio_labels_group_meta(
735
472
  group_handler: ZarrGroupHandler,
736
- axes_setup: AxesSetup | None = None,
737
- allow_non_canonical_axes: bool = False,
738
- strict_canonical_order: bool = True,
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
- def get_label_meta_handler(
750
- group_handler: ZarrGroupHandler,
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
- version=version,
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
- def find_well_meta_handler(group_handler: ZarrGroupHandler) -> WellMetaHandler:
767
- """Open a well metadata handler."""
768
- return ImplementedMetaImporterExporter().find_well_handler(
769
- group_handler=group_handler,
770
- )
771
-
772
-
773
- def get_well_meta_handler(
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
- def find_plate_meta_handler(group_handler: ZarrGroupHandler) -> PlateMetaHandler:
785
- """Open a plate metadata handler."""
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 get_plate_meta_handler(
792
- group_handler: ZarrGroupHandler,
793
- version: str,
794
- ) -> PlateMetaHandler:
795
- """Open a plate metadata handler."""
796
- return ImplementedMetaImporterExporter().get_plate_meta_handler(
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
+ )