WntCellCycleOdeSystem.cpp

00001 /*
00002 
00003 Copyright (C) University of Oxford, 2005-2010
00004 
00005 University of Oxford means the Chancellor, Masters and Scholars of the
00006 University of Oxford, having an administrative office at Wellington
00007 Square, Oxford OX1 2JD, UK.
00008 
00009 This file is part of Chaste.
00010 
00011 Chaste is free software: you can redistribute it and/or modify it
00012 under the terms of the GNU Lesser General Public License as published
00013 by the Free Software Foundation, either version 2.1 of the License, or
00014 (at your option) any later version.
00015 
00016 Chaste is distributed in the hope that it will be useful, but WITHOUT
00017 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
00018 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
00019 License for more details. The offer of Chaste under the terms of the
00020 License is subject to the License being interpreted in accordance with
00021 English Law and subject to any action against the University of Oxford
00022 being under the jurisdiction of the English Courts.
00023 
00024 You should have received a copy of the GNU Lesser General Public License
00025 along with Chaste. If not, see <http://www.gnu.org/licenses/>.
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(); // set up parameter values
00055 
00056     // Set up a Wnt signalling pathway in a steady state
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         // No mutations specified
00064     }
00065     else if (mpMutationState && mpMutationState->IsType<ApcOneHitCellMutationState>())
00066     {
00067         // APC +/- : only half are active
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         // APC -/-
00074         destruction_level = 0.0; // no active destruction complex
00075         beta_cat_level_1 = 0.5; // fully active beta-catenin
00076         beta_cat_level_2 = 0.5; // fully active beta-catenin
00077     }
00078     else if (mpMutationState && mpMutationState->IsType<BetaCateninOneHitCellMutationState>())
00079     {
00080         // Beta-cat delta 45
00081         beta_cat_level_1 = 0.5*ma2d/(ma2d+ma3d*destruction_level);
00082         beta_cat_level_2 = 0.5;
00083     }
00084     else
00085     {
00086         // healthy cells
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     // Cell-specific initial conditions
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     // Do nothing
00106 }
00107 
00108 void WntCellCycleOdeSystem::Init()
00109 {
00110     // Initialise model parameter values
00111     // Swat (2004) Parameters
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     // Mirams et al. parameter values
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     // Non-dimensionalise...
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      * The variables are
00198      * 1. r = pRb
00199      * 2. e = E2F1
00200      * 3. i = CycD (inactive)
00201      * 4. j = CycD (active)
00202      * 5. p = pRb-p
00203      * 6. c = APC (Active)
00204      * 7. b = Beta-Catenin
00205     */
00206 
00207     // Bit back-to-front, but work out the Wnt section first...
00208 
00209     // Mutations take effect by altering the level of beta-catenin
00210     if (!mpMutationState)
00211     {
00212         // No mutations specified
00213     }
00214     else if (mpMutationState->IsType<ApcOneHitCellMutationState>()) // APC +/-
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>()) // APC -/-
00221     {
00222         dx6 = 0.0;
00223         dx7 = ma2d*(0.5-b1);
00224         dx8 = ma2d*(0.5-b2);
00225     }
00226     else if (mpMutationState->IsType<BetaCateninOneHitCellMutationState>()) // Beta-Cat D45
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         // da
00235         dx6 = ma5d*(1.0-c) - ma4d*wnt_level*c;
00236         // db
00237         dx7 = ma2d*(0.5-b1) - ma3d*b1*c;
00238         dx8 = ma2d*(0.5-b2) - ma3d*b2*c;
00239     }
00240 
00241     // Now the cell cycle stuff...
00242 
00243     // dr
00244     dx1 = e/(mKm1d+e)*mJ11d/(mJ11d+r)*mJ61d/(mJ61d+p) - mk16d*r*j+mk61d*p-mphi_r*r;
00245     // de
00246     dx2 = mkpd+mk2d*(mad*mad+e*e)/(1+e*e)*mJ12d/(mJ12d+r)*mJ62d/(mJ62d+p) - e;
00247     // di
00248     dx3 = mk3d*(b1+b2) + mk23d*e*mJ13d/(mJ13d+r)*mJ63d/(mJ63d+p) + mk43d*j - mk34d*i*j/(1+j) - mphi_i*i;
00249     // dj
00250     dx4 = mk34d*i*j/(1+j) - (mk43d+mphi_j)*j;
00251     // dp
00252     dx5 = mk16d*r*j - mk61d*p - mphi_p*p;
00253 
00254     double factor = mPhiE2F1*60.0;  // convert non-dimensional d/dt s to d/dt in hours
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; // beta-cat allele 1
00263     rDY[7] = dx8*factor; // beta-cat allele 2
00264     rDY[8] = 0.0; // do not change the Wnt level
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;  // Convert non-dimensional d/dt s to d/dt in hours.
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); // will be filled in later
00318 
00319     this->mVariableNames.push_back("Beta_Cat1");
00320     this->mVariableUnits.push_back("non_dim");
00321     this->mInitialConditions.push_back(NAN); // will be filled in later
00322 
00323     this->mVariableNames.push_back("Beta_Cat2");
00324     this->mVariableUnits.push_back("non_dim");
00325     this->mInitialConditions.push_back(NAN); // will be filled in later
00326 
00327     this->mVariableNames.push_back("Wnt");
00328     this->mVariableUnits.push_back("non_dim");
00329     this->mInitialConditions.push_back(NAN); // will be filled in later
00330 
00331     this->mInitialised = true;
00332 }

Generated by  doxygen 1.6.2