# IOM.ode (IOM 2.0 model)
#
% Integrated oscillator model computer code for the publication "Oscillations in K(ATP) Conductance 
% Drive Slow Calcium Oscillations in Pancreatic Beta-Cells" by I. Marinelli, B. M. Thompson,
% V. S. Parekh, P. A. Fletcher, L. Gerardo-Giorda, A. S. Sherman, L. S. Satin, and R. Bertram.
% Published in Biophysical Journal, 121:1449-1464, 2022.

% Variables:
%    v -- cellular membrane potential (mV)
%    n -- activation of delayed rectifier
%    c -- free cytosolic calcium concentration (muM)
%    adp -- cytosolic ADP concentration (muM)
%    cer -- concentration of free calcium in the endoplasmic reticulum (muM)
%    cam -- mitocondrial calcium concentration (muM)
%    f6p -- fructose 6-phosphate concentration (muM)
%    fbp -- fructose 1,6-bisphosphate concentration (muM)
%    adpm -- mitocondrial ADP concentration (muM)
%    nadhm -- mitocondrial NADH concentration (muM)
%    psim -- mitocondrial membrane potential (mV)


# Units:
# time: ms
# volume: l
# conductance: pS
# V: mV
# I: fA
# J: muM/ms
# alpha: mumol/fA/ms



# Initial conditions

v(0)=-45
n(0)=0
c(0)=0.1
cer(0)=320
cam(0)=1
adp(0)=970
f6p(0)=14
fbp(0)=84
adpm(0)=14200
nadhm(0)=4150
psim(0)=170



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Electrical and Calcium Model %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Ca2+ current, ica
num gca = 1000, vca = 25,
num nim = -20, sm = 12,

minf = 1/(1+exp((nim-v)/sm))
ica=gca*minf*(v-vca)


% Delayed-rectifying K+ current, ik
num gk=2700, vk=-75,
num taun=20, nin=-16, sn=5,

ninf=1/(1+exp((nin-v)/sn))
ik=gk*n*(v-vk)


%  Ca2+-activated K+ current, ikca
num kd=0.5,
par gkca=150,

qinf=c^2/(kd^2+c^2)
ikca=-gkca*qinf*(vk-v)


% K-atp channel current, ikatp
num kdd=17, ktd=26, ktt=1,
num atot=3000,
num gkatpbar=19700,

rad=sqrt(-4*adp^2+(atot-adp)^2)
atp=(atot+rad-adp)/2
mgadp=0.165*adp
adp3m=0.135*adp
atp4m=0.05*atp
topo=0.08+0.89*mgadp^2/kdd^2+0.16*mgadp/kdd
bottomo=(1+mgadp/kdd)^2*(1+atp4m/ktt +adp3m/ktd)
katpo=topo/bottomo

ikatp=gkatpbar*katpo*(v-vk)


% Ca2+ fluxes across the plasma membrane (L- and R-type)
num alpha=5.18E-18, vcyt=1.15E-12, kpmca=0.2

Jmem=-(alpha/vcyt*ica + kpmca*c)


% Ca2+ fluxes into ER
num kserca=0.4, pleak=2.0E-4,

Jer=kserca*c - pleak*(cer-c)


# Uniporter [uM/ms]
num p21=0.013, p22=1.6

Juni=(p21*psim-p22)*c^2

# Na/Ca exchanger [uM/ms]
num p23=0.0015 p24=0.016

JNaCa=p23*(cam-c)*exp(p24*psim)

# Ca2+ fluxes into the mitochondria
Jm=Juni-JNaCa



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%        Metabolic Model       %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Glucokinase reaction rate
num vgk=0.0037, kgk=19e3, ngk=2
par G = 11e3,

Jgk=vgk/(1+(kgk/G)^ngk)

% PFK reaction rate, Jpfk_m
amp=adp^2/atp

%  Parameters
%  k1--Kd for AMP binding
%  k2--Kd for FBP binding
%  k3--Kd for F6P binding
%  k4--Kd for atp binding

% alpha=1 -- AMP bound
% beta=1 -- FBP bound
% gamma=1 -- F6P bound
% delta=1 -- atp bound

num k1M=30, k2M=1, k3M=50000, k4M=1000,
num fampM=0.02, fatpM=20, ffbpM=0.2, fbtM=20, fmtM=20,
num kpfkM =0.06, 
par vpfkM=0.01,

% (alpha,beta,gamma,delta)
% (0,0,0,0)
weight1M=1
topa1M=0
bottom1M=1

% (0,0,0,1)
weight2M=atp^2/k4M
topa2M=topa1M
bottom2M=bottom1M+weight2M

% (0,0,1,0)
weight3M=f6p^2/k3M
topa3M=topa2M+weight3M
bottom3M=bottom2M+weight3M

% (0,0,1,1)
weight4M=(f6p*atp)^2/(fatpM*k3M*k4M)
topa4M=topa3M+weight4M
bottom4M=bottom3M+weight4M

% (0,1,0,0)
weight5M=fbp/k2M
topa5M=topa4M
bottom5M=bottom4M+weight5M

% (0,1,0,1)
weight6M=(fbp*atp^2)/(k2M*k4M*fbtM)
topa6M=topa5M
bottom6M=bottom5M+weight6M

% (0,1,1,0)
weight7M=(fbp*f6p^2)/(k2M*k3M*ffbpM)
topa7M=topa6M+weight7M
bottom7M=bottom6M+weight7M

% (0,1,1,1)
weight8M=(fbp*f6p^2*atp^2)/(k2M*k3M*k4M*ffbpM*fbtM*fatpM)
topa8M=topa7M+weight8M
bottom8M=bottom7M+weight8M

% (1,0,0,0)
weight9M=amp/k1M
topa9M=topa8M
bottom9M=bottom8M+weight9M

% (1,0,0,1)
weight10M=(amp*atp^2)/(k1M*k4M*fmtM)
topa10M=topa9M
bottom10M=bottom9M+weight10M

% (1,0,1,0)
weight11M=(amp*f6p^2)/(k1M*k3M*fampM)
topa11M=topa10M+weight11M
bottom11M=bottom10M+weight11M

% (1,0,1,1)
weight12M=(amp*f6p^2*atp^2)/(k1M*k3M*k4M*fampM*fmtM*fatpM)
topa12M=topa11M+weight12M
bottom12M=bottom11M+weight12M

% (1,1,0,0)
weight13M=(amp*fbp)/(k1M*k2M)
topa13M=topa12M
bottom13M=bottom12M+weight13M

% (1,1,0,1)
weight14M=(amp*fbp*atp^2)/(k1M*k2M*k4M*fbtM*fmtM)
topa14M=topa13M
bottom14M=bottom13M+weight14M

% (1,1,1,0)
weight15M=(amp*fbp*f6p^2)/(k1M*k2M*k3M*ffbpM*fampM)
topa15M=topa14M
topbM=weight15M
bottom15M=bottom14M+weight15M

% (1,1,1,1)
weight16M=(amp*fbp*f6p^2*atp^2)/(k1M*k2M*k3M*k4M*ffbpM*fampM*fbtM*fmtM*fatpM)
topa16M=topa15M+weight16M
bottom16M=bottom15M+weight16M

Jpfk_m= vpfkM*(topbM + kpfkM*topa16M)/bottom16M


% PFK reaction rate, Jpfk C
num k1C=30, k2C=2, k3C=50000, k4C=100,
num fampC=0.02, fatpC=20, ffbpC=0.2, fbtC=20, fmtC=20,
num kpfkC =0.06, 
par vpfkC=0.01,

% (alpha,beta,gamma,delta)
% (0,0,0,0)
weight1C=1
topa1C=0
bottom1C=1

% (0,0,0,1)
weight2C=atp^2/k4C
topa2C=topa1C
bottom2C=bottom1C+weight2C

% (0,0,1,0)
weight3C=f6p^2/k3C
topa3C=topa2C+weight3C
bottom3C=bottom2C+weight3C

% (0,0,1,1)
weight4C=(f6p*atp)^2/(fatpC*k3C*k4C)
topa4C=topa3C+weight4C
bottom4C=bottom3C+weight4C

% (0,1,0,0)
weight5C=fbp/k2C
topa5C=topa4C
bottom5C=bottom4C+weight5C

% (0,1,0,1)
weight6C=(fbp*atp^2)/(k2C*k4C*fbtC)
topa6C=topa5C
bottom6C=bottom5C+weight6C

% (0,1,1,0)
weight7C=(fbp*f6p^2)/(k2C*k3C*ffbpC)
topa7C=topa6C+weight7C
bottom7C=bottom6C+weight7C

% (0,1,1,1)
weight8C=(fbp*f6p^2*atp^2)/(k2C*k3C*k4C*ffbpC*fbtC*fatpC)
topa8C=topa7C+weight8C
bottom8C=bottom7C+weight8C

% (1,0,0,0)
weight9C=amp/k1C
topa9C=topa8C
bottom9C=bottom8C+weight9C

% (1,0,0,1)
weight10C=(amp*atp^2)/(k1C*k4C*fmtC)
topa10C=topa9C
bottom10C=bottom9C+weight10C

% (1,0,1,0)
weight11C=(amp*f6p^2)/(k1C*k3C*fampC)
topa11C=topa10C+weight11C
bottom11C=bottom10C+weight11C

% (1,0,1,1)
weight12C=(amp*f6p^2*atp^2)/(k1C*k3C*k4C*fampC*fmtC*fatpC)
topa12C=topa11C+weight12C
bottom12C=bottom11C+weight12C

% (1,1,0,0)
weight13C=(amp*fbp)/(k1C*k2C)
topa13C=topa12C
bottom13C=bottom12C+weight13C

% (1,1,0,1)
weight14C=(amp*fbp*atp^2)/(k1C*k2C*k4C*fbtC*fmtC)
topa14C=topa13C
bottom14C=bottom13C+weight14C

% (1,1,1,0) -- the most active state of the enzyme
weight15C=(amp*fbp*f6p^2)/(k1C*k2C*k3C*ffbpC*fampC)
topa15C=topa14C
topbC=weight15C
bottom15C=bottom14C+weight15C

% (1,1,1,1)
weight16C=(amp*fbp*f6p^2*atp^2)/(k1C*k2C*k3C*k4C*ffbpC*fampC*fbtC*fmtC*fatpC)
topa16C=topa15C+weight16C
bottom16C=bottom15C+weight16C

Jpfk_c= vpfkC*(topbC + kpfkC*topa16C)/bottom16C


Jpfk=Jpfk_m+Jpfk_c


% PDH reaction rate, Jgpdh
num kCaPDH=1.5,

sinfty= cam/(cam+kCaPDH)

Jgpdh=sinfty*sqrt(fbp)


% Adenine nucleotide translocator, Jant
num amtot=15000,
num p19=0.6, p20=2, 
num FRT=.037,

atpm = amtot-adpm
Jant = p19/(1+p20*adpm/atpm)*exp(FRT/2* psim)

% Hydrolysis, Jhyd 
num khyd=1.864e-06, khydbas=6.48e-7,

Jhyd = (khyd*c+khydbas)*atp




%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%      Mitochondria Model      %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Phosphorylation. In uM/ms.
num p13=10000,  p14=190,    p15=8.5, p16=4,

b2=(p16*p13)/(p13+atpm)
JF1F0=b2/(1+exp((p14-psim)/p15))

% Respiration (uM/ms)
num p4=5.28, p5=250, p6=165, p7=5,

JO=p4*nadhm/(p5+nadhm)/(1+exp((psim-p6)/p7))


% Pyruvate dehydrogenase (PDH) (uM/ms)
num nadmtot=10000, KNADHmPDH =1.3, 
par vpdh=.4 

nadm=nadmtot-nadhm

Jpdh=vpdh*Jgpdh/(KNADHmPDH +nadhm/nadm)


% Other dehydrogenase (DH) (uM/ms)
num vdh=1.1, kCaDH=0.08, KNADHmDH =1.3,  

Jdh = vdh*cam/(cam+kCaDH)/(KNADHmDH +nadhm/nadm)


% H+ leakage through mitochondrial inner membrane (uM/ms)
num p17=0.0014, p18=0.02,

JHleak=p17*psim-p18


% Proton pumping due to respiration  (uM/ms)
num p8=7.4, p9=100, p10=165, p11=5,

JHres=p8*nadhm/(p9+nadhm)/(1+exp((psim-p10)/p11))


% Proton flux due to atpase (uM/ms)
JHatp=3*JF1F0



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%      Differential Equations    %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% The Electrical and Calcium Module
num Cm=5300, fca=0.01, sigmam=290, sigmaer=31,

v'=-(ica + ik + ikca + ikatp)/Cm
n'=-(n-ninf)/taun
c'= fca*(Jmem -  Jm/sigmam - Jer)
cer'=fca*sigmaer*Jer
cam'=fca*Jm


% Metabolic Model
num Cmito=180 


adp'= Jhyd - Jant/sigmam
f6p'=0.3*(Jgk-Jpfk)
fbp'=(Jpfk-Jpdh/2/sigmam)
adpm'= Jant-JF1F0
nadhm' = Jpdh+ Jdh -JO
psim' = (JHres-JHatp-Jant-JHleak-JNaCa-2*Juni)/Cmito


############################################
#         XPP: numerical details	   #
############################################


@ meth=cvode, toler=1.0e-10, atoler=1.0e-10, dt=10,
@ total=900000,  maxstor=20000,bounds=10000000
@ xp=tmin, yp=v,xlo=0, xhi=15, ylo=-70, yhi=-10

aux tmin=t/60000

done