Skip to content

Commit 6629819

Browse files
committed
refactor(ngff): extract get_ome_attrs utility for version-independent OME metadata access
Replace inline v0.4/v0.5 metadata branching with get_ome_attrs() from core.compat. Used in NGFFNode.maybe_wrapped_ome_attrs, Plate.first_position, and tests. Signed-off-by: Sricharan Reddy Varra <sricharan.varra@biohub.org>
1 parent 0572441 commit 6629819

4 files changed

Lines changed: 20 additions & 11 deletions

File tree

src/iohub/core/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
"""Core zarr implementation abstraction for iohub."""
22

33
from iohub.core.arrays import NGFFArray
4-
from iohub.core.compat import ngff_version_for_format, zarr_format_for_version
4+
from iohub.core.compat import get_ome_attrs, ngff_version_for_format, zarr_format_for_version
55
from iohub.core.config import (
66
CompressorConfig,
77
ImplementationConfig,

src/iohub/core/compat.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,16 @@ def zarr_format_for_version(version: NGFFVersion) -> ZarrFormat:
1616
raise ValueError(f"Unknown NGFF version: {version!r}. Supported: {list(NGFF_TO_ZARR_FORMAT)}") from err
1717

1818

19+
def get_ome_attrs(attrs) -> dict:
20+
"""Extract OME metadata dict from zarr attrs, regardless of NGFF version.
21+
22+
v0.5 stores wrap metadata under an ``"ome"`` key; v0.4 stores
23+
place it flat in ``.zattrs``. This function returns the OME
24+
metadata dict in both cases.
25+
"""
26+
return attrs.get("ome") or dict(attrs)
27+
28+
1929
def ngff_version_for_format(zarr_format: ZarrFormat) -> NGFFVersion:
2030
"""Map zarr format integer to NGFF version string."""
2131
try:

src/iohub/ngff/nodes.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
from pydantic import ValidationError
2727

2828
from iohub.core import ArraySpec, NGFFArray, get_implementation
29+
from iohub.core.compat import get_ome_attrs
2930
from iohub.core.config import ImplementationConfig
3031
from iohub.core.errors import StoreOpenError
3132
from iohub.core.protocol import ZarrImplementation
@@ -184,7 +185,7 @@ def zattrs(self):
184185
@property
185186
def maybe_wrapped_ome_attrs(self):
186187
"""Container of OME metadata attributes."""
187-
return self.zattrs.get("ome") or self.zattrs
188+
return get_ome_attrs(self.zattrs)
188189

189190
@property
190191
def version(self) -> Literal["0.4", "0.5"]:
@@ -2486,7 +2487,7 @@ def _first_pos(self):
24862487
try:
24872488
well_path = self.metadata.wells[0].path
24882489
well_grp = self.zgroup[well_path]
2489-
attrs = well_grp.attrs.get("ome") or dict(well_grp.attrs)
2490+
attrs = get_ome_attrs(well_grp.attrs)
24902491
pos_name = attrs["well"]["images"][0]["path"]
24912492
return Position(
24922493
group=well_grp[pos_name],

tests/ngff/test_ngff.py

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
if TYPE_CHECKING:
2626
from _typeshed import StrPath
2727

28+
from iohub.core.compat import get_ome_attrs
2829
from iohub.core.utils import pad_shape
2930
from iohub.ngff.models import TO_DICT_SETTINGS
3031
from iohub.ngff.nodes import (
@@ -825,10 +826,7 @@ def test_set_transform_fov(ch_shape_dtype, arr_name, version):
825826
assert dataset.metadata.multiscales[0].coordinate_transformations == transform
826827
# read data with plain zarr
827828
group = zarr.open(store_path)
828-
if version == "0.4":
829-
maybe_ome = group.attrs
830-
elif version == "0.5":
831-
maybe_ome = group.attrs["ome"]
829+
maybe_ome = get_ome_attrs(group.attrs)
832830
assert maybe_ome["multiscales"][0]["coordinateTransformations"] == [
833831
translate.model_dump(**TO_DICT_SETTINGS) for translate in transform
834832
]
@@ -1157,7 +1155,7 @@ def test_create_well(row_names: list[str], col_names: list[str]):
11571155
for row_name in row_names:
11581156
for col_name in col_names:
11591157
dataset.create_well(row_name, col_name)
1160-
plate_meta = dataset.zattrs.get("ome", dataset.zattrs)["plate"]
1158+
plate_meta = get_ome_attrs(dataset.zattrs)["plate"]
11611159
assert [c["name"] for c in plate_meta["columns"]] == col_names
11621160
assert [r["name"] for r in plate_meta["rows"]] == row_names
11631161

@@ -1206,7 +1204,7 @@ def test_create_position(row, col, pos, version):
12061204
version=version,
12071205
)
12081206
_ = dataset.create_position(row_name=row, col_name=col, pos_name=pos)
1209-
ome = dict(dataset.zgroup.attrs) if version == "0.4" else dataset.zgroup.attrs["ome"]
1207+
ome = get_ome_attrs(dataset.zgroup.attrs)
12101208
assert [c["name"] for c in ome["plate"]["columns"]] == [col]
12111209
assert [r["name"] for r in ome["plate"]["rows"]] == [row]
12121210
assert (store_path / row / col / pos).is_dir()
@@ -1257,7 +1255,7 @@ def test_create_positions(tmp_path, version):
12571255

12581256
# Collect positions and compare those
12591257

1260-
get_metadata = lambda x: dict(x.zgroup.attrs["ome"])
1258+
get_metadata = lambda x: get_ome_attrs(x.zgroup.attrs)
12611259

12621260
single_plate_metadata = get_metadata(single)
12631261
batched_plate_metadata = get_metadata(batched)
@@ -1316,7 +1314,7 @@ def test_create_positions_with_tuple_variations(tmp_path, version):
13161314
batched.create_positions(positions)
13171315

13181316
# Verify metadata matches
1319-
get_metadata = lambda x: dict(x.zgroup.attrs["ome"])
1317+
get_metadata = lambda x: get_ome_attrs(x.zgroup.attrs)
13201318

13211319
single_meta = get_metadata(single)
13221320
batched_meta = get_metadata(batched)

0 commit comments

Comments
 (0)