ISI and CV Analysis with Optimized Descending Drive#

This example demonstrates spike train analysis using optimized descending drive parameters from previous optimization studies. It extracts inter-spike interval (ISI) and coefficient of variation (CV) statistics during realistic trapezoidal contraction patterns.

Note

Analysis workflow:

  1. Load optimized DD parameters from baseline or force-specific optimization

  2. Generate trapezoidal drive pattern (ramp-up, plateau, ramp-down)

  3. Simulate motor neuron spike trains with optimized network

  4. Extract ISI/CV statistics during plateau phase

  5. Visualize firing patterns and instantaneous discharge rates

Important

Prerequisites: This example requires results from previous optimizations:

  • Baseline mode: Run 00_optimize_dd_for_target_firing_rate.py first

  • Force mode: Run 02_optimize_dd_for_target_force.py for specific MVC level

  • Loads network structure and drive parameters from saved results

Trapezoidal Contraction: Simulates realistic voluntary isometric contractions with:

  • Ramp-up phase: Linear increase from rest to target force (1 second)

  • Plateau phase: Sustained contraction at target level (2 seconds)

  • Ramp-down phase: Linear decrease back to rest (1 second)

  • Rest periods: Baseline activity before and after contraction (1 second each)

ISI/CV Metrics: Quantify firing variability and regularity for motor control studies.

Import Libraries#

import os

os.environ["MPLBACKEND"] = "Agg"
if "DISPLAY" in os.environ:
    del os.environ["DISPLAY"]

import itertools
import json
import warnings
from pathlib import Path

import elephant
import joblib
import numpy as np
import quantities as pq
from matplotlib import pyplot as plt
from neo import AnalogSignal, Block, Segment, SpikeTrain
from neuron import h
from tqdm import tqdm

from myogen import set_random_seed
from myogen.simulator import RecruitmentThresholds
from myogen.simulator.neuron import Network
from myogen.simulator.neuron.populations import AlphaMN__Pool, DescendingDrive__Pool
from myogen.utils.helper import calculate_firing_rate_statistics
from myogen.utils.nmodl import load_nmodl_mechanisms

warnings.filterwarnings("ignore")
plt.style.use("fivethirtyeight")

Configuration#

Set analysis parameters and specify which optimization results to load.

# Random seed for reproducibility
set_random_seed(42)

# Study parameters
MUSCLE_TYPE = "TEST"  # Muscle identifier
MVC_LEVEL = 30  # MVC percentage (used for file naming)
STUDY_PREFIX = "TEST_"  # Prefix for output files

# Optimization mode selection
USE_BASELINE_OPTIMIZATION = True  # True = baseline FR optimization, False = force optimization
TARGET_FORCE_PCT = 30  # Force level if using force optimization

# Simulation parameters
TIMESTEP__ms = 0.1
N_MOTOR_UNITS = 100

# Trapezoidal contraction timing
RAMP_UP_DURATION__ms = 1000  # 1 second ramp-up
PLATEAU_DURATION__ms = 2000  # 2 second plateau
RAMP_DOWN_DURATION__ms = 1000  # 1 second ramp-down
REST_BEFORE__ms = 1000  # 1 second rest before
REST_AFTER__ms = 1000  # 1 second rest after

# Directories - use project root to share across examples
# Handle both manual execution and Sphinx Gallery (where __file__ is not defined)
try:
    _script_dir = Path(__file__).parent
except NameError:
    _script_dir = Path.cwd()
RESULTS_DIR = _script_dir.parent.parent / "results"
RESULTS_DIR.mkdir(exist_ok=True, parents=True)
Random seed set to 42.

Load Optimized DD Parameters#

Load network parameters from previous optimization studies.

print(f"\n{'=' * 80}")
print("LOADING OPTIMIZED DD PARAMETERS")
print(f"{'=' * 80}\n")

if USE_BASELINE_OPTIMIZATION:
    # Load from baseline firing rate optimization
    OPTIMIZATION_RESULTS_DIR = _script_dir.parent.parent / "results" / "dd_optimization"
    PARAMS_FILE = OPTIMIZATION_RESULTS_DIR / "dd_optimized_params.json"  # No prefix for baseline

    print("Loading from BASELINE firing rate optimization...")

    # Fallback to static example data if dynamic results don't exist
    STATIC_DATA_DIR = _script_dir.parent / "data" / "dd_optimization"
    STATIC_PARAMS_FILE = STATIC_DATA_DIR / "dd_optimized_params.json"

    if PARAMS_FILE.exists():
        print(f"  ✓ Using dynamic results from: {PARAMS_FILE.relative_to(_script_dir.parent.parent)}")
    elif STATIC_PARAMS_FILE.exists():
        print(f"  ✓ Using static example data from: {STATIC_PARAMS_FILE.relative_to(_script_dir.parent.parent)}")
        PARAMS_FILE = STATIC_PARAMS_FILE
    else:
        raise FileNotFoundError(
            f"Baseline optimization results not found.\n"
            f"  Tried: {PARAMS_FILE}\n"
            f"  Tried: {STATIC_PARAMS_FILE}\n"
            "Please run optimize_dd_for_target_firing_rate.py first or check examples/data/"
        )

    with open(PARAMS_FILE, "r") as f:
        optimization_results = json.load(f)

    # Extract DD parameters from best firing rate match
    dd_params = optimization_results["best_trial"]
    source_description = "baseline FR optimization"

else:
    # Load from force-specific optimization
    OPTIMIZATION_RESULTS_DIR = _script_dir.parent.parent / "results" / "force_optimization"

    # List available force optimization files
    if OPTIMIZATION_RESULTS_DIR.exists():
        available_files = sorted(
            OPTIMIZATION_RESULTS_DIR.glob(f"{STUDY_PREFIX}dd_optimized_params_force_*pct.json")
        )
        if available_files:
            print("Available force optimization results:")
            for i, file in enumerate(available_files):
                # Extract percentage from filename
                pct = file.stem.split("_")[-1].replace("pct", "")
                print(f"  {i + 1}. {pct}% MVC - {file.name}")
            print()

    PARAMS_FILE = (
        OPTIMIZATION_RESULTS_DIR
        / f"{STUDY_PREFIX}dd_optimized_params_force_{int(TARGET_FORCE_PCT)}pct.json"
    )

    print(f"Loading from FORCE-SPECIFIC optimization ({TARGET_FORCE_PCT}% MVC)...")

    if not PARAMS_FILE.exists():
        raise FileNotFoundError(
            f"Force optimization results not found at {PARAMS_FILE}.\n"
            f"Please run: python optimize_dd_for_target_force.py --target-force-pct {TARGET_FORCE_PCT}"
        )

    with open(PARAMS_FILE, "r") as f:
        optimization_results = json.load(f)

    # Extract DD parameters from force optimization results
    dd_params = optimization_results["dd_parameters"]
    source_description = f"{TARGET_FORCE_PCT}% MVC force optimization"

# Extract common DD parameters
N_DD_NEURONS = dd_params["dd_neurons"]
DD_CONNECTION_PROBABILITY = dd_params["conn_probability"]
DD_PEAK__Hz = dd_params["dd_drive__Hz"]
DD_SHAPE_PARAMETER = dd_params["gamma_shape"]
DD_SYNAPTIC_WEIGHT = dd_params.get("synaptic_weight", 0.05)

# Load Gfluctdv settings if present
GFLUCTDV_ENABLED = optimization_results.get("gfluctdv_enabled", False)
GFLUCTDV_NOISE_AMPLITUDE = dd_params.get("gfluctdv_noise_amplitude", None)

print(f"\n(OK) Loaded from: {source_description}")
print(f"  Source file: {PARAMS_FILE.name}")
print("\nOptimized DD parameters:")
print(f"\tDD neurons: {N_DD_NEURONS}")
print(f"\tConn probability: {DD_CONNECTION_PROBABILITY:.3f}")
print(f"\tSynaptic weight: {DD_SYNAPTIC_WEIGHT:.4f} uS")
print(f"\tDD drive level: {DD_PEAK__Hz:.2f} Hz")
print(f"\tGamma shape: {DD_SHAPE_PARAMETER:.2f} (CV={1 / DD_SHAPE_PARAMETER**0.5:.3f})")
if GFLUCTDV_ENABLED:
    print(f"\tGfluctdv: ENABLED (noise={GFLUCTDV_NOISE_AMPLITUDE:.2e} S/cm²)")
================================================================================
LOADING OPTIMIZED DD PARAMETERS
================================================================================

Loading from BASELINE firing rate optimization...
  ✓ Using dynamic results from: results/dd_optimization/dd_optimized_params.json

(OK) Loaded from: baseline FR optimization
  Source file: dd_optimized_params.json

Optimized DD parameters:
        DD neurons: 379
        Conn probability: 0.841
        Synaptic weight: 0.0500 uS
        DD drive level: 19.43 Hz
        Gamma shape: 3.00 (CV=0.577)

Initialize NEURON and Create Motor Neuron Pool#

Setup NEURON simulator and create the motor neuron population.

load_nmodl_mechanisms()
h.secondorder = 2  # Crank-Nicolson integration

recruitment_thresholds, _ = RecruitmentThresholds(
    N=N_MOTOR_UNITS,
    recruitment_range__ratio=100,
    deluca__slope=5,
    konstantin__max_threshold__ratio=1.0,
    mode="combined",
)

motor_neuron_pool = AlphaMN__Pool(
    recruitment_thresholds__array=recruitment_thresholds,
    config_file="alpha_mn_default.yaml",
)

# Apply Gfluctdv if it was enabled during optimization
if GFLUCTDV_ENABLED and GFLUCTDV_NOISE_AMPLITUDE is not None:
    print("\nApplying Gfluctdv to motor neurons (matching DD optimization)...")
    print(f"\tNoise amplitude: {GFLUCTDV_NOISE_AMPLITUDE:.2e} S/cm²")
    for cell in motor_neuron_pool:
        cell.insert_Gfluctdv()
        for d in cell.dend:
            d.std_e_Gfluctdv = GFLUCTDV_NOISE_AMPLITUDE
            d.std_i_Gfluctdv = GFLUCTDV_NOISE_AMPLITUDE
else:
    print("\nGfluctdv NOT enabled (following DD optimization settings)")

# Create descending drive pool with optimized parameters
descending_drive_pool = DescendingDrive__Pool(
    n=N_DD_NEURONS,
    timestep__ms=TIMESTEP__ms * pq.ms,
    process_type="gamma",
    shape=DD_SHAPE_PARAMETER,
)
Gfluctdv NOT enabled (following DD optimization settings)

Generate Trapezoidal Drive Pattern#

Create a trapezoidal ramp contraction pattern that represents realistic voluntary isometric contractions. This pattern has 4 phases: 1. Ramp-up: Linear increase from baseline to peak 2. Plateau: Sustained peak drive level 3. Ramp-down: Linear decrease from peak to baseline 4. Rest: Baseline activity

This is a common experimental paradigm used in motor control studies.

# Calculate total simulation time
simulation_time = (
    REST_BEFORE__ms
    + RAMP_UP_DURATION__ms
    + PLATEAU_DURATION__ms
    + RAMP_DOWN_DURATION__ms
    + REST_AFTER__ms
)
time_points = int(simulation_time / TIMESTEP__ms)

# Drive parameters
dd_baseline__Hz = 0.0  # Baseline drive during rest
dd_peak__Hz = DD_PEAK__Hz  # Peak drive from optimization

# Calculate phase boundaries
trapezoid_start = REST_BEFORE__ms
ramp_up_end = trapezoid_start + RAMP_UP_DURATION__ms
plateau_end = ramp_up_end + PLATEAU_DURATION__ms
ramp_down_end = plateau_end + RAMP_DOWN_DURATION__ms

# Create time array
time_array = np.linspace(0, simulation_time, time_points)

# Initialize drive signal (all baseline)
trapezoid_drive = np.ones(time_points) * dd_baseline__Hz

for i, t in enumerate(time_array):
    if t < trapezoid_start:
        # Phase 0: Rest before
        trapezoid_drive[i] = dd_baseline__Hz
    elif t < ramp_up_end:
        # Phase 1: Ramp up
        elapsed = t - trapezoid_start
        trapezoid_drive[i] = dd_baseline__Hz + (dd_peak__Hz - dd_baseline__Hz) * (
            elapsed / RAMP_UP_DURATION__ms
        )
    elif t < plateau_end:
        # Phase 2: Plateau
        trapezoid_drive[i] = dd_peak__Hz
    elif t < ramp_down_end:
        # Phase 3: Ramp down
        elapsed = t - plateau_end
        trapezoid_drive[i] = dd_peak__Hz - (dd_peak__Hz - dd_baseline__Hz) * (
            elapsed / RAMP_DOWN_DURATION__ms
        )
    else:
        # Phase 4: Rest after
        trapezoid_drive[i] = dd_baseline__Hz

# Create AnalogSignal for drive pattern
trapezoid_drive__signal = AnalogSignal(
    signal=trapezoid_drive,
    units=pq.Hz,
    sampling_period=(TIMESTEP__ms * pq.ms).rescale(pq.s),
)

joblib.dump(trapezoid_drive__signal, RESULTS_DIR / f"{STUDY_PREFIX}trapezoid_drive_pattern.pkl")
print(f"\nTrapezoidal drive pattern (using optimized DD drive of {dd_peak__Hz:.2f} Hz):")
print(f"\tRest before: 0 - {trapezoid_start} ms ({dd_baseline__Hz} Hz)")
print(f"\tRamp up: {trapezoid_start} - {ramp_up_end} ms ({dd_baseline__Hz}{dd_peak__Hz:.2f} Hz)")
print(
    f"\tPlateau: {ramp_up_end} - {plateau_end} ms ({dd_peak__Hz:.2f} Hz, center at {(ramp_up_end + plateau_end) / 2:.0f}ms)"
)
print(f"\tRamp down: {plateau_end} - {ramp_down_end} ms ({dd_peak__Hz:.2f}{dd_baseline__Hz} Hz)")
print(f"\tRest after: {ramp_down_end} - {simulation_time} ms ({dd_baseline__Hz} Hz)")
print("\nUsing optimized DD parameters:")
print(f"\tGamma shape: {DD_SHAPE_PARAMETER:.2f} (CV={1 / DD_SHAPE_PARAMETER**0.5:.3f})")
print(f"\tConnection probability: {DD_CONNECTION_PROBABILITY:.3f}")
Trapezoidal drive pattern (using optimized DD drive of 19.43 Hz):
        Rest before: 0 - 1000 ms (0.0 Hz)
        Ramp up: 1000 - 2000 ms (0.0 → 19.43 Hz)
        Plateau: 2000 - 4000 ms (19.43 Hz, center at 3000ms)
        Ramp down: 4000 - 5000 ms (19.43 → 0.0 Hz)
        Rest after: 5000 - 6000 ms (0.0 Hz)

Using optimized DD parameters:
        Gamma shape: 3.00 (CV=0.577)
        Connection probability: 0.841

Build Network and Connect Populations#

Create synaptic connections using optimized parameters.

network = Network({"DD": descending_drive_pool, "aMN": motor_neuron_pool})

# Connect DD neurons to motor neurons with optimized synaptic parameters
network.connect(
    source="DD",
    target="aMN",
    probability=DD_CONNECTION_PROBABILITY,
    weight__uS=DD_SYNAPTIC_WEIGHT * pq.uS,
)

# Set up external input to DD population
network.connect_from_external(source="cortical_input", target="DD", weight__uS=1.0 * pq.uS)
# Get NetCons for manual DD stimulation
dd_netcons = network.get_netcons("cortical_input", "DD")

Setup Spike Recording#

To record spikes, we need to manually set up spike detection for the motor neurons and track spike times for the DD neurons.

# Manual spike tracking for DD neurons (they use Poisson processes)
dd_spike_times = [[] for _ in range(len(descending_drive_pool))]

# Record spikes from motor neurons
mn_spike_recorders = []
for cell in motor_neuron_pool:
    spike_recorder = h.Vector()
    nc = h.NetCon(cell.soma(0.5)._ref_v, None, sec=cell.soma)
    nc.threshold = 50  # Standard threshold for motor neurons
    nc.record(spike_recorder)
    mn_spike_recorders.append(spike_recorder)

Run Simulation#

Execute the NEURON simulation with trapezoidal drive pattern.

h.load_file("stdrun.hoc")
h.dt = TIMESTEP__ms
h.tstop = simulation_time

# Initialize voltages for all pools
for section, voltage in itertools.chain.from_iterable(
    zip(*pool.get_initialization_data()) for pool in [motor_neuron_pool, descending_drive_pool]
):
    section.v = voltage


h.finitialize()

step_counter = 0
with tqdm(
    total=simulation_time,
    desc="Running simulation",
    unit="ms",
    bar_format="{l_bar}{bar}| {n:.2f}/{total:.2f} ms [{elapsed}<{remaining}, {rate_fmt}]",
) as pbar:
    while h.t < h.tstop:
        current_drive = trapezoid_drive__signal[min(step_counter, len(trapezoid_drive__signal) - 1)]

        # Drive DD neurons with current input level
        for dd_cell in descending_drive_pool:
            if dd_cell.integrate(current_drive):
                spike_time = h.t + 1
                dd_spike_times[dd_cell.pool__ID].append(spike_time)

                if spike_time < h.tstop:
                    dd_netcons[dd_cell.pool__ID].event(spike_time)

        h.fadvance()
        step_counter += 1
        pbar.update(TIMESTEP__ms)
Running simulation:   0%|          | 0.00/6000.00 ms [00:00<?, ?ms/s]
Running simulation:   0%|          | 13.10/6000.00 ms [00:00<00:45, 130.67ms/s]
Running simulation:   0%|          | 26.20/6000.00 ms [00:00<00:46, 129.41ms/s]
Running simulation:   1%|          | 39.20/6000.00 ms [00:00<00:46, 129.34ms/s]
Running simulation:   1%|          | 52.20/6000.00 ms [00:00<00:45, 129.56ms/s]
Running simulation:   1%|          | 65.30/6000.00 ms [00:00<00:45, 129.89ms/s]
Running simulation:   1%|▏         | 78.30/6000.00 ms [00:00<00:45, 129.87ms/s]
Running simulation:   2%|▏         | 91.30/6000.00 ms [00:00<00:45, 129.80ms/s]
Running simulation:   2%|▏         | 104.30/6000.00 ms [00:00<00:45, 129.75ms/s]
Running simulation:   2%|▏         | 117.40/6000.00 ms [00:00<00:45, 129.85ms/s]
Running simulation:   2%|▏         | 130.40/6000.00 ms [00:01<00:45, 129.70ms/s]
Running simulation:   2%|▏         | 143.40/6000.00 ms [00:01<00:45, 129.65ms/s]
Running simulation:   3%|▎         | 156.40/6000.00 ms [00:01<00:45, 129.63ms/s]
Running simulation:   3%|▎         | 169.40/6000.00 ms [00:01<00:45, 129.46ms/s]
Running simulation:   3%|▎         | 182.40/6000.00 ms [00:01<00:44, 129.57ms/s]
Running simulation:   3%|▎         | 195.40/6000.00 ms [00:01<00:44, 129.56ms/s]
Running simulation:   3%|▎         | 208.40/6000.00 ms [00:01<00:44, 129.54ms/s]
Running simulation:   4%|▎         | 221.40/6000.00 ms [00:01<00:44, 129.56ms/s]
Running simulation:   4%|▍         | 234.50/6000.00 ms [00:01<00:44, 129.76ms/s]
Running simulation:   4%|▍         | 247.50/6000.00 ms [00:01<00:44, 129.72ms/s]
Running simulation:   4%|▍         | 260.60/6000.00 ms [00:02<00:44, 130.00ms/s]
Running simulation:   5%|▍         | 273.70/6000.00 ms [00:02<00:44, 129.98ms/s]
Running simulation:   5%|▍         | 286.70/6000.00 ms [00:02<00:43, 129.93ms/s]
Running simulation:   5%|▍         | 299.80/6000.00 ms [00:02<00:43, 130.05ms/s]
Running simulation:   5%|▌         | 312.90/6000.00 ms [00:02<00:43, 130.24ms/s]
Running simulation:   5%|▌         | 326.00/6000.00 ms [00:02<00:43, 130.41ms/s]
Running simulation:   6%|▌         | 339.10/6000.00 ms [00:02<00:43, 130.20ms/s]
Running simulation:   6%|▌         | 352.20/6000.00 ms [00:02<00:43, 129.92ms/s]
Running simulation:   6%|▌         | 365.20/6000.00 ms [00:02<00:43, 129.77ms/s]
Running simulation:   6%|▋         | 378.20/6000.00 ms [00:02<00:43, 129.84ms/s]
Running simulation:   7%|▋         | 391.30/6000.00 ms [00:03<00:43, 130.08ms/s]
Running simulation:   7%|▋         | 404.40/6000.00 ms [00:03<00:43, 129.92ms/s]
Running simulation:   7%|▋         | 417.40/6000.00 ms [00:03<00:43, 129.67ms/s]
Running simulation:   7%|▋         | 430.40/6000.00 ms [00:03<00:43, 129.42ms/s]
Running simulation:   7%|▋         | 443.50/6000.00 ms [00:03<00:42, 129.61ms/s]
Running simulation:   8%|▊         | 456.50/6000.00 ms [00:03<00:42, 129.53ms/s]
Running simulation:   8%|▊         | 469.50/6000.00 ms [00:03<00:42, 129.58ms/s]
Running simulation:   8%|▊         | 482.60/6000.00 ms [00:03<00:42, 129.90ms/s]
Running simulation:   8%|▊         | 495.60/6000.00 ms [00:03<00:42, 129.85ms/s]
Running simulation:   8%|▊         | 508.60/6000.00 ms [00:03<00:42, 129.83ms/s]
Running simulation:   9%|▊         | 521.60/6000.00 ms [00:04<00:42, 129.83ms/s]
Running simulation:   9%|▉         | 534.60/6000.00 ms [00:04<00:42, 129.62ms/s]
Running simulation:   9%|▉         | 547.60/6000.00 ms [00:04<00:42, 129.35ms/s]
Running simulation:   9%|▉         | 560.60/6000.00 ms [00:04<00:42, 129.39ms/s]
Running simulation:  10%|▉         | 573.60/6000.00 ms [00:04<00:41, 129.27ms/s]
Running simulation:  10%|▉         | 586.60/6000.00 ms [00:04<00:41, 129.42ms/s]
Running simulation:  10%|▉         | 599.60/6000.00 ms [00:04<00:41, 129.54ms/s]
Running simulation:  10%|█         | 612.70/6000.00 ms [00:04<00:41, 129.69ms/s]
Running simulation:  10%|█         | 625.80/6000.00 ms [00:04<00:41, 129.80ms/s]
Running simulation:  11%|█         | 638.80/6000.00 ms [00:04<00:41, 129.83ms/s]
Running simulation:  11%|█         | 651.90/6000.00 ms [00:05<00:41, 130.00ms/s]
Running simulation:  11%|█         | 665.00/6000.00 ms [00:05<00:41, 130.04ms/s]
Running simulation:  11%|█▏        | 678.10/6000.00 ms [00:05<00:40, 129.82ms/s]
Running simulation:  12%|█▏        | 691.10/6000.00 ms [00:05<00:41, 129.23ms/s]
Running simulation:  12%|█▏        | 704.20/6000.00 ms [00:05<00:40, 129.60ms/s]
Running simulation:  12%|█▏        | 717.20/6000.00 ms [00:05<00:40, 129.54ms/s]
Running simulation:  12%|█▏        | 730.20/6000.00 ms [00:05<00:40, 129.38ms/s]
Running simulation:  12%|█▏        | 743.20/6000.00 ms [00:05<00:40, 129.38ms/s]
Running simulation:  13%|█▎        | 756.30/6000.00 ms [00:05<00:40, 129.58ms/s]
Running simulation:  13%|█▎        | 769.30/6000.00 ms [00:05<00:40, 129.59ms/s]
Running simulation:  13%|█▎        | 782.30/6000.00 ms [00:06<00:40, 129.55ms/s]
Running simulation:  13%|█▎        | 795.40/6000.00 ms [00:06<00:40, 129.69ms/s]
Running simulation:  13%|█▎        | 808.40/6000.00 ms [00:06<00:40, 129.45ms/s]
Running simulation:  14%|█▎        | 821.50/6000.00 ms [00:06<00:39, 129.62ms/s]
Running simulation:  14%|█▍        | 834.50/6000.00 ms [00:06<00:39, 129.55ms/s]
Running simulation:  14%|█▍        | 847.50/6000.00 ms [00:06<00:39, 129.57ms/s]
Running simulation:  14%|█▍        | 860.50/6000.00 ms [00:06<00:39, 129.58ms/s]
Running simulation:  15%|█▍        | 873.50/6000.00 ms [00:06<00:39, 129.50ms/s]
Running simulation:  15%|█▍        | 886.50/6000.00 ms [00:06<00:39, 129.40ms/s]
Running simulation:  15%|█▍        | 899.60/6000.00 ms [00:06<00:39, 129.59ms/s]
Running simulation:  15%|█▌        | 912.70/6000.00 ms [00:07<00:39, 129.83ms/s]
Running simulation:  15%|█▌        | 925.70/6000.00 ms [00:07<00:39, 129.79ms/s]
Running simulation:  16%|█▌        | 938.70/6000.00 ms [00:07<00:39, 129.47ms/s]
Running simulation:  16%|█▌        | 951.70/6000.00 ms [00:07<00:38, 129.60ms/s]
Running simulation:  16%|█▌        | 964.80/6000.00 ms [00:07<00:38, 129.80ms/s]
Running simulation:  16%|█▋        | 977.80/6000.00 ms [00:07<00:38, 129.64ms/s]
Running simulation:  17%|█▋        | 990.80/6000.00 ms [00:07<00:38, 129.73ms/s]
Running simulation:  17%|█▋        | 1003.80/6000.00 ms [00:07<00:40, 123.81ms/s]
Running simulation:  17%|█▋        | 1016.30/6000.00 ms [00:07<00:45, 108.87ms/s]
Running simulation:  17%|█▋        | 1027.60/6000.00 ms [00:08<00:49, 100.88ms/s]
Running simulation:  17%|█▋        | 1038.00/6000.00 ms [00:08<00:51, 95.90ms/s]
Running simulation:  17%|█▋        | 1047.90/6000.00 ms [00:08<00:53, 92.48ms/s]
Running simulation:  18%|█▊        | 1057.30/6000.00 ms [00:08<00:54, 90.09ms/s]
Running simulation:  18%|█▊        | 1066.40/6000.00 ms [00:08<00:55, 88.48ms/s]
Running simulation:  18%|█▊        | 1075.30/6000.00 ms [00:08<00:56, 87.22ms/s]
Running simulation:  18%|█▊        | 1084.10/6000.00 ms [00:08<00:56, 86.29ms/s]
Running simulation:  18%|█▊        | 1092.80/6000.00 ms [00:08<00:57, 85.69ms/s]
Running simulation:  18%|█▊        | 1101.40/6000.00 ms [00:08<00:57, 85.39ms/s]
Running simulation:  19%|█▊        | 1110.00/6000.00 ms [00:09<00:57, 85.16ms/s]
Running simulation:  19%|█▊        | 1118.60/6000.00 ms [00:09<00:57, 84.97ms/s]
Running simulation:  19%|█▉        | 1127.10/6000.00 ms [00:09<00:57, 84.72ms/s]
Running simulation:  19%|█▉        | 1135.60/6000.00 ms [00:09<00:57, 84.50ms/s]
Running simulation:  19%|█▉        | 1144.10/6000.00 ms [00:09<00:57, 84.38ms/s]
Running simulation:  19%|█▉        | 1152.60/6000.00 ms [00:09<00:57, 84.46ms/s]
Running simulation:  19%|█▉        | 1161.10/6000.00 ms [00:09<00:57, 84.38ms/s]
Running simulation:  19%|█▉        | 1169.60/6000.00 ms [00:09<00:57, 84.36ms/s]
Running simulation:  20%|█▉        | 1178.10/6000.00 ms [00:09<00:57, 84.39ms/s]
Running simulation:  20%|█▉        | 1186.60/6000.00 ms [00:09<00:57, 84.41ms/s]
Running simulation:  20%|█▉        | 1195.10/6000.00 ms [00:10<00:56, 84.41ms/s]
Running simulation:  20%|██        | 1203.60/6000.00 ms [00:10<00:56, 84.40ms/s]
Running simulation:  20%|██        | 1212.10/6000.00 ms [00:10<00:56, 84.23ms/s]
Running simulation:  20%|██        | 1220.60/6000.00 ms [00:10<00:56, 84.25ms/s]
Running simulation:  20%|██        | 1229.10/6000.00 ms [00:10<00:56, 84.16ms/s]
Running simulation:  21%|██        | 1237.60/6000.00 ms [00:10<00:56, 84.05ms/s]
Running simulation:  21%|██        | 1246.10/6000.00 ms [00:10<00:56, 83.96ms/s]
Running simulation:  21%|██        | 1254.50/6000.00 ms [00:10<00:56, 83.93ms/s]
Running simulation:  21%|██        | 1262.90/6000.00 ms [00:10<00:56, 83.89ms/s]
Running simulation:  21%|██        | 1271.30/6000.00 ms [00:10<00:56, 83.85ms/s]
Running simulation:  21%|██▏       | 1279.70/6000.00 ms [00:11<00:56, 83.87ms/s]
Running simulation:  21%|██▏       | 1288.10/6000.00 ms [00:11<00:56, 83.86ms/s]
Running simulation:  22%|██▏       | 1296.50/6000.00 ms [00:11<00:56, 83.71ms/s]
Running simulation:  22%|██▏       | 1304.90/6000.00 ms [00:11<00:56, 83.67ms/s]
Running simulation:  22%|██▏       | 1313.30/6000.00 ms [00:11<00:56, 83.66ms/s]
Running simulation:  22%|██▏       | 1321.70/6000.00 ms [00:11<00:55, 83.68ms/s]
Running simulation:  22%|██▏       | 1330.10/6000.00 ms [00:11<00:55, 83.61ms/s]
Running simulation:  22%|██▏       | 1338.50/6000.00 ms [00:11<00:55, 83.70ms/s]
Running simulation:  22%|██▏       | 1346.90/6000.00 ms [00:11<00:55, 83.79ms/s]
Running simulation:  23%|██▎       | 1355.40/6000.00 ms [00:11<00:55, 83.86ms/s]
Running simulation:  23%|██▎       | 1363.80/6000.00 ms [00:12<00:55, 83.82ms/s]
Running simulation:  23%|██▎       | 1372.20/6000.00 ms [00:12<00:55, 83.85ms/s]
Running simulation:  23%|██▎       | 1380.60/6000.00 ms [00:12<00:55, 83.63ms/s]
Running simulation:  23%|██▎       | 1389.00/6000.00 ms [00:12<00:55, 83.57ms/s]
Running simulation:  23%|██▎       | 1397.40/6000.00 ms [00:12<00:55, 83.63ms/s]
Running simulation:  23%|██▎       | 1405.80/6000.00 ms [00:12<00:54, 83.59ms/s]
Running simulation:  24%|██▎       | 1414.20/6000.00 ms [00:12<00:54, 83.54ms/s]
Running simulation:  24%|██▎       | 1422.60/6000.00 ms [00:12<00:54, 83.67ms/s]
Running simulation:  24%|██▍       | 1431.00/6000.00 ms [00:12<00:54, 83.66ms/s]
Running simulation:  24%|██▍       | 1439.40/6000.00 ms [00:12<00:54, 83.70ms/s]
Running simulation:  24%|██▍       | 1447.80/6000.00 ms [00:13<00:54, 83.66ms/s]
Running simulation:  24%|██▍       | 1456.20/6000.00 ms [00:13<00:54, 83.66ms/s]
Running simulation:  24%|██▍       | 1464.60/6000.00 ms [00:13<00:54, 83.45ms/s]
Running simulation:  25%|██▍       | 1473.00/6000.00 ms [00:13<00:54, 83.50ms/s]
Running simulation:  25%|██▍       | 1481.40/6000.00 ms [00:13<00:54, 83.44ms/s]
Running simulation:  25%|██▍       | 1489.80/6000.00 ms [00:13<00:54, 83.45ms/s]
Running simulation:  25%|██▍       | 1498.20/6000.00 ms [00:13<00:53, 83.39ms/s]
Running simulation:  25%|██▌       | 1506.60/6000.00 ms [00:13<00:53, 83.43ms/s]
Running simulation:  25%|██▌       | 1515.00/6000.00 ms [00:13<00:53, 83.47ms/s]
Running simulation:  25%|██▌       | 1523.40/6000.00 ms [00:13<00:53, 83.49ms/s]
Running simulation:  26%|██▌       | 1531.80/6000.00 ms [00:14<00:53, 83.48ms/s]
Running simulation:  26%|██▌       | 1540.20/6000.00 ms [00:14<00:53, 83.46ms/s]
Running simulation:  26%|██▌       | 1548.60/6000.00 ms [00:14<00:53, 83.40ms/s]
Running simulation:  26%|██▌       | 1557.00/6000.00 ms [00:14<00:53, 83.47ms/s]
Running simulation:  26%|██▌       | 1565.40/6000.00 ms [00:14<00:53, 83.46ms/s]
Running simulation:  26%|██▌       | 1573.80/6000.00 ms [00:14<00:53, 83.37ms/s]
Running simulation:  26%|██▋       | 1582.20/6000.00 ms [00:14<00:52, 83.41ms/s]
Running simulation:  27%|██▋       | 1590.60/6000.00 ms [00:14<00:52, 83.51ms/s]
Running simulation:  27%|██▋       | 1599.00/6000.00 ms [00:14<00:52, 83.54ms/s]
Running simulation:  27%|██▋       | 1607.40/6000.00 ms [00:14<00:52, 83.58ms/s]
Running simulation:  27%|██▋       | 1615.80/6000.00 ms [00:15<00:52, 83.61ms/s]
Running simulation:  27%|██▋       | 1624.20/6000.00 ms [00:15<00:52, 83.69ms/s]
Running simulation:  27%|██▋       | 1632.60/6000.00 ms [00:15<00:52, 82.90ms/s]
Running simulation:  27%|██▋       | 1641.00/6000.00 ms [00:15<00:52, 83.04ms/s]
Running simulation:  27%|██▋       | 1649.40/6000.00 ms [00:15<00:52, 83.10ms/s]
Running simulation:  28%|██▊       | 1657.80/6000.00 ms [00:15<00:52, 83.16ms/s]
Running simulation:  28%|██▊       | 1666.20/6000.00 ms [00:15<00:52, 83.14ms/s]
Running simulation:  28%|██▊       | 1674.60/6000.00 ms [00:15<00:52, 83.15ms/s]
Running simulation:  28%|██▊       | 1683.00/6000.00 ms [00:15<00:51, 83.06ms/s]
Running simulation:  28%|██▊       | 1691.40/6000.00 ms [00:15<00:51, 83.14ms/s]
Running simulation:  28%|██▊       | 1699.80/6000.00 ms [00:16<00:51, 83.26ms/s]
Running simulation:  28%|██▊       | 1708.20/6000.00 ms [00:16<00:51, 83.24ms/s]
Running simulation:  29%|██▊       | 1716.60/6000.00 ms [00:16<00:51, 83.15ms/s]
Running simulation:  29%|██▊       | 1725.00/6000.00 ms [00:16<00:51, 83.15ms/s]
Running simulation:  29%|██▉       | 1733.40/6000.00 ms [00:16<00:51, 83.10ms/s]
Running simulation:  29%|██▉       | 1741.80/6000.00 ms [00:16<00:51, 83.22ms/s]
Running simulation:  29%|██▉       | 1750.20/6000.00 ms [00:16<00:51, 83.22ms/s]
Running simulation:  29%|██▉       | 1758.60/6000.00 ms [00:16<00:50, 83.37ms/s]
Running simulation:  29%|██▉       | 1767.00/6000.00 ms [00:16<00:50, 83.37ms/s]
Running simulation:  30%|██▉       | 1775.40/6000.00 ms [00:16<00:50, 83.23ms/s]
Running simulation:  30%|██▉       | 1783.80/6000.00 ms [00:17<00:50, 83.14ms/s]
Running simulation:  30%|██▉       | 1792.20/6000.00 ms [00:17<00:50, 83.09ms/s]
Running simulation:  30%|███       | 1800.60/6000.00 ms [00:17<00:50, 82.88ms/s]
Running simulation:  30%|███       | 1809.00/6000.00 ms [00:17<00:50, 82.98ms/s]
Running simulation:  30%|███       | 1817.40/6000.00 ms [00:17<00:50, 83.00ms/s]
Running simulation:  30%|███       | 1825.80/6000.00 ms [00:17<00:50, 82.92ms/s]
Running simulation:  31%|███       | 1834.10/6000.00 ms [00:17<00:50, 82.84ms/s]
Running simulation:  31%|███       | 1842.50/6000.00 ms [00:17<00:50, 82.93ms/s]
Running simulation:  31%|███       | 1850.90/6000.00 ms [00:17<00:49, 83.03ms/s]
Running simulation:  31%|███       | 1859.30/6000.00 ms [00:17<00:49, 83.13ms/s]
Running simulation:  31%|███       | 1867.70/6000.00 ms [00:18<00:49, 83.19ms/s]
Running simulation:  31%|███▏      | 1876.10/6000.00 ms [00:18<00:49, 83.13ms/s]
Running simulation:  31%|███▏      | 1884.50/6000.00 ms [00:18<00:49, 83.03ms/s]
Running simulation:  32%|███▏      | 1892.90/6000.00 ms [00:18<00:49, 83.11ms/s]
Running simulation:  32%|███▏      | 1901.30/6000.00 ms [00:18<00:49, 83.08ms/s]
Running simulation:  32%|███▏      | 1909.70/6000.00 ms [00:18<00:49, 83.07ms/s]
Running simulation:  32%|███▏      | 1918.10/6000.00 ms [00:18<00:49, 83.11ms/s]
Running simulation:  32%|███▏      | 1926.50/6000.00 ms [00:18<00:48, 83.14ms/s]
Running simulation:  32%|███▏      | 1934.90/6000.00 ms [00:18<00:48, 83.17ms/s]
Running simulation:  32%|███▏      | 1943.30/6000.00 ms [00:18<00:48, 83.23ms/s]
Running simulation:  33%|███▎      | 1951.70/6000.00 ms [00:19<00:48, 83.22ms/s]
Running simulation:  33%|███▎      | 1960.10/6000.00 ms [00:19<00:48, 83.24ms/s]
Running simulation:  33%|███▎      | 1968.50/6000.00 ms [00:19<00:48, 83.01ms/s]
Running simulation:  33%|███▎      | 1976.90/6000.00 ms [00:19<00:48, 83.00ms/s]
Running simulation:  33%|███▎      | 1985.30/6000.00 ms [00:19<00:48, 83.12ms/s]
Running simulation:  33%|███▎      | 1993.70/6000.00 ms [00:19<00:48, 83.22ms/s]
Running simulation:  33%|███▎      | 2002.10/6000.00 ms [00:19<00:48, 83.06ms/s]
Running simulation:  34%|███▎      | 2010.50/6000.00 ms [00:19<00:48, 83.00ms/s]
Running simulation:  34%|███▎      | 2018.90/6000.00 ms [00:19<00:48, 82.94ms/s]
Running simulation:  34%|███▍      | 2027.20/6000.00 ms [00:20<00:47, 82.95ms/s]
Running simulation:  34%|███▍      | 2035.60/6000.00 ms [00:20<00:47, 83.00ms/s]
Running simulation:  34%|███▍      | 2044.00/6000.00 ms [00:20<00:47, 83.02ms/s]
Running simulation:  34%|███▍      | 2052.40/6000.00 ms [00:20<00:47, 82.96ms/s]
Running simulation:  34%|███▍      | 2060.70/6000.00 ms [00:20<00:47, 82.90ms/s]
Running simulation:  34%|███▍      | 2069.10/6000.00 ms [00:20<00:47, 83.05ms/s]
Running simulation:  35%|███▍      | 2077.50/6000.00 ms [00:20<00:47, 83.17ms/s]
Running simulation:  35%|███▍      | 2085.90/6000.00 ms [00:20<00:47, 83.20ms/s]
Running simulation:  35%|███▍      | 2094.30/6000.00 ms [00:20<00:46, 83.16ms/s]
Running simulation:  35%|███▌      | 2102.70/6000.00 ms [00:20<00:46, 83.13ms/s]
Running simulation:  35%|███▌      | 2111.10/6000.00 ms [00:21<00:46, 83.18ms/s]
Running simulation:  35%|███▌      | 2119.50/6000.00 ms [00:21<00:46, 83.17ms/s]
Running simulation:  35%|███▌      | 2127.90/6000.00 ms [00:21<00:46, 82.92ms/s]
Running simulation:  36%|███▌      | 2136.20/6000.00 ms [00:21<00:46, 82.88ms/s]
Running simulation:  36%|███▌      | 2144.50/6000.00 ms [00:21<00:46, 82.86ms/s]
Running simulation:  36%|███▌      | 2152.80/6000.00 ms [00:21<00:46, 82.88ms/s]
Running simulation:  36%|███▌      | 2161.20/6000.00 ms [00:21<00:46, 82.93ms/s]
Running simulation:  36%|███▌      | 2169.60/6000.00 ms [00:21<00:46, 83.02ms/s]
Running simulation:  36%|███▋      | 2178.00/6000.00 ms [00:21<00:46, 83.03ms/s]
Running simulation:  36%|███▋      | 2186.40/6000.00 ms [00:21<00:45, 82.98ms/s]
Running simulation:  37%|███▋      | 2194.80/6000.00 ms [00:22<00:45, 83.11ms/s]
Running simulation:  37%|███▋      | 2203.20/6000.00 ms [00:22<00:45, 83.17ms/s]
Running simulation:  37%|███▋      | 2211.60/6000.00 ms [00:22<00:45, 83.12ms/s]
Running simulation:  37%|███▋      | 2220.00/6000.00 ms [00:22<00:45, 83.04ms/s]
Running simulation:  37%|███▋      | 2228.40/6000.00 ms [00:22<00:45, 82.95ms/s]
Running simulation:  37%|███▋      | 2236.80/6000.00 ms [00:22<00:45, 83.03ms/s]
Running simulation:  37%|███▋      | 2245.20/6000.00 ms [00:22<00:45, 83.04ms/s]
Running simulation:  38%|███▊      | 2253.60/6000.00 ms [00:22<00:45, 83.10ms/s]
Running simulation:  38%|███▊      | 2262.00/6000.00 ms [00:22<00:44, 83.10ms/s]
Running simulation:  38%|███▊      | 2270.40/6000.00 ms [00:22<00:44, 83.11ms/s]
Running simulation:  38%|███▊      | 2278.80/6000.00 ms [00:23<00:44, 83.20ms/s]
Running simulation:  38%|███▊      | 2287.20/6000.00 ms [00:23<00:44, 83.27ms/s]
Running simulation:  38%|███▊      | 2295.60/6000.00 ms [00:23<00:44, 83.00ms/s]
Running simulation:  38%|███▊      | 2303.90/6000.00 ms [00:23<00:44, 82.98ms/s]
Running simulation:  39%|███▊      | 2312.30/6000.00 ms [00:23<00:44, 83.00ms/s]
Running simulation:  39%|███▊      | 2320.70/6000.00 ms [00:23<00:44, 83.04ms/s]
Running simulation:  39%|███▉      | 2329.10/6000.00 ms [00:23<00:44, 82.96ms/s]
Running simulation:  39%|███▉      | 2337.50/6000.00 ms [00:23<00:44, 83.03ms/s]
Running simulation:  39%|███▉      | 2345.90/6000.00 ms [00:23<00:44, 82.99ms/s]
Running simulation:  39%|███▉      | 2354.20/6000.00 ms [00:23<00:43, 82.94ms/s]
Running simulation:  39%|███▉      | 2362.50/6000.00 ms [00:24<00:43, 82.89ms/s]
Running simulation:  40%|███▉      | 2370.80/6000.00 ms [00:24<00:43, 82.90ms/s]
Running simulation:  40%|███▉      | 2379.10/6000.00 ms [00:24<00:43, 82.70ms/s]
Running simulation:  40%|███▉      | 2387.50/6000.00 ms [00:24<00:43, 82.88ms/s]
Running simulation:  40%|███▉      | 2395.90/6000.00 ms [00:24<00:43, 82.94ms/s]
Running simulation:  40%|████      | 2404.30/6000.00 ms [00:24<00:43, 83.05ms/s]
Running simulation:  40%|████      | 2412.70/6000.00 ms [00:24<00:43, 83.09ms/s]
Running simulation:  40%|████      | 2421.10/6000.00 ms [00:24<00:43, 82.98ms/s]
Running simulation:  40%|████      | 2429.50/6000.00 ms [00:24<00:42, 83.09ms/s]
Running simulation:  41%|████      | 2437.90/6000.00 ms [00:24<00:42, 83.15ms/s]
Running simulation:  41%|████      | 2446.30/6000.00 ms [00:25<00:42, 83.17ms/s]
Running simulation:  41%|████      | 2454.70/6000.00 ms [00:25<00:42, 83.17ms/s]
Running simulation:  41%|████      | 2463.10/6000.00 ms [00:25<00:42, 82.32ms/s]
Running simulation:  41%|████      | 2471.40/6000.00 ms [00:25<00:42, 82.49ms/s]
Running simulation:  41%|████▏     | 2479.70/6000.00 ms [00:25<00:42, 82.64ms/s]
Running simulation:  41%|████▏     | 2488.00/6000.00 ms [00:25<00:42, 82.71ms/s]
Running simulation:  42%|████▏     | 2496.30/6000.00 ms [00:25<00:42, 82.74ms/s]
Running simulation:  42%|████▏     | 2504.70/6000.00 ms [00:25<00:42, 82.86ms/s]
Running simulation:  42%|████▏     | 2513.10/6000.00 ms [00:25<00:42, 82.91ms/s]
Running simulation:  42%|████▏     | 2521.40/6000.00 ms [00:25<00:41, 82.84ms/s]
Running simulation:  42%|████▏     | 2529.70/6000.00 ms [00:26<00:41, 82.83ms/s]
Running simulation:  42%|████▏     | 2538.10/6000.00 ms [00:26<00:41, 82.97ms/s]
Running simulation:  42%|████▏     | 2546.40/6000.00 ms [00:26<00:41, 82.94ms/s]
Running simulation:  43%|████▎     | 2554.80/6000.00 ms [00:26<00:41, 82.96ms/s]
Running simulation:  43%|████▎     | 2563.20/6000.00 ms [00:26<00:41, 83.06ms/s]
Running simulation:  43%|████▎     | 2571.60/6000.00 ms [00:26<00:41, 82.96ms/s]
Running simulation:  43%|████▎     | 2579.90/6000.00 ms [00:26<00:42, 81.37ms/s]
Running simulation:  43%|████▎     | 2588.30/6000.00 ms [00:26<00:41, 81.86ms/s]
Running simulation:  43%|████▎     | 2596.60/6000.00 ms [00:26<00:41, 82.16ms/s]
Running simulation:  43%|████▎     | 2604.90/6000.00 ms [00:26<00:41, 82.25ms/s]
Running simulation:  44%|████▎     | 2613.20/6000.00 ms [00:27<00:41, 82.39ms/s]
Running simulation:  44%|████▎     | 2621.50/6000.00 ms [00:27<00:40, 82.44ms/s]
Running simulation:  44%|████▍     | 2629.80/6000.00 ms [00:27<00:40, 82.43ms/s]
Running simulation:  44%|████▍     | 2638.10/6000.00 ms [00:27<00:40, 82.49ms/s]
Running simulation:  44%|████▍     | 2646.40/6000.00 ms [00:27<00:40, 82.53ms/s]
Running simulation:  44%|████▍     | 2654.70/6000.00 ms [00:27<00:40, 82.54ms/s]
Running simulation:  44%|████▍     | 2663.00/6000.00 ms [00:27<00:40, 82.58ms/s]
Running simulation:  45%|████▍     | 2671.30/6000.00 ms [00:27<00:40, 82.61ms/s]
Running simulation:  45%|████▍     | 2679.60/6000.00 ms [00:27<00:40, 82.70ms/s]
Running simulation:  45%|████▍     | 2688.00/6000.00 ms [00:27<00:39, 82.87ms/s]
Running simulation:  45%|████▍     | 2696.40/6000.00 ms [00:28<00:39, 82.98ms/s]
Running simulation:  45%|████▌     | 2704.70/6000.00 ms [00:28<00:39, 82.96ms/s]
Running simulation:  45%|████▌     | 2713.00/6000.00 ms [00:28<00:39, 82.95ms/s]
Running simulation:  45%|████▌     | 2721.30/6000.00 ms [00:28<00:39, 82.91ms/s]
Running simulation:  45%|████▌     | 2729.60/6000.00 ms [00:28<00:39, 82.76ms/s]
Running simulation:  46%|████▌     | 2737.90/6000.00 ms [00:28<00:39, 82.83ms/s]
Running simulation:  46%|████▌     | 2746.20/6000.00 ms [00:28<00:39, 82.83ms/s]
Running simulation:  46%|████▌     | 2754.50/6000.00 ms [00:28<00:39, 82.84ms/s]
Running simulation:  46%|████▌     | 2762.80/6000.00 ms [00:28<00:39, 82.74ms/s]
Running simulation:  46%|████▌     | 2771.10/6000.00 ms [00:28<00:39, 82.77ms/s]
Running simulation:  46%|████▋     | 2779.50/6000.00 ms [00:29<00:38, 82.88ms/s]
Running simulation:  46%|████▋     | 2787.80/6000.00 ms [00:29<00:38, 82.89ms/s]
Running simulation:  47%|████▋     | 2796.10/6000.00 ms [00:29<00:38, 82.89ms/s]
Running simulation:  47%|████▋     | 2804.50/6000.00 ms [00:29<00:38, 82.96ms/s]
Running simulation:  47%|████▋     | 2812.80/6000.00 ms [00:29<00:38, 82.94ms/s]
Running simulation:  47%|████▋     | 2821.10/6000.00 ms [00:29<00:38, 82.94ms/s]
Running simulation:  47%|████▋     | 2829.40/6000.00 ms [00:29<00:38, 82.94ms/s]
Running simulation:  47%|████▋     | 2837.80/6000.00 ms [00:29<00:38, 83.05ms/s]
Running simulation:  47%|████▋     | 2846.20/6000.00 ms [00:29<00:37, 83.04ms/s]
Running simulation:  48%|████▊     | 2854.60/6000.00 ms [00:29<00:37, 83.15ms/s]
Running simulation:  48%|████▊     | 2863.00/6000.00 ms [00:30<00:37, 83.06ms/s]
Running simulation:  48%|████▊     | 2871.40/6000.00 ms [00:30<00:37, 83.10ms/s]
Running simulation:  48%|████▊     | 2879.80/6000.00 ms [00:30<00:37, 83.06ms/s]
Running simulation:  48%|████▊     | 2888.20/6000.00 ms [00:30<00:37, 83.05ms/s]
Running simulation:  48%|████▊     | 2896.60/6000.00 ms [00:30<00:37, 83.08ms/s]
Running simulation:  48%|████▊     | 2905.00/6000.00 ms [00:30<00:37, 82.62ms/s]
Running simulation:  49%|████▊     | 2913.30/6000.00 ms [00:30<00:37, 82.67ms/s]
Running simulation:  49%|████▊     | 2921.70/6000.00 ms [00:30<00:37, 82.80ms/s]
Running simulation:  49%|████▉     | 2930.10/6000.00 ms [00:30<00:37, 82.90ms/s]
Running simulation:  49%|████▉     | 2938.40/6000.00 ms [00:31<00:36, 82.87ms/s]
Running simulation:  49%|████▉     | 2946.70/6000.00 ms [00:31<00:36, 82.88ms/s]
Running simulation:  49%|████▉     | 2955.00/6000.00 ms [00:31<00:36, 82.89ms/s]
Running simulation:  49%|████▉     | 2963.30/6000.00 ms [00:31<00:36, 82.67ms/s]
Running simulation:  50%|████▉     | 2971.60/6000.00 ms [00:31<00:36, 82.67ms/s]
Running simulation:  50%|████▉     | 2980.00/6000.00 ms [00:31<00:36, 82.81ms/s]
Running simulation:  50%|████▉     | 2988.30/6000.00 ms [00:31<00:36, 82.86ms/s]
Running simulation:  50%|████▉     | 2996.60/6000.00 ms [00:31<00:36, 82.84ms/s]
Running simulation:  50%|█████     | 3004.90/6000.00 ms [00:31<00:36, 82.88ms/s]
Running simulation:  50%|█████     | 3013.30/6000.00 ms [00:31<00:35, 82.98ms/s]
Running simulation:  50%|█████     | 3021.70/6000.00 ms [00:32<00:35, 83.01ms/s]
Running simulation:  51%|█████     | 3030.10/6000.00 ms [00:32<00:35, 82.98ms/s]
Running simulation:  51%|█████     | 3038.50/6000.00 ms [00:32<00:35, 82.99ms/s]
Running simulation:  51%|█████     | 3046.80/6000.00 ms [00:32<00:35, 82.87ms/s]
Running simulation:  51%|█████     | 3055.20/6000.00 ms [00:32<00:35, 82.97ms/s]
Running simulation:  51%|█████     | 3063.60/6000.00 ms [00:32<00:35, 83.00ms/s]
Running simulation:  51%|█████     | 3072.00/6000.00 ms [00:32<00:35, 83.04ms/s]
Running simulation:  51%|█████▏    | 3080.40/6000.00 ms [00:32<00:35, 82.87ms/s]
Running simulation:  51%|█████▏    | 3088.70/6000.00 ms [00:32<00:35, 82.85ms/s]
Running simulation:  52%|█████▏    | 3097.10/6000.00 ms [00:32<00:35, 82.94ms/s]
Running simulation:  52%|█████▏    | 3105.40/6000.00 ms [00:33<00:34, 82.90ms/s]
Running simulation:  52%|█████▏    | 3113.70/6000.00 ms [00:33<00:34, 82.83ms/s]
Running simulation:  52%|█████▏    | 3122.00/6000.00 ms [00:33<00:34, 82.69ms/s]
Running simulation:  52%|█████▏    | 3130.30/6000.00 ms [00:33<00:34, 82.76ms/s]
Running simulation:  52%|█████▏    | 3138.70/6000.00 ms [00:33<00:34, 82.91ms/s]
Running simulation:  52%|█████▏    | 3147.10/6000.00 ms [00:33<00:34, 82.98ms/s]
Running simulation:  53%|█████▎    | 3155.40/6000.00 ms [00:33<00:34, 82.69ms/s]
Running simulation:  53%|█████▎    | 3163.70/6000.00 ms [00:33<00:34, 82.68ms/s]
Running simulation:  53%|█████▎    | 3172.00/6000.00 ms [00:33<00:34, 82.71ms/s]
Running simulation:  53%|█████▎    | 3180.30/6000.00 ms [00:33<00:34, 82.75ms/s]
Running simulation:  53%|█████▎    | 3188.60/6000.00 ms [00:34<00:33, 82.81ms/s]
Running simulation:  53%|█████▎    | 3196.90/6000.00 ms [00:34<00:33, 82.83ms/s]
Running simulation:  53%|█████▎    | 3205.20/6000.00 ms [00:34<00:33, 82.83ms/s]
Running simulation:  54%|█████▎    | 3213.50/6000.00 ms [00:34<00:33, 82.82ms/s]
Running simulation:  54%|█████▎    | 3221.80/6000.00 ms [00:34<00:33, 82.85ms/s]
Running simulation:  54%|█████▍    | 3230.10/6000.00 ms [00:34<00:33, 82.73ms/s]
Running simulation:  54%|█████▍    | 3238.40/6000.00 ms [00:34<00:33, 82.65ms/s]
Running simulation:  54%|█████▍    | 3246.70/6000.00 ms [00:34<00:33, 82.71ms/s]
Running simulation:  54%|█████▍    | 3255.00/6000.00 ms [00:34<00:33, 82.73ms/s]
Running simulation:  54%|█████▍    | 3263.30/6000.00 ms [00:34<00:33, 82.71ms/s]
Running simulation:  55%|█████▍    | 3271.60/6000.00 ms [00:35<00:32, 82.75ms/s]
Running simulation:  55%|█████▍    | 3280.00/6000.00 ms [00:35<00:32, 82.83ms/s]
Running simulation:  55%|█████▍    | 3288.40/6000.00 ms [00:35<00:32, 82.89ms/s]
Running simulation:  55%|█████▍    | 3296.70/6000.00 ms [00:35<00:32, 82.17ms/s]
Running simulation:  55%|█████▌    | 3305.10/6000.00 ms [00:35<00:32, 82.45ms/s]
Running simulation:  55%|█████▌    | 3313.50/6000.00 ms [00:35<00:32, 82.73ms/s]
Running simulation:  55%|█████▌    | 3321.90/6000.00 ms [00:35<00:32, 82.85ms/s]
Running simulation:  56%|█████▌    | 3330.20/6000.00 ms [00:35<00:32, 82.85ms/s]
Running simulation:  56%|█████▌    | 3338.60/6000.00 ms [00:35<00:32, 83.04ms/s]
Running simulation:  56%|█████▌    | 3347.00/6000.00 ms [00:35<00:31, 82.96ms/s]
Running simulation:  56%|█████▌    | 3355.40/6000.00 ms [00:36<00:31, 83.11ms/s]
Running simulation:  56%|█████▌    | 3363.80/6000.00 ms [00:36<00:31, 83.18ms/s]
Running simulation:  56%|█████▌    | 3372.20/6000.00 ms [00:36<00:31, 83.02ms/s]
Running simulation:  56%|█████▋    | 3380.60/6000.00 ms [00:36<00:31, 83.05ms/s]
Running simulation:  56%|█████▋    | 3389.00/6000.00 ms [00:36<00:31, 82.89ms/s]
Running simulation:  57%|█████▋    | 3397.30/6000.00 ms [00:36<00:31, 82.90ms/s]
Running simulation:  57%|█████▋    | 3405.60/6000.00 ms [00:36<00:31, 82.89ms/s]
Running simulation:  57%|█████▋    | 3414.00/6000.00 ms [00:36<00:31, 82.93ms/s]
Running simulation:  57%|█████▋    | 3422.40/6000.00 ms [00:36<00:31, 83.07ms/s]
Running simulation:  57%|█████▋    | 3430.80/6000.00 ms [00:36<00:30, 83.01ms/s]
Running simulation:  57%|█████▋    | 3439.20/6000.00 ms [00:37<00:30, 82.98ms/s]
Running simulation:  57%|█████▋    | 3447.60/6000.00 ms [00:37<00:30, 83.08ms/s]
Running simulation:  58%|█████▊    | 3456.00/6000.00 ms [00:37<00:30, 82.89ms/s]
Running simulation:  58%|█████▊    | 3464.40/6000.00 ms [00:37<00:30, 82.93ms/s]
Running simulation:  58%|█████▊    | 3472.70/6000.00 ms [00:37<00:30, 82.94ms/s]
Running simulation:  58%|█████▊    | 3481.10/6000.00 ms [00:37<00:30, 83.10ms/s]
Running simulation:  58%|█████▊    | 3489.50/6000.00 ms [00:37<00:30, 83.13ms/s]
Running simulation:  58%|█████▊    | 3497.90/6000.00 ms [00:37<00:30, 83.16ms/s]
Running simulation:  58%|█████▊    | 3506.30/6000.00 ms [00:37<00:30, 83.08ms/s]
Running simulation:  59%|█████▊    | 3514.70/6000.00 ms [00:37<00:29, 83.00ms/s]
Running simulation:  59%|█████▊    | 3523.10/6000.00 ms [00:38<00:29, 83.12ms/s]
Running simulation:  59%|█████▉    | 3531.50/6000.00 ms [00:38<00:29, 83.09ms/s]
Running simulation:  59%|█████▉    | 3539.90/6000.00 ms [00:38<00:29, 82.87ms/s]
Running simulation:  59%|█████▉    | 3548.20/6000.00 ms [00:38<00:29, 82.91ms/s]
Running simulation:  59%|█████▉    | 3556.50/6000.00 ms [00:38<00:29, 82.92ms/s]
Running simulation:  59%|█████▉    | 3564.80/6000.00 ms [00:38<00:29, 82.83ms/s]
Running simulation:  60%|█████▉    | 3573.10/6000.00 ms [00:38<00:29, 82.87ms/s]
Running simulation:  60%|█████▉    | 3581.50/6000.00 ms [00:38<00:29, 82.99ms/s]
Running simulation:  60%|█████▉    | 3589.80/6000.00 ms [00:38<00:29, 82.97ms/s]
Running simulation:  60%|█████▉    | 3598.10/6000.00 ms [00:38<00:28, 82.91ms/s]
Running simulation:  60%|██████    | 3606.50/6000.00 ms [00:39<00:28, 82.95ms/s]
Running simulation:  60%|██████    | 3614.80/6000.00 ms [00:39<00:28, 82.93ms/s]
Running simulation:  60%|██████    | 3623.10/6000.00 ms [00:39<00:28, 82.83ms/s]
Running simulation:  61%|██████    | 3631.40/6000.00 ms [00:39<00:28, 82.81ms/s]
Running simulation:  61%|██████    | 3639.80/6000.00 ms [00:39<00:28, 82.91ms/s]
Running simulation:  61%|██████    | 3648.20/6000.00 ms [00:39<00:28, 83.07ms/s]
Running simulation:  61%|██████    | 3656.60/6000.00 ms [00:39<00:28, 82.98ms/s]
Running simulation:  61%|██████    | 3665.00/6000.00 ms [00:39<00:28, 83.08ms/s]
Running simulation:  61%|██████    | 3673.40/6000.00 ms [00:39<00:27, 83.13ms/s]
Running simulation:  61%|██████▏   | 3681.80/6000.00 ms [00:39<00:27, 83.09ms/s]
Running simulation:  62%|██████▏   | 3690.20/6000.00 ms [00:40<00:27, 83.05ms/s]
Running simulation:  62%|██████▏   | 3698.60/6000.00 ms [00:40<00:27, 83.06ms/s]
Running simulation:  62%|██████▏   | 3707.00/6000.00 ms [00:40<00:27, 82.89ms/s]
Running simulation:  62%|██████▏   | 3715.40/6000.00 ms [00:40<00:27, 82.94ms/s]
Running simulation:  62%|██████▏   | 3723.70/6000.00 ms [00:40<00:27, 82.75ms/s]
Running simulation:  62%|██████▏   | 3732.10/6000.00 ms [00:40<00:27, 82.86ms/s]
Running simulation:  62%|██████▏   | 3740.40/6000.00 ms [00:40<00:27, 82.86ms/s]
Running simulation:  62%|██████▏   | 3748.70/6000.00 ms [00:40<00:27, 82.89ms/s]
Running simulation:  63%|██████▎   | 3757.00/6000.00 ms [00:40<00:27, 82.52ms/s]
Running simulation:  63%|██████▎   | 3765.30/6000.00 ms [00:40<00:27, 82.63ms/s]
Running simulation:  63%|██████▎   | 3773.60/6000.00 ms [00:41<00:26, 82.46ms/s]
Running simulation:  63%|██████▎   | 3782.00/6000.00 ms [00:41<00:26, 82.64ms/s]
Running simulation:  63%|██████▎   | 3790.30/6000.00 ms [00:41<00:26, 82.65ms/s]
Running simulation:  63%|██████▎   | 3798.60/6000.00 ms [00:41<00:26, 82.73ms/s]
Running simulation:  63%|██████▎   | 3807.00/6000.00 ms [00:41<00:26, 82.90ms/s]
Running simulation:  64%|██████▎   | 3815.30/6000.00 ms [00:41<00:26, 82.86ms/s]
Running simulation:  64%|██████▎   | 3823.60/6000.00 ms [00:41<00:26, 82.76ms/s]
Running simulation:  64%|██████▍   | 3831.90/6000.00 ms [00:41<00:26, 82.77ms/s]
Running simulation:  64%|██████▍   | 3840.20/6000.00 ms [00:41<00:26, 82.75ms/s]
Running simulation:  64%|██████▍   | 3848.50/6000.00 ms [00:41<00:26, 82.65ms/s]
Running simulation:  64%|██████▍   | 3856.80/6000.00 ms [00:42<00:25, 82.71ms/s]
Running simulation:  64%|██████▍   | 3865.10/6000.00 ms [00:42<00:25, 82.67ms/s]
Running simulation:  65%|██████▍   | 3873.40/6000.00 ms [00:42<00:25, 82.62ms/s]
Running simulation:  65%|██████▍   | 3881.80/6000.00 ms [00:42<00:25, 82.79ms/s]
Running simulation:  65%|██████▍   | 3890.20/6000.00 ms [00:42<00:25, 82.92ms/s]
Running simulation:  65%|██████▍   | 3898.50/6000.00 ms [00:42<00:25, 82.89ms/s]
Running simulation:  65%|██████▌   | 3906.90/6000.00 ms [00:42<00:25, 83.07ms/s]
Running simulation:  65%|██████▌   | 3915.30/6000.00 ms [00:42<00:25, 83.14ms/s]
Running simulation:  65%|██████▌   | 3923.70/6000.00 ms [00:42<00:24, 83.15ms/s]
Running simulation:  66%|██████▌   | 3932.10/6000.00 ms [00:42<00:24, 83.09ms/s]
Running simulation:  66%|██████▌   | 3940.50/6000.00 ms [00:43<00:24, 83.10ms/s]
Running simulation:  66%|██████▌   | 3948.90/6000.00 ms [00:43<00:24, 82.99ms/s]
Running simulation:  66%|██████▌   | 3957.20/6000.00 ms [00:43<00:24, 82.93ms/s]
Running simulation:  66%|██████▌   | 3965.50/6000.00 ms [00:43<00:24, 82.88ms/s]
Running simulation:  66%|██████▌   | 3973.80/6000.00 ms [00:43<00:24, 82.84ms/s]
Running simulation:  66%|██████▋   | 3982.10/6000.00 ms [00:43<00:24, 82.78ms/s]
Running simulation:  67%|██████▋   | 3990.50/6000.00 ms [00:43<00:24, 82.86ms/s]
Running simulation:  67%|██████▋   | 3998.90/6000.00 ms [00:43<00:24, 82.91ms/s]
Running simulation:  67%|██████▋   | 4007.20/6000.00 ms [00:43<00:24, 82.89ms/s]
Running simulation:  67%|██████▋   | 4015.60/6000.00 ms [00:43<00:23, 82.98ms/s]
Running simulation:  67%|██████▋   | 4023.90/6000.00 ms [00:44<00:23, 82.93ms/s]
Running simulation:  67%|██████▋   | 4032.30/6000.00 ms [00:44<00:23, 83.00ms/s]
Running simulation:  67%|██████▋   | 4040.60/6000.00 ms [00:44<00:23, 82.78ms/s]
Running simulation:  67%|██████▋   | 4049.00/6000.00 ms [00:44<00:23, 82.95ms/s]
Running simulation:  68%|██████▊   | 4057.30/6000.00 ms [00:44<00:23, 82.89ms/s]
Running simulation:  68%|██████▊   | 4065.60/6000.00 ms [00:44<00:23, 82.89ms/s]
Running simulation:  68%|██████▊   | 4073.90/6000.00 ms [00:44<00:23, 82.88ms/s]
Running simulation:  68%|██████▊   | 4082.20/6000.00 ms [00:44<00:23, 82.89ms/s]
Running simulation:  68%|██████▊   | 4090.60/6000.00 ms [00:44<00:23, 82.93ms/s]
Running simulation:  68%|██████▊   | 4099.00/6000.00 ms [00:45<00:22, 83.11ms/s]
Running simulation:  68%|██████▊   | 4107.40/6000.00 ms [00:45<00:22, 83.10ms/s]
Running simulation:  69%|██████▊   | 4115.80/6000.00 ms [00:45<00:22, 83.12ms/s]
Running simulation:  69%|██████▊   | 4124.20/6000.00 ms [00:45<00:22, 82.72ms/s]
Running simulation:  69%|██████▉   | 4132.60/6000.00 ms [00:45<00:22, 82.89ms/s]
Running simulation:  69%|██████▉   | 4141.00/6000.00 ms [00:45<00:22, 83.03ms/s]
Running simulation:  69%|██████▉   | 4149.40/6000.00 ms [00:45<00:22, 83.15ms/s]
Running simulation:  69%|██████▉   | 4157.80/6000.00 ms [00:45<00:22, 83.25ms/s]
Running simulation:  69%|██████▉   | 4166.20/6000.00 ms [00:45<00:22, 83.25ms/s]
Running simulation:  70%|██████▉   | 4174.60/6000.00 ms [00:45<00:21, 83.28ms/s]
Running simulation:  70%|██████▉   | 4183.00/6000.00 ms [00:46<00:21, 83.30ms/s]
Running simulation:  70%|██████▉   | 4191.40/6000.00 ms [00:46<00:21, 83.41ms/s]
Running simulation:  70%|██████▉   | 4199.80/6000.00 ms [00:46<00:21, 83.43ms/s]
Running simulation:  70%|███████   | 4208.20/6000.00 ms [00:46<00:21, 83.29ms/s]
Running simulation:  70%|███████   | 4216.60/6000.00 ms [00:46<00:21, 83.28ms/s]
Running simulation:  70%|███████   | 4225.00/6000.00 ms [00:46<00:21, 83.14ms/s]
Running simulation:  71%|███████   | 4233.40/6000.00 ms [00:46<00:21, 83.24ms/s]
Running simulation:  71%|███████   | 4241.80/6000.00 ms [00:46<00:21, 83.33ms/s]
Running simulation:  71%|███████   | 4250.20/6000.00 ms [00:46<00:20, 83.39ms/s]
Running simulation:  71%|███████   | 4258.60/6000.00 ms [00:46<00:20, 83.43ms/s]
Running simulation:  71%|███████   | 4267.00/6000.00 ms [00:47<00:20, 83.53ms/s]
Running simulation:  71%|███████▏  | 4275.40/6000.00 ms [00:47<00:20, 83.57ms/s]
Running simulation:  71%|███████▏  | 4283.80/6000.00 ms [00:47<00:20, 83.59ms/s]
Running simulation:  72%|███████▏  | 4292.20/6000.00 ms [00:47<00:20, 83.52ms/s]
Running simulation:  72%|███████▏  | 4300.60/6000.00 ms [00:47<00:20, 83.47ms/s]
Running simulation:  72%|███████▏  | 4309.00/6000.00 ms [00:47<00:20, 83.43ms/s]
Running simulation:  72%|███████▏  | 4317.40/6000.00 ms [00:47<00:20, 83.42ms/s]
Running simulation:  72%|███████▏  | 4325.80/6000.00 ms [00:47<00:20, 83.38ms/s]
Running simulation:  72%|███████▏  | 4334.20/6000.00 ms [00:47<00:19, 83.46ms/s]
Running simulation:  72%|███████▏  | 4342.60/6000.00 ms [00:47<00:19, 83.40ms/s]
Running simulation:  73%|███████▎  | 4351.00/6000.00 ms [00:48<00:19, 83.48ms/s]
Running simulation:  73%|███████▎  | 4359.40/6000.00 ms [00:48<00:19, 83.38ms/s]
Running simulation:  73%|███████▎  | 4367.80/6000.00 ms [00:48<00:19, 83.28ms/s]
Running simulation:  73%|███████▎  | 4376.20/6000.00 ms [00:48<00:19, 83.36ms/s]
Running simulation:  73%|███████▎  | 4384.60/6000.00 ms [00:48<00:19, 83.30ms/s]
Running simulation:  73%|███████▎  | 4393.00/6000.00 ms [00:48<00:19, 83.21ms/s]
Running simulation:  73%|███████▎  | 4401.40/6000.00 ms [00:48<00:19, 83.37ms/s]
Running simulation:  73%|███████▎  | 4409.80/6000.00 ms [00:48<00:19, 83.43ms/s]
Running simulation:  74%|███████▎  | 4418.20/6000.00 ms [00:48<00:18, 83.48ms/s]
Running simulation:  74%|███████▍  | 4426.60/6000.00 ms [00:48<00:18, 83.54ms/s]
Running simulation:  74%|███████▍  | 4435.00/6000.00 ms [00:49<00:18, 83.53ms/s]
Running simulation:  74%|███████▍  | 4443.40/6000.00 ms [00:49<00:18, 83.55ms/s]
Running simulation:  74%|███████▍  | 4451.80/6000.00 ms [00:49<00:18, 83.48ms/s]
Running simulation:  74%|███████▍  | 4460.20/6000.00 ms [00:49<00:18, 83.57ms/s]
Running simulation:  74%|███████▍  | 4468.60/6000.00 ms [00:49<00:18, 83.61ms/s]
Running simulation:  75%|███████▍  | 4477.00/6000.00 ms [00:49<00:18, 83.52ms/s]
Running simulation:  75%|███████▍  | 4485.40/6000.00 ms [00:49<00:18, 83.60ms/s]
Running simulation:  75%|███████▍  | 4493.80/6000.00 ms [00:49<00:18, 83.53ms/s]
Running simulation:  75%|███████▌  | 4502.20/6000.00 ms [00:49<00:17, 83.52ms/s]
Running simulation:  75%|███████▌  | 4510.60/6000.00 ms [00:49<00:17, 83.56ms/s]
Running simulation:  75%|███████▌  | 4519.00/6000.00 ms [00:50<00:17, 83.47ms/s]
Running simulation:  75%|███████▌  | 4527.40/6000.00 ms [00:50<00:17, 83.56ms/s]
Running simulation:  76%|███████▌  | 4535.80/6000.00 ms [00:50<00:17, 83.43ms/s]
Running simulation:  76%|███████▌  | 4544.20/6000.00 ms [00:50<00:17, 83.55ms/s]
Running simulation:  76%|███████▌  | 4552.60/6000.00 ms [00:50<00:17, 83.47ms/s]
Running simulation:  76%|███████▌  | 4561.00/6000.00 ms [00:50<00:17, 83.49ms/s]
Running simulation:  76%|███████▌  | 4569.40/6000.00 ms [00:50<00:17, 83.54ms/s]
Running simulation:  76%|███████▋  | 4577.80/6000.00 ms [00:50<00:17, 83.52ms/s]
Running simulation:  76%|███████▋  | 4586.20/6000.00 ms [00:50<00:16, 83.53ms/s]
Running simulation:  77%|███████▋  | 4594.60/6000.00 ms [00:50<00:16, 83.52ms/s]
Running simulation:  77%|███████▋  | 4603.00/6000.00 ms [00:51<00:16, 83.51ms/s]
Running simulation:  77%|███████▋  | 4611.40/6000.00 ms [00:51<00:16, 83.50ms/s]
Running simulation:  77%|███████▋  | 4619.80/6000.00 ms [00:51<00:16, 83.41ms/s]
Running simulation:  77%|███████▋  | 4628.20/6000.00 ms [00:51<00:16, 83.53ms/s]
Running simulation:  77%|███████▋  | 4636.60/6000.00 ms [00:51<00:16, 83.62ms/s]
Running simulation:  77%|███████▋  | 4645.00/6000.00 ms [00:51<00:16, 83.57ms/s]
Running simulation:  78%|███████▊  | 4653.40/6000.00 ms [00:51<00:16, 83.55ms/s]
Running simulation:  78%|███████▊  | 4661.80/6000.00 ms [00:51<00:16, 83.50ms/s]
Running simulation:  78%|███████▊  | 4670.20/6000.00 ms [00:51<00:15, 83.54ms/s]
Running simulation:  78%|███████▊  | 4678.60/6000.00 ms [00:51<00:15, 83.58ms/s]
Running simulation:  78%|███████▊  | 4687.00/6000.00 ms [00:52<00:15, 83.64ms/s]
Running simulation:  78%|███████▊  | 4695.40/6000.00 ms [00:52<00:15, 83.74ms/s]
Running simulation:  78%|███████▊  | 4703.80/6000.00 ms [00:52<00:15, 83.72ms/s]
Running simulation:  79%|███████▊  | 4712.20/6000.00 ms [00:52<00:15, 83.80ms/s]
Running simulation:  79%|███████▊  | 4720.60/6000.00 ms [00:52<00:15, 83.81ms/s]
Running simulation:  79%|███████▉  | 4729.00/6000.00 ms [00:52<00:15, 83.80ms/s]
Running simulation:  79%|███████▉  | 4737.40/6000.00 ms [00:52<00:15, 83.84ms/s]
Running simulation:  79%|███████▉  | 4745.80/6000.00 ms [00:52<00:14, 83.80ms/s]
Running simulation:  79%|███████▉  | 4754.30/6000.00 ms [00:52<00:14, 83.88ms/s]
Running simulation:  79%|███████▉  | 4762.70/6000.00 ms [00:52<00:14, 83.91ms/s]
Running simulation:  80%|███████▉  | 4771.10/6000.00 ms [00:53<00:14, 83.88ms/s]
Running simulation:  80%|███████▉  | 4779.60/6000.00 ms [00:53<00:14, 83.99ms/s]
Running simulation:  80%|███████▉  | 4788.00/6000.00 ms [00:53<00:14, 83.59ms/s]
Running simulation:  80%|███████▉  | 4796.40/6000.00 ms [00:53<00:14, 83.55ms/s]
Running simulation:  80%|████████  | 4804.80/6000.00 ms [00:53<00:14, 83.62ms/s]
Running simulation:  80%|████████  | 4813.20/6000.00 ms [00:53<00:14, 83.69ms/s]
Running simulation:  80%|████████  | 4821.60/6000.00 ms [00:53<00:14, 83.76ms/s]
Running simulation:  81%|████████  | 4830.00/6000.00 ms [00:53<00:13, 83.83ms/s]
Running simulation:  81%|████████  | 4838.50/6000.00 ms [00:53<00:13, 83.90ms/s]
Running simulation:  81%|████████  | 4847.00/6000.00 ms [00:53<00:13, 84.03ms/s]
Running simulation:  81%|████████  | 4855.50/6000.00 ms [00:54<00:13, 84.09ms/s]
Running simulation:  81%|████████  | 4864.00/6000.00 ms [00:54<00:13, 84.06ms/s]
Running simulation:  81%|████████  | 4872.50/6000.00 ms [00:54<00:13, 83.91ms/s]
Running simulation:  81%|████████▏ | 4881.00/6000.00 ms [00:54<00:13, 84.06ms/s]
Running simulation:  81%|████████▏ | 4889.50/6000.00 ms [00:54<00:13, 84.22ms/s]
Running simulation:  82%|████████▏ | 4898.00/6000.00 ms [00:54<00:13, 84.34ms/s]
Running simulation:  82%|████████▏ | 4906.50/6000.00 ms [00:54<00:12, 84.33ms/s]
Running simulation:  82%|████████▏ | 4915.00/6000.00 ms [00:54<00:12, 84.28ms/s]
Running simulation:  82%|████████▏ | 4923.50/6000.00 ms [00:54<00:12, 84.28ms/s]
Running simulation:  82%|████████▏ | 4932.00/6000.00 ms [00:54<00:12, 84.41ms/s]
Running simulation:  82%|████████▏ | 4940.50/6000.00 ms [00:55<00:12, 84.41ms/s]
Running simulation:  82%|████████▏ | 4949.00/6000.00 ms [00:55<00:12, 84.40ms/s]
Running simulation:  83%|████████▎ | 4957.50/6000.00 ms [00:55<00:12, 84.02ms/s]
Running simulation:  83%|████████▎ | 4966.00/6000.00 ms [00:55<00:12, 84.06ms/s]
Running simulation:  83%|████████▎ | 4974.50/6000.00 ms [00:55<00:12, 84.23ms/s]
Running simulation:  83%|████████▎ | 4983.00/6000.00 ms [00:55<00:12, 84.37ms/s]
Running simulation:  83%|████████▎ | 4991.50/6000.00 ms [00:55<00:11, 84.38ms/s]
Running simulation:  83%|████████▎ | 5000.00/6000.00 ms [00:55<00:11, 84.49ms/s]
Running simulation:  84%|████████▎ | 5013.10/6000.00 ms [00:55<00:10, 98.27ms/s]
Running simulation:  84%|████████▍ | 5026.20/6000.00 ms [00:55<00:09, 107.83ms/s]
Running simulation:  84%|████████▍ | 5039.20/6000.00 ms [00:56<00:08, 114.30ms/s]
Running simulation:  84%|████████▍ | 5052.20/6000.00 ms [00:56<00:07, 118.97ms/s]
Running simulation:  84%|████████▍ | 5065.20/6000.00 ms [00:56<00:07, 122.11ms/s]
Running simulation:  85%|████████▍ | 5078.30/6000.00 ms [00:56<00:07, 124.59ms/s]
Running simulation:  85%|████████▍ | 5091.40/6000.00 ms [00:56<00:07, 126.42ms/s]
Running simulation:  85%|████████▌ | 5104.40/6000.00 ms [00:56<00:07, 127.33ms/s]
Running simulation:  85%|████████▌ | 5117.50/6000.00 ms [00:56<00:06, 128.33ms/s]
Running simulation:  86%|████████▌ | 5130.60/6000.00 ms [00:56<00:06, 129.01ms/s]
Running simulation:  86%|████████▌ | 5143.60/6000.00 ms [00:56<00:06, 129.15ms/s]
Running simulation:  86%|████████▌ | 5156.60/6000.00 ms [00:56<00:06, 129.37ms/s]
Running simulation:  86%|████████▌ | 5169.60/6000.00 ms [00:57<00:06, 129.41ms/s]
Running simulation:  86%|████████▋ | 5182.60/6000.00 ms [00:57<00:06, 129.35ms/s]
Running simulation:  87%|████████▋ | 5195.60/6000.00 ms [00:57<00:06, 128.93ms/s]
Running simulation:  87%|████████▋ | 5208.50/6000.00 ms [00:57<00:06, 128.01ms/s]
Running simulation:  87%|████████▋ | 5221.40/6000.00 ms [00:57<00:06, 128.30ms/s]
Running simulation:  87%|████████▋ | 5234.40/6000.00 ms [00:57<00:05, 128.53ms/s]
Running simulation:  87%|████████▋ | 5247.30/6000.00 ms [00:57<00:05, 128.51ms/s]
Running simulation:  88%|████████▊ | 5260.30/6000.00 ms [00:57<00:05, 128.66ms/s]
Running simulation:  88%|████████▊ | 5273.20/6000.00 ms [00:57<00:05, 128.52ms/s]
Running simulation:  88%|████████▊ | 5286.20/6000.00 ms [00:57<00:05, 128.79ms/s]
Running simulation:  88%|████████▊ | 5299.20/6000.00 ms [00:58<00:05, 128.91ms/s]
Running simulation:  89%|████████▊ | 5312.10/6000.00 ms [00:58<00:05, 128.62ms/s]
Running simulation:  89%|████████▉ | 5325.00/6000.00 ms [00:58<00:05, 128.64ms/s]
Running simulation:  89%|████████▉ | 5337.90/6000.00 ms [00:58<00:05, 128.63ms/s]
Running simulation:  89%|████████▉ | 5350.80/6000.00 ms [00:58<00:05, 128.52ms/s]
Running simulation:  89%|████████▉ | 5363.70/6000.00 ms [00:58<00:04, 128.51ms/s]
Running simulation:  90%|████████▉ | 5376.70/6000.00 ms [00:58<00:04, 128.76ms/s]
Running simulation:  90%|████████▉ | 5389.70/6000.00 ms [00:58<00:04, 128.87ms/s]
Running simulation:  90%|█████████ | 5402.70/6000.00 ms [00:58<00:04, 129.03ms/s]
Running simulation:  90%|█████████ | 5415.70/6000.00 ms [00:58<00:04, 129.07ms/s]
Running simulation:  90%|█████████ | 5428.70/6000.00 ms [00:59<00:04, 128.73ms/s]
Running simulation:  91%|█████████ | 5441.60/6000.00 ms [00:59<00:04, 128.74ms/s]
Running simulation:  91%|█████████ | 5454.50/6000.00 ms [00:59<00:04, 128.56ms/s]
Running simulation:  91%|█████████ | 5467.40/6000.00 ms [00:59<00:04, 128.61ms/s]
Running simulation:  91%|█████████▏| 5480.40/6000.00 ms [00:59<00:04, 128.82ms/s]
Running simulation:  92%|█████████▏| 5493.30/6000.00 ms [00:59<00:03, 128.71ms/s]
Running simulation:  92%|█████████▏| 5506.20/6000.00 ms [00:59<00:03, 128.60ms/s]
Running simulation:  92%|█████████▏| 5519.10/6000.00 ms [00:59<00:03, 128.52ms/s]
Running simulation:  92%|█████████▏| 5532.00/6000.00 ms [00:59<00:03, 128.52ms/s]
Running simulation:  92%|█████████▏| 5545.00/6000.00 ms [00:59<00:03, 128.87ms/s]
Running simulation:  93%|█████████▎| 5558.00/6000.00 ms [01:00<00:03, 129.04ms/s]
Running simulation:  93%|█████████▎| 5571.00/6000.00 ms [01:00<00:03, 129.06ms/s]
Running simulation:  93%|█████████▎| 5584.00/6000.00 ms [01:00<00:03, 128.71ms/s]
Running simulation:  93%|█████████▎| 5596.90/6000.00 ms [01:00<00:03, 128.76ms/s]
Running simulation:  93%|█████████▎| 5609.90/6000.00 ms [01:00<00:03, 128.94ms/s]
Running simulation:  94%|█████████▎| 5622.90/6000.00 ms [01:00<00:02, 129.01ms/s]
Running simulation:  94%|█████████▍| 5635.90/6000.00 ms [01:00<00:02, 129.08ms/s]
Running simulation:  94%|█████████▍| 5648.90/6000.00 ms [01:00<00:02, 129.09ms/s]
Running simulation:  94%|█████████▍| 5661.90/6000.00 ms [01:00<00:02, 128.85ms/s]
Running simulation:  95%|█████████▍| 5674.80/6000.00 ms [01:01<00:02, 128.62ms/s]
Running simulation:  95%|█████████▍| 5687.80/6000.00 ms [01:01<00:02, 128.79ms/s]
Running simulation:  95%|█████████▌| 5700.80/6000.00 ms [01:01<00:02, 128.96ms/s]
Running simulation:  95%|█████████▌| 5713.70/6000.00 ms [01:01<00:02, 128.81ms/s]
Running simulation:  95%|█████████▌| 5726.60/6000.00 ms [01:01<00:02, 128.68ms/s]
Running simulation:  96%|█████████▌| 5739.50/6000.00 ms [01:01<00:02, 128.57ms/s]
Running simulation:  96%|█████████▌| 5752.40/6000.00 ms [01:01<00:01, 128.43ms/s]
Running simulation:  96%|█████████▌| 5765.30/6000.00 ms [01:01<00:01, 128.48ms/s]
Running simulation:  96%|█████████▋| 5778.20/6000.00 ms [01:01<00:01, 128.58ms/s]
Running simulation:  97%|█████████▋| 5791.10/6000.00 ms [01:01<00:01, 128.64ms/s]
Running simulation:  97%|█████████▋| 5804.00/6000.00 ms [01:02<00:01, 128.63ms/s]
Running simulation:  97%|█████████▋| 5816.90/6000.00 ms [01:02<00:01, 128.50ms/s]
Running simulation:  97%|█████████▋| 5829.80/6000.00 ms [01:02<00:01, 128.62ms/s]
Running simulation:  97%|█████████▋| 5842.70/6000.00 ms [01:02<00:01, 128.68ms/s]
Running simulation:  98%|█████████▊| 5855.60/6000.00 ms [01:02<00:01, 128.76ms/s]
Running simulation:  98%|█████████▊| 5868.50/6000.00 ms [01:02<00:01, 128.60ms/s]
Running simulation:  98%|█████████▊| 5881.40/6000.00 ms [01:02<00:00, 128.60ms/s]
Running simulation:  98%|█████████▊| 5894.30/6000.00 ms [01:02<00:00, 128.58ms/s]
Running simulation:  98%|█████████▊| 5907.30/6000.00 ms [01:02<00:00, 128.76ms/s]
Running simulation:  99%|█████████▊| 5920.30/6000.00 ms [01:02<00:00, 128.91ms/s]
Running simulation:  99%|█████████▉| 5933.20/6000.00 ms [01:03<00:00, 128.89ms/s]
Running simulation:  99%|█████████▉| 5946.20/6000.00 ms [01:03<00:00, 129.05ms/s]
Running simulation:  99%|█████████▉| 5959.20/6000.00 ms [01:03<00:00, 128.93ms/s]
Running simulation: 100%|█████████▉| 5972.20/6000.00 ms [01:03<00:00, 129.01ms/s]
Running simulation: 100%|█████████▉| 5985.20/6000.00 ms [01:03<00:00, 129.11ms/s]
Running simulation: 100%|█████████▉| 5998.20/6000.00 ms [01:03<00:00, 128.66ms/s]
Running simulation: 100%|██████████| 6000.00/6000.00 ms [01:03<00:00, 94.44ms/s]

Convert Spike Data to Neo Format#

Process recorded spike times into Neo data structures.

spike_train_block = Block(name="Trapezoidal Contraction Spike Trains")

dd_segment = Segment(name="Descending Drive")
dd_segment.spiketrains = [
    SpikeTrain(
        (spike_times * pq.ms).rescale(pq.s),
        t_stop=(simulation_time * pq.ms).rescale(pq.s),
        sampling_rate=(1 / (h.dt * pq.ms)).rescale(pq.Hz),
        sampling_period=(h.dt * pq.ms).rescale(pq.s),
        name=f"DD_{i}",
    )
    for i, spike_times in enumerate(dd_spike_times)
]

mn_segment = Segment(name="Motor Neurons")
mn_segment.spiketrains = [
    SpikeTrain(
        (recorder.as_numpy() * pq.ms).rescale(pq.s),
        t_stop=(simulation_time * pq.ms).rescale(pq.s),
        sampling_rate=(1 / (h.dt * pq.ms)).rescale(pq.Hz),
        sampling_period=(h.dt * pq.ms).rescale(pq.s),
        name=f"MN_{i}",
    )
    for i, recorder in enumerate(mn_spike_recorders)
]

# Save motor neuron spike trains
spike_train_block.segments.append(mn_segment)

joblib.dump(spike_train_block, RESULTS_DIR / f"{STUDY_PREFIX}trapezoidal_spike_trains.pkl")
['/home/runner/work/MyoGen/MyoGen/results/TEST_trapezoidal_spike_trains.pkl']

Calculate Firing Rate Statistics#

print("\nFiring rate analysis:")

# Calculate DD firing rates
dd_firing_rates = np.array(
    [
        elephant.statistics.mean_firing_rate(st__s.time_slice(st__s.min(), st__s.max()))
        for st__s in dd_segment.spiketrains
        if len(st__s) > 0
    ]
)

# Calculate MN firing rates
mn_firing_rates = np.array(
    [
        elephant.statistics.mean_firing_rate(st__s.time_slice(st__s.min(), st__s.max()))
        for st__s in mn_segment.spiketrains
        if len(st__s) > 0
    ]
)

print("Descending Drive neurons:")
print(f"\tActive neurons: {len(dd_firing_rates)}/{descending_drive_pool.n}")
if len(dd_firing_rates) > 0:
    print(f"\tMean firing rate: {np.mean(dd_firing_rates):.1f} ± {np.std(dd_firing_rates):.1f} Hz")
    print(f"\tRate range: {np.min(dd_firing_rates):.1f} - {np.max(dd_firing_rates):.1f} Hz")

print("Motor neurons:")
print(f"\tActive neurons: {len(mn_firing_rates)}/{motor_neuron_pool.n}")
if len(mn_firing_rates) > 0:
    print(f"\tMean firing rate: {np.mean(mn_firing_rates):.1f} ± {np.std(mn_firing_rates):.1f} Hz")
    print(f"\tRate range: {np.min(mn_firing_rates):.1f} - {np.max(mn_firing_rates):.1f} Hz")
Firing rate analysis:
Descending Drive neurons:
        Active neurons: 379/379
        Mean firing rate: 16.8 ± 1.3 Hz
        Rate range: 12.9 - 20.1 Hz
Motor neurons:
        Active neurons: 60/100
        Mean firing rate: inf ± nan Hz
        Rate range: 1.7 - inf Hz

Calculate and Save ISI/CV Statistics#

Calculate ISI and CV for each motor unit and save to CSV file

# Calculate ISI/CV statistics for motor neurons
print("\nCalculating ISI and CV statistics...")
print(f"\tAnalyzing only plateau phase: {ramp_up_end:.1f} - {plateau_end:.1f} ms")
isi_cv_df = calculate_firing_rate_statistics(
    mn_segment.spiketrains,
    plateau_start_ms=ramp_up_end,
    plateau_end_ms=plateau_end,
    return_per_neuron=True,
    min_spikes_for_cv=3,
)

# Save ISI/CV statistics to CSV
output_file = RESULTS_DIR / f"{STUDY_PREFIX}isi_cv_data_{MUSCLE_TYPE}_{MVC_LEVEL}.csv"
isi_cv_df.to_csv(output_file, index=False)

print(f"\nSaved ISI/CV data to: {output_file}")
print(f"\tTotal motor units analyzed: {len(isi_cv_df)}")
if len(isi_cv_df) > 0:
    print(f"\tMean firing rate: {isi_cv_df['mean_firing_rate_Hz'].mean():.2f} Hz")
    print(f"\tMean CV: {isi_cv_df['CV_ISI'].mean():.3f}")
Calculating ISI and CV statistics...
        Analyzing only plateau phase: 2000.0 - 4000.0 ms

Saved ISI/CV data to: /home/runner/work/MyoGen/MyoGen/results/TEST_isi_cv_data_TEST_30.csv
        Total motor units analyzed: 58
        Mean firing rate: 10.46 Hz
        Mean CV: 0.157

Visualize Drive Pattern and Spike Trains#

Create verification plots showing drive input and resulting neural activity.

print("\nCreating verification plots...")

colors = plt.rcParams["axes.prop_cycle"].by_key()["color"]

# Create figure with 2 subplots
fig, axes = plt.subplots(2, 1, figsize=(14, 10), sharex=True)

# 1. Drive pattern
time_s = trapezoid_drive__signal.times.rescale(pq.s).magnitude
axes[0].plot(time_s, trapezoid_drive__signal, linewidth=2, label="DD Input")
axes[0].axhline(dd_baseline__Hz, linestyle="--", alpha=0.7, label="Baseline")
axes[0].set_ylabel("Drive (Hz)")
axes[0].set_title(
    f"Trapezoidal Drive Pattern (Optimized DD: {DD_PEAK__Hz:.1f} Hz, "
    f"Gamma shape: {DD_SHAPE_PARAMETER:.2f})"
)
axes[0].legend(framealpha=1.0, edgecolor="none")
axes[0].grid(True, alpha=0.3)

# 2. Motor neuron raster plot (recruitment ordered)
mn_colors = plt.cm.get_cmap("Reds")(np.linspace(0.3, 0.9, len(mn_segment.spiketrains)))
active_mn_count = 0
for i, (spiketrain, color) in enumerate(zip(mn_segment.spiketrains, mn_colors)):
    if len(spiketrain) > 0:
        spike_times = spiketrain.rescale(pq.s).magnitude
        axes[1].scatter(spike_times, [i] * len(spike_times), c=[color], s=1.0, alpha=0.8)
        active_mn_count += 1

axes[1].set_xlabel("Time (s)")
axes[1].set_ylabel("Motor Neuron ID\n(Recruitment Order)")
axes[1].set_title(f"Motor Neuron Activity (n={active_mn_count}/{motor_neuron_pool.n} active)")
axes[1].set_ylim(-1, motor_neuron_pool.n)
axes[1].grid(True, alpha=0.3)

# Format all axes
for ax in axes:
    ax.set_xlim(0, simulation_time / 1000.0)

plt.tight_layout()
plt.savefig(
    RESULTS_DIR / f"{STUDY_PREFIX}simulation_verification_{MUSCLE_TYPE}_{MVC_LEVEL}.png",
    dpi=150,
    bbox_inches="tight",
)
plt.show()
Trapezoidal Drive Pattern (Optimized DD: 19.4 Hz, Gamma shape: 3.00), Motor Neuron Activity (n=60/100 active)
Creating verification plots...

Individual Motor Neuron Discharge Rates#

Compute smoothed instantaneous firing rates for each motor neuron using a Hanning window (similar to 01_simulate_spike_trains_descending_drive.py)

print("\nComputing smoothed discharge rates per neuron...")

# Smoothing parameters
window_ms = 400  # 400 ms Hanning window
dt_s = TIMESTEP__ms / 1000.0  # simulation timestep in seconds
window_samples = int(window_ms / 1000.0 / dt_s)

# Hanning window normalized to preserve rate
hanning_window = np.hanning(window_samples)
hanning_window = hanning_window / (hanning_window.sum() * dt_s)  # convert to Hz

mn_instantaneous_rates = []
active_neuron_ids = []

for i, spiketrain in enumerate(mn_segment.spiketrains):
    if len(spiketrain) > 2:
        # Convert spike times to a binary spike train
        t = np.arange(0, simulation_time / 1000.0, dt_s)
        spikes = np.zeros_like(t)
        spike_indices = np.searchsorted(t, spiketrain.rescale(pq.s).magnitude)
        spikes[spike_indices[spike_indices < len(t)]] = 1

        # Convolve with Hanning window
        rate = np.convolve(spikes, hanning_window, mode="same")
        mn_instantaneous_rates.append(rate)
        active_neuron_ids.append(i)

print(f"\tComputed rates for {len(active_neuron_ids)} active motor neurons")

# Create figure for discharge rate visualizations
fig2, axes2 = plt.subplots(2, 1, figsize=(15, 10), sharex=True)

# 1. Heatmap of instantaneous firing rates
if len(mn_instantaneous_rates) > 0:
    # Stack rates into 2D array (neurons x time)
    rates_array = np.array(mn_instantaneous_rates)
    time_points_arr = np.linspace(0, simulation_time / 1000.0, rates_array.shape[1])

    # Plot heatmap
    im = axes2[0].imshow(
        rates_array,
        aspect="auto",
        cmap="hot",
        interpolation="bilinear",
        extent=[0, simulation_time / 1000.0, 0, len(active_neuron_ids)],
        origin="lower",
        vmin=0,
        vmax=np.percentile(rates_array, 95),  # Cap at 95th percentile
    )

    axes2[0].set_ylabel("Motor Neuron ID\n(Recruitment Order)")
    axes2[0].set_title(
        f"Individual Motor Neuron Discharge Rates - {MUSCLE_TYPE} @ {MVC_LEVEL}% MVC\n"
        f"(Smoothed with {window_ms}ms Hanning Window)"
    )
    # Add colorbar
    cbar = plt.colorbar(im, ax=axes2[0])
    cbar.set_label("Firing Rate (Hz)")
    axes2[0].grid(False)

    # 2. Individual traces (show all active neurons)
    n_to_plot = len(active_neuron_ids)

    # Use colormap for lines (gradient showing recruitment order)
    colors = plt.cm.get_cmap("rainbow")(np.linspace(0, 1, n_to_plot))

    for neuron_idx in range(n_to_plot):
        axes2[1].plot(
            time_points_arr,
            mn_instantaneous_rates[neuron_idx],
            linewidth=0.8,
            color=colors[neuron_idx],
            label=f"MN {active_neuron_ids[neuron_idx]}" if n_to_plot <= 20 else None,
        )

    axes2[1].set_xlabel("Time (s)")
    axes2[1].set_ylabel("Firing Rate (Hz)")
    axes2[1].set_title(f"All Motor Neuron Discharge Rates (n={n_to_plot})")

    # Only show legend if there are few neurons
    if n_to_plot <= 20:
        axes2[1].legend(loc="upper right", ncol=3, framealpha=1.0, edgecolor="none")

    axes2[1].grid(True, alpha=0.3)
    axes2[1].set_xlim(0, simulation_time / 1000.0)
    axes2[1].set_ylim(0, np.max(rates_array) * 1.1)

plt.tight_layout()
discharge_plot_path = RESULTS_DIR / f"{STUDY_PREFIX}discharge_rates_{MUSCLE_TYPE}_{MVC_LEVEL}.png"
plt.savefig(discharge_plot_path, dpi=150, bbox_inches="tight")
plt.show()

print(f"\nSaved discharge rate plot to: {discharge_plot_path}")
Individual Motor Neuron Discharge Rates - TEST @ 30% MVC (Smoothed with 400ms Hanning Window), All Motor Neuron Discharge Rates (n=58)
Computing smoothed discharge rates per neuron...
        Computed rates for 58 active motor neurons

Saved discharge rate plot to: /home/runner/work/MyoGen/MyoGen/results/TEST_discharge_rates_TEST_30.png

Total running time of the script: (1 minutes 14.994 seconds)

Gallery generated by Sphinx-Gallery