Note
Go to the end to download the full example code
Quality Metrics Tutorial¶
After spike sorting, you might want to validate the goodness of the sorted units. This can be done using the
qualitymetrics
submodule, which computes several quality metrics of the sorted units.
import spikeinterface as si
import spikeinterface.extractors as se
from spikeinterface.postprocessing import compute_principal_components
from spikeinterface.qualitymetrics import (compute_snrs, compute_firing_rates,
compute_isi_violations, calculate_pc_metrics, compute_quality_metrics)
Traceback (most recent call last):
File "/home/docs/checkouts/readthedocs.org/user_builds/spikeinterface/checkouts/0.98.0/examples/modules_gallery/qualitymetrics/plot_3_quality_mertics.py", line 11, in <module>
import spikeinterface.extractors as se
File "/home/docs/checkouts/readthedocs.org/user_builds/spikeinterface/conda/0.98.0/lib/python3.9/site-packages/spikeinterface/extractors/__init__.py", line 1, in <module>
from .extractorlist import *
File "/home/docs/checkouts/readthedocs.org/user_builds/spikeinterface/conda/0.98.0/lib/python3.9/site-packages/spikeinterface/extractors/extractorlist.py", line 15, in <module>
from .neoextractors import *
File "/home/docs/checkouts/readthedocs.org/user_builds/spikeinterface/conda/0.98.0/lib/python3.9/site-packages/spikeinterface/extractors/neoextractors/__init__.py", line 1, in <module>
from .alphaomega import AlphaOmegaRecordingExtractor, AlphaOmegaEventExtractor, read_alphaomega, read_alphaomega_event
File "/home/docs/checkouts/readthedocs.org/user_builds/spikeinterface/conda/0.98.0/lib/python3.9/site-packages/spikeinterface/extractors/neoextractors/alphaomega.py", line 3, in <module>
from .neobaseextractor import NeoBaseRecordingExtractor, NeoBaseEventExtractor
File "/home/docs/checkouts/readthedocs.org/user_builds/spikeinterface/conda/0.98.0/lib/python3.9/site-packages/spikeinterface/extractors/neoextractors/neobaseextractor.py", line 332, in <module>
class NeoBaseSortingExtractor(_NeoBaseExtractor, BaseSorting):
File "/home/docs/checkouts/readthedocs.org/user_builds/spikeinterface/conda/0.98.0/lib/python3.9/site-packages/spikeinterface/extractors/neoextractors/neobaseextractor.py", line 480, in NeoBaseSortingExtractor
def _infer_t_start_from_signal_stream(self, segment_index: int, stream_id: Optional[str] = None) -> float | None:
TypeError: unsupported operand type(s) for |: 'type' and 'NoneType'
First, let’s download a simulated dataset from the repo ‘https://gin.g-node.org/NeuralEnsemble/ephy_testing_data’
local_path = si.download_dataset(remote_path='mearec/mearec_test_10s.h5')
recording, sorting = se.read_mearec(local_path)
print(recording)
print(sorting)
Extract spike waveforms¶
For convenience, metrics are computed on the WaveformExtractor
object,
because it contains a reference to the “Recording” and the “Sorting” objects:
folder = 'waveforms_mearec'
we = si.extract_waveforms(recording, sorting, folder,
ms_before=1, ms_after=2., max_spikes_per_unit=500,
n_jobs=1, chunk_durations='1s')
print(we)
The spikeinterface.qualitymetrics
submodule has a set of functions that allow users to compute
metrics in a compact and easy way. To compute a single metric, one can simply run one of the
quality metric functions as shown below. Each function has a variety of adjustable parameters that can be tuned.
firing_rates = compute_firing_rates(we)
print(firing_rates)
isi_violation_ratio, isi_violations_count = compute_isi_violations(we)
print(isi_violation_ratio)
snrs = compute_snrs(we)
print(snrs)
Some metrics are based on the principal component scores, so they require a
WaveformsPrincipalComponent
object as input:
pc = compute_principal_components(we, load_if_exists=True,
n_components=3, mode='by_channel_local')
print(pc)
pc_metrics = calculate_pc_metrics(pc, metric_names=['nearest_neighbor'])
print(pc_metrics)
To compute more than one metric at once, we can use the compute_quality_metrics
function and indicate
which metrics we want to compute. This will return a pandas dataframe:
metrics = compute_quality_metrics(we)
print(metrics)
Total running time of the script: ( 0 minutes 0.002 seconds)