Source: https://github.com/aipoch/medical-research-skills
When to Use
Use this skill in any of the following situations:
- You need to load and standardize Neuropixels recordings from SpikeGLX (
.ap.bin/.lf.bin/.meta), Open Ephys (.continuous/.oebin), or NWB (.nwb) into a consistent analysis pipeline.
- You are preparing raw extracellular data for spike sorting, including high-pass filtering, phase shift correction (NP1.0), bad channel detection/removal, and common average referencing (CAR).
- You suspect probe drift or tissue motion and need to estimate and correct motion before sorting (especially when drift is > ~10 µm).
- You want to run spike sorting (Kilosort4 recommended; CPU alternatives supported) and then compute post-processing products (waveforms, templates, amplitudes, correlograms, unit locations).
- You need quality control and curation using Allen/IBL-style thresholds, plus optional AI-assisted visual review for borderline units, and exports to Phy/NWB.
Key Features
- Multi-format ingestion: SpikeGLX, Open Ephys, and NWB readers via SpikeInterface.
- Neuropixels-aware preprocessing:
- High-pass filtering for spike band
- Phase shift correction for Neuropixels 1.0
- Bad channel detection and removal
- Median CAR / referencing
- Motion/drift workflow:
- Motion estimation presets (e.g., “Kilosort-like”)
- Optional rigid/non-rigid correction presets
- Drift visualization outputs
- Spike sorting orchestration:
- Kilosort4 (GPU) recommended
- CPU alternatives (e.g., SpykingCircus2, Mountainsort5, Tridesclous2)
- Post-processing and QC:
- SortingAnalyzer-based computation of waveforms, templates, amplitudes, correlograms, unit locations, and quality metrics
- Curation:
- Allen/IBL-style automated labeling
- Optional AI-assisted visual analysis for uncertain units
- Reporting and export:
- HTML report generation
- Export to Phy and NWB
- Save metrics tables (CSV)
Reference guides (if present in the repository) can be used for deeper explanations:
reference/standard_workflow.md
reference/api_reference.md
reference/plotting_guide.md
reference/PREPROCESSING.md, reference/MOTION_CORRECTION.md, reference/SPIKE_SORTING.md
reference/QUALITY_METRICS.md, reference/AUTOMATED_CURATION.md, reference/AI_CURATION.md
Dependencies
Python dependencies (typical versions known to work; adjust to your environment):
python >= 3.9
spikeinterface[full] >= 0.99
probeinterface >= 0.2
neo >= 0.13
- Spike sorters (optional, depending on what you run):
kilosort >= 4.0 (Kilosort4; GPU required)
spykingcircus >= 1.1 (SpykingCircus2; CPU)
mountainsort5 >= 0.5 (CPU)
- Optional (AI-assisted curation):
- Optional (IBL tooling):
ibllib >= 2.0
ibl-neuropixel >= 1.0
Example Usage
The 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()
Implementation Details
1) Data I/O and supported formats
- SpikeGLX:
si.read_spikeglx(path, stream_id="imec0.ap")
- Open Ephys:
si.read_openephys(path)
- NWB:
si.read_nwb(path)
Neuropixels probe types commonly encountered:
- Neuropixels 1.0: requires phase shift correction to align channels.
- Neuropixels 2.0: denser geometries; phase shift correction typically not required.
2) Preprocessing chain (typical)
A standard spike-band preprocessing sequence is:
- High-pass filter (commonly 300–400 Hz) to isolate spikes.
- Phase shift correction (
si.phase_shift) for NP1.0.
- Bad channel detection (
si.detect_bad_channels) and removal.
- Common reference (often median CAR) to reduce shared noise.
Key parameters:
freq_min (high-pass cutoff): typical 300–400 Hz
- bad channel detection sensitivity (implementation-dependent; often exposed as thresholds/presets)
3) Motion estimation and correction
- Motion/drift can strongly degrade sorting quality; a practical rule is to inspect drift before sorting.
- Presets:
preset="kilosort_like": faster estimation aligned with common sorter assumptions
preset="nonrigid_accurate": more robust correction for severe drift
Operational threshold often used in practice:
- If estimated drift exceeds ~10 µm, apply correction before sorting.
4) Spike sorting
- Kilosort4 is recommended for Neuropixels due to speed and quality, but requires a GPU.
- CPU alternatives can be used when GPU is unavailable (at the cost of runtime and sometimes quality).
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)
5) Post-processing and quality metrics
Using SortingAnalyzer, the pipeline typically computes:
- waveforms (window:
ms_before, ms_after)
- templates (average/std)
- spike amplitudes
- correlograms (e.g.,
window_ms=50, bin_ms=1)
- unit locations (e.g.,
monopolar_triangulation)
- quality metrics (e.g., SNR, ISI violations, presence ratio, amplitude cutoff)
Common QC thresholds (dataset-dependent; document your choices):
snr_threshold: often 3–5
isi_violations_ratio: often 0.01–0.5
presence_ratio: often 0.5–0.95
6) Curation logic (Allen/IBL-style)
A conservative “good unit” selection often combines:
- high presence ratio (stable across recording)
- low ISI violations (refractory period respected)
- low amplitude cutoff (less truncation / missed spikes)
Example rule (illustrative):
presence_ratio > 0.9
isi_violations_ratio < 0.5
amplitude_cutoff < 0.1
7) AI-assisted visual analysis (optional)
For borderline units (e.g., moderate SNR), AI-assisted review can be used to interpret:
- waveform shape consistency
- refractory period evidence in autocorrelograms
- amplitude stability and drift effects
- multi-unit contamination indicators
If your repository provides npa.analyze_unit_visually(...), it can be integrated with an API client (e.g., anthropic) to generate structured curation suggestions.
1---2name: neuropixels-analysis-23description: 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.4license: MIT5---6> **Source**: [https://github.com/aipoch/medical-research-skills](https://github.com/aipoch/medical-research-skills)78## When to Use910Use this skill in any of the following situations:11121. **You need to load and standardize Neuropixels recordings** from SpikeGLX (`.ap.bin/.lf.bin/.meta`), Open Ephys (`.continuous/.oebin`), or NWB (`.nwb`) into a consistent analysis pipeline.132. **You are preparing raw extracellular data for spike sorting**, including high-pass filtering, phase shift correction (NP1.0), bad channel detection/removal, and common average referencing (CAR).143. **You suspect probe drift or tissue motion** and need to estimate and correct motion before sorting (especially when drift is > ~10 µm).154. **You want to run spike sorting** (Kilosort4 recommended; CPU alternatives supported) and then compute post-processing products (waveforms, templates, amplitudes, correlograms, unit locations).165. **You need quality control and curation** using Allen/IBL-style thresholds, plus optional AI-assisted visual review for borderline units, and exports to Phy/NWB.1718## Key Features1920- **Multi-format ingestion**: SpikeGLX, Open Ephys, and NWB readers via SpikeInterface.21- **Neuropixels-aware preprocessing**:22 - High-pass filtering for spike band23 - **Phase shift correction for Neuropixels 1.0**24 - Bad channel detection and removal25 - Median CAR / referencing26- **Motion/drift workflow**:27 - Motion estimation presets (e.g., “Kilosort-like”)28 - Optional rigid/non-rigid correction presets29 - Drift visualization outputs30- **Spike sorting orchestration**:31 - Kilosort4 (GPU) recommended32 - CPU alternatives (e.g., SpykingCircus2, Mountainsort5, Tridesclous2)33- **Post-processing and QC**:34 - SortingAnalyzer-based computation of waveforms, templates, amplitudes, correlograms, unit locations, and quality metrics35- **Curation**:36 - Allen/IBL-style automated labeling37 - Optional AI-assisted visual analysis for uncertain units38- **Reporting and export**:39 - HTML report generation40 - Export to **Phy** and **NWB**41 - Save metrics tables (CSV)4243Reference guides (if present in the repository) can be used for deeper explanations:44- `reference/standard_workflow.md`45- `reference/api_reference.md`46- `reference/plotting_guide.md`47- `reference/PREPROCESSING.md`, `reference/MOTION_CORRECTION.md`, `reference/SPIKE_SORTING.md`48- `reference/QUALITY_METRICS.md`, `reference/AUTOMATED_CURATION.md`, `reference/AI_CURATION.md`4950## Dependencies5152Python dependencies (typical versions known to work; adjust to your environment):5354- `python >= 3.9`55- `spikeinterface[full] >= 0.99`56- `probeinterface >= 0.2`57- `neo >= 0.13`58- Spike sorters (optional, depending on what you run):59 - `kilosort >= 4.0` (Kilosort4; GPU required)60 - `spykingcircus >= 1.1` (SpykingCircus2; CPU)61 - `mountainsort5 >= 0.5` (CPU)62- Optional (AI-assisted curation):63 - `anthropic >= 0.20`64- Optional (IBL tooling):65 - `ibllib >= 2.0`66 - `ibl-neuropixel >= 1.0`6768## Example Usage6970The 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.7172```python73import spikeinterface.full as si74import neuropixels_analysis as npa7576def main():77 # Parallelization / chunking settings used by SpikeInterface functions78 job_kwargs = dict(n_jobs=-1, chunk_duration="1s", progress_bar=True)7980 # 1) Load data (SpikeGLX example)81 # For Open Ephys: si.read_openephys("/path/to/Record_Node_101/")82 # For NWB: si.read_nwb("/path/to/file.nwb")83 recording = si.read_spikeglx("/path/to/spikeglx_folder", stream_id="imec0.ap")8485 # Optional: slice first 60 seconds for a quick test86 fs = recording.get_sampling_frequency()87 recording = recording.frame_slice(0, int(60 * fs))8889 # 2) Preprocess (recommended chain; wrapper may include the same steps)90 # Note: phase_shift is mandatory for Neuropixels 1.0 and not needed for 2.0.91 rec = npa.preprocess(recording)9293 # 3) Estimate drift/motion and correct if needed94 motion_info = npa.estimate_motion(rec, preset="kilosort_like", **job_kwargs)95 npa.plot_drift(rec, motion_info, output="drift_map.png")9697 # Example threshold: correct if max drift exceeds 10 µm98 if float(motion_info["motion"].max()) > 10.0:99 rec = npa.correct_motion(rec, preset="nonrigid_accurate", **job_kwargs)100101 # 4) Spike sorting (Kilosort4 recommended; requires GPU)102 sorting = si.run_sorter("kilosort4", rec, folder="ks4_output", **job_kwargs)103104 # 5) Post-processing + metrics105 analyzer = si.create_sorting_analyzer(sorting, rec, sparse=True)106107 analyzer.compute("random_spikes", max_spikes_per_unit=500, **job_kwargs)108 analyzer.compute("waveforms", ms_before=1.0, ms_after=2.0, **job_kwargs)109 analyzer.compute("templates", operators=["average", "std"], **job_kwargs)110 analyzer.compute("spike_amplitudes", **job_kwargs)111 analyzer.compute("correlograms", window_ms=50.0, bin_ms=1.0, **job_kwargs)112 analyzer.compute("unit_locations", method="monopolar_triangulation", **job_kwargs)113 analyzer.compute("quality_metrics", **job_kwargs)114115 metrics = analyzer.get_extension("quality_metrics").get_data()116 metrics.to_csv("quality_metrics.csv")117118 # 6) Automated curation (Allen/IBL-style)119 labels = npa.curate(metrics, method="allen") # e.g., "allen", "ibl", "strict"120121 # 7) Report122 results = {"sorting": sorting, "metrics": metrics, "labels": labels, "analyzer": analyzer}123 npa.generate_analysis_report(results, "output_report/")124 npa.print_analysis_summary(results)125126 # 8) Export127 si.export_to_phy(128 analyzer,129 output_folder="phy_export/",130 compute_pc_features=True,131 compute_amplitudes=True,132 )133134 from spikeinterface.exporters import export_to_nwb135 export_to_nwb(rec, sorting, "output.nwb")136137if __name__ == "__main__":138 main()139```140141## Implementation Details142143### 1) Data I/O and supported formats144145- **SpikeGLX**: `si.read_spikeglx(path, stream_id="imec0.ap")`146- **Open Ephys**: `si.read_openephys(path)`147- **NWB**: `si.read_nwb(path)`148149Neuropixels probe types commonly encountered:150- **Neuropixels 1.0**: requires **phase shift correction** to align channels.151- **Neuropixels 2.0**: denser geometries; phase shift correction typically not required.152153### 2) Preprocessing chain (typical)154155A standard spike-band preprocessing sequence is:1561571. **High-pass filter** (commonly 300–400 Hz) to isolate spikes.1582. **Phase shift correction** (`si.phase_shift`) for **NP1.0**.1593. **Bad channel detection** (`si.detect_bad_channels`) and removal.1604. **Common reference** (often median CAR) to reduce shared noise.161162Key parameters:163- `freq_min` (high-pass cutoff): typical **300–400 Hz**164- bad channel detection sensitivity (implementation-dependent; often exposed as thresholds/presets)165166### 3) Motion estimation and correction167168- Motion/drift can strongly degrade sorting quality; a practical rule is to **inspect drift before sorting**.169- Presets:170 - `preset="kilosort_like"`: faster estimation aligned with common sorter assumptions171 - `preset="nonrigid_accurate"`: more robust correction for severe drift172173Operational threshold often used in practice:174- If estimated drift exceeds **~10 µm**, apply correction before sorting.175176### 4) Spike sorting177178- **Kilosort4** is recommended for Neuropixels due to speed and quality, but requires a GPU.179- CPU alternatives can be used when GPU is unavailable (at the cost of runtime and sometimes quality).180181Sorter parameters to tune (Kilosort4 examples):182- `batch_size`: samples per batch (often ~30000 by default)183- `nblocks`: number of drift blocks (increase for long recordings)184- `Th_learned`: detection threshold (lower → more spikes, potentially more false positives)185186### 5) Post-processing and quality metrics187188Using `SortingAnalyzer`, the pipeline typically computes:189- waveforms (window: `ms_before`, `ms_after`)190- templates (average/std)191- spike amplitudes192- correlograms (e.g., `window_ms=50`, `bin_ms=1`)193- unit locations (e.g., `monopolar_triangulation`)194- quality metrics (e.g., SNR, ISI violations, presence ratio, amplitude cutoff)195196Common QC thresholds (dataset-dependent; document your choices):197- `snr_threshold`: often **3–5**198- `isi_violations_ratio`: often **0.01–0.5**199- `presence_ratio`: often **0.5–0.95**200201### 6) Curation logic (Allen/IBL-style)202203A conservative “good unit” selection often combines:204- high presence ratio (stable across recording)205- low ISI violations (refractory period respected)206- low amplitude cutoff (less truncation / missed spikes)207208Example rule (illustrative):209- `presence_ratio > 0.9`210- `isi_violations_ratio < 0.5`211- `amplitude_cutoff < 0.1`212213### 7) AI-assisted visual analysis (optional)214215For borderline units (e.g., moderate SNR), AI-assisted review can be used to interpret:216- waveform shape consistency217- refractory period evidence in autocorrelograms218- amplitude stability and drift effects219- multi-unit contamination indicators220221If your repository provides `npa.analyze_unit_visually(...)`, it can be integrated with an API client (e.g., `anthropic`) to generate structured curation suggestions.