End-to-end Neuropixels extracellular electrophysiology analysis (SpikeGLX/Open Ephys/NWB) including preprocessing, motion correction, Kilosort4 spike sorting, QC metrics, and Allen/IBL-style curation; use when processing Neuropixels recordings or when users mention Neuropixels, SpikeGLX, Open Ephys, Kilosort, quality metrics, drift/motion correction, or unit curation.
63
75%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Fix and improve this skill with Tessl
tessl review fix ./scientific-skills/Data Analysis/neuropixels-analysis/SKILL.mdUse this skill in any of the following situations:
.ap.bin/.lf.bin/.meta), Open Ephys (.continuous/.oebin), or NWB (.nwb) into a consistent analysis pipeline.Reference guides (if present in the repository) can be used for deeper explanations:
reference/standard_workflow.mdreference/api_reference.mdreference/plotting_guide.mdreference/PREPROCESSING.md, reference/MOTION_CORRECTION.md, reference/SPIKE_SORTING.mdreference/QUALITY_METRICS.md, reference/AUTOMATED_CURATION.md, reference/AI_CURATION.mdPython dependencies (typical versions known to work; adjust to your environment):
python >= 3.9spikeinterface[full] >= 0.99probeinterface >= 0.2neo >= 0.13kilosort >= 4.0 (Kilosort4; GPU required)spykingcircus >= 1.1 (SpykingCircus2; CPU)mountainsort5 >= 0.5 (CPU)anthropic >= 0.20ibllib >= 2.0ibl-neuropixel >= 1.0The following example is designed to be a complete, runnable script (assuming dependencies and a valid dataset path). It loads SpikeGLX data, preprocesses, estimates/corrects motion, runs Kilosort4, computes metrics, curates units, generates a report, and exports to Phy and NWB.
import spikeinterface.full as si
import neuropixels_analysis as npa
def main():
# Parallelization / chunking settings used by SpikeInterface functions
job_kwargs = dict(n_jobs=-1, chunk_duration="1s", progress_bar=True)
# 1) Load data (SpikeGLX example)
# For Open Ephys: si.read_openephys("/path/to/Record_Node_101/")
# For NWB: si.read_nwb("/path/to/file.nwb")
recording = si.read_spikeglx("/path/to/spikeglx_folder", stream_id="imec0.ap")
# Optional: slice first 60 seconds for a quick test
fs = recording.get_sampling_frequency()
recording = recording.frame_slice(0, int(60 * fs))
# 2) Preprocess (recommended chain; wrapper may include the same steps)
# Note: phase_shift is mandatory for Neuropixels 1.0 and not needed for 2.0.
rec = npa.preprocess(recording)
# 3) Estimate drift/motion and correct if needed
motion_info = npa.estimate_motion(rec, preset="kilosort_like", **job_kwargs)
npa.plot_drift(rec, motion_info, output="drift_map.png")
# Example threshold: correct if max drift exceeds 10 µm
if float(motion_info["motion"].max()) > 10.0:
rec = npa.correct_motion(rec, preset="nonrigid_accurate", **job_kwargs)
# 4) Spike sorting (Kilosort4 recommended; requires GPU)
sorting = si.run_sorter("kilosort4", rec, folder="ks4_output", **job_kwargs)
# 5) Post-processing + metrics
analyzer = si.create_sorting_analyzer(sorting, rec, sparse=True)
analyzer.compute("random_spikes", max_spikes_per_unit=500, **job_kwargs)
analyzer.compute("waveforms", ms_before=1.0, ms_after=2.0, **job_kwargs)
analyzer.compute("templates", operators=["average", "std"], **job_kwargs)
analyzer.compute("spike_amplitudes", **job_kwargs)
analyzer.compute("correlograms", window_ms=50.0, bin_ms=1.0, **job_kwargs)
analyzer.compute("unit_locations", method="monopolar_triangulation", **job_kwargs)
analyzer.compute("quality_metrics", **job_kwargs)
metrics = analyzer.get_extension("quality_metrics").get_data()
metrics.to_csv("quality_metrics.csv")
# 6) Automated curation (Allen/IBL-style)
labels = npa.curate(metrics, method="allen") # e.g., "allen", "ibl", "strict"
# 7) Report
results = {"sorting": sorting, "metrics": metrics, "labels": labels, "analyzer": analyzer}
npa.generate_analysis_report(results, "output_report/")
npa.print_analysis_summary(results)
# 8) Export
si.export_to_phy(
analyzer,
output_folder="phy_export/",
compute_pc_features=True,
compute_amplitudes=True,
)
from spikeinterface.exporters import export_to_nwb
export_to_nwb(rec, sorting, "output.nwb")
if __name__ == "__main__":
main()si.read_spikeglx(path, stream_id="imec0.ap")si.read_openephys(path)si.read_nwb(path)Neuropixels probe types commonly encountered:
A standard spike-band preprocessing sequence is:
si.phase_shift) for NP1.0.si.detect_bad_channels) and removal.Key parameters:
freq_min (high-pass cutoff): typical 300–400 Hzpreset="kilosort_like": faster estimation aligned with common sorter assumptionspreset="nonrigid_accurate": more robust correction for severe driftOperational threshold often used in practice:
Sorter parameters to tune (Kilosort4 examples):
batch_size: samples per batch (often ~30000 by default)nblocks: number of drift blocks (increase for long recordings)Th_learned: detection threshold (lower → more spikes, potentially more false positives)Using SortingAnalyzer, the pipeline typically computes:
ms_before, ms_after)window_ms=50, bin_ms=1)monopolar_triangulation)Common QC thresholds (dataset-dependent; document your choices):
snr_threshold: often 3–5isi_violations_ratio: often 0.01–0.5presence_ratio: often 0.5–0.95A conservative “good unit” selection often combines:
Example rule (illustrative):
presence_ratio > 0.9isi_violations_ratio < 0.5amplitude_cutoff < 0.1For borderline units (e.g., moderate SNR), AI-assisted review can be used to interpret:
If your repository provides npa.analyze_unit_visually(...), it can be integrated with an API client (e.g., anthropic) to generate structured curation suggestions.
f5ef65b
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.