Skip to content

Commit

Permalink
Added bartolucci 2020 model
Browse files Browse the repository at this point in the history
MichaelClerx committed Aug 15, 2024
1 parent d8c02e2 commit 0040765
Showing 1 changed file with 1,205 additions and 0 deletions.
1,205 changes: 1,205 additions & 0 deletions c/bartolucci-2020.mmt
Original file line number Diff line number Diff line change
@@ -0,0 +1,1205 @@
[[model]]
name: bartolucci-2020
version: 20240815
mmt_authors: Michael Clerx
desc: """
The 2020 "BPS" model of the human ventricular AP by Bartolucci et al. [1].

The model is based on the cipa adaptation [2] of the O'Hara model [3].
Changes to [2] are indicated throughout the code.

This Myokit implementation is based on the CellML code [4] and the matlab
code [5] published by the original authors. The implementation was checked
by comparing the calculates derivatives to those calculated from both the
original matlab code and the author-provided CellML, both of which matched
to within machine precision.

After verification, the INaK formulation was corrected as described in [6].
Note that the CellML version uses an elevated external calcium of 2.7,
while the paper and the matlab code use the default value of 1.8.

References:

[1] Bartolucci C, Passini E, Hyttinen J, Paci M & Severi S (2020).
Simulation of the Effects of Extracellular Calcium Changes Leads to a
Novel Computational Model of Human Ventricular Action Potential With a
Revised Calcium Handling. Frontiers in Physiology 11:314.
https://doi.org/10.3389/fphys.2020.00314

[2] Li, Z., Dutta, S., Sheng, J., Tran, P. N., Wu, W., Chang, K., Mdluli,
T., Strauss, D. G., & Colatsky, T. (2017). Improving the In Silico
Assessment of Proarrhythmia Risk by Combining hERG (Human
Ether-a-go-go-Related Gene) Channel-Drug Binding Kinetics and
Multichannel Pharmacology. Circulation: Arrhythmia and
Electrophysiology, 10(2), e004628.
https://doi.org/10.1161/CIRCEP.116.004628

[3] O'Hara, T., Virág, L., Varró, A., & Rudy, Y. (2011). Simulation of the
Undiseased Human Cardiac Ventricular Action Potential: Model
Formulation and Experimental Validation. PLOS Computational Biology,
7(5), e1002061.
https://doi.org/10.1371/journal.pcbi.1002061

[4] https://models.physiomeproject.org/workspace/5fd
Accessed on 2024-08-14

[5] https://www.mcbeng.it/en/downloads/software/16-bps2020-model.html
Accessed on 2024-08-14

[6] https://docs.google.com/document/d/111fqNzQGvGAjB_PrkvejEhzqwROrR6czz_OBz7Ep-iM

"""
# Initial values
membrane.V = -8.68763378603082259e+01
sodium.Na_i = 6.48421046372383891e+00
sodium.Na_ss = 6.48441128660288335e+00
potassium.K_i = 1.45407628455352665e+02
potassium.K_ss = 1.45407605094306007e+02
calcium.Ca_i = 9.15346437069119328e-05
calcium.Ca_ss = 8.78935777833865853e-05
calcium.Ca_sr = 1.78376805327765164e+00
ina.m = 8.22386883836054815e-03
ina.hf = 7.93606319296903062e-01
ina.hs = 7.93600853533397710e-01
ina.j = 7.93778425632433393e-01
ina.hsp = 5.86657784626062329e-01
ina.jp = 7.93442200667809128e-01
inal.m = 2.33133496446787900e-04
inal.h = 4.65502276182913177e-01
inal.hp = 2.46052331698270010e-01
ito.a = 1.85149630105329796e-03
ito.if = 9.97800935471168327e-01
ito.is = 5.27863912896033516e-01
ito.ap = 9.43781384663869207e-04
ito.ifp = 9.97800916861890874e-01
ito.isp = 5.53464906754142394e-01
ical.nca = 6.32133191285779017e-11
ical.jnca = 9.99989284880192231e-01
ical.I2 = -7.35246977361640547e-08
ical.I1 = -9.55886901558670427e-08
ical.C = 1.00000016642055156e+00
ical.O = 2.62974227956305578e-09
ical.I2Ca = -1.57575902299323498e-17
ical.I1Ca = -4.33304008664832361e-18
ical.CCa = 6.31140500202378017e-11
icalp.I2 = 5.69072255283142203e-05
icalp.I1 = 3.08847023111448850e-04
icalp.C = 9.99633695108550380e-01
icalp.O = 5.50579605972048969e-07
icalp.I2Ca = 6.61082791338158299e-15
icalp.I1Ca = 1.24670901736430429e-14
icalp.CCa = 6.31046122348557630e-11
ikr.IC1 = 9.99550031746592516e-01
ikr.IC2 = 8.27844958262406055e-05
ikr.IO = 7.31055433681067064e-05
ikr.C1 = 2.17066538284591912e-08
ikr.C2 = 1.00084314157065528e-04
ikr.O = 1.94278628826067022e-04
ikr.IObound = 0.0
ikr.Obound = 0.0
ikr.Cbound = 0.0
iks.x1 = 2.52614081072844554e-01
iks.x2 = 5.35115972169440180e-04
ik1.x = 9.98455395269780110e-01
ryr.a = 4.99040306440874243e-02
ryr.o = 1.56282226028484628e-07
ryr.c = 1.00000000023276581e+00
ryr.cp = 1.00000000533642042e+00
camk.CaMK_trapped = 8.74427429630615302e-03

#
# Simulator variables
#
[engine]
time = 0 [ms]
in [ms]
bind time
pace = 0 bind pace

#
# Membrane potential
#
[membrane]
dot(V) = -(i_ion + stimulus.i_stim)
label membrane_potential
in [mV]
i_ion = (+ ina.INa
+ inal.INaL
+ ito.Ito
+ ical.ICaL
+ ical.ICaNa
+ ical.ICaK
+ ikr.IKr
+ iks.IKs
+ ik1.IK1
+ inaca.INaCa
+ inacass.INaCa_ss
+ inak.INaK
+ inab.INab
+ ikb.IKb
+ ipca.IpCa
+ icab.ICab)
label cellular_current
in [A/F]

#
# Stimulus current
#
[stimulus]
i_stim = engine.pace * amplitude
in [A/F]
amplitude = 2 * -41 [A/F]
in [A/F]

#
# Cell geometry
# Adapted from [3] but with slightly higher pi and single SR
#
[cell]
mode = 0
desc: The type of cell. Endo = 0, Epi = 1, M = 2
L = 0.01 [cm] : Cell length
in [cm]
r = 0.0011 [cm] : Cell radius
in [cm]
pi = 3.1416
vcell = 1000 [uL/mL] * pi * r * r * L
in [uL]
desc: Cell volume
Ageo = 2 * pi * r * r + 2 * pi * r * L
in [cm^2]
desc: Geometric cell area
Acap = 2 * Ageo
in [cm^2]
desc: Capacitative membrane area
AFC = Acap / phys.F * 1 [uF/cm^2]
in [uF*mol/C]
vmyo = 0.68 * vcell
in [uL]
desc: Volume of the cytosolic compartment
vnsr = 0.0552 * vcell
in [uL]
desc: Volume of the NSR compartment
vjsr = 0.0048 * vcell
in [uL]
desc: Volume of the JSR compartment
vsr = 0.95 * (vnsr + vjsr)
in [uL]
desc: Total SR volume
vss = 0.02 * vcell
in [uL]
desc: Volume of the Submembrane space near the T-tubules

#
# Physical constants
# Unchanged from [3]
#
[phys]
R = 8314 [J/kmol/K] : Gas constant
in [J/kmol/K]
T = 310 [K] : Temperature
in [K]
F = 96485 [C/mol] : Faraday constant
in [C/mol]
RTF = R * T / F
in [mV]
FRT = F / (R * T)
in [1/mV]
FFRT = F * FRT
in [C/mol/mV]

#
# Extracellular concentrations
# Slight changes from [3]: Na_o was 140
#
[extra]
Na_o = 144 [mM] : Extracellular Na+ concentration
in [mM]
Ca_o = 1.8 [mM] : Extracellular Ca2+ concentration
in [mM]
K_o = 5.4 [mM] : Extracellular K+ concentration
in [mM]

#
# Reversal potentials
# Unchanged from [3], but with new shift parameter
#
[rev]
ENa = phys.RTF * log(extra.Na_o / sodium.Na_i)
in [mV]
desc: Reversal potential for Sodium currents
EK = phys.RTF * log(extra.K_o / potassium.K_i)
in [mV]
desc: Reversal potential for Potassium currents
PNaK = 0.01833
desc: Permeability ratio K+ to Na+
EKs = phys.RTF * log((extra.K_o + PNaK * extra.Na_o) / (potassium.K_i + PNaK * sodium.Na_i))
in [mV]
desc: Reversal potential for IKs
EKshift = 8 [mV]
in [mV]

#
# INa: Fast sodium current
# Adapted from [3] with reparametrisation of kinetics and max conductance.
#
[ina]
use membrane.V
# m-gates
sm = 1 / (1 + exp((V + 39.57 [mV]) / -9.871 [mV]))
desc: Steady state value for m-gates
tm = 1 [ms] / (6.765 * exp((V + 11.64 [mV]) / 34.77 [mV]) + 8.552 * exp(-(V + 77.42 [mV]) / 5.955 [mV]))
in [ms]
desc: Time constant for m-gates
dot(m) = (sm - m) / tm
desc: Activation gate for INa
# h-gates
sh = 1 / (1 + exp((V + 78.5 [mV]) / 6.22 [mV]))
desc: Steady-state value for h-gates
thf = 1 [ms] / (3.686e-6 * exp((V + 3.8875 [mV]) / -7.8579 [mV]) + 16 * exp((V - 0.4963 [mV]) / 9.1843 [mV])) + 0.075 [ms]
in [ms]
desc: Time constant for fast development of inactivation in INa
ths = 1 [ms] / (0.009794 * exp((V + 17.95 [mV]) / -28.05 [mV]) + 0.3343 * exp((V + 5.73 [mV]) / 56.66 [mV]))
in [ms]
desc: Time constant for slow development of inactivation in INa
Ahf = 0.99 : Fraction of INa channels with fast inactivation
Ahs = 1 - Ahf : Fraction of INa channels with slow inactivation
dot(hf) = (sh - hf) / thf
desc: Fast component of inactivation for INa
dot(hs) = (sh - hs) / ths
desc: Slow component of inactivation for non-phosphorylated INa
h = Ahf * hf + Ahs * hs
desc: Inactivation gate for INa
# j-gates
sj = sh
desc: Steady-state value for j-gate in INa
tj = (4.859 [ms] + 1 [ms] / (0.8628 * exp((V + 116.7258 [mV]) / -7.6005 [mV]) + 1.1096 * exp((V + 6.2719 [mV]) / 9.0358 [mV])))
in [ms]
desc: Time constant for j-gate in INa
dot(j) = (sj - j) / tj
desc: Recovery from inactivation gate for non-phosphorylated INa
# Phosphorylated channels
thsp = 3 * ths
in [ms]
desc: Time constant for h-gate of phosphorylated INa
shsp = 1 / (1 + exp((V + 84.7 [mV]) / 6.22 [mV]))
desc: Steady-state value for h-gate of phosphorylated INa
dot(hsp) = (shsp - hsp) / thsp
desc: Slow componennt of the inactivation gate for phosphorylated INa
hp = Ahf * hf + Ahs * hsp
desc: Inactivation gate for phosphorylated INa
tjp = 1.46 * tj
desc: Time constant for the j-gate of phosphorylated INa
in [ms]
dot(jp) = (sj - jp) / tjp
desc: Recovery from inactivation gate for phosphorylated INa
# Current
gNa = 0.27 * 75 [mS/uF] : Maximum conductance of INa
in [mS/uF]
INa = gNa * (V - rev.ENa) * m^3 * ((1 - camk.f) * h * j + camk.f * hp * jp)
in [A/F]
desc: Fast sodium current

#
# INaL: Late component of the sodium current
# Adapted from [3] with only conductance scaling.
#
[inal]
use membrane.V
use ina.tm
sm = 1 / (1 + exp((V + 42.85 [mV]) / -5.264 [mV]))
desc: Steady state value of m-gate for INaL
dot(m) = (sm - m) / tm
desc: Activation gate for INaL
th = 200 [ms] : Time constant for inactivation of non-phosphorylated INaL
in [ms]
sh = 1 / (1 + exp((V + 87.61 [mV]) / 7.488 [mV]))
desc: Steady-state value for inactivation of non-phosphorylated INaL
dot(h) = (sh - h) / th
desc: Inactivation gate for non-phosphorylated INaL
thp = 3 * th
in [ms]
desc: Time constant for inactivation of phosphorylated INaL
shp = 1 / (1 + exp((V + 93.81 [mV]) / 7.488 [mV]))
desc: Steady state value for inactivation of phosphorylated INaL
dot(hp) = (shp - hp) / thp
desc: Inactivation gate for phosphorylated INaL
# Current
gNaL = 0.0075 [mS/uF] : Maximum conductance of INaL
in [mS/uF]
fNaL = if(cell.mode == 1, 0.7, 1) * 2.8
desc: Adjustment for different cell types
INaL = fNaL * gNaL * (V - rev.ENa) * m * ((1 - camk.f) * h + camk.f * hp)
in [A/F]

#
# Ito: Transient outward potassium current
# Adapted from [3] by adding voltage shift (except in EK)
#
[ito]
V = membrane.V + rev.EKshift
in [mV]
ta = 1.0515 [ms] / (one + two)
in [ms]
one = 1 / (1.2089 * (1 + exp((V - 18.4099 [mV]) / -29.3814 [mV])))
two = 3.5 / (1 + exp((V + 100 [mV]) / 29.3814 [mV]))
desc: Time constant for Ito activation
sa = 1 / (1 + exp((V - 14.34 [mV]) / -14.82 [mV]))
desc: Steady-state value for Ito activation
dot(a) = (sa - a) / ta
desc: Ito activation gate
si = 1 / (1 + exp((V + 43.94 [mV]) / 5.711 [mV]))
desc: Steady-state value for Ito inactivation
delta_epi = if(cell.mode == 1,
1 - 0.95 / (1 + exp((V + 70 [mV]) / 5 [mV])),
1)
desc: Adjustment for different cell types
tif = (4.562 [ms] + 1 [ms] / (0.3933 * exp((V + 100 [mV]) / -100 [mV]) + 0.08004 * exp((V + 50 [mV]) / 16.59 [mV]))) * delta_epi
desc: Time constant for fast component of Ito inactivation
in [ms]
tis = (23.62 [ms] + 1 [ms] / (0.001416 * exp((V + 96.52 [mV]) / -59.05 [mV]) + 1.78e-8 * exp((V + 114.1 [mV]) / 8.079 [mV]))) * delta_epi
desc: Time constant for slow component of Ito inactivation
in [ms]
dot(if) = (si - if) / tif
desc: Fast component of Ito activation
dot(is) = (si - is) / tis
desc: Slow component of Ito activation
Aif = 1 / (1 + exp((V - 213.6 [mV]) / 151.2 [mV]))
desc: Fraction of fast inactivating Ito
Ais = 1 - Aif
desc: Fraction of slow inactivating Ito
i = Aif * if + Ais * is
desc: Inactivation gate for non-phosphorylated Ito
dot(ap) = (sap - ap) / ta
sap = 1 / (1 + exp((V - 24.34 [mV]) / -14.82 [mV]))
dti_develop = 1.354 + 1e-4 / (exp((V - 167.4 [mV]) / 15.89 [mV]) + exp((V - 12.23 [mV]) / -0.2154 [mV]))
dti_recover = 1 - 0.5 / (1 + exp((V + 70 [mV]) / 20 [mV]))
tifp = dti_develop * dti_recover * tif
desc: Time constant for fast component of inactivation of phosphorylated Ito
in [ms]
tisp = dti_develop * dti_recover * tis
desc: Time constant for slot component of inactivation of phosphorylated Ito
in [ms]
dot(ifp) = (si - ifp) / tifp
desc: Fast component of inactivation of phosphorylated Ito
dot(isp) = (si - isp) / tisp
desc: Slow component of inactivation of phosphorylated Ito
ip = Aif * ifp + Ais * isp
desc: Inactivation gate for phosphorylated Ito
# Current
gto = 0.02 [mS/uF]
in [mS/uF]
desc: Maximum conductance of Ito
fto = if(cell.mode == 0, 1, 4)
# Everything except the V - EK below is shifted by 8mV
Ito = fto * gto * (membrane.V - rev.EK) * ((1 - camk.f) * a * i + camk.f * ap * ip)
desc: Transient outward Potassium current
in [A/F]

#
# ICaL: L-type calcium current
# New Markov formulation, combining Decker 2009 with n-gate
#
[ical]
use membrane.V
use phys.FRT, phys.FFRT
use calcium.Ca_ss, sodium.Na_ss, potassium.K_ss
use extra.Ca_o, extra.Na_o, extra.K_o
# n gate
dot(jnca) = (inf - jnca) / 1 [ms]
inf = 1 / (1 + exp((V + 19.58 [mV] + 25 [mV]) / 3.696 [mV]))
dot(nca) = 1000 [1/ms] * anca - 150 [1/ms] * jnca * nca
anca = (1 - nca) / (1 + 0.05 [mM] / Ca_ss)^4
r_down = 0.1 [1/ms]
in [1/ms] # or ms ?
r_up = r_down * nca / (1 - nca)
in [1/ms]
# Omega and psi rate
jcass = 1 / (1 + exp((V + 19.58 [mV]) / 3.696 [mV]))
tjca = 35 [ms] + 350 [ms] * exp(-(V + 20 [mV])^2 / (2 [mV] * 100 [mV]))
in [ms]
omega = (1 - jcass) / tjca
in [1/ms]
psi = jcass / tjca
in [1/ms]
# Alpha and beta rate
alpha = dss / td
in [1/ms]
beta = (1 - dss) / td
in [1/ms]
dss = 1 / (1 + exp(-(V + 3.94 [mV]) / 4.23 [mV]))
td = 0.6 [ms] + 1 [ms] / (exp(-0.05 [1/mV] * (V + 6 [mV])) + exp(0.09 [1/mV] * (V + 14 [mV])))
in [ms]
# Gamma and delta rate
kCDI = 9
sf1 = 0.8 / (1 + exp((V + 19.58 [mV]) / 3.696 [mV])) + 0.2
tf1 = 70 [ms] + 1.2 [ms] / (0.0045 * exp((V + 20 [mV]) / -50 [mV]) + 0.0045 * exp((V + 30 [mV]) / 10 [mV]))
in [ms]
delta_VD = sf1 / tf1
in [1/ms]
gamma_VD = (1 - sf1) / tf1
in [1/ms]
delta_CD = delta_VD * kCDI
in [1/ms]
gamma_CD = gamma_VD * kCDI
in [1/ms]
# Eta and theta rate
tf2_VD = 100 [ms]
in [ms]
tf2_CD = tf2_VD / kCDI
in [ms]
eta_CD = 1 / tf2_CD - theta_CD
in [1/ms]
eta_VD = 1 / tf2_VD - theta_VD
in [1/ms]
theta_CD = alpha * gamma_CD * psi / tf2_CD / (alpha * gamma_CD * psi + beta * delta_CD * omega)
in [1/ms]
theta_VD = alpha * gamma_VD * psi / tf2_VD / (alpha * gamma_VD * psi + beta * delta_VD * omega)
in [1/ms]
# States
dot(I2) = eta_VD * I1 + omega * C - (theta_VD + psi) * I2 - r_up * I2 + r_down * I2Ca
dot(I1) = theta_VD * I2 + gamma_VD * O - (eta_VD + delta_VD) * I1 - r_up * I1 + r_down * I1Ca
dot(C) = beta * O + psi * I2 - (omega + alpha) * C - r_up * C + r_down * CCa
dot(O) = alpha * C + delta_VD * I1 - (beta + gamma_VD) * O - r_up * O + r_down * OCa
dot(I2Ca) = eta_CD * I1Ca + omega * CCa - (theta_CD + psi) * I2Ca + r_up * I2 - r_down * I2Ca
dot(I1Ca) = theta_CD * I2Ca + gamma_CD * OCa - (eta_CD + delta_CD) * I1Ca + r_up * I1 - r_down * I1Ca
dot(CCa) = beta * OCa + psi * I2Ca - (omega + alpha) * CCa + r_up * C - r_down * CCa
OCa = 1 - CCa - I1Ca - I2Ca - C - I1 - I2 - O
# Permeability
fCa = piecewise(cell.mode == 0, 1, cell.mode == 1, 1.4, 2)
PCa_base = 0.0001 [L/ms/F]
in [L/ms/F]
PCa = 0.9 * fCa * PCa_base
in [L/ms/F]
PNa = 0.00125 * PCa
in [L/ms/F]
PK = 0.0003574 * PCa
in [L/ms/F]
PhiCa = 4 * V * FFRT * (1.2 * Ca_ss * exp(2 * V * FRT) - 0.341 * Ca_o) / (exp(2 * V * FRT) - 1)
in [mC/L]
PhiNa = V * FFRT * (0.75 * Na_ss * exp(V * FRT) - 0.75 * Na_o) / (exp(V * FRT) - 1)
in [mC/L]
PhiK = V * FFRT * (0.75 * K_ss * exp(V * FRT) - 0.75 * K_o) / (exp(V * FRT) - 1)
in [mC/L]
# Current
ICaLnp = PCa * PhiCa * (O + OCa)
in [A/F]
ICaNanp = PNa * PhiNa * (O + OCa)
in [A/F]
ICaKnp = PK * PhiK * (O + OCa)
in [A/F]
ICaK = (icalp.ICaKp * camk.f + ICaKnp * (1 - camk.f))
in [A/F]
ICaL = (icalp.ICaLp * camk.f + ICaLnp * (1 - camk.f))
in [A/F]
ICaNa = (icalp.ICaNap * camk.f + ICaNanp * (1 - camk.f))
in [A/F]

#
# Phosphorylated ICaL
#
[icalp]
use ical.kCDI
use ical.alpha, ical.beta
use ical.r_up, ical.r_down
use ical.omega, ical.psi
# Rates
k = 2.5
delta_VD = ical.delta_VD / k
in [1/ms]
delta_CD = ical.delta_CD / k
in [1/ms]
gamma_VD = ical.gamma_VD / k
in [1/ms]
gamma_CD = ical.gamma_CD / k
in [1/ms]
tf2_VD = ical.tf2_VD * k
in [ms]
tf2_CD = ical.tf2_CD * k
in [ms]
eta_VD = 1 / tf2_VD - theta_VD
in [1/ms]
eta_CD = 1 / tf2_CD - theta_CD
in [1/ms]
theta_VD = alpha * gamma_VD * psi / tf2_VD / (alpha * gamma_VD * psi + beta * delta_VD * omega)
in [1/ms]
theta_CD = alpha * gamma_CD * psi / tf2_CD / (alpha * gamma_CD * psi + beta * delta_CD * omega)
in [1/ms]
# States
dot(I2) = eta_VD * I1 + omega * C - (theta_VD + psi) * I2 - r_up * I2 + r_down * I2Ca
dot(I1) = theta_VD * I2 + gamma_VD * O - (eta_VD + delta_VD) * I1 - r_up * I1 + r_down * I1Ca
dot(C) = beta * O + psi * I2 - (omega + alpha) * C - r_up * C + r_down * CCa
dot(O) = alpha * C + delta_VD * I1 - (beta + gamma_VD) * O - r_up * O + r_down * OCa
dot(I2Ca) = eta_CD * I1Ca + omega * CCa - (theta_CD + psi) * I2Ca + r_up * I2 - r_down * I2Ca
dot(I1Ca) = theta_CD * I2Ca + gamma_CD * OCa - (eta_CD + delta_CD) * I1Ca + r_up * I1 - r_down * I1Ca
dot(CCa) = beta * OCa + psi * I2Ca - (omega + alpha) * CCa + r_up * C - r_down * CCa
OCa = 1 - CCa - I1Ca - I2Ca - C - I1 - I2 - O
# Current
fp = 1.1
ICaLp = fp * ical.PCa * ical.PhiCa * (O + OCa)
in [A/F]
ICaNap = fp * ical.PNa * ical.PhiNa * (O + OCa)
in [A/F]
ICaKp = fp * ical.PK * ical.PhiK * (O + OCa)
in [A/F]

#
# IKr: Rapid delayed rectifier potassium current
# Rescaled, but otherwise unchanged.
#
[ikr]
use membrane.V
Temp = 37
# Drug binding parameters
D = 0 [mM]
in [mM]
desc: Drug concentration
Kt = 3.5e-5 [1/ms] in [1/ms]
Ku = 0 [1/ms] in [1/ms]
Vhalf = 1 [mV] in [mV]
halfmax = 1
n = 1
Kmax = 0
# Rates
k1 = 0.0264 [1/ms] * exp(4.631e-5 [1/mV] * V) * exp((Temp - 20) * log(4.843) / 10)
in [1/ms]
k2 = 4.986e-6 [1/ms] * exp(-0.004226 [1/mV] * V) * exp((Temp - 20) * log(4.23) / 10)
in [1/ms]
k3 = 0.001214 [1/ms] * exp(0.008516 [1/mV] * V) * exp((Temp - 20) * log(4.962) / 10)
in [1/ms]
k4 = 1.854e-5 [1/ms] * exp(-0.04641 [1/mV] * V) * exp((Temp - 20) * log(3.769) / 10)
in [1/ms]
k11 = 0.0007868 [1/ms] * exp(1.535e-8 [1/mV] * V) * exp((Temp - 20) * log(4.942) / 10)
in [1/ms]
k21 = 5.455e-6 [1/ms] * exp(-0.1688 [1/mV] * V) * exp((Temp - 20) * log(4.156) / 10)
in [1/ms]
k31 = 0.005509 [1/ms] * exp(7.771e-9 [1/mV] * V) * exp((Temp - 20) * log(4.22) / 10)
in [1/ms]
k41 = 0.001416 [1/ms] * exp(-0.02877 [1/mV] * V) * exp((Temp - 20) * log(1.459) / 10)
in [1/ms]
k51 = 0.4492 [1/ms] * exp(0.008595 [1/mV] * V) * exp((Temp - 20) * log(5) / 10)
in [1/ms]
k52 = 0.3181 [1/ms] * exp(3.613e-8 [1/mV] * V) * exp((Temp - 20) * log(4.663) / 10)
in [1/ms]
k53 = 0.149 [1/ms] * exp(0.004668 [1/mV] * V) * exp((Temp - 20) * log(2.412) / 10)
in [1/ms]
k61 = 0.01241 [1/ms] * exp(0.1725 [1/mV] * V) * exp((Temp - 20) * log(5.568) / 10)
in [1/ms]
k62 = 0.3226 [1/ms] * exp(-6.575e-4 [1/mV] * V) * exp((Temp - 20) * log(5) / 10)
in [1/ms]
k63 = 0.008978 [1/ms] * exp(-0.02215 [1/mV] * V) * exp((Temp - 20) * log(5.682) / 10)
in [1/ms]
r1 = Kmax * Ku * (D / 1 [mM])^n / ((D / 1 [mM])^n + halfmax)
in [1/ms]
r2 = Ku * k53 / k63
in [1/ms]
r3 = Kt / (1 + exp(-(V - Vhalf) / 6.789 [mV]))
in [1/ms]
# States
dot(IC1) = -(k11 * IC1 - k21 * IC2) + (k51 * C1 - k61 * IC1)
dot(IC2) = (k11 * IC1 - k21 * IC2) - (k3 * IC2 - k4 * IO) + (k52 * C2 - k62 * IC2)
dot(IO) = (k3 * IC2 - k4 * IO) + (k53 * O - k63 * IO) - (r1 * IO - r2 * IObound)
dot(C1) = -(k1 * C1 - k2 * C2) - (k51 * C1 - k61 * IC1)
dot(C2) = (k1 * C1 - k2 * C2) - (k31 * C2 - k41 * O) - (k52 * C2 - k62 * IC2)
dot(O) = (k31 * C2 - k41 * O) - (k53 * O - k63 * IO) - (r1 * O - Ku * Obound)
dot(IObound) = (r1 * IO - r2 * IObound) + (r3 * Cbound - Kt * IObound)
dot(Obound) = (r1 * O - Ku * Obound) + (r3 * Cbound - Kt * Obound)
dot(Cbound) = -(r3 * Cbound - Kt * Obound) - (r3 * Cbound - Kt * IObound)
# Current
fKr = piecewise(cell.mode == 0, 1, cell.mode == 1, 1.1, 0.8) * 1.2
gKr = 0.046 [mS/uF]
in [mS/uF]
IKr = fKr * gKr * sqrt(extra.K_o / 5.4 [mM]) * O * (V - rev.EK)
in [A/F]

#
# IKs: Slow delayed rectifier potassium current
# Rescaled and with the EKshift applied, but otherwise unchanged.
#
[iks]
V = membrane.V + rev.EKshift
in [mV]
sx = 1 / (1 + exp((V + 11.6 [mV]) / -8.932 [mV]))
desc: Steady-state value for activation of IKs
dot(x1) = (sx - x1) / tau
desc: Slow, low voltage IKs activation
tau = 817.3 [ms] + 1 [ms] / (2.326e-4 * exp((V + 48.28 [mV]) / 17.8 [mV]) + 0.001292 * exp((V + 210 [mV]) / -230 [mV]))
desc: Time constant for slow, low voltage IKs activation
in [ms]
dot(x2) = (sx - x2) / tau
desc: Fast, high voltage IKs activation
tau = 1 [ms] / (0.01 * exp((V - 50 [mV]) / 20 [mV]) + 0.0193 * exp((V + 66.54 [mV]) / -31 [mV]))
desc: Time constant for fast, high voltage IKs activation
in [ms]
KsCa = 1 + 0.6 / (1 + (3.8e-5 [mM] / calcium.Ca_i)^1.4)
fKs = if(cell.mode == 1, 1.4, 1) * 2
gKs = 0.0034 [mS/uF]
in [mS/uF]
# Everything except V - E is shifted by EKshift
IKs = fKs * gKs * KsCa * x1 * x2 * (membrane.V - rev.EKs)
desc: Slow delayed rectifier Potassium current
in [A/F]

#
# IK1: Inward rectifier potassium current
# Modified r gate, rescaled, and with the EKshift applied.
#
[ik1]
use extra.K_o
V = membrane.V + rev.EKshift
in [mV]
dot(x) = (inf - x) / tau
desc: Activation of IK1
inf = 1 / (1 + exp(-(V + 2.5538 [mV/mM] * K_o + 144.59 [mV]) / (1.5692 [mV/mM] * K_o + 3.8115 [mV])))
desc: Steady-state value for activation of IK1
tau = 122.2 [ms] / (exp((V + 127.2 [mV]) / -20.36 [mV]) + exp((V + 236.8 [mV]) / 69.33 [mV]))
desc: Time constant for activation of IK1
in [ms]
r = 1 / (1 + exp((V + 105.8 [mV] - 2.6 [mV/mM] * K_o) / (1.09 * 9.493 [mV])))
desc: Inactivation of IK1
fK1 = piecewise(cell.mode == 0, 1, cell.mode == 1, 1.2, 1.3) * 0.71
gK1 = 0.1908 [mS/uF]
in [mS/uF]
desc: Maximum conductance for IK1 (before scaling)
# Potential is shifted everywhere except in V - E
IK1 = fK1 * gK1 * sqrt(K_o / 1 [mM]) * r * x * (membrane.V - rev.EK)
in [A/F]
desc: Inward rectifier Potassium current

#
# INaCa: Sodium/calcium exchange current
# Rescaled but otherwise unchanged from [3]
#
[inaca]
use membrane.V
use extra.Na_o, extra.Ca_o
use sodium.Na_i, calcium.Ca_i
kna1 = 15 [mM]
in [mM]
kna2 = 5 [mM]
in [mM]
kna3 = 88.12 [mM]
in [mM]
kasymm = 12.5
wna = 6e4 [1/s]
in [1/s]
wca = 6e4 [1/s]
in [1/s]
wnaca = 5e3 [1/s]
in [1/s]
kcaon = 1.5e6 [1/mM/s]
in [1/mM/s]
kcaoff = 5e3 [1/s]
in [1/s]
qna = 0.5224
qca = 0.167
hca = exp(qca * V * phys.FRT)
hna = exp(qna * V * phys.FRT)
# Parameters h
h1 = 1 + Na_i / kna3 * (1 + hna)
h2 = Na_i * hna / (kna3 * h1)
h3 = 1 / h1
h4 = 1 + Na_i / kna1 * (1 + Na_i / kna2)
h5 = Na_i * Na_i / (h4 * kna1 * kna2)
h6 = 1 / h4
h7 = 1 + Na_o / kna3 * (1 + 1 / hna)
h8 = Na_o / (kna3 * hna * h7)
h9 = 1 / h7
h10 = kasymm + 1 + Na_o / kna1 * (1 + Na_o / kna2)
h11 = Na_o * Na_o / (h10 * kna1 * kna2)
h12 = 1 / h10
# Parameters k
k1 = h12 * Ca_o * kcaon
in [1/s]
k2 = kcaoff
in [1/s]
k3p = h9 * wca
in [1/s]
k3pp = h8 * wnaca
in [1/s]
k3 = k3p + k3pp
in [1/s]
k4p = h3 * wca / hca
in [1/s]
k4pp = h2 * wnaca
in [1/s]
k4 = k4p + k4pp
in [1/s]
k5 = kcaoff
in [1/s]
k6 = h6 * Ca_i * kcaon
in [1/s]
k7 = h5 * h2 * wna
in [1/s]
k8 = h8 * h11 * wna
in [1/s]
x1 = k2 * k4 * (k7 + k6) + k5 * k7 * (k2 + k3)
in [s^-3]
x2 = k1 * k7 * (k4 + k5) + k4 * k6 * (k1 + k8)
in [s^-3]
x3 = k1 * k3 * (k7 + k6) + k8 * k6 * (k2 + k3)
in [s^-3]
x4 = k2 * k8 * (k4 + k5) + k3 * k5 * (k1 + k8)
in [s^-3]
E1 = x1 / (x1 + x2 + x3 + x4)
E2 = x2 / (x1 + x2 + x3 + x4)
E3 = x3 / (x1 + x2 + x3 + x4)
E4 = x4 / (x1 + x2 + x3 + x4)
KmCaAct = 150e-6 [mM]
in [mM]
allo = 1 / (1 + (KmCaAct / Ca_i)^2)
JncxNa = 3 * (E4 * k7 - E1 * k8) + E3 * k4pp - E2 * k3pp
in [1/s]
JncxCa = E2 * k2 - E1 * k1
in [1/s]
fNaCa = piecewise(cell.mode == 0, 1, cell.mode == 1, 1.2, 1.4) * 2.4
gNaCa = 0.0008 [C/F]
in [C/F]
INaCa = 0.8 * fNaCa * gNaCa * allo * (JncxNa + 2 * JncxCa)
in [A/F]
desc: Sodium/Calcium exchange current

#
# INaCa_ss: Sodium/calcium exchanger current into the L-type subspace
# Rescaled (via fNaCa) but otherwise unchanged from [3]
#
[inacass]
use membrane.V
use extra.Na_o, extra.Ca_o
use sodium.Na_ss, calcium.Ca_ss
use inaca.kna1, inaca.kna2, inaca.kna3, inaca.hna
# Parameters h
h1 = 1 + Na_ss / kna3 * (1 + hna)
h2 = Na_ss * hna / (kna3 * h1)
h3 = 1 / h1
h4 = 1 + Na_ss / kna1 * (1 + Na_ss / kna2)
h5 = Na_ss * Na_ss / (h4 * kna1 * kna2)
h6 = 1 / h4
h7 = 1 + Na_o / kna3 * (1 + 1 / hna)
h8 = Na_o / (kna3 * hna * h7)
h9 = 1 / h7
h10 = inaca.kasymm + 1 + Na_o / kna1 * (1 + Na_o / kna2)
h11 = Na_o * Na_o / (h10 * kna1 * kna2)
h12 = 1 / h10
# Parameters k
k1 = h12 * Ca_o * inaca.kcaon
in [1/s]
k2 = inaca.kcaoff
in [1/s]
k3p = h9 * inaca.wca
in [1/s]
k3pp = h8 * inaca.wnaca
in [1/s]
k3 = k3p + k3pp
in [1/s]
k4p = h3 * inaca.wca / inaca.hca
in [1/s]
k4pp = h2 * inaca.wnaca
in [1/s]
k4 = k4p + k4pp
in [1/s]
k5 = inaca.kcaoff
in [1/s]
k6 = h6 * Ca_ss * inaca.kcaon
in [1/s]
k7 = h5 * h2 * inaca.wna
in [1/s]
k8 = h8 * h11 * inaca.wna
in [1/s]
x1 = k2 * k4 * (k7 + k6) + k5 * k7 * (k2 + k3)
in [s^-3]
x2 = k1 * k7 * (k4 + k5) + k4 * k6 * (k1 + k8)
in [s^-3]
x3 = k1 * k3 * (k7 + k6) + k8 * k6 * (k2 + k3)
in [s^-3]
x4 = k2 * k8 * (k4 + k5) + k3 * k5 * (k1 + k8)
in [s^-3]
E1 = x1 / (x1 + x2 + x3 + x4)
E2 = x2 / (x1 + x2 + x3 + x4)
E3 = x3 / (x1 + x2 + x3 + x4)
E4 = x4 / (x1 + x2 + x3 + x4)
allo = 1 / (1 + (inaca.KmCaAct / Ca_ss)^2)
JncxNa = 3 * (E4 * k7 - E1 * k8) + E3 * k4pp - E2 * k3pp
in [1/s]
JncxCa = E2 * k2 - E1 * k1
in [1/s]
INaCa_ss = 0.2 * inaca.fNaCa * inaca.gNaCa * allo * (JncxNa + 2 * JncxCa)
in [A/F]
desc: Sodium/Calcium exchange current into the T-Tubule subspace

#
# INaK: Sodium/potassium ATPase current
# Rescaled from [3], and corrected as in [6].
#
[inak]
use membrane.V
use extra.Na_o, sodium.Na_i, sodium.Na_ss
use extra.K_o, potassium.K_i, potassium.K_ss
k1p = 949.5 [1/s]
in [1/s]
k1m = 182.4 [1/s/mM]
in [1/s/mM]
k2p = 687.2 [1/s]
in [1/s]
k2m = 39.4 [1/s]
in [1/s]
k3p = 1899 [1/s]
in [1/s]
k3m = 79300 [1/s/mM^2]
in [1/s/mM^2]
k4p = 639 [1/s]
in [1/s]
k4m = 40 [1/s]
in [1/s]
Knai0 = 9.073 [mM]
in [mM]
Knao0 = 27.78 [mM]
in [mM]
Kki = 0.5 [mM]
in [mM]
Kko = 0.3582 [mM]
in [mM]
delta = -0.155
MgADP = 0.05 [mM]
in [mM]
MgATP = 9.8 [mM]
in [mM]
Kmgatp = 1.698e-7 [mM]
in [mM]
H = 1e-4 [mM]
in [mM]
note: Corrected to 1e-7 [M] (pH 7) from original value of 1e-7 [mM]
eP = 4.2 [mM]
in [mM]
Khp = 1.698e-7 [mM]
in [mM]
Knap = 224 [mM]
in [mM]
Kxkur = 292 [mM]
in [mM]
P = eP / (1 + H / Khp + Na_i / Knap + K_i / Kxkur)
in [mM]
Knai = Knai0 * exp(delta * V * phys.FRT / 3)
in [mM]
Knao = Knao0 * exp((1 - delta) * V * phys.FRT / 3)
in [mM]
a1 = k1p * (Na_i / Knai)^3 / ((1 + Na_i / Knai)^3 + (1 + K_i / Kki)^2 - 1)
in [1/s]
b1 = k1m * MgADP
in [1/s]
a2 = k2p
in [1/s]
b2 = k2m * (Na_o / Knao)^3 / ((1 + Na_o / Knao)^3 + (1 + K_o / Kko)^2 - 1)
in [1/s]
a3 = k3p * (K_o / Kko)^2 / ((1 + Na_o / Knao)^3 + (1 + K_o / Kko)^2 - 1)
in [1/s]
b3 = k3m * P * H / (1 + MgATP / Kmgatp)
in [1/s]
a4 = k4p * MgATP / Kmgatp / (1 + MgATP / Kmgatp)
in [1/s]
b4 = k4m * (K_i / Kki)^2 / ((1 + Na_i / Knai)^3 + (1 + K_i / Kki)^2 - 1)
in [1/s]
x1 = a4 * a1 * a2 + b1 * b4 * b3 + a2 * b4 * b3 + b3 * a1 * a2
in [s^-3]
note: Corrected from the original code (b1 in second term)
x2 = b2 * b1 * b4 + a1 * a2 * a3 + a3 * b1 * b4 + a2 * a3 * b4
in [s^-3]
x3 = a2 * a3 * a4 + b3 * b2 * b1 + b2 * b1 * a4 + a3 * a4 * b1
in [s^-3]
x4 = b4 * b3 * b2 + a3 * a4 * a1 + b2 * a4 * a1 + b3 * b2 * a1
in [s^-3]
r = (a1 * a2 * a3 * a4 - b1 * b2 * b3 * b4) / (x1 + x2 + x3 + x4)
in [1/s]
JnakNa = 3 * r
in [1/s]
JnakK = -2 * r
in [1/s]
fNaK = piecewise(cell.mode == 0, 1, cell.mode == 1, 0.9, 0.7) * 2
PNaK = 30 [C/F]
in [C/F]
INaK = fNaK * PNaK * (JnakNa + JnakK)
in [A/F]
desc: Sodium/Potassium ATPase current

#
# IKb: Background potassium current
# Unchanged from [3]
#
[ikb]
use membrane.V
xkb = 1 / (1 + exp((V - 14.48 [mV]) / -18.34 [mV]))
fKb = if(cell.mode == 1, 0.6, 1)
gKb = 0.003 [mS/uF]
in [mS/uF]
IKb = fKb * gKb * xkb * (V - rev.EK)
in [A/F]
desc: Background Potassium current

#
# INab: Background sodium current
# Unchanged from [3]
#
[inab]
use membrane.V
PNab = 3.75e-10 [L/ms/F]
in [L/ms/F]
INab = PNab * V * phys.FFRT * (sodium.Na_i * evf - extra.Na_o) / (evf - 1)
in [A/F]
evf = exp(V * phys.FRT)
desc: Background Sodium current

#
# ICab: Background calcium current
# Rescaled and GHK equation modified from [3]
#
[icab]
use membrane.V
PCab = 2.5e-8 [L/ms/F]
in [L/ms/F]
ICab = PCab * 16 * V * phys.FFRT * (1.2 * calcium.Ca_i * evf2 - 0.341 * extra.Ca_o) / (evf2 - 1)
in [A/F]
evf2 = exp(2 * V * phys.FRT)
desc: Background Calcium current

#
# IpCa: Sarcolemmal calcium pump current
# Unchanged from [3]
#
[ipca]
GpCa = 0.0005 [A/F]
in [A/F]
IpCa = GpCa * calcium.Ca_i / (0.0005 [mM] + calcium.Ca_i)
desc: Sarcolemmal Calcium pump current
in [A/F]

#
# Jrel: SR Calcium release flux via ryanodine receptor
# Replaced with formulation adapted from Koivumaki 2011
#
[ryr]
use calcium.Ca_ss, calcium.Ca_sr
a1 = 0.05 [uM] in [uM]
a2 = 0.03 [uM] in [uM]
chalf = 0.1 [uM] - (a1 - a2 / 2)
in [uM]
ohalf = 0.12 [uM] - (a1 - a2 / 2)
in [uM]
SRCass = 1 - 1 / (1 + exp((Ca_sr - 0.3 [mM]) / 0.1 [mM]))
dot(a) = (inf - a) / tau
in [uM]
inf = a1 - a2 / (1 + exp((1000 [uM/mM] * Ca_ss - 0.043 [uM]) / 0.0082 [uM]))
in [uM]
tau = 1000 [ms]
in [ms]
dot(o) = (inf - o) / tau
inf = 1 - 1 / (1 + exp((1000 [uM/mM] * calcium.Ca_ss - (a + ohalf)) / 0.003 [uM]))
tau = 1.875 [ms] / 1.875
in [ms]
sc = 1 / (1 + exp((1000 [uM/mM] * calcium.Ca_ss - (a + chalf)) / 0.001 [uM]))
tau_c = 2 * 87.5 [ms] / 10
in [ms]
tau_cp = tau_c * 1.25
in [ms]
dot(c) = (sc - c) / tau_c
dot(cp) = (sc - cp) / tau_cp
# Fluxes
frel = if(cell.mode == 2, 1.7, 1)
g_irel_max = 0.02 [1/ms]
in [1/ms]
Jrelnp = frel * g_irel_max * SRCass * o * c * (Ca_sr - Ca_ss)
in [mM/ms]
Jrelp = 1.25 * frel * g_irel_max * SRCass * o * cp * (Ca_sr - Ca_ss)
in [mM/ms]
Jrel = (1 - camk.f) * Jrelnp + camk.f * Jrelp
desc: SR Calcium release flux via Ryanodine receptor
in [mM/ms]

#
# Jup: Calcium uptake via SERCA pump
# Modified from [3] to remove jsr/nsr distinction
#
[serca]
use calcium.Ca_i, calcium.Ca_sr
f = if(cell.mode == 1, 1.3, 1)
j = 0.004375 [mM/ms]
in [mM/ms]
k = 0.00092 [mM]
in [mM]
Jupnp = j * f * Ca_i / (Ca_i + k)
in [mM/ms]
Jupp = 2.75 * j * f * Ca_i / (Ca_i + k - 0.00017 [mM])
in [mM/ms]
Jleak = 0.0123 [mM/ms] * Ca_sr / 15 [mM]
in [mM/ms]
Jup = 3.13 * ((1 - camk.f) * Jupnp + camk.f * Jupp)
in [mM/ms]

#
# Diffusion fluxes
# Calcium flux rescaled from [3]
#
[diff]
JdiffNa = (sodium.Na_ss - sodium.Na_i) / 2 [ms]
in [mM/ms]
JdiffK = (potassium.K_ss - potassium.K_i) / 2 [ms]
in [mM/ms]
Jdiff = (calcium.Ca_ss - calcium.Ca_i) * 1.7 / 0.2 [ms]
in [mM/ms]

#
# Intracellular sodium concentrations
# Unchanged from [3]
#
[sodium]
use cell.AFC, cell.vss, cell.vmyo
INa_tot = ina.INa + inal.INaL + inab.INab + 3 * inaca.INaCa + 3 * inak.INaK
in [A/F]
dot(Na_i) = -INa_tot * AFC / vmyo + diff.JdiffNa * vss / vmyo
desc: Intracellular Potassium concentration
in [mM]
INa_ss_tot = ical.ICaNa + 3 * inacass.INaCa_ss
in [A/F]
dot(Na_ss) = -INa_ss_tot * AFC / vss - diff.JdiffNa
in [mM]

#
# Intracellular potassium concentrations
# Unchanged from [3]
#
[potassium]
use cell.AFC, cell.vss, cell.vmyo
IK_tot = (
+ ito.Ito
+ ikr.IKr
+ iks.IKs
+ ik1.IK1
+ ikb.IKb
- 2 * inak.INaK
)
in [A/F]
IK_ss_tot = ical.ICaK
in [A/F]
dot(K_i) = -(IK_tot + stimulus.i_stim) * AFC / vmyo + diff.JdiffK * vss / vmyo
desc: Intracellular Potassium concentration
in [mM]
dot(K_ss) = -IK_ss_tot * AFC / vss - diff.JdiffK
desc: Potassium concentration in the T-Tubule subspace
in [mM]

#
# Intracellular calcium concentrations and buffers
# Adapted to remove NSR/JSR separation in [3]
#
[calcium]
use cell.AFC, cell.vmyo, cell.vsr, cell.vss
cmdnmax = base * if(cell.mode == 1, 1.2, 1)
in [mM]
base = 0.05 [mM]
in [mM]
trpnmax = 0.07 [mM]
in [mM]
BSRmax = 0.047 [mM]
in [mM]
BSLmax = 1.124 [mM]
in [mM]
csqnmax = 1 [mM] # Down from 10 in [3]
in [mM]
kmcmdn = 0.00238 [mM]
in [mM]
kmtrpn = 0.0005 [mM]
in [mM]
KmBSR = 0.00087 [mM]
in [mM]
KmBSL = 0.0087 [mM]
in [mM]
kmcsqn = 0.8 [mM]
in [mM]
ICa_tot = ipca.IpCa + icab.ICab - 2 * inaca.INaCa
in [A/F]
dot(Ca_i) = buff * (-ICa_tot * AFC / (2 * vmyo) - serca.Jup * vsr / vmyo + serca.Jleak * vsr / vmyo + diff.Jdiff * vss / vmyo)
in [mM]
desc: Intracellular calcium concentration
buff = 1 / (1 + cmdnmax * kmcmdn / (kmcmdn + Ca_i)^2 + trpnmax * kmtrpn / (kmtrpn + Ca_i)^2)
ICa_ss_tot = ical.ICaL - 2 * inacass.INaCa_ss
in [A/F]
dot(Ca_ss) = buff * (-ICa_ss_tot * AFC / (2 * vss) + ryr.Jrel * vsr / vss - diff.Jdiff)
in [mM]
desc: Calcium concentration in the T-Tubule subspace
buff = 1 / (1 + BSRmax * KmBSR / (KmBSR + Ca_ss)^2 + BSLmax * KmBSL / (KmBSL + Ca_ss)^2)
dot(Ca_sr) = buff * (serca.Jup - serca.Jleak - ryr.Jrel)
in [mM]
desc: Calcium concentration in the SR subspace
buff = 1 / (1 + csqnmax * kmcsqn / (kmcsqn + Ca_sr)^2)

#
# Active CaMKII subunits.
# Unchanged from [3].
#
[camk]
aCaMK = 0.05 [1/ms]
in [1/ms]
bCaMK = 0.00068 [1/ms]
in [1/ms]
CaMKo = 0.05
KmCaM = 0.0015 [mM]
in [mM]
KmCaMK = 0.15
CaMK_bound = CaMKo * (1 - CaMK_trapped) / (1 + KmCaM / calcium.Ca_ss)
desc: Fraction of calmodulin-bound (and therefore) active subunits
dot(CaMK_trapped) = aCaMK * CaMK_bound * CaMK_active - bCaMK * CaMK_trapped
desc: Fraction of subunits "trapped" in an active state
CaMK_active = CaMK_bound + CaMK_trapped
desc: Total fraction of active subunits
f = 1 / (1 + KmCaMK / CaMK_active)
desc: Fraction of phosphorylated subunits

[[protocol]]
# Level Start Length Period Multiplier
1 50 0.5 1000 0

[[script]]
import matplotlib.pyplot as plt
import myokit

# Get the model and protocol, create a simulation
m = get_model()
p = get_protocol()
s = myokit.Simulation(m, p)

# Create an empty figure
plt.figure()
plt.xlabel('Time (ms)')
plt.ylabel('Membrane potential (mV)')

# Select variables for logging
variables = [
'engine.time',
'membrane.V',
]

# Run a simulation in every mode
modes = {
'Endocardial' : 0,
'Epicardial' : 1,
'Mid-myocardial' : 2,
}
for name, mode in modes.items():

# Change mode in simulation
s.set_constant('cell.mode', mode)

# Pre-pace for a few beats
s.pre(50 * 1000)

# Run a logged simulation
d = s.run(500, log=variables)

# Display the simulated membrane potential
plt.plot(d['engine.time'], d['membrane.V'], label=name)

# Reset the simulation
s.reset()

plt.legend(loc='upper right')
plt.show()

0 comments on commit 0040765

Please sign in to comment.