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 "WntCellCycleOdeSystem.hpp"
00029 #include "CellwiseOdeSystemInformation.hpp"
00030
00031 WntCellCycleOdeSystem::WntCellCycleOdeSystem(double WntLevel, const CellMutationState& rMutationState)
00032 : AbstractOdeSystem(9)
00033 {
00034 mpSystemInfo.reset(new CellwiseOdeSystemInformation<WntCellCycleOdeSystem>);
00035
00050 Init();
00051
00052 double destruction_level = ma5d/(ma4d*WntLevel+ma5d);
00053 double beta_cat_level_1 = -1.0;
00054 double beta_cat_level_2 = -1.0;
00055
00056 mMutationState = rMutationState;
00057
00058
00059 if (mMutationState == HEALTHY || mMutationState == LABELLED)
00060 {
00061 beta_cat_level_1 = 0.5*ma2d/(ma2d+ma3d*destruction_level);
00062 beta_cat_level_2 = 0.5*ma2d/(ma2d+ma3d*destruction_level);
00063 }
00064 else if (mMutationState == APC_ONE_HIT)
00065 {
00066 beta_cat_level_1 = 0.5*ma2d/(ma2d+0.5*ma3d*destruction_level);
00067 beta_cat_level_2 = 0.5*ma2d/(ma2d+0.5*ma3d*destruction_level);
00068 }
00069 else if (mMutationState == BETA_CATENIN_ONE_HIT)
00070 {
00071 beta_cat_level_1 = 0.5*ma2d/(ma2d+ma3d*destruction_level);
00072 beta_cat_level_2 = 0.5;
00073 }
00074 else if (mMutationState == APC_TWO_HIT)
00075 {
00076 destruction_level = 0.0;
00077 beta_cat_level_1 = 0.5;
00078 beta_cat_level_2 = 0.5;
00079 }
00080 else
00081 {
00082
00083 NEVER_REACHED;
00084 }
00085
00086
00087 SetInitialConditionsComponent(5u, destruction_level);
00088 SetInitialConditionsComponent(6u, beta_cat_level_1);
00089 SetInitialConditionsComponent(7u, beta_cat_level_2);
00090 SetInitialConditionsComponent(8u, WntLevel);
00091 }
00092
00093 void WntCellCycleOdeSystem::SetMutationState(const CellMutationState& rMutationState)
00094 {
00095 mMutationState = rMutationState;
00096 }
00097
00098 WntCellCycleOdeSystem::~WntCellCycleOdeSystem(void)
00099 {
00100
00101 }
00102
00103 void WntCellCycleOdeSystem::Init()
00104 {
00105
00106
00107 double k1 = 1.0;
00108 double k2 = 1.6;
00109 double k3 = 0.05;
00110 double k16 = 0.4;
00111 double k34 = 0.04;
00112 double k43 = 0.01;
00113 double k61 = 0.3;
00114 double k23 = 0.3;
00115 double a = 0.04;
00116 double J11 = 0.5;
00117 double J12 = 5.0;
00118 double J61 = 5.0;
00119 double J62 = 8.0;
00120 double J13 = 0.002;
00121 double J63 = 2.0;
00122 double Km1 = 0.5;
00123 double Km2 = 4.0;
00124 double Km4 = 0.3;
00125 double kp = 0.05;
00126 double phi_pRb = 0.005;
00127 double phi_E2F1 = 0.1;
00128 double phi_CycDi = 0.023;
00129 double phi_CycDa = 0.03;
00130 double phi_pRbp = 0.06;
00131
00132
00133 double a1 = 0.423;
00134 double a2 = 2.57e-4;
00135 double a3 = 1.72;
00136 double a4 = 10.0;
00137 double a5 = 0.5;
00138 double WntMax = 10.0;
00139 double mitogenic_factorF = 6.0e-4;
00140 double APC_Total = 0.02;
00141
00142
00143 mk2d = k2/(Km2*phi_E2F1);
00144 mk3d = k3*a1*mitogenic_factorF/(Km4*phi_E2F1*a2);
00145 mk34d = k34/phi_E2F1;
00146 mk43d = k43/phi_E2F1;
00147 mk23d = k23*Km2/(Km4*phi_E2F1);
00148 mad = a/Km2;
00149 mJ11d = J11*phi_E2F1/k1;
00150 mJ12d = J12*phi_E2F1/k1;
00151 mJ13d = J13*phi_E2F1/k1;
00152 mJ61d = J61*phi_E2F1/k1;
00153 mJ62d = J62*phi_E2F1/k1;
00154 mJ63d = J63*phi_E2F1/k1;
00155 mKm1d = Km1/Km2;
00156 mkpd = kp/(Km2*phi_E2F1);
00157 mphi_r = phi_pRb/phi_E2F1;
00158 mphi_i = phi_CycDi/phi_E2F1;
00159 mphi_j = phi_CycDa/phi_E2F1;
00160 mphi_p = phi_pRbp/phi_E2F1;
00161 ma2d = a2/phi_E2F1;
00162 ma3d = a3*APC_Total/phi_E2F1;
00163 ma4d = a4*WntMax/phi_E2F1;
00164 ma5d = a5/phi_E2F1;
00165 mk16d = k16*Km4/phi_E2F1;
00166 mk61d = k61/phi_E2F1;
00167 mPhiE2F1 = phi_E2F1;
00168 }
00169
00170 void WntCellCycleOdeSystem::EvaluateYDerivatives(double time, const std::vector<double> &rY, std::vector<double> &rDY)
00171 {
00172 double r = rY[0];
00173 double e = rY[1];
00174 double i = rY[2];
00175 double j = rY[3];
00176 double p = rY[4];
00177 double c = rY[5];
00178 double b1 = rY[6];
00179 double b2 = rY[7];
00180 double WntLevel = rY[8];
00181
00182 double dx1 = 0.0;
00183 double dx2 = 0.0;
00184 double dx3 = 0.0;
00185 double dx4 = 0.0;
00186 double dx5 = 0.0;
00187 double dx6 = 0.0;
00188 double dx7 = 0.0;
00189 double dx8 = 0.0;
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205 if (mMutationState==HEALTHY || mMutationState==LABELLED)
00206 {
00207
00208 dx6 = ma5d*(1.0-c) - ma4d*WntLevel*c;
00209
00210 dx7 = ma2d*(0.5-b1) - ma3d*b1*c;
00211 dx8 = ma2d*(0.5-b2) - ma3d*b2*c;
00212 }
00213 else if (mMutationState==APC_ONE_HIT)
00214 {
00215 dx6 = ma5d*(1.0-c) - ma4d*WntLevel*c;
00216 dx7 = ma2d*(0.5-b1) - 0.5*ma3d*b1*c;
00217 dx8 = ma2d*(0.5-b2) - 0.5*ma3d*b2*c;
00218 }
00219 else if (mMutationState==BETA_CATENIN_ONE_HIT)
00220 {
00221 dx6 = ma5d*(1.0-c) - ma4d*WntLevel*c;
00222 dx7 = ma2d*(0.5-b1) - ma3d*b1*c;
00223 dx8 = ma2d*(0.5-b2);
00224 }
00225 else if (mMutationState==APC_TWO_HIT)
00226 {
00227 dx6 = 0.0;
00228 dx7 = ma2d*(0.5-b1);
00229 dx8 = ma2d*(0.5-b2);
00230 }
00231 else
00232 {
00233
00234 NEVER_REACHED;
00235 }
00236
00237
00238
00239
00240 dx1 = e/(mKm1d+e)*mJ11d/(mJ11d+r)*mJ61d/(mJ61d+p) - mk16d*r*j+mk61d*p-mphi_r*r;
00241
00242 dx2 = mkpd+mk2d*(mad*mad+e*e)/(1+e*e)*mJ12d/(mJ12d+r)*mJ62d/(mJ62d+p) - e;
00243
00244 dx3 = mk3d*(b1+b2) + mk23d*e*mJ13d/(mJ13d+r)*mJ63d/(mJ63d+p) + mk43d*j - mk34d*i*j/(1+j) - mphi_i*i;
00245
00246 dx4 = mk34d*i*j/(1+j) - (mk43d+mphi_j)*j;
00247
00248 dx5 = mk16d*r*j - mk61d*p - mphi_p*p;
00249
00250 double factor = mPhiE2F1*60.0;
00251
00252 rDY[0] = dx1*factor;
00253 rDY[1] = dx2*factor;
00254 rDY[2] = dx3*factor;
00255 rDY[3] = dx4*factor;
00256 rDY[4] = dx5*factor;
00257 rDY[5] = dx6*factor;
00258 rDY[6] = dx7*factor;
00259 rDY[7] = dx8*factor;
00260 rDY[8] = 0.0;
00261 }
00262
00263 CellMutationState& WntCellCycleOdeSystem::rGetMutationState()
00264 {
00265 return mMutationState;
00266 }
00267
00268 bool WntCellCycleOdeSystem::CalculateStoppingEvent(double time, const std::vector<double> &rY)
00269 {
00270 double r = rY[0];
00271 double e = rY[1];
00272 double p = rY[4];
00273 double dY1 = mkpd+mk2d*(mad*mad+e*e)/(1+e*e)*mJ12d/(mJ12d+r)*mJ62d/(mJ62d+p) - e;
00274 double factor = mPhiE2F1*60.0;
00275 dY1 = dY1*factor;
00276
00277 assert(!isnan(rY[1]));
00278 assert(!isnan(dY1));
00279 return (rY[1] > 1.0 && dY1 > 0.0);
00280 }
00281
00282 double WntCellCycleOdeSystem::CalculateRootFunction(double time, const std::vector<double> &rY)
00283 {
00284 return rY[1] - 1.0;
00285 }
00286
00287
00288 template<>
00289 void CellwiseOdeSystemInformation<WntCellCycleOdeSystem>::Initialise(void)
00290 {
00291 this->mVariableNames.push_back("pRb");
00292 this->mVariableUnits.push_back("non_dim");
00293 this->mInitialConditions.push_back(7.357000000000000e-01);
00294
00295 this->mVariableNames.push_back("E2F1");
00296 this->mVariableUnits.push_back("non_dim");
00297 this->mInitialConditions.push_back(1.713000000000000e-01);
00298
00299 this->mVariableNames.push_back("CycD_i");
00300 this->mVariableUnits.push_back("non_dim");
00301 this->mInitialConditions.push_back(6.900000000000001e-02);
00302
00303 this->mVariableNames.push_back("CycD_a");
00304 this->mVariableUnits.push_back("non_dim");
00305 this->mInitialConditions.push_back(3.333333333333334e-03);
00306
00307 this->mVariableNames.push_back("pRb_p");
00308 this->mVariableUnits.push_back("non_dim");
00309 this->mInitialConditions.push_back(1.000000000000000e-04);
00310
00311 this->mVariableNames.push_back("APC");
00312 this->mVariableUnits.push_back("non_dim");
00313 this->mInitialConditions.push_back(NAN);
00314
00315 this->mVariableNames.push_back("Beta_Cat1");
00316 this->mVariableUnits.push_back("non_dim");
00317 this->mInitialConditions.push_back(NAN);
00318
00319 this->mVariableNames.push_back("Beta_Cat2");
00320 this->mVariableUnits.push_back("non_dim");
00321 this->mInitialConditions.push_back(NAN);
00322
00323 this->mVariableNames.push_back("Wnt");
00324 this->mVariableUnits.push_back("non_dim");
00325 this->mInitialConditions.push_back(NAN);
00326
00327 this->mInitialised = true;
00328 }