Skip to content

Commit

Permalink
Merge pull request #17 from TLDSZ/swl
Browse files Browse the repository at this point in the history
add into the new branch
  • Loading branch information
TLDSZ authored Aug 30, 2024
2 parents 58d50f7 + f7d68f4 commit c91c37f
Show file tree
Hide file tree
Showing 6 changed files with 609 additions and 325 deletions.
82 changes: 47 additions & 35 deletions dendritex/channels/calcium.py
Original file line number Diff line number Diff line change
Expand Up @@ -792,10 +792,10 @@ class ICav12_Ma2020(CalciumChannel):
def __init__(
self,
size: bst.typing.Size,
g_max: Union[bst.typing.ArrayLike, Callable] = 0 * (bu.cm / bu.second),
g_max: Union[bst.typing.ArrayLike, Callable] = 0 * (bu.mS / bu.cm**2),
V_sh: Union[bst.typing.ArrayLike, Callable] = 0 * bu.mV,
T_base: bst.typing.ArrayLike = 3 ,
T: bst.typing.ArrayLike = 32.,
T: bst.typing.ArrayLike = 22.,
name: Optional[str] = None,
mode: Optional[bst.mixin.Mode] = None,
):
Expand Down Expand Up @@ -823,8 +823,8 @@ def init_state(self, V, Ca: IonInfo, batch_size: int = None):
self.n = State4Integral(bst.init.param(bu.math.zeros, self.varshape, batch_size))

def reset_state(self, V, Ca, batch_size=None):
self.m.value = self.f_m_inf(V,Ca)
self.h.value = self.f_h_inf(V,Ca)
self.m.value = self.f_m_inf(V)
self.h.value = self.f_h_inf(V)
self.n.value = self.f_n_inf(V,Ca)

def compute_derivative(self, V, Ca):
Expand All @@ -837,11 +837,11 @@ def f_m_inf(self, V):
return 1/(1 + bu.math.exp((V + 8.9)/(-6.7)))
def f_h_inf(self, V):
V = V / bu.mV
return self.VDI/(1 + exp((V +55)/8)) + (1-self.VDI)
return self.VDI/(1 + bu.math.exp((V +55)/8)) + (1-self.VDI)

def f_n_inf(self, V, Ca):
V = V / bu.mV
return self.kf/(self.kf + Ca.C/bu.mM)
return bu.math.ones_like(V)*self.kf/(self.kf + Ca.C/bu.mM)

def f_m_tau(self, V):
V = V / bu.mV
Expand Down Expand Up @@ -902,8 +902,8 @@ def init_state(self, V, Ca: IonInfo, batch_size: int = None):
self.n = State4Integral(bst.init.param(bu.math.zeros, self.varshape, batch_size))

def reset_state(self, V, Ca, batch_size=None):
self.m.value = self.f_m_inf(V,Ca)
self.h.value = self.f_h_inf(V,Ca)
self.m.value = self.f_m_inf(V)
self.h.value = self.f_h_inf(V)
self.n.value = self.f_n_inf(V,Ca)

def compute_derivative(self, V, Ca):
Expand All @@ -922,7 +922,7 @@ def f_h_inf(self, V):

def f_n_inf(self, V, Ca):
V = V / bu.mV
return self.kf/(self.kf + Ca.C/bu.mM)
return bu.math.ones_like(V)*self.kf/(self.kf + Ca.C/bu.mM)

def f_m_tau(self, V):
V = V / bu.mV
Expand Down Expand Up @@ -988,8 +988,8 @@ def init_state(self, V, Ca: IonInfo, batch_size: int = None):


def reset_state(self, V, Ca, batch_size=None):
self.m.value = self.f_m_inf(V,Ca)
self.h.value = self.f_h_inf(V,Ca)
self.m.value = self.f_m_inf(V)
self.h.value = self.f_h_inf(V)


def compute_derivative(self, V, Ca):
Expand Down Expand Up @@ -1033,7 +1033,6 @@ class ICav31_Ma2020(CalciumChannel):
Contact: Haroon Anwar ([email protected])
'''

__module__ = 'dendritex.channels'

root_type = Calcium
Expand All @@ -1043,7 +1042,7 @@ def __init__(
size: bst.typing.Size,
g_max: Union[bst.typing.ArrayLike, Callable] = 2.5e-4 * (bu.cm / bu.second),
V_sh: Union[bst.typing.ArrayLike, Callable] = 0 * bu.mV,
T_base: bst.typing.ArrayLike = 3 ,
T_base: bst.typing.ArrayLike = 3 ,
T: bst.typing.ArrayLike = 22.,
name: Optional[str] = None,
mode: Optional[bst.mixin.Mode] = None,
Expand All @@ -1061,8 +1060,23 @@ def __init__(
self.V_sh = bst.init.param(V_sh, self.varshape, allow_none=False)
self.phi = bst.init.param(T_base ** ((T - 37) / 10), self.varshape, allow_none=False)

self.ci = 1e-4
self.co = 2
self.v0_m_inf = -52
self.v0_h_inf = -72
self.k_m_inf = -5
self.k_h_inf = 7

self.C_tau_m = 1
self.A_tau_m = 1.0
self.v0_tau_m1 = -40
self.v0_tau_m2 = -102
self.k_tau_m1 = 9
self.k_tau_m2 = -18

self.C_tau_h = 15
self.A_tau_h = 1.0
self.v0_tau_h1 = -32
self.k_tau_h1 = 7
self.z = 2


def init_state(self, V, Ca: IonInfo, batch_size: int = None):
Expand All @@ -1079,33 +1093,31 @@ def compute_derivative(self, V, Ca):

def f_p_inf(self, V):
V = V / bu.mV
return 1.0 / ( 1 + bu.math.exp((V - (-42.206)-self.V_sh)/-4.7056) )^(1/3)
return 1.0 / ( 1 + bu.math.exp((V - self.v0_m_inf)/self.k_m_inf) )

def f_q_inf(self, V):
V = V / bu.mV
return 1.0 / ( 1 + bu.math.exp((V - (-75.118)-self.V_sh)/6.4635 ) )
return 1.0 / ( 1 + bu.math.exp((V - self.v0_h_inf)/self.k_h_inf) )

def f_p_tau(self, V):
V = V / bu.mV
return 1/( 1.2757 -2.3199 / (1. + bu.math.exp((-48.048 -V- self.V_sh)/ 30.655))+2.5712/ (1. + bu.math.exp((-28.386-V-self.V_sh)/ 9.6306)))
def f_p_tau(self, V):
return bu.math.where(V<=-90, 1, (self.C_tau_m + self.A_tau_m / (bu.math.exp((V - self.v0_tau_m1)/ self.k_tau_m1) + bu.math.exp((V - self.v0_tau_m2)/self.k_tau_m2))) )
def f_q_tau(self, V):
V = V / bu.mV
return 1/( 0.0076 + 0.17746 / (1. + bu.math.exp((-58.535-V-self.V_sh)/ 6.2692))+ 0.13402/ (1. + bu.math.exp((-101.436-V-self.V_sh)/-5.5845)))
return ( self.C_tau_h + self.A_tau_h / bu.math.exp((V - self.v0_tau_h1)/self.k_tau_h1) )

def ghk(self, V, Ca: IonInfo):
E = (1e-3) * V/bu.mV
zeta = (2*bu.faraday_constant * E )/( bu.gas_constant * (273.15 + self.T) * bu.kelvin )
ci = self.ci
co = self.co

if bu.math.maximum((1-bu.math.exp(-zeta)),0) <= 1e-6:
g = (1e-6) * bu.faraday_constant * (ci - co *bu.math.exp(-zeta)) * (1 + zeta/2)
else:
g = (1e-6) * (zeta*bu.faraday_constant) * (ci - co*bu.math.exp(-zeta)) / (1-bu.math.exp(-zeta))
return g
def ghk(self, V, Ca: IonInfo):
E = (1e-3) * V
zeta = (self.z * bu.faraday_constant * E )/( bu.gas_constant * (273.15 + self.T) * bu.kelvin)
zeta = zeta.to_decimal()
ci = Ca.C
co = 2 * bu.mM #co = Ca.C0 for Calciumdetailed
g_1 = (1e-6) * (self.z * bu.faraday_constant) * (ci - co * bu.math.exp(-zeta)) * (1 + zeta/2)
g_2= (1e-6) *( self.z * zeta * bu.faraday_constant) * (ci - co*bu.math.exp(-zeta)) / (1-bu.math.exp(-zeta))
return bu.math.where(bu.math.abs((1-bu.math.exp(-zeta))) <= 1e-6,g_1,g_2)

def current(self, V, Ca: IonInfo):
return (1e3)*self.g_max * self.p.value ** 3 * self.q.value * self.ghk(V,Ca)
return -(1e3)*self.g_max * self.p.value ** 2 * self.q.value * self.ghk(V,Ca)



Expand Down Expand Up @@ -1145,7 +1157,7 @@ def __init__(
self.T = bst.init.param(T, self.varshape, allow_none=False)
self.T_base = bst.init.param(T_base, self.varshape, allow_none=False)
self.V_sh = bst.init.param(V_sh, self.varshape, allow_none=False)
self.phi = bst.init.param( T_base ** ((T - 37) / 10), self.varshape, allow_none=False)
self.phi = bst.init.param( T_base ** ((T - 20) / 10), self.varshape, allow_none=False)

self.eca = 129.33 * bu.mV

Expand Down Expand Up @@ -1173,8 +1185,8 @@ def init_state(self, V, Ca: IonInfo, batch_size: int = None):


def reset_state(self, V, Ca, batch_size=None):
self.m.value = self.f_m_inf(V,Ca)
self.h.value = self.f_h_inf(V,Ca)
self.m.value = self.f_m_inf(V)
self.h.value = self.f_h_inf(V)


def compute_derivative(self, V, Ca):
Expand Down
86 changes: 84 additions & 2 deletions dendritex/channels/potassium.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,11 @@
'IKK2B_HM1992',
'IKNI_Ya1989',
'IK_Leak',
"IKv11_Ak2007",
'IKv11_Ak2007',
'IKv34_Ma2020',
"IKv43_Ma2020",
'IKv43_Ma2020',
'IKM_Grc_Ma2020',


]

Expand Down Expand Up @@ -1300,3 +1302,83 @@ def f_q_inf(self, V):

def f_q_tau(self, V):
return 1. / (self.f_q_alpha(V) + self.f_q_beta(V))



class IKM_Grc_Ma2020(PotassiumChannel):
r"""
TITLE Cerebellum Granule Cell Model
COMMENT
KM channel
Author: A. Fontana
CoAuthor: T.Nieus Last revised: 20.11.99
"""
__module__ = 'dendritex.channels'

def __init__(
self,
size: Union[int, Sequence[int]],
g_max: Union[bst.typing.ArrayLike, Callable] = 0.25 * (bu.mS / bu.cm ** 2),
V_sh: Union[bst.typing.ArrayLike, Callable] = 0. * bu.mV,
T_base: bst.typing.ArrayLike = 3.,
T: bst.typing.ArrayLike = 22,
name: Optional[str] = None,
mode: Optional[bst.mixin.Mode] = None,
):
super().__init__(size, name=name, mode=mode)

# parameters
self.g_max = bst.init.param(g_max, self.varshape, allow_none=False)

self.T = bst.init.param(T, self.varshape, allow_none=False)
self.T_base = bst.init.param(T_base, self.varshape, allow_none=False)
self.phi = bst.init.param(T_base ** ((T - 22) / 10), self.varshape, allow_none=False)
self.V_sh = bst.init.param(V_sh, self.varshape, allow_none=False)

self.ek = -84.69 * bu.mV

self.Aalpha_n = 0.0033
self.Kalpha_n = 40

self.V0alpha_n = -30
self.Abeta_n = 0.0033
self.Kbeta_n = -20

self.V0beta_n = -30
self.V0_ninf = -35
self.B_ninf = 6



def compute_derivative(self, V, K: IonInfo):
self.p.derivative = self.phi * (self.f_p_inf(V) - self.p.value) / self.f_p_tau(V) / bu.ms


def current(self, V, K: IonInfo):
return self.g_max * self.p.value * (self.ek - V)

def init_state(self, V, K: IonInfo, batch_size: int = None):
self.p = State4Integral(bst.init.param(bu.math.zeros, self.varshape, batch_size))

def reset_state(self, V, K: IonInfo, batch_size=None):
self.p.value = self.f_p_inf(V)
if isinstance(batch_size, int):
assert self.p.value.shape[0] == batch_size


def f_p_alpha(self, V):
V = (V - self.V_sh).to_decimal(bu.mV)
return self.Aalpha_n*bu.math.exp((V-self.V0alpha_n)/self.Kalpha_n)

def f_p_beta(self, V):
V = (V - self.V_sh).to_decimal(bu.mV)
return self.Abeta_n*bu.math.exp((V-self.V0beta_n)/self.Kbeta_n)

def f_p_inf(self, V):
V = (V - self.V_sh).to_decimal(bu.mV)
return 1/(1+bu.math.exp(-(V-self.V0_ninf)/self.B_ninf))

def f_p_tau(self, V):
return 1. / (self.f_p_alpha(V) + self.f_p_beta(V))
Loading

0 comments on commit c91c37f

Please sign in to comment.