Skip to content

Commit 3c2990c

Browse files
authored
Add HDF5 format movie reader (#331)
* Add HDF5 format movie reader * Correctly set var_name_hdf5 when loading hdf5 and this param is set
1 parent 15215fe commit 3c2990c

File tree

2 files changed

+44
-5
lines changed

2 files changed

+44
-5
lines changed

mesmerize_core/caiman_extensions/common.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -707,10 +707,18 @@ def get_input_movie(
707707
if reader is not None:
708708
if not callable(reader):
709709
raise TypeError(f"reader must be a callable type, such as a function")
710+
else:
711+
reader = default_reader
712+
713+
# add hdf5 variable name if provided
714+
main_params = self._series.params['main']
715+
if 'var_name_hdf5' in main_params:
716+
kwargs['var_name_hdf5'] = main_params['var_name_hdf5']
717+
elif 'data' in main_params and 'var_name_hdf5' in main_params['data']:
718+
kwargs['var_name_hdf5'] = main_params['data']['var_name_hdf5']
710719

711-
return reader(path_str, **kwargs)
720+
return reader(path_str, **kwargs)
712721

713-
return default_reader(path_str, **kwargs)
714722

715723
@validate()
716724
def get_corr_image(self) -> np.ndarray:

mesmerize_core/movie_readers.py

Lines changed: 34 additions & 3 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
@@ -14,7 +16,7 @@
1416
HAS_PIMS = False
1517

1618

17-
def default_reader(path: str, **kwargs):
19+
def default_reader(path: str, var_name_hdf5='mov', **kwargs):
1820
ext = Path(path).suffixes[-1]
1921
if ext in [".tiff", ".tif", ".btf"]:
2022
try:
@@ -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, var_name_hdf5=var_name_hdf5, **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)