Caffeine Effects

Caffeine increase RyR opening sensitivity to luminal and subspace calcium.

In this model, we decrease the mid saturation sub-SR calcium concentration for the opening rate.

using ModelingToolkit
using OrdinaryDiffEq, SteadyStateDiffEq, DiffEqCallbacks
using Plots
using CSV
using DataFrames
using Dates
using CaMKIIModel
using CaMKIIModel: second
Plots.default(lw=1.5)
sys = build_neonatal_ecc_sys(simplify=true, reduce_iso=true, reduce_camk=true)
tend = 500second
prob = ODEProblem(sys, [], tend)
stimstart = 100second
stimend = 300second
alg = KenCarp47()
function add_coffee_affect!(integrator)
    integrator.ps[sys.RyRsensitivity] = 10
end
add_coffee_affect! (generic function with 1 method)
@unpack Istim = sys
callback = build_stim_callbacks(Istim, stimend; period=1second, starttime=stimstart)
SciMLBase.CallbackSet{Tuple{}, Tuple{SciMLBase.DiscreteCallback{DiffEqCallbacks.PresetTimeFunction{StepRange{Int64, Int64}, typeof(SciMLBase.INITIALIZE_DEFAULT), CaMKIIModel.var"#20#21"{Float64, Float64, Symbolics.Num}}, CaMKIIModel.var"#20#21"{Float64, Float64, Symbolics.Num}, DiffEqCallbacks.PresetTimeFunction{StepRange{Int64, Int64}, typeof(SciMLBase.INITIALIZE_DEFAULT), CaMKIIModel.var"#20#21"{Float64, Float64, Symbolics.Num}}, typeof(SciMLBase.FINALIZE_DEFAULT), Nothing, Tuple{}}, SciMLBase.DiscreteCallback{DiffEqCallbacks.PresetTimeFunction{StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}, typeof(SciMLBase.INITIALIZE_DEFAULT), CaMKIIModel.var"#22#23"{Float64, Float64, Symbolics.Num}}, CaMKIIModel.var"#22#23"{Float64, Float64, Symbolics.Num}, DiffEqCallbacks.PresetTimeFunction{StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}, typeof(SciMLBase.INITIALIZE_DEFAULT), CaMKIIModel.var"#22#23"{Float64, Float64, Symbolics.Num}}, typeof(SciMLBase.FINALIZE_DEFAULT), Nothing, Tuple{}}}}((), (SciMLBase.DiscreteCallback{DiffEqCallbacks.PresetTimeFunction{StepRange{Int64, Int64}, typeof(SciMLBase.INITIALIZE_DEFAULT), CaMKIIModel.var"#20#21"{Float64, Float64, Symbolics.Num}}, CaMKIIModel.var"#20#21"{Float64, Float64, Symbolics.Num}, DiffEqCallbacks.PresetTimeFunction{StepRange{Int64, Int64}, typeof(SciMLBase.INITIALIZE_DEFAULT), CaMKIIModel.var"#20#21"{Float64, Float64, Symbolics.Num}}, typeof(SciMLBase.FINALIZE_DEFAULT), Nothing, Tuple{}}(DiffEqCallbacks.PresetTimeFunction{StepRange{Int64, Int64}, typeof(SciMLBase.INITIALIZE_DEFAULT), CaMKIIModel.var"#20#21"{Float64, Float64, Symbolics.Num}}(100000:1000:300000, true, SciMLBase.INITIALIZE_DEFAULT, CaMKIIModel.var"#20#21"{Float64, Float64, Symbolics.Num}(-80.0, 0.5, Istim(t))), CaMKIIModel.var"#20#21"{Float64, Float64, Symbolics.Num}(-80.0, 0.5, Istim(t)), DiffEqCallbacks.PresetTimeFunction{StepRange{Int64, Int64}, typeof(SciMLBase.INITIALIZE_DEFAULT), CaMKIIModel.var"#20#21"{Float64, Float64, Symbolics.Num}}(100000:1000:300000, true, SciMLBase.INITIALIZE_DEFAULT, CaMKIIModel.var"#20#21"{Float64, Float64, Symbolics.Num}(-80.0, 0.5, Istim(t))), SciMLBase.FINALIZE_DEFAULT, Bool[1, 1], nothing, ()), SciMLBase.DiscreteCallback{DiffEqCallbacks.PresetTimeFunction{StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}, typeof(SciMLBase.INITIALIZE_DEFAULT), CaMKIIModel.var"#22#23"{Float64, Float64, Symbolics.Num}}, CaMKIIModel.var"#22#23"{Float64, Float64, Symbolics.Num}, DiffEqCallbacks.PresetTimeFunction{StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}, typeof(SciMLBase.INITIALIZE_DEFAULT), CaMKIIModel.var"#22#23"{Float64, Float64, Symbolics.Num}}, typeof(SciMLBase.FINALIZE_DEFAULT), Nothing, Tuple{}}(DiffEqCallbacks.PresetTimeFunction{StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}, typeof(SciMLBase.INITIALIZE_DEFAULT), CaMKIIModel.var"#22#23"{Float64, Float64, Symbolics.Num}}(100000.5:1000.0:300000.5, true, SciMLBase.INITIALIZE_DEFAULT, CaMKIIModel.var"#22#23"{Float64, Float64, Symbolics.Num}(0.0, 0.5, Istim(t))), CaMKIIModel.var"#22#23"{Float64, Float64, Symbolics.Num}(0.0, 0.5, Istim(t)), DiffEqCallbacks.PresetTimeFunction{StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}, typeof(SciMLBase.INITIALIZE_DEFAULT), CaMKIIModel.var"#22#23"{Float64, Float64, Symbolics.Num}}(100000.5:1000.0:300000.5, true, SciMLBase.INITIALIZE_DEFAULT, CaMKIIModel.var"#22#23"{Float64, Float64, Symbolics.Num}(0.0, 0.5, Istim(t))), SciMLBase.FINALIZE_DEFAULT, Bool[1, 1], nothing, ())))

Add caffeine at t = 200 econd

callback_caf = CallbackSet(build_stim_callbacks(Istim, stimend; period=1second, starttime=stimstart), PresetTimeCallback(200.0second, add_coffee_affect!))
SciMLBase.CallbackSet{Tuple{}, Tuple{SciMLBase.DiscreteCallback{DiffEqCallbacks.PresetTimeFunction{StepRange{Int64, Int64}, typeof(SciMLBase.INITIALIZE_DEFAULT), CaMKIIModel.var"#20#21"{Float64, Float64, Symbolics.Num}}, CaMKIIModel.var"#20#21"{Float64, Float64, Symbolics.Num}, DiffEqCallbacks.PresetTimeFunction{StepRange{Int64, Int64}, typeof(SciMLBase.INITIALIZE_DEFAULT), CaMKIIModel.var"#20#21"{Float64, Float64, Symbolics.Num}}, typeof(SciMLBase.FINALIZE_DEFAULT), Nothing, Tuple{}}, SciMLBase.DiscreteCallback{DiffEqCallbacks.PresetTimeFunction{StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}, typeof(SciMLBase.INITIALIZE_DEFAULT), CaMKIIModel.var"#22#23"{Float64, Float64, Symbolics.Num}}, CaMKIIModel.var"#22#23"{Float64, Float64, Symbolics.Num}, DiffEqCallbacks.PresetTimeFunction{StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}, typeof(SciMLBase.INITIALIZE_DEFAULT), CaMKIIModel.var"#22#23"{Float64, Float64, Symbolics.Num}}, typeof(SciMLBase.FINALIZE_DEFAULT), Nothing, Tuple{}}, SciMLBase.DiscreteCallback{DiffEqCallbacks.PresetTimeFunction{Vector{Float64}, typeof(SciMLBase.INITIALIZE_DEFAULT), typeof(Main.var"##277".add_coffee_affect!)}, typeof(Main.var"##277".add_coffee_affect!), DiffEqCallbacks.PresetTimeFunction{Vector{Float64}, typeof(SciMLBase.INITIALIZE_DEFAULT), typeof(Main.var"##277".add_coffee_affect!)}, typeof(SciMLBase.FINALIZE_DEFAULT), Nothing, Tuple{}}}}((), (SciMLBase.DiscreteCallback{DiffEqCallbacks.PresetTimeFunction{StepRange{Int64, Int64}, typeof(SciMLBase.INITIALIZE_DEFAULT), CaMKIIModel.var"#20#21"{Float64, Float64, Symbolics.Num}}, CaMKIIModel.var"#20#21"{Float64, Float64, Symbolics.Num}, DiffEqCallbacks.PresetTimeFunction{StepRange{Int64, Int64}, typeof(SciMLBase.INITIALIZE_DEFAULT), CaMKIIModel.var"#20#21"{Float64, Float64, Symbolics.Num}}, typeof(SciMLBase.FINALIZE_DEFAULT), Nothing, Tuple{}}(DiffEqCallbacks.PresetTimeFunction{StepRange{Int64, Int64}, typeof(SciMLBase.INITIALIZE_DEFAULT), CaMKIIModel.var"#20#21"{Float64, Float64, Symbolics.Num}}(100000:1000:300000, true, SciMLBase.INITIALIZE_DEFAULT, CaMKIIModel.var"#20#21"{Float64, Float64, Symbolics.Num}(-80.0, 0.5, Istim(t))), CaMKIIModel.var"#20#21"{Float64, Float64, Symbolics.Num}(-80.0, 0.5, Istim(t)), DiffEqCallbacks.PresetTimeFunction{StepRange{Int64, Int64}, typeof(SciMLBase.INITIALIZE_DEFAULT), CaMKIIModel.var"#20#21"{Float64, Float64, Symbolics.Num}}(100000:1000:300000, true, SciMLBase.INITIALIZE_DEFAULT, CaMKIIModel.var"#20#21"{Float64, Float64, Symbolics.Num}(-80.0, 0.5, Istim(t))), SciMLBase.FINALIZE_DEFAULT, Bool[1, 1], nothing, ()), SciMLBase.DiscreteCallback{DiffEqCallbacks.PresetTimeFunction{StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}, typeof(SciMLBase.INITIALIZE_DEFAULT), CaMKIIModel.var"#22#23"{Float64, Float64, Symbolics.Num}}, CaMKIIModel.var"#22#23"{Float64, Float64, Symbolics.Num}, DiffEqCallbacks.PresetTimeFunction{StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}, typeof(SciMLBase.INITIALIZE_DEFAULT), CaMKIIModel.var"#22#23"{Float64, Float64, Symbolics.Num}}, typeof(SciMLBase.FINALIZE_DEFAULT), Nothing, Tuple{}}(DiffEqCallbacks.PresetTimeFunction{StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}, typeof(SciMLBase.INITIALIZE_DEFAULT), CaMKIIModel.var"#22#23"{Float64, Float64, Symbolics.Num}}(100000.5:1000.0:300000.5, true, SciMLBase.INITIALIZE_DEFAULT, CaMKIIModel.var"#22#23"{Float64, Float64, Symbolics.Num}(0.0, 0.5, Istim(t))), CaMKIIModel.var"#22#23"{Float64, Float64, Symbolics.Num}(0.0, 0.5, Istim(t)), DiffEqCallbacks.PresetTimeFunction{StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}, typeof(SciMLBase.INITIALIZE_DEFAULT), CaMKIIModel.var"#22#23"{Float64, Float64, Symbolics.Num}}(100000.5:1000.0:300000.5, true, SciMLBase.INITIALIZE_DEFAULT, CaMKIIModel.var"#22#23"{Float64, Float64, Symbolics.Num}(0.0, 0.5, Istim(t))), SciMLBase.FINALIZE_DEFAULT, Bool[1, 1], nothing, ()), SciMLBase.DiscreteCallback{DiffEqCallbacks.PresetTimeFunction{Vector{Float64}, typeof(SciMLBase.INITIALIZE_DEFAULT), typeof(Main.var"##277".add_coffee_affect!)}, typeof(Main.var"##277".add_coffee_affect!), DiffEqCallbacks.PresetTimeFunction{Vector{Float64}, typeof(SciMLBase.INITIALIZE_DEFAULT), typeof(Main.var"##277".add_coffee_affect!)}, typeof(SciMLBase.FINALIZE_DEFAULT), Nothing, Tuple{}}(DiffEqCallbacks.PresetTimeFunction{Vector{Float64}, typeof(SciMLBase.INITIALIZE_DEFAULT), typeof(Main.var"##277".add_coffee_affect!)}([200000.0], true, SciMLBase.INITIALIZE_DEFAULT, Main.var"##277".add_coffee_affect!), Main.var"##277".add_coffee_affect!, DiffEqCallbacks.PresetTimeFunction{Vector{Float64}, typeof(SciMLBase.INITIALIZE_DEFAULT), typeof(Main.var"##277".add_coffee_affect!)}([200000.0], true, SciMLBase.INITIALIZE_DEFAULT, Main.var"##277".add_coffee_affect!), SciMLBase.FINALIZE_DEFAULT, Bool[1, 1], nothing, ())))

Single-dose caffeine

@time sol = solve(prob, alg; callback)
@time sol_caf = solve(prob, alg; callback=callback_caf)
 12.633932 seconds (25.88 M allocations: 1.205 GiB, 2.54% gc time, 88.28% compilation time)
  5.716069 seconds (12.63 M allocations: 636.076 MiB, 2.85% gc time, 74.81% compilation time)
retcode: Success
Interpolation: 3rd order Hermite
t: 8775-element Vector{Float64}:
      0.0
      0.019333125036189135
      0.09098129266634847
      0.2073558192440938
      0.45611905918185225
      1.0472561699066012
      2.034266647380669
      3.451776427609829
      6.733791989961038
     12.450116263175316
      ⋮
 400587.17244288063
 410672.0368411475
 421716.443324556
 434008.4864986264
 450151.06172503775
 462974.2378146922
 480604.5598697531
 498234.88192481396
 500000.0
u: 8775-element Vector{Vector{Float64}}:
 [150952.75035000002, 13838.37602, -68.79268, 0.12113, 0.12113, 0.12113, 0.12113, 0.12113, 0.12113, 0.12113  …  0.26081, 0.00977, 0.00188, 0.09243, 0.22156, 0.966, 0.00702, 830.0, 830.0, 0.0026]
 [150952.7504077194, 13838.375711519522, -68.79732946230298, 0.12113191852582894, 0.12113014215363435, 0.12113000811850629, 0.12113000037367251, 0.12113000001389385, 0.12113000000038378, 0.12113000000000405  …  0.2608055799108062, 0.009769882842059355, 0.001879826176063952, 0.09242766669597557, 0.22156399388113623, 0.9660018276404354, 0.007020208561337872, 829.9999654017552, 829.9994975880237, 0.002598565958899963]
 [150952.75062244057, 13838.374513299239, -68.81607005191516, 0.12115248970118196, 0.1211362425322048, 0.12113143375859055, 0.12113027926808573, 0.12113004704056185, 0.12113000693480994, 0.12113000089551389  …  0.26078941009444856, 0.009769459049748559, 0.0018789042446954408, 0.09241901973935228, 0.22157879451042628, 0.9660085993316152, 0.007020089860306167, 829.9998348635114, 829.9976422525888, 0.0025933105248854755]
 [150952.75097402377, 13838.372555328504, -68.84681913016406, 0.12118951551659114, 0.12115723909937218, 0.12114109135468039, 0.12113403405625273, 0.12113131833041359, 0.12113038966338784, 0.12113010483009534  …  0.26076387070239837, 0.009768805322611648, 0.0018766436939500898, 0.0924049756352414, 0.2216028323583001, 0.9660195931783199, 0.007017234889934603, 829.9996133960518, 829.994650615981, 0.0025849478342343003]
 [150952.75173733698, 13838.368384399799, -68.91207315641022, 0.12125418994387863, 0.12120713812645283, 0.12117519662003212, 0.12115494410637355, 0.12114295934129514, 0.12113633873221374, 0.12113292110192488  …  0.26071223836757207, 0.009767542947102269, 0.0018699196276109342, 0.09237495783324366, 0.22165420751509649, 0.9660430730972362, 0.007003014308459902, 829.9990964775621, 829.988344553044, 0.0025677078039993283]
 [150952.7536153353, 13838.35855929409, -69.06429957869561, 0.12136450206928298, 0.12130632550551596, 0.12125925927771784, 0.12122229799402218, 0.12119414514255993, 0.12117335984945683, 0.12115849268947793  …  0.2606050783338445, 0.009765228548992247, 0.0018505337735948652, 0.09230364341434424, 0.22177624782601593, 0.9660987611295794, 0.006946470410797191, 829.9976227532394, 829.9738229183572, 0.0025298083788575705]
 [150952.75694915676, 13838.342403295292, -69.31024282857501, 0.12149196511970106, 0.12142927819778737, 0.12137426378703478, 0.12132672247869893, 0.1212862809045654, 0.12125242556881116, 0.12122454121012068  …  0.2604711491247151, 0.00976340307695454, 0.0018178174457210692, 0.09218462778413179, 0.2219798988931877, 0.9661914345838197, 0.0068337541864747905, 829.9944193672545, 829.9509077882478, 0.0024748079842550523]
 [150952.7621562011, 13838.31972312405, -69.6463744385697, 0.12162015425254309, 0.12155743298067635, 0.1214998898139605, 0.12144759469396454, 0.12140052117081253, 0.12135855486728582, 0.12132150440206332  …  0.260364872984163, 0.009765046552185823, 0.0017738156970858972, 0.09201383582103524, 0.22227216393618593, 0.9663239342804539, 0.006675512085568874, 829.988353326151, 829.9205247588947, 0.002410689405003596]
 [150952.775988694, 13838.26949390594, -70.35063780004249, 0.1218044794708126, 0.12174768441638649, 0.12169340182120132, 0.12164180993517575, 0.12159304918027178, 0.1215472228133069, 0.12150439831755229  …  0.2604150766477604, 0.009786689195736801, 0.0016855899200154505, 0.09161908334733312, 0.22294828820039625, 0.9666286957411055, 0.006355039752058078, 829.9689941847354, 829.8589858081657, 0.0023106557375668943]
 [150952.805292636, 13838.188823477813, -71.35304497334123, 0.1219637836290695, 0.12191937751661326, 0.12187579036470503, 0.12183318571381517, 0.121791716909196, 0.12175152664970906, 0.12171274671582151  …  0.2610441779341529, 0.009873892897153878, 0.0015688569001333977, 0.0909342247513693, 0.22412560286423527, 0.9671554511479012, 0.005926150137179693, 829.9235249884752, 829.7704141511887, 0.0022289950468852237]
 ⋮
 [151617.6721535657, 13261.110667479206, -69.79225167053124, 0.1325221979717982, 0.132522204382789, 0.13252220646396246, 0.13252220412954366, 0.1325221972902945, 0.1325221858533368, 0.13252216972196482  …  0.0012318423618775888, 0.001643718168625632, 0.0025443428535454, 0.001656203071793411, 0.9997122890233477, 0.9997103648157714, 0.00656466634412082, 51.35035762828857, 50.04435262026561, 0.11540775193511303]
 [151662.9879752568, 13215.804925046217, -69.70312180949293, 0.131983366461505, 0.1319833712301869, 0.13198337188699114, 0.13198336835020308, 0.1319833605348091, 0.1319833483523281, 0.131983331710633  …  0.0012489523885114637, 0.0016546381403705237, 0.002561242077211787, 0.0016775235927954943, 0.9997066413958409, 0.9997047465570211, 0.006604558518661044, 51.643439892030806, 50.34746636268715, 0.11383518468026321]
 [151710.31081566488, 13168.491903234488, -69.6089131746109, 0.13142868134634703, 0.13142868467262805, 0.1314286841147414, 0.13142867959525906, 0.13142867103362663, 0.1314286583460037, 0.13142864144509442  …  0.0012672914658826515, 0.0016662609452580848, 0.002579229091468866, 0.0017003492498439577, 0.9997005534803245, 0.9996986879349226, 0.006646999939007071, 51.949601077590465, 50.66392305411805, 0.11222930295044094]
 [151760.28068790052, 13118.531647179892, -69.50817373094033, 0.1308518754976597, 0.13085187735826848, 0.1308518755733321, 0.1308518700699367, 0.13085186077222422, 0.13085184760124233, 0.1308518304747839  …  0.0012872064236735322, 0.001678777003036867, 0.002598597671906317, 0.0017250963262110913, 0.9996939005837538, 0.9996920719317256, 0.006692672384212308, 52.27267944053172, 50.997674633414285, 0.11057337573326233]
 [151821.82646278222, 13056.996672923546, -69.38224811312766, 0.13015432327468537, 0.1301543236035545, 0.13015432057854823, 0.13015431413231887, 0.13015430419479934, 0.130154290693064, 0.13015427355118145  …  0.0013125386707786813, 0.0016945524394969829, 0.0026230101947698004, 0.0017565223535506123, 0.9996853749370719, 0.9996835983402228, 0.006750199684255491, 52.67000714781783, 51.40786423732755, 0.10858998141650147]
 [151867.62501813233, 13011.205430628646, -69.28717908308758, 0.12964459994157349, 0.12964459932361097, 0.12964459556707722, 0.12964458860877048, 0.12964457838293664, 0.1296445648211392, 0.12964454785212073  …  0.0013319964539834374, 0.0017065593056818725, 0.0026415906353146504, 0.0017806193126586318, 0.9996787798396902, 0.999677046581359, 0.0067939560952560854, 52.9649942182638, 51.71221835891223, 0.10715391457341128]
 [151926.42873137927, 12952.410233493902, -69.16334984784426, 0.12900203554024262, 0.12900203392332746, 0.12900202944102715, 0.12900202203543654, 0.12900201164631184, 0.12900199821095165, 0.1290019816640701  …  0.0013577749540215204, 0.0017223261622834455, 0.0026659895420971568, 0.0018124910486030871, 0.9996699797349621, 0.9996683084099126, 0.006851383836216736, 53.34253537054025, 52.10152974719724, 0.1053596348652069]
 [151980.74986964298, 12898.096139985208, -69.0471540851359, 0.1284205478510465, 0.12842054550205362, 0.12842054053662058, 0.1284205329017036, 0.1284205225421167, 0.1284205094004224, 0.12842049341681566  …  0.0013824173214118276, 0.001737250573655858, 0.0026890845193417575, 0.001842902842210461, 0.999661502233689, 0.9996598946246117, 0.0069057015023179374, 53.689698955584255, 52.45930821099058, 0.10375134702789969]
 [151985.95509768082, 12892.891550033253, -69.03592818364125, 0.1283654253836479, 0.12836542294070472, 0.12836541790275915, 0.12836541021724843, 0.12836539982948525, 0.12836538668254985, 0.12836537071717455  …  0.001384826394391675, 0.0017386993522701595, 0.0026913263755978427, 0.0018458735227868846, 0.9996606716431385, 0.9996590676711052, 0.006910972986398997, 53.72285348641842, 52.49346753552087, 0.10359963780741116]
i = (sys.t / 1000, sys.vm)
plot(sol, idxs=i, title="Action potential", lab="Ctl", tspan=(198second, 205second))
plot!(sol_caf, idxs=i, lab="Caf", tspan=(198second, 205second), ylabel="Voltage (mV)", xlabel="Time (s)")

i = (sys.t / 1000, sys.Cai_sub_SR * 1000)
plot(sol, idxs=i, title="Calcium transient (During caffeine addition)", lab="Ctl", tspan=(198second, 205second))
plot!(sol_caf, idxs=i, tspan=(198second, 205second), lab="Caf", ylabel="Subspace calcium (nM)", xlabel="Time (s)")

i = (sys.t / 1000, sys.PO1RyR)
plot(sol, idxs=i, title="RyR open (During caffeine addition)", lab="Ctl", tspan=(198second, 205second))
plot!(sol_caf, idxs=i, tspan=(198second, 205second), lab="Caf", ylabel="Open probability", ylims=(0, 1), xlabel="Time (s)")

i = (sys.t / 1000, sys.Cai_sub_SR * 1000)
plot(sol, idxs=i, title="Calcium transient (After caffeine addition)", lab="Ctl", ylabel="Subspace calcium (nM)", tspan=(198second, 205second))
plot!(sol_caf, idxs=i, lab="Caf", xlabel="Time (s)", tspan=(198second, 205second))

i = (sys.t / 1000, sys.CaJSR)
plot(sol, idxs=i, title="SR Calcium (During caffeine addition)", lab="Ctl", ylabel="SR calcium (μM)", tspan=(198second, 205second))
plot!(sol_caf, idxs=i, tspan=(198second, 205second), lab="Caf", ylims=(0, 850), xlabel="Time (s)")

i = (sys.t / 1000, sys.Jrel)
plot(sol, idxs=sys.Jrel, title="Ca flux", lab="Ctl  (Jrel)", tspan=(198second, 205second))
plot!(sol_caf, idxs=sys.Jrel, lab="Caf (Jrel)", tspan=(198second, 205second), ylabel="μM/ms", xlabel="Time (s)")

i = (sys.t / 1000, sys.CaMKAct * 100)
plot(sol, idxs=i, title="Active CaMKII", lab="Ctl")
plot!(sol_caf, idxs=i, lab="Caf", ylabel="CaMKII activity (%)", xlabel="Time (s)")

Caffeine and electrophysiology

  • Add caffeine in the beginning of the simulation.
  • Add caffeine and nifedipine in the beginning of the simulation (nifedipine blocks 90% of L-type calcium channel).
sys = build_neonatal_ecc_sys(simplify=true, reduce_iso=true, reduce_camk=true)
tend = 205second
stimstart = 30second
stimend = 120second
alg = KenCarp47()
@unpack Istim = sys
callback = build_stim_callbacks(Istim, stimend; period=1second, starttime=stimstart)
SciMLBase.CallbackSet{Tuple{}, Tuple{SciMLBase.DiscreteCallback{DiffEqCallbacks.PresetTimeFunction{StepRange{Int64, Int64}, typeof(SciMLBase.INITIALIZE_DEFAULT), CaMKIIModel.var"#20#21"{Float64, Float64, Symbolics.Num}}, CaMKIIModel.var"#20#21"{Float64, Float64, Symbolics.Num}, DiffEqCallbacks.PresetTimeFunction{StepRange{Int64, Int64}, typeof(SciMLBase.INITIALIZE_DEFAULT), CaMKIIModel.var"#20#21"{Float64, Float64, Symbolics.Num}}, typeof(SciMLBase.FINALIZE_DEFAULT), Nothing, Tuple{}}, SciMLBase.DiscreteCallback{DiffEqCallbacks.PresetTimeFunction{StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}, typeof(SciMLBase.INITIALIZE_DEFAULT), CaMKIIModel.var"#22#23"{Float64, Float64, Symbolics.Num}}, CaMKIIModel.var"#22#23"{Float64, Float64, Symbolics.Num}, DiffEqCallbacks.PresetTimeFunction{StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}, typeof(SciMLBase.INITIALIZE_DEFAULT), CaMKIIModel.var"#22#23"{Float64, Float64, Symbolics.Num}}, typeof(SciMLBase.FINALIZE_DEFAULT), Nothing, Tuple{}}}}((), (SciMLBase.DiscreteCallback{DiffEqCallbacks.PresetTimeFunction{StepRange{Int64, Int64}, typeof(SciMLBase.INITIALIZE_DEFAULT), CaMKIIModel.var"#20#21"{Float64, Float64, Symbolics.Num}}, CaMKIIModel.var"#20#21"{Float64, Float64, Symbolics.Num}, DiffEqCallbacks.PresetTimeFunction{StepRange{Int64, Int64}, typeof(SciMLBase.INITIALIZE_DEFAULT), CaMKIIModel.var"#20#21"{Float64, Float64, Symbolics.Num}}, typeof(SciMLBase.FINALIZE_DEFAULT), Nothing, Tuple{}}(DiffEqCallbacks.PresetTimeFunction{StepRange{Int64, Int64}, typeof(SciMLBase.INITIALIZE_DEFAULT), CaMKIIModel.var"#20#21"{Float64, Float64, Symbolics.Num}}(30000:1000:120000, true, SciMLBase.INITIALIZE_DEFAULT, CaMKIIModel.var"#20#21"{Float64, Float64, Symbolics.Num}(-80.0, 0.5, Istim(t))), CaMKIIModel.var"#20#21"{Float64, Float64, Symbolics.Num}(-80.0, 0.5, Istim(t)), DiffEqCallbacks.PresetTimeFunction{StepRange{Int64, Int64}, typeof(SciMLBase.INITIALIZE_DEFAULT), CaMKIIModel.var"#20#21"{Float64, Float64, Symbolics.Num}}(30000:1000:120000, true, SciMLBase.INITIALIZE_DEFAULT, CaMKIIModel.var"#20#21"{Float64, Float64, Symbolics.Num}(-80.0, 0.5, Istim(t))), SciMLBase.FINALIZE_DEFAULT, Bool[1, 1], nothing, ()), SciMLBase.DiscreteCallback{DiffEqCallbacks.PresetTimeFunction{StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}, typeof(SciMLBase.INITIALIZE_DEFAULT), CaMKIIModel.var"#22#23"{Float64, Float64, Symbolics.Num}}, CaMKIIModel.var"#22#23"{Float64, Float64, Symbolics.Num}, DiffEqCallbacks.PresetTimeFunction{StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}, typeof(SciMLBase.INITIALIZE_DEFAULT), CaMKIIModel.var"#22#23"{Float64, Float64, Symbolics.Num}}, typeof(SciMLBase.FINALIZE_DEFAULT), Nothing, Tuple{}}(DiffEqCallbacks.PresetTimeFunction{StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}, typeof(SciMLBase.INITIALIZE_DEFAULT), CaMKIIModel.var"#22#23"{Float64, Float64, Symbolics.Num}}(30000.5:1000.0:120000.5, true, SciMLBase.INITIALIZE_DEFAULT, CaMKIIModel.var"#22#23"{Float64, Float64, Symbolics.Num}(0.0, 0.5, Istim(t))), CaMKIIModel.var"#22#23"{Float64, Float64, Symbolics.Num}(0.0, 0.5, Istim(t)), DiffEqCallbacks.PresetTimeFunction{StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}, typeof(SciMLBase.INITIALIZE_DEFAULT), CaMKIIModel.var"#22#23"{Float64, Float64, Symbolics.Num}}(30000.5:1000.0:120000.5, true, SciMLBase.INITIALIZE_DEFAULT, CaMKIIModel.var"#22#23"{Float64, Float64, Symbolics.Num}(0.0, 0.5, Istim(t))), SciMLBase.FINALIZE_DEFAULT, Bool[1, 1], nothing, ())))
prob = ODEProblem(sys, [], tend)
prob_caf = ODEProblem(sys, [sys.RyRsensitivity => 10], tend)
gCaL = prob.ps[sys.GCaL]
prob_nif_caf = ODEProblem(sys, [sys.RyRsensitivity => 10, sys.GCaL => 0.1 * gCaL], tend)
ODEProblem with uType Vector{Float64} and tType Int64. In-place: true
Initialization status: FULLY_DETERMINED
Non-trivial mass matrix: false
timespan: (0, 205000)
u0: 75-element Vector{Float64}:
 150952.75035000002
  13838.37602
    -68.79268
      0.12113
      0.12113
      0.12113
      0.12113
      0.12113
      0.12113
      0.12113
      ⋮
      0.00977
      0.00188
      0.09243
      0.22156
      0.966
      0.00702
    830.0
    830.0
      0.0026
ssalg = DynamicSS(alg)
sprob_caf = SteadyStateProblem(prob_caf)
sssol = solve(sprob_caf, ssalg; abstol=1e-10, reltol=1e-10)
@time sol = solve(prob, alg; callback)
@time sol_caf = solve(remake(prob_caf, u0=sssol.u), alg; callback)
@time sol_nif_caf = solve(remake(prob_nif_caf, u0=sssol.u), alg; callback)
  0.641827 seconds (40.40 k allocations: 8.517 MiB)
  0.734673 seconds (262.46 k allocations: 19.717 MiB, 16.65% compilation time)
  0.365194 seconds (33.50 k allocations: 6.023 MiB)
retcode: Success
Interpolation: 3rd order Hermite
t: 2780-element Vector{Float64}:
      0.0
      0.1842534873335197
      0.9882055188022214
      4.071300105743449
     11.46900186131331
     25.16338690114804
     49.586696135833876
     83.36469509718691
    137.50489806596687
    206.1852813740233
      ⋮
 144181.40044345165
 149368.99310265717
 154556.5857618627
 161066.6259670236
 169004.11034420526
 178027.67723395213
 187359.8648310832
 196692.05242821426
 205000.0
u: 2780-element Vector{Vector{Float64}}:
 [152639.94761227045, 12238.942757397597, -67.47396433611877, 0.12238817311680106, 0.12238817307131052, 0.1223881730153614, 0.12238817294873454, 0.12238817287120204, 0.12238817278252669, 0.1223881726824614  …  0.0017638185946388608, 0.0019523246562955633, 0.0030218685175343353, 0.0023071187832082334, 0.9995225710895046, 0.9995225567425388, 0.007684615013844905, 57.61878253229813, 56.496447195063126, 0.08793891571082607]
 [152639.9476151647, 12238.942754582311, -67.47634492914032, 0.12238224641177696, 0.12238562284610366, 0.12238720608397068, 0.12238784775322656, 0.12238807475481202, 0.1223881459592237, 0.12238816600476685  …  0.0017638189657217494, 0.0019523244858729008, 0.00302173297549581, 0.0023071186898395335, 0.999522571094748, 0.9995225568065113, 0.0076844199220871675, 57.61878254717648, 56.4964472103141, 0.08793891565813786]
 [152639.94763004576, 12238.942745386948, -67.48660275467175, 0.12236228294323004, 0.12236894813709157, 0.12237426845661249, 0.12237839166017583, 0.12238148674865504, 0.12238373439559999, 0.12238531274422637  …  0.0017638289114208176, 0.001952306769611815, 0.003019855423778388, 0.002307116060768331, 0.999522571257221, 0.999522558585259, 0.007680973269778515, 57.61878261209499, 56.49644727685842, 0.0879389154282442]
 [152639.94772127908, 12238.942777420309, -67.52401709294061, 0.12231952657893981, 0.1223280060272859, 0.12233574482129371, 0.12234276227907565, 0.12234908299755752, 0.12235473704512904, 0.12235975929649111  …  0.0017639745565072454, 0.0019518859200031821, 0.003011456622383584, 0.0023070737582966045, 0.9995225739047888, 0.9995225870648313, 0.0076617400796119145, 57.61878286109118, 56.49644753202852, 0.08793891455404655]
 [152639.948143689, 12238.943296180534, -67.60292490506043, 0.12224985450452353, 0.12225980616900507, 0.12226926625919536, 0.12227824074968414, 0.12228673676108079, 0.12229476261355123, 0.12230232781718876  …  0.0017647651472341352, 0.0019490344457414144, 0.002993744671977521, 0.002306784457396661, 0.999522592064516, 0.9995227802068377, 0.007620246755716887, 57.61878134439485, 56.49644837984488, 0.08793797767172823]
 [152639.94955009065, 12238.945643300141, -67.71513275732605, 0.12214418789077937, 0.12215567350952664, 0.1221667911054568, 0.12217754300474033, 0.12218793191830166, 0.12219796093838317, 0.12220763353354598  …  0.0017666529569479244, 0.0019399375642142828, 0.00296869037938559, 0.0023056883315503295, 0.9995226610663476, 0.9995235011417192, 0.0075616007802768075, 57.618683992040985, 56.49647661006278, 0.0879030948910816]
 [152639.9534339808, 12238.952787050403, -67.83705046824768, 0.12197838564641761, 0.12199115692803908, 0.12200364543361603, 0.12201585058736526, 0.122027771906919, 0.1220394089951436, 0.12205076153202142  …  0.001768732581112402, 0.0019217034647746438, 0.0029416342621734113, 0.0023025598250926527, 0.9995228595794539, 0.9995255079239352, 0.007498363651743943, 57.61792778244574, 56.49689257700209, 0.08768668000196324]
 [152639.96035398968, 12238.965557825279, -67.91477596653165, 0.1217687218378652, 0.12178188084405037, 0.12179479929744542, 0.12180747497143551, 0.12181990560517472, 0.12183208889729649, 0.12184402249930189  …  0.0017683613969484088, 0.0019035685719416481, 0.0029244728501103922, 0.002297039565808314, 0.9995232162737105, 0.999528921433131, 0.0074583383979672435, 57.61637679312471, 56.49863587073305, 0.08722289556138607]
 [152639.9728651334, 12238.987211378573, -67.9596695600288, 0.12145339059471848, 0.12146612935944416, 0.12147864644130138, 0.12149093895093122, 0.12150300391471154, 0.12151483826946623, 0.12152643885684662  …  0.0017641273548924586, 0.0018905545845160903, 0.002914620314837385, 0.0022874154591201556, 0.9995238609945655, 0.9995345420849698, 0.007435393338943663, 57.61529870899692, 56.50426168111628, 0.08638562459197568]
 [152639.98956008165, 12239.012630132596, -67.98548181278267, 0.12107420557249216, 0.12108609783242402, 0.12109777531642388, 0.12110923501625916, 0.12112047382916853, 0.1211314885526442, 0.12114227587890589  …  0.001757231937828993, 0.0018848559832253754, 0.00290901943986905, 0.002275303633027282, 0.9995247195254381, 0.9995410566777767, 0.007422318092474494, 57.61837272058786, 56.516004486460766, 0.08533786494606932]
 ⋮
 [152693.2074453716, 12185.542168921005, -68.08132962500648, 0.11569596945148176, 0.11569596336491347, 0.1156959572902504, 0.11569595122698956, 0.11569594517457588, 0.11569593913240005, 0.11569593309979662  …  0.0016062625722719022, 0.001866381768336728, 0.0028888398245998804, 0.0021163703508802817, 0.9989428080985531, 0.9995806998072164, 0.007374065101433706, 62.65257735202688, 61.64617635201456, 0.07224453700284583]
 [152692.89014941553, 12185.858852537434, -68.08199041794144, 0.11570158910066995, 0.11570159002167044, 0.11570159098989342, 0.11570159200698583, 0.1157015930746105, 0.11570159419444723, 0.1157015953681936  …  0.0016062010395583002, 0.0018662893454196115, 0.0028886878699441827, 0.002116187067604739, 0.9994207217493472, 0.999581238564467, 0.007373599163332546, 62.652030267207834, 61.64550223116818, 0.07225822055932507]
 [152692.57989813064, 12186.16911849403, -68.0827403539054, 0.11570401667766199, 0.11570401624578135, 0.11570401588581213, 0.11570401559900978, 0.11570401538668999, 0.11570401525023158, 0.11570401519107938  …  0.0016059401327626747, 0.0018661853394566156, 0.002888537014623283, 0.0021159470853455895, 0.9995408848543886, 0.9995811960460409, 0.00737334996729846, 62.650575485111546, 61.64400858582507, 0.07226370217438609]
 [152692.20026456375, 12186.54880207241, -68.08356823777021, 0.11570823447694491, 0.1157082350392502, 0.11570823566142832, 0.11570823634477696, 0.1157082370906459, 0.1157082379004395, 0.11570823877561984  …  0.001605661743535772, 0.0018660708246905375, 0.002888360652521107, 0.002115692724918859, 0.9995739077745273, 0.9995813374866669, 0.007372973906300987, 62.647255662718784, 61.64061581180716, 0.0722730734086232]
 [152691.75077118538, 12186.998419588883, -68.08459119683008, 0.1157125334149529, 0.11571253353539068, 0.11571253371659326, 0.11571253395980446, 0.11571253426631845, 0.11571253463748232, 0.11571253507469896  …  0.001605470926803373, 0.001865930531083147, 0.0028881407716935645, 0.002115391810555277, 0.9995804494231403, 0.9995814760863402, 0.007372409628770736, 62.64358159501091, 61.63686954599688, 0.07228263563455846]
 [152691.2594622746, 12187.48984783358, -68.0856871159076, 0.11571754933506354, 0.11571754975281572, 0.11571755022771239, 0.11571755076089212, 0.11571755135354082, 0.11571755200689389, 0.11571755272223917  …  0.0016051989839617016, 0.0018657790973638704, 0.002887912719324305, 0.0021150688067349474, 0.9995813978353131, 0.9995822349318872, 0.007372094059008344, 62.639357381620535, 61.63255844614218, 0.07229429308517941]
 [152690.77080610738, 12187.978566165897, -68.08675947034179, 0.1157228073740943, 0.11572280856207907, 0.11572280980195686, 0.11572281109487802, 0.11572281244204147, 0.11572281384469707, 0.11572281530414813  …  0.001604972064835488, 0.0018656315277028105, 0.002887676609115267, 0.002114744902377923, 0.9995816508548507, 0.9995818344237153, 0.007371366798063157, 62.63539351393768, 61.62850573903295, 0.0723051892590556]
 [152690.3021603527, 12188.447369952117, -68.08783556104159, 0.1157271502030507, 0.11572715065936831, 0.11572715116598267, 0.11572715172401621, 0.11572715233463526, 0.11572715299905233, 0.11572715371852851  …  0.0016046605327419568, 0.001865481179378588, 0.002887445935060914, 0.002114411832025996, 0.9995816097279979, 0.999581700629839, 0.007370795011849131, 62.63140064980453, 61.624441517242836, 0.07231460657804817]
 [152689.9011637686, 12188.848455073303, -68.08873047469021, 0.11573115006179692, 0.11573115036165645, 0.11573115071153657, 0.1157311511125161, 0.11573115156571595, 0.11573115207230124, 0.11573115263348373  …  0.0016044340885045902, 0.001865357203053836, 0.002887254661161352, 0.0021141387946666187, 0.9995817066300824, 0.9995816960245095, 0.007370390013937238, 62.62807694276679, 61.621050547133414, 0.07232336907105383]
i = (sys.t / 1000, sys.vm)
tspan = (100second, 102second)
plot(sol, idxs=i, title="Action potential", lab="Ctl"; tspan)
plot!(sol_caf, idxs=i, lab="Caf"; tspan)
plot!(sol_nif_caf, idxs=i, lab="Caf + Nif", tspan=tspan, ylabel="Voltage (mV)", xlabel="Time (s)")

savefig("caf-ap.pdf")
"/home/github/actions-runner-1/_work/camkii-cardiomyocyte-model/camkii-cardiomyocyte-model/docs/caf-ap.pdf"
i = (sys.t / 1000, sys.Cai_sub_SR * 1000)
tspan = (100second, 102second)
plot(sol, idxs=i, title="Calcium transient", lab="Ctl"; tspan)
plot!(sol_caf, idxs=i, lab="Caf"; tspan)
plot!(sol_nif_caf, idxs=i, lab="Caf + Nif", ylabel="Subspace calcium (nM)", xlabel="Time (s)"; tspan)

savefig("caf-cat.pdf")
"/home/github/actions-runner-1/_work/camkii-cardiomyocyte-model/camkii-cardiomyocyte-model/docs/caf-cat.pdf"
i = (sys.t / 1000, sys.CaJSR)
tspan = (100second, 102second)
plot(sol, idxs=i, title="SR Calcium", lab="Ctl", ylabel="SR calcium (μM)"; tspan)
plot!(sol_caf, idxs=i, lab="Caf"; tspan)
plot!(sol_nif_caf, idxs=i, lab="Caf + Nif", ylims=(0, 850), xlabel="Time (s)"; tspan)

CaMKII activities

Simulations

i = (sys.t / 1000, sys.CaMKAct * 100)
plot(sol, idxs=i, title="Simulation", lab="Ctl")
plot!(sol_caf, idxs=i, lab="Caf")
plot!(sol_nif_caf, idxs=i, lab="Caf + Nif", ylabel="CaMKII active fraction (%)", xlabel="Time (s)")

savefig("caf-camkact.pdf")
"/home/github/actions-runner-1/_work/camkii-cardiomyocyte-model/camkii-cardiomyocyte-model/docs/caf-camkact.pdf"

Experiments

chemicaldf = CSV.read(joinpath(@__DIR__, "data/CaMKAR-chemical.csv"), DataFrame)
ts = Dates.value.(chemicaldf[!, "Time"]) ./ 10^9
ctl = chemicaldf[!, "Ctrl Mean"]
ctl_error = chemicaldf[!, "Ctrl SD"] ./ sqrt.(chemicaldf[!, "Ctrl N"])

caf = chemicaldf[!, "caffeine 20mM Mean"]
caf_error = chemicaldf[!, "caffeine 20mM SD"] ./ sqrt.(chemicaldf[!, "caffeine 20mM N"])

plot(ts, ctl, yerr=ctl_error, lab="Control", color=:blue, markerstrokecolor=:blue)
plot!(ts, caf, yerr=caf_error, lab="Caffeine 20mM", color=:red, markerstrokecolor=:red)
plot!(xlabel="Time (s)", ylabel="CaMKII activity (A.U.)", title= "Experiment")

savefig("caf-exp.pdf")
"/home/github/actions-runner-1/_work/camkii-cardiomyocyte-model/camkii-cardiomyocyte-model/docs/caf-exp.pdf"

Runtime information

using InteractiveUtils
InteractiveUtils.versioninfo()
Julia Version 1.12.4
Commit 01a2eadb047 (2026-01-06 16:56 UTC)
Build Info:
  Official https://julialang.org release
Platform Info:
  OS: Linux (x86_64-linux-gnu)
  CPU: 12 × Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz
  WORD_SIZE: 64
  LLVM: libLLVM-18.1.7 (ORCJIT, skylake)
  GC: Built with stock GC
Threads: 2 default, 1 interactive, 2 GC (on 12 virtual cores)
Environment:
  JULIA_CI = true
  JULIA_CONDAPKG_OFFLINE = true
  LD_LIBRARY_PATH = /home/github/actions-runner-1/_work/_tool/Python/3.14.2/x64/lib
  JULIA_NUM_THREADS = 2
  JULIA_PROJECT = /home/github/actions-runner-1/_work/camkii-cardiomyocyte-model/camkii-cardiomyocyte-model/Project.toml
  JULIA_DEPOT_PATH = /home/github/.julia:/home/github/actions-runner-1/_work/_tool/julia/1.12.4/x64/local/share/julia:/home/github/actions-runner-1/_work/_tool/julia/1.12.4/x64/share/julia
  JULIA_CONDAPKG_BACKEND = Null
  JULIA_LOAD_PATH = @:@v#.#:@stdlib
using Pkg
Pkg.status()
Project CaMKIIModel v0.7.0
Status `~/actions-runner-1/_work/camkii-cardiomyocyte-model/camkii-cardiomyocyte-model/Project.toml`
  [336ed68f] CSV v0.10.15
  [5a033b19] CurveFit v1.4.0
  [a93c6f00] DataFrames v1.8.1
  [459566f4] DiffEqCallbacks v4.12.0
  [f6369f11] ForwardDiff v1.3.2
  [23fbe1c1] Latexify v0.16.10
  [2fda8390] LsqFit v0.15.1
⌅ [961ee093] ModelingToolkit v10.32.1
  [77ba4419] NaNMath v1.1.3
  [1dea7af3] OrdinaryDiffEq v6.108.0
  [91a5bcdd] Plots v1.41.5
  [2913bbd2] StatsBase v0.34.10
  [9672c7b4] SteadyStateDiffEq v2.9.0
Info Packages marked with ⌅ have new versions available but compatibility constraints restrict them from upgrading. To see why use `status --outdated`

This notebook was generated using Literate.jl.

Back to top