22from pathlib import Path
33import numpy as np
44from caiman import load_memmap
5+ import h5py
6+ import zarr
57
68from .utils import warning_experimental
79from .arrays import LazyTiff
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
3439def 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