A comprehensive Python package for analyzing neural data, including spike processing, trial management, session data organization, and advanced modeling with rSLDS (recurrent Switching Linear Dynamical Systems).
- Spike Processing: Extract, clean, and analyze spike data
- Trial Management: Organize and manage experimental trials
- Decoding: Train and evaluate neural decoders
- Coding Directions: Analyze neural population dynamics
- rSLDS: Recurrent Switching Linear Dynamical Systems for neural dynamics
- State Analysis: Analyze discrete states and transitions
- Model Fitting: Expectation-Maximization algorithm implementation
- HDF5 Storage: Efficient storage of large neural datasets
- Session Organization: Hierarchical data structure for experiments
- Flexible I/O: Save/load trial tables, aligned spikes, and models
- PSTH Plots: Peri-stimulus time histograms
- Raster Plots: Spike timing visualization
- Tuning Curves: Response characterization
- Model Results: Visualize rSLDS states and transitions
git clone <your-repository-url>
cd pyNeuroDAP
pip install -e .
pip install -r requirements.txt
import pyNeuroDAP as ndap
# Load and process spikes
spikes = ndap.get_spikes(spike_times, event_times, window_ms=500)
spikes_clean = ndap.remove_nan_trials(spikes)
# Get decoders
decoders = ndap.get_decoders(spikes_clean, labels, cv_folds=5)
# Analyze coding directions
cd_stimulus, cd_choice = ndap.get_mod_index(spikes_clean, stimulus_labels, choice_labels)
# Make orthogonal
cd_stimulus_ortho = ndap.make_orthogonal(cd_stimulus, cd_choice)
# Save complete session
session_file = ndap.save_session_data(
session_name='session_2024_01_15',
trial_table=trial_table,
aligned_spikes=aligned_spikes,
metadata={'subject': 'mouse_001', 'experiment': 'opto_psth'}
)
# Add new data later
ndap.add_to_session(session_file, new_aligned_data, 'aligned_spikes')
# Load session
session_data = ndap.load_session_data(session_file)
# Fit rSLDS model
model = ndap.fit_rslds(
data=spikes_clean,
n_states=3,
n_latent=5,
max_iter=100
)
# Analyze states
state_analysis = ndap.analyze_rslds_states(model, spikes_clean, trial_labels)
pyNeuroDAP/
βββ __init__.py # Main package interface
βββ spikes.py # Core spike analysis and rSLDS
βββ trials.py # Trial management
βββ sessions.py # HDF5 data management
βββ plots.py # Visualization tools
Core neural data processing and analysis:
get_spikes()
: Extract spike data around eventsget_decoders()
: Train neural decodersget_mod_index()
: Calculate coding directionsmake_orthogonal()
: Orthogonalize vectorsrSLDS
: Recurrent switching linear dynamical systemsfit_rslds()
: Fit rSLDS modelsanalyze_rslds_states()
: Analyze model states
Trial organization and management:
get_trial_table()
: Create trial information tableget_trial_conditions()
: Extract trial conditionsget_trial_events()
: Get trial event timesget_trial_data()
: Retrieve trial-specific data
HDF5-based data management:
save_session_data()
: Save complete sessionload_session_data()
: Load complete sessionadd_to_session()
: Add new data to existing sessionsave_aligned_spikes()
: Save spike alignment datasave_trial_table()
: Save trial information
Visualization tools:
plot_psth()
: Peri-stimulus time histogramsplot_raster()
: Spike raster plotsplot_tuning_curve()
: Response tuning curvesplot_rslds_states()
: rSLDS state visualization
session_name.h5
βββ trial_table/ # Trial information
βββ aligned_spikes/ # Spike alignments
β βββ trial_start/
β βββ choice_lick/
β βββ reward/
βββ models/ # Fitted models
β βββ rslds_3states/
β βββ decoders/
βββ metadata # Session information
aligned_spikes = {
'condition_name': {
'count': np.array, # Spike counts [neurons, trials, time_bins]
'rate': np.array, # Firing rates
'times': np.array, # Spike times
'params': dict # Alignment parameters
}
}
import pyNeuroDAP as ndap
# 1. Load and process data
spikes = ndap.get_spikes(spike_times, event_times, window_ms=500)
spikes_clean = ndap.remove_nan_trials(spikes)
# 2. Train decoders
decoders = ndap.get_decoders(spikes_clean, labels, cv_folds=5)
# 3. Analyze coding directions
cd_stimulus, cd_choice = ndap.get_mod_index(spikes_clean, stimulus_labels, choice_labels)
# 4. Fit rSLDS model
model = ndap.fit_rslds(spikes_clean, n_states=3, n_latent=5)
# 5. Save everything
session_file = ndap.save_session_data(
'my_experiment',
trial_table=trial_info,
aligned_spikes=spikes_clean,
models={'rslds': model, 'decoders': decoders}
)
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests if applicable
- Submit a pull request
This project is licensed under the MIT License - see the LICENSE file for details.
If you use this package in your research, please cite:
@software{pyNeuroDAP,
title={pyNeuroDAP: Neural Data Analysis Package},
author={Li, Shun},
year={2025},
url={https://github.com/shunnnli/pyNeuroDAP}
}
For questions, issues, or feature requests, please:
- Open an issue on GitHub
- Check the documentation
- Contact the maintainer
Happy Neural Data Analysis! π§ β¨