VanLeeuwen2009WntSwatCellCycleOdeSystem.cpp

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

Generated by  doxygen 1.6.2