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