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