Note
Go to the end to download the full example code
Curation Tutorial¶
After spike sorting and computing quality metrics, you can automatically curate the spike sorting output using the quality metrics.
import spikeinterface as si
import spikeinterface.extractors as se
from spikeinterface.postprocessing import compute_principal_components
from spikeinterface.qualitymetrics import compute_quality_metrics
- First, let’s download a simulated dataset
from the repo ‘https://gin.g-node.org/NeuralEnsemble/ephy_testing_data’
Let’s imagine that the ground-truth sorting is in fact the output of a sorter.
local_path = si.download_dataset(remote_path='mearec/mearec_test_10s.h5')
recording, sorting = se.read_mearec(local_path)
print(recording)
print(sorting)
Traceback (most recent call last):
File "/home/docs/checkouts/readthedocs.org/user_builds/spikeinterface-test/checkouts/latest/examples/modules_gallery/qualitymetrics/plot_4_curation.py", line 25, in <module>
recording, sorting = se.read_mearec(local_path)
File "/home/docs/checkouts/readthedocs.org/user_builds/spikeinterface-test/conda/latest/lib/python3.9/site-packages/spikeinterface/extractors/neoextractors/mearec.py", line 106, in read_mearec
recording = MEArecRecordingExtractor(file_path)
File "/home/docs/checkouts/readthedocs.org/user_builds/spikeinterface-test/conda/latest/lib/python3.9/site-packages/spikeinterface/extractors/neoextractors/mearec.py", line 31, in __init__
NeoBaseRecordingExtractor.__init__(self, all_annotations=all_annotations, **neo_kwargs)
File "/home/docs/checkouts/readthedocs.org/user_builds/spikeinterface-test/conda/latest/lib/python3.9/site-packages/spikeinterface/extractors/neoextractors/neobaseextractor.py", line 94, in __init__
_NeoBaseExtractor.__init__(self, block_index, **neo_kwargs)
File "/home/docs/checkouts/readthedocs.org/user_builds/spikeinterface-test/conda/latest/lib/python3.9/site-packages/spikeinterface/extractors/neoextractors/neobaseextractor.py", line 48, in __init__
self.neo_reader = get_neo_io_reader(self.NeoRawIOClass, **neo_kwargs)
File "/home/docs/checkouts/readthedocs.org/user_builds/spikeinterface-test/conda/latest/lib/python3.9/site-packages/spikeinterface/extractors/neoextractors/neobaseextractor.py", line 38, in get_neo_io_reader
neo_reader = neoIOclass(**neo_kwargs)
TypeError: __init__() got an unexpected keyword argument 'load_spiketrains'
First, we extract waveforms and compute their PC scores:
folder = 'wfs_mearec'
we = si.extract_waveforms(recording, sorting, folder,
ms_before=1, ms_after=2., max_spikes_per_unit=500,
n_jobs=1, chunk_size=30000)
print(we)
pc = compute_principal_components(we, load_if_exists=True, n_components=3, mode='by_channel_local')
Then we compute some quality metrics:
metrics = compute_quality_metrics(we, metric_names=['snr', 'isi_violation', 'nearest_neighbor'])
print(metrics)
We can now threshold each quality metric and select units based on some rules.
The easiest and most intuitive way is to use boolean masking with dataframe:
keep_mask = (metrics['snr'] > 7.5) & (metrics['isi_violations_ratio'] < 0.2) & (metrics['nn_hit_rate'] > 0.90)
print(keep_mask)
keep_unit_ids = keep_mask[keep_mask].index.values
print(keep_unit_ids)
And now let’s create a sorting that contains only curated units and save it, for example to an NPZ file.
curated_sorting = sorting.select_units(keep_unit_ids)
print(curated_sorting)
se.NpzSortingExtractor.write_sorting(curated_sorting, 'curated_sorting.pnz')
Total running time of the script: ( 0 minutes 0.106 seconds)