Skip to main content

Modular and extensible neuromuscular simulation framework for generating physiologically grounded motor-unit activity, muscle force, and EMG signals (surface and intramuscular)

Project description

Welcome to MyoGen Logo

The modular and extandable simulation toolkit for neurophysiology

Documentation Python 3.12+ Version

InstallationDocumentationExamplesHow to Cite

Overview

MyoGen is a modular and extensible neuromuscular simulation framework for generating physiologically grounded motor-unit activity, muscle force, and surface EMG signals.

It supports end-to-end modeling of the neuromuscular pathway, from descending neural drive and spinal motor neuron dynamics to muscle activation and bioelectric signal formation at the electrode level. MyoGen is designed for algorithm validation, hypothesis-driven research, and education, providing configurable building blocks that can be independently combined and extended.

Highlights

🧬 Biophysically inspired neuron models — NEURON-based motor neurons with validated calcium dynamics and membrane properties

🎯 Everything is inspectable — Complete access to every motor unit, spike time, fiber location etc. for rigorous algorithm testing

⚡️ Vectorized & parallel — Multi-core CPU processing with NumPy/Numba vectorization for fast computation

🔬 End-to-end simulation — From motor unit recruitment to high-density surface EMG in a single framework

📊 Reproducible science — Deterministic random seeds and standardized Neo Block outputs for exact replication

🧰 Comprehensive toolkit — Surface EMG, intramuscular EMG, force generation, and spinal network modeling

Installation

[!WARNING] Windows users: Install NEURON 8.2.6 before installing MyoGen

uv add MyoGen
# or
pip install MyoGen

NEURON mechanisms compile automatically during installation.


Prerequisites: Python ≥3.12, Linux/Windows/macOS

[!IMPORTANT] System Requirements:

  • Linux/macOS: OpenMPI or MPICH (install via package manager)
  • Windows: NEURON 8.2.6 required (see warning above)
# Install MPI (Linux)
sudo apt-get install libopenmpi-dev  # Ubuntu/Debian
# or
sudo yum install openmpi-devel       # RHEL/CentOS

# Install MPI (macOS)
brew install open-mpi

From Source (for development)

# Clone and install
git clone https://github.com/NsquaredLab/MyoGen.git
cd MyoGen
uv sync

# Activate environment
source .venv/bin/activate  # Linux/macOS
.venv\Scripts\activate     # Windows

# Compile NEURON mechanisms (required for editable installs)
uv run poe setup_myogen

[!TIP] Install uv first

Optional Dependencies

GPU acceleration (5-10× speedup for convolutions):

pip install cupy-cuda12x

Quick Start

Generate motor unit action potentials (MUAPs):

from myogen import simulator
import quantities as pq

# 1. Generate recruitment thresholds (100 motor units)
thresholds, _ = simulator.RecruitmentThresholds(
    N=100,
    recruitment_range__ratio=50,
    mode="fuglevand"
)

# 2. Create muscle model with fiber distribution
muscle = simulator.Muscle(
    recruitment_thresholds=thresholds,
    radius_bone__mm=1.0 * pq.mm,
    fiber_density__fibers_per_mm2=400 * pq.mm**-2,
    fat_thickness__mm=10 * pq.mm,
    autorun=True
)

# 3. Set up surface electrode array
electrode_array = simulator.SurfaceElectrodeArray(
    num_rows=5,
    num_cols=5,
    inter_electrode_distances__mm=5 * pq.mm,
    electrode_radius__mm=5 * pq.mm,
    bending_radius__mm=muscle.radius__mm + muscle.skin_thickness__mm + muscle.fat_thickness__mm,
)

# 4. Create surface EMG simulator
surface_emg = simulator.SurfaceEMG(
    muscle_model=muscle,
    electrode_arrays=[electrode_array],
    sampling_frequency__Hz=2048.0,
    MUs_to_simulate=[0, 1, 2, 3, 4]  # First 5 motor units
)

# 5. Simulate MUAPs (parallel processing)
muaps = surface_emg.simulate_muaps(n_jobs=-2)

Access MUAP data:

import numpy as np

# Get MUAP from motor unit 0
muap_signal = muaps.groups[0].segments[0].analogsignals[0]
print(f"MUAP shape: {muap_signal.shape}")  # (time, rows, cols)

# Extract from specific electrode (row 2, col 2)
electrode_muap = muap_signal[:, 2, 2]
peak_amplitude = np.max(np.abs(electrode_muap.magnitude))
print(f"Peak amplitude: {peak_amplitude:.3f} {electrode_muap.units}")

For full EMG simulation with spike trains, see examples

Documentation

📖 Read the full documentation

  • User Guide — Working with simulation outputs
  • API Reference — Complete class documentation
  • Examples — Step-by-step tutorials from recruitment to EMG

How to Cite

If you use MyoGen in your research, please cite:

TBD

Contributing

Contributions welcome! See issues if you want to add a feature or fix a bug.

License

MyoGen is AGPL licensed. See LICENSE for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

myogen-0.6.11.tar.gz (4.2 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

myogen-0.6.11-cp312-cp312-manylinux_2_17_x86_64.whl (7.9 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

File details

Details for the file myogen-0.6.11.tar.gz.

File metadata

  • Download URL: myogen-0.6.11.tar.gz
  • Upload date:
  • Size: 4.2 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for myogen-0.6.11.tar.gz
Algorithm Hash digest
SHA256 f21aa5238552da5f25947695919c7a939814b7ecc1271b936a428519879e2454
MD5 7988fee97cf0a0fb88eab10300652954
BLAKE2b-256 35af8e09e29328331b5773da9b0c2dfd9a36bca8e9275a4ad939230e5645ed77

See more details on using hashes here.

Provenance

The following attestation bundles were made for myogen-0.6.11.tar.gz:

Publisher: build-wheels.yml on NsquaredLab/MyoGen

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file myogen-0.6.11-cp312-cp312-manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for myogen-0.6.11-cp312-cp312-manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 84267efef87fc2072810d181d6388e3618c3bd427949d169a38f45429f20a81c
MD5 83bb4a3b80a8a3dd06282457726dae05
BLAKE2b-256 71630899058f86c9d9fa6fb968966296b79ecf7dbed70afa9aa4925900897901

See more details on using hashes here.

Provenance

The following attestation bundles were made for myogen-0.6.11-cp312-cp312-manylinux_2_17_x86_64.whl:

Publisher: build-wheels.yml on NsquaredLab/MyoGen

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page