From 9c2a264918fa3d33d183cb123a40aa1f40130e7e Mon Sep 17 00:00:00 2001 From: Alessio Buccino Date: Thu, 11 Dec 2025 13:23:15 +0100 Subject: [PATCH 1/2] Support zarr v3 --- pyproject.toml | 2 +- src/probeinterface/__init__.py | 10 ++++++++++ src/probeinterface/probe.py | 8 ++++---- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 0474a12..9ebdb61 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -47,7 +47,7 @@ test = [ "scipy", "pandas", "h5py", - "zarr>=2.16.0,<3.0.0" + "zarr>=3,<4" ] docs = [ diff --git a/src/probeinterface/__init__.py b/src/probeinterface/__init__.py index 3317c79..81a5c88 100644 --- a/src/probeinterface/__init__.py +++ b/src/probeinterface/__init__.py @@ -1,7 +1,17 @@ import importlib.metadata +import importlib.utils +from packaging.version import parse __version__ = importlib.metadata.version("probeinterface") +# If Zarr is installed, it must be >= 3.0.0 +ZARR_INSTALLED = importlib.utils.find_spec("zarr") is not None +if ZARR_INSTALLED: + import zarr + + if parse(zarr.__version__) < parse("3.0.0"): + raise ImportError("zarr version must be >= 3.0.0") + from .probe import Probe, select_axes from .probegroup import ProbeGroup diff --git a/src/probeinterface/probe.py b/src/probeinterface/probe.py index fb7ac24..707affa 100644 --- a/src/probeinterface/probe.py +++ b/src/probeinterface/probe.py @@ -1152,7 +1152,7 @@ def add_probe_to_zarr_group(self, group: "zarr.Group") -> None: # add fields and contact annotations for field_name, (dtype, offset) in probe_arr.dtype.fields.items(): data = probe_arr[field_name] - group.create_dataset(name=field_name, data=data, dtype=dtype, chunks=False) + group.create_array(name=field_name, data=data, chunks=data.shape) # Annotations as a group (special attributes are stored as annotations) annotations_group = group.create_group("annotations") @@ -1161,8 +1161,8 @@ def add_probe_to_zarr_group(self, group: "zarr.Group") -> None: # Add planar contour if self.probe_planar_contour is not None: - group.create_dataset( - name="probe_planar_contour", data=self.probe_planar_contour, dtype="float64", chunks=False + group.create_array( + name="probe_planar_contour", data=self.probe_planar_contour, chunks=self.probe_planar_contour.shape ) def to_zarr(self, folder_path: str | Path) -> None: @@ -1219,7 +1219,7 @@ def from_zarr_group(group: "zarr.Group") -> "Probe": probe_arr_keys.append(key) dtype.append((key, dset.dtype)) if num_contacts is None: - num_contacts = len(dset) + num_contacts = dset.shape[0] # Create a structured array from the datasets probe_arr = np.zeros(num_contacts, dtype=dtype) From 66a0489bfacab00f4db02345e601193d58449f0a Mon Sep 17 00:00:00 2001 From: Alessio Buccino Date: Thu, 11 Dec 2025 13:25:06 +0100 Subject: [PATCH 2/2] oups --- src/probeinterface/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/probeinterface/__init__.py b/src/probeinterface/__init__.py index 81a5c88..5d42fbe 100644 --- a/src/probeinterface/__init__.py +++ b/src/probeinterface/__init__.py @@ -1,11 +1,11 @@ import importlib.metadata -import importlib.utils +import importlib.util from packaging.version import parse __version__ = importlib.metadata.version("probeinterface") # If Zarr is installed, it must be >= 3.0.0 -ZARR_INSTALLED = importlib.utils.find_spec("zarr") is not None +ZARR_INSTALLED = importlib.util.find_spec("zarr") is not None if ZARR_INSTALLED: import zarr