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

Generated on Tue Aug 4 16:10:21 2009 for Chaste by  doxygen 1.5.5