diff --git a/src/probeinterface/io.py b/src/probeinterface/io.py index d3d7c5e..752a4fe 100644 --- a/src/probeinterface/io.py +++ b/src/probeinterface/io.py @@ -510,6 +510,7 @@ def read_maxwell(file: str | Path, well_name: str = "well000", rec_name: str = " h5py = import_safely("h5py") my_file = h5py.File(file, mode="r") + version = int(my_file["version"][0].decode()) if "mapping" in my_file.keys(): mapping = my_file["mapping"][:] @@ -518,10 +519,28 @@ def read_maxwell(file: str | Path, well_name: str = "well000", rec_name: str = " prb = {"channel_groups": {1: {}}} - channels = list(mapping["channel"]) - electrodes = list(mapping["electrode"]) - x_pos = list(mapping["x"]) - y_pos = list(mapping["y"]) + channels = np.array(mapping["channel"]) + electrodes = np.array(mapping["electrode"]) + assert len(channels) == len(electrodes) + mask = np.full(len(channels), True, dtype=bool) + + # remove all duplicate channel assigments corresponding to different electrodes (channel is a mix of mulitple electrode signals) + mask_id = np.argwhere(mask).flatten() + [u, u_c] = np.unique(channels[mask], return_counts=True) + for i in np.argwhere(u_c > 1).flatten(): + mask[mask_id[np.argwhere(channels[mask] == u[i])[:].flatten()]] = False + + # remove subsequent duplicated electrodes (single electrode saved to multiple channels) + mask_id = np.argwhere(mask).flatten() + [u, u_c] = np.unique(electrodes[mask], return_counts=True) + for i in np.argwhere(u_c > 1).flatten(): + mask[mask_id[np.argwhere(electrodes[mask] == u[i])[1:].flatten()]] = False + + channels = channels[mask] + electrodes = electrodes[mask] + x_pos = np.array(mapping["x"])[mask] + y_pos = np.array(mapping["y"])[mask] + geometry = {} for c, x, y in zip(channels, x_pos, y_pos): geometry[c] = [x, y] @@ -536,9 +555,23 @@ def read_maxwell(file: str | Path, well_name: str = "well000", rec_name: str = " chans = np.array(prb["channel_groups"][1]["channels"], dtype="int64") positions = np.array([prb["channel_groups"][1]["geometry"][c] for c in chans], dtype="float64") - probe.set_contacts(positions=positions, shapes="rect", shape_params={"width": 5.45, "height": 9.3}) - probe.annotate_contacts(electrode=electrodes) - probe.set_planar_contour(([-12.5, -12.5], [3845, -12.5], [3845, 2095], [-12.5, 2095])) + if version <= 20160704: + probe.set_contacts(positions=positions, shapes="rect", shape_params={"width": 5.45, "height": 9.3}) + probe.annotate_contacts(electrode=electrodes) + probe.set_planar_contour(([-12.5, -12.5], [3845, -12.5], [3845, 2095], [-12.5, 2095])) + else: + e_w = 8.75 + e_h = 12.5 + probe.set_contacts(positions=positions, shapes="rect", shape_params={"width": e_w, "height": e_h}) + probe.annotate_contacts(electrode=electrodes) + probe.set_planar_contour( + ( + [-e_w / 2, -e_h / 2], + [3832.5 + e_w / 2, -e_h / 2], + [3832.5 + e_w / 2, 2082.5 + e_h / 2], + [-e_w / 2, 2082.5 + e_h / 2], + ) + ) probe.set_device_channel_indices(np.arange(positions.shape[0]))