Chaste Release::3.1
VanLeeuwen2009WntSwatCellCycleOdeSystem.cpp
00001 /*
00002 
00003 Copyright (c) 2005-2012, University of Oxford.
00004 All rights reserved.
00005 
00006 University of Oxford means the Chancellor, Masters and Scholars of the
00007 University of Oxford, having an administrative office at Wellington
00008 Square, Oxford OX1 2JD, UK.
00009 
00010 This file is part of Chaste.
00011 
00012 Redistribution and use in source and binary forms, with or without
00013 modification, are permitted provided that the following conditions are met:
00014  * Redistributions of source code must retain the above copyright notice,
00015    this list of conditions and the following disclaimer.
00016  * Redistributions in binary form must reproduce the above copyright notice,
00017    this list of conditions and the following disclaimer in the documentation
00018    and/or other materials provided with the distribution.
00019  * Neither the name of the University of Oxford nor the names of its
00020    contributors may be used to endorse or promote products derived from this
00021    software without specific prior written permission.
00022 
00023 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00024 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00025 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00026 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
00027 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
00028 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
00029 GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
00030 HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
00031 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
00032 OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00033 
00034 */
00035 
00036 #include "VanLeeuwen2009WntSwatCellCycleOdeSystem.hpp"
00037 #include "CellwiseOdeSystemInformation.hpp"
00038 
00039 VanLeeuwen2009WntSwatCellCycleOdeSystem::VanLeeuwen2009WntSwatCellCycleOdeSystem(unsigned hypothesis,
00040                                                                                  double wntLevel,
00041                                                                                  boost::shared_ptr<AbstractCellMutationState> pMutationState,
00042                                                                                  std::vector<double> stateVariables)
00043     : AbstractOdeSystem(22),
00044       mpMutationState(pMutationState),
00045       mHypothesis(hypothesis),
00046       mWntLevel(wntLevel)
00047 {
00048     if (hypothesis!=1 && hypothesis!=2)
00049     {
00050         EXCEPTION("You must set up this cell cycle ODE system with hypothesis one or two.");
00051     }
00052 
00053     mpSystemInfo.reset(new CellwiseOdeSystemInformation<VanLeeuwen2009WntSwatCellCycleOdeSystem>);
00054 
00081     Init(); // set up parameter values
00082 
00083     double d_d_hat = mDd + mXiD*wntLevel;
00084     double d_d_x_hat = mDdx + mXiDx*wntLevel;
00085     double d_x_hat = mDx + mXiX*wntLevel;
00086     double p_c_hat = mPc + mXiC*wntLevel;
00087 
00088     double sigma_D = 0.0; // for healthy cells
00089     //double sigma_B = 0.0; // for healthy cells - never used!
00090 
00091     if (!mpMutationState)
00092     {
00093         // No mutations specified
00094     }
00095     else if (mpMutationState->IsType<ApcOneHitCellMutationState>())
00096     {
00097         sigma_D = 0.5;
00098     }
00099     else if (mpMutationState->IsType<ApcTwoHitCellMutationState>())
00100     {
00101         sigma_D = 1.0;
00102     }
00103     else if (mpMutationState->IsType<BetaCateninOneHitCellMutationState>())
00104     {
00105         //sigma_B = 0.5; // never used!
00106     }
00107     // Other mutations have no effect.
00108 
00109     // Cell-specific initial conditions
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     SetDefaultInitialCondition(5, steady_D); // Destruction complex (APC/Axin/GSK3B)
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     SetDefaultInitialCondition(6, temp);  // Axin
00115 
00116     double steady_Cf = ((mSc-mDc*mKd - mPu*steady_D)+sqrt(SmallPow((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     SetDefaultInitialCondition(7, temp); // beta-catenin to be ubiquitinated
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 + SmallPow((mSc - p_c_hat - theta*mKc),2)) )/(2.0*theta);
00123     SetDefaultInitialCondition(8, steady_Co); // Open form beta-catenin
00124 
00125     double steady_Cc = steady_Cf - steady_Co;
00126 
00127     if ((steady_Cc < 0) && (steady_Cc+100*DBL_EPSILON > 0) ) // stop protein values going -ve
00128     {
00129         steady_Cc = 0.0;
00130     }
00131     SetDefaultInitialCondition(9, steady_Cc); // Closed form beta-catenin
00132 
00133     SetDefaultInitialCondition(12, mSa/mDa);  // 'Free' adhesion molecules
00134 
00135     SetDefaultInitialCondition(13, mSa*mSca*steady_Co/(mDa*mDca)); // Co-A Adhesion complex
00136 
00137     SetDefaultInitialCondition(15, mSt/mDt); // `Free' transcription molecules (TCF)
00138 
00139     SetDefaultInitialCondition(16, mSct*mSt*steady_Co/(mDt*mDct)); // Co-T open form beta-catenin/TCF
00140 
00141     SetDefaultInitialCondition(17, mSct*mSt*steady_Cc/(mDt*mDct)); // Cc-T closed beta-catenin/TCF
00142 
00143     temp = (mSct*mSt*mSy*steady_Cf)/(mDy*(mSct*mSt*steady_Cf + mDct*mDt*mKt));
00144     SetDefaultInitialCondition(20, temp); // Wnt target protein
00145 
00146     SetDefaultInitialCondition(21, wntLevel); // Wnt stimulus
00147 
00148     if (stateVariables != std::vector<double>())
00149     {
00150         SetStateVariables(stateVariables);
00151     }
00152 }
00153 
00154 void VanLeeuwen2009WntSwatCellCycleOdeSystem::SetMutationState(boost::shared_ptr<AbstractCellMutationState> pMutationState)
00155 {
00156     mpMutationState = pMutationState;
00157 }
00158 
00159 VanLeeuwen2009WntSwatCellCycleOdeSystem::~VanLeeuwen2009WntSwatCellCycleOdeSystem()
00160 {
00161     // Do nothing
00162 }
00163 
00164 void VanLeeuwen2009WntSwatCellCycleOdeSystem::Init()
00165 {
00166     // Swat (2004) parameters
00167     double k1 = 1.0;
00168     double k2 = 1.6;
00169     double k3 = 0.05;
00170     double k16 = 0.4;
00171     double k34 = 0.04;
00172     double k43 = 0.01;
00173     double k61 = 0.3;
00174     double k23 = 0.3;
00175     double a = 0.04;
00176     double J11 = 0.5;
00177     double J12 = 5.0;
00178     double J61 = 5.0;
00179     double J62 = 8.0;
00180     double J13 = 0.002;
00181     double J63 = 2.0;
00182     double Km1 = 0.5;
00183     double Km2 = 4.0;
00184     double Km4 = 0.3;
00185     double kp = 0.05;
00186     double phi_pRb = 0.005;
00187     double phi_E2F1 = 0.1;
00188     double phi_CycDi = 0.023;
00189     double phi_CycDa = 0.03;
00190     double phi_pRbp = 0.06;
00191 
00192     // Value of the mitogenic factor to make the van Leeuwen model influence cell cycle just the same
00193     double mitogenic_factorF = 1.0/25.0;
00194 
00195     // Non-dimensionalise parameters
00196     mk2d = k2/(Km2*phi_E2F1);
00197     mk3d = k3*mitogenic_factorF/(Km4*phi_E2F1);
00198     mk34d = k34/phi_E2F1;
00199     mk43d = k43/phi_E2F1;
00200     mk23d = k23*Km2/(Km4*phi_E2F1);
00201     mad = a/Km2;
00202     mJ11d = J11*phi_E2F1/k1;
00203     mJ12d = J12*phi_E2F1/k1;
00204     mJ13d = J13*phi_E2F1/k1;
00205     mJ61d = J61*phi_E2F1/k1;
00206     mJ62d = J62*phi_E2F1/k1;
00207     mJ63d = J63*phi_E2F1/k1;
00208     mKm1d = Km1/Km2;
00209     mkpd = kp/(Km2*phi_E2F1);
00210     mphi_r = phi_pRb/phi_E2F1;
00211     mphi_i = phi_CycDi/phi_E2F1;
00212     mphi_j = phi_CycDa/phi_E2F1;
00213     mphi_p = phi_pRbp/phi_E2F1;
00214     mk16d = k16*Km4/phi_E2F1;
00215     mk61d = k61/phi_E2F1;
00216     mPhiE2F1 = phi_E2F1;
00217 
00218     // Initialize van Leeuwen model parameters
00219     mSa = 20;   //  nM/h
00220     mSca = 250; //  (nMh)^-1
00221     mSc = 25;   //  nM/h
00222     mSct = 30;  //  (nMh)^-1
00223     mSd = 100;  //  h^-1
00224     mSt = 10;   //  nM/h
00225     mSx = 10;   //  nM/h
00226     mSy = 10;   //  h^-1
00227     mDa = 2;    //  h^-1
00228     mDca = 350; //  h^-1
00229     mDc = 1;    //  h^-1
00230     mDct = 750; //  h^-1
00231     mDd = 5;    //  h^-1
00232     mDdx = 5;   //  h^-1
00233     mDt = 0.4;  //  h^-1
00234     mDu = 50;   //  h^-1
00235     mDx = 100;  //  h^-1
00236     mDy = 1;    //  h^-1
00237     mKc = 200;  //  nM
00238     mKd = 5;    //  nM
00239     mKt = 50;   //  nM
00240     mPc = 0.0;  //  h^-1
00241     mPu = 100;  //  h^-1
00242     mXiD = 5;   //  h^-1
00243     mXiDx = 5;  //  h^-1
00244     mXiX = 200; //  h^-1
00245     if (mHypothesis==1)
00246     {
00247         mXiC = 0.0; //  h^-1 (FOR HYPOTHESIS ONE)
00248     }
00249     else
00250     {
00251         mXiC = 5000.0;   //  h^-1 (FOR HYPOTHESIS TWO)
00252     }
00253 }
00254 
00255 void VanLeeuwen2009WntSwatCellCycleOdeSystem::EvaluateYDerivatives(double time, const std::vector<double>& rY, std::vector<double>& rDY)
00256 {
00257     double r = rY[0];
00258     double e = rY[1];
00259     double i = rY[2];
00260     double j = rY[3];
00261     double p = rY[4];
00262 
00263     double dx1 = 0.0;
00264     double dx2 = 0.0;
00265     double dx3 = 0.0;
00266     double dx4 = 0.0;
00267     double dx5 = 0.0;
00268 
00269     // Bit back-to-front, but work out the Wnt section first...
00270 
00271     // Variables
00272     double D = rY[5];
00273     double X = rY[6];
00274     double Cu = rY[7];
00275     double Co = rY[8];
00276     double Cc = rY[9];
00277     double Mo = rY[10];
00278     double Mc = rY[11];
00279     double A = rY[12];
00280     double Ca = rY[13];
00281     double Ma = rY[14];
00282     double T = rY[15];
00283     double Cot = rY[16];
00284     double Cct = rY[17];
00285     double Mot = rY[18];
00286     double Mct = rY[19];
00287     double Y = rY[20];
00288     double stimulus_wnt = rY[21];
00289 
00290     // Totals
00291     double Cf = Cc+Co;
00292     double Ct = Cct+Cot;
00293     double Mf = Mc+Mo;
00294     double Mt = Mct+Mot;
00295 
00296     double d_d_hat = mDd + mXiD*stimulus_wnt;
00297     double d_d_x_hat = mDdx + mXiDx*stimulus_wnt;
00298     double d_x_hat = mDx + mXiX*stimulus_wnt;
00299     double p_c_hat = mPc + mXiC*stimulus_wnt;
00300 
00301     double sigma_D = 0.0;   // for healthy cells
00302     double sigma_B = 0.0;   // for healthy cells
00303 
00304     if (!mpMutationState)
00305     {
00306         // No mutations specified
00307     }
00308     else if (mpMutationState->IsType<ApcOneHitCellMutationState>())
00309     {
00310         sigma_D = 0.5;
00311     }
00312     else if (mpMutationState->IsType<ApcTwoHitCellMutationState>())
00313     {
00314         sigma_D = 1.0;
00315     }
00316     else if (mpMutationState->IsType<BetaCateninOneHitCellMutationState>())
00317     {
00318         sigma_B = 0.5;
00319     }
00320     // Other mutations have no effect.
00321 
00322     // Now the cell cycle stuff...
00323 
00324     // dr
00325     dx1 = e/(mKm1d+e)*mJ11d/(mJ11d+r)*mJ61d/(mJ61d+p) - mk16d*r*j+mk61d*p-mphi_r*r;
00326     // de
00327     dx2 = mkpd+mk2d*(mad*mad+e*e)/(1+e*e)*mJ12d/(mJ12d+r)*mJ62d/(mJ62d+p) - e;
00328     // di - changed to include Ct+Mt - transcriptional beta-catenin
00329     dx3 = mk3d*(Ct+Mt) + mk23d*e*mJ13d/(mJ13d+r)*mJ63d/(mJ63d+p) + mk43d*j - mk34d*i*j/(1+j) - mphi_i*i;
00330     // dj
00331     dx4 = mk34d*i*j/(1+j) - (mk43d+mphi_j)*j;
00332     // dp
00333     dx5 = mk16d*r*j - mk61d*p - mphi_p*p;
00334 
00335     double factor = mPhiE2F1*60.0;  // Convert non-dimensional d/dt s to d/dt in hours.
00336 
00337     rDY[0] = dx1*factor;
00338     rDY[1] = dx2*factor;
00339     rDY[2] = dx3*factor;
00340     rDY[3] = dx4*factor;
00341     rDY[4] = dx5*factor;
00342 
00343     // The van Leeuwen ODE system
00344     rDY[5] = (1.0-sigma_D)*mSd*X - (d_d_hat + d_d_x_hat)*D;
00345     rDY[6] = mSx - (1.0-sigma_D)*mSd*X - d_x_hat*X + d_d_x_hat*D;
00346     rDY[7] = (mPu*D*Cf)/(Cf+mKd) - mDu*Cu;
00347 
00348     rDY[8] = (1.0-sigma_B)*mSc + mDca*Ca + mDct*Cot - (mSca*A + mSct*T + mDc)*Co
00349              - (p_c_hat*Co)/(Co + Mo + mKc) - (mPu*D*Co)/(Cf+mKd);
00350 
00351     rDY[9] = (p_c_hat*Co)/(Co + Mo + mKc) + mDct*Cct - (mSct*T + mDc)*Cc
00352              - (mPu*D*Cc)/(Cf+mKd);
00353 
00354     rDY[10] = sigma_B*mSc + mDca*Ma + mDct*Mot - (mSca*A + mSct*T + mDc)*Mo
00355              - (p_c_hat*Mo)/(Co + Mo + mKc);
00356 
00357     rDY[11] = (p_c_hat*Mo)/(Co + Mo + mKc) + mDct*Mct - (mSct*T + mDc)*Mc;
00358     rDY[12] = mSa + mDca*(Ca+Ma) - (mSca*(Co+Mo) + mDa)*A;
00359     rDY[13] = mSca*Co*A - mDca*Ca;
00360     rDY[14] = mSca*Mo*A - mDca*Ma;
00361     rDY[15] = mSt + mDct*(Ct+Mt) - mSct*(Cf+Mf)*T - mDt*T;
00362     rDY[16] = mSct*Co*T - mDct*Cot;
00363     rDY[17] = mSct*Cc*T - mDct*Cct;
00364     rDY[18] = mSct*Mo*T - mDct*Mot;
00365     rDY[19] = mSct*Mc*T - mDct*Mct;
00366     rDY[20] = (mSy*(Ct+Mt))/(Ct + Mt + mKt) - mDy*Y;
00367     rDY[21] = 0.0;  // don't interfere with Wnt stimulus
00368 }
00369 
00370 const boost::shared_ptr<AbstractCellMutationState> VanLeeuwen2009WntSwatCellCycleOdeSystem::GetMutationState() const
00371 {
00372     return mpMutationState;
00373 }
00374 
00375 bool VanLeeuwen2009WntSwatCellCycleOdeSystem::CalculateStoppingEvent(double time, const std::vector<double>& rY)
00376 {
00377     std::vector<double> dy(rY.size());
00378     EvaluateYDerivatives(time, rY, dy);
00379 
00380     return (rY[1] > 1.0 && dy[1] > 0.0);
00381 }
00382 
00383 double VanLeeuwen2009WntSwatCellCycleOdeSystem::CalculateRootFunction(double time, const std::vector<double>& rY)
00384 {
00385     return rY[1] - 1.0;
00386 }
00387 
00388 template<>
00389 void CellwiseOdeSystemInformation<VanLeeuwen2009WntSwatCellCycleOdeSystem>::Initialise()
00390 {
00391     this->mVariableNames.push_back("pRb");
00392     this->mVariableUnits.push_back("non_dim");
00393     this->mInitialConditions.push_back(7.357000000000000e-01);
00394 
00395     this->mVariableNames.push_back("E2F1");
00396     this->mVariableUnits.push_back("non_dim");
00397     this->mInitialConditions.push_back(1.713000000000000e-01);
00398 
00399     this->mVariableNames.push_back("CycD_i");
00400     this->mVariableUnits.push_back("non_dim");
00401     this->mInitialConditions.push_back(6.900000000000001e-02);
00402 
00403     this->mVariableNames.push_back("CycD_a");
00404     this->mVariableUnits.push_back("non_dim");
00405     this->mInitialConditions.push_back(3.333333333333334e-03);
00406 
00407     this->mVariableNames.push_back("pRb_p");
00408     this->mVariableUnits.push_back("non_dim");
00409     this->mInitialConditions.push_back(1.000000000000000e-04);
00410 
00411     this->mVariableNames.push_back("D");  // Destruction complex (APC/Axin/GSK3B)
00412     this->mVariableUnits.push_back("nM");
00413     this->mInitialConditions.push_back(NAN); // will be filled in later
00414 
00415     this->mVariableNames.push_back("X");  // Axin
00416     this->mVariableUnits.push_back("nM");
00417     this->mInitialConditions.push_back(NAN); // will be filled in later
00418 
00419     this->mVariableNames.push_back("Cu"); // beta-catenin to be ubiquitinated
00420     this->mVariableUnits.push_back("nM");
00421     this->mInitialConditions.push_back(NAN); // will be filled in later
00422 
00423     this->mVariableNames.push_back("Co"); // Open form beta-catenin
00424     this->mVariableUnits.push_back("nM");
00425     this->mInitialConditions.push_back(NAN); // will be filled in later
00426 
00427     this->mVariableNames.push_back("Cc"); // Closed form beta-catenin
00428     this->mVariableUnits.push_back("nM");
00429     this->mInitialConditions.push_back(NAN); // will be filled in later
00430 
00431     this->mVariableNames.push_back("Mo"); // Open form mutant beta-catenin
00432     this->mVariableUnits.push_back("nM");
00433     this->mInitialConditions.push_back(0.0);
00434 
00435     this->mVariableNames.push_back("Mc"); // Closed form mutant beta-catenin
00436     this->mVariableUnits.push_back("nM");
00437     this->mInitialConditions.push_back(0.0);
00438 
00439     this->mVariableNames.push_back("A");  // 'Free' adhesion molecules
00440     this->mVariableUnits.push_back("nM");
00441     this->mInitialConditions.push_back(NAN); // will be filled in later
00442 
00443     this->mVariableNames.push_back("Ca"); // Co-A Adhesion complex
00444     this->mVariableUnits.push_back("nM");
00445     this->mInitialConditions.push_back(NAN); // will be filled in later
00446 
00447     this->mVariableNames.push_back("Ma"); // Mo-A Mutant adhesion complex
00448     this->mVariableUnits.push_back("nM");
00449     this->mInitialConditions.push_back(0.0);
00450 
00451     this->mVariableNames.push_back("T"); // `Free' transcription molecules (TCF)
00452     this->mVariableUnits.push_back("nM");
00453     this->mInitialConditions.push_back(NAN); // will be filled in later
00454 
00455     this->mVariableNames.push_back("Cot"); // Co-T open form beta-catenin/TCF
00456     this->mVariableUnits.push_back("nM");
00457     this->mInitialConditions.push_back(NAN); // will be filled in later
00458 
00459     this->mVariableNames.push_back("Cct"); // Cc-T closed beta-catenin/TCF
00460     this->mVariableUnits.push_back("nM");
00461     this->mInitialConditions.push_back(NAN); // will be filled in later
00462 
00463     this->mVariableNames.push_back("Mot"); // Mo-T open form mutant beta-catenin/TCF
00464     this->mVariableUnits.push_back("nM");
00465     this->mInitialConditions.push_back(0.0);
00466 
00467     this->mVariableNames.push_back("Mct"); // Mc-T closed form mutant beta-catenin/TCF
00468     this->mVariableUnits.push_back("nM");
00469     this->mInitialConditions.push_back(0.0);
00470 
00471     this->mVariableNames.push_back("Y"); // Wnt target protein
00472     this->mVariableUnits.push_back("nM");
00473     this->mInitialConditions.push_back(NAN); // will be filled in later
00474 
00475     this->mVariableNames.push_back("Sw"); // Wnt stimulus
00476     this->mVariableUnits.push_back("nM");
00477     this->mInitialConditions.push_back(NAN); // will be filled in later
00478 
00479     this->mInitialised = true;
00480 }
00481 
00482 double VanLeeuwen2009WntSwatCellCycleOdeSystem::GetWntLevel() const
00483 {
00484     return mWntLevel;
00485 }
00486 
00487 unsigned VanLeeuwen2009WntSwatCellCycleOdeSystem::GetHypothesis() const
00488 {
00489     return mHypothesis;
00490 }
00491 
00492 // Serialization for Boost >= 1.36
00493 #include "SerializationExportWrapperForCpp.hpp"
00494 CHASTE_CLASS_EXPORT(VanLeeuwen2009WntSwatCellCycleOdeSystem)