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 #include "NhsContractionModel.hpp"
00029 #include "OdeSystemInformation.hpp"
00030 #include "EulerIvpOdeSolver.hpp"
00031 #include "UblasCustomFunctions.hpp"
00032
00033 #include <cmath>
00034
00035
00036
00037
00038
00039
00040 const double NhsContractionModel::mKon = 100;
00041 const double NhsContractionModel::mKrefoff = 0.2;
00042 const double NhsContractionModel::mGamma = 2;
00043 const double NhsContractionModel::mCalciumTroponinMax = 0.07;
00044 const double NhsContractionModel::mAlphaR1 = 0.002;
00045 const double NhsContractionModel::mAlphaR2 = 0.0017;
00046 const double NhsContractionModel::mKZ = 0.15;
00047 const unsigned NhsContractionModel::mNr = 3u;
00048 const double NhsContractionModel::mBeta1 = -4;
00049 const double NhsContractionModel::mAlpha0 = 0.008;
00050 const unsigned NhsContractionModel::mN = 3u;
00051 const double NhsContractionModel::mZp = 0.85;
00052 const double NhsContractionModel::mCalcium50ref = 0.00105;
00053 const double NhsContractionModel::mTref = 56.2;
00054 const double NhsContractionModel::mBeta0 = 4.9;
00055 const double NhsContractionModel::mA = 0.35;
00056 const double NhsContractionModel::mA1 = -29;
00057 const double NhsContractionModel::mA2 = 138;
00058 const double NhsContractionModel::mA3 = 129;
00059 const double NhsContractionModel::mAlpha1 = 0.03;
00060 const double NhsContractionModel::mAlpha2 = 0.130;
00061 const double NhsContractionModel::mAlpha3 = 0.625;
00062
00063
00064
00065
00066
00067 void NhsContractionModel::CalculateCalciumTrop50()
00068 {
00069 double Ca50ref_times_one_plus_beta1_times_lam_minus_one = mCalcium50ref * (1 + mBeta1*(mLambda-1));
00070 double one_plus_beta0_times_lam_minus_one_over_two_gamma = (1 + mBeta0*(mLambda-1))/(2*mGamma);
00071
00072 mCalciumTrop50 = mCalciumTroponinMax * Ca50ref_times_one_plus_beta1_times_lam_minus_one;
00073 mCalciumTrop50 /= (Ca50ref_times_one_plus_beta1_times_lam_minus_one + (1-one_plus_beta0_times_lam_minus_one_over_two_gamma)*mKrefoff/mKon);
00074 }
00075
00076
00077 double NhsContractionModel::CalculateT0(double z)
00078 {
00079 double calcium_ratio_to_n = SmallPow(mCalciumTrop50/mCalciumTroponinMax, mN);
00080
00081 double z_max = mAlpha0 - mK2*calcium_ratio_to_n;
00082 z_max /= mAlpha0 + (mAlphaR1 + mK1)*calcium_ratio_to_n;
00083
00084 return z * mTref * (1+mBeta0*(mLambda-1)) / z_max;
00085 }
00086
00087
00088
00089
00090
00091
00092
00093 NhsContractionModel::NhsContractionModel()
00094 : AbstractOdeBasedContractionModel(5)
00095 {
00096 mpSystemInfo = OdeSystemInformation<NhsContractionModel>::Instance();
00097 SetStateVariables(GetInitialConditions());
00098
00099 mLambda = 1.0;
00100 mDLambdaDt = 0.0;
00101 mCalciumI = 0.0;
00102
00103
00104 CalculateCalciumTrop50();
00105
00106 double zp_to_n_plus_K_to_n = SmallPow(mZp,mNr) + SmallPow(mKZ,mNr);
00107
00108 mK1 = mAlphaR2 * SmallPow(mZp,mNr-1) * mNr * SmallPow(mKZ,mNr);
00109 mK1 /= zp_to_n_plus_K_to_n * zp_to_n_plus_K_to_n;
00110
00111 mK2 = mAlphaR2 * SmallPow(mZp,mNr)/zp_to_n_plus_K_to_n;
00112 mK2 *= 1 - mNr*SmallPow(mKZ,mNr)/zp_to_n_plus_K_to_n;
00113 }
00114
00115 void NhsContractionModel::SetStretchAndStretchRate(double lambda, double dlambdaDt)
00116 {
00117 assert(lambda>0.0);
00118 mLambda = lambda;
00119 mDLambdaDt = dlambdaDt;
00120
00121 CalculateCalciumTrop50();
00122 }
00123
00124 void NhsContractionModel::SetInputParameters(ContractionModelInputParameters& rInputParameters)
00125 {
00126 assert(rInputParameters.intracellularCalciumConcentration != DOUBLE_UNSET);
00127 assert(rInputParameters.intracellularCalciumConcentration > 0.0);
00128 mCalciumI = rInputParameters.intracellularCalciumConcentration;
00129 }
00130
00131 void NhsContractionModel::SetIntracellularCalciumConcentration(double calciumConcentration)
00132 {
00133 assert(calciumConcentration > 0.0);
00134 mCalciumI = calciumConcentration;
00135 }
00136
00137 double NhsContractionModel::GetCalciumTroponinValue()
00138 {
00139 return mStateVariables[0];
00140 }
00141
00142 void NhsContractionModel::EvaluateYDerivatives(double time,
00143 const std::vector<double> &rY,
00144 std::vector<double> &rDY)
00145 {
00147
00148 const double& calcium_troponin = rY[0];
00149 const double& z = rY[1];
00150 const double& Q1 = rY[2];
00151 const double& Q2 = rY[3];
00152 const double& Q3 = rY[4];
00153
00154
00155 #define COVERAGE_IGNORE
00156 if(calcium_troponin < 0)
00157 {
00158 EXCEPTION("CalciumTrop concentration went negative");
00159 }
00160 if(z<0)
00161 {
00162 EXCEPTION("z went negative");
00163 }
00164 if(z>1)
00165 {
00166 EXCEPTION("z became greater than 1");
00167 }
00168 #undef COVERAGE_IGNORE
00169
00170
00171 double Q = Q1 + Q2 + Q3;
00172 double T0 = CalculateT0(z);
00173
00174 double Ta;
00175 if(Q>0)
00176 {
00177 Ta = T0*(1+(2+mA)*Q)/(1+Q);
00178 }
00179 else
00180 {
00181 Ta = T0*(1+mA*Q)/(1-Q);
00182 }
00183
00184 rDY[0] = mKon * mCalciumI * ( mCalciumTroponinMax - calcium_troponin)
00185 - mKrefoff * (1-Ta/(mGamma*mTref)) * calcium_troponin;
00186
00187 double ca_trop_to_ca_trop50_ratio_to_n = SmallPow(calcium_troponin/mCalciumTrop50, mN);
00188
00189 rDY[1] = mAlpha0 * ca_trop_to_ca_trop50_ratio_to_n * (1-z)
00190 - mAlphaR1 * z
00191 - mAlphaR2 * SmallPow(z,mNr) / (SmallPow(z,mNr) + SmallPow(mKZ,mNr));
00192
00193
00194 rDY[2] = mA1 * mDLambdaDt - mAlpha1 * Q1;
00195 rDY[3] = mA2 * mDLambdaDt - mAlpha2 * Q2;
00196 rDY[4] = mA3 * mDLambdaDt - mAlpha3 * Q3;
00197 }
00198
00199
00200 double NhsContractionModel::GetActiveTension()
00201 {
00202 double T0 = CalculateT0(mStateVariables[1]);
00203 double Q = mStateVariables[2]+mStateVariables[3]+mStateVariables[4];
00204
00205 if(Q>0)
00206 {
00207 return T0*(1+(2+mA)*Q)/(1+Q);
00208 }
00209 else
00210 {
00211 return T0*(1+mA*Q)/(1-Q);
00212 }
00213 }
00214
00215 template<>
00216 void OdeSystemInformation<NhsContractionModel>::Initialise(void)
00217 {
00218 this->mVariableNames.push_back("CalciumTroponin");
00219 this->mVariableUnits.push_back("microMols");
00220 this->mInitialConditions.push_back(0);
00221
00222 this->mVariableNames.push_back("z");
00223 this->mVariableUnits.push_back("");
00224 this->mInitialConditions.push_back(0);
00225
00226 this->mVariableNames.push_back("Q1");
00227 this->mVariableUnits.push_back("");
00228 this->mInitialConditions.push_back(0);
00229
00230 this->mVariableNames.push_back("Q2");
00231 this->mVariableUnits.push_back("");
00232 this->mInitialConditions.push_back(0);
00233
00234 this->mVariableNames.push_back("Q3");
00235 this->mVariableUnits.push_back("");
00236 this->mInitialConditions.push_back(0);
00237
00238 this->mInitialised = true;
00239 }