CorriasBuistICCModified.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #include "CorriasBuistICCModified.hpp"
00037 #include <cmath>
00038 #include <cassert>
00039 #include <memory>
00040 #include "Exception.hpp"
00041 #include "OdeSystemInformation.hpp"
00042 #include "HeartConfig.hpp"
00043
00044 CorriasBuistICCModified::CorriasBuistICCModified(boost::shared_ptr<AbstractIvpOdeSolver> pSolver, boost::shared_ptr<AbstractStimulusFunction> pIntracellularStimulus)
00045 : AbstractCardiacCell(
00046 pSolver,
00047 18,
00048 0,
00049 pIntracellularStimulus)
00050 {
00051
00052 mpSystemInfo = OdeSystemInformation<CorriasBuistICCModified>::Instance();
00053 mFractionOfVDDRInPU = 0.0;
00054 mIP3Concentration = 0.0006;
00055 mScaleFactorSerca = 1.0;
00056 mScaleFactorCarbonMonoxide = 1.0;
00057
00058
00060
00062
00063
00064 Ca_o = 2.5 ;
00065 Cl_o =134.0 ;
00066 K_o =7.0 ;
00067 Na_o =137.0 ;
00068
00069
00070 R = 8314.4 ;
00071 T = 310.0 ;
00072 F = 96484.6;
00073 FoRT = 0.03743;
00074 RToF = 26.7137;
00075
00076 Cm = 25.0*1e-6;
00077
00078 Asurf_in_cm_square = Cm / HeartConfig::Instance()->GetCapacitance();
00079 Asurf = Asurf_in_cm_square / 0.01;
00080
00081 Cl_i = 88.0 ;
00082 K_i = 120.0 ;
00083 Na_i = 30.0 ;
00084 P_cyto = 0.7;
00085 Vol = 1.0e-6 ;
00086 fc = 0.01 ;
00087 fe = 0.01 ;
00088 fm = 0.0003 ;
00089 Q10Ca = 2.1;
00090 Q10K = 1.5;
00091 Q10Na = 2.45 ;
00092 T_exp = 297.0 ;
00093
00094 G_max_BK = 23.0 * 1e-6 / Asurf;
00095 G_max_CaCl = 10.1 * 1e-6 / Asurf;
00096 G_max_ERG = 2.5 * 1e-6 / Asurf;
00097 G_max_Ltype = 2.0 * 1e-6 / Asurf;
00098 G_max_NSCC = 12.15 * 1e-6 / Asurf;
00099 G_max_Na = 20.0 * 1e-6 / Asurf;
00100 G_max_VDDR = 3.0 * 1e-6 / Asurf;
00101 G_max_bk = 0.15 * 1e-6 / Asurf;
00102 G_max_kv11 = 6.3 * 1e-6 / Asurf;
00103
00104 J_max_PMCA = 0.088464e-3 ;
00105 J_max_PMCA_PU = 0.33e-3;
00106 J_ERleak = 1.666667e-3 ;
00107 J_max_leak = 0.0;
00108 Jmax_IP3 = 50000.0e-3 ;
00109 Jmax_NaCa = 0.05e-3;
00110 Jmax_serca = 1.8333e-3 ;
00111 Jmax_uni = 5000.0e-3 ;
00112
00113 NaPerm_o_Kperm = 1.056075 ;
00114 L = 50.0 ;
00115 P_ER = 0.1;
00116 P_PU = 0.001 ;
00117 P_mito = 0.12871;
00118 b = 0.5;
00119 na = 2.8;
00120
00121 K_Ca = 0.003 ;
00122 K_Na = 9.4;
00123 K_act = 0.00038;
00124 K_trans = 0.006 ;
00125 k_serca = 0.00042;
00126 conc = 0.001 ;
00127 d_ACT = 0.001 ;
00128 d_IP3 = 0.00025;
00129 d_INH = 0.0014 ;
00130
00131 tau_d_CaCl = 0.03e3 ;
00132 tau_d_NSCC = 0.35e3 ;
00133 tauh = 4.0e3 ;
00134
00135 deltaPsi_B = 50.0 ;
00136 deltaPsi_star = 91.0 ;
00137 deltaPsi = 164.000044 ;
00138
00140
00142
00143
00144 V_cyto = Vol*P_cyto;
00145 V_MITO = Vol*P_mito;
00146 V_PU = Vol*P_PU;
00147 V_ER = Vol*P_ER;
00148
00149
00150 T_correction_Ca = pow(Q10Ca, (T-T_exp)/10.0);
00151 T_correction_K = pow(Q10K, (T-T_exp)/10.0);
00152 T_correction_Na = pow(Q10Na, (T-T_exp)/10.0);
00153 T_correction_BK = 1.1*(T-T_exp)*1e-6/Asurf;
00154
00155
00156 E_Na = RToF*log(Na_o/Na_i);
00157 E_K = RToF*log(K_o/K_i);
00158 E_Cl = RToF*log(Cl_i/Cl_o);
00159 E_NSCC = RToF*log((K_o+Na_o*NaPerm_o_Kperm)/(K_i+Na_i*NaPerm_o_Kperm));
00160
00161
00162 tau_d_ERG = T_correction_K*0.003*1000.0;
00163 tau_d_Ltype = T_correction_Ca*0.001*1000.0;
00164 tau_d_Na = T_correction_Na*0.003*1000.0;
00165 tau_d_VDDR = T_correction_Ca*0.006*1000.0;
00166 tau_d_kv11 = T_correction_K*0.005*1000.0;
00167
00168
00169 tau_f_Ltype = T_correction_Ca*0.086*1000.0;
00170 tau_f_Na = T_correction_Na*0.0016*1000.0;
00171 tau_f_VDDR = T_correction_Ca*0.04*1000.0;
00172 tau_f_ca_Ltype = T_correction_Ca*0.002*1000.0;
00173 tau_f_kv11 = T_correction_K*0.005*1000.0;
00174
00175
00176 e2FoRTdPsiMdPsiS = exp(-2.0*FoRT*(deltaPsi-deltaPsi_star));
00177 ebFoRTdPsiMdPsiS = exp(b*FoRT*(deltaPsi-deltaPsi_star));
00178
00179
00180 Init();
00181
00182 }
00183
00184 CorriasBuistICCModified::~CorriasBuistICCModified()
00185 {
00186 }
00187
00188 void CorriasBuistICCModified::VerifyStateVariables()
00189 {}
00190
00191 void CorriasBuistICCModified::SetSercaPumpScaleFactor(double scaleFactor)
00192 {
00193 mScaleFactorSerca = scaleFactor;
00194 }
00195
00196 void CorriasBuistICCModified::SetFractionOfVDDRInPU(double fraction)
00197 {
00198 mFractionOfVDDRInPU = fraction;
00199 }
00200
00201 void CorriasBuistICCModified::SetIP3Concentration(double concentration)
00202 {
00203 mIP3Concentration = concentration;
00204 }
00205
00206 void CorriasBuistICCModified::SetCarbonMonoxideScaleFactor(double scaleFactor)
00207 {
00208 mScaleFactorCarbonMonoxide = scaleFactor;
00209 }
00210
00211 double CorriasBuistICCModified::GetCarbonMonoxideScaleFactor()
00212 {
00213 return mScaleFactorCarbonMonoxide;
00214 }
00215
00216 double CorriasBuistICCModified::GetIIonic(const std::vector<double>* pStateVariables)
00217 {
00218 if (!pStateVariables) pStateVariables = &rGetStateVariables();
00219 const std::vector<double>& rY = *pStateVariables;
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240 double E_Ca = 0.5*RToF*log(Ca_o/rY[1]);
00241
00242 double I_Na = G_max_Na*rY[14]*rY[10]*(rY[0]-E_Na);
00243
00244 double I_Ltype = G_max_Ltype*rY[13]*rY[8]*rY[16]*(rY[0]-E_Ca);
00245
00246 double I_VDDR = G_max_VDDR*rY[15]*rY[11]*(rY[0]-E_Ca);
00247
00248 double I_kv11 = mScaleFactorCarbonMonoxide*G_max_kv11*rY[17]*rY[12]*(rY[0]-E_K);
00249
00250 double I_ERG = mScaleFactorCarbonMonoxide*G_max_ERG*rY[7]*(rY[0]-E_K);
00251
00252 double d_BK = 1.0/(1.0+((exp(rY[0]/-17.0))/((rY[1]/0.001)*(rY[1]/0.001))));
00253 double I_BK = (G_max_BK+T_correction_BK)*d_BK*(rY[0]-E_K);
00254
00255 double I_bk = mScaleFactorCarbonMonoxide*G_max_bk*(rY[0]-E_K);
00256
00257 double I_CaCl = G_max_CaCl*rY[6]*(rY[0]-E_Cl);
00258
00259 double I_NSCC = G_max_NSCC*rY[9]*(rY[0]-E_NSCC);
00260
00261 double J_PMCA = J_max_PMCA*1.0/(1.0+(0.000298/rY[1]));
00262
00263
00264 double i_ionic = (I_Na+I_Ltype+I_VDDR+I_kv11+I_ERG+I_BK+I_CaCl+I_NSCC+I_bk+(J_PMCA*2.0*F*V_cyto/Asurf));
00265 assert(!std::isnan(i_ionic));
00269 return i_ionic / 0.01;
00270 }
00271
00272 void CorriasBuistICCModified::EvaluateYDerivatives(double time, const std::vector<double>& rY, std::vector<double>& rDY)
00273 {
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297 double E_Ca = 0.5*RToF*log(Ca_o/rY[1]);
00298
00299
00300 double d_inf_Na = 1.0/(1.0+exp((rY[0]+47.0)/-4.8));
00301 double f_inf_Na = 1.0/(1.0+exp((rY[0]+78.0)/7.0));
00302 double I_Na = G_max_Na*rY[14]*rY[10]*(rY[0]-E_Na);
00303
00304
00305 double d_inf_Ltype = 1.0/(1.0+exp((rY[0]+17.0)/-4.3));
00306 double f_inf_Ltype = 1.0/(1.0+exp((rY[0]+43.0)/8.9));
00307 double f_ca_inf_Ltype = 1.0-1.0/(1.0+exp((rY[1]-0.0001-0.000214)/-0.0000131));
00308 double I_Ltype = G_max_Ltype*rY[13]*rY[8]*rY[16]*(rY[0]-E_Ca);
00309
00310
00311 double d_inf_VDDR = 1.0/(1.0+exp((rY[0]+26.0)/-6.0));
00312 double f_inf_VDDR = 1.0/(1.0+exp((rY[0]+66.0)/6.0));
00313 double I_VDDR = G_max_VDDR*rY[15]*rY[11]*(rY[0]-E_Ca);
00314
00315
00316 double d_inf_kv11 = 1.0/(1.0+exp((rY[0]+25.0)/-7.7));
00317 double f_inf_kv11 = 0.5+0.5/(1.0+exp((rY[0]+44.8)/4.4));
00318 double I_kv11 = mScaleFactorCarbonMonoxide*G_max_kv11*rY[17]*rY[12]*(rY[0]-E_K);
00319
00320
00321 double d_inf_ERG = 0.2+0.8/(1.0+exp((rY[0]+20.0)/-1.8));
00322 double I_ERG = mScaleFactorCarbonMonoxide*G_max_ERG*rY[7]*(rY[0]-E_K);
00323
00324
00325
00326 double d_BK = 1.0/(1.0+((exp(rY[0]/-17.0))/((rY[1]/0.001)*(rY[1]/0.001))));
00327 double I_BK = (G_max_BK+T_correction_BK)*d_BK*(rY[0]-E_K);
00328
00329
00330 double I_bk = mScaleFactorCarbonMonoxide*G_max_bk*(rY[0]-E_K);
00331
00332
00333 double tmp1 = 0.00014/rY[1];
00334 double d_inf_CaCl = 1.0/(1.0+(tmp1*tmp1*tmp1));
00335 double I_CaCl = G_max_CaCl*rY[6]*(rY[0]-E_Cl);
00336
00337
00338 double d_inf_NSCC = 1.0/(1.0+pow(0.0000745/rY[3], -85.0));
00339 double I_NSCC = G_max_NSCC*rY[9]*(rY[0]-E_NSCC);
00340
00341
00342 double J_PMCA = J_max_PMCA*1.0/(1.0+(0.000298/rY[1]));
00343
00344
00345
00346
00347
00348
00349 tmp1 = mIP3Concentration/(mIP3Concentration+d_IP3);
00350 double tmp2 = rY[3]/(rY[3]+d_ACT);
00351 double J_ERout = (Jmax_IP3*tmp1*tmp1*tmp1*tmp2*tmp2*tmp2*rY[5]*rY[5]*rY[5]+J_ERleak)*(rY[2]-rY[3]);
00352 double J_SERCA = mScaleFactorSerca*Jmax_serca*rY[3]*rY[3]/(k_serca*k_serca+rY[3]*rY[3]);
00353
00354
00355
00356
00357
00358
00359 tmp1 = 1.0+rY[3]/K_trans;
00360 double MWC = conc*(rY[3]/K_trans)*tmp1*tmp1*tmp1/(tmp1*tmp1*tmp1*tmp1+L/pow(1.0+rY[3]/K_act, na));
00361 double J_uni = Jmax_uni*(MWC-rY[4]*e2FoRTdPsiMdPsiS)*2.0*FoRT*(deltaPsi-deltaPsi_star)/(1.0-e2FoRTdPsiMdPsiS);
00362
00363
00364 double J_NaCa = Jmax_NaCa*ebFoRTdPsiMdPsiS/((1.0+K_Na*K_Na/(Na_i*Na_i))*(1.0+K_Ca/rY[4]));
00365
00366
00367
00368
00369
00370 double J_leak = J_max_leak*(rY[3]-rY[1]);
00371
00372
00373
00374
00375
00376 double E_Ca_PU = 0.5*RToF*log(Ca_o/rY[3]);
00377 double I_VDDR_PU = G_max_VDDR*rY[11]*rY[15]*(rY[0]-E_Ca_PU);
00378
00379 double J_PMCA_PU = J_max_PMCA_PU*1.0/(1.0+exp(-(rY[3]-0.0001)/0.000015));
00380
00381 double i_stim = GetStimulus(time);
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391 double voltage_derivative;
00392 if (mSetVoltageDerivativeToZero)
00393 {
00394 voltage_derivative = 0.0;
00395 }
00396 else
00397 {
00398 voltage_derivative = (-1.0 / 0.01) * (i_stim + I_Na+I_Ltype+I_VDDR+I_kv11+I_ERG+I_BK+I_CaCl+I_NSCC+I_bk+(J_PMCA*2.0*F*V_cyto/Asurf));
00399 assert(!std::isnan(voltage_derivative));
00400 }
00401
00402 rDY[0] = voltage_derivative;
00403 rDY[1] = fc*((-I_Ltype-I_VDDR)*Asurf/(2.0*F*V_cyto)+J_leak-J_PMCA);
00404 rDY[2] = fe*(J_SERCA-J_ERout);
00405 rDY[3] = fc*((J_NaCa-J_uni)*V_MITO/V_PU+(J_ERout-J_SERCA)*V_ER/V_PU-J_leak*V_cyto/V_PU);
00406 rDY[3]-= fc*(((mFractionOfVDDRInPU*I_VDDR_PU*Asurf)/(2.0*F*V_PU))+J_PMCA_PU);
00407 rDY[4] = fm*(J_uni-J_NaCa);
00408 rDY[5] = 1.0*(d_INH-rY[5]*(rY[3]+d_INH))/tauh;
00409 rDY[6] = (d_inf_CaCl-rY[6])/tau_d_CaCl;
00410 rDY[7] = (d_inf_ERG-rY[7])/tau_d_ERG;
00411 rDY[8] = (d_inf_Ltype-rY[8])/tau_d_Ltype;
00412 rDY[9] = (d_inf_NSCC-rY[9])/tau_d_NSCC;
00413 rDY[10] = (d_inf_Na-rY[10])/tau_d_Na;
00414 rDY[11] = (d_inf_VDDR-rY[11])/tau_d_VDDR;
00415 rDY[12] = (d_inf_kv11-rY[12])/tau_d_kv11;
00416 rDY[13] = (f_inf_Ltype-rY[13])/tau_f_Ltype;
00417 rDY[14] = (f_inf_Na-rY[14])/tau_f_Na;
00418 rDY[15] = (f_inf_VDDR-rY[15])/tau_f_VDDR;
00419 rDY[16] = (f_ca_inf_Ltype-rY[16])/tau_f_ca_Ltype;
00420 rDY[17] = (f_inf_kv11-rY[17])/tau_f_kv11;
00421 }
00422
00423 template<>
00424 void OdeSystemInformation<CorriasBuistICCModified>::Initialise(void)
00425 {
00426
00427 this->mSystemName = "ICC_model_Martincode";
00428
00429 this->mVariableNames.push_back("Vm");
00430 this->mVariableUnits.push_back("mV");
00431 this->mInitialConditions.push_back(-67.53988);
00432
00433 this->mVariableNames.push_back("Ca_i");
00434 this->mVariableUnits.push_back("mM");
00435 this->mInitialConditions.push_back(0.00001);
00436
00437 this->mVariableNames.push_back("Ca_ER");
00438 this->mVariableUnits.push_back("mM");
00439 this->mInitialConditions.push_back(0.00695);
00440
00441 this->mVariableNames.push_back("Ca_PU");
00442 this->mVariableUnits.push_back("mM");
00443 this->mInitialConditions.push_back(0.000095);
00444
00445 this->mVariableNames.push_back("Ca_m");
00446 this->mVariableUnits.push_back("mM");
00447 this->mInitialConditions.push_back(0.000138);
00448
00449 this->mVariableNames.push_back("h");
00450 this->mVariableUnits.push_back("dimensionless");
00451 this->mInitialConditions.push_back(0.939443);
00452
00453 this->mVariableNames.push_back("d_CaCl");
00454 this->mVariableUnits.push_back("dimensionless");
00455 this->mInitialConditions.push_back(0.00038);
00456
00457 this->mVariableNames.push_back("d_ERG");
00458 this->mVariableUnits.push_back("dimensionless");
00459 this->mInitialConditions.push_back(0.2);
00460
00461 this->mVariableNames.push_back("d_Ltype");
00462 this->mVariableUnits.push_back("dimensionless");
00463 this->mInitialConditions.push_back(0.000008);
00464
00465 this->mVariableNames.push_back("d_NSCC");
00466 this->mVariableUnits.push_back("dimensionless");
00467 this->mInitialConditions.push_back(0.0);
00468
00469 this->mVariableNames.push_back("d_Na");
00470 this->mVariableUnits.push_back("dimensionless");
00471 this->mInitialConditions.push_back(0.013778);
00472
00473 this->mVariableNames.push_back("d_VDDR");
00474 this->mVariableUnits.push_back("dimensionless");
00475 this->mInitialConditions.push_back(0.00099);
00476
00477 this->mVariableNames.push_back("d_kv11");
00478 this->mVariableUnits.push_back("dimensionless");
00479 this->mInitialConditions.push_back(0.003992);
00480
00481 this->mVariableNames.push_back("f_Ltype");
00482 this->mVariableUnits.push_back("dimensionless");
00483 this->mInitialConditions.push_back( 0.940072);
00484
00485 this->mVariableNames.push_back("f_Na");
00486 this->mVariableUnits.push_back("dimensionless");
00487 this->mInitialConditions.push_back(0.182426);
00488
00489 this->mVariableNames.push_back("f_VDDR");
00490 this->mVariableUnits.push_back("dimensionless");
00491 this->mInitialConditions.push_back(0.562177);
00492
00493 this->mVariableNames.push_back("f_ca_Ltype");
00494 this->mVariableUnits.push_back("dimensionless");
00495 this->mInitialConditions.push_back(1.0);
00496
00497 this->mVariableNames.push_back("f_kv11");
00498 this->mVariableUnits.push_back("dimensionless");
00499 this->mInitialConditions.push_back(0.997143);
00500
00501 this->mInitialised = true;
00502 }
00503
00504
00505
00506 #include "SerializationExportWrapperForCpp.hpp"
00507 CHASTE_CLASS_EXPORT(CorriasBuistICCModified)