ngio 0.2.0b3__py3-none-any.whl → 0.2.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ngio/__init__.py +30 -10
- ngio/common/__init__.py +3 -3
- ngio/common/_array_pipe.py +7 -1
- ngio/common/_masking_roi.py +4 -4
- ngio/common/_roi.py +14 -14
- ngio/hcs/__init__.py +16 -2
- ngio/hcs/plate.py +465 -54
- ngio/images/__init__.py +7 -7
- ngio/images/abstract_image.py +30 -10
- ngio/images/create.py +25 -35
- ngio/images/image.py +40 -8
- ngio/images/label.py +33 -8
- ngio/images/masked_image.py +19 -5
- ngio/images/{omezarr_container.py → ome_zarr_container.py} +84 -47
- ngio/ome_zarr_meta/__init__.py +5 -0
- ngio/ome_zarr_meta/ngio_specs/__init__.py +10 -0
- ngio/ome_zarr_meta/ngio_specs/_axes.py +90 -65
- ngio/ome_zarr_meta/ngio_specs/_dataset.py +46 -8
- ngio/ome_zarr_meta/ngio_specs/_ngio_hcs.py +242 -69
- ngio/ome_zarr_meta/ngio_specs/_ngio_image.py +53 -19
- ngio/ome_zarr_meta/ngio_specs/_pixel_size.py +28 -11
- ngio/ome_zarr_meta/v04/_custom_models.py +18 -0
- ngio/ome_zarr_meta/v04/_v04_spec_utils.py +3 -4
- ngio/tables/__init__.py +2 -2
- ngio/tables/tables_container.py +3 -3
- ngio/tables/v1/__init__.py +2 -2
- ngio/tables/v1/_feature_table.py +20 -1
- ngio/tables/v1/_generic_table.py +10 -0
- ngio/tables/v1/_roi_table.py +35 -13
- {ngio-0.2.0b3.dist-info → ngio-0.2.2.dist-info}/METADATA +8 -5
- ngio-0.2.2.dist-info/RECORD +55 -0
- ngio-0.2.0b3.dist-info/RECORD +0 -54
- {ngio-0.2.0b3.dist-info → ngio-0.2.2.dist-info}/WHEEL +0 -0
- {ngio-0.2.0b3.dist-info → ngio-0.2.2.dist-info}/licenses/LICENSE +0 -0
|
@@ -5,7 +5,12 @@ from functools import total_ordering
|
|
|
5
5
|
|
|
6
6
|
import numpy as np
|
|
7
7
|
|
|
8
|
-
from ngio.ome_zarr_meta.ngio_specs import
|
|
8
|
+
from ngio.ome_zarr_meta.ngio_specs import (
|
|
9
|
+
DefaultSpaceUnit,
|
|
10
|
+
DefaultTimeUnit,
|
|
11
|
+
SpaceUnits,
|
|
12
|
+
TimeUnits,
|
|
13
|
+
)
|
|
9
14
|
|
|
10
15
|
################################################################################################
|
|
11
16
|
#
|
|
@@ -33,8 +38,8 @@ class PixelSize:
|
|
|
33
38
|
y: float,
|
|
34
39
|
z: float,
|
|
35
40
|
t: float = 1,
|
|
36
|
-
space_unit: SpaceUnits =
|
|
37
|
-
time_unit: TimeUnits | None =
|
|
41
|
+
space_unit: SpaceUnits | str | None = DefaultSpaceUnit,
|
|
42
|
+
time_unit: TimeUnits | str | None = DefaultTimeUnit,
|
|
38
43
|
):
|
|
39
44
|
"""Initialize the pixel size."""
|
|
40
45
|
self.x = _validate_type(x, "x")
|
|
@@ -42,13 +47,8 @@ class PixelSize:
|
|
|
42
47
|
self.z = _validate_type(z, "z")
|
|
43
48
|
self.t = _validate_type(t, "t")
|
|
44
49
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
self.space_unit = space_unit
|
|
48
|
-
|
|
49
|
-
if time_unit is not None and not isinstance(time_unit, TimeUnits):
|
|
50
|
-
raise TypeError("time_unit must be of type TimeUnits.")
|
|
51
|
-
self.time_unit = time_unit
|
|
50
|
+
self._space_unit = space_unit
|
|
51
|
+
self._time_unit = time_unit
|
|
52
52
|
|
|
53
53
|
def __repr__(self) -> str:
|
|
54
54
|
"""Return a string representation of the pixel size."""
|
|
@@ -74,13 +74,30 @@ class PixelSize:
|
|
|
74
74
|
"""Check if one pixel size is less than the other."""
|
|
75
75
|
if not isinstance(other, PixelSize):
|
|
76
76
|
raise TypeError("Can only compare PixelSize with PixelSize.")
|
|
77
|
-
ref = PixelSize(
|
|
77
|
+
ref = PixelSize(
|
|
78
|
+
0,
|
|
79
|
+
0,
|
|
80
|
+
0,
|
|
81
|
+
0,
|
|
82
|
+
space_unit=self.space_unit,
|
|
83
|
+
time_unit=self.time_unit, # type: ignore
|
|
84
|
+
)
|
|
78
85
|
return self.distance(ref) < other.distance(ref)
|
|
79
86
|
|
|
80
87
|
def as_dict(self) -> dict:
|
|
81
88
|
"""Return the pixel size as a dictionary."""
|
|
82
89
|
return {"t": self.t, "z": self.z, "y": self.y, "x": self.x}
|
|
83
90
|
|
|
91
|
+
@property
|
|
92
|
+
def space_unit(self) -> SpaceUnits | str | None:
|
|
93
|
+
"""Return the space unit."""
|
|
94
|
+
return self._space_unit
|
|
95
|
+
|
|
96
|
+
@property
|
|
97
|
+
def time_unit(self) -> TimeUnits | str | None:
|
|
98
|
+
"""Return the time unit."""
|
|
99
|
+
return self._time_unit
|
|
100
|
+
|
|
84
101
|
@property
|
|
85
102
|
def tzyx(self) -> tuple[float, float, float, float]:
|
|
86
103
|
"""Return the voxel size in t, z, y, x order."""
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
from typing import Annotated
|
|
2
|
+
|
|
3
|
+
from ome_zarr_models.v04.well import WellAttrs as WellAttrs04
|
|
4
|
+
from ome_zarr_models.v04.well_types import WellImage as WellImage04
|
|
5
|
+
from ome_zarr_models.v04.well_types import WellMeta as WellMeta04
|
|
6
|
+
from pydantic import SkipValidation
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class CustomWellImage(WellImage04):
|
|
10
|
+
path: Annotated[str, SkipValidation]
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class CustomWellMeta(WellMeta04):
|
|
14
|
+
images: list[CustomWellImage] # type: ignore[valid-type]
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class CustomWellAttrs(WellAttrs04):
|
|
18
|
+
well: CustomWellMeta # type: ignore[valid-type]
|
|
@@ -23,7 +23,6 @@ from ome_zarr_models.v04.multiscales import Multiscale as MultiscaleV04
|
|
|
23
23
|
from ome_zarr_models.v04.omero import Channel as ChannelV04
|
|
24
24
|
from ome_zarr_models.v04.omero import Omero as OmeroV04
|
|
25
25
|
from ome_zarr_models.v04.omero import Window as WindowV04
|
|
26
|
-
from ome_zarr_models.v04.well import WellAttrs as WellAttrsV04
|
|
27
26
|
from pydantic import ValidationError
|
|
28
27
|
|
|
29
28
|
from ngio.ome_zarr_meta.ngio_specs import (
|
|
@@ -41,7 +40,7 @@ from ngio.ome_zarr_meta.ngio_specs import (
|
|
|
41
40
|
NgioWellMeta,
|
|
42
41
|
default_channel_name,
|
|
43
42
|
)
|
|
44
|
-
from ngio.ome_zarr_meta.
|
|
43
|
+
from ngio.ome_zarr_meta.v04._custom_models import CustomWellAttrs as WellAttrsV04
|
|
45
44
|
|
|
46
45
|
|
|
47
46
|
def _is_v04_image_meta(metadata: dict) -> ImageAttrsV04 | ValidationError:
|
|
@@ -290,7 +289,7 @@ def v04_to_ngio_label_meta(
|
|
|
290
289
|
else:
|
|
291
290
|
image_label_source = source.image
|
|
292
291
|
image_label_source = ImageLabelSource(
|
|
293
|
-
version=
|
|
292
|
+
version="0.4",
|
|
294
293
|
source={"image": image_label_source},
|
|
295
294
|
)
|
|
296
295
|
name = v04_muliscale.name
|
|
@@ -322,7 +321,7 @@ def _ngio_to_v04_multiscale(name: str | None, datasets: list[Dataset]) -> Multis
|
|
|
322
321
|
AxisV04(
|
|
323
322
|
name=axis.on_disk_name,
|
|
324
323
|
type=axis.axis_type.value if axis.axis_type is not None else None,
|
|
325
|
-
unit=axis.unit
|
|
324
|
+
unit=axis.unit if axis.unit is not None else None,
|
|
326
325
|
)
|
|
327
326
|
)
|
|
328
327
|
|
ngio/tables/__init__.py
CHANGED
|
@@ -4,7 +4,7 @@ from ngio.tables.backends import ImplementedTableBackends
|
|
|
4
4
|
from ngio.tables.tables_container import (
|
|
5
5
|
FeatureTable,
|
|
6
6
|
GenericRoiTable,
|
|
7
|
-
|
|
7
|
+
MaskingRoiTable,
|
|
8
8
|
RoiTable,
|
|
9
9
|
Table,
|
|
10
10
|
TablesContainer,
|
|
@@ -19,7 +19,7 @@ __all__ = [
|
|
|
19
19
|
"GenericRoiTable",
|
|
20
20
|
"GenericTable",
|
|
21
21
|
"ImplementedTableBackends",
|
|
22
|
-
"
|
|
22
|
+
"MaskingRoiTable",
|
|
23
23
|
"RoiTable",
|
|
24
24
|
"Table",
|
|
25
25
|
"TablesContainer",
|
ngio/tables/tables_container.py
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from typing import Literal, Protocol
|
|
4
4
|
|
|
5
|
-
from ngio.tables.v1 import FeatureTableV1,
|
|
5
|
+
from ngio.tables.v1 import FeatureTableV1, MaskingRoiTableV1, RoiTableV1
|
|
6
6
|
from ngio.tables.v1._generic_table import GenericTable
|
|
7
7
|
from ngio.tables.v1._roi_table import _GenericRoiTableV1
|
|
8
8
|
from ngio.utils import (
|
|
@@ -15,7 +15,7 @@ from ngio.utils import (
|
|
|
15
15
|
|
|
16
16
|
GenericRoiTable = _GenericRoiTableV1
|
|
17
17
|
RoiTable = RoiTableV1
|
|
18
|
-
|
|
18
|
+
MaskingRoiTable = MaskingRoiTableV1
|
|
19
19
|
FeatureTable = FeatureTableV1
|
|
20
20
|
|
|
21
21
|
|
|
@@ -253,7 +253,7 @@ class TablesContainer:
|
|
|
253
253
|
|
|
254
254
|
|
|
255
255
|
ImplementedTables().add_implementation(RoiTableV1)
|
|
256
|
-
ImplementedTables().add_implementation(
|
|
256
|
+
ImplementedTables().add_implementation(MaskingRoiTableV1)
|
|
257
257
|
ImplementedTables().add_implementation(FeatureTableV1)
|
|
258
258
|
|
|
259
259
|
###################################################################################
|
ngio/tables/v1/__init__.py
CHANGED
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
from ngio.tables.v1._feature_table import FeatureTableV1
|
|
4
4
|
from ngio.tables.v1._generic_table import GenericTable
|
|
5
|
-
from ngio.tables.v1._roi_table import
|
|
5
|
+
from ngio.tables.v1._roi_table import MaskingRoiTableV1, RoiTableV1
|
|
6
6
|
|
|
7
|
-
__all__ = ["FeatureTableV1", "GenericTable", "
|
|
7
|
+
__all__ = ["FeatureTableV1", "GenericTable", "MaskingRoiTableV1", "RoiTableV1"]
|
ngio/tables/v1/_feature_table.py
CHANGED
|
@@ -49,7 +49,6 @@ class FeatureTableV1:
|
|
|
49
49
|
path = f"../labels/{reference_label}"
|
|
50
50
|
self._meta = FeatureTableMeta(region=RegionMeta(path=path))
|
|
51
51
|
|
|
52
|
-
self._reference_label = reference_label
|
|
53
52
|
self._instance_key = "label"
|
|
54
53
|
if dataframe is None:
|
|
55
54
|
self._dataframe = None
|
|
@@ -59,6 +58,15 @@ class FeatureTableV1:
|
|
|
59
58
|
)
|
|
60
59
|
self._table_backend = None
|
|
61
60
|
|
|
61
|
+
def __repr__(self) -> str:
|
|
62
|
+
"""Return a string representation of the table."""
|
|
63
|
+
num_rows = len(self.dataframe) if self.dataframe is not None else 0
|
|
64
|
+
num_columns = len(self.dataframe.columns) if self.dataframe is not None else 0
|
|
65
|
+
properties = f"num_rows={num_rows}, num_columns={num_columns}"
|
|
66
|
+
if self.reference_label is not None:
|
|
67
|
+
properties += f", reference_label={self.reference_label}"
|
|
68
|
+
return f"FeatureTableV1({properties})"
|
|
69
|
+
|
|
62
70
|
@staticmethod
|
|
63
71
|
def type() -> str:
|
|
64
72
|
"""Return the type of the table."""
|
|
@@ -79,6 +87,17 @@ class FeatureTableV1:
|
|
|
79
87
|
return None
|
|
80
88
|
return self._table_backend.backend_name()
|
|
81
89
|
|
|
90
|
+
@property
|
|
91
|
+
def reference_label(self) -> str | None:
|
|
92
|
+
"""Return the reference label."""
|
|
93
|
+
path = self._meta.region
|
|
94
|
+
if path is None:
|
|
95
|
+
return None
|
|
96
|
+
|
|
97
|
+
path = path.path
|
|
98
|
+
path = path.split("/")[-1]
|
|
99
|
+
return path
|
|
100
|
+
|
|
82
101
|
@property
|
|
83
102
|
def dataframe(self) -> pd.DataFrame:
|
|
84
103
|
"""Return the table as a DataFrame."""
|
ngio/tables/v1/_generic_table.py
CHANGED
|
@@ -51,6 +51,16 @@ class GenericTable:
|
|
|
51
51
|
|
|
52
52
|
self._table_backend = None
|
|
53
53
|
|
|
54
|
+
def __repr__(self) -> str:
|
|
55
|
+
"""Return a string representation of the table."""
|
|
56
|
+
if self._dataframe is not None:
|
|
57
|
+
num_rows = len(self.dataframe)
|
|
58
|
+
num_columns = len(self.dataframe.columns)
|
|
59
|
+
prop = f"num_rows={num_rows}, num_columns={num_columns}, mode=dataframe"
|
|
60
|
+
else:
|
|
61
|
+
prop = "mode=anndata"
|
|
62
|
+
return f"GenericTable({prop})"
|
|
63
|
+
|
|
54
64
|
@staticmethod
|
|
55
65
|
def type() -> str:
|
|
56
66
|
"""Return the type of the table."""
|
ngio/tables/v1/_roi_table.py
CHANGED
|
@@ -12,7 +12,7 @@ from typing import Generic, Literal, TypeVar
|
|
|
12
12
|
import pandas as pd
|
|
13
13
|
from pydantic import BaseModel
|
|
14
14
|
|
|
15
|
-
from ngio.common import
|
|
15
|
+
from ngio.common import Roi
|
|
16
16
|
from ngio.tables._validators import validate_columns
|
|
17
17
|
from ngio.tables.backends import ImplementedTableBackends
|
|
18
18
|
from ngio.utils import NgioValueError, ZarrGroupHandler
|
|
@@ -37,7 +37,7 @@ TRANSLATION_COLUMNS = ["translation_x", "translation_y", "translation_z"]
|
|
|
37
37
|
OPTIONAL_COLUMNS = ORIGIN_COLUMNS + TRANSLATION_COLUMNS
|
|
38
38
|
|
|
39
39
|
|
|
40
|
-
def _dataframe_to_rois(dataframe: pd.DataFrame) -> dict[str,
|
|
40
|
+
def _dataframe_to_rois(dataframe: pd.DataFrame) -> dict[str, Roi]:
|
|
41
41
|
"""Convert a DataFrame to a WorldCooROI object."""
|
|
42
42
|
rois = {}
|
|
43
43
|
for key, row in dataframe.iterrows():
|
|
@@ -47,7 +47,7 @@ def _dataframe_to_rois(dataframe: pd.DataFrame) -> dict[str, WorldCooROI]:
|
|
|
47
47
|
translation = {col: row.get(col, None) for col in TRANSLATION_COLUMNS}
|
|
48
48
|
translation = dict(filter(lambda x: x[1] is not None, translation.items()))
|
|
49
49
|
|
|
50
|
-
roi =
|
|
50
|
+
roi = Roi(
|
|
51
51
|
name=str(key),
|
|
52
52
|
x=row["x_micrometer"],
|
|
53
53
|
y=row["y_micrometer"],
|
|
@@ -63,7 +63,7 @@ def _dataframe_to_rois(dataframe: pd.DataFrame) -> dict[str, WorldCooROI]:
|
|
|
63
63
|
return rois
|
|
64
64
|
|
|
65
65
|
|
|
66
|
-
def _rois_to_dataframe(rois: dict[str,
|
|
66
|
+
def _rois_to_dataframe(rois: dict[str, Roi], index_key: str) -> pd.DataFrame:
|
|
67
67
|
"""Convert a list of WorldCooROI objects to a DataFrame."""
|
|
68
68
|
data = []
|
|
69
69
|
for roi in rois.values():
|
|
@@ -124,7 +124,7 @@ class _GenericRoiTableV1(Generic[_roi_meta]):
|
|
|
124
124
|
_meta: _roi_meta
|
|
125
125
|
|
|
126
126
|
def __init__(
|
|
127
|
-
self, meta: _roi_meta | None = None, rois: Iterable[
|
|
127
|
+
self, meta: _roi_meta | None = None, rois: Iterable[Roi] | None = None
|
|
128
128
|
) -> None:
|
|
129
129
|
"""Create a new ROI table."""
|
|
130
130
|
if meta is None:
|
|
@@ -225,13 +225,13 @@ class _GenericRoiTableV1(Generic[_roi_meta]):
|
|
|
225
225
|
self._meta.backend = backend_name
|
|
226
226
|
self._table_backend = backend
|
|
227
227
|
|
|
228
|
-
def rois(self) -> list[
|
|
228
|
+
def rois(self) -> list[Roi]:
|
|
229
229
|
"""List all ROIs in the table."""
|
|
230
230
|
return list(self._rois.values())
|
|
231
231
|
|
|
232
|
-
def add(self, roi:
|
|
232
|
+
def add(self, roi: Roi | Iterable[Roi]) -> None:
|
|
233
233
|
"""Append ROIs to the current table."""
|
|
234
|
-
if isinstance(roi,
|
|
234
|
+
if isinstance(roi, Roi):
|
|
235
235
|
roi = [roi]
|
|
236
236
|
|
|
237
237
|
for _roi in roi:
|
|
@@ -266,10 +266,15 @@ class RoiTableV1(_GenericRoiTableV1[RoiTableV1Meta]):
|
|
|
266
266
|
https://fractal-analytics-platform.github.io/fractal-tasks-core/tables/
|
|
267
267
|
"""
|
|
268
268
|
|
|
269
|
-
def __init__(self, rois: Iterable[
|
|
269
|
+
def __init__(self, rois: Iterable[Roi] | None = None) -> None:
|
|
270
270
|
"""Create a new ROI table."""
|
|
271
271
|
super().__init__(RoiTableV1Meta(), rois)
|
|
272
272
|
|
|
273
|
+
def __repr__(self) -> str:
|
|
274
|
+
"""Return a string representation of the table."""
|
|
275
|
+
prop = f"num_rois={len(self._rois)}"
|
|
276
|
+
return f"RoiTableV1({prop})"
|
|
277
|
+
|
|
273
278
|
@staticmethod
|
|
274
279
|
def type() -> Literal["roi_table"]:
|
|
275
280
|
"""Return the type of the table."""
|
|
@@ -290,14 +295,14 @@ class RoiTableV1(_GenericRoiTableV1[RoiTableV1Meta]):
|
|
|
290
295
|
"""Return the metadata type of the table."""
|
|
291
296
|
return RoiTableV1Meta
|
|
292
297
|
|
|
293
|
-
def get(self, roi_name: str) ->
|
|
298
|
+
def get(self, roi_name: str) -> Roi:
|
|
294
299
|
"""Get an ROI from the table."""
|
|
295
300
|
if roi_name not in self._rois:
|
|
296
301
|
raise NgioValueError(f"ROI {roi_name} not found in the table.")
|
|
297
302
|
return self._rois[roi_name]
|
|
298
303
|
|
|
299
304
|
|
|
300
|
-
class
|
|
305
|
+
class MaskingRoiTableV1(_GenericRoiTableV1[MaskingRoiTableV1Meta]):
|
|
301
306
|
"""Class to handle fractal ROI tables.
|
|
302
307
|
|
|
303
308
|
To know more about the ROI table format, please refer to the
|
|
@@ -307,7 +312,7 @@ class MaskingROITableV1(_GenericRoiTableV1[MaskingRoiTableV1Meta]):
|
|
|
307
312
|
|
|
308
313
|
def __init__(
|
|
309
314
|
self,
|
|
310
|
-
rois: Iterable[
|
|
315
|
+
rois: Iterable[Roi] | None = None,
|
|
311
316
|
reference_label: str | None = None,
|
|
312
317
|
) -> None:
|
|
313
318
|
"""Create a new ROI table."""
|
|
@@ -316,6 +321,13 @@ class MaskingROITableV1(_GenericRoiTableV1[MaskingRoiTableV1Meta]):
|
|
|
316
321
|
meta.region = RegionMeta(path=reference_label)
|
|
317
322
|
super().__init__(meta, rois)
|
|
318
323
|
|
|
324
|
+
def __repr__(self) -> str:
|
|
325
|
+
"""Return a string representation of the table."""
|
|
326
|
+
prop = f"num_rois={len(self._rois)}"
|
|
327
|
+
if self.reference_label is not None:
|
|
328
|
+
prop += f", reference_label={self.reference_label}"
|
|
329
|
+
return f"MaskingRoiTableV1({prop})"
|
|
330
|
+
|
|
319
331
|
@staticmethod
|
|
320
332
|
def type() -> Literal["masking_roi_table"]:
|
|
321
333
|
"""Return the type of the table."""
|
|
@@ -336,7 +348,17 @@ class MaskingROITableV1(_GenericRoiTableV1[MaskingRoiTableV1Meta]):
|
|
|
336
348
|
"""Return the metadata type of the table."""
|
|
337
349
|
return MaskingRoiTableV1Meta
|
|
338
350
|
|
|
339
|
-
|
|
351
|
+
@property
|
|
352
|
+
def reference_label(self) -> str | None:
|
|
353
|
+
"""Return the reference label."""
|
|
354
|
+
path = self._meta.region
|
|
355
|
+
if path is None:
|
|
356
|
+
return None
|
|
357
|
+
path = path.path
|
|
358
|
+
path = path.split("/")[-1]
|
|
359
|
+
return path
|
|
360
|
+
|
|
361
|
+
def get(self, label: int) -> Roi:
|
|
340
362
|
"""Get an ROI from the table."""
|
|
341
363
|
_label = str(label)
|
|
342
364
|
if _label not in self._rois:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ngio
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.2
|
|
4
4
|
Summary: Next Generation file format IO
|
|
5
5
|
Project-URL: homepage, https://github.com/lorenzocerrone/ngio
|
|
6
6
|
Project-URL: repository, https://github.com/lorenzocerrone/ngio
|
|
@@ -41,6 +41,8 @@ Requires-Dist: rich; extra == 'dev'
|
|
|
41
41
|
Requires-Dist: ruff; extra == 'dev'
|
|
42
42
|
Requires-Dist: scikit-image; extra == 'dev'
|
|
43
43
|
Provides-Extra: docs
|
|
44
|
+
Requires-Dist: markdown-exec[ansi]; extra == 'docs'
|
|
45
|
+
Requires-Dist: matplotlib; extra == 'docs'
|
|
44
46
|
Requires-Dist: mike; extra == 'docs'
|
|
45
47
|
Requires-Dist: mkdocs; extra == 'docs'
|
|
46
48
|
Requires-Dist: mkdocs-autorefs; extra == 'docs'
|
|
@@ -49,7 +51,9 @@ Requires-Dist: mkdocs-git-revision-date-localized-plugin; extra == 'docs'
|
|
|
49
51
|
Requires-Dist: mkdocs-jupyter; extra == 'docs'
|
|
50
52
|
Requires-Dist: mkdocs-material; extra == 'docs'
|
|
51
53
|
Requires-Dist: mkdocstrings[python]; extra == 'docs'
|
|
54
|
+
Requires-Dist: rich; extra == 'docs'
|
|
52
55
|
Requires-Dist: scikit-image; extra == 'docs'
|
|
56
|
+
Requires-Dist: tabulate; extra == 'docs'
|
|
53
57
|
Provides-Extra: test
|
|
54
58
|
Requires-Dist: pytest; extra == 'test'
|
|
55
59
|
Requires-Dist: pytest-cov; extra == 'test'
|
|
@@ -69,9 +73,9 @@ NGIO is a Python library to streamline OME-Zarr image analysis workflows.
|
|
|
69
73
|
**Main Goals:**
|
|
70
74
|
|
|
71
75
|
- Abstract object base API for handling OME-Zarr files
|
|
72
|
-
-
|
|
76
|
+
- Powerful iterators for processing data using common access patterns
|
|
73
77
|
- Tight integration with [Fractal's Table Fractal](https://fractal-analytics-platform.github.io/fractal-tasks-core/tables/)
|
|
74
|
-
-
|
|
78
|
+
- Validation of OME-Zarr files
|
|
75
79
|
|
|
76
80
|
To get started, check out the [Getting Started](https://fractal-analytics-platform.github.io/ngio/getting-started/) guide. Or checkout our [Documentation](https://fractal-analytics-platform.github.io/ngio/)
|
|
77
81
|
|
|
@@ -91,10 +95,9 @@ To get started, check out the [Getting Started](https://fractal-analytics-platfo
|
|
|
91
95
|
| Basic Iterators | Ongoing | End-September | Read and Write Iterators for common access patterns |
|
|
92
96
|
| Base Documentation | ✅ | End-September | API Documentation and Examples |
|
|
93
97
|
| Beta Ready Testing | ✅ | End-September | Beta Testing; Library is ready for testing, but the API is not stable |
|
|
94
|
-
| Streaming from Fractal | Ongoing | December | Ngio can stream
|
|
98
|
+
| Streaming from Fractal | Ongoing | December | Ngio can stream OME-Zarr from fractal |
|
|
95
99
|
| Mask Iterators | Ongoing | Early 2025 | Iterators over Masked Tables |
|
|
96
100
|
| Advanced Iterators | Not started | mid-2025 | Iterators for advanced access patterns |
|
|
97
101
|
| Parallel Iterators | Not started | mid-2025 | Concurrent Iterators for parallel read and write |
|
|
98
102
|
| Full Documentation | Not started | 2025 | Complete Documentation |
|
|
99
103
|
| Release 1.0 (Commitment to API) | Not started | 2025 | API is stable; breaking changes will be avoided |
|
|
100
|
-
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
ngio/__init__.py,sha256=zce-RIfRhkiFyfKwO6s7A1-9ZCD3n6RuVuW3GeRj_VA,1309
|
|
2
|
+
ngio/common/__init__.py,sha256=tMKp1eZzGfpdKDkpfHn0iVzSO11dmp-RZARpuxoGGQk,1351
|
|
3
|
+
ngio/common/_array_pipe.py,sha256=we3gZLhgUsiPQwPQqg_XVkyG_9EpQ2xoe0L_nOALDho,7828
|
|
4
|
+
ngio/common/_axes_transforms.py,sha256=kWU0M5erNmgWBXdu5LNv-tLW3jqkT00MMYX7cz-kyHs,2035
|
|
5
|
+
ngio/common/_common_types.py,sha256=OkAYNSNjZkixL1MI-HPBVuXamheFBr862uJ4PvTxmhk,129
|
|
6
|
+
ngio/common/_dimensions.py,sha256=UV2XulWaROb3Y2f4fv27ZkTIu-MoS53U26aDkrv-_lk,3900
|
|
7
|
+
ngio/common/_masking_roi.py,sha256=-o6meGP17iTXEbkO9aGh1VX2drkc2laIcRJvCy_pRRM,4919
|
|
8
|
+
ngio/common/_pyramid.py,sha256=8xTFnrKcldYXSnBqcVtH1E6hzS9_et8NdoPo8zfTCjc,7308
|
|
9
|
+
ngio/common/_roi.py,sha256=dq1iVT8-G_zWuxcYWJeHfviBSbPgsyKUcDL3Vg6jx6I,5122
|
|
10
|
+
ngio/common/_slicer.py,sha256=AKpwXRncOmF9nhjKYma0C_41WqAgSv860beKGx-aw-0,3075
|
|
11
|
+
ngio/common/_zoom.py,sha256=KsURa5VuixmpbAAY5-6obmuQV8vfiHKZqBxZDXvchpM,5473
|
|
12
|
+
ngio/hcs/__init__.py,sha256=5oAYT_454WGhms97kxo8gS4_rKHtFf_x-9uu8M_VeVM,356
|
|
13
|
+
ngio/hcs/plate.py,sha256=Upmq8-1zi0rWtsTVHsZYAma6EwvbgaEF54nHlcL5PBU,26219
|
|
14
|
+
ngio/images/__init__.py,sha256=DYbXAdBgPxyjBRdJrWvU0UnBRI0gUMmx9KaJ-Bucvz4,533
|
|
15
|
+
ngio/images/abstract_image.py,sha256=oR0CeWUdQJkJ8bbI4kegX3xFIRcR3x5F_yaT4Z-mbag,10226
|
|
16
|
+
ngio/images/create.py,sha256=XYn30m_2OSZeHHASYHc3eK9u_gZIYy9wo6mGdRGaq5c,9473
|
|
17
|
+
ngio/images/image.py,sha256=FSlYvwOk3Fz4ywUZwWcLeCMWLMB4wQ-U0lCGYomVI-o,16108
|
|
18
|
+
ngio/images/label.py,sha256=bmwWuOfZWApjttL_CspiNg-j728ODF1i2zKtKIP_u6k,10120
|
|
19
|
+
ngio/images/masked_image.py,sha256=IBo8x2jHyXBXn7ORo8fSiwBPjV_1JOTb_vatjKNxbJ0,8531
|
|
20
|
+
ngio/images/ome_zarr_container.py,sha256=mEKOtZtZkJbMG02ne0pRIKtlFoi8B1QV8j9WSXDavRs,28705
|
|
21
|
+
ngio/ome_zarr_meta/__init__.py,sha256=oZ8PEsWM7U0KwzpsnvVfX9k4UfuTz5sZ8B6B9eY5hyY,1193
|
|
22
|
+
ngio/ome_zarr_meta/_meta_handlers.py,sha256=BLvYt5PONYrWkEb2XgEiAXR_OX9rfeX_C0eEqen0jQA,25549
|
|
23
|
+
ngio/ome_zarr_meta/ngio_specs/__init__.py,sha256=05NQukZG0nNvjzf8AKWGu7PhjhQcImGSAOK3D3Bg-Js,1786
|
|
24
|
+
ngio/ome_zarr_meta/ngio_specs/_axes.py,sha256=Kqe9T7LWa_9o3UWS5uzALyyNluIhXxWhDGxWY4-GIo8,16707
|
|
25
|
+
ngio/ome_zarr_meta/ngio_specs/_channels.py,sha256=ufZuYuTO5PJA1vcBrNAcuZCMgIEwF57buPloTHIzB1Q,14082
|
|
26
|
+
ngio/ome_zarr_meta/ngio_specs/_dataset.py,sha256=hY8ogPPxvCgVg6k02t3zUr24lasYrvnxBd1iPEigdG4,5892
|
|
27
|
+
ngio/ome_zarr_meta/ngio_specs/_ngio_hcs.py,sha256=VhXfgy87z3xpzIqC4Pz5iwcoh0C47mvRiAhN0vLVSJA,17294
|
|
28
|
+
ngio/ome_zarr_meta/ngio_specs/_ngio_image.py,sha256=8E38Mgw-l0Ff1nkmCJIzo64G_paAVhM8xktUS_V5egY,17960
|
|
29
|
+
ngio/ome_zarr_meta/ngio_specs/_pixel_size.py,sha256=5TT8250XdCKUnk3OwZeyXIMNFKOg_jx4NnoCo9RLsXI,4079
|
|
30
|
+
ngio/ome_zarr_meta/v04/__init__.py,sha256=dJRzzxyYc81kf-0Hip_bqvbdManaM8XTdQX2meWyCSs,583
|
|
31
|
+
ngio/ome_zarr_meta/v04/_custom_models.py,sha256=5GxiDERvLuvq4QvApcA6EiKLS6hLFX1R0R_9rSaa85A,530
|
|
32
|
+
ngio/ome_zarr_meta/v04/_v04_spec_utils.py,sha256=05tEr2eEP_XVIfBMOAWLT7lzJV4KS5eYrpK8l94tn3w,15876
|
|
33
|
+
ngio/tables/__init__.py,sha256=gxvNvAgLePgrngOm06H5qU50Axc6boeIs5iCfrmqTi0,609
|
|
34
|
+
ngio/tables/_validators.py,sha256=RzF09YrlUSb-xdVlosuU-_BaLswtvhpduHfzLaWu2mY,6468
|
|
35
|
+
ngio/tables/tables_container.py,sha256=elOTjpRuC_zsRuZmGeBWfMl2y6OLp2g6FmOe__xLsWE,9845
|
|
36
|
+
ngio/tables/backends/__init__.py,sha256=NlOXmZXDA1kOCVONUyo_aqSjdMHmfqk-3xuKBLXpaUM,217
|
|
37
|
+
ngio/tables/backends/_abstract_backend.py,sha256=JlaHqLjDm2uVnXFWxsHMojNeKo3leg6uauzoFMSF5O4,2256
|
|
38
|
+
ngio/tables/backends/_anndata_utils.py,sha256=zo85K0bwgyQKBj8hQASfOSWugdd4BPUTyT6_tRO58fI,6917
|
|
39
|
+
ngio/tables/backends/_anndata_v1.py,sha256=hhEwoBybWFDHqajOk_JEazniYmhAlCehOYTtmcYJfyY,2615
|
|
40
|
+
ngio/tables/backends/_json_v1.py,sha256=9ZC0d_tMiiugm-VXDL3sRFfESzSnnY9kAtSxoXYV-dY,1910
|
|
41
|
+
ngio/tables/backends/_table_backends.py,sha256=XXtnZqVDbMqFkbUkHbf9IBNz4teCouLpa5fWgEgVtfg,3269
|
|
42
|
+
ngio/tables/v1/__init__.py,sha256=XWi6f_KbjbX45Ku-7uymJRSTVWyFAPAAEp_TXDeZV4s,314
|
|
43
|
+
ngio/tables/v1/_feature_table.py,sha256=mR8BwvZfkUT42mQuS0KACW7fTqcsIl6Ckiwg-1UEGpY,5865
|
|
44
|
+
ngio/tables/v1/_generic_table.py,sha256=jVW0vv0HMPXZjuP_uAvz-rPsvLQhjo3RfSa2Y9vdg1o,5679
|
|
45
|
+
ngio/tables/v1/_roi_table.py,sha256=oE898CUh0ZbtnFXiM05T6VwTwRguv-aVYKkBmSx0Kj0,11296
|
|
46
|
+
ngio/utils/__init__.py,sha256=r3nuLWgp6-cQlS4ODjYSBrfgdTLkCOVke9jKbn1NpkA,1129
|
|
47
|
+
ngio/utils/_datasets.py,sha256=EdYJHIifpRou4f43dIuiKsdxe4K6FaeS4f1_e_EYrcI,1727
|
|
48
|
+
ngio/utils/_errors.py,sha256=pKQ12LUjQLYE1nUawemA5h7HsgznjaSvV1n2PQU33N0,759
|
|
49
|
+
ngio/utils/_fractal_fsspec_store.py,sha256=7qoGLiLi8JQFh9Ej_z5WNwQQuWrujb0f6p9nj8ocsS8,548
|
|
50
|
+
ngio/utils/_logger.py,sha256=HIuqD_2ShfFGDswBddcouStbKfL0Vz_ah8cAIFGhbS8,888
|
|
51
|
+
ngio/utils/_zarr_utils.py,sha256=r075cNpr-JHZ1PaDHX1KlENIGMvLf-WTTYwpODACWm4,12924
|
|
52
|
+
ngio-0.2.2.dist-info/METADATA,sha256=tYJbuBZdqsie42NofiB0ALq7NhAaFn-ccwLe-QQ-bY0,5170
|
|
53
|
+
ngio-0.2.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
54
|
+
ngio-0.2.2.dist-info/licenses/LICENSE,sha256=UgN_a1QCeNh9rZWfz-wORQFxE3elQzLWPQaoK6N6fxQ,1502
|
|
55
|
+
ngio-0.2.2.dist-info/RECORD,,
|
ngio-0.2.0b3.dist-info/RECORD
DELETED
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
ngio/__init__.py,sha256=8-5UcDEIPVIM3mk4GqyBJNteQo0WZNOox1-F6UJoHjg,1001
|
|
2
|
-
ngio/common/__init__.py,sha256=4MLD3Xgr6-I6NwGoY7pa5qQfbfEobFCW3KvLybYcgOc,1373
|
|
3
|
-
ngio/common/_array_pipe.py,sha256=rZQMB3cgMSnpvZpLZEndNZVdWZIOMWgvYqeEOLz7XQ0,7576
|
|
4
|
-
ngio/common/_axes_transforms.py,sha256=kWU0M5erNmgWBXdu5LNv-tLW3jqkT00MMYX7cz-kyHs,2035
|
|
5
|
-
ngio/common/_common_types.py,sha256=OkAYNSNjZkixL1MI-HPBVuXamheFBr862uJ4PvTxmhk,129
|
|
6
|
-
ngio/common/_dimensions.py,sha256=UV2XulWaROb3Y2f4fv27ZkTIu-MoS53U26aDkrv-_lk,3900
|
|
7
|
-
ngio/common/_masking_roi.py,sha256=WSlFwoLH4Rjh0AJFFNa2FtFNfs5NB0exgzGb3Gy5K0s,4951
|
|
8
|
-
ngio/common/_pyramid.py,sha256=8xTFnrKcldYXSnBqcVtH1E6hzS9_et8NdoPo8zfTCjc,7308
|
|
9
|
-
ngio/common/_roi.py,sha256=PIxiMarPZwIjqcd1P4aUpwZttvaTQscqXOS7xJCxz7Y,5181
|
|
10
|
-
ngio/common/_slicer.py,sha256=AKpwXRncOmF9nhjKYma0C_41WqAgSv860beKGx-aw-0,3075
|
|
11
|
-
ngio/common/_zoom.py,sha256=KsURa5VuixmpbAAY5-6obmuQV8vfiHKZqBxZDXvchpM,5473
|
|
12
|
-
ngio/hcs/__init__.py,sha256=9YNmtHgCKhYSjmAE2-YVg5BycH-5cQGAE9xFrxxWo8c,188
|
|
13
|
-
ngio/hcs/plate.py,sha256=b-EHns-OGQF_RXEa-GDzP2TJFqpRFc0rBKdgf4l7MwU,12409
|
|
14
|
-
ngio/images/__init__.py,sha256=aijqG14eyqVgHtnlcKVNx37FRfT6QvKt8V6bwBpX_r8,526
|
|
15
|
-
ngio/images/abstract_image.py,sha256=UQpcp--SzJITIZfSg_KZWU9_mIC11LdHTuITJdxCNTE,9671
|
|
16
|
-
ngio/images/create.py,sha256=wQfoB9pmQkHFFYE3WNbhgQt36XhoTopGcPGcEXTNI-0,9764
|
|
17
|
-
ngio/images/image.py,sha256=BL9TINwYrT2_HdkhCKoRcfy7XqiiwEIVQvHDFkF8ZWc,15246
|
|
18
|
-
ngio/images/label.py,sha256=gvVuRUsrDBk-EpsuUMepC4M5hYPb5yTVvWwozaLM7-g,9333
|
|
19
|
-
ngio/images/masked_image.py,sha256=4YYVqf8OtIp-wWGVGUKMHMTqod4p4F7ZyWrsUIXMjEs,7905
|
|
20
|
-
ngio/images/omezarr_container.py,sha256=db5KnWAfWoaEekNmWxVQPAI3xXXeQGItQ3gvBbr55VA,27376
|
|
21
|
-
ngio/ome_zarr_meta/__init__.py,sha256=EfBX9ppb_wliSIcVb4NBDt3dFVldeIJ0h9tY9HELRY4,1075
|
|
22
|
-
ngio/ome_zarr_meta/_meta_handlers.py,sha256=BLvYt5PONYrWkEb2XgEiAXR_OX9rfeX_C0eEqen0jQA,25549
|
|
23
|
-
ngio/ome_zarr_meta/ngio_specs/__init__.py,sha256=ZpghXfbq0r-YJklD7J76BRMTlzEIAJFzneYlsosdyTY,1548
|
|
24
|
-
ngio/ome_zarr_meta/ngio_specs/_axes.py,sha256=zgAE0-2DHzJfqGqBhyjY7y_6qAgDLdV9iuWz-YsHe9Y,16682
|
|
25
|
-
ngio/ome_zarr_meta/ngio_specs/_channels.py,sha256=ufZuYuTO5PJA1vcBrNAcuZCMgIEwF57buPloTHIzB1Q,14082
|
|
26
|
-
ngio/ome_zarr_meta/ngio_specs/_dataset.py,sha256=xT4GY2mdIsm6nAP8bXRj5E9-P6rS-iwzcXT_o3pZajo,4696
|
|
27
|
-
ngio/ome_zarr_meta/ngio_specs/_ngio_hcs.py,sha256=YQlobPYU7vbo9fShHQyCfzLlDUlP-mprAivay6W4-A0,11610
|
|
28
|
-
ngio/ome_zarr_meta/ngio_specs/_ngio_image.py,sha256=74L3ibo0SurKnbkxt0Re9jEVcLf63ZJouL2ZHpHZDbc,16776
|
|
29
|
-
ngio/ome_zarr_meta/ngio_specs/_pixel_size.py,sha256=QZy94THDBkeLgOtN6o_jF3oXSewRxdM2E7ZTSBTo7RU,3878
|
|
30
|
-
ngio/ome_zarr_meta/v04/__init__.py,sha256=dJRzzxyYc81kf-0Hip_bqvbdManaM8XTdQX2meWyCSs,583
|
|
31
|
-
ngio/ome_zarr_meta/v04/_v04_spec_utils.py,sha256=G4GGarkktjdsIzHUhaoZEL69-r-ZLpLz6y5TDVsN4W0,15939
|
|
32
|
-
ngio/tables/__init__.py,sha256=Mu3P8D-AtAxv9l4vUo-UJPfTYkgvB5A8qpOh3gMWX4E,609
|
|
33
|
-
ngio/tables/_validators.py,sha256=RzF09YrlUSb-xdVlosuU-_BaLswtvhpduHfzLaWu2mY,6468
|
|
34
|
-
ngio/tables/tables_container.py,sha256=FXp-s_zKqbMcBFh4515kbSdxYaFK1ULE2Pf0pzlnpEE,9845
|
|
35
|
-
ngio/tables/backends/__init__.py,sha256=NlOXmZXDA1kOCVONUyo_aqSjdMHmfqk-3xuKBLXpaUM,217
|
|
36
|
-
ngio/tables/backends/_abstract_backend.py,sha256=JlaHqLjDm2uVnXFWxsHMojNeKo3leg6uauzoFMSF5O4,2256
|
|
37
|
-
ngio/tables/backends/_anndata_utils.py,sha256=zo85K0bwgyQKBj8hQASfOSWugdd4BPUTyT6_tRO58fI,6917
|
|
38
|
-
ngio/tables/backends/_anndata_v1.py,sha256=hhEwoBybWFDHqajOk_JEazniYmhAlCehOYTtmcYJfyY,2615
|
|
39
|
-
ngio/tables/backends/_json_v1.py,sha256=9ZC0d_tMiiugm-VXDL3sRFfESzSnnY9kAtSxoXYV-dY,1910
|
|
40
|
-
ngio/tables/backends/_table_backends.py,sha256=XXtnZqVDbMqFkbUkHbf9IBNz4teCouLpa5fWgEgVtfg,3269
|
|
41
|
-
ngio/tables/v1/__init__.py,sha256=VtS1RUiPn_jHa__IUsGGzXSYsG0O1V0fpVR6xCOSFHY,314
|
|
42
|
-
ngio/tables/v1/_feature_table.py,sha256=yO1fWUfEM5nTSU6vx4QEwSY3MsgB8zZyr6Ui0fwc16w,5161
|
|
43
|
-
ngio/tables/v1/_generic_table.py,sha256=NcDWa6NI7LQplSVPOn0HG5CjrILTf0ZKZ1i_E-H5LJM,5279
|
|
44
|
-
ngio/tables/v1/_roi_table.py,sha256=GanlVPcmtFn5mzQYQi3-ldDLAdxPdC92NAvtvezp5Ps,10674
|
|
45
|
-
ngio/utils/__init__.py,sha256=r3nuLWgp6-cQlS4ODjYSBrfgdTLkCOVke9jKbn1NpkA,1129
|
|
46
|
-
ngio/utils/_datasets.py,sha256=EdYJHIifpRou4f43dIuiKsdxe4K6FaeS4f1_e_EYrcI,1727
|
|
47
|
-
ngio/utils/_errors.py,sha256=pKQ12LUjQLYE1nUawemA5h7HsgznjaSvV1n2PQU33N0,759
|
|
48
|
-
ngio/utils/_fractal_fsspec_store.py,sha256=7qoGLiLi8JQFh9Ej_z5WNwQQuWrujb0f6p9nj8ocsS8,548
|
|
49
|
-
ngio/utils/_logger.py,sha256=HIuqD_2ShfFGDswBddcouStbKfL0Vz_ah8cAIFGhbS8,888
|
|
50
|
-
ngio/utils/_zarr_utils.py,sha256=r075cNpr-JHZ1PaDHX1KlENIGMvLf-WTTYwpODACWm4,12924
|
|
51
|
-
ngio-0.2.0b3.dist-info/METADATA,sha256=hvC4PR-EEJBiDvSHl4Bq_0I924a0ifhf0r1vdVsiQ6k,4995
|
|
52
|
-
ngio-0.2.0b3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
53
|
-
ngio-0.2.0b3.dist-info/licenses/LICENSE,sha256=UgN_a1QCeNh9rZWfz-wORQFxE3elQzLWPQaoK6N6fxQ,1502
|
|
54
|
-
ngio-0.2.0b3.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|