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