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