ngio 0.2.0a2__py3-none-any.whl → 0.5.0b4__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 (106) hide show
  1. ngio/__init__.py +40 -12
  2. ngio/common/__init__.py +16 -32
  3. ngio/common/_dimensions.py +270 -48
  4. ngio/common/_masking_roi.py +153 -0
  5. ngio/common/_pyramid.py +267 -73
  6. ngio/common/_roi.py +290 -66
  7. ngio/common/_synt_images_utils.py +101 -0
  8. ngio/common/_zoom.py +54 -22
  9. ngio/experimental/__init__.py +5 -0
  10. ngio/experimental/iterators/__init__.py +15 -0
  11. ngio/experimental/iterators/_abstract_iterator.py +390 -0
  12. ngio/experimental/iterators/_feature.py +189 -0
  13. ngio/experimental/iterators/_image_processing.py +130 -0
  14. ngio/experimental/iterators/_mappers.py +48 -0
  15. ngio/experimental/iterators/_rois_utils.py +126 -0
  16. ngio/experimental/iterators/_segmentation.py +235 -0
  17. ngio/hcs/__init__.py +17 -58
  18. ngio/hcs/_plate.py +1354 -0
  19. ngio/images/__init__.py +30 -9
  20. ngio/images/_abstract_image.py +968 -0
  21. ngio/images/_create_synt_container.py +132 -0
  22. ngio/images/_create_utils.py +423 -0
  23. ngio/images/_image.py +926 -0
  24. ngio/images/_label.py +417 -0
  25. ngio/images/_masked_image.py +531 -0
  26. ngio/images/_ome_zarr_container.py +1235 -0
  27. ngio/images/_table_ops.py +471 -0
  28. ngio/io_pipes/__init__.py +75 -0
  29. ngio/io_pipes/_io_pipes.py +361 -0
  30. ngio/io_pipes/_io_pipes_masked.py +488 -0
  31. ngio/io_pipes/_io_pipes_roi.py +146 -0
  32. ngio/io_pipes/_io_pipes_types.py +56 -0
  33. ngio/io_pipes/_match_shape.py +377 -0
  34. ngio/io_pipes/_ops_axes.py +344 -0
  35. ngio/io_pipes/_ops_slices.py +411 -0
  36. ngio/io_pipes/_ops_slices_utils.py +199 -0
  37. ngio/io_pipes/_ops_transforms.py +104 -0
  38. ngio/io_pipes/_zoom_transform.py +180 -0
  39. ngio/ome_zarr_meta/__init__.py +39 -15
  40. ngio/ome_zarr_meta/_meta_handlers.py +490 -96
  41. ngio/ome_zarr_meta/ngio_specs/__init__.py +24 -10
  42. ngio/ome_zarr_meta/ngio_specs/_axes.py +268 -234
  43. ngio/ome_zarr_meta/ngio_specs/_channels.py +125 -41
  44. ngio/ome_zarr_meta/ngio_specs/_dataset.py +42 -87
  45. ngio/ome_zarr_meta/ngio_specs/_ngio_hcs.py +536 -2
  46. ngio/ome_zarr_meta/ngio_specs/_ngio_image.py +202 -198
  47. ngio/ome_zarr_meta/ngio_specs/_pixel_size.py +72 -34
  48. ngio/ome_zarr_meta/v04/__init__.py +21 -5
  49. ngio/ome_zarr_meta/v04/_custom_models.py +18 -0
  50. ngio/ome_zarr_meta/v04/{_v04_spec_utils.py → _v04_spec.py} +151 -90
  51. ngio/ome_zarr_meta/v05/__init__.py +27 -0
  52. ngio/ome_zarr_meta/v05/_custom_models.py +18 -0
  53. ngio/ome_zarr_meta/v05/_v05_spec.py +511 -0
  54. ngio/resources/20200812-CardiomyocyteDifferentiation14-Cycle1_B03/mask.png +0 -0
  55. ngio/resources/20200812-CardiomyocyteDifferentiation14-Cycle1_B03/nuclei.png +0 -0
  56. ngio/resources/20200812-CardiomyocyteDifferentiation14-Cycle1_B03/raw.jpg +0 -0
  57. ngio/resources/__init__.py +55 -0
  58. ngio/resources/resource_model.py +36 -0
  59. ngio/tables/__init__.py +20 -4
  60. ngio/tables/_abstract_table.py +270 -0
  61. ngio/tables/_tables_container.py +449 -0
  62. ngio/tables/backends/__init__.py +50 -1
  63. ngio/tables/backends/_abstract_backend.py +200 -31
  64. ngio/tables/backends/_anndata.py +139 -0
  65. ngio/tables/backends/_anndata_utils.py +10 -114
  66. ngio/tables/backends/_csv.py +19 -0
  67. ngio/tables/backends/_json.py +92 -0
  68. ngio/tables/backends/_parquet.py +19 -0
  69. ngio/tables/backends/_py_arrow_backends.py +222 -0
  70. ngio/tables/backends/_table_backends.py +162 -38
  71. ngio/tables/backends/_utils.py +608 -0
  72. ngio/tables/v1/__init__.py +19 -4
  73. ngio/tables/v1/_condition_table.py +71 -0
  74. ngio/tables/v1/_feature_table.py +79 -115
  75. ngio/tables/v1/_generic_table.py +21 -90
  76. ngio/tables/v1/_roi_table.py +486 -137
  77. ngio/transforms/__init__.py +5 -0
  78. ngio/transforms/_zoom.py +19 -0
  79. ngio/utils/__init__.py +16 -14
  80. ngio/utils/_cache.py +48 -0
  81. ngio/utils/_datasets.py +121 -13
  82. ngio/utils/_fractal_fsspec_store.py +42 -0
  83. ngio/utils/_zarr_utils.py +374 -218
  84. ngio-0.5.0b4.dist-info/METADATA +147 -0
  85. ngio-0.5.0b4.dist-info/RECORD +88 -0
  86. {ngio-0.2.0a2.dist-info → ngio-0.5.0b4.dist-info}/WHEEL +1 -1
  87. ngio/common/_array_pipe.py +0 -160
  88. ngio/common/_axes_transforms.py +0 -63
  89. ngio/common/_common_types.py +0 -5
  90. ngio/common/_slicer.py +0 -97
  91. ngio/images/abstract_image.py +0 -240
  92. ngio/images/create.py +0 -251
  93. ngio/images/image.py +0 -389
  94. ngio/images/label.py +0 -236
  95. ngio/images/omezarr_container.py +0 -535
  96. ngio/ome_zarr_meta/_generic_handlers.py +0 -320
  97. ngio/ome_zarr_meta/v04/_meta_handlers.py +0 -54
  98. ngio/tables/_validators.py +0 -192
  99. ngio/tables/backends/_anndata_v1.py +0 -75
  100. ngio/tables/backends/_json_v1.py +0 -56
  101. ngio/tables/tables_container.py +0 -300
  102. ngio/tables/v1/_masking_roi_table.py +0 -175
  103. ngio/utils/_logger.py +0 -29
  104. ngio-0.2.0a2.dist-info/METADATA +0 -95
  105. ngio-0.2.0a2.dist-info/RECORD +0 -53
  106. {ngio-0.2.0a2.dist-info → ngio-0.5.0b4.dist-info}/licenses/LICENSE +0 -0
@@ -1,142 +1,536 @@
1
- from typing import Any, Generic, TypeVar
1
+ """Base class for handling OME-NGFF metadata in Zarr groups."""
2
2
 
3
- from pydantic import ValidationError
3
+ from collections.abc import Callable
4
+ from typing import TypeVar
4
5
 
5
- from ngio.ome_zarr_meta._generic_handlers import (
6
- ImageMetaHandler,
7
- LabelMetaHandler,
6
+ from ngio.ome_zarr_meta.ngio_specs import (
7
+ AxesSetup,
8
+ NgioImageMeta,
9
+ NgioLabelMeta,
10
+ NgioLabelsGroupMeta,
11
+ NgioPlateMeta,
12
+ NgioWellMeta,
13
+ )
14
+ from ngio.ome_zarr_meta.ngio_specs._ngio_image import NgffVersions
15
+ from ngio.ome_zarr_meta.v04 import (
16
+ ngio_to_v04_image_meta,
17
+ ngio_to_v04_label_meta,
18
+ ngio_to_v04_labels_group_meta,
19
+ ngio_to_v04_plate_meta,
20
+ ngio_to_v04_well_meta,
21
+ v04_to_ngio_image_meta,
22
+ v04_to_ngio_label_meta,
23
+ v04_to_ngio_labels_group_meta,
24
+ v04_to_ngio_plate_meta,
25
+ v04_to_ngio_well_meta,
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,
8
38
  )
9
- from ngio.ome_zarr_meta.ngio_specs import AxesSetup
10
- from ngio.ome_zarr_meta.v04 import V04ImageMetaHandler, V04LabelMetaHandler
11
39
  from ngio.utils import (
12
- AccessModeLiteral,
13
40
  NgioValidationError,
14
41
  NgioValueError,
15
- StoreOrGroup,
16
42
  ZarrGroupHandler,
17
43
  )
18
44
 
19
- _Image_or_Label_Plugin = TypeVar(
20
- "_Image_or_Label_Plugin", ImageMetaHandler, LabelMetaHandler
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,
21
70
  )
22
71
 
23
72
 
24
- class _ImplementedMetaHandlers(Generic[_Image_or_Label_Plugin]):
25
- """This class is a singleton that manages the available image handler plugins."""
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)
166
+
167
+
168
+ ##################################################
169
+ #
170
+ # Concrete implementations for NGIO metadata types
171
+ #
172
+ ##################################################
173
+
174
+
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
+ )
202
+
26
203
 
27
- _instance = None
28
- _implemented_handlers: dict[str, Any]
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.
29
209
 
30
- def __new__(cls):
31
- """Create a new instance of the class if it does not exist."""
32
- if cls._instance is None:
33
- cls._instance = super().__new__(cls)
34
- cls._instance._implemented_handlers = {}
35
- return cls._instance
210
+ Args:
211
+ group_handler (ZarrGroupHandler): The Zarr group handler.
212
+ ngio_meta (NgioImageMeta): The new NGIO image metadata.
36
213
 
37
- def available_handlers(self) -> list[str]:
38
- """Get the available image handler versions.
214
+ """
215
+ update_ngio_meta(
216
+ group_handler=group_handler,
217
+ ngio_meta=ngio_meta,
218
+ )
39
219
 
40
- The versions are returned in descending order.
41
- such that the latest version is the first in the list and the fist to be
42
- checked.
43
- """
44
- return list(reversed(self._implemented_handlers.keys()))
45
220
 
46
- def find_meta_handler(
221
+ class ImageMetaHandler:
222
+ def __init__(
47
223
  self,
48
224
  group_handler: ZarrGroupHandler,
225
+ version: str | None = None,
49
226
  axes_setup: AxesSetup | None = None,
50
227
  allow_non_canonical_axes: bool = False,
51
228
  strict_canonical_order: bool = True,
52
- ) -> _Image_or_Label_Plugin:
53
- """Try to get a handler for the given store based on the metadata version."""
54
- _errors = {}
55
-
56
- for version, handler in reversed(self._implemented_handlers.items()):
57
- handler = handler(
58
- group_handler=group_handler,
59
- axes_setup=axes_setup,
60
- allow_non_canonical_axes=allow_non_canonical_axes,
61
- strict_canonical_order=strict_canonical_order,
62
- )
63
- meta = handler.safe_load_meta()
64
- if isinstance(meta, ValidationError):
65
- _errors[version] = meta
66
- continue
67
- return handler
68
-
69
- raise NgioValidationError(
70
- f"Could not load OME-Zarr metadata from any known version. "
71
- f"Errors: {_errors}"
229
+ ):
230
+ self._group_handler = group_handler
231
+ self._version = version
232
+ self._axes_setup = axes_setup
233
+ self._allow_non_canonical_axes = allow_non_canonical_axes
234
+ self._strict_canonical_order = strict_canonical_order
235
+
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,
246
+ axes_setup=self._axes_setup,
247
+ allow_non_canonical_axes=self._allow_non_canonical_axes,
248
+ strict_canonical_order=self._strict_canonical_order,
72
249
  )
73
250
 
74
- def get_handler(
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
+ )
257
+
258
+
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
+ )
286
+
287
+
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.
293
+
294
+ Args:
295
+ group_handler (ZarrGroupHandler): The Zarr group handler.
296
+ ngio_meta (NgioLabelMeta): The new NGIO label metadata.
297
+
298
+ """
299
+ update_ngio_meta(
300
+ group_handler=group_handler,
301
+ ngio_meta=ngio_meta,
302
+ )
303
+
304
+
305
+ class LabelMetaHandler:
306
+ def __init__(
75
307
  self,
76
- version: str,
77
308
  group_handler: ZarrGroupHandler,
309
+ version: str | None = None,
78
310
  axes_setup: AxesSetup | None = None,
79
311
  allow_non_canonical_axes: bool = False,
80
312
  strict_canonical_order: bool = True,
81
- ) -> _Image_or_Label_Plugin:
82
- """Get a handler for a specific version."""
83
- if version not in self._implemented_handlers:
84
- raise NgioValueError(f"Image handler for version {version} does not exist.")
85
- return self._implemented_handlers[version](
86
- group_handler=group_handler,
87
- axes_setup=axes_setup,
88
- allow_non_canonical_axes=allow_non_canonical_axes,
89
- strict_canonical_order=strict_canonical_order,
313
+ ):
314
+ self._group_handler = group_handler
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
319
+
320
+ # Validate metadata
321
+ meta = self.get_meta()
322
+ # Store the resolved version
323
+ self._version = meta.version
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,
90
333
  )
91
334
 
92
- def add_handler(
93
- self, key: str, handler: type[_Image_or_Label_Plugin], overwrite: bool = False
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
+ )
341
+
342
+
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
+ )
361
+
362
+
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.
368
+
369
+ Args:
370
+ group_handler (ZarrGroupHandler): The Zarr group handler.
371
+ ngio_meta (NgioPlateMeta): The new NGIO plate metadata.
372
+
373
+ """
374
+ update_ngio_meta(
375
+ group_handler=group_handler,
376
+ ngio_meta=ngio_meta,
377
+ )
378
+
379
+
380
+ class PlateMetaHandler:
381
+ def __init__(
382
+ self,
383
+ group_handler: ZarrGroupHandler,
384
+ version: str | None = None,
94
385
  ):
95
- """Register a new handler."""
96
- if key in self._implemented_handlers and not overwrite:
97
- raise NgioValueError(f"Image handler for version {key} already exists.")
98
- self._implemented_handlers[key] = handler
386
+ self._group_handler = group_handler
387
+ self._version = version
99
388
 
389
+ # Validate metadata
390
+ _ = self.get_meta()
391
+ # Store the resolved version
392
+ # self._version = meta.version
100
393
 
101
- class ImplementedImageMetaHandlers(_ImplementedMetaHandlers[ImageMetaHandler]):
102
- def __init__(self):
103
- super().__init__()
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,
399
+ )
400
+
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,
406
+ )
104
407
 
105
408
 
106
- ImplementedImageMetaHandlers().add_handler("0.4", V04ImageMetaHandler)
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.
107
414
 
415
+ Args:
416
+ group_handler (ZarrGroupHandler): The Zarr group handler.
417
+ version (str | None): Optional NGFF version to use for decoding.
108
418
 
109
- class ImplementedLabelMetaHandlers(_ImplementedMetaHandlers[LabelMetaHandler]):
110
- def __init__(self):
111
- super().__init__()
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
+ )
112
427
 
113
428
 
114
- ImplementedLabelMetaHandlers().add_handler("0.4", V04LabelMetaHandler)
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.
115
434
 
435
+ Args:
436
+ group_handler (ZarrGroupHandler): The Zarr group handler.
437
+ ngio_meta (NgioWellMeta): The new NGIO well metadata.
116
438
 
117
- def open_image_meta_handler(
118
- store: StoreOrGroup,
119
- cache: bool = False,
120
- mode: AccessModeLiteral = "a",
121
- axes_setup: AxesSetup | None = None,
122
- allow_non_canonical_axes: bool = False,
123
- strict_canonical_order: bool = True,
124
- ) -> ImageMetaHandler:
125
- """Open the metadata of an OME-Zarr image.
439
+ """
440
+ update_ngio_meta(
441
+ group_handler=group_handler,
442
+ ngio_meta=ngio_meta,
443
+ )
444
+
445
+
446
+ class WellMetaHandler:
447
+ def __init__(
448
+ self,
449
+ group_handler: ZarrGroupHandler,
450
+ version: str | None = None,
451
+ ):
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,
465
+ )
466
+
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
+ )
473
+
474
+
475
+ def get_ngio_labels_group_meta(
476
+ group_handler: ZarrGroupHandler,
477
+ version: str | None = None,
478
+ ) -> NgioLabelsGroupMeta:
479
+ """Retrieve the NGIO labels group metadata from the Zarr group.
126
480
 
127
481
  Args:
128
- store: The Zarr store or group where the model is
129
- cache: Whether to cache the metadata.
130
- mode: The store access mode.
131
- axes_setup: The axes setup. This is used to map axes with
132
- a non-canonical name to a canonical name.
133
- allow_non_canonical_axes: Whether to allow non-canonical axes.
134
- strict_canonical_order: Whether to enforce strict canonical order.
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.
135
487
  """
136
- zarr_group_handler = ZarrGroupHandler(store, cache, mode)
137
- return ImplementedImageMetaHandlers().find_meta_handler(
138
- zarr_group_handler,
139
- axes_setup=axes_setup,
140
- allow_non_canonical_axes=allow_non_canonical_axes,
141
- strict_canonical_order=strict_canonical_order,
488
+ return get_ngio_meta(
489
+ group_handler=group_handler,
490
+ meta_type=NgioLabelsGroupMeta,
491
+ version=version,
142
492
  )
493
+
494
+
495
+ def update_ngio_labels_group_meta(
496
+ group_handler: ZarrGroupHandler,
497
+ ngio_meta: NgioLabelsGroupMeta,
498
+ ) -> None:
499
+ """Update the NGIO labels group metadata in the Zarr group.
500
+
501
+ Args:
502
+ group_handler (ZarrGroupHandler): The Zarr group handler.
503
+ ngio_meta (NgioLabelsGroupMeta): The new NGIO labels group metadata.
504
+
505
+ """
506
+ update_ngio_meta(
507
+ group_handler=group_handler,
508
+ ngio_meta=ngio_meta,
509
+ )
510
+
511
+
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
520
+
521
+ meta = self.get_meta()
522
+ self._version = meta.version
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
+ )
530
+
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
+ )