ngio 0.4.0a2__py3-none-any.whl → 0.4.0a4__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 (51) hide show
  1. ngio/__init__.py +1 -2
  2. ngio/common/__init__.py +2 -51
  3. ngio/common/_dimensions.py +223 -64
  4. ngio/common/_pyramid.py +42 -23
  5. ngio/common/_roi.py +94 -418
  6. ngio/common/_zoom.py +32 -7
  7. ngio/experimental/iterators/_abstract_iterator.py +2 -2
  8. ngio/experimental/iterators/_feature.py +10 -15
  9. ngio/experimental/iterators/_image_processing.py +18 -28
  10. ngio/experimental/iterators/_rois_utils.py +6 -6
  11. ngio/experimental/iterators/_segmentation.py +38 -54
  12. ngio/images/_abstract_image.py +136 -94
  13. ngio/images/_create.py +16 -0
  14. ngio/images/_create_synt_container.py +10 -0
  15. ngio/images/_image.py +33 -9
  16. ngio/images/_label.py +24 -3
  17. ngio/images/_masked_image.py +60 -81
  18. ngio/images/_ome_zarr_container.py +34 -1
  19. ngio/io_pipes/__init__.py +49 -0
  20. ngio/io_pipes/_io_pipes.py +286 -0
  21. ngio/io_pipes/_io_pipes_masked.py +481 -0
  22. ngio/io_pipes/_io_pipes_roi.py +143 -0
  23. ngio/io_pipes/_io_pipes_utils.py +299 -0
  24. ngio/io_pipes/_match_shape.py +376 -0
  25. ngio/io_pipes/_ops_axes.py +146 -0
  26. ngio/io_pipes/_ops_slices.py +218 -0
  27. ngio/io_pipes/_ops_transforms.py +104 -0
  28. ngio/io_pipes/_zoom_transform.py +175 -0
  29. ngio/ome_zarr_meta/__init__.py +6 -2
  30. ngio/ome_zarr_meta/ngio_specs/__init__.py +6 -4
  31. ngio/ome_zarr_meta/ngio_specs/_axes.py +182 -70
  32. ngio/ome_zarr_meta/ngio_specs/_dataset.py +47 -121
  33. ngio/ome_zarr_meta/ngio_specs/_ngio_image.py +30 -22
  34. ngio/ome_zarr_meta/ngio_specs/_pixel_size.py +17 -1
  35. ngio/ome_zarr_meta/v04/_v04_spec_utils.py +33 -30
  36. ngio/resources/20200812-CardiomyocyteDifferentiation14-Cycle1_B03/nuclei.png +0 -0
  37. ngio/resources/__init__.py +1 -0
  38. ngio/resources/resource_model.py +1 -0
  39. ngio/tables/v1/_roi_table.py +11 -3
  40. ngio/{common/transforms → transforms}/__init__.py +1 -1
  41. ngio/transforms/_zoom.py +19 -0
  42. ngio/utils/_zarr_utils.py +5 -1
  43. {ngio-0.4.0a2.dist-info → ngio-0.4.0a4.dist-info}/METADATA +1 -1
  44. ngio-0.4.0a4.dist-info/RECORD +83 -0
  45. ngio/common/_array_io_pipes.py +0 -554
  46. ngio/common/_array_io_utils.py +0 -508
  47. ngio/common/transforms/_label.py +0 -12
  48. ngio/common/transforms/_zoom.py +0 -109
  49. ngio-0.4.0a2.dist-info/RECORD +0 -76
  50. {ngio-0.4.0a2.dist-info → ngio-0.4.0a4.dist-info}/WHEEL +0 -0
  51. {ngio-0.4.0a2.dist-info → ngio-0.4.0a4.dist-info}/licenses/LICENSE +0 -0
@@ -17,7 +17,7 @@ from ngio.ome_zarr_meta.ngio_specs._axes import (
17
17
  DefaultTimeUnit,
18
18
  SpaceUnits,
19
19
  TimeUnits,
20
- canonical_axes,
20
+ build_canonical_axes_handler,
21
21
  )
22
22
  from ngio.ome_zarr_meta.ngio_specs._channels import ChannelsMeta
23
23
  from ngio.ome_zarr_meta.ngio_specs._dataset import Dataset
@@ -55,13 +55,13 @@ class AbstractNgioImageMeta:
55
55
  raise NgioValidationError("At least one dataset must be provided.")
56
56
 
57
57
  self._datasets = datasets
58
- self._axes_mapper = datasets[0].axes_mapper
58
+ self._axes_handler = datasets[0].axes_handler
59
59
 
60
60
  def __repr__(self):
61
61
  class_name = type(self).__name__
62
62
  paths = [dataset.path for dataset in self.datasets]
63
- on_disk_axes = self.axes_mapper.axes_names
64
- return f"{class_name}(name={self.name}, datasets={paths}, axes={on_disk_axes})"
63
+ axes = self.axes_handler.axes_names
64
+ return f"{class_name}(name={self.name}, datasets={paths}, axes={axes})"
65
65
 
66
66
  @classmethod
67
67
  def default_init(
@@ -74,19 +74,20 @@ class AbstractNgioImageMeta:
74
74
  version: NgffVersions = DefaultNgffVersion,
75
75
  ):
76
76
  """Initialize the ImageMeta object."""
77
- axes = canonical_axes(
77
+ axes_handler = build_canonical_axes_handler(
78
78
  axes_names,
79
79
  space_units=pixel_size.space_unit,
80
80
  time_units=pixel_size.time_unit,
81
81
  )
82
82
 
83
83
  px_size_dict = pixel_size.as_dict()
84
- scale = [px_size_dict.get(ax.on_disk_name, 1.0) for ax in axes]
85
- translation = [0.0] * len(scale)
84
+ scale = [px_size_dict.get(name, 1.0) for name in axes_handler.axes_names]
86
85
 
87
86
  if scaling_factors is None:
88
87
  _default = {"x": 2.0, "y": 2.0}
89
- scaling_factors = [_default.get(ax.on_disk_name, 1.0) for ax in axes]
88
+ scaling_factors = [
89
+ _default.get(name, 1.0) for name in axes_handler.axes_names
90
+ ]
90
91
 
91
92
  if isinstance(levels, int):
92
93
  levels = [str(i) for i in range(levels)]
@@ -95,11 +96,9 @@ class AbstractNgioImageMeta:
95
96
  for level in levels:
96
97
  dataset = Dataset(
97
98
  path=level,
98
- on_disk_axes=axes,
99
- on_disk_scale=scale,
100
- on_disk_translation=translation,
101
- allow_non_canonical_axes=False,
102
- strict_canonical_order=True,
99
+ axes_handler=axes_handler,
100
+ scale=scale,
101
+ translation=None,
103
102
  )
104
103
  datasets.append(dataset)
105
104
  scale = [s * f for s, f in zip(scale, scaling_factors, strict=True)]
@@ -122,9 +121,18 @@ class AbstractNgioImageMeta:
122
121
  space_unit(str): The space unit to convert to.
123
122
  time_unit(str): The time unit to convert to.
124
123
  """
124
+ new_axes_handler = self.axes_handler.to_units(
125
+ space_unit=space_unit,
126
+ time_unit=time_unit,
127
+ )
125
128
  new_datasets = []
126
129
  for dataset in self.datasets:
127
- new_dataset = dataset.to_units(space_unit=space_unit, time_unit=time_unit)
130
+ new_dataset = Dataset(
131
+ path=dataset.path,
132
+ axes_handler=new_axes_handler,
133
+ scale=dataset.scale,
134
+ translation=dataset.translation,
135
+ )
128
136
  new_datasets.append(new_dataset)
129
137
 
130
138
  return type(self)(
@@ -149,9 +157,9 @@ class AbstractNgioImageMeta:
149
157
  return self._datasets
150
158
 
151
159
  @property
152
- def axes_mapper(self):
160
+ def axes_handler(self):
153
161
  """Return the axes mapper."""
154
- return self._axes_mapper
162
+ return self._axes_handler
155
163
 
156
164
  @property
157
165
  def levels(self) -> int:
@@ -166,12 +174,12 @@ class AbstractNgioImageMeta:
166
174
  @property
167
175
  def space_unit(self) -> str | None:
168
176
  """Get the space unit of the pixel size."""
169
- return self.datasets[0].pixel_size.space_unit
177
+ return self.axes_handler.space_unit
170
178
 
171
179
  @property
172
180
  def time_unit(self) -> str | None:
173
181
  """Get the time unit of the pixel size."""
174
- return self.datasets[0].pixel_size.time_unit
182
+ return self.axes_handler.time_unit
175
183
 
176
184
  def _get_dataset_by_path(self, path: str) -> Dataset:
177
185
  """Get a dataset by its path."""
@@ -321,11 +329,11 @@ class AbstractNgioImageMeta:
321
329
  def scaling_factor(self, path: str | None = None) -> list[float]:
322
330
  """Get the scaling factors from a dataset to its lower resolution."""
323
331
  if self.levels == 1:
324
- return [1.0] * len(self.axes_mapper.axes_names)
332
+ return [1.0] * len(self.axes_handler.axes_names)
325
333
  dataset, lr_dataset = self._get_closest_datasets(path=path)
326
334
 
327
335
  scaling_factors = []
328
- for ax_name in self.axes_mapper.axes_names:
336
+ for ax_name in self.axes_handler.axes_names:
329
337
  s_d = dataset.get_scale(ax_name)
330
338
  s_lr_d = lr_dataset.get_scale(ax_name)
331
339
  scaling_factors.append(s_lr_d / s_d)
@@ -359,8 +367,8 @@ class AbstractNgioImageMeta:
359
367
  return 1.0
360
368
  dataset, lr_dataset = self._get_closest_datasets(path=path)
361
369
 
362
- s_d = dataset.get_scale("z")
363
- s_lr_d = lr_dataset.get_scale("z")
370
+ s_d = dataset.get_scale("z", default=1.0)
371
+ s_lr_d = lr_dataset.get_scale("z", default=1.0)
364
372
  return s_lr_d / s_d
365
373
 
366
374
 
@@ -2,6 +2,7 @@
2
2
 
3
3
  import math
4
4
  from functools import total_ordering
5
+ from typing import overload
5
6
 
6
7
  import numpy as np
7
8
 
@@ -84,10 +85,25 @@ class PixelSize:
84
85
  )
85
86
  return self.distance(ref) < other.distance(ref)
86
87
 
87
- def as_dict(self) -> dict:
88
+ def as_dict(self) -> dict[str, float]:
88
89
  """Return the pixel size as a dictionary."""
89
90
  return {"t": self.t, "z": self.z, "y": self.y, "x": self.x}
90
91
 
92
+ @overload
93
+ def get(self, axis: str, default: float) -> float: ...
94
+
95
+ @overload
96
+ def get(self, axis: str, default: None = None) -> float | None: ...
97
+
98
+ def get(self, axis: str, default: float | None = None) -> float | None:
99
+ """Get the pixel size for a given axis (in canonical name)."""
100
+ px_size = self.as_dict().get(axis, default)
101
+ if px_size is None:
102
+ raise ValueError(
103
+ f"Invalid axis name: {axis}, must be one of 'x', 'y', 'z', 't'."
104
+ )
105
+ return px_size
106
+
91
107
  @property
92
108
  def space_unit(self) -> SpaceUnits | str | None:
93
109
  """Return the space unit."""
@@ -26,6 +26,7 @@ from ome_zarr_models.v04.omero import Window as WindowV04
26
26
  from pydantic import ValidationError
27
27
 
28
28
  from ngio.ome_zarr_meta.ngio_specs import (
29
+ AxesHandler,
29
30
  AxesSetup,
30
31
  Axis,
31
32
  AxisType,
@@ -160,34 +161,38 @@ def _v04_to_ngio_datasets(
160
161
  v04_multiscale.coordinateTransformations, global_scale, global_translation
161
162
  )
162
163
 
163
- for v04_dataset in v04_multiscale.datasets:
164
- axes = []
165
- for v04_axis in v04_multiscale.axes:
166
- unit = v04_axis.unit
167
- if unit is not None and not isinstance(unit, str):
168
- unit = str(unit)
169
- axes.append(
170
- Axis(
171
- on_disk_name=v04_axis.name,
172
- axis_type=AxisType(v04_axis.type),
173
- # (for some reason the type is a generic JsonValue,
174
- # but it should be a string or None)
175
- unit=v04_axis.unit, # type: ignore
176
- )
164
+ # Prepare axes handler
165
+ axes = []
166
+ for v04_axis in v04_multiscale.axes:
167
+ unit = v04_axis.unit
168
+ if unit is not None and not isinstance(unit, str):
169
+ unit = str(unit)
170
+ axes.append(
171
+ Axis(
172
+ name=v04_axis.name,
173
+ axis_type=AxisType(v04_axis.type),
174
+ # (for some reason the type is a generic JsonValue,
175
+ # but it should be a string or None)
176
+ unit=v04_axis.unit, # type: ignore
177
177
  )
178
+ )
179
+ axes_handler = AxesHandler(
180
+ axes=axes,
181
+ axes_setup=axes_setup,
182
+ allow_non_canonical_axes=allow_non_canonical_axes,
183
+ strict_canonical_order=strict_canonical_order,
184
+ )
178
185
 
179
- _on_disk_scale, _on_disk_translation = _compute_scale_translation(
186
+ for v04_dataset in v04_multiscale.datasets:
187
+ _scale, _translation = _compute_scale_translation(
180
188
  v04_dataset.coordinateTransformations, global_scale, global_translation
181
189
  )
182
190
  datasets.append(
183
191
  Dataset(
184
192
  path=v04_dataset.path,
185
- on_disk_axes=axes,
186
- on_disk_scale=_on_disk_scale,
187
- on_disk_translation=_on_disk_translation,
188
- axes_setup=axes_setup,
189
- allow_non_canonical_axes=allow_non_canonical_axes,
190
- strict_canonical_order=strict_canonical_order,
193
+ axes_handler=axes_handler,
194
+ scale=_scale,
195
+ translation=_translation,
191
196
  )
192
197
  )
193
198
  return datasets
@@ -314,12 +319,12 @@ def _ngio_to_v04_multiscale(name: str | None, datasets: list[Dataset]) -> Multis
314
319
  Returns:
315
320
  MultiscaleV04: The v04 multiscale.
316
321
  """
317
- ax_mapper = datasets[0].axes_mapper
322
+ ax_mapper = datasets[0].axes_handler
318
323
  v04_axes = []
319
324
  for axis in ax_mapper.axes:
320
325
  v04_axes.append(
321
326
  AxisV04(
322
- name=axis.on_disk_name,
327
+ name=axis.name,
323
328
  type=axis.axis_type.value if axis.axis_type is not None else None,
324
329
  unit=axis.unit if axis.unit is not None else None,
325
330
  )
@@ -327,18 +332,16 @@ def _ngio_to_v04_multiscale(name: str | None, datasets: list[Dataset]) -> Multis
327
332
 
328
333
  v04_datasets = []
329
334
  for dataset in datasets:
330
- transform = [VectorScaleV04(type="scale", scale=list(dataset._on_disk_scale))]
331
- if sum(dataset._on_disk_translation) > 0:
335
+ transform = [VectorScaleV04(type="scale", scale=list(dataset._scale))]
336
+ if sum(dataset._translation) > 0:
332
337
  transform = (
333
- VectorScaleV04(type="scale", scale=list(dataset._on_disk_scale)),
338
+ VectorScaleV04(type="scale", scale=list(dataset._scale)),
334
339
  VectorTranslationV04(
335
- type="translation", translation=list(dataset._on_disk_translation)
340
+ type="translation", translation=list(dataset._translation)
336
341
  ),
337
342
  )
338
343
  else:
339
- transform = (
340
- VectorScaleV04(type="scale", scale=list(dataset._on_disk_scale)),
341
- )
344
+ transform = (VectorScaleV04(type="scale", scale=list(dataset._scale)),)
342
345
 
343
346
  v04_datasets.append(
344
347
  DatasetV04(path=dataset.path, coordinateTransformations=transform)
@@ -28,6 +28,7 @@ _resources = {
28
28
  / "mask.png",
29
29
  create_masking_table=True,
30
30
  ensure_unique_labels=False,
31
+ dtype="uint8",
31
32
  ),
32
33
  ],
33
34
  xy_pixelsize=0.325,
@@ -19,6 +19,7 @@ class LabelsInfo(BaseModel):
19
19
  label_path: Path
20
20
  ensure_unique_labels: bool = True
21
21
  create_masking_table: bool = False
22
+ dtype: str = "uint32"
22
23
 
23
24
 
24
25
  class SampleInfo(BaseModel):
@@ -6,6 +6,7 @@ https://fractal-analytics-platform.github.io/fractal-tasks-core/tables/
6
6
 
7
7
  from collections.abc import Iterable
8
8
  from typing import Literal
9
+ from uuid import uuid4
9
10
 
10
11
  import pandas as pd
11
12
  from pydantic import BaseModel
@@ -146,7 +147,7 @@ def _rois_to_dataframe(rois: dict[str, Roi], index_key: str | None) -> pd.DataFr
146
147
  len_z_micrometer = roi.z_length if roi.z_length is not None else 1.0
147
148
 
148
149
  row = {
149
- index_key: roi.name,
150
+ index_key: roi.get_name(),
150
151
  "x_micrometer": roi.x,
151
152
  "y_micrometer": roi.y,
152
153
  "z_micrometer": z_micrometer,
@@ -179,8 +180,15 @@ class RoiDictWrapper:
179
180
  """A wrapper for a dictionary of ROIs to provide a consistent interface."""
180
181
 
181
182
  def __init__(self, rois: Iterable[Roi]) -> None:
182
- self._rois_by_name = {roi.name: roi for roi in rois}
183
- self._rois_by_label = {roi.label: roi for roi in rois if roi.label is not None}
183
+ self._rois_by_name = {}
184
+ self._rois_by_label = {}
185
+ for roi in rois:
186
+ name = roi.get_name()
187
+ if name in self._rois_by_name:
188
+ name = f"{name}_{uuid4().hex[:8]}"
189
+ self._rois_by_name[name] = roi
190
+ if roi.label is not None:
191
+ self._rois_by_label[roi.label] = roi
184
192
 
185
193
  def get_by_name(self, name: str, default: Roi | None = None) -> Roi | None:
186
194
  """Get an ROI by its name."""
@@ -1,5 +1,5 @@
1
1
  """Concrete IO transformations."""
2
2
 
3
- from ngio.common.transforms._zoom import ZoomTransform
3
+ from ngio.transforms._zoom import ZoomTransform
4
4
 
5
5
  __all__ = ["ZoomTransform"]
@@ -0,0 +1,19 @@
1
+ from ngio.common._zoom import (
2
+ InterpolationOrder,
3
+ )
4
+ from ngio.images._abstract_image import AbstractImage
5
+ from ngio.io_pipes._zoom_transform import BaseZoomTransform
6
+
7
+
8
+ class ZoomTransform(BaseZoomTransform):
9
+ def __init__(
10
+ self,
11
+ input_image: AbstractImage,
12
+ target_image: AbstractImage,
13
+ order: InterpolationOrder = "nearest",
14
+ ) -> None:
15
+ super().__init__(
16
+ input_dimensions=input_image.dimensions,
17
+ target_dimensions=target_image.dimensions,
18
+ order=order,
19
+ )
ngio/utils/_zarr_utils.py CHANGED
@@ -8,6 +8,7 @@ import zarr
8
8
  from filelock import BaseFileLock, FileLock
9
9
  from zarr.errors import ContainsGroupError, GroupNotFoundError
10
10
  from zarr.storage import DirectoryStore, FSStore, MemoryStore, Store, StoreLike
11
+ from zarr.types import DIMENSION_SEPARATOR
11
12
 
12
13
  from ngio.utils import NgioFileExistsError, NgioFileNotFoundError, NgioValueError
13
14
  from ngio.utils._errors import NgioError
@@ -342,6 +343,8 @@ class ZarrGroupHandler:
342
343
  shape: tuple[int, ...],
343
344
  dtype: str,
344
345
  chunks: tuple[int, ...] | None = None,
346
+ dimension_separator: DIMENSION_SEPARATOR = "/",
347
+ compressor: str = "default",
345
348
  overwrite: bool = False,
346
349
  ) -> zarr.Array:
347
350
  if self.mode == "r":
@@ -353,7 +356,8 @@ class ZarrGroupHandler:
353
356
  shape=shape,
354
357
  dtype=dtype,
355
358
  chunks=chunks,
356
- dimension_separator="/",
359
+ dimension_separator=dimension_separator,
360
+ compressor=compressor,
357
361
  overwrite=overwrite,
358
362
  )
359
363
  except ContainsGroupError as e:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ngio
3
- Version: 0.4.0a2
3
+ Version: 0.4.0a4
4
4
  Summary: Next Generation file format IO
5
5
  Project-URL: homepage, https://github.com/BioVisionCenter/ngio
6
6
  Project-URL: repository, https://github.com/BioVisionCenter/ngio
@@ -0,0 +1,83 @@
1
+ ngio/__init__.py,sha256=rEgnXuU6TCejUUGsxt4eKmjMhxjYh0fYBxWF4o5YjbE,1435
2
+ ngio/common/__init__.py,sha256=aPSuUbdGryrxbnlWrsVNe3LZoBAWC4GijR1BNH1UwuU,612
3
+ ngio/common/_dimensions.py,sha256=zl9mPiYYYxr_s1MT0jQiUhpeG5qAc0l3u-IHgvcJ1XY,10877
4
+ ngio/common/_masking_roi.py,sha256=ZZTXordEZoq_ADk0OzADvq-5dPOwUBSuNobzFR8fpTw,5697
5
+ ngio/common/_pyramid.py,sha256=F5OI_mULxzMTpMeihC4Y22cjuB5GKN2jRdpwfMXJHiE,8018
6
+ ngio/common/_roi.py,sha256=gW-_ouxoHrcG5ox6Kl8NOyMhu8XJFKm7xu8w03O6xds,10185
7
+ ngio/common/_synt_images_utils.py,sha256=B6uYOW1NyrM06YMR-csca3_YnAAkPRTbvnbLdy9tk9E,3188
8
+ ngio/common/_zoom.py,sha256=U01c-vqXjzZkrpd9Yvs24frVfTls_xPJeeaFCGmUwYI,6727
9
+ ngio/experimental/__init__.py,sha256=3pmBtHi-i8bKjTsvrOJM56ZyRX3Pv_dceCdt88-8COQ,147
10
+ ngio/experimental/iterators/__init__.py,sha256=on_sUvuRhHBb7-r5u3Ojvu6K9FGjUOrWGUkLQ4aRzbs,556
11
+ ngio/experimental/iterators/_abstract_iterator.py,sha256=4YNnL8OZ01KEG0Ga6UuETmXy4TV8oyhYC0ZlB_WLiBA,5537
12
+ ngio/experimental/iterators/_feature.py,sha256=5opX2o9iJazOOro0hEAF0oF7gJtFzmprRd2vusP3lcI,5874
13
+ ngio/experimental/iterators/_image_processing.py,sha256=Dt8mgrlrehwIaHpxNh9e7GSPRme7vWwStdsF9oSwR7E,6082
14
+ ngio/experimental/iterators/_rois_utils.py,sha256=Q-8lQ26neYn63h_RvfypYqvrq2UUN2O3xqVe57k_ufU,4363
15
+ ngio/experimental/iterators/_segmentation.py,sha256=M0SVSyBBJDc_pYzMOJJiUmeULk9QXoKe4Lg1EwMz4H8,10276
16
+ ngio/hcs/__init__.py,sha256=G8j9vD-liLeB_UeGtKYIgshWvJnUA6ks9GwjvWBLdHs,357
17
+ ngio/hcs/_plate.py,sha256=qfRwbCKaoz_AWTi8RDFFwOxy5geSknfJrPcqFVno9zI,44288
18
+ ngio/images/__init__.py,sha256=9Whvt7GTiCgT_vXaEEqGnDaY1-UsRk3dhLTv091F_g4,1211
19
+ ngio/images/_abstract_image.py,sha256=0o1wiNnzHXcSJHAJPd7cMdYatS_B8wT2bcWMzfyFd6A,16841
20
+ ngio/images/_create.py,sha256=61cuco2jUK25WzOY-Sel9s931FtGPL2ut25L9W10bJ4,10171
21
+ ngio/images/_create_synt_container.py,sha256=il_rr5_2KIQ5Xsskj2rb2fEm100ZErZq89aW06kn_7k,5444
22
+ ngio/images/_image.py,sha256=TB-xCGeYRxPj8pzREjj0tkGJz6EqjiUoDLw148ocWi4,32966
23
+ ngio/images/_label.py,sha256=ZQYtsECM04oPrXoiGAWvfIRz7CtsCTPd5ktUMCi-5nA,11712
24
+ ngio/images/_masked_image.py,sha256=0RFW5YudH8cfjLMa263PenBmok2FhYm-eNtgoQkz2Es,18731
25
+ ngio/images/_ome_zarr_container.py,sha256=UJERXEgBkwclpLaHzWqUIQc6P-TG4zYuKuxPukJGa4Y,38433
26
+ ngio/images/_table_ops.py,sha256=jFv_AMqoB4JBpoWsMtZppZVW7dAOC_u-JpfNm8b33kY,15292
27
+ ngio/io_pipes/__init__.py,sha256=HkqzC1gwGLFzIcHMkgEQ8-rh7w6LDEfvEwkwli-0IHE,1179
28
+ ngio/io_pipes/_io_pipes.py,sha256=loYbsFv0dbpngkd1HYsJ5s9HDcP9lb-QJQBwymSJyg8,8568
29
+ ngio/io_pipes/_io_pipes_masked.py,sha256=jRDS7m4b6Hl7AdxRvg9Dz3nOIl9nypoktj43FHEuBUI,16943
30
+ ngio/io_pipes/_io_pipes_roi.py,sha256=Rgvqy9C-fYEEmg2yoDROE3xiRGhjo5lH5_B8gXvt2dg,4678
31
+ ngio/io_pipes/_io_pipes_utils.py,sha256=r_c1N48L01McTLPRgezW9KGFes3JHQYYkpzOXnQElQ0,10505
32
+ ngio/io_pipes/_match_shape.py,sha256=eDy_Eqzld08m9zDuIjAvJnIhWh_HVjQS-5Pw9BMjdbw,13200
33
+ ngio/io_pipes/_ops_axes.py,sha256=BHOSFBGTKF32f4kqj8uu_NpiyLpR0zzBy9HN01OPGSs,4014
34
+ ngio/io_pipes/_ops_slices.py,sha256=9o2HqsiEfeBVcTcTpqmLEKrV-UOkILHdvii-nTXP_0w,7887
35
+ ngio/io_pipes/_ops_transforms.py,sha256=HsxLLGjQ8kx9HpkikYHhXC4s4DD1T56GJ4StjO7FCSk,2946
36
+ ngio/io_pipes/_zoom_transform.py,sha256=Au2nqNfODQWEpvc12OmYVmP-Uso7fEc-14hTK_GsGi4,6723
37
+ ngio/ome_zarr_meta/__init__.py,sha256=A5pyhdyLpwRyXXB81tMHFu36rq9-QzAzG0htRqBMpTo,1293
38
+ ngio/ome_zarr_meta/_meta_handlers.py,sha256=ctknNDT8jxwyvxQf9on5gW31H1tRRsnneO38GT2UXoE,25880
39
+ ngio/ome_zarr_meta/ngio_specs/__init__.py,sha256=PXTmXX9aeOlM9FLL-BXzW8v9ByezL_X7EDNx2zoBYm4,1726
40
+ ngio/ome_zarr_meta/ngio_specs/_axes.py,sha256=R2HIL31FreeqawvXQbhRRu3lPxYPviFOSnCOses6Dhw,21134
41
+ ngio/ome_zarr_meta/ngio_specs/_channels.py,sha256=CVsbG52U31TaMdTj8XqvClUdBya2Ar3qBjDo_xhP-NM,16967
42
+ ngio/ome_zarr_meta/ngio_specs/_dataset.py,sha256=CrHnjVWBGYPqErKkHR-E2DKrE3DmGznXMkd3Y9Z4uYo,3434
43
+ ngio/ome_zarr_meta/ngio_specs/_ngio_hcs.py,sha256=N1CGPOubwf0pvm8tiTnh-C1cOu9lToyDe3WagnEnPN4,17207
44
+ ngio/ome_zarr_meta/ngio_specs/_ngio_image.py,sha256=XmqeffYRspBZmv8gCrfJvnykmBViWgDo2AtJJkR7OEs,15886
45
+ ngio/ome_zarr_meta/ngio_specs/_pixel_size.py,sha256=SofMjLERvCxqP-ACxqyTEwYYAPeq0hjxt8Ujn4OZhZY,4656
46
+ ngio/ome_zarr_meta/v04/__init__.py,sha256=dJRzzxyYc81kf-0Hip_bqvbdManaM8XTdQX2meWyCSs,583
47
+ ngio/ome_zarr_meta/v04/_custom_models.py,sha256=5GxiDERvLuvq4QvApcA6EiKLS6hLFX1R0R_9rSaa85A,530
48
+ ngio/ome_zarr_meta/v04/_v04_spec_utils.py,sha256=OFMAKYvjhgCRhN_RNs8mJmOtyFHuw3k-lqOOrTRXvzU,15764
49
+ ngio/resources/__init__.py,sha256=4E4TXTNYEgRHt26C1XcC4pPobJJsmZRYm1Ml4uAuAkE,1664
50
+ ngio/resources/resource_model.py,sha256=eE1m0dyk-2psPC4X8Ifyan524QHUOd52TEQdvoU0m8I,861
51
+ ngio/resources/20200812-CardiomyocyteDifferentiation14-Cycle1_B03/mask.png,sha256=g3QmxQdmeciAtBe5cTCRfR6yw3keG9cBYfjizMo6EGo,11890
52
+ ngio/resources/20200812-CardiomyocyteDifferentiation14-Cycle1_B03/nuclei.png,sha256=Yw0k5pn2EHDMWTwyb7N51NX7WVk6-MlwfP9WZrhY-Ic,19446
53
+ ngio/resources/20200812-CardiomyocyteDifferentiation14-Cycle1_B03/raw.jpg,sha256=82lejQAIokj5w9g-qqhysDTWpHtNvJTkdURG_BjqIxQ,37743
54
+ ngio/tables/__init__.py,sha256=_BV3sclNMLITu_J8_3DkkUrCB6Kro0HzeWLDCD1ivKM,877
55
+ ngio/tables/_abstract_table.py,sha256=rwGa47TzbFmosucBWVfFq6JEXtgGvOdUVtU9DIelV88,8204
56
+ ngio/tables/_tables_container.py,sha256=3xmpREaN671l40MPprnl1BD-VoOb6xfjECb5mNoMW0w,12173
57
+ ngio/tables/backends/__init__.py,sha256=MwSRXNF1rWQBFOTDA_vT3oGoNZpviVgytsL5Txnu08I,1619
58
+ ngio/tables/backends/_abstract_backend.py,sha256=54Vh9yPfLx1NixGVfFkW4msD51nsim0zIfHRnO80Xt8,7276
59
+ ngio/tables/backends/_anndata.py,sha256=97RWG4Hjc42JBxm-YxjHEU8HHd14NiayelKlI1PTsCo,2868
60
+ ngio/tables/backends/_anndata_utils.py,sha256=HsmP27fm7JW1kjahl4lUnnViK_iqmu2bnsu86z43U98,3116
61
+ ngio/tables/backends/_csv.py,sha256=Ev61D-AUKo4LIhXRmWPJgYbHI7eQdxiajQR574DevEM,932
62
+ ngio/tables/backends/_json.py,sha256=1ZsEuXDJm1rOZV_KjFm8CB0qhv7L1W7L2EGWPf4q_p0,3137
63
+ ngio/tables/backends/_non_zarr_backends.py,sha256=BybUl800pqCdqJJmsGnUi4jsH1ibpQSUl0ZnumkFDwY,7298
64
+ ngio/tables/backends/_parquet.py,sha256=ic-p86h8lce8q9luBJGRzy6vxlWyJvA0-2l5cUD6OqY,1398
65
+ ngio/tables/backends/_table_backends.py,sha256=ksP2NAosXZkNMZf-IMrLx7bjQgp_eKfvPYK4vMdT1A8,7250
66
+ ngio/tables/backends/_utils.py,sha256=YFB7u2_l8lLAK_jrmlSfzH-2sOAFaDP1bmeUfuNo7YM,19719
67
+ ngio/tables/v1/__init__.py,sha256=Wr1_9RZFpaN8FYMTnxT9Yjkw4AS7y9FMWailmB_uj5g,617
68
+ ngio/tables/v1/_condition_table.py,sha256=T0Uq5BKkmMoEspt_Rx0U99Ow6S9GAMZDHqvUO5obCAM,1780
69
+ ngio/tables/v1/_feature_table.py,sha256=n9uMHwoBh-_dlOhUXCFbmAjXFVXncNCR3SjE2qzXI68,3821
70
+ ngio/tables/v1/_generic_table.py,sha256=1ktJHeuv7U1g5Z8PFUuTkCjOzcYMQd8xegKHKUedJB8,1240
71
+ ngio/tables/v1/_roi_table.py,sha256=g7UpMmpf3uAfaG59WYRnimUBgiB_T1qUJRwMZpMt9cI,17099
72
+ ngio/transforms/__init__.py,sha256=JA0-Ui7skbXkm9ofN-AEhU1FTLutkMkwTdVD-310frQ,113
73
+ ngio/transforms/_zoom.py,sha256=otyE-vxFnywUJ8U4mHjat-bNG_7_jv62ckTpqDMxyVQ,550
74
+ ngio/utils/__init__.py,sha256=XPYh8ehC7uXNU2cFFXZAw-S3DpWpX1Yq2xGkffZv5vI,1142
75
+ ngio/utils/_datasets.py,sha256=2g-Neg78dNcqyDz39QQw-Ifp9GITHjVHisdqgvvDNDE,5475
76
+ ngio/utils/_errors.py,sha256=pKQ12LUjQLYE1nUawemA5h7HsgznjaSvV1n2PQU33N0,759
77
+ ngio/utils/_fractal_fsspec_store.py,sha256=RdcCFOgHexRKX9zZvJV5RI-5OPc7VOPS6q_IeRxm24I,1548
78
+ ngio/utils/_logger.py,sha256=N5W0a_xwze4blS1MolidBkTMbjTbg8GPguJZNun3mAE,1392
79
+ ngio/utils/_zarr_utils.py,sha256=GUOcAx02IcfrJ5tIdKu8ChtRUUaBbkkddW5jaCCYnS8,13797
80
+ ngio-0.4.0a4.dist-info/METADATA,sha256=Xg_Fe1eqlYK8VSvuZO2eRctss4pRDD1hjwgT4v_grHs,5868
81
+ ngio-0.4.0a4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
82
+ ngio-0.4.0a4.dist-info/licenses/LICENSE,sha256=UgN_a1QCeNh9rZWfz-wORQFxE3elQzLWPQaoK6N6fxQ,1502
83
+ ngio-0.4.0a4.dist-info/RECORD,,