"""
Afferent neuron populations for proprioceptive feedback.
This module contains population classes for different types of afferent neurons
that provide sensory feedback from muscle spindles and Golgi tendon organs.
"""
import numpy as np
from myogen.simulator.neuron import cells
from myogen.utils.decorators import beartowertype
from myogen.utils.types import Quantity__m_per_s, Quantity__mm, Quantity__ms, Quantity__m
import quantities as pq
from .base import _Pool
[docs]
@beartowertype
class AffIa__Pool(_Pool):
"""
Container for a population of afferent Ia neurons.
Manages a collection of AffIa (type Ia afferent) cells that provide
proprioceptive feedback from muscle spindles to spinal circuits.
Parameters
----------
n : int
Number of type Ia afferent neurons to create.
recruitment_thresholds : tuple[float, float]
Min and max recruitment thresholds (Hz).
axon_velocities__m_per_s : tuple[Quantity__m_per_s, Quantity__m_per_s]
Min and max axon conduction velocities (m/s).
axon_length__m : Quantity__m
Length of the axon (m).
poisson_batch_size : int
Batch size for exponential threshold generation algorithm.
timestep__ms : Quantity__ms
Time step for simulation (ms).
init_order : int
Initial order parameter for afferent initialization.
"""
[docs]
def __init__(
self,
n: int,
timestep__ms: Quantity__ms,
recruitment_thresholds: tuple[float, float] = (0, 40),
axon_velocities__m_per_s: tuple[Quantity__m_per_s, Quantity__m_per_s] = (
61 * pq.m / pq.s,
75 * pq.m / pq.s,
),
axon_length__m: Quantity__m = 0.6 * pq.m,
poisson_batch_size: int = 145, # Shape param for Gamma process: CV = 1/sqrt(145) = 8.3%
init_order: int = 0,
):
self.n = n
self.recruitment_thresholds = recruitment_thresholds
self.axon_velocities = axon_velocities__m_per_s
self.axon_length = axon_length__m
self.poisson_batch_size = poisson_batch_size
self.timestep__ms = timestep__ms
self.init_order = init_order
rt = np.linspace(*recruitment_thresholds, n)
vcon = np.linspace(*axon_velocities__m_per_s, n)
_cells = []
for i, (rt_i, vcon_i) in enumerate(zip(rt, vcon)):
ia = cells.AffIa(
RT=rt_i,
N=poisson_batch_size,
timestep__ms=timestep__ms,
initN=init_order,
pool__ID=i,
)
ia.create_axon(length__m=axon_length__m, conduction_velocity__m_per_s=vcon_i)
_cells.append(ia)
super().__init__(cells=_cells)
[docs]
@beartowertype
class AffII__Pool(_Pool):
"""
Container for a population of afferent II neurons.
Manages a collection of AffII (type II afferent) cells that provide
secondary proprioceptive feedback from muscle spindles to spinal circuits.
Parameters
----------
n : int
Number of type II afferent neurons to create.
recruitment_thresholds : tuple[float, float]
Min and max recruitment thresholds (Hz).
axon_velocities__m_per_s : tuple[Quantity__m_per_s, Quantity__m_per_s]
Min and max axon conduction velocities (m/s).
axon_length__m : Quantity__m
Length of the axon (m).
poisson_batch_size : int
Batch size for exponential threshold generation algorithm.
timestep__ms : Quantity__ms
Time step for simulation (ms).
init_order : int
Initial order parameter for afferent initialization.
"""
[docs]
def __init__(
self,
n: int,
timestep__ms: Quantity__ms,
recruitment_thresholds: tuple[float, float] = (0, 40),
axon_velocities__m_per_s: tuple[Quantity__m_per_s, Quantity__m_per_s] = (
30 * pq.m / pq.s,
50 * pq.m / pq.s,
),
axon_length__m: Quantity__m = 0.6 * pq.m,
poisson_batch_size: int = 772, # Shape param for Gamma process: CV = 1/sqrt(772) = 3.6%
init_order: int = 0,
):
self.n = n
self.recruitment_thresholds = recruitment_thresholds
self.axon_velocities = axon_velocities__m_per_s
self.axon_length = axon_length__m
self.poisson_batch_size = poisson_batch_size
self.timestep__ms = timestep__ms
self.init_order = init_order
rt = np.linspace(*recruitment_thresholds, n)
vcon = np.linspace(*axon_velocities__m_per_s, n)
_cells = []
for i, (rt_i, vcon_i) in enumerate(zip(rt, vcon)):
ii = cells.AffII(
RT=rt_i,
N=poisson_batch_size,
timestep__ms=timestep__ms,
initN=init_order,
pool__ID=i,
)
ii.create_axon(length__m=axon_length__m, conduction_velocity__m_per_s=vcon_i)
_cells.append(ii)
super().__init__(cells=_cells)
[docs]
@beartowertype
class AffIb__Pool(_Pool):
"""
Container for a population of afferent Ib neurons.
Manages a collection of AffIb (type Ib afferent) cells that provide
primary proprioceptive feedback from Golgi tendon organs to spinal circuits.
Parameters
----------
n : int
Number of type Ib afferent neurons to create.
recruitment_thresholds : tuple[float, float]
Min and max recruitment thresholds (Hz).
axon_velocities : tuple[float, float]
Min and max axon conduction velocities (m/s).
axon_length : float
Length of the axon (mm).
poisson_batch_size : int
Batch size for exponential threshold generation algorithm.
timestep__ms : float
Time step for simulation (ms).
init_order : int
Initial order parameter for afferent initialization.
"""
[docs]
def __init__(
self,
n: int,
timestep__ms: Quantity__ms,
recruitment_thresholds: tuple[float, float] = (0, 40),
axon_velocities__m_per_s: tuple[Quantity__m_per_s, Quantity__m_per_s] = (
64 * pq.m / pq.s,
72 * pq.m / pq.s,
),
axon_length__mm: Quantity__mm = 0.6 * pq.mm,
poisson_batch_size: int = 145, # Shape param for Gamma process: CV = 1/sqrt(145) = 8.3%
init_order: int = 0,
):
self.n = n
self.recruitment_thresholds = recruitment_thresholds
self.axon_velocities = axon_velocities__m_per_s
self.axon_length = axon_length__mm
self.poisson_batch_size = poisson_batch_size
self.timestep__ms = timestep__ms
self.init_order = init_order
rt = np.linspace(*recruitment_thresholds, n)
vcon = np.linspace(*axon_velocities__m_per_s, n)
_cells = []
for i, (rt_i, vcon_i) in enumerate(zip(rt, vcon)):
ib = cells.AffIb(
RT=rt_i,
N=poisson_batch_size,
timestep__ms=timestep__ms,
initN=init_order,
pool__ID=i,
)
ib.create_axon(length__m=axon_length__mm.rescale(pq.m), conduction_velocity__m_per_s=vcon_i)
_cells.append(ib)
super().__init__(cells=_cells)