Files @ a58b80c85b6f
Branch filter:

Location: EI/VirtualLeaf/src/build_models/auxingrowthplugin.cpp - annotation

Michael Guravage
Cleanup: e.g. removed commented out and otherwise disabled code.
--
user: Michael Guravage <michael.guravage@cwi.nl>
branch 'default'

changed src/OptionFileDialog.cpp
changed src/OptionFileDialog.h
changed src/UniqueMessage.cpp
changed src/VirtualLeaf.cpp
changed src/apoplastitem.cpp
changed src/apoplastitem.h
changed src/build_models/auxingrowthplugin.cpp
changed src/build_models/meinhardtplugin.cpp
changed src/build_models/testplugin.h
changed src/canvas.cpp
changed src/canvas.h
changed src/cell.cpp
changed src/cell.h
changed src/cellbase.cpp
changed src/cellbase.h
changed src/data_plot.cpp
changed src/data_plot.h
changed src/flux_function.h
changed src/forwardeuler.cpp
changed src/infobar.h
changed src/mainbase.cpp
changed src/mainbase.h
changed src/matrix.cpp
changed src/mesh.h
changed src/modelcatalogue.cpp
changed src/node.cpp
changed src/node.h
changed src/nodeitem.cpp
changed src/nodeset.h
changed src/output.cpp
changed src/output.h
changed src/parse.cpp
changed src/parse.h
changed src/random.cpp
changed src/random.h
changed src/sqr.h
changed src/vector.h
changed src/vleafmodel.h
changed src/wall.cpp
changed src/wallbase.cpp
changed src/wallbase.h
changed src/wallitem.cpp
changed src/wallitem.h
changed src/warning.cpp
changed src/warning.h
changed src/xmlwrite.cpp
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
413a4067bfff
137d9d3a313a
137d9d3a313a
79f94eaa3b9e
413a4067bfff
79f94eaa3b9e
79f94eaa3b9e
413a4067bfff
413a4067bfff
79f94eaa3b9e
79f94eaa3b9e
413a4067bfff
413a4067bfff
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
413a4067bfff
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
413a4067bfff
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
413a4067bfff
413a4067bfff
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
413a4067bfff
79f94eaa3b9e
413a4067bfff
413a4067bfff
413a4067bfff
413a4067bfff
79f94eaa3b9e
413a4067bfff
413a4067bfff
79f94eaa3b9e
79f94eaa3b9e
413a4067bfff
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
a58b80c85b6f
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
a58b80c85b6f
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
413a4067bfff
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
413a4067bfff
79f94eaa3b9e
79f94eaa3b9e
413a4067bfff
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
79f94eaa3b9e
/*
 *
 *  This file is part of the Virtual Leaf.
 *
 *  The Virtual Leaf is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  The Virtual Leaf is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with the Virtual Leaf.  If not, see <http://www.gnu.org/licenses/>.
 *
 *  Copyright 2010 Roeland Merks.
 *
 */

#include <QObject>
#include <QtGui>
#include "../simplugin.h"

#include "parameter.h"

#include "wallbase.h"
#include "cellbase.h"
#include "auxingrowthplugin.h"

#include "far_mem_5.h"

static const std::string _module_id("$Id$");

bool batch = false;


// To be executed after cell division
void AuxinGrowthPlugin::OnDivide(ParentInfo *parent_info, CellBase *daughter1, CellBase *daughter2) {
  parent_info = NULL; // merely to obviate compile time error

	// Auxin distributes between parent and daughter according to area
	double area1 = daughter1->Area(), area2 = daughter2->Area();
	double tot_area = area1 + area2;
	
	daughter1->SetChemical(0,daughter1->Chemical(0)*(area1/tot_area));
	daughter2->SetChemical(0,daughter2->Chemical(0)*(area2/tot_area));
	
	// After divisions, parent and daughter cells get a standard stock of PINs.
	daughter1->SetChemical(1, par->initval[1]);
	daughter2->SetChemical(1, par->initval[1]);
	
	
	// Reset transporter values of parent and daughter
	QList<WallBase *> walls;
	foreach(WallBase *w, walls) { 
		w->setTransporter(daughter1, 1, 0.);
	}
	
}

void AuxinGrowthPlugin::SetCellColor(CellBase *c, QColor *color) { 

	// Red: PIN1
	// Green: Auxin
	if (c->CellType()==1) color->setNamedColor("Blue"); 
	else color->setRgb(c->Chemical(1)/(1+c->Chemical(1)) * 255.,(c->Chemical(0)/(1+c->Chemical(0)) * 255.),/* (chem[2]/(1+chem[2]) *255.) */ 0);
	
}



void AuxinGrowthPlugin::CellHouseKeeping(CellBase *c) {

	if (c->Boundary()==CellBase::None) {
		if (c->Area() > par->rel_cell_div_threshold * c->BaseArea() ) {
			c->SetChemical(0,0);
			c->Divide();
        }		
		if (c->Chemical(0)>0.6) {
			c->SetCellType(1);
		} 
		// expand according to auxin concentration
   		c->EnlargeTargetArea(par->auxin_dependent_growth?(c->Chemical(0)/(1.+c->Chemical(0)))*par->cell_expansion_rate:par->cell_expansion_rate);
	}  
	

}

void AuxinGrowthPlugin::CelltoCellTransport(Wall *w, double *dchem_c1, double *dchem_c2) {

	// leaf edge is const source of auxin
    // (Neumann boundary condition: we specify the influx)
    if (w->C2()->BoundaryPolP()) {
		if (w->AuxinSource()) {
			double aux_flux = par->leaf_tip_source * w->Length();
			dchem_c1[0]+= aux_flux;
			return;
		} else {
			return;
		}
	}
	
	
	if (w->C1()->BoundaryPolP()) {
		
		if (w->AuxinSource()) {
			double aux_flux = par->leaf_tip_source * w->Length();
			dchem_c2[0] += aux_flux;
			return;
		} else {
			
			if (w->AuxinSink()) {
				
				// efflux into Shoot Apical meristem
				// we assume all PINs are directed towards shoot apical meristem
				dchem_c2[0] -= par->sam_efflux * w->C2()->Chemical(0) / (par->ka + w->C2()->Chemical(0));
				
				return;
			} else 
				return;
		}
    }
	
    
	// Passive fluxes (Fick's law)
    // only auxin flux now
    // flux depends on edge length and concentration difference
    int c=0;
    double phi = w->Length() * ( par->D[c] ) * ( w->C2()->Chemical(c) - w->C1()->Chemical(c) );
    dchem_c1[c] += phi; 
    dchem_c2[c] -= phi;
	
    // Active fluxes (PIN1 mediated transport)
	
    // (Transporters measured in moles, here)
    // efflux from cell 1 to cell 2
    double trans12 = ( par->transport * w->Transporters1(1) * w->C1()->Chemical(0) / (par->ka + w->C1()->Chemical(0)) );
	
    // efflux from cell 2 to cell 1
    double trans21 = ( par->transport * w->Transporters2(1) * w->C2()->Chemical(0) / (par->ka + w->C2()->Chemical(0)) );
    
    dchem_c1[0] += trans21 - trans12;
    dchem_c2[0] += trans12 - trans21;
	
}

void AuxinGrowthPlugin::WallDynamics(Wall *w, double *dw1, double *dw2) {

	
	
    // Cells polarize available PIN1 to Shoot Apical Meristem
    if (w->C2()->BoundaryPolP()) {
		if (w->AuxinSink()) {
			
			dw1[0] = 0.; dw2[0] = 0.;
            
			// assume high auxin concentration in SAM, to convince PIN1 to polarize to it
			// exocytosis regulated0
			double nb_auxin = par->sam_auxin;
			double receptor_level = nb_auxin * par->r / (par->kr + nb_auxin);
			
			dw1[1] = par->k1 * w->C1()->Chemical(1) * receptor_level /( par->km + w->C1()->Chemical(1) ) - par->k2 * w->Transporters1(1);
			
			dw2[1] = 0.;
			return;
			
		} else {
			dw1[0]=dw2[0]=dw1[1]=dw2[1];
			return;
		}
    }
    
    if (w->C1()->BoundaryPolP()) {
		if (w->AuxinSink())  {
			
			dw1[0] = 0.; dw2[0] = 0.;
			
			// assume high auxin concentration in SAM, to convince PIN1 to polarize to it
			// exocytosis regulated
			double nb_auxin = par->sam_auxin;
			double receptor_level = nb_auxin * par->r / (par->kr + nb_auxin);
			dw2[1] = par->k1 * w->C2()->Chemical(1) * receptor_level /( par->km + w->C2()->Chemical(1) ) - par->k2 * w->Transporters2(1);
			
			dw1[1] = 0.;
			return;
			
		}  else {
			dw1[0]=dw2[0]=dw1[1]=dw2[1];
			return;
		}
    }
    
    
    
    // PIN1 localization at wall 1
    // Note: chemical 0 is Auxin (intracellular storage only)
    // Chemical 1 is PIN1 (walls and intracellular storage)
    //! \f$ \frac{d Pij/dt}{dt} = k_1 A_j \frac{P_i}{L_ij} - k_2 P_{ij} \f$
    // Note that Pij is measured in term of concentration (mol/L)
    // Pi in terms of quantity (mol)
	
    double dPijdt1=0., dPijdt2=0.;
    
    // normal cell
    double  auxin2 = w->C2()->Chemical(0);
    double receptor_level1 = auxin2 * par->r / (par->kr + auxin2);
    
    dPijdt1 = 
	// exocytosis regulated
    par->k1 * w->C1()->Chemical(1) * receptor_level1 / ( par->km + w->C1()->Chemical(1) ) - par->k2 * w->Transporters1(1);
	
    double  auxin1 = w->C1()->Chemical(0);
    double receptor_level2 = auxin1 * par->r / (par->kr + auxin1);
    
    // normal cell
    dPijdt2 = 
	
	// exocytosis regulated
	par->k1 * w->C2()->Chemical(1) * receptor_level2 / ( par->km + w->C2()->Chemical(1) ) - par->k2 * w->Transporters2(1);
    
    /* PIN1 of neighboring vascular cell inhibits PIN1 endocytosis */
    
    dw1[0] = 0.; dw2[0] = 0.;
    dw1[1] = dPijdt1;
    dw2[1] = dPijdt2;
}

double AuxinGrowthPlugin::complex_PijAj(CellBase *here, CellBase *nb, Wall *w) { 
	
	// gives the amount of complex "auxinreceptor-Pin1"  at the wall (at QSS) 
	//return here.Chemical(1) * nb.Chemical(0) / ( par->km + here.Chemical(1));
	
	double nb_aux = (nb->BoundaryPolP() && w->AuxinSink()) ? par->sam_auxin : nb->Chemical(0);
	double receptor_level = nb_aux * par->r / (par->kr + nb_aux);
	
	return here->Chemical(1) * receptor_level / ( par->km + here->Chemical(1));
	
}

void AuxinGrowthPlugin::CellDynamics(CellBase *c, double *dchem) {
	// Note: Pi and Pij measured in numbers of molecules, not concentrations		
		double dPidt = 0.;
		
		double sum_Pij = c->SumTransporters( 1 );
		
		// exocytosis regulated:
	
	dPidt = -par->k1 * c->ReduceCellAndWalls<double>( far_3_arg_mem_fun( *this, &AuxinGrowthPlugin::complex_PijAj ) ) + par->k2 * sum_Pij;
	
	// production of PIN depends on auxin concentration
	dPidt +=  (c->AtBoundaryP()?par->pin_prod_in_epidermis:par->pin_prod) * c->Chemical(0) - c->Chemical(1) * par->pin_breakdown;
	
	// no PIN production in SAM
	if (c->Boundary() == CellBase::SAM) {
			dchem[1]=0.;
		dchem[0]= - par->sam_auxin_breakdown * c->Chemical(0);
	} else {
		
		dchem[1] = dPidt;
		
		
		// source of auxin
		dchem[0] = par->aux_cons - par->aux_breakdown * c->Chemical(0);
		
	}
	
	
	
}


Q_EXPORT_PLUGIN2(auxingrowthplugin, AuxinGrowthPlugin)