mirror of
https://github.com/K-Dense-AI/claude-scientific-skills.git
synced 2026-01-26 16:58:56 +08:00
Adds comprehensive toolkit for analyzing Neuropixels high-density neural recordings using SpikeInterface, Allen Institute, and IBL best practices. Features: - Data loading from SpikeGLX, Open Ephys, and NWB formats - Preprocessing pipelines (filtering, phase shift, CAR, bad channel detection) - Motion/drift estimation and correction - Spike sorting integration (Kilosort4, SpykingCircus2, Mountainsort5) - Quality metrics computation (SNR, ISI violations, presence ratio) - Automated curation using Allen/IBL criteria - AI-assisted visual curation for uncertain units - Export to Phy and NWB formats Supports Neuropixels 1.0 and 2.0 probes. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
345 lines
11 KiB
Markdown
345 lines
11 KiB
Markdown
---
|
|
name: neuropixels-analysis
|
|
description: "Neuropixels neural recording analysis. Load SpikeGLX/OpenEphys data, preprocess, motion correction, Kilosort4 spike sorting, quality metrics, Allen/IBL curation, AI-assisted visual analysis, for Neuropixels 1.0/2.0 extracellular electrophysiology. Use when working with neural recordings, spike sorting, extracellular electrophysiology, or when the user mentions Neuropixels, SpikeGLX, Open Ephys, Kilosort, quality metrics, or unit curation."
|
|
---
|
|
|
|
# Neuropixels Data Analysis
|
|
|
|
## Overview
|
|
|
|
Comprehensive toolkit for analyzing Neuropixels high-density neural recordings using current best practices from SpikeInterface, Allen Institute, and International Brain Laboratory (IBL). Supports the full workflow from raw data to publication-ready curated units.
|
|
|
|
## When to Use This Skill
|
|
|
|
This skill should be used when:
|
|
- Working with Neuropixels recordings (.ap.bin, .lf.bin, .meta files)
|
|
- Loading data from SpikeGLX, Open Ephys, or NWB formats
|
|
- Preprocessing neural recordings (filtering, CAR, bad channel detection)
|
|
- Detecting and correcting motion/drift in recordings
|
|
- Running spike sorting (Kilosort4, SpykingCircus2, Mountainsort5)
|
|
- Computing quality metrics (SNR, ISI violations, presence ratio)
|
|
- Curating units using Allen/IBL criteria
|
|
- Creating visualizations of neural data
|
|
- Exporting results to Phy or NWB
|
|
|
|
## Supported Hardware & Formats
|
|
|
|
| Probe | Electrodes | Channels | Notes |
|
|
|-------|-----------|----------|-------|
|
|
| Neuropixels 1.0 | 960 | 384 | Requires phase_shift correction |
|
|
| Neuropixels 2.0 (single) | 1280 | 384 | Denser geometry |
|
|
| Neuropixels 2.0 (4-shank) | 5120 | 384 | Multi-region recording |
|
|
|
|
| Format | Extension | Reader |
|
|
|--------|-----------|--------|
|
|
| SpikeGLX | `.ap.bin`, `.lf.bin`, `.meta` | `si.read_spikeglx()` |
|
|
| Open Ephys | `.continuous`, `.oebin` | `si.read_openephys()` |
|
|
| NWB | `.nwb` | `si.read_nwb()` |
|
|
|
|
## Quick Start
|
|
|
|
### Basic Import and Setup
|
|
|
|
```python
|
|
import spikeinterface.full as si
|
|
import neuropixels_analysis as npa
|
|
|
|
# Configure parallel processing
|
|
job_kwargs = dict(n_jobs=-1, chunk_duration='1s', progress_bar=True)
|
|
```
|
|
|
|
### Loading Data
|
|
|
|
```python
|
|
# SpikeGLX (most common)
|
|
recording = si.read_spikeglx('/path/to/data', stream_id='imec0.ap')
|
|
|
|
# Open Ephys (common for many labs)
|
|
recording = si.read_openephys('/path/to/Record_Node_101/')
|
|
|
|
# Check available streams
|
|
streams, ids = si.get_neo_streams('spikeglx', '/path/to/data')
|
|
print(streams) # ['imec0.ap', 'imec0.lf', 'nidq']
|
|
|
|
# For testing with subset of data
|
|
recording = recording.frame_slice(0, int(60 * recording.get_sampling_frequency()))
|
|
```
|
|
|
|
### Complete Pipeline (One Command)
|
|
|
|
```python
|
|
# Run full analysis pipeline
|
|
results = npa.run_pipeline(
|
|
recording,
|
|
output_dir='output/',
|
|
sorter='kilosort4',
|
|
curation_method='allen',
|
|
)
|
|
|
|
# Access results
|
|
sorting = results['sorting']
|
|
metrics = results['metrics']
|
|
labels = results['labels']
|
|
```
|
|
|
|
## Standard Analysis Workflow
|
|
|
|
### 1. Preprocessing
|
|
|
|
```python
|
|
# Recommended preprocessing chain
|
|
rec = si.highpass_filter(recording, freq_min=400)
|
|
rec = si.phase_shift(rec) # Required for Neuropixels 1.0
|
|
bad_ids, _ = si.detect_bad_channels(rec)
|
|
rec = rec.remove_channels(bad_ids)
|
|
rec = si.common_reference(rec, operator='median')
|
|
|
|
# Or use our wrapper
|
|
rec = npa.preprocess(recording)
|
|
```
|
|
|
|
### 2. Check and Correct Drift
|
|
|
|
```python
|
|
# Check for drift (always do this!)
|
|
motion_info = npa.estimate_motion(rec, preset='kilosort_like')
|
|
npa.plot_drift(rec, motion_info, output='drift_map.png')
|
|
|
|
# Apply correction if needed
|
|
if motion_info['motion'].max() > 10: # microns
|
|
rec = npa.correct_motion(rec, preset='nonrigid_accurate')
|
|
```
|
|
|
|
### 3. Spike Sorting
|
|
|
|
```python
|
|
# Kilosort4 (recommended, requires GPU)
|
|
sorting = si.run_sorter('kilosort4', rec, folder='ks4_output')
|
|
|
|
# CPU alternatives
|
|
sorting = si.run_sorter('tridesclous2', rec, folder='tdc2_output')
|
|
sorting = si.run_sorter('spykingcircus2', rec, folder='sc2_output')
|
|
sorting = si.run_sorter('mountainsort5', rec, folder='ms5_output')
|
|
|
|
# Check available sorters
|
|
print(si.installed_sorters())
|
|
```
|
|
|
|
### 4. Postprocessing
|
|
|
|
```python
|
|
# Create analyzer and compute all extensions
|
|
analyzer = si.create_sorting_analyzer(sorting, rec, sparse=True)
|
|
|
|
analyzer.compute('random_spikes', max_spikes_per_unit=500)
|
|
analyzer.compute('waveforms', ms_before=1.0, ms_after=2.0)
|
|
analyzer.compute('templates', operators=['average', 'std'])
|
|
analyzer.compute('spike_amplitudes')
|
|
analyzer.compute('correlograms', window_ms=50.0, bin_ms=1.0)
|
|
analyzer.compute('unit_locations', method='monopolar_triangulation')
|
|
analyzer.compute('quality_metrics')
|
|
|
|
metrics = analyzer.get_extension('quality_metrics').get_data()
|
|
```
|
|
|
|
### 5. Curation
|
|
|
|
```python
|
|
# Allen Institute criteria (conservative)
|
|
good_units = metrics.query("""
|
|
presence_ratio > 0.9 and
|
|
isi_violations_ratio < 0.5 and
|
|
amplitude_cutoff < 0.1
|
|
""").index.tolist()
|
|
|
|
# Or use automated curation
|
|
labels = npa.curate(metrics, method='allen') # 'allen', 'ibl', 'strict'
|
|
```
|
|
|
|
### 6. AI-Assisted Curation (For Uncertain Units)
|
|
|
|
When using this skill with Claude Code, Claude can directly analyze waveform plots and provide expert curation decisions. For programmatic API access:
|
|
|
|
```python
|
|
from anthropic import Anthropic
|
|
|
|
# Setup API client
|
|
client = Anthropic()
|
|
|
|
# Analyze uncertain units visually
|
|
uncertain = metrics.query('snr > 3 and snr < 8').index.tolist()
|
|
|
|
for unit_id in uncertain:
|
|
result = npa.analyze_unit_visually(analyzer, unit_id, api_client=client)
|
|
print(f"Unit {unit_id}: {result['classification']}")
|
|
print(f" Reasoning: {result['reasoning'][:100]}...")
|
|
```
|
|
|
|
**Claude Code Integration**: When running within Claude Code, ask Claude to examine waveform/correlogram plots directly - no API setup required.
|
|
|
|
### 7. Generate Analysis Report
|
|
|
|
```python
|
|
# Generate comprehensive HTML report with visualizations
|
|
report_dir = npa.generate_analysis_report(results, 'output/')
|
|
# Opens report.html with summary stats, figures, and unit table
|
|
|
|
# Print formatted summary to console
|
|
npa.print_analysis_summary(results)
|
|
```
|
|
|
|
### 8. Export Results
|
|
|
|
```python
|
|
# Export to Phy for manual review
|
|
si.export_to_phy(analyzer, output_folder='phy_export/',
|
|
compute_pc_features=True, compute_amplitudes=True)
|
|
|
|
# Export to NWB
|
|
from spikeinterface.exporters import export_to_nwb
|
|
export_to_nwb(rec, sorting, 'output.nwb')
|
|
|
|
# Save quality metrics
|
|
metrics.to_csv('quality_metrics.csv')
|
|
```
|
|
|
|
## Common Pitfalls and Best Practices
|
|
|
|
1. **Always check drift** before spike sorting - drift > 10μm significantly impacts quality
|
|
2. **Use phase_shift** for Neuropixels 1.0 probes (not needed for 2.0)
|
|
3. **Save preprocessed data** to avoid recomputing - use `rec.save(folder='preprocessed/')`
|
|
4. **Use GPU** for Kilosort4 - it's 10-50x faster than CPU alternatives
|
|
5. **Review uncertain units manually** - automated curation is a starting point
|
|
6. **Combine metrics with AI** - use metrics for clear cases, AI for borderline units
|
|
7. **Document your thresholds** - different analyses may need different criteria
|
|
8. **Export to Phy** for critical experiments - human oversight is valuable
|
|
|
|
## Key Parameters to Adjust
|
|
|
|
### Preprocessing
|
|
- `freq_min`: Highpass cutoff (300-400 Hz typical)
|
|
- `detect_threshold`: Bad channel detection sensitivity
|
|
|
|
### Motion Correction
|
|
- `preset`: 'kilosort_like' (fast) or 'nonrigid_accurate' (better for severe drift)
|
|
|
|
### Spike Sorting (Kilosort4)
|
|
- `batch_size`: Samples per batch (30000 default)
|
|
- `nblocks`: Number of drift blocks (increase for long recordings)
|
|
- `Th_learned`: Detection threshold (lower = more spikes)
|
|
|
|
### Quality Metrics
|
|
- `snr_threshold`: Signal-to-noise cutoff (3-5 typical)
|
|
- `isi_violations_ratio`: Refractory violations (0.01-0.5)
|
|
- `presence_ratio`: Recording coverage (0.5-0.95)
|
|
|
|
## Bundled Resources
|
|
|
|
### scripts/preprocess_recording.py
|
|
Automated preprocessing script:
|
|
```bash
|
|
python scripts/preprocess_recording.py /path/to/data --output preprocessed/
|
|
```
|
|
|
|
### scripts/run_sorting.py
|
|
Run spike sorting:
|
|
```bash
|
|
python scripts/run_sorting.py preprocessed/ --sorter kilosort4 --output sorting/
|
|
```
|
|
|
|
### scripts/compute_metrics.py
|
|
Compute quality metrics and apply curation:
|
|
```bash
|
|
python scripts/compute_metrics.py sorting/ preprocessed/ --output metrics/ --curation allen
|
|
```
|
|
|
|
### scripts/export_to_phy.py
|
|
Export to Phy for manual curation:
|
|
```bash
|
|
python scripts/export_to_phy.py metrics/analyzer --output phy_export/
|
|
```
|
|
|
|
### assets/analysis_template.py
|
|
Complete analysis template. Copy and customize:
|
|
```bash
|
|
cp assets/analysis_template.py my_analysis.py
|
|
# Edit parameters and run
|
|
python my_analysis.py
|
|
```
|
|
|
|
### reference/standard_workflow.md
|
|
Detailed step-by-step workflow with explanations for each stage.
|
|
|
|
### reference/api_reference.md
|
|
Quick function reference organized by module.
|
|
|
|
### reference/plotting_guide.md
|
|
Comprehensive visualization guide for publication-quality figures.
|
|
|
|
## Detailed Reference Guides
|
|
|
|
| Topic | Reference |
|
|
|-------|-----------|
|
|
| Full workflow | [reference/standard_workflow.md](reference/standard_workflow.md) |
|
|
| API reference | [reference/api_reference.md](reference/api_reference.md) |
|
|
| Plotting guide | [reference/plotting_guide.md](reference/plotting_guide.md) |
|
|
| Preprocessing | [PREPROCESSING.md](PREPROCESSING.md) |
|
|
| Spike sorting | [SPIKE_SORTING.md](SPIKE_SORTING.md) |
|
|
| Motion correction | [MOTION_CORRECTION.md](MOTION_CORRECTION.md) |
|
|
| Quality metrics | [QUALITY_METRICS.md](QUALITY_METRICS.md) |
|
|
| Automated curation | [AUTOMATED_CURATION.md](AUTOMATED_CURATION.md) |
|
|
| AI-assisted curation | [AI_CURATION.md](AI_CURATION.md) |
|
|
| Waveform analysis | [ANALYSIS.md](ANALYSIS.md) |
|
|
|
|
## Installation
|
|
|
|
```bash
|
|
# Core packages
|
|
pip install spikeinterface[full] probeinterface neo
|
|
|
|
# Spike sorters
|
|
pip install kilosort # Kilosort4 (GPU required)
|
|
pip install spykingcircus # SpykingCircus2 (CPU)
|
|
pip install mountainsort5 # Mountainsort5 (CPU)
|
|
|
|
# Our toolkit
|
|
pip install neuropixels-analysis
|
|
|
|
# Optional: AI curation
|
|
pip install anthropic
|
|
|
|
# Optional: IBL tools
|
|
pip install ibl-neuropixel ibllib
|
|
```
|
|
|
|
## Project Structure
|
|
|
|
```
|
|
project/
|
|
├── raw_data/
|
|
│ └── recording_g0/
|
|
│ └── recording_g0_imec0/
|
|
│ ├── recording_g0_t0.imec0.ap.bin
|
|
│ └── recording_g0_t0.imec0.ap.meta
|
|
├── preprocessed/ # Saved preprocessed recording
|
|
├── motion/ # Motion estimation results
|
|
├── sorting_output/ # Spike sorter output
|
|
├── analyzer/ # SortingAnalyzer (waveforms, metrics)
|
|
├── phy_export/ # For manual curation
|
|
├── ai_curation/ # AI analysis reports
|
|
└── results/
|
|
├── quality_metrics.csv
|
|
├── curation_labels.json
|
|
└── output.nwb
|
|
```
|
|
|
|
## Additional Resources
|
|
|
|
- **SpikeInterface Docs**: https://spikeinterface.readthedocs.io/
|
|
- **Neuropixels Tutorial**: https://spikeinterface.readthedocs.io/en/stable/how_to/analyze_neuropixels.html
|
|
- **Kilosort4 GitHub**: https://github.com/MouseLand/Kilosort
|
|
- **IBL Neuropixel Tools**: https://github.com/int-brain-lab/ibl-neuropixel
|
|
- **Allen Institute ecephys**: https://github.com/AllenInstitute/ecephys_spike_sorting
|
|
- **Bombcell (Automated QC)**: https://github.com/Julie-Fabre/bombcell
|
|
- **SpikeAgent (AI Curation)**: https://github.com/SpikeAgent/SpikeAgent
|