Chaste Release::3.1
TysonNovakCellCycleModel.cpp
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 "TysonNovakCellCycleModel.hpp"
00037 
00038 TysonNovakCellCycleModel::TysonNovakCellCycleModel(boost::shared_ptr<AbstractCellCycleModelOdeSolver> pOdeSolver)
00039     : AbstractOdeBasedCellCycleModel(SimulationTime::Instance()->GetTime(), pOdeSolver)
00040 {
00041     if (!mpOdeSolver)
00042     {
00043 #ifdef CHASTE_CVODE
00044         mpOdeSolver = CellCycleModelOdeSolver<TysonNovakCellCycleModel, CvodeAdaptor>::Instance();
00045         mpOdeSolver->Initialise();
00046         // Chaste solvers always check for stopping events, CVODE needs to be instructed to do so
00047         mpOdeSolver->CheckForStoppingEvents();
00048         mpOdeSolver->SetMaxSteps(10000);
00049         mpOdeSolver->SetTolerances(1e-6, 1e-8);
00050 #else
00051         mpOdeSolver = CellCycleModelOdeSolver<TysonNovakCellCycleModel, BackwardEulerIvpOdeSolver>::Instance();
00052         mpOdeSolver->SetSizeOfOdeSystem(6);
00053         mpOdeSolver->Initialise();
00054         SetDt(0.1/60.0);
00055 #endif //CHASTE_CVODE
00056     }
00057 }
00058 
00059 void TysonNovakCellCycleModel::Initialise()
00060 {
00061     assert(mpOdeSystem == NULL);
00062     mpOdeSystem = new TysonNovak2001OdeSystem;
00063     mpOdeSystem->SetStateVariables(mpOdeSystem->GetInitialConditions());
00064 
00065     AbstractCellCycleModel::Initialise();
00066 }
00067 
00068 void TysonNovakCellCycleModel::ResetForDivision()
00069 {
00070     AbstractOdeBasedCellCycleModel::ResetForDivision();
00071 
00072     assert(mpOdeSystem != NULL);
00073 
00086 #ifdef CHASTE_CVODE
00087     mpOdeSystem->rGetStateVariables()[5] = 0.5*mpOdeSystem->rGetStateVariables()[5];
00088 #else
00089     mpOdeSystem->SetStateVariables(mpOdeSystem->GetInitialConditions());
00090 #endif //CHASTE_CVODE
00091 }
00092 
00093 void TysonNovakCellCycleModel::InitialiseDaughterCell()
00094 {
00095     if (mpCell->GetCellProliferativeType() == STEM)
00096     {
00097         mpCell->SetCellProliferativeType(TRANSIT);
00098     }
00099 }
00100 
00101 AbstractCellCycleModel* TysonNovakCellCycleModel::CreateCellCycleModel()
00102 {
00103     // Create a new cell-cycle model
00104     TysonNovakCellCycleModel* p_model = new TysonNovakCellCycleModel(mpOdeSolver);
00105 
00106     /*
00107      * Set each member variable of the new cell-cycle model that inherits
00108      * its value from the parent.
00109      *
00110      * Note 1: some of the new cell-cycle model's member variables (namely
00111      * mBirthTime, mCurrentCellCyclePhase, mReadyToDivide, mDt, mpOdeSolver)
00112      * will already have been correctly initialized in its constructor.
00113      *
00114      * Note 2: one or more of the new cell-cycle model's member variables
00115      * may be set/overwritten as soon as InitialiseDaughterCell() is called on
00116      * the new cell-cycle model.
00117      *
00118      * Note 3: the member variable mDimension remains unset, since this cell-cycle
00119      * model does not need to know the spatial dimension, so if we were to call
00120      * SetDimension() on the new cell-cycle model an exception would be triggered;
00121      * hence we do not set this member variable.
00122      */
00123     p_model->SetBirthTime(mBirthTime);
00124     p_model->SetMinimumGapDuration(mMinimumGapDuration);
00125     p_model->SetStemCellG1Duration(mStemCellG1Duration);
00126     p_model->SetTransitCellG1Duration(mTransitCellG1Duration);
00127     p_model->SetSDuration(mSDuration);
00128     p_model->SetG2Duration(mG2Duration);
00129     p_model->SetMDuration(mMDuration);
00130     p_model->SetDivideTime(mDivideTime);
00131     p_model->SetFinishedRunningOdes(mFinishedRunningOdes);
00132     p_model->SetG2PhaseStartTime(mG2PhaseStartTime);
00133     p_model->SetLastTime(mLastTime);
00134 
00135     /*
00136      * Create the new cell-cycle model's ODE system and use the current values
00137      * of the state variables in mpOdeSystem as an initial condition.
00138      */
00139     assert(mpOdeSystem);
00140     p_model->SetOdeSystem(new TysonNovak2001OdeSystem);
00141     p_model->SetStateVariables(mpOdeSystem->rGetStateVariables());
00142 
00143     return p_model;
00144 }
00145 
00146 double TysonNovakCellCycleModel::GetSDuration()
00147 {
00153     return 0.0;
00154 }
00155 
00156 double TysonNovakCellCycleModel::GetG2Duration()
00157 {
00163     return 0.0;
00164 }
00165 
00166 double TysonNovakCellCycleModel::GetMDuration()
00167 {
00173     return 0.0;
00174 }
00175 
00176 double TysonNovakCellCycleModel::GetAverageTransitCellCycleTime()
00177 {
00178     return 1.25;
00179 }
00180 
00181 double TysonNovakCellCycleModel::GetAverageStemCellCycleTime()
00182 {
00183     return 1.25;
00184 }
00185 
00186 bool TysonNovakCellCycleModel::CanCellTerminallyDifferentiate()
00187 {
00188     return false;
00189 }
00190 
00191 void TysonNovakCellCycleModel::OutputCellCycleModelParameters(out_stream& rParamsFile)
00192 {
00193     // No new parameters to output, so just call method on direct parent class
00194     AbstractOdeBasedCellCycleModel::OutputCellCycleModelParameters(rParamsFile);
00195 }
00196 
00197 // Serialization for Boost >= 1.36
00198 #include "SerializationExportWrapperForCpp.hpp"
00199 CHASTE_CLASS_EXPORT(TysonNovakCellCycleModel)
00200 #include "CellCycleModelOdeSolverExportWrapper.hpp"
00201 EXPORT_CELL_CYCLE_MODEL_ODE_SOLVER(TysonNovakCellCycleModel)