11from collections .abc import MutableMapping
22from pathlib import Path
33from typing import Union , Optional
4- from packaging import version
4+ import packaging . version
55
66import dask .array
77import zarr
1818from .v04 .zarr_metadata import Axis , Dataset , Scale , Translation
1919from .validate import validate as validate_ngff
2020
21- zarr_version = version .parse (zarr .__version__ )
21+ zarr_version = packaging . version .parse (zarr .__version__ )
2222zarr_version_major = zarr_version .major
2323
2424
@@ -48,7 +48,11 @@ def from_ngff_zarr(
4848
4949 format_kwargs = {}
5050 if version and zarr_version_major >= 3 :
51- format_kwargs = {"zarr_format" : 2 } if version == "0.4" else {"zarr_format" : 3 }
51+ format_kwargs = (
52+ {"zarr_format" : 2 }
53+ if packaging .version .parse (version ) < packaging .version .parse ("0.5" )
54+ else {"zarr_format" : 3 }
55+ )
5256 root = zarr .open_group (store , mode = "r" , ** format_kwargs )
5357 root_attrs = root .attrs .asdict ()
5458
@@ -66,16 +70,22 @@ def from_ngff_zarr(
6670 else :
6771 metadata = root .attrs ["multiscales" ][0 ]
6872
69- dims = [a ["name" ] for a in metadata ["axes" ]]
73+ if "axes" not in metadata :
74+ from .v04 .zarr_metadata import supported_dims
75+
76+ dims = list (reversed (supported_dims ))
77+ else :
78+ dims = [a ["name" ] if "name" in a else a for a in metadata ["axes" ]]
7079
7180 name = "image"
7281 if name in metadata :
7382 name = metadata ["name" ]
7483
7584 units = {d : None for d in dims }
76- for axis in metadata ["axes" ]:
77- if "unit" in axis :
78- units [axis ["name" ]] = axis ["unit" ]
85+ if "axes" in metadata :
86+ for axis in metadata ["axes" ]:
87+ if "unit" in axis :
88+ units [axis ["name" ]] = axis ["unit" ]
7989
8090 images = []
8191 datasets = []
@@ -85,17 +95,18 @@ def from_ngff_zarr(
8595 scale = {d : 1.0 for d in dims }
8696 translation = {d : 0.0 for d in dims }
8797 coordinateTransformations = []
88- for transformation in dataset ["coordinateTransformations" ]:
89- if "scale" in transformation :
90- scale = transformation ["scale" ]
91- scale = dict (zip (dims , scale ))
92- coordinateTransformations .append (Scale (transformation ["scale" ]))
93- elif "translation" in transformation :
94- translation = transformation ["translation" ]
95- translation = dict (zip (dims , translation ))
96- coordinateTransformations .append (
97- Translation (transformation ["translation" ])
98- )
98+ if "coordinateTransformations" in dataset :
99+ for transformation in dataset ["coordinateTransformations" ]:
100+ if "scale" in transformation :
101+ scale = transformation ["scale" ]
102+ scale = dict (zip (dims , scale ))
103+ coordinateTransformations .append (Scale (transformation ["scale" ]))
104+ elif "translation" in transformation :
105+ translation = transformation ["translation" ]
106+ translation = dict (zip (dims , translation ))
107+ coordinateTransformations .append (
108+ Translation (transformation ["translation" ])
109+ )
99110 datasets .append (
100111 Dataset (
101112 path = dataset ["path" ],
@@ -107,7 +118,27 @@ def from_ngff_zarr(
107118 images .append (ngff_image )
108119
109120 metadata .pop ("@type" , None )
110- axes = [Axis (** axis ) for axis in metadata ["axes" ]]
121+ if "axes" in metadata :
122+ if "name" in metadata ["axes" ][0 ]:
123+ axes = [Axis (** axis ) for axis in metadata ["axes" ]]
124+ else :
125+ # v0.3
126+ type_dict = {
127+ "t" : "time" ,
128+ "c" : "channel" ,
129+ "z" : "space" ,
130+ "y" : "space" ,
131+ "x" : "space" ,
132+ }
133+ axes = [Axis (name = axis , type = type_dict [axis ]) for axis in metadata ["axes" ]]
134+ else :
135+ axes = [
136+ Axis (name = "t" , type = "time" ),
137+ Axis (name = "c" , type = "channel" ),
138+ Axis (name = "z" , type = "space" ),
139+ Axis (name = "y" , type = "space" ),
140+ Axis (name = "x" , type = "space" ),
141+ ]
111142 coordinateTransformations = None
112143 if "coordinateTransformations" in metadata :
113144 coordinateTransformations = metadata ["coordinateTransformations" ]
0 commit comments