ngio 0.5.0__py3-none-any.whl → 0.5.0a1__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 (54) hide show
  1. ngio/__init__.py +2 -5
  2. ngio/common/__init__.py +6 -11
  3. ngio/common/_masking_roi.py +54 -34
  4. ngio/common/_pyramid.py +87 -321
  5. ngio/common/_roi.py +330 -258
  6. ngio/experimental/iterators/_feature.py +3 -3
  7. ngio/experimental/iterators/_rois_utils.py +11 -10
  8. ngio/hcs/_plate.py +136 -192
  9. ngio/images/_abstract_image.py +35 -539
  10. ngio/images/_create.py +283 -0
  11. ngio/images/_create_synt_container.py +43 -40
  12. ngio/images/_image.py +251 -517
  13. ngio/images/_label.py +172 -249
  14. ngio/images/_masked_image.py +2 -2
  15. ngio/images/_ome_zarr_container.py +241 -644
  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 +8 -6
  21. ngio/io_pipes/_ops_slices_utils.py +5 -8
  22. ngio/ome_zarr_meta/__init__.py +18 -29
  23. ngio/ome_zarr_meta/_meta_handlers.py +708 -392
  24. ngio/ome_zarr_meta/ngio_specs/__init__.py +0 -4
  25. ngio/ome_zarr_meta/ngio_specs/_axes.py +51 -152
  26. ngio/ome_zarr_meta/ngio_specs/_dataset.py +22 -13
  27. ngio/ome_zarr_meta/ngio_specs/_ngio_hcs.py +91 -129
  28. ngio/ome_zarr_meta/ngio_specs/_ngio_image.py +68 -57
  29. ngio/ome_zarr_meta/v04/__init__.py +1 -5
  30. ngio/ome_zarr_meta/v04/{_v04_spec.py → _v04_spec_utils.py} +85 -54
  31. ngio/ome_zarr_meta/v05/__init__.py +1 -5
  32. ngio/ome_zarr_meta/v05/{_v05_spec.py → _v05_spec_utils.py} +87 -64
  33. ngio/resources/__init__.py +1 -1
  34. ngio/resources/resource_model.py +1 -1
  35. ngio/tables/_tables_container.py +27 -85
  36. ngio/tables/backends/_anndata.py +8 -58
  37. ngio/tables/backends/_anndata_utils.py +6 -1
  38. ngio/tables/backends/_csv.py +19 -3
  39. ngio/tables/backends/_json.py +13 -10
  40. ngio/tables/backends/_non_zarr_backends.py +196 -0
  41. ngio/tables/backends/_parquet.py +31 -3
  42. ngio/tables/v1/_roi_table.py +27 -44
  43. ngio/utils/__init__.py +12 -8
  44. ngio/utils/_datasets.py +0 -6
  45. ngio/utils/_logger.py +50 -0
  46. ngio/utils/_zarr_utils.py +250 -292
  47. {ngio-0.5.0.dist-info → ngio-0.5.0a1.dist-info}/METADATA +6 -13
  48. ngio-0.5.0a1.dist-info/RECORD +88 -0
  49. {ngio-0.5.0.dist-info → ngio-0.5.0a1.dist-info}/WHEEL +1 -1
  50. ngio/images/_create_utils.py +0 -406
  51. ngio/tables/backends/_py_arrow_backends.py +0 -222
  52. ngio/utils/_cache.py +0 -48
  53. ngio-0.5.0.dist-info/RECORD +0 -88
  54. {ngio-0.5.0.dist-info → ngio-0.5.0a1.dist-info}/licenses/LICENSE +0 -0
@@ -7,7 +7,7 @@ import zarr
7
7
  from dask.array import Array as DaskArray
8
8
 
9
9
  from ngio.common._dimensions import Dimensions
10
- from ngio.common._roi import Roi
10
+ from ngio.common._roi import Roi, RoiPixels
11
11
  from ngio.io_pipes._ops_axes import (
12
12
  AxesOps,
13
13
  build_axes_ops,
@@ -72,7 +72,7 @@ class DataGetter(ABC, Generic[T]):
72
72
  slicing_ops: SlicingOps,
73
73
  axes_ops: AxesOps,
74
74
  transforms: Sequence[TransformProtocol] | None = None,
75
- roi: Roi | None = None,
75
+ roi: Roi | RoiPixels | None = None,
76
76
  ) -> None:
77
77
  self._zarr_array = zarr_array
78
78
  self._slicing_ops = slicing_ops
@@ -106,7 +106,7 @@ class DataGetter(ABC, Generic[T]):
106
106
  return self._transforms
107
107
 
108
108
  @property
109
- def roi(self) -> Roi:
109
+ def roi(self) -> Roi | RoiPixels:
110
110
  if self._roi is None:
111
111
  name = self.__class__.__name__
112
112
  raise ValueError(f"No ROI defined for {name}.")
@@ -127,7 +127,7 @@ class DataSetter(ABC, Generic[T]):
127
127
  slicing_ops: SlicingOps,
128
128
  axes_ops: AxesOps,
129
129
  transforms: Sequence[TransformProtocol] | None = None,
130
- roi: Roi | None = None,
130
+ roi: Roi | RoiPixels | None = None,
131
131
  ) -> None:
132
132
  self._zarr_array = zarr_array
133
133
  self._slicing_ops = slicing_ops
@@ -161,7 +161,7 @@ class DataSetter(ABC, Generic[T]):
161
161
  return self._transforms
162
162
 
163
163
  @property
164
- def roi(self) -> Roi:
164
+ def roi(self) -> Roi | RoiPixels:
165
165
  if self._roi is None:
166
166
  name = self.__class__.__name__
167
167
  raise ValueError(f"No ROI defined for {name}.")
@@ -185,7 +185,7 @@ class NumpyGetter(DataGetter[np.ndarray]):
185
185
  transforms: Sequence[TransformProtocol] | None = None,
186
186
  slicing_dict: dict[str, SlicingInputType] | None = None,
187
187
  remove_channel_selection: bool = False,
188
- roi: Roi | None = None,
188
+ roi: Roi | RoiPixels | None = None,
189
189
  ) -> None:
190
190
  """Build a pipe to get a numpy or dask array from a zarr array."""
191
191
  slicing_ops, axes_ops = setup_io_pipe(
@@ -225,7 +225,7 @@ class DaskGetter(DataGetter[DaskArray]):
225
225
  transforms: Sequence[TransformProtocol] | None = None,
226
226
  slicing_dict: dict[str, SlicingInputType] | None = None,
227
227
  remove_channel_selection: bool = False,
228
- roi: Roi | None = None,
228
+ roi: Roi | RoiPixels | None = None,
229
229
  ) -> None:
230
230
  """Build a pipe to get a numpy or dask array from a zarr array."""
231
231
  slicing_ops, axes_ops = setup_io_pipe(
@@ -279,7 +279,7 @@ class NumpySetter(DataSetter[np.ndarray]):
279
279
  transforms: Sequence[TransformProtocol] | None = None,
280
280
  slicing_dict: dict[str, SlicingInputType] | None = None,
281
281
  remove_channel_selection: bool = False,
282
- roi: Roi | None = None,
282
+ roi: Roi | RoiPixels | None = None,
283
283
  ) -> None:
284
284
  """Build a pipe to get a numpy or dask array from a zarr array."""
285
285
  slicing_ops, axes_ops = setup_io_pipe(
@@ -325,7 +325,7 @@ class DaskSetter(DataSetter[DaskArray]):
325
325
  transforms: Sequence[TransformProtocol] | None = None,
326
326
  slicing_dict: dict[str, SlicingInputType] | None = None,
327
327
  remove_channel_selection: bool = False,
328
- roi: Roi | None = None,
328
+ roi: Roi | RoiPixels | None = None,
329
329
  ) -> None:
330
330
  """Build a pipe to get a numpy or dask array from a zarr array."""
331
331
  slicing_ops, axes_ops = setup_io_pipe(
@@ -6,7 +6,7 @@ import zarr
6
6
  from dask.array import Array as DaskArray
7
7
 
8
8
  from ngio.common._dimensions import Dimensions
9
- from ngio.common._roi import Roi
9
+ from ngio.common._roi import Roi, RoiPixels
10
10
  from ngio.io_pipes._io_pipes import (
11
11
  DaskGetter,
12
12
  DaskSetter,
@@ -57,7 +57,7 @@ def _setup_numpy_getters(
57
57
  dimensions: Dimensions,
58
58
  label_zarr_array: zarr.Array,
59
59
  label_dimensions: Dimensions,
60
- roi: Roi,
60
+ roi: Roi | RoiPixels,
61
61
  axes_order: Sequence[str] | None = None,
62
62
  transforms: Sequence[TransformProtocol] | None = None,
63
63
  label_transforms: Sequence[TransformProtocol] | None = None,
@@ -117,7 +117,7 @@ class NumpyGetterMasked(DataGetter[np.ndarray]):
117
117
  dimensions: Dimensions,
118
118
  label_zarr_array: zarr.Array,
119
119
  label_dimensions: Dimensions,
120
- roi: Roi,
120
+ roi: Roi | RoiPixels,
121
121
  axes_order: Sequence[str] | None = None,
122
122
  transforms: Sequence[TransformProtocol] | None = None,
123
123
  label_transforms: Sequence[TransformProtocol] | None = None,
@@ -187,7 +187,7 @@ class NumpySetterMasked(DataSetter[np.ndarray]):
187
187
  dimensions: Dimensions,
188
188
  label_zarr_array: zarr.Array,
189
189
  label_dimensions: Dimensions,
190
- roi: Roi,
190
+ roi: Roi | RoiPixels,
191
191
  axes_order: Sequence[str] | None = None,
192
192
  transforms: Sequence[TransformProtocol] | None = None,
193
193
  label_transforms: Sequence[TransformProtocol] | None = None,
@@ -290,7 +290,7 @@ def _setup_dask_getters(
290
290
  dimensions: Dimensions,
291
291
  label_zarr_array: zarr.Array,
292
292
  label_dimensions: Dimensions,
293
- roi: Roi,
293
+ roi: Roi | RoiPixels,
294
294
  axes_order: Sequence[str] | None = None,
295
295
  transforms: Sequence[TransformProtocol] | None = None,
296
296
  label_transforms: Sequence[TransformProtocol] | None = None,
@@ -350,7 +350,7 @@ class DaskGetterMasked(DataGetter[DaskArray]):
350
350
  dimensions: Dimensions,
351
351
  label_zarr_array: zarr.Array,
352
352
  label_dimensions: Dimensions,
353
- roi: Roi,
353
+ roi: Roi | RoiPixels,
354
354
  axes_order: Sequence[str] | None = None,
355
355
  transforms: Sequence[TransformProtocol] | None = None,
356
356
  label_transforms: Sequence[TransformProtocol] | None = None,
@@ -418,7 +418,7 @@ class DaskSetterMasked(DataSetter[DaskArray]):
418
418
  dimensions: Dimensions,
419
419
  label_zarr_array: zarr.Array,
420
420
  label_dimensions: Dimensions,
421
- roi: Roi,
421
+ roi: Roi | RoiPixels,
422
422
  axes_order: Sequence[str] | None = None,
423
423
  transforms: Sequence[TransformProtocol] | None = None,
424
424
  label_transforms: Sequence[TransformProtocol] | None = None,
@@ -3,7 +3,7 @@ from collections.abc import Sequence
3
3
  import zarr
4
4
 
5
5
  from ngio.common._dimensions import Dimensions
6
- from ngio.common._roi import Roi
6
+ from ngio.common._roi import Roi, RoiPixels
7
7
  from ngio.io_pipes._io_pipes import (
8
8
  DaskGetter,
9
9
  DaskSetter,
@@ -17,7 +17,7 @@ from ngio.ome_zarr_meta.ngio_specs._pixel_size import PixelSize
17
17
 
18
18
  def roi_to_slicing_dict(
19
19
  *,
20
- roi: Roi,
20
+ roi: Roi | RoiPixels,
21
21
  pixel_size: PixelSize,
22
22
  slicing_dict: dict[str, SlicingInputType] | None = None,
23
23
  ) -> dict[str, SlicingInputType]:
@@ -40,7 +40,7 @@ class NumpyRoiGetter(NumpyGetter):
40
40
  *,
41
41
  zarr_array: zarr.Array,
42
42
  dimensions: Dimensions,
43
- roi: Roi,
43
+ roi: Roi | RoiPixels,
44
44
  axes_order: Sequence[str] | None = None,
45
45
  transforms: Sequence[TransformProtocol] | None = None,
46
46
  slicing_dict: dict[str, SlicingInputType] | None = None,
@@ -68,7 +68,7 @@ class DaskRoiGetter(DaskGetter):
68
68
  *,
69
69
  zarr_array: zarr.Array,
70
70
  dimensions: Dimensions,
71
- roi: Roi,
71
+ roi: Roi | RoiPixels,
72
72
  axes_order: Sequence[str] | None = None,
73
73
  transforms: Sequence[TransformProtocol] | None = None,
74
74
  slicing_dict: dict[str, SlicingInputType] | None = None,
@@ -96,7 +96,7 @@ class NumpyRoiSetter(NumpySetter):
96
96
  *,
97
97
  zarr_array: zarr.Array,
98
98
  dimensions: Dimensions,
99
- roi: Roi,
99
+ roi: Roi | RoiPixels,
100
100
  axes_order: Sequence[str] | None = None,
101
101
  transforms: Sequence[TransformProtocol] | None = None,
102
102
  slicing_dict: dict[str, SlicingInputType] | None = None,
@@ -124,7 +124,7 @@ class DaskRoiSetter(DaskSetter):
124
124
  *,
125
125
  zarr_array: zarr.Array,
126
126
  dimensions: Dimensions,
127
- roi: Roi,
127
+ roi: Roi | RoiPixels,
128
128
  axes_order: Sequence[str] | None = None,
129
129
  transforms: Sequence[TransformProtocol] | None = None,
130
130
  slicing_dict: dict[str, SlicingInputType] | None = None,
@@ -3,7 +3,7 @@ from typing import Protocol, TypeVar
3
3
 
4
4
  import zarr
5
5
 
6
- from ngio.common._roi import Roi
6
+ from ngio.common._roi import Roi, RoiPixels
7
7
  from ngio.io_pipes._ops_axes import AxesOps
8
8
  from ngio.io_pipes._ops_slices import SlicingOps
9
9
  from ngio.io_pipes._ops_transforms import TransformProtocol
@@ -26,7 +26,7 @@ class DataGetterProtocol(Protocol[GetterDataType]):
26
26
  def transforms(self) -> Sequence[TransformProtocol] | None: ...
27
27
 
28
28
  @property
29
- def roi(self) -> Roi: ...
29
+ def roi(self) -> Roi | RoiPixels: ...
30
30
 
31
31
  def __call__(self) -> GetterDataType:
32
32
  return self.get()
@@ -48,7 +48,7 @@ class DataSetterProtocol(Protocol[SetterDataType]):
48
48
  def transforms(self) -> Sequence[TransformProtocol] | None: ...
49
49
 
50
50
  @property
51
- def roi(self) -> Roi: ...
51
+ def roi(self) -> Roi | RoiPixels: ...
52
52
 
53
53
  def __call__(self, patch: SetterDataType) -> None:
54
54
  return self.set(patch)
@@ -1,11 +1,10 @@
1
- import warnings
2
1
  from collections.abc import Sequence
3
2
  from enum import Enum
4
3
 
5
4
  import dask.array as da
6
5
  import numpy as np
7
6
 
8
- from ngio.utils import NgioValueError
7
+ from ngio.utils import NgioValueError, ngio_logger
9
8
 
10
9
 
11
10
  class Action(str, Enum):
@@ -29,7 +28,7 @@ def _compute_pad_widths(
29
28
  pad_def.append((before, after))
30
29
  else:
31
30
  pad_def.append((0, 0))
32
- warnings.warn(
31
+ ngio_logger.warning(
33
32
  f"Images have a different shape ({array_shape} vs {target_shape}). "
34
33
  f"Resolving by padding: {pad_def}",
35
34
  stacklevel=2,
@@ -76,7 +75,7 @@ def _compute_trim_slices(
76
75
  else:
77
76
  slices.append(slice(0, s))
78
77
 
79
- warnings.warn(
78
+ ngio_logger.warning(
80
79
  f"Images have a different shape ({array_shape} vs {target_shape}). "
81
80
  f"Resolving by trimming: {slices}",
82
81
  stacklevel=2,
@@ -118,7 +117,7 @@ def _compute_rescaling_shape(
118
117
  rescaling_shape.append(s)
119
118
  factor.append(1.0)
120
119
 
121
- warnings.warn(
120
+ ngio_logger.warning(
122
121
  f"Images have a different shape ({array_shape} vs {target_shape}). "
123
122
  f"Resolving by scaling with factors {factor}.",
124
123
  stacklevel=2,
@@ -266,11 +265,14 @@ def numpy_match_shape(
266
265
  reference_axes (Sequence[str]): The axes names of the reference shape.
267
266
  tolerance (int): The maximum number of pixels by which dimensions
268
267
  can differ when matching shapes.
268
+ allow_broadcast (bool): If True, allow broadcasting new dimensions to
269
+ match the reference shape. If False, single-dimension axes will
270
+ be left as is.
269
271
  pad_mode (str): The mode to use for padding. See numpy.pad for options.
270
272
  pad_values (int | float): The constant value to use for padding if
271
273
  pad_mode is 'constant'.
272
274
  allow_rescaling (bool): If True, when the array differs more than the
273
- tolerance, it will be rescaled to the reference shape. If False,
275
+ tolerance, it will be rescalingd to the reference shape. If False,
274
276
  an error will be raised.
275
277
  """
276
278
  _check_axes(
@@ -1,9 +1,8 @@
1
- import warnings
2
1
  from collections.abc import Iterable, Iterator
3
2
  from itertools import product
4
3
  from typing import TypeAlias, TypeVar
5
4
 
6
- from ngio.utils import NgioValueError
5
+ from ngio.utils import NgioValueError, ngio_logger
7
6
 
8
7
  T = TypeVar("T")
9
8
 
@@ -86,10 +85,9 @@ def check_if_regions_overlap(slices: Iterable[tuple[SlicingType, ...]]) -> bool:
86
85
  return True
87
86
 
88
87
  if it == 10_000:
89
- warnings.warn(
88
+ ngio_logger.warning(
90
89
  "Performance Warning check_for_overlaps is O(n^2) and may be slow for "
91
- "large numbers of regions.",
92
- stacklevel=2,
90
+ "large numbers of regions."
93
91
  )
94
92
  return False
95
93
 
@@ -191,9 +189,8 @@ def check_if_chunks_overlap(
191
189
  if si & sj:
192
190
  return True
193
191
  if it == 10_000:
194
- warnings.warn(
192
+ ngio_logger.warning(
195
193
  "Performance Warning check_for_chunks_overlaps is O(n^2) and may be "
196
- "slow for large numbers of regions.",
197
- stacklevel=2,
194
+ "slow for large numbers of regions."
198
195
  )
199
196
  return False
@@ -3,28 +3,22 @@
3
3
  from ngio.ome_zarr_meta._meta_handlers import (
4
4
  ImageMetaHandler,
5
5
  LabelMetaHandler,
6
- LabelsGroupMetaHandler,
7
- PlateMetaHandler,
8
- WellMetaHandler,
9
- update_ngio_image_meta,
10
- update_ngio_label_meta,
11
- update_ngio_labels_group_meta,
12
- update_ngio_meta,
13
- update_ngio_plate_meta,
14
- update_ngio_well_meta,
6
+ find_image_meta_handler,
7
+ find_label_meta_handler,
8
+ find_plate_meta_handler,
9
+ find_well_meta_handler,
10
+ get_image_meta_handler,
11
+ get_label_meta_handler,
12
+ get_plate_meta_handler,
13
+ get_well_meta_handler,
15
14
  )
16
15
  from ngio.ome_zarr_meta.ngio_specs import (
17
16
  AxesHandler,
18
- Channel,
19
- ChannelsMeta,
20
- ChannelVisualisation,
21
17
  Dataset,
22
- DefaultNgffVersion,
23
18
  ImageInWellPath,
24
19
  NgffVersions,
25
20
  NgioImageMeta,
26
21
  NgioLabelMeta,
27
- NgioLabelsGroupMeta,
28
22
  NgioPlateMeta,
29
23
  NgioWellMeta,
30
24
  PixelSize,
@@ -34,32 +28,27 @@ from ngio.ome_zarr_meta.ngio_specs import (
34
28
 
35
29
  __all__ = [
36
30
  "AxesHandler",
37
- "Channel",
38
- "ChannelVisualisation",
39
- "ChannelsMeta",
40
31
  "Dataset",
41
- "DefaultNgffVersion",
42
32
  "ImageInWellPath",
43
33
  "ImageMetaHandler",
34
+ "ImageMetaHandler",
35
+ "LabelMetaHandler",
44
36
  "LabelMetaHandler",
45
- "LabelsGroupMetaHandler",
46
37
  "NgffVersions",
47
38
  "NgffVersions",
48
39
  "NgioImageMeta",
49
40
  "NgioLabelMeta",
50
- "NgioLabelsGroupMeta",
51
41
  "NgioPlateMeta",
52
42
  "NgioWellMeta",
53
43
  "PixelSize",
54
- "PlateMetaHandler",
55
- "PlateMetaHandler",
56
- "WellMetaHandler",
57
44
  "build_canonical_axes_handler",
45
+ "find_image_meta_handler",
46
+ "find_label_meta_handler",
47
+ "find_plate_meta_handler",
48
+ "find_well_meta_handler",
49
+ "get_image_meta_handler",
50
+ "get_label_meta_handler",
51
+ "get_plate_meta_handler",
52
+ "get_well_meta_handler",
58
53
  "path_in_well_validation",
59
- "update_ngio_image_meta",
60
- "update_ngio_label_meta",
61
- "update_ngio_labels_group_meta",
62
- "update_ngio_meta",
63
- "update_ngio_plate_meta",
64
- "update_ngio_well_meta",
65
54
  ]