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

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