diff --git a/src/build_models/leafplugin.cpp b/src/build_models/leafplugin.cpp deleted file mode 100644 --- a/src/build_models/leafplugin.cpp +++ /dev/null @@ -1,425 +0,0 @@ -/* - * - * 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 . - * - * Copyright 2010 Roeland Merks. - * - */ - -#include -#include - -#include "simplugin.h" - -#include "parameter.h" - -#include "wallbase.h" -#include "cellbase.h" -#include "leafplugin.h" - -#include "far_mem_5.h" - -static const std::string _module_id("$Id$"); - -bool batch = false; - -// To be executed after cell division -void LeafPlugin::OnDivide(ParentInfo *parent_info, CellBase *daughter1, CellBase *daughter2) { - // PIN1 distributes between parent and daughter according to area - double area = daughter1->Area(), daughter_area = daughter2->Area(); - double tot_area = area + daughter_area; - - //chem[1]*=(area/tot_area); - //daughter.chem[1]*=(daughter_area/tot_area); - - // For lack of detailed data, or a better rule, we assume that cells remain polarized - // after division - - // So the PIN1 is redistributed according to the original polarization over the walls - - // parent_info contains info about the parent - // redistribute the PIN in the endosome according to area - - // "Fudge" rule: if one of the cells is at the boundary, remove all AUX1 in the other cell - if (daughter1->AtBoundaryP() && !daughter2->AtBoundaryP()) { - //daughter2->new_chem[2]=daughter2->chem[2]=0.; - daughter2->SetNewChem(2,0); - daughter2->SetChemical(2,0); - //daughter.new_chem[0]=daughter.chem[0]=0.; - //cerr << "Clearing daughter\n"; - //for (list::const_iterator w=daughter.walls.begin(); - // w!=daughter.walls.end(); - // w++) { - - // (*w)->setTransporter(&daughter, 1, 0.); - - //} - //new_chem[2]=chem[2]=parent_info->PINendosome; - daughter1->SetNewChem(2,parent_info->PINendosome); - daughter1->SetChemical(2,parent_info->PINendosome); - - } else { - if (daughter2->AtBoundaryP() && !daughter1->AtBoundaryP()) { - - //new_chem[2]=chem[2]=0.; - daughter1->SetNewChem(2,0); - daughter1->SetChemical(2,0); - - /*new_chem[0]=chem[0]=0.; - for (list::const_iterator w=walls.begin(); - w!=walls.end(); - w++) { - - (*w)->setTransporter(this, 1, 0.); - }*/ - //daughter2->chem[2]=parent_info->PINendosome; - daughter2->SetChemical(2,parent_info->PINendosome); - //cerr << "Clearing parent\n"; - - } else { - //daughter1->new_chem[2]=daughter1->chem[2] = parent_info->PINendosome*(area/tot_area); - daughter1->SetNewChem(2,parent_info->PINendosome*(area/tot_area)); - daughter1->SetChemical(2, parent_info->PINendosome*(area/tot_area)); - //daughter2->new_chem[2]=daughter2->chem[2] = parent_info->PINendosome*(daughter_area/tot_area); - daughter2->SetNewChem(2,parent_info->PINendosome*(daughter_area/tot_area)); - daughter2->SetChemical(2,parent_info->PINendosome*(daughter_area/tot_area)); - - } - } - - /* - // NB: Code commented out; not yet adapted to plugin format... RM 18/12/2009 - // Now redistribute the membrane PINs according to the original polarization in the parent - // mmm... I'd like to have a better, biologically motivated rule for this, - // but for lack of something better... I hope I'm excused :-). Let's say the overall - // organization of the actin fibres is not completely destroyed after division... - - // distribute wallPINs according to the circumference of the parent and daughter - double circ = Circumference( ); - double daughter_circ = daughter.Circumference(); - double tot_circ = circ + daughter_circ; - - double wallPINs = (circ / tot_circ) * parent_info->PINmembrane; - double daughter_wallPINs = (daughter_circ / tot_circ) * parent_info->PINmembrane; - - //cerr << "wallPINs = " << wallPINs << ", daughter_wallPINs = " << daughter_wallPINs << "sum = " << wallPINs + daughter_wallPINs << ", PINmembrane = " << parent_info->PINmembrane << endl; - // distrubute it according to the overall polarity - Vector polarization = parent_info->polarization.Normalised().Perp2D(); - - double sum=0.; - for (list::const_iterator w=walls.begin(); - w!=walls.end(); - w++) { - - // distribute according to angle (0 degrees: maximum, 180 degrees minimum) - double tmp=InnerProduct((*w)->getWallVector(this),polarization); // move domain from [-1,1] to [0,1] - - cerr << "[" << tmp << "]"; - sum+=tmp; - //(*w)->setTransporter(this, 1, - } - - //cerr << "Sum is " << sum << endl; - //double sum_wall_Pi = SumTransporters(1); - - // After division, cells produce PIN1 (in intracellular storage) until total amount becomes Pi_tot - //SetChemical(1, par.Pi_tot - sum_wall_Pi ); - //SetNewChem(1, Chemical(1)); - - //cerr << "[ " << sum_wall_Pi + Chemical(1) << "]"; - */ -} - -void LeafPlugin::SetCellColor(CellBase *c, QColor *color) { - - // Red: AUX1 - // Green: Auxin - // Blue: van-3 - // color->setRgb(chem[2]/(1+chem[2]) * 255.,(chem[0]/(1+chem[0]) * 255.),(chem[3]/(1+chem[3]) *255.) ); - color->setRgb(c->Chemical(2)/(1+c->Chemical(2)) * 255.,(c->Chemical(0)/(1+c->Chemical(0)) * 255.),(c->Chemical(3)/(1+c->Chemical(3)) *255.) ); - - -} - - - -void LeafPlugin::CellHouseKeeping(CellBase *c) { - - if (c->Boundary()==CellBase::None) { - if (c->Area() > par->rel_cell_div_threshold * c->BaseArea() ) { - //c->SetChemical(0,0); - c->Divide(); - } - - // expand if this is not a provascular cell - if (c->Chemical(3) < 0.7 ) { - c->EnlargeTargetArea(par->cell_expansion_rate); - } - } - -} - -void LeafPlugin::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; - - // dchem_c2 is undefined..! - return; - } else { - if (w->AuxinSink()) { - - // efflux into Shoot Apical meristem - // we assume all PINs are directed towards shoot apical meristem - dchem_c1[0] -= par->sam_efflux * w->C1()->Chemical(0) / (par->ka + w->C1()->Chemical(0)); - - return; - } else { - - // Active fluxes (PIN1 and AUX1 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)) - + par->aux1transport * w->C2()->Chemical(2) * w->C1()->Chemical(0) / (par->kaux1 + 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)) - + par->aux1transport * w->C1()->Chemical(2) * w->C2()->Chemical(0) / (par->kaux1 + w->C2()->Chemical(0)) ); - - dchem_c1[0] += trans21 - trans12; - dchem_c2[0] += trans12 - trans21; - return; - } - - } - } - - - if (w->C1()->BoundaryPolP()) { - - if (w->AuxinSource()) { - double aux_flux = par->leaf_tip_source * w->Length(); - dchem_c2[0] += aux_flux; - // dchem_c1 is undefined...! - return; - } else { - - if (w->AuxinSink()) { - - - // efflux into Shoot Apical meristem - // we assume all PINs are directed towards shoot apical meristem - - // no passive fluxes: outside is impermeable - - // Active fluxes (PIN1 and AUX1 mediated transport) - - // (Transporters measured in moles, here) - // efflux from cell 1 to cell 2 - // assumption: no AUX1 in shoot apical meristem - double trans12 = ( par->transport * w->Transporters1(1) * w->C1()->Chemical(0) / (par->ka + w->C1()->Chemical(0))); - dchem_c1[0] += - trans12; - - return; - - //dchem_c2[0] -= par->sam_efflux * w->C2()->Chemical(0) / (par->ka + w->C2()->Chemical(0)); - - // return; - } else { - - } - } - } - - - // Passive fluxes (Fick's law) - // only auxin flux now - // flux depends on edge length and concentration difference - for (int c=0;cLength() * ( par->D[c] ) * ( w->C2()->Chemical(c) - w->C1()->Chemical(c) ); - dchem_c1[c] += phi; - dchem_c2[c] -= phi; - } - // Active fluxes (PIN1 and AUX1 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)) - + par->aux1transport * w->C2()->Chemical(2) * w->C1()->Chemical(0) / (par->kaux1 + 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)) - + par->aux1transport * w->C1()->Chemical(2) * w->C2()->Chemical(0) / (par->kaux1 + w->C2()->Chemical(0)) ); - - dchem_c1[0] += trans21 - trans12; - dchem_c2[0] += trans12 - trans21; - - - -} -void LeafPlugin::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.; - dw1[2] = 0.; dw2[2] = 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]=dw1[2]=dw2[2]; - return; - } - } - - if (w->C1()->BoundaryPolP()) { - if (w->AuxinSink()) { - - dw1[0] = 0.; dw2[0] = 0.; - dw1[2] = 0.; dw2[2] = 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]=dw1[2]=dw2[2]; - 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[2] = 0.; dw2[2] = 0.; - - dw1[1] = dPijdt1; - dw2[1] = dPijdt2; - -} - -double LeafPlugin::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 LeafPlugin::CellDynamics(CellBase *c, double *dchem) { - - double dPidt = 0.; - - double sum_Pij = c->SumTransporters( 1 ); - - // exocytosis regulated: - // van3 expression reduces rate of PIN1 endocytosis - dPidt = -par->k1 * c->ReduceCellAndWalls( far_3_arg_mem_fun( *this, &LeafPlugin::complex_PijAj ) ) + - (c->Chemical(3) < 0.5 ? par->k2 : par->k2van3) * 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; - - /*if (c->AtBoundaryP()) { - dchem[2] = 0.01; - //cerr << "Making cell blue.\n"; - } else { - dchem[2] = -0.1 * c->Chemical(2); - }*/ - - // no PIN production in SAM - if (c->Boundary() == CellBase::SAM) { - dchem[1]=0.; - dchem[0]= - par->sam_auxin_breakdown * c->Chemical(0); - dchem[2]=0.; - } else { - - dchem[1] = dPidt; - - - // source of auxin - dchem[0] = par->aux_cons; - - // auxin-induced AUX1 production, in the epidermis - dchem[2] = ( c->AtBoundaryP() ? par->aux1prod : par->aux1prodmeso ) * ( c->Chemical(0) / ( 1. + par->kap * c->Chemical(0) ) ) - ( par->aux1decay ) * c->Chemical(2) ;//: 0.; - - // auxin-induced production of VAN-3? Autokatalysis? - //dchem[3] = par->van3prod * (c->Chemical(0) / (1. + par->kvp * c-> Chemical(0) ) ) - double A = c->Chemical(0); - double van3 = c->Chemical(3); - dchem[3] = par->van3prod * A - par->van3autokat * van3 + van3*van3/(1 + par->van3sat * van3*van3 ); - } -} - - - - - - -Q_EXPORT_PLUGIN2(leafplugin, LeafPlugin) diff --git a/src/build_models/leafplugin.h b/src/build_models/leafplugin.h deleted file mode 100644 --- a/src/build_models/leafplugin.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * $Id$ - * - * 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 . - * - * Copyright 2010 Roeland Merks. - * - */ - -#ifndef _LEAFPLUGIN_H_ -#define _LEAFPLUGIN_H_ - -#include -#include -#include -#include "../simplugin.h" - - -class LeafPlugin : public QObject, SimPluginInterface { - Q_OBJECT - Q_INTERFACES(SimPluginInterface); - -public: - virtual QString ModelID(void) { return QString( "Traveling wave model with influx carriers - Merks and Beemster, 2006-2008" ); } - - // Executed after the cellular mechanics steps have equillibrized - virtual void CellHouseKeeping (CellBase *c); - // Differential equations describing transport of chemicals from cell to cell - virtual void CelltoCellTransport(Wall *w, double *dchem_c1, double *dchem_c2); - - // Differential equations describing chemical reactions taking place at or near the cell walls - // (e.g. PIN accumulation) - virtual void WallDynamics(Wall *w, double *dw1, double *dw2); - - // Differential equations describing chemical reactions inside the cells - virtual void CellDynamics(CellBase *c, double *dchem); - - // to be executed after a cell division - virtual void OnDivide(ParentInfo *parent_info, CellBase *daughter1, CellBase *daughter2); - - // to be executed for coloring a cell - virtual void SetCellColor(CellBase *c, QColor *color); - // return number of chemicals - virtual int NChem(void) { return 4; } - - private: - double complex_PijAj(CellBase *here, CellBase *nb, Wall *w); - -}; - -#endif diff --git a/src/build_models/plugin_leaf.pro b/src/build_models/plugin_leaf.pro deleted file mode 100644 --- a/src/build_models/plugin_leaf.pro +++ /dev/null @@ -1,55 +0,0 @@ -# -# $Id$ -# -# 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 . -# -# Copyright 2010 Roeland Merks. -# - -CONFIG += release -CONFIG -= debug -CONFIG += plugin - -BINDIR = ../../bin -LIBDIR = ../../lib -DEFINES = QTGRAPHICS # VLEAFPLUGIN -DESTDIR = $${BINDIR}/models -TARGET = leaf -HEADERS = ../simplugin.h $${TARGET}plugin.h -QMAKE_CXXFLAGS += -fexceptions -I.. -QMAKE_CXXFLAGS_DEBUG += -g3 -QMAKE_CXXFLAGS_DEBUG += -DQDEBUG - -QT += qt3support -SOURCES = $${TARGET}plugin.cpp -TEMPLATE = lib - -unix { - LIBS += -L$${LIBDIR} -lvleaf - QMAKE_CXXFLAGS += -fPIC -I/usr/include/libxml2 - QMAKE_LFLAGS += -fPIC -} - -win32 { - LIBXML2DIR = C:\libxml2 - LIBICONVDIR = C:\libiconv - LIBZDIR = C:\libz - LIBS += -L$${LIBDIR} -Llib -lvleaf - QMAKE_CXXFLAGS += -DLIBXML_STATIC - QMAKE_CXXFLAGS += -I$${LIBXML2DIR}\include -I$${LIBICONVDIR}\include -I$${LIBZDIR}\include -} - -# finis