Skip to content

Commit a335825

Browse files
committed
Add HDF5 format movie reader
1 parent a79aef3 commit a335825

File tree

1 file changed

+33
-2
lines changed

1 file changed

+33
-2
lines changed

mesmerize_core/movie_readers.py

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
from pathlib import Path
33
import numpy as np
44
from caiman import load_memmap
5+
import h5py
6+
import zarr
57

68
from .utils import warning_experimental
79
from .arrays import LazyTiff
@@ -27,8 +29,11 @@ def default_reader(path: str, **kwargs):
2729
if ext in [".mmap", ".memmap"]:
2830
return caiman_memmap_reader(path, **kwargs)
2931

30-
else:
31-
raise ValueError(f"No default movie reader for given file extension: '{ext}'")
32+
33+
if ext in ['.hdf5', '.h5', '.nwb', '.mat', '.n5', '.zarr']:
34+
return hdf5_reader(path, **kwargs)
35+
36+
raise ValueError(f"No default movie reader for given file extension: '{ext}'")
3237

3338

3439
def tiff_memmap_reader(path: str, **kwargs) -> np.memmap:
@@ -51,3 +56,29 @@ def pims_reader(path: str, **kwargs):
5156
if not HAS_PIMS:
5257
raise ModuleNotFoundError("you must install `pims` to use the pims reader")
5358
return pims.open(path, **kwargs)
59+
60+
61+
def hdf5_reader(path: str, var_name_hdf5='mov'):
62+
# based on caiman.base.movies.load_iter
63+
extension = Path(path).suffix
64+
if extension in ['.n5', '.zarr']: # Thankfully, the zarr library lines up closely with h5py past the initial open
65+
f = zarr.open(path, "r")
66+
if isinstance(f, zarr.Array):
67+
raise RuntimeError('Expected a zarr Group, not an Array')
68+
else:
69+
try:
70+
f = h5py.File(path, "r")
71+
except:
72+
if extension == '.mat':
73+
raise Exception(f"Problem loading {path}: Unknown format. This may be in the original version 1 (non-hdf5) mat format; please convert it first")
74+
else:
75+
raise Exception(f"Problem loading {path}: Unknown format.")
76+
77+
ignore_keys = ['__DATA_TYPES__'] # Known metadata that tools provide, add to this as needed.
78+
fkeys = list(filter(lambda x: x not in ignore_keys, f.keys()))
79+
if len(fkeys) == 1: # If the hdf5 file we're parsing has only one dataset inside it,
80+
# ignore the arg and pick that dataset
81+
var_name_hdf5 = fkeys[0]
82+
Y = f.get('acquisition/' + var_name_hdf5 + '/data'
83+
if extension == '.nwb' else var_name_hdf5)
84+
return Y

0 commit comments

Comments
 (0)