def load_phy(folder_name): """Use spikeinterface to load a phy clustering.""" import spikeinterface.extractors as se to_exclude = ["mua", "noise"] return se.PhySortingExtractor(folder_name, exclude_cluster_groups=to_exclude, load_waveforms=True, verbose=True)
def spikeinterface_test(folder_name): """An example sorting extractor, which loads from Phy.""" import spikeinterface.extractors as se to_exclude = ["mua", "noise"] sorting = se.PhySortingExtractor(folder_name, exclude_cluster_groups=to_exclude, load_waveforms=True, verbose=False) return sorting
sorter=sorting_tridesclous_all; #Check if sorter failed if not sorter: continue st.postprocessing.export_to_phy(recording_cache, sorter, output_folder='phy_'+i, grouping_property='group', verbose=True, recompute_info=True) #Open phy interface os.system('phy template-gui phy_'+i+'/params.py') #Remove detections curated as noise. sorting_phy_curated = se.PhySortingExtractor('phy_'+i+'/', exclude_cluster_groups=['noise']); #Print waveforms of units w_wf = sw.plot_unit_templates(sorting=sorting_phy_curated, recording=recording_cache) plt.savefig('manual_'+i+'_unit_templates.pdf', bbox_inches='tight'); plt.savefig('manual_'+i+'_unit_templates.png', bbox_inches='tight'); plt.close() #Compute agreement matrix wrt consensus-based sorting. sorting_phy_consensus = se.PhySortingExtractor('phy_AGR/', exclude_cluster_groups=['noise']); cmp=sc.compare_sorter_to_ground_truth(sorting_phy_curated,sorting_phy_consensus) sw.plot_agreement_matrix(cmp) plt.savefig('agreement_matrix_'+i+'.pdf', bbox_inches='tight'); plt.savefig('agreement_matrix_'+i+'.png', bbox_inches='tight'); plt.close()
def manual(recording_folder): #Folder with tetrode data #recording_folder='/home/adrian/Documents/SpikeSorting/Adrian_test_data/Irene_data/test_without_zero_main_channels/Tetrode_9_CH'; os.chdir(recording_folder) """ Adding Matlab-based sorters to path """ #IronClust iron_path = "~/Documents/SpikeSorting/ironclust" ss.IronClustSorter.set_ironclust_path(os.path.expanduser(iron_path)) ss.IronClustSorter.ironclust_path #If sorter has already been run skip it. subfolders = [f.name for f in os.scandir(recording_folder) if f.is_dir()] #if ('phy_KL' in subfolders) & ('phy_IC' in subfolders) & ('phy_Waveclus' in subfolders) & ('phy_SC' in subfolders) & ('phy_MS4' in subfolders) & ('phy_HS' in subfolders) & ('phy_TRI' in subfolders): if ('phy_KL' in subfolders) & ('phy_IC' in subfolders) & ( 'phy_SC' in subfolders) & ('phy_MS4' in subfolders) & ( 'phy_HS' in subfolders) & ('phy_TRI' in subfolders): print('Tetrode ' + recording_folder.split('_')[-1] + ' was previously manually sorted. Skipping') return #Check if the recording has been preprocessed before and load it. # Else proceed with preprocessing. arr = os.listdir() #Load .continuous files recording = se.OpenEphysRecordingExtractor(recording_folder) channel_ids = recording.get_channel_ids() fs = recording.get_sampling_frequency() num_chan = recording.get_num_channels() print('Channel ids:', channel_ids) print('Sampling frequency:', fs) print('Number of channels:', num_chan) #!cat tetrode9.prb #Asks for prb file # os.system('cat /home/adrian/Documents/SpikeSorting/Adrian_test_data/Irene_data/test_without_zero_main_channels/Tetrode_9_CH/tetrode9.prb') recording_prb = recording.load_probe_file(os.getcwd() + '/tetrode.prb') print('Channels after loading the probe file:', recording_prb.get_channel_ids()) print('Channel groups after loading the probe file:', recording_prb.get_channel_groups()) #For testing only: Reduce recording. #recording_prb = se.SubRecordingExtractor(recording_prb, start_frame=100*fs, end_frame=420*fs) #Bandpass filter recording_cmr = st.preprocessing.bandpass_filter(recording_prb, freq_min=300, freq_max=6000) recording_cache = se.CacheRecordingExtractor(recording_cmr) print(recording_cache.get_channel_ids()) print(recording_cache.get_channel_groups()) print(recording_cache.get_num_frames() / recording_cache.get_sampling_frequency()) #View installed sorters #ss.installed_sorters() #mylist = [f for f in glob.glob("*.txt")] #%% Run all channels. There are only single tetrode channels anyway. #Create sub recording to avoid saving whole recording.Requirement from NWB to allow saving sorters data. recording_sub = se.SubRecordingExtractor(recording_cache, start_frame=200 * fs, end_frame=320 * fs) # Sorters2CompareLabel=['KL','IC','Waveclus','HS','MS4','SC','TRI']; Sorters2CompareLabel = ['KL', 'IC', 'HS', 'MS4', 'SC', 'TRI'] subfolders = [f.name for f in os.scandir(recording_folder) if f.is_dir()] for num in range(len(Sorters2CompareLabel)): i = Sorters2CompareLabel[num] print(i) if 'phy_' + i in subfolders: print('Sorter already used for curation. Skipping') continue else: if 'KL' in i: #Klusta if 'sorting_KL_all.nwb' in arr: print('Loading Klusta') sorting_KL_all = se.NwbSortingExtractor( 'sorting_KL_all.nwb') else: t = time.time() sorting_KL_all = ss.run_klusta( recording_cache, output_folder='results_all_klusta', delete_output_folder=True) print('Found', len(sorting_KL_all.get_unit_ids()), 'units') print(time.time() - t) #Save Klusta se.NwbRecordingExtractor.write_recording( recording_sub, 'sorting_KL_all.nwb') se.NwbSortingExtractor.write_sorting( sorting_KL_all, 'sorting_KL_all.nwb') sorter = sorting_KL_all if 'IC' in i: #Ironclust if 'sorting_IC_all.nwb' in arr: print('Loading Ironclust') sorting_IC_all = se.NwbSortingExtractor( 'sorting_IC_all.nwb') else: t = time.time() sorting_IC_all = ss.run_ironclust( recording_cache, output_folder='results_all_ic', delete_output_folder=True, filter=False) print('Found', len(sorting_IC_all.get_unit_ids()), 'units') print(time.time() - t) #Save IC se.NwbRecordingExtractor.write_recording( recording_sub, 'sorting_IC_all.nwb') se.NwbSortingExtractor.write_sorting( sorting_IC_all, 'sorting_IC_all.nwb') sorter = sorting_IC_all # if 'Waveclus' in i: # #Waveclust # if 'sorting_waveclus_all.nwb' in arr: # print('Loading waveclus') # sorting_waveclus_all=se.NwbSortingExtractor('sorting_waveclus_all.nwb'); # else: # t = time.time() # sorting_waveclus_all = ss.run_waveclus(recording_cache, output_folder='results_all_waveclus',delete_output_folder=True) # print('Found', len(sorting_waveclus_all.get_unit_ids()), 'units') # print(time.time() - t) # #Save waveclus # se.NwbRecordingExtractor.write_recording(recording_sub, 'sorting_waveclus_all.nwb') # se.NwbSortingExtractor.write_sorting(sorting_waveclus_all, 'sorting_waveclus_all.nwb') # sorter=sorting_waveclus_all; if 'HS' in i: #Herdingspikes if 'sorting_herdingspikes_all.nwb' in arr: print('Loading herdingspikes') sorting_herdingspikes_all = se.NwbSortingExtractor( 'sorting_herdingspikes_all.nwb') sorter = sorting_herdingspikes_all else: t = time.time() try: sorting_herdingspikes_all = ss.run_herdingspikes( recording_cache, output_folder='results_all_herdingspikes', delete_output_folder=True) print('Found', len(sorting_herdingspikes_all.get_unit_ids()), 'units') time.time() - t #Save herdingspikes se.NwbRecordingExtractor.write_recording( recording_sub, 'sorting_herdingspikes_all.nwb') try: se.NwbSortingExtractor.write_sorting( sorting_herdingspikes_all, 'sorting_herdingspikes_all.nwb') except TypeError: print( "No units detected. Can't save HerdingSpikes") os.remove("sorting_herdingspikes_all.nwb") sorter = sorting_herdingspikes_all except: print('Herdingspikes has failed') sorter = [] if 'MS4' in i: #Mountainsort4 if 'sorting_mountainsort4_all.nwb' in arr: print('Loading mountainsort4') sorting_mountainsort4_all = se.NwbSortingExtractor( 'sorting_mountainsort4_all.nwb') else: t = time.time() sorting_mountainsort4_all = ss.run_mountainsort4( recording_cache, output_folder='results_all_mountainsort4', delete_output_folder=True, filter=False) print('Found', len(sorting_mountainsort4_all.get_unit_ids()), 'units') print(time.time() - t) #Save mountainsort4 se.NwbRecordingExtractor.write_recording( recording_sub, 'sorting_mountainsort4_all.nwb') se.NwbSortingExtractor.write_sorting( sorting_mountainsort4_all, 'sorting_mountainsort4_all.nwb') sorter = sorting_mountainsort4_all if 'SC' in i: #Spykingcircus if 'sorting_spykingcircus_all.nwb' in arr: print('Loading spykingcircus') sorting_spykingcircus_all = se.NwbSortingExtractor( 'sorting_spykingcircus_all.nwb', filter=False) else: t = time.time() sorting_spykingcircus_all = ss.run_spykingcircus( recording_cache, output_folder='results_all_spykingcircus', delete_output_folder=True) print('Found', len(sorting_spykingcircus_all.get_unit_ids()), 'units') print(time.time() - t) #Save sorting_spykingcircus se.NwbRecordingExtractor.write_recording( recording_sub, 'sorting_spykingcircus_all.nwb') se.NwbSortingExtractor.write_sorting( sorting_spykingcircus_all, 'sorting_spykingcircus_all.nwb') sorter = sorting_spykingcircus_all if 'TRI' in i: #Tridesclous if 'sorting_tridesclous_all.nwb' in arr: print('Loading tridesclous') try: sorting_tridesclous_all = se.NwbSortingExtractor( 'sorting_tridesclous_all.nwb') except AttributeError: print( "No units detected. Can't load Tridesclous so will run it." ) t = time.time() sorting_tridesclous_all = ss.run_tridesclous( recording_cache, output_folder='results_all_tridesclous', delete_output_folder=True) print('Found', len(sorting_tridesclous_all.get_unit_ids()), 'units') time.time() - t os.remove("sorting_tridesclous_all.nwb") #Save sorting_tridesclous se.NwbRecordingExtractor.write_recording( recording_sub, 'sorting_tridesclous_all.nwb') se.NwbSortingExtractor.write_sorting( sorting_tridesclous_all, 'sorting_tridesclous_all.nwb') else: t = time.time() sorting_tridesclous_all = ss.run_tridesclous( recording_cache, output_folder='results_all_tridesclous', delete_output_folder=True) print('Found', len(sorting_tridesclous_all.get_unit_ids()), 'units') time.time() - t #Save sorting_tridesclous se.NwbRecordingExtractor.write_recording( recording_sub, 'sorting_tridesclous_all.nwb') se.NwbSortingExtractor.write_sorting( sorting_tridesclous_all, 'sorting_tridesclous_all.nwb') sorter = sorting_tridesclous_all #Check if sorter failed if not sorter: continue st.postprocessing.export_to_phy(recording_cache, sorter, output_folder='phy_' + i, grouping_property='group', verbose=True, recompute_info=True) #Open phy interface os.system('phy template-gui phy_' + i + '/params.py') #Remove detections curated as noise. sorting_phy_curated = se.PhySortingExtractor( 'phy_' + i + '/', exclude_cluster_groups=['noise']) #Print waveforms of units w_wf = sw.plot_unit_templates(sorting=sorting_phy_curated, recording=recording_cache) plt.savefig('manual_' + i + '_unit_templates.pdf', bbox_inches='tight') plt.savefig('manual_' + i + '_unit_templates.png', bbox_inches='tight') plt.close() #Compute agreement matrix wrt consensus-based sorting. sorting_phy_consensus = se.PhySortingExtractor( 'phy_AGR/', exclude_cluster_groups=['noise']) cmp = sc.compare_sorter_to_ground_truth(sorting_phy_curated, sorting_phy_consensus) sw.plot_agreement_matrix(cmp) plt.savefig('agreement_matrix_' + i + '.pdf', bbox_inches='tight') plt.savefig('agreement_matrix_' + i + '.png', bbox_inches='tight') plt.close() #Access unit ID and firing rate. os.chdir('phy_' + i) spike_times = np.load('spike_times.npy') spike_clusters = np.load('spike_clusters.npy') #Find units curated as 'noise' noise_id = [] with open("cluster_group.tsv") as fd: rd = csv.reader(fd, delimiter="\t", quotechar='"') for row in rd: if row[1] == 'noise': noise_id.append(int(row[0])) #Create a list with the unit IDs and remove those labeled as 'noise' some_list = np.unique(spike_clusters) some_list = some_list.tolist() for x in noise_id: print(x) some_list.remove(x) #Bin data in bins of 25ms #45 minutes bins = np.arange(start=0, stop=45 * 60 * fs + 1, step=.025 * fs) NData = np.zeros([ np.unique(spike_clusters).shape[0] - len(noise_id), bins.shape[0] - 1 ]) cont = 0 for x in some_list: #print(x) ind = (spike_clusters == x) fi = spike_times[ind] inds = np.histogram(fi, bins=bins) inds1 = inds[0] NData[cont, :] = inds1 cont = cont + 1 #Save activation matrix os.chdir("..") a = os.path.split(os.getcwd())[1] np.save('actmat_manual_' + i + '_' + a.split('_')[1], NData) np.save('unit_id_manual_' + i + '_' + a.split('_')[1], some_list) #End of for loop print("Stop the code here")
recording_cache = se.CacheRecordingExtractor(recording_cmr); Sorters2Compare=[]; Sorters2CompareLabel=['KL','IC','Waveclus','HS','MS4','SC','TRI']; Sorters2label=['KL','IC','Waveclus','HS','MS4','SC','TRI']; subfolders = [ f.name for f in os.scandir(recording_folder) if f.is_dir() ]; for num in range(len(Sorters2CompareLabel)): i=Sorters2CompareLabel[num]; # print(i) if 'phy_'+i in subfolders: sorting_curated = se.PhySortingExtractor('phy_'+i+'/', exclude_cluster_groups=['noise','mua']); if not sorting_curated.get_unit_ids(): Sorters2label.remove(i) else: Sorters2Compare.append(sorting_curated); #Consensus based curation. print(Sorters2label) print('Comparing sorters agreement. Please wait...') mcmp = sc.compare_multiple_sorters(Sorters2Compare, Sorters2label) w = sw.plot_multicomp_agreement_by_sorter(mcmp) plt.savefig('consensus_curation.pdf', bbox_inches='tight'); plt.savefig('consensus_curation.png', bbox_inches='tight');
flag = 1 break if flag == 1: continue # Load recording extractor print('Loading Recording Extractor...') recording = se.OpenEphysRecordingExtractor(rec_path) # recording_prb = recording.load_probe_file(os.path.join(base_dir, 'tetrode.prb')) # print('Channels after loading the probe file:', recording_prb.get_channel_ids()) # print('Channel groups after loading the probe file:', recording_prb.get_channel_groups()) # Load sorting extractor print('Loading Phy Sorting Extractor...') sorting = se.PhySortingExtractor(phy_path, exclude_cluster_groups=['noise']) print('Units:', len(sorting.get_unit_ids())) # print('Spikes of first unit:', len(sorting.get_unit_spike_train(1))) # print('Shared properties:', sorting.get_shared_unit_property_names()) # Get waveforms # waveforms = st.postprocessing.get_unit_waveforms(recording, sorting, verbose=True) # Calculate quality metrics quality_metrics = st.validation.compute_quality_metrics( sorting, recording, metric_names=['isi_violation', 'snr', 'l_ratio'], as_dataframe=True) # display(quality_metrics)
#Bandpass filter recording_cmr = st.preprocessing.bandpass_filter(recording_prb, freq_min=300, freq_max=6000) recording_cache = se.CacheRecordingExtractor(recording_cmr) print(recording_cache.get_channel_ids()) print(recording_cache.get_channel_groups()) print(recording_cache.get_num_frames() / recording_cache.get_sampling_frequency()) #%% #sorting_mountainsort4_all = ss.run_mountainsort4(recording_cache, output_folder='results_all_mountainsort4',delete_output_folder=True, filter=False) #sorting_mountainsort4_all=se.NwbSortingExtractor('sorting_mountainsort4_all.nwb'); #st.postprocessing.export_to_phy(recording_cache, # sorting_mountainsort4_all, output_folder='phy_MS4', # grouping_property='group', verbose=True, recompute_info=True) #%% sorting_check = se.PhySortingExtractor('phy_AGR/') st.postprocessing.export_to_phy(recording_cache, sorting_check, output_folder='phy_check', grouping_property='group', verbose=True, recompute_info=True) os.system('phy template-gui phy_check/params.py')
def load_sorting(in_dir, extract_method="phy"): sorting_curated = None if extract_method == "phy": sorting_curated = se.PhySortingExtractor(in_dir) return sorting_curated