# R code of the oxidative stress model in the Appendix of # the manuscript: 'Computational modeling of oxidative stress in fatty livers elucidates the underlying mechanism of the increased susceptibility to ischemia/reperfusion injury' # by J. Schleicher, U. Dahmen (2018) # code developed in 2018 # with R version: 3.4.2 # in RStudio (version: 1.1.383) ## packages: #### install.packages('FME') install.packages('sfsmisc') library(FME) library(sfsmisc) ## mathematical model: #### #described in Appendix A of the publication MathModel <- function (t,y,parameter_vector) { with(as.list(c(y,parameter_vector)), { #-Lipid submodel: v_FAuptake <- k_FAup * FA_blood * TG_ss/(k_TG + TG_cell) #uptake rate of fatty acids from blood into hepatocytes v_O2uptake <- (v_max_O2up * O2_blood)/(K_M_O2up + O2_blood) #uptake rate of oxygen from blood into hepatocytes HIFterm <- (v_max_HIF * O2_cell^n_oxid)/(K_M_HIF + O2_cell^n_oxid) #sigmoidal activation of HIF under Hypoxia (depending on oxygen conc.) v_oxid <- (k_oxid * FA_cell * O2_cell)/( (K_O2_oxid + O2_cell) * (K_FA_oxid + FA_cell) ) * HIFterm #fatty acid oxidation rate v_O2degrad <- k_O2_degrad * O2_cell #other oxidative processes in the cells (consuming oxygen) v_TGsyn <- k_for_TGsyn * 3 * FA_cell - ( k_back_TGsyn * (TG_cell ^ n_TGsyn) ) #synthesis rate of triglycerides v_TGex <- ((v_TGex * TG_cell)/(K_TGex + TG_cell)) #export rate of triglycerides #-ROS submodel: v_H2O2prod <- k_H2O2prod * (v_oxid^n_H2O2prod)/(K_M_H2O2prod+O2_cell) #H2O2 production rate v_CAT <- 2 * k_CAT * E_CAT * H2O2_cell * exp(-k_inh * H2O2_cell)/(1+(MDA_cell/K_i_CAT)^n_CAT) #degradation rate of H2O2 by the enzyme catalase v_GPx <- (v_max_GPx * H2O2_cell * GSH)/( (K_M_GSH + GSH)*(K_M_H2O2 + H2O2_cell)*(1+(MDA_cell/K_i_GPx)^n_GPx) ) #degradation rate of H2O2 by the enzyme glutathione peroxidase v_OH <- k_OH * H2O2_cell #production rate of the hydroxyl radical v_MDA <- k_MDA * v_OH * TG_cell^n_MDA #production rate of malondialdehyde (i.e. lipid peroxidation rate) v_MDArep <- k_MDArep * MDA_cell #damage repair mechanisms #-State variables: dFA_cell <- v_FAuptake - v_oxid - v_TGsyn dO2_cell <- v_O2uptake - v_oxid - v_O2degrad - v_H2O2prod dTG_cell <- v_TGsyn - v_TGex dH2O2_cell <- v_H2O2prod - v_CAT - v_GPx - v_OH dMDA_cell <- v_MDA - v_MDArep #-Model output (i.e. function return): list(c(dFA_cell, dO2_cell, dTG_cell, dH2O2_cell, dMDA_cell), FAuptakerate=v_FAuptake, O2uptakerate=v_O2uptake, oxidrate=v_oxid, O2degradrate=v_O2degrad, TGsynrate=v_TGsyn, TGexrate=v_TGex, H2O2prodrate=v_H2O2prod, catrate=v_CAT, gpxrate=v_GPx, OHrate=v_OH, MDAsynrate=v_MDA, MDAreprate=v_MDArep, HIFterm=HIFterm) #end list } ) } ## initial conditions: #### aini <- c(FA_cell=0, O2_cell=0, TG_cell=0, H2O2_cell=0, MDA_cell=0) ## parameter values: #### #sources of values see Table A1 in the Appendix of the publication ParValues<-c(#-Lipid parameters: FA_blood = 0.1, #mM; range: 0.1 (low) - 1.4 (high) k_FAup=35.937, #1/h O2_blood = 8.9, #mM; normoxia: 8.9 mM, hypoxia: 0.001 mM v_max_O2up = 143.85, #mM/h K_M_O2up = 0.001, #mM k_O2_degrad = 500, #1/h k_oxid = 25.2, #mM/h K_O2_oxid = 0.001, #mM K_FA_oxid = 0.122, #mM k_for_TGsyn = 9.972427, #1/h k_back_TGsyn = 2.712017e-05, #1/h n_TGsyn = 4.942853, #dl (dimensionless) k_TG = 8.936555e-02, #mM TG_ss = 6.654673, #mM v_TGex = 1.55, #mM/h K_TGex = 6.061116, #mM #-ROS parameters: k_H2O2prod = 0.396, #mM/h n_H2O2prod = 0.65, #dl K_M_H2O2prod = 0.08, #mM k_CAT = 5400000, #1/mM*h E_CAT = 0.0012, #mM k_inh = 0.05, #1/mM v_max_GPx = 4.5, #mM/h GSH = 8, #mM K_M_GSH = 1.33, #mM K_M_H2O2 = 0.00009, #mM k_OH = 10, #1/h k_MDA = 0.3, #1/mM k_MDArep = 0.068, #1/h n_MDA = 0.1, #dl K_i_CAT = 0.1, #mM K_i_GPx = 0.07, #mM n_CAT = 4, #dl n_GPx = 4, #dl #-HIF term: v_max_HIF = 1, #mM/h n_oxid = 2.5, #dl K_M_HIF = 0.0005 #mM ) #end parameter values ## model simulation by deSolve over time: #### results<-ode(y=aini, func=MathModel, time=seq(0,600,1), parms=ParValues, method="bdf") plot(results) #simple plot all results consecutively (state variable concentrations and pathway rates) ## bistability plot (normoxia): #### #Figure 3 in the publication# #function returns time course starting from different initial [MDA] for transfered FA_blood value iniMDA<-function(fablood, time) #range of initial MDA concentrations from 0.01-60mM { ParValues["FA_blood"]<-fablood #determines FA_blood value aini <- c(FA_cell=0, O2_cell=0, TG_cell=0, H2O2_cell=0, MDA_cell=0.01) #increased MDA_cell initial value res1 <- ode(y=aini, times=time, func=MathModel, parms=ParValues, method = "bdf") aini <- c(FA_cell=0, O2_cell=0, TG_cell=0, H2O2_cell=0, MDA_cell=0.09) res2 <- ode(y=aini, times=time, func=MathModel, parms=ParValues, method = "bdf") aini <- c(FA_cell=0, O2_cell=0, TG_cell=0, H2O2_cell=0, MDA_cell=0.13) res3 <- ode(y=aini, times=time, func=MathModel, parms=ParValues, method = "bdf") aini <- c(FA_cell=0, O2_cell=0, TG_cell=0, H2O2_cell=0, MDA_cell=0.16) res4 <- ode(y=aini, times=time, func=MathModel, parms=ParValues, method = "bdf") aini <- c(FA_cell=0, O2_cell=0, TG_cell=0, H2O2_cell=0, MDA_cell=1) res5 <- ode(y=aini, times=time, func=MathModel, parms=ParValues, method = "bdf") aini <- c(FA_cell=0, O2_cell=0, TG_cell=0, H2O2_cell=0, MDA_cell=60) res6 <- ode(y=aini, times=time, func=MathModel, parms=ParValues, method = "bdf") #put MDA together in one dataframe for plotting: dataMDA<-data.frame(res1=res1[,6], res2=res2[,6], res3=res3[,6], res4=res4[,6], res5=res5[,6], res6=res6[,6]) return(dataMDA) } #plot results of the function iniMDA for 3 different FA_blood values: time<-seq(0,120,1) #determine simulation time par(mar=c(5, 4.5, 4, 1) ) #plot parameters (plot spacing) par(mfrow=c(1,3)) #plot parameters (three separate plots) #1.plot - low FA_blood value: FAbloodValue<-0.2 RES1<-iniMDA(FAbloodValue, time) #function call ymin<-min(RES1) ymax<-max(RES1) matplot(x=time,y=RES1, type="l", xlab="simulation time", ylab="MDA concentration (mM)", ylim=c(ymin,ymax), las=1, log="y", yaxt='n', cex.lab=1.8, cex.axis=1.5, col="black", lty=1:6, lwd=2, main="(A) plasma FA conc. = 0.2 mM", cex.main=1.5) eaxis(side=2, at=c(10^-2,10^-1, 1, 10^1, 10^2),cex.axis=1.5) #log axis legend("right", legend=c("60 mM","1 mM","0.16 mM","0.13 mM","0.09 mM","0.01 mM"), title="initial MDA conc.", lty=6:1,col="black", lwd=2, cex=1.8) #2.plot - middle FA_blood value: FAbloodValue<-0.8 RES2<-iniMDA(FAbloodValue, time) #function call matplot(x=time,y=RES2, type="l", xlab="simulation time", ylab="", ylim=c(ymin,ymax), las=1, log="y", yaxt='n',cex.lab=1.8, cex.axis=1.5, col="black", lty=1:6, lwd=2, main="(B) plasma FA conc. = 0.8 mM", cex.main=1.5) eaxis(side=2, at=c(10^-2,10^-1, 1, 10^1, 10^2),cex.axis=1.5) #log axis #3.plot - very high FA_blood value: FAbloodValue<-1.4 RES3<-iniMDA(FAbloodValue, time) #function call matplot(x=time,y=RES3, type="l", xlab="simulation time", ylab="", ylim=c(ymin,ymax), las=1, log="y", yaxt='n',cex.lab=1.8, cex.axis=1.5, col="black", lty=1:6, lwd=2, main="(C) plasma FA conc. = 1.4 mM", cex.main=1.5) eaxis(side=2, at=c(10^-2,10^-1, 1, 10^1, 10^2),cex.axis=1.5) #log axis par(mfrow=c(1,1)) #end - set back plot to one ## bistability over hypoxia and reoxygenation: #### #Figure 8 in the publication# #-First step: Run under hypoxic conditions: #matrix of FA_blood values for which the model should run: FAValues<-matrix(c( 0.2,0.4,0.7,0.9,1.0,1.1,1.2,1.3,1.4 ), nrow=9, ncol=1 ) ParsHypoxicCond <- ParValues #use new name for the parameter value list ParsHypoxicCond["O2_blood"] <- 0.001 #set hypoxic conditions res_vector<-0 for(i in 1:nrow(FAValues)) { ParsHypoxicCond["FA_blood"]<-FAValues[i] out<-ode(y=aini, times=seq(0,250,1), func=MathModel, parms=ParsHypoxicCond, method="bdf") #saving results: if(i==1) res_vector<-cbind(out[,6]) else res_vector<-cbind(res_vector,out[,6]) } #-Second step: Run under reoxygenation conditions: timevector<-c(30,80,150,160,170,200) #hypoxic time duration which should be plotted ParsReoxyCond<-ParValues #use new name for the parameter value list ParsReoxyCond["FA_blood"]<-1.1 #set specific FA_blood value #simulate Hypoxia: ParsReoxyCond["O2_blood"]<-0.001 #simulate hypoxia event res_HX<-ode(y=aini, times=seq(0,250,1), func=MathModel, parms=ParsReoxyCond, method = "bdf") ParsReoxyCond["O2_blood"]<-8.9 #set back to normal oxygen concentration (i.e. reoxygenation) #Reperfusion simulation starting from different hypoxia times: for (j in 1:length(timevector)) { y_new_aini<-res_HX[timevector[j],c(2:6)] #save concentrations of state variables after simulations of hypoxia for specific time period = starting condition for reoxygenation res_RX<-ode(y=y_new_aini, times=seq(0,160,1), func=MathModel, parms=ParsReoxyCond, method = "bdf") #saving results: if(j==1) dataMDA<-cbind(times=seq(0,160,1), MDA=res_RX[,6]) else dataMDA<-cbind(dataMDA, MDA=res_RX[,6]) } #-Third step: plotting par(mfrow=c(1,2)) par(mar=c(5, 4.5, 4, 1) ) #1.plot: hypoxic conditions matplot(res_vector, type="l", log="y", las=1, xlab="simulation time", ylab="MDA concentration (mM)", main="(A) Hypoxia", yaxt='n', col="black", lwd=2.5, cex.lab=1.5, cex.axis=1.2, lty=c("solid", "dashed", "dotted", "dotdash", "longdash", "twodash", "4C884C88", "12121212", "28282828") ) eaxis(side=2, at=c(10^-2,10^-1, 1, 10^1, 10^2),cex.axis=1.2) legend("topleft", c("1.4 mM","1.3 mM","1.2 mM","1.1 mM","1.0 mM","0.9 mM","0.7 mM","0.4 mM","0.2 mM"), col="black", lwd=2, title="plasma FA conc.", seg.len = 3, lty=c("28282828","12121212","4C884C88","twodash","longdash","dotdash", "dotted","dashed","solid") ) #2.plot: reoxygenation matplot(x=dataMDA[,1], y=dataMDA[,c(2:ncol(dataMDA))], type="l", log="y", las=1, xlab=" simulation time",ylab="MDA concentration (mM)", col="black", lty=1:6, lwd=2, main="(B) Reoxygenation for plasma FA conc. = 1.1 mM", yaxt='n', cex.axis=1.2, cex.lab=1.5 ) eaxis(side=2, at=c(10^-1, 1, 10^1, 10^2),cex.axis=1.2) legend("right", legend=sort(timevector, decreasing = TRUE), lty=6:1, col="black", lwd=2, title="Hypoxia duration", cex=1.2) par(mfrow=c(1,1))