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 "IngeWntSwatCellCycleOdeSystem.hpp"
00029 #include "CellwiseOdeSystemInformation.hpp"
00030
00031 IngeWntSwatCellCycleOdeSystem::IngeWntSwatCellCycleOdeSystem(unsigned hypothesis, double wntLevel, const CellMutationState& rMutationState)
00032 : AbstractOdeSystem(22),
00033 mMutationState(rMutationState),
00034 mHypothesis(hypothesis)
00035 {
00036 if (hypothesis!=1u && hypothesis!=2u)
00037 {
00038 EXCEPTION("You must set up this cell cycle ODE system with hypothesis one or two.");
00039 }
00040
00041 mpSystemInfo.reset(new CellwiseOdeSystemInformation<IngeWntSwatCellCycleOdeSystem>);
00042
00069 Init();
00070
00071 double d_d_hat = mDd + mXiD*wntLevel;
00072 double d_d_x_hat = mDdx + mXiDx*wntLevel;
00073 double d_x_hat = mDx + mXiX*wntLevel;
00074 double p_c_hat = mPc + mXiC*wntLevel;
00075
00076 double sigma_D = 0.0;
00077 double sigma_B = 0.0;
00078
00079 switch (mMutationState)
00080 {
00081 case HEALTHY:
00082 {
00083 break;
00084 }
00085 case LABELLED:
00086 {
00087 break;
00088 }
00089 case APC_ONE_HIT:
00090 {
00091 sigma_D = 0.5;
00092 break;
00093 }
00094 case APC_TWO_HIT:
00095 {
00096 sigma_D = 1.0;
00097 break;
00098 }
00099 case BETA_CATENIN_ONE_HIT:
00100 {
00101 sigma_B = 0.5;
00102 break;
00103 }
00104 default:
00105
00106 NEVER_REACHED;
00107 }
00108
00109
00110 double steady_D = ((1.0-sigma_D)*mSd*mSx)/((1.0-sigma_D)*mSd*d_d_hat + d_x_hat*(d_d_hat + d_d_x_hat));
00111 SetInitialConditionsComponent(5u, steady_D);
00112
00113 double temp = (mSx*(d_d_hat+d_d_x_hat))/((1.0-sigma_D)*mSd*d_d_hat+d_x_hat*(d_d_hat+d_d_x_hat));
00114 SetInitialConditionsComponent(6u, temp);
00115
00116 double steady_Cf = ((mSc-mDc*mKd - mPu*steady_D)+sqrt(pow((mSc-mDc*mKd - mPu*steady_D),2) + (4.0*mSc*mDc*mKd)))/(2.0*mDc);
00117 temp = (mPu*steady_D*steady_Cf)/(mDu*(steady_Cf+mKd));
00118 SetInitialConditionsComponent(7u, temp);
00119
00120 double theta = mDc + (mPu*steady_D)/(steady_Cf + mKd);
00121
00122 double steady_Co = ( mSc - p_c_hat - theta*mKc + sqrt(4.0*mSc*theta*mKc + pow((mSc - p_c_hat - theta*mKc),2)) )/(2.0*theta);
00123 SetInitialConditionsComponent(8u, steady_Co);
00124
00125 double steady_Cc = steady_Cf - steady_Co;
00126
00127 if ((steady_Cc < 0) && (steady_Cc+100*DBL_EPSILON > 0) )
00128 {
00129 steady_Cc = 0.0;
00130 }
00131 SetInitialConditionsComponent(9u, steady_Cc);
00132
00133 SetInitialConditionsComponent(12u, mSa/mDa);
00134
00135 SetInitialConditionsComponent(13u, mSa*mSca*steady_Co/(mDa*mDca));
00136
00137 SetInitialConditionsComponent(15u, mSt/mDt);
00138
00139 SetInitialConditionsComponent(16u, mSct*mSt*steady_Co/(mDt*mDct));
00140
00141 SetInitialConditionsComponent(17u, mSct*mSt*steady_Cc/(mDt*mDct));
00142
00143 temp = (mSct*mSt*mSy*steady_Cf)/(mDy*(mSct*mSt*steady_Cf + mDct*mDt*mKt));
00144 SetInitialConditionsComponent(20u, temp);
00145
00146 SetInitialConditionsComponent(21u, wntLevel);
00147 }
00148
00149 void IngeWntSwatCellCycleOdeSystem::SetMutationState(const CellMutationState& rMutationState)
00150 {
00151 mMutationState = rMutationState;
00152 }
00153
00154 IngeWntSwatCellCycleOdeSystem::~IngeWntSwatCellCycleOdeSystem()
00155 {
00156
00157 }
00158
00159 void IngeWntSwatCellCycleOdeSystem::Init()
00160 {
00161
00162 double k1 = 1.0;
00163 double k2 = 1.6;
00164 double k3 = 0.05;
00165 double k16 = 0.4;
00166 double k34 = 0.04;
00167 double k43 = 0.01;
00168 double k61 = 0.3;
00169 double k23 = 0.3;
00170 double a = 0.04;
00171 double J11 = 0.5;
00172 double J12 = 5.0;
00173 double J61 = 5.0;
00174 double J62 = 8.0;
00175 double J13 = 0.002;
00176 double J63 = 2.0;
00177 double Km1 = 0.5;
00178 double Km2 = 4.0;
00179 double Km4 = 0.3;
00180 double kp = 0.05;
00181 double phi_pRb = 0.005;
00182 double phi_E2F1 = 0.1;
00183 double phi_CycDi = 0.023;
00184 double phi_CycDa = 0.03;
00185 double phi_pRbp = 0.06;
00186
00187
00188 double mitogenic_factorF = 1.0/25.0;
00189
00190
00191 mk2d = k2/(Km2*phi_E2F1);
00192 mk3d = k3*mitogenic_factorF/(Km4*phi_E2F1);
00193 mk34d = k34/phi_E2F1;
00194 mk43d = k43/phi_E2F1;
00195 mk23d = k23*Km2/(Km4*phi_E2F1);
00196 mad = a/Km2;
00197 mJ11d = J11*phi_E2F1/k1;
00198 mJ12d = J12*phi_E2F1/k1;
00199 mJ13d = J13*phi_E2F1/k1;
00200 mJ61d = J61*phi_E2F1/k1;
00201 mJ62d = J62*phi_E2F1/k1;
00202 mJ63d = J63*phi_E2F1/k1;
00203 mKm1d = Km1/Km2;
00204 mkpd = kp/(Km2*phi_E2F1);
00205 mphi_r = phi_pRb/phi_E2F1;
00206 mphi_i = phi_CycDi/phi_E2F1;
00207 mphi_j = phi_CycDa/phi_E2F1;
00208 mphi_p = phi_pRbp/phi_E2F1;
00209 mk16d = k16*Km4/phi_E2F1;
00210 mk61d = k61/phi_E2F1;
00211 mPhiE2F1 = phi_E2F1;
00212
00213
00214 mSa = 20;
00215 mSca = 250;
00216 mSc = 25;
00217 mSct = 30;
00218 mSd = 100;
00219 mSt = 10;
00220 mSx = 10;
00221 mSy = 10;
00222 mDa = 2;
00223 mDca = 350;
00224 mDc = 1;
00225 mDct = 750;
00226 mDd = 5;
00227 mDdx = 5;
00228 mDt = 0.4;
00229 mDu = 50;
00230 mDx = 100;
00231 mDy = 1;
00232 mKc = 200;
00233 mKd = 5;
00234 mKt = 50;
00235 mPc = 0.0;
00236 mPu = 100;
00237 mXiD = 5;
00238 mXiDx = 5;
00239 mXiX = 200;
00240 if (mHypothesis==1)
00241 {
00242 mXiC = 0.0;
00243 }
00244 else
00245 {
00246 mXiC = 5000.0;
00247 }
00248 }
00249
00250 void IngeWntSwatCellCycleOdeSystem::EvaluateYDerivatives(double time, const std::vector<double>& rY, std::vector<double>& rDY)
00251 {
00252 double r = rY[0];
00253 double e = rY[1];
00254 double i = rY[2];
00255 double j = rY[3];
00256 double p = rY[4];
00257
00258 double dx1 = 0.0;
00259 double dx2 = 0.0;
00260 double dx3 = 0.0;
00261 double dx4 = 0.0;
00262 double dx5 = 0.0;
00263
00264
00265
00266
00267 double D = rY[5];
00268 double X = rY[6];
00269 double Cu = rY[7];
00270 double Co = rY[8];
00271 double Cc = rY[9];
00272 double Mo = rY[10];
00273 double Mc = rY[11];
00274 double A = rY[12];
00275 double Ca = rY[13];
00276 double Ma = rY[14];
00277 double T = rY[15];
00278 double Cot = rY[16];
00279 double Cct = rY[17];
00280 double Mot = rY[18];
00281 double Mct = rY[19];
00282 double Y = rY[20];
00283 double stimulus_wnt = rY[21];
00284
00285
00286 double Cf = Cc+Co;
00287 double Ct = Cct+Cot;
00288 double Mf = Mc+Mo;
00289 double Mt = Mct+Mot;
00290
00291 double d_d_hat = mDd + mXiD*stimulus_wnt;
00292 double d_d_x_hat = mDdx + mXiDx*stimulus_wnt;
00293 double d_x_hat = mDx + mXiX*stimulus_wnt;
00294 double p_c_hat = mPc + mXiC*stimulus_wnt;
00295
00296 double sigma_D = 0.0;
00297 double sigma_B = 0.0;
00298
00299 switch (mMutationState)
00300 {
00301 case HEALTHY:
00302 {
00303 break;
00304 }
00305 case LABELLED:
00306 {
00307 break;
00308 }
00309 case APC_ONE_HIT:
00310 {
00311 sigma_D = 0.5;
00312 break;
00313 }
00314 case APC_TWO_HIT:
00315 {
00316 sigma_D = 1.0;
00317 break;
00318 }
00319 case BETA_CATENIN_ONE_HIT:
00320 {
00321 sigma_B = 0.5;
00322 break;
00323 }
00324 default:
00325
00326 NEVER_REACHED;
00327 }
00328
00329
00330
00331
00332 dx1 = e/(mKm1d+e)*mJ11d/(mJ11d+r)*mJ61d/(mJ61d+p) - mk16d*r*j+mk61d*p-mphi_r*r;
00333
00334 dx2 = mkpd+mk2d*(mad*mad+e*e)/(1+e*e)*mJ12d/(mJ12d+r)*mJ62d/(mJ62d+p) - e;
00335
00336 dx3 = mk3d*(Ct+Mt) + mk23d*e*mJ13d/(mJ13d+r)*mJ63d/(mJ63d+p) + mk43d*j - mk34d*i*j/(1+j) - mphi_i*i;
00337
00338 dx4 = mk34d*i*j/(1+j) - (mk43d+mphi_j)*j;
00339
00340 dx5 = mk16d*r*j - mk61d*p - mphi_p*p;
00341
00342 double factor = mPhiE2F1*60.0;
00343
00344 rDY[0] = dx1*factor;
00345 rDY[1] = dx2*factor;
00346 rDY[2] = dx3*factor;
00347 rDY[3] = dx4*factor;
00348 rDY[4] = dx5*factor;
00349
00350
00351 rDY[5] = (1.0-sigma_D)*mSd*X - (d_d_hat + d_d_x_hat)*D;
00352 rDY[6] = mSx - (1.0-sigma_D)*mSd*X - d_x_hat*X + d_d_x_hat*D;
00353 rDY[7] = (mPu*D*Cf)/(Cf+mKd) - mDu*Cu;
00354
00355 rDY[8] = (1.0-sigma_B)*mSc + mDca*Ca + mDct*Cot - (mSca*A + mSct*T + mDc)*Co
00356 - (p_c_hat*Co)/(Co + Mo + mKc) - (mPu*D*Co)/(Cf+mKd);
00357
00358 rDY[9] = (p_c_hat*Co)/(Co + Mo + mKc) + mDct*Cct - (mSct*T + mDc)*Cc
00359 - (mPu*D*Cc)/(Cf+mKd);
00360
00361 rDY[10] = sigma_B*mSc + mDca*Ma + mDct*Mot - (mSca*A + mSct*T + mDc)*Mo
00362 - (p_c_hat*Mo)/(Co + Mo + mKc);
00363
00364 rDY[11] = (p_c_hat*Mo)/(Co + Mo + mKc) + mDct*Mct - (mSct*T + mDc)*Mc;
00365 rDY[12] = mSa + mDca*(Ca+Ma) - (mSca*(Co+Mo) + mDa)*A;
00366 rDY[13] = mSca*Co*A - mDca*Ca;
00367 rDY[14] = mSca*Mo*A - mDca*Ma;
00368 rDY[15] = mSt + mDct*(Ct+Mt) - mSct*(Cf+Mf)*T - mDt*T;
00369 rDY[16] = mSct*Co*T - mDct*Cot;
00370 rDY[17] = mSct*Cc*T - mDct*Cct;
00371 rDY[18] = mSct*Mo*T - mDct*Mot;
00372 rDY[19] = mSct*Mc*T - mDct*Mct;
00373 rDY[20] = (mSy*(Ct+Mt))/(Ct + Mt + mKt) - mDy*Y;
00374 rDY[21] = 0.0;
00375 }
00376
00377 CellMutationState& IngeWntSwatCellCycleOdeSystem::rGetMutationState()
00378 {
00379 return mMutationState;
00380 }
00381
00382 bool IngeWntSwatCellCycleOdeSystem::CalculateStoppingEvent(double time, const std::vector<double>& rY)
00383 {
00384
00385 std::vector<double> dy(rY.size());
00386 EvaluateYDerivatives(time, rY, dy);
00387
00388 return (rY[1] > 1.0 && dy[1] > 0.0);
00389 }
00390
00391 double IngeWntSwatCellCycleOdeSystem::CalculateRootFunction(double time, const std::vector<double>& rY)
00392 {
00393
00394 return rY[1]-1.0;
00395 }
00396
00397
00398 template<>
00399 void CellwiseOdeSystemInformation<IngeWntSwatCellCycleOdeSystem>::Initialise()
00400 {
00401 this->mVariableNames.push_back("pRb");
00402 this->mVariableUnits.push_back("non_dim");
00403 this->mInitialConditions.push_back(7.357000000000000e-01);
00404
00405 this->mVariableNames.push_back("E2F1");
00406 this->mVariableUnits.push_back("non_dim");
00407 this->mInitialConditions.push_back(1.713000000000000e-01);
00408
00409 this->mVariableNames.push_back("CycD_i");
00410 this->mVariableUnits.push_back("non_dim");
00411 this->mInitialConditions.push_back(6.900000000000001e-02);
00412
00413 this->mVariableNames.push_back("CycD_a");
00414 this->mVariableUnits.push_back("non_dim");
00415 this->mInitialConditions.push_back(3.333333333333334e-03);
00416
00417 this->mVariableNames.push_back("pRb_p");
00418 this->mVariableUnits.push_back("non_dim");
00419 this->mInitialConditions.push_back(1.000000000000000e-04);
00420
00421 this->mVariableNames.push_back("D");
00422 this->mVariableUnits.push_back("nM");
00423 this->mInitialConditions.push_back(NAN);
00424
00425 this->mVariableNames.push_back("X");
00426 this->mVariableUnits.push_back("nM");
00427 this->mInitialConditions.push_back(NAN);
00428
00429 this->mVariableNames.push_back("Cu");
00430 this->mVariableUnits.push_back("nM");
00431 this->mInitialConditions.push_back(NAN);
00432
00433 this->mVariableNames.push_back("Co");
00434 this->mVariableUnits.push_back("nM");
00435 this->mInitialConditions.push_back(NAN);
00436
00437 this->mVariableNames.push_back("Cc");
00438 this->mVariableUnits.push_back("nM");
00439 this->mInitialConditions.push_back(NAN);
00440
00441 this->mVariableNames.push_back("Mo");
00442 this->mVariableUnits.push_back("nM");
00443 this->mInitialConditions.push_back(0.0);
00444
00445 this->mVariableNames.push_back("Mc");
00446 this->mVariableUnits.push_back("nM");
00447 this->mInitialConditions.push_back(0.0);
00448
00449 this->mVariableNames.push_back("A");
00450 this->mVariableUnits.push_back("nM");
00451 this->mInitialConditions.push_back(NAN);
00452
00453 this->mVariableNames.push_back("Ca");
00454 this->mVariableUnits.push_back("nM");
00455 this->mInitialConditions.push_back(NAN);
00456
00457 this->mVariableNames.push_back("Ma");
00458 this->mVariableUnits.push_back("nM");
00459 this->mInitialConditions.push_back(0.0);
00460
00461 this->mVariableNames.push_back("T");
00462 this->mVariableUnits.push_back("nM");
00463 this->mInitialConditions.push_back(NAN);
00464
00465 this->mVariableNames.push_back("Cot");
00466 this->mVariableUnits.push_back("nM");
00467 this->mInitialConditions.push_back(NAN);
00468
00469 this->mVariableNames.push_back("Cct");
00470 this->mVariableUnits.push_back("nM");
00471 this->mInitialConditions.push_back(NAN);
00472
00473 this->mVariableNames.push_back("Mot");
00474 this->mVariableUnits.push_back("nM");
00475 this->mInitialConditions.push_back(0.0);
00476
00477 this->mVariableNames.push_back("Mct");
00478 this->mVariableUnits.push_back("nM");
00479 this->mInitialConditions.push_back(0.0);
00480
00481 this->mVariableNames.push_back("Y");
00482 this->mVariableUnits.push_back("nM");
00483 this->mInitialConditions.push_back(NAN);
00484
00485 this->mVariableNames.push_back("Sw");
00486 this->mVariableUnits.push_back("nM");
00487 this->mInitialConditions.push_back(NAN);
00488
00489 this->mInitialised = true;
00490 }