@@ -44,7 +44,10 @@ class MaxwellRawIO(BaseRawIO):
4444 filename: str, default: ''
4545 The *.h5 file to be loaded
4646 rec_name: str | None, default: None
47- If multiple recordings the one to analyze
47+ If the file has multiple recordings, specify the one to read.
48+ For 24-well plates, the rec_name needs to be specified since different well
49+ rows generate different recording ids.
50+ E.g., rec0001, rec0002, etc.
4851
4952 """
5053
@@ -62,9 +65,9 @@ def _source_name(self):
6265 def _parse_header (self ):
6366 import h5py
6467
65- h5 = h5py .File (self .filename , mode = "r" )
66- self .h5_file = h5
67- version = h5 ["version" ][0 ].decode ()
68+ h5file = h5py .File (self .filename , mode = "r" )
69+ self .h5_file = h5file
70+ version = h5file ["version" ][0 ].decode ()
6871
6972 # create signal stream
7073 # one stream per well
@@ -75,21 +78,33 @@ def _parse_header(self):
7578 elif int (version ) > 20160704 :
7679 # multi stream stream (one well is one stream)
7780 self ._old_format = False
78- stream_ids = list (h5 ["wells" ].keys ())
79- for stream_id in stream_ids :
80- rec_names = list (h5 ["wells" ][stream_id ].keys ())
81- if len (rec_names ) > 1 :
82- if self .rec_name is None :
83- raise ValueError (
84- "Detected multiple recordings. Please select a "
85- "single recording using the `rec_name` parameter. "
86- f"Possible rec_name { rec_names } "
87- )
81+ well_ids = list (h5file ["wells" ].keys ())
82+ unique_rec_names = []
83+ for well_name in well_ids :
84+ rec_names = list (h5file ["wells" ][well_name ].keys ())
85+ for rec_name in rec_names :
86+ unique_rec_names .append (rec_name )
87+ # check consistency of rec_names
88+ unique_rec_names = np .unique (unique_rec_names )
89+ if len (unique_rec_names ) > 1 :
90+ if self .rec_name is None :
91+ raise ValueError (
92+ f"Detected multiple recording IDs across wells. "
93+ f"Please select a single recording using the `rec_name` parameter. "
94+ f"Possible rec_names: { unique_rec_names } "
95+ )
8896 else :
89- self .rec_name = rec_names [0 ]
90- signal_streams .append ((stream_id , stream_id ))
97+ assert self .rec_name in unique_rec_names , f"rec_name { self .rec_name } not found"
98+ else :
99+ self .rec_name = unique_rec_names [0 ]
100+ # add streams that contain the selected rec_name
101+ for well_name in well_ids :
102+ rec_names = list (h5file ["wells" ][well_name ].keys ())
103+ if self .rec_name in rec_names :
104+ signal_streams .append ((well_name , well_name ))
91105 else :
92106 raise NotImplementedError (f"This version { version } is not supported" )
107+
93108 signal_streams = np .array (signal_streams , dtype = _signal_stream_dtype )
94109
95110 # create signal channels
@@ -99,7 +114,7 @@ def _parse_header(self):
99114 for stream_id in signal_streams ["id" ]:
100115 if int (version ) == 20160704 :
101116 sr = 20000.0
102- settings = h5 ["settings" ]
117+ settings = h5file ["settings" ]
103118 if "lsb" in settings :
104119 gain_uV = settings ["lsb" ][0 ] * 1e6
105120 else :
@@ -109,13 +124,13 @@ def _parse_header(self):
109124 else :
110125 gain = settings ["gain" ][0 ]
111126 gain_uV = 3.3 / (1024 * gain ) * 1e6
112- sigs = h5 ["sig" ]
113- mapping = h5 ["mapping" ]
127+ sigs = h5file ["sig" ]
128+ mapping = h5file ["mapping" ]
114129 ids = np .array (mapping ["channel" ])
115130 ids = ids [ids >= 0 ]
116131 self ._channel_slice = ids
117132 elif int (version ) > 20160704 :
118- settings = h5 ["wells" ][stream_id ][self .rec_name ]["settings" ]
133+ settings = h5file ["wells" ][stream_id ][self .rec_name ]["settings" ]
119134 sr = settings ["sampling" ][0 ]
120135 if "lsb" in settings :
121136 gain_uV = settings ["lsb" ][0 ] * 1e6
@@ -127,7 +142,7 @@ def _parse_header(self):
127142 gain = settings ["gain" ][0 ]
128143 gain_uV = 3.3 / (1024 * gain ) * 1e6
129144 mapping = settings ["mapping" ]
130- sigs = h5 ["wells" ][stream_id ][self .rec_name ]["groups" ]["routed" ]["raw" ]
145+ sigs = h5file ["wells" ][stream_id ][self .rec_name ]["groups" ]["routed" ]["raw" ]
131146
132147 channel_ids = np .array (mapping ["channel" ])
133148 electrode_ids = np .array (mapping ["electrode" ])
0 commit comments