Skip to content

Commit fe43054

Browse files
Merge pull request #62 from dj-sciops/update-lfp
fix: `_build_si_recording_object` for new version of SI
2 parents a153dfe + 9d61b77 commit fe43054

1 file changed

Lines changed: 35 additions & 25 deletions

File tree

element_array_ephys/spike_sorting/si_spike_sorting.py

Lines changed: 35 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -143,65 +143,75 @@ def make(self, key):
143143
) # get the row indices of the port
144144

145145
# Create SI recording extractor object
146-
si_extractor: si.extractors.neoextractors = (
147-
si.extractors.extractorlist.recording_extractor_full_dict[
148-
acq_software.replace(" ", "").lower()
149-
]
150-
) # data extractor object
146+
from spikeinterface.extractors.extractor_classes import (
147+
recording_extractor_full_dict,
148+
)
149+
150+
acq_key = acq_software.replace(" ", "").lower()
151+
try:
152+
si_extractor = recording_extractor_full_dict[acq_key]
153+
except KeyError:
154+
raise ValueError(f"Unsupported acquisition software: {acq_software}")
151155

152156
files, file_times = (
153157
ephys.EphysRawFile
154158
& key
155159
& f"file_time BETWEEN '{key['start_time']}' AND '{key['end_time']}'"
156160
).fetch("file_path", "file_time", order_by="file_time")
157161

158-
si_recording = None
162+
# Detect stream name from the first file
163+
first_file_path = find_full_path(ephys.get_ephys_root_data_dir(), files[0])
164+
available_streams = si_extractor.get_streams(first_file_path)[0]
165+
amplifier_streams = [s for s in available_streams if "amplifier" in s.lower()]
166+
167+
if not amplifier_streams:
168+
raise ValueError(
169+
f"No amplifier stream found in {first_file_path}. "
170+
f"Available streams: {available_streams}"
171+
)
172+
173+
stream_name = amplifier_streams[0]
174+
159175
# Read data. Concatenate if multiple files are found.
176+
si_recording = None
160177
for file_path in (
161178
find_full_path(ephys.get_ephys_root_data_dir(), f) for f in files
162179
):
163180
if not si_recording:
164-
stream_name = [
165-
s
166-
for s in si_extractor.get_streams(file_path)[0]
167-
if "amplifier" in s
168-
][0]
169-
si_recording: si.BaseRecording = si_extractor(
170-
file_path, stream_name=stream_name
171-
)
181+
si_recording = si_extractor(file_path, stream_name=stream_name)
172182
else:
173-
si_recording: si.BaseRecording = si.concatenate_recordings(
183+
si_recording = si.concatenate_recordings(
174184
[
175185
si_recording,
176186
si_extractor(file_path, stream_name=stream_name),
177187
]
178188
)
179189

190+
# Restrict to channels from the target port
180191
si_recording = si_recording.channel_slice(
181192
si_recording.channel_ids[port_indices]
182-
) # select only the port data
193+
)
183194

184-
# Create SI probe object
195+
# Apply probe geometry
185196
si_probe = readers.probe_geometry.to_probeinterface(electrodes_df)
186197
si_probe.set_device_channel_indices(electrodes_df["channel_idx"].values)
187198
si_recording.set_probe(probe=si_probe, in_place=True)
188199

189-
# Account for additional electrodes being removed
200+
# Remove unused electrodes
190201
if unused_electrodes:
191202
chn_ids_to_remove = [
192203
f"{probe_info['port_id']}-{electrodes_df.channel_idx.iloc[elec]:03d}"
193204
for elec in unused_electrodes
194205
]
195-
else:
196-
chn_ids_to_remove = []
197-
198-
si_recording = si_recording.remove_channels(
199-
remove_channel_ids=chn_ids_to_remove
200-
)
206+
si_recording = si_recording.remove_channels(
207+
remove_channel_ids=chn_ids_to_remove
208+
)
201209

202-
# Run preprocessing and save results to output folder
210+
# Preprocess
203211
si_preproc_func = getattr(si_preprocessing, params["SI_PREPROCESSING_METHOD"])
204212
si_recording = si_preproc_func(si_recording)
213+
214+
# Save to pickle
205215
si_recording.dump_to_pickle(file_path=recording_file, relative_to=output_dir)
206216

207217
self.insert1(

0 commit comments

Comments
 (0)