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

📦 NWB export — Optional export to Neurodata Without Borders format for data sharing via DANDI

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

Installation

Requires Python 3.12+ — Check your version with python --version

System Requirements

Platform Before Installing MyoGen
Windows NEURON 8.2.6 - Download, run installer, select "Add to PATH"
Linux sudo apt install libopenmpi-dev (Ubuntu/Debian) or sudo dnf install openmpi-devel (Fedora)
macOS brew install open-mpi

[!CAUTION]

Windows Users: Prerequisites

You MUST install the following before installing MyoGen on Windows:

1. Visual C++ Build Tools

Download and install Visual C++ Build Tools.

During installation, select these components:

  • MSVC Build Tools for x64/x86 (Latest)
  • MSVC v143 – VS 2022 C++ x64/x86 build tools
  • Windows 11 SDK (latest)
  • C++ core desktop features

2. NEURON Simulator

  1. Download: NEURON 8.2.6 Installer
  2. Run the installer and select "Add to PATH" when prompted
  3. Restart your terminal (close and reopen)
  4. Then continue with the installation below

Step 1: Install uv (Package Manager)

We use uv - a fast Python package manager. Install it first:

Windows (open PowerShell):

powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

Linux/macOS:

curl -LsSf https://astral.sh/uv/install.sh | sh

After installing, restart your terminal (close and reopen it).


Step 2: Create a New Project

Open a terminal and navigate to where you want your project:

# Create a new folder for your project
mkdir my_emg_project
cd my_emg_project

# Initialize a Python project
uv init

# Add MyoGen to your project
uv add myogen

That's it! MyoGen is now installed and ready to use.


Step 3: Verify Installation

Create a test file to make sure everything works:

# Create a test script
uv run python -c "from myogen import simulator; print('MyoGen installed successfully!')"

If you see MyoGen installed successfully! - you're all set!


Alternative: pip install

If you prefer pip over uv:

pip install myogen

For Developers (From Source)

git clone https://github.com/NsquaredLab/MyoGen.git
cd MyoGen
uv sync
uv run poe setup_myogen

Optional: GPU Acceleration

For 5-10× faster convolutions (requires NVIDIA GPU):

uv add 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.8.4.tar.gz (4.3 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.8.4-cp312-cp312-manylinux_2_17_x86_64.whl (7.7 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

File details

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

File metadata

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

File hashes

Hashes for myogen-0.8.4.tar.gz
Algorithm Hash digest
SHA256 9ef18fe67f3a15b805c7e71342de41963735fd3e59a7f98fee7742ffb91d879a
MD5 154ced64018fefed4faac4110f064c59
BLAKE2b-256 7bc4a3c32ca4057ae3d37a2fc4cff0e46c2335a8f5c326cf6d293d76ff226be9

See more details on using hashes here.

Provenance

The following attestation bundles were made for myogen-0.8.4.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.8.4-cp312-cp312-manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for myogen-0.8.4-cp312-cp312-manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 51e393a2818c795789dbcf1039aeb4f9ad62a6c4c3c5989e6a43151419dba951
MD5 e39a84ef26c098b95b6a194d9c316996
BLAKE2b-256 edd2cb3c43d7c87b5b09e35297771014046a9a06e2963db4bc42b157ccb30ff7

See more details on using hashes here.

Provenance

The following attestation bundles were made for myogen-0.8.4-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