@@ -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