Skip to content

Commit 9fe9eec

Browse files
committed
Fix read MaxTwo 24-well by specifying rec_name
1 parent dfebe06 commit 9fe9eec

File tree

1 file changed

+37
-21
lines changed

1 file changed

+37
-21
lines changed

neo/rawio/maxwellrawio.py

Lines changed: 37 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -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,14 @@ 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"]
134+
settings = h5file["wells"][well_name][rec_name]["settings"]
119135
sr = settings["sampling"][0]
120136
if "lsb" in settings:
121137
gain_uV = settings["lsb"][0] * 1e6
@@ -127,7 +143,7 @@ def _parse_header(self):
127143
gain = settings["gain"][0]
128144
gain_uV = 3.3 / (1024 * gain) * 1e6
129145
mapping = settings["mapping"]
130-
sigs = h5["wells"][stream_id][self.rec_name]["groups"]["routed"]["raw"]
146+
sigs = h5file["wells"][well_name][rec_name]["groups"]["routed"]["raw"]
131147

132148
channel_ids = np.array(mapping["channel"])
133149
electrode_ids = np.array(mapping["electrode"])

0 commit comments

Comments
 (0)