void CellBetaCateninWriter<ELEMENT_DIM, SPACE_DIM>::VisitCell(CellPtr pCell, AbstractCellPopulation<ELEMENT_DIM, SPACE_DIM>* pCellPopulation)
{
    assert(SPACE_DIM == 2);

    unsigned global_index = pCellPopulation->GetLocationIndexUsingCell(pCell);
    double x = pCellPopulation->GetLocationOfCellCentre(pCell)[0];
    double y = pCellPopulation->GetLocationOfCellCentre(pCell)[1];

    AbstractVanLeeuwen2009WntSwatCellCycleModel* p_model = dynamic_cast<AbstractVanLeeuwen2009WntSwatCellCycleModel*>(pCell->GetCellCycleModel());
    double b_cat_membrane = p_model->GetMembraneBoundBetaCateninLevel();
    double b_cat_cytoplasm = p_model->GetCytoplasmicBetaCateninLevel();
    double b_cat_nuclear = p_model->GetNuclearBetaCateninLevel();

    *this->mpOutStream << global_index << " " << x << " " << y << " " << b_cat_membrane << " " << b_cat_cytoplasm << " " << b_cat_nuclear << " ";
}
double CellProliferativePhasesWriter<ELEMENT_DIM, SPACE_DIM>::GetCellDataForVtkOutput(CellPtr pCell, AbstractCellPopulation<ELEMENT_DIM, SPACE_DIM>* pCellPopulation)
{
    double phase = pCell->GetCellCycleModel()->GetCurrentCellCyclePhase();
    return phase;
}
void CellProliferativePhasesWriter<ELEMENT_DIM, SPACE_DIM>::VisitCell(CellPtr pCell, AbstractCellPopulation<ELEMENT_DIM, SPACE_DIM>* pCellPopulation)
{
    double phase = pCell->GetCellCycleModel()->GetCurrentCellCyclePhase();
    *this->mpOutStream << phase << " ";
}
void CellCycleModelProteinConcentrationsWriter<ELEMENT_DIM, SPACE_DIM>::VisitCell(CellPtr pCell, AbstractCellPopulation<ELEMENT_DIM, SPACE_DIM>* pCellPopulation)
{
    AbstractOdeBasedCellCycleModel* p_model = dynamic_cast<AbstractOdeBasedCellCycleModel*>(pCell->GetCellCycleModel());
    if (p_model)
    {
        // Write location index corresponding to cell
        *this->mpOutStream << pCellPopulation->GetLocationIndexUsingCell(pCell) << " ";

        // Write cell variables
        std::vector<double> proteins = p_model->GetProteinConcentrations();
        for (unsigned i=0; i<proteins.size(); i++)
        {
            *this->mpOutStream << proteins[i] << " ";
        }
    }
    else
    {
        EXCEPTION("CellCycleModelProteinConcentrationsWriter cannot be used with a cell-cycle model that does not inherit from AbstractOdeBasedCellCycleModel");
    }
}
void SetReadyToDivide(CellPtr pCell, bool Ready){
    AbstractCellCycleModel* model = pCell->GetCellCycleModel();
    dynamic_cast<StatechartCellCycleModelSerializable*>(model)->SetReadyToDivide(Ready);
};
//Setters for cell cycle model
void SetCellCyclePhase(CellPtr pCell, CellCyclePhase_ phase){
    AbstractCellCycleModel* model = pCell->GetCellCycleModel();
    dynamic_cast<StatechartCellCycleModelSerializable*>(model)->SetCellCyclePhase(phase);
}
double GetG2Duration(CellPtr pCell){
    return pCell->GetCellCycleModel()->GetG2Duration();
};
void FoodDifferentialByLabelAreaModifier<DIM>::UpdateTargetAreaOfCell(
		CellPtr pCell) {
	// Get target area A of a healthy cell in S, G2 or M phase
	double cell_target_area = this->mReferenceTargetArea;
	//std::cout<<GetCellularFood()<<std::endl;

	if (!pCell->ReadyToDivide()) {
		if (pCell->HasCellProperty<ApoptoticCellProperty>()) {
			//std::cout<<"apoptotic!!"<<std::endl;
			cell_target_area = cell_target_area - 0.001 * cell_target_area;

			// Don't allow a negative target area
			if (cell_target_area < 0) {
				cell_target_area = 0;
			}
		} else {
			if (pCell->template HasCellProperty<CellLabel>()) {
				double cell_age = pCell->GetAge();
				double growth_start_time = 5;
				AbstractCellCycleModel* p_model = pCell->GetCellCycleModel();

				if (cell_age > growth_start_time) {
					if (GetCellularFood() > 1
							&& cell_target_area <= 2 * cAreaIdeal) {
						double g2_duration = p_model->GetG2Duration();
						cell_target_area *=
								(1
										+ (cell_age - growth_start_time)
										/ (g2_duration * 2));
						DecreaseCellularFood();
						DecreaseCellularFood();

						if (pCell->template HasCellProperty<ApoptoticCellProperty>()) {
							pCell->template RemoveCellProperty<ApoptoticCellProperty>();
						}

					} else {
						MAKE_PTR(ApoptoticCellProperty, apoptotic);
						pCell->AddCellProperty(apoptotic);
					}
				}
			} else {
				double cell_age = pCell->GetAge();
				double growth_start_time = 7;
				AbstractCellCycleModel* p_model = pCell->GetCellCycleModel();

				//std::cout<<"edad: "<< cell_age <<" "<< growth_start_time<<std::endl;
				// The target area of a proliferating cell increases linearly from A to 2A over the course of the G2 phase
				if (cell_age > growth_start_time
						&& cell_target_area <= 2 * cAreaIdeal && pCell->GetCellData()->GetItem("Fitness") > 0) {

					double g2_duration = p_model->GetG2Duration();
					cell_target_area *= (1
							+ ((cell_age-growth_start_time) * pCell->GetCellData()->GetItem("Fitness")
									/ (g2_duration * 1)));
				}
				IncreaseCellularFood();
			}
		}
	}

	if (cell_target_area > 2.2){
		cell_target_area = 2.2;
	}

	// Set cell data
	pCell->GetCellData()->SetItem("target area", cell_target_area);
}