WntCellCycleOdeSystem.cpp

00001 /*
00002 
00003 Copyright (C) University of Oxford, 2005-2009
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 WntCellCycleOdeSystem::WntCellCycleOdeSystem(double WntLevel, const CellMutationState& rMutationState)
00032         : AbstractOdeSystem(9)
00033 {
00034     mpSystemInfo.reset(new CellwiseOdeSystemInformation<WntCellCycleOdeSystem>);
00035     
00050     Init(); // set up parameter values
00051 
00052     double destruction_level = ma5d/(ma4d*WntLevel+ma5d);
00053     double beta_cat_level_1 = -1.0;
00054     double beta_cat_level_2 = -1.0;
00055 
00056     mMutationState = rMutationState;
00057 
00058     // These three lines set up a Wnt signalling pathway in a steady state
00059     if (mMutationState == HEALTHY || mMutationState == LABELLED)    // healthy cells
00060     {
00061         beta_cat_level_1 = 0.5*ma2d/(ma2d+ma3d*destruction_level);
00062         beta_cat_level_2 = 0.5*ma2d/(ma2d+ma3d*destruction_level);
00063     }
00064     else if (mMutationState == APC_ONE_HIT) // APC +/-
00065     {
00066         beta_cat_level_1 = 0.5*ma2d/(ma2d+0.5*ma3d*destruction_level); // only half are active
00067         beta_cat_level_2 = 0.5*ma2d/(ma2d+0.5*ma3d*destruction_level);
00068     }
00069     else if (mMutationState == BETA_CATENIN_ONE_HIT) // Beta-cat delta 45
00070     {
00071         beta_cat_level_1 = 0.5*ma2d/(ma2d+ma3d*destruction_level);
00072         beta_cat_level_2 = 0.5;
00073     }
00074     else if (mMutationState == APC_TWO_HIT) // APC -/-
00075     {
00076         destruction_level = 0.0; // no active destruction complex
00077         beta_cat_level_1 = 0.5; // fully active beta-catenin
00078         beta_cat_level_2 = 0.5; // fully active beta-catenin
00079     }
00080     else
00081     {
00082         // can't get here until new mutation states are added to CellMutationState
00083         NEVER_REACHED;
00084     }
00085 
00086     // Cell-specific initial conditions
00087     SetInitialConditionsComponent(5u, destruction_level);
00088     SetInitialConditionsComponent(6u, beta_cat_level_1);
00089     SetInitialConditionsComponent(7u, beta_cat_level_2);
00090     SetInitialConditionsComponent(8u, WntLevel);
00091 }
00092 
00093 void WntCellCycleOdeSystem::SetMutationState(const CellMutationState& rMutationState)
00094 {
00095     mMutationState = rMutationState;
00096 }
00097 
00098 WntCellCycleOdeSystem::~WntCellCycleOdeSystem(void)
00099 {
00100     // Do nothing
00101 }
00102 
00103 void WntCellCycleOdeSystem::Init()
00104 {
00105     // Initialise model parameter values
00106     // Swat (2004) Parameters
00107     double k1 = 1.0;
00108     double k2 = 1.6;
00109     double k3 = 0.05;
00110     double k16 = 0.4;
00111     double k34 = 0.04;
00112     double k43 = 0.01;
00113     double k61 = 0.3;
00114     double k23 = 0.3;
00115     double a = 0.04;
00116     double J11 = 0.5;
00117     double J12 = 5.0;
00118     double J61 = 5.0;
00119     double J62 = 8.0;
00120     double J13 = 0.002;
00121     double J63 = 2.0;
00122     double Km1 = 0.5;
00123     double Km2 = 4.0;
00124     double Km4 = 0.3;
00125     double kp = 0.05;
00126     double phi_pRb = 0.005;
00127     double phi_E2F1 = 0.1;
00128     double phi_CycDi = 0.023;
00129     double phi_CycDa = 0.03;
00130     double phi_pRbp = 0.06;
00131 
00132     // Mirams et al. parameter values
00133     double a1 = 0.423;
00134     double a2 = 2.57e-4;
00135     double a3 = 1.72;
00136     double a4 = 10.0;
00137     double a5 = 0.5;
00138     double WntMax = 10.0;
00139     double mitogenic_factorF = 6.0e-4;
00140     double APC_Total = 0.02;
00141 
00142     // Non-dimensionalise...
00143     mk2d = k2/(Km2*phi_E2F1);
00144     mk3d = k3*a1*mitogenic_factorF/(Km4*phi_E2F1*a2);
00145     mk34d = k34/phi_E2F1;
00146     mk43d = k43/phi_E2F1;
00147     mk23d = k23*Km2/(Km4*phi_E2F1);
00148     mad = a/Km2;
00149     mJ11d = J11*phi_E2F1/k1;
00150     mJ12d = J12*phi_E2F1/k1;
00151     mJ13d = J13*phi_E2F1/k1;
00152     mJ61d = J61*phi_E2F1/k1;
00153     mJ62d = J62*phi_E2F1/k1;
00154     mJ63d = J63*phi_E2F1/k1;
00155     mKm1d = Km1/Km2;
00156     mkpd = kp/(Km2*phi_E2F1);
00157     mphi_r = phi_pRb/phi_E2F1;
00158     mphi_i = phi_CycDi/phi_E2F1;
00159     mphi_j = phi_CycDa/phi_E2F1;
00160     mphi_p = phi_pRbp/phi_E2F1;
00161     ma2d = a2/phi_E2F1;
00162     ma3d = a3*APC_Total/phi_E2F1;
00163     ma4d = a4*WntMax/phi_E2F1;
00164     ma5d = a5/phi_E2F1;
00165     mk16d = k16*Km4/phi_E2F1;
00166     mk61d = k61/phi_E2F1;
00167     mPhiE2F1 = phi_E2F1;
00168 }
00169 
00170 void WntCellCycleOdeSystem::EvaluateYDerivatives(double time, const std::vector<double> &rY, std::vector<double> &rDY)
00171 {
00172     double r = rY[0];
00173     double e = rY[1];
00174     double i = rY[2];
00175     double j = rY[3];
00176     double p = rY[4];
00177     double c = rY[5];
00178     double b1 = rY[6];
00179     double b2 = rY[7];
00180     double WntLevel = rY[8];
00181 
00182     double dx1 = 0.0;
00183     double dx2 = 0.0;
00184     double dx3 = 0.0;
00185     double dx4 = 0.0;
00186     double dx5 = 0.0;
00187     double dx6 = 0.0;
00188     double dx7 = 0.0;
00189     double dx8 = 0.0;
00190 
00191     /*
00192      * The variables are
00193      * 1. r = pRb
00194      * 2. e = E2F1
00195      * 3. i = CycD (inactive)
00196      * 4. j = CycD (active)
00197      * 5. p = pRb-p
00198      * 6. c = APC (Active)
00199      * 7. b = Beta-Catenin
00200     */
00201 
00202     // Bit back-to-front, but work out the Wnt section first...
00203 
00204     // Mutations take effect by altering the level of beta-catenin
00205     if (mMutationState==HEALTHY || mMutationState==LABELLED)    // HEALTHY CELL
00206     {
00207         // da
00208         dx6 = ma5d*(1.0-c) - ma4d*WntLevel*c;
00209         // db
00210         dx7 = ma2d*(0.5-b1) - ma3d*b1*c;
00211         dx8 = ma2d*(0.5-b2) - ma3d*b2*c;
00212     }
00213     else if (mMutationState==APC_ONE_HIT) // APC +/-
00214     {
00215         dx6 = ma5d*(1.0-c) - ma4d*WntLevel*c;
00216         dx7 = ma2d*(0.5-b1) - 0.5*ma3d*b1*c;
00217         dx8 = ma2d*(0.5-b2) - 0.5*ma3d*b2*c;
00218     }
00219     else if (mMutationState==BETA_CATENIN_ONE_HIT) // Beta-Cat D45
00220     {
00221         dx6 = ma5d*(1.0-c) - ma4d*WntLevel*c;
00222         dx7 = ma2d*(0.5-b1) - ma3d*b1*c;
00223         dx8 = ma2d*(0.5-b2);
00224     }
00225     else if (mMutationState==APC_TWO_HIT) // APC -/-
00226     {
00227         dx6 = 0.0;
00228         dx7 = ma2d*(0.5-b1);
00229         dx8 = ma2d*(0.5-b2);
00230     }
00231     else
00232     {
00233         // Can't get here until new mutation states are added to CellMutationState
00234         NEVER_REACHED;
00235     }
00236 
00237     // Now the cell cycle stuff...
00238 
00239     // dr
00240     dx1 = e/(mKm1d+e)*mJ11d/(mJ11d+r)*mJ61d/(mJ61d+p) - mk16d*r*j+mk61d*p-mphi_r*r;
00241     // de
00242     dx2 = mkpd+mk2d*(mad*mad+e*e)/(1+e*e)*mJ12d/(mJ12d+r)*mJ62d/(mJ62d+p) - e;
00243     // di
00244     dx3 = mk3d*(b1+b2) + mk23d*e*mJ13d/(mJ13d+r)*mJ63d/(mJ63d+p) + mk43d*j - mk34d*i*j/(1+j) - mphi_i*i;
00245     // dj
00246     dx4 = mk34d*i*j/(1+j) - (mk43d+mphi_j)*j;
00247     // dp
00248     dx5 = mk16d*r*j - mk61d*p - mphi_p*p;
00249 
00250     double factor = mPhiE2F1*60.0;  // convert non-dimensional d/dt s to d/dt in hours
00251 
00252     rDY[0] = dx1*factor;
00253     rDY[1] = dx2*factor;
00254     rDY[2] = dx3*factor;
00255     rDY[3] = dx4*factor;
00256     rDY[4] = dx5*factor;
00257     rDY[5] = dx6*factor;
00258     rDY[6] = dx7*factor; // beta-cat allele 1
00259     rDY[7] = dx8*factor; // beta-cat allele 2
00260     rDY[8] = 0.0; // do not change the Wnt level
00261 }
00262 
00263 CellMutationState& WntCellCycleOdeSystem::rGetMutationState()
00264 {
00265     return mMutationState;
00266 }
00267 
00268 bool WntCellCycleOdeSystem::CalculateStoppingEvent(double time, const std::vector<double> &rY)
00269 {
00270     double r = rY[0];
00271     double e = rY[1];
00272     double p = rY[4];
00273     double dY1 = mkpd+mk2d*(mad*mad+e*e)/(1+e*e)*mJ12d/(mJ12d+r)*mJ62d/(mJ62d+p) - e;
00274     double factor = mPhiE2F1*60.0;  // Convert non-dimensional d/dt s to d/dt in hours.
00275     dY1 = dY1*factor;
00276 
00277     assert(!isnan(rY[1]));
00278     assert(!isnan(dY1));
00279     return (rY[1] > 1.0 && dY1 > 0.0);
00280 }
00281 
00282 double WntCellCycleOdeSystem::CalculateRootFunction(double time, const std::vector<double> &rY)
00283 {
00284     return rY[1] - 1.0;
00285 }
00286 
00287 
00288 template<>
00289 void CellwiseOdeSystemInformation<WntCellCycleOdeSystem>::Initialise(void)
00290 {
00291     this->mVariableNames.push_back("pRb");
00292     this->mVariableUnits.push_back("non_dim");
00293     this->mInitialConditions.push_back(7.357000000000000e-01);
00294 
00295     this->mVariableNames.push_back("E2F1");
00296     this->mVariableUnits.push_back("non_dim");
00297     this->mInitialConditions.push_back(1.713000000000000e-01);
00298 
00299     this->mVariableNames.push_back("CycD_i");
00300     this->mVariableUnits.push_back("non_dim");
00301     this->mInitialConditions.push_back(6.900000000000001e-02);
00302 
00303     this->mVariableNames.push_back("CycD_a");
00304     this->mVariableUnits.push_back("non_dim");
00305     this->mInitialConditions.push_back(3.333333333333334e-03);
00306 
00307     this->mVariableNames.push_back("pRb_p");
00308     this->mVariableUnits.push_back("non_dim");
00309     this->mInitialConditions.push_back(1.000000000000000e-04);
00310 
00311     this->mVariableNames.push_back("APC");
00312     this->mVariableUnits.push_back("non_dim");
00313     this->mInitialConditions.push_back(NAN); // will be filled in later
00314 
00315     this->mVariableNames.push_back("Beta_Cat1");
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_Cat2");
00320     this->mVariableUnits.push_back("non_dim");
00321     this->mInitialConditions.push_back(NAN); // will be filled in later
00322 
00323     this->mVariableNames.push_back("Wnt");
00324     this->mVariableUnits.push_back("non_dim");
00325     this->mInitialConditions.push_back(NAN); // will be filled in later
00326     
00327     this->mInitialised = true;
00328 }

Generated on Wed Mar 18 12:51:49 2009 for Chaste by  doxygen 1.5.5