"""
Interneuron populations for spinal circuit processing.
This module contains population classes for different types of interneurons
that provide inhibitory and excitatory connections within spinal circuits.
"""
from typing import Optional, Union
import numpy as np
from myogen.simulator.neuron import cells
from myogen.utils.decorators import beartowertype
from .base import _get_interneuron_diameter_range__um, _Pool
[docs]
@beartowertype
class GII__Pool(_Pool):
"""
Container for a population of group II interneurons.
Manages a collection of INgII (group II interneuron) cells that provide
inhibitory feedback in spinal circuits, processing type II afferent input.
Parameters
----------
n : int
Number of group II interneurons to create.
soma_length_range__um : tuple[float, float]
Min and max soma length (um). By default, it is set to the estimated range for interneurons from Bui et al. 2003 [1]_.
soma_diameter_range : tuple[float, float]
Min and max soma diameter (um). By default, it is set to the estimated range for interneurons from Bui et al. 2003 [1]_.
passive_conductance_range : tuple[float, float]
Min and max passive membrane conductance (S/cm²).
na3rp_conductance_range : tuple[float, float]
Min and max Na3RP sodium channel conductance (S/cm²).
kdrrl_conductance_range : tuple[float, float]
Min and max KDRRL potassium channel conductance (S/cm²).
mahp_ca_conductance_range : tuple[float, float]
Min and max mAHP calcium conductance (S/cm²).
mahp_k_conductance_range : tuple[float, float]
Min and max mAHP potassium conductance (S/cm²).
mahp_tau_range : tuple[float, float]
Min and max mAHP time constant (ms).
gh_conductance_range : tuple[float, float]
Min and max h-current conductance (S/cm²).
axon_velocities : tuple[float, float]
Min and max axon conduction velocities (m/s).
axon_length : float
Length of the axon (mm).
cell_index : int, optional
Specific cell index to create (creates only one cell), by default None.
References
----------
.. [1] Bui, T.V., Cushing, S., Dewey, D., Fyffe, R.E., Rose, P.K., 2003. Comparison of the Morphological and Electrotonic Properties of Renshaw Cells, Ia Inhibitory Interneurons, and Motoneurons in the Cat. Journal of Neurophysiology 90, 2900–2918. https://doi.org/10.1152/jn.00533.2003
"""
[docs]
def __init__(
self,
n: int,
soma_length_range__um: tuple[float, float] = _get_interneuron_diameter_range__um(),
soma_diameter_range: tuple[float, float] = _get_interneuron_diameter_range__um(),
passive_conductance_range: tuple[float, float] = (3e-5, 7e-5),
na3rp_conductance_range: tuple[float, float] = (0.003, 0.01),
kdrrl_conductance_range: tuple[float, float] = (0.015, 0.015),
mahp_ca_conductance_range: tuple[float, float] = (3e-6, 3e-6),
mahp_k_conductance_range: tuple[float, float] = (5e-4, 5e-4),
mahp_tau_range: tuple[float, float] = (60, 70),
gh_conductance_range: tuple[float, float] = (2.5e-5, 2.5e-5),
axon_velocities: tuple[float, float] = (10, 10),
axon_length: float = 0.05,
cell_index: Optional[int] = None,
initial_voltage__mV: Union[float, list[float]] = -70.0,
):
self.n = n
self.soma_length_range__um = soma_length_range__um
self.soma_diameter_range = soma_diameter_range
self.passive_conductance_range = passive_conductance_range
self.na3rp_conductance_range = na3rp_conductance_range
self.kdrrl_conductance_range = kdrrl_conductance_range
self.mahp_ca_conductance_range = mahp_ca_conductance_range
self.mahp_k_conductance_range = mahp_k_conductance_range
self.mahp_tau_range = mahp_tau_range
self.gh_conductance_range = gh_conductance_range
self.axon_velocities = axon_velocities
self.axon_length = axon_length
self.cell_index = cell_index
sL = np.linspace(*soma_length_range__um, n)
sdiam = np.linspace(*soma_diameter_range, n)
sg_pas = np.linspace(*passive_conductance_range, n)
sgbar_na3rp = np.linspace(*na3rp_conductance_range, n)
sgMax_kdrRL = np.linspace(*kdrrl_conductance_range, n)
sgcamax_mAHP = np.linspace(*mahp_ca_conductance_range, n)
sgkcamax_mAHP = np.linspace(*mahp_k_conductance_range, n)
stau_mAHP = np.linspace(*mahp_tau_range, n)
sghbar_gh = np.linspace(*gh_conductance_range, n)
vcon = np.linspace(*axon_velocities, n)
if cell_index is not None:
init, end = cell_index, cell_index + 1
else:
init, end = 0, n
_cells = []
for i, (
sL_i,
sdiam_i,
sg_pas_i,
sgbar_na3rp_i,
sgMax_kdrRL_i,
sgcamax_mAHP_i,
sgkcamax_mAHP_i,
stau_mAHP_i,
sghbar_gh_i,
vcon_i,
) in enumerate(
zip(
sL[init:end],
sdiam[init:end],
sg_pas[init:end],
sgbar_na3rp[init:end],
sgMax_kdrRL[init:end],
sgcamax_mAHP[init:end],
sgkcamax_mAHP[init:end],
stau_mAHP[init:end],
sghbar_gh[init:end],
vcon[init:end],
)
):
gII = cells.INgII(pool__ID=i)
gII.soma.L = sL_i
gII.soma.diam = sdiam_i
gII.soma.g_pas = sg_pas_i
gII.soma.gbar_na3rp = sgbar_na3rp_i
gII.soma.gMax_kdrRL = sgMax_kdrRL_i
gII.soma.gcamax_mAHP = sgcamax_mAHP_i
gII.soma.gkcamax_mAHP = sgkcamax_mAHP_i
gII.soma.tau_mAHP = stau_mAHP_i
gII.soma.ghbar_gh = sghbar_gh_i
import quantities as pq
gII.create_axon(
length__m=axon_length * pq.m, conduction_velocity__m_per_s=vcon_i * pq.m / pq.s
)
_cells.append(gII)
super().__init__(cells=_cells, initial_voltage__mV=initial_voltage__mV)
[docs]
@beartowertype
class GIb__Pool(_Pool):
"""
Container for a population of group Ib interneurons.
Manages a collection of INgIb (group Ib interneuron) cells that provide
inhibitory feedback in spinal circuits, processing type Ib afferent input
from Golgi tendon organs.
Parameters
----------
n : int
Number of group Ib interneurons to create.
soma_length_range : tuple[float, float]
Min and max soma length (um).
soma_diameter_range : tuple[float, float]
Min and max soma diameter (um).
passive_conductance_range : tuple[float, float]
Min and max passive membrane conductance (S/cm²).
na3rp_conductance_range : tuple[float, float]
Min and max Na3RP sodium channel conductance (S/cm²).
kdrrl_conductance_range : tuple[float, float]
Min and max KDRRL potassium channel conductance (S/cm²).
mahp_ca_conductance_range : tuple[float, float]
Min and max mAHP calcium conductance (S/cm²).
mahp_k_conductance_range : tuple[float, float]
Min and max mAHP potassium conductance (S/cm²).
mahp_tau_range : tuple[float, float]
Min and max mAHP time constant (ms).
gh_conductance_range : tuple[float, float]
Min and max h-current conductance (S/cm²).
axon_velocities : tuple[float, float]
Min and max axon conduction velocities (m/s).
axon_length : float
Length of the axon (mm).
cell_index : Optional[int], optional
Specific cell index to create (creates only one cell), by default None.
"""
[docs]
def __init__(
self,
n: int,
soma_length_range: tuple[float, float] = _get_interneuron_diameter_range__um(),
soma_diameter_range: tuple[float, float] = _get_interneuron_diameter_range__um(),
passive_conductance_range: tuple[float, float] = (3e-5, 8e-5),
na3rp_conductance_range: tuple[float, float] = (0.01, 0.03),
kdrrl_conductance_range: tuple[float, float] = (0.035, 0.028),
mahp_ca_conductance_range: tuple[float, float] = (1e-6, 6e-6),
mahp_k_conductance_range: tuple[float, float] = (3e-4, 4.5e-4),
mahp_tau_range: tuple[float, float] = (120, 90),
gh_conductance_range: tuple[float, float] = (2.5e-5, 2.5e-5),
axon_velocities: tuple[float, float] = (10, 10),
axon_length: float = 0.05,
cell_index: int | None = None,
initial_voltage__mV: float | list[float] = -70.0,
):
self.n = n
self.soma_length_range = soma_length_range
self.soma_diameter_range = soma_diameter_range
self.passive_conductance_range = passive_conductance_range
self.na3rp_conductance_range = na3rp_conductance_range
self.kdrrl_conductance_range = kdrrl_conductance_range
self.mahp_ca_conductance_range = mahp_ca_conductance_range
self.mahp_k_conductance_range = mahp_k_conductance_range
self.mahp_tau_range = mahp_tau_range
self.gh_conductance_range = gh_conductance_range
self.axon_velocities = axon_velocities
self.axon_length = axon_length
self.cell_index = cell_index
sL = np.linspace(*soma_length_range, n)
sdiam = np.linspace(*soma_diameter_range, n)
sg_pas = np.linspace(*passive_conductance_range, n)
sgbar_na3rp = np.linspace(*na3rp_conductance_range, n)
sgMax_kdrRL = np.linspace(*kdrrl_conductance_range, n)
sgcamax_mAHP = np.linspace(*mahp_ca_conductance_range, n)
sgkcamax_mAHP = np.linspace(*mahp_k_conductance_range, n)
stau_mAHP = np.linspace(*mahp_tau_range, n)
sghbar_gh = np.linspace(*gh_conductance_range, n)
vcon = np.linspace(*axon_velocities, n)
if cell_index is not None:
init, end = cell_index, cell_index + 1
else:
init, end = 0, n
_cells = []
for i, (
sL_i,
sdiam_i,
sg_pas_i,
sgbar_na3rp_i,
sgMax_kdrRL_i,
sgcamax_mAHP_i,
sgkcamax_mAHP_i,
stau_mAHP_i,
sghbar_gh_i,
vcon_i,
) in enumerate(
zip(
sL[init:end],
sdiam[init:end],
sg_pas[init:end],
sgbar_na3rp[init:end],
sgMax_kdrRL[init:end],
sgcamax_mAHP[init:end],
sgkcamax_mAHP[init:end],
stau_mAHP[init:end],
sghbar_gh[init:end],
vcon[init:end],
)
):
gIb = cells.INgIb(pool__ID=i)
gIb.soma.L = sL_i
gIb.soma.diam = sdiam_i
gIb.soma.g_pas = sg_pas_i
gIb.soma.gbar_na3rp = sgbar_na3rp_i
gIb.soma.gMax_kdrRL = sgMax_kdrRL_i
gIb.soma.gcamax_mAHP = sgcamax_mAHP_i
gIb.soma.gkcamax_mAHP = sgkcamax_mAHP_i
gIb.soma.tau_mAHP = stau_mAHP_i
gIb.soma.ghbar_gh = sghbar_gh_i
import quantities as pq
gIb.create_axon(
length__m=axon_length * pq.m, conduction_velocity__m_per_s=vcon_i * pq.m / pq.s
)
_cells.append(gIb)
super().__init__(cells=_cells, initial_voltage__mV=initial_voltage__mV)