Heterocysts differentiation during Anabaena growth


The cyanobacterium Anabaena grows in filaments of 100 cells or more. When starved for nitrogen, specialized cells called heterocysts differentiate from the photosynthetic vegetative cells at regular intervals along each filament. Heterocysts are anaerobic factories for nitrogen fixation; in them, the nitrogenase enzyme complex is synthesized and the components of the oxygen-evolving photosystem II are turned off. Plant signals exert both positive and negative regulatory control on heterocyst differentiation.

A model of Anabaena growth (developped by P. Prusinkiewicz using parametric L systems). The approach for the
vizualisation has also be developped by P. Prusinkiewicz and is called space-time extrusion. The MGS program mimics the production rules of the L system

Wilcox et al. have proposed a activator-inhibitor model of heterocysts differentiation where the (high) concentration of the activator triggers the heterocysts differentiation. The production of the activator is an autocatalytic reaction and also catalyzes the production of the inhibitor. The inhibitor is an antagonist substance that repress the activity of the activator when is concentration is high enough. The diffusion of the inhibitor to the neighboring cells prevents neighbors to become also heterocysts and explains why heterocysts appear in a regular spaced pattern in the filament.
A computer simulation of this process (Hammel1996) was originally developed in the field of L system and shows the use of parametric L systems (Prusinkiewicz1990, Hanan1992) for the modeling of a fundamental mechanism: a morphogenesis driven by a reaction-diffusion process taking place in a growing media. The corresponding parametric L systems is easily translated into a MGS program where each rule corresponds to a production of the L system.

In the upper graphic, the time goes from left-upper to righ-lower corner. Each slice (lower graphic) corresponds to the state of a growing filament and represent a sequence of cells. The height of a cell represent the activator concentration. Cells are pictured in red when the activator is greater than a given level triggering differentiation (they are in pale gray above). Black cells are vegetative ones. This type of visualization, called ``space-time extrusion'' has been developped in (Hammel 1996).

A model of Anabaena growth (developped by P. Prusinkiewicz using parametric L systems). The approach for the
vizualisation has also be developped by P. Prusinkiewicz and is called space-time extrusion. The MGS program mimics the production rules of the L system

The corresponding MGS program

Specifying the anabaena growth

record CellState = { a, h, x, p, type };;
record C = { a, h, x, p, type = "C"};;
record D = CellState + { type = "D" };;

The state of a cell is given by a record (a struct in C) with five fields: a is the activator concentration (in the cell) and h is the inhibitor concentration. Field x represents the size of the cell and p is the polarity. Each cell is either vegetative or heterocyst has indicated by the field type.

The type C and D are specialization of CellState and specify that the cell is vegetative (the field type has the value "C") or heterocyst (e.g.: differentiated and the field type has the value "D").

The system will be composed of a sequence of such states.
LM    := 0;;
RM   := 1;;

longer  := 0.61803;;
shorter := 0.38196;;
rho     := 3.0;;
a0      := 0.01;;
mu      := 0.1;;
Da      := 0.0000;;
h0      := 0.001;;
nu      := 0.45;;
Dh      := 0.004;;
kappa   := 0.001;;
dt      := 0.1;;
w       := 0.01;;
lm      := 1.0;;
gr      := 1.002;;
thr     := 1.0;;

Definitions of some constants and parameters.

LeftMark and RightMark are symbols used to indicate the polarity of a cell. longer is the elongation factor when a cell grows and shorter is the corresponding shrinking factor. lm is the threshold on the size for the cell division (a cell must be big enough to divide).
trans T = {

e / (C(e) & (e.x >= lm) & (e.p == RM)) =>
    {type="C", a=e.a, h=e.h, x= e.x*longer,  p=LM},
    {type="C", a=e.a, h=e.h, x= e.x*shorter, p=RM};

This rule specifies when a cell with a left polarity divides.

Only vegetative cell can divided (hence the predicate C in the rule guard) and it must be big enough. The volume of the two daughter cells remains the same, so there is no variation in the concentration.
e / (C(e) & (e.x >= lm) & (e.p == LM)) =>
    {type="C", a=e.a, h=e.h, x=e.x*shorter, p=LM},
    {type="C", a=e.a, h=e.h, x=e.x*longer,  p=RM};

This rule specifies when a cell with a right polarity divides.

e / (C(e) & C(left(e)) & C(right(e))) =>
  let al = left(e).a
  and ar = right(e).a
  and hl = left(e).h
  and hr = right(e).h
  in let h = e.h
     and a  = e.a
     and x  = e.x
     and p  = e.p
       { type = "D",
         a = a + (rho/h*(a*a/(1+kappa*a*a) + a0)
               - mu*a + Da*(al+ar-2*a)/(x*w))*dt,
         h = h + (rho*(a*a/(1+kappa*a*a) + h0)
               - nu*h + Dh*(hl+hr-2*h)/(x*w))*dt,
         x = x,
         p = p}

When a cell does not divide, the concentration in activator and inhibitor evolves following some kinetics rules. Cf. (Hammel1996).

The operator left and right are used to access the left and right neighbors of an element in a sequence.
p4 = e / (D(e) & (e.a >= thr) & (e.x < shorter*gr))
   {type ="C", a=e.a, h=e.h, x=e.x, p=e.p};


The two following rules state that a differentiated cell returns to a vegetative state if it is too small or if the concentration of the activator is too low.
e / (D(e) & (e.a < thr) | (e.x >= shorter*gr))
   {type ="C", a=e.a/gr, h=e.h/gr, x=e.x*gr, p=e.p};

In addition, if the cell is big enough, it continues to grow.
e / C(e)
   {type="D", a=e.a, h=e.h, x=e.x, p=e.p};

A vegetative cell that does not meet the previous constraints becomes an heterocyst.

omega :=
   {type="C", a=0.1, h=10.0, x=0.5, p=RM}, seq:();;

The initial condition : a filement composed of one cell.


fun pre_exec(fichier)  =
   fichier <<
      "Scaled{ Scale <0.1, 0.1, 0.1>\n Geometry Grid1{ Axis<1,0,0>  LineUp2 Middle GridList["

The following functions are used to writte in a file a 3D graphical description of the picture above.

The 3D description language is described here.
The function pre_exec is used to produce the head of the description file.
fun post_exec(fichier) =
   fichier << "Box { Size <0, 0, 0>} \n] }}\n"

The function post_exec is used to produce the end of the description file.
fun every(fichier, l, nb)  =
  if ((nb % 5) == 0)
     (fichier << "Grid1{Axis<0,0,1> Space1 0.1 GridList[";
      map(show(fichier), l); 
      fichier << "Box { Size <0, 0, 0>} ] },\n")
  else 0

The function every is used to produce the description of the current state. This function is called at each time steps but a description is outputed to the file only every 5 calls. The current state is a sequence of box, one box per cell. The height of this box is proportional to the concentration of the activator. The description of the box is produced by a call to the function  show.
fun show(fichier, e) =
  fichier << "Box { Size <0.15, "
          << sqrt(e.h/2.0)             
          << ", "     
          << e.x/2.0             
          << "> Color < "
          << e.a / 8.0
          << ", "
          << e.a / 8.0
          << ", "
          << e.a / 8.0
          << "> },\n";;

fun simul(x)=
   evolve(nb, x) ;  

fun evolve(nb, x) =
    if (nb == 0)
    then (?("\nAnaeba final size: " + size(x) + "\n"); x)
         (every("ana.output", x, nb);
          evolve(nb-1, T(x)))

simul(5000, omega);;

A simulation consists in outputing the head of the data file, outputing the description of the current state and the outputing the end of the data file.

The image below corresponds to a simulation over 5000 time steps.

Back to top
MGS examples index
MGS home page

(currently under construction logo)
this site is under construction.
Pages started: May 2002. Last revision: 24 jully 2003.

Creative Commons License
Pictures, graphics and animations are licensed under a Creative Commons License.

English keywords for indexation: computer science, programming language, topological collections, transformation, declarative programming language, functional languages, simulation of biological processes, cell model, biological pathway, interaction network, gene regulation, signal transduction, morphogenesis, developmental biology, integrative simulation, biological organization, dynamical systems, dynamical structure, Gamma, CHAM, P system, L system, Paun, Lindenmayer, cellular automata, membrane computing, aqueous computing, artificial chemistry, GBF, Cayley graph, data fields, nested collections, rewriting, rule based programming, pattern-matching, intentional programming, compilation, interpretation, type, type inference, nested type, polytypism, catamorphism, static analysis, sequence, multiset, combinatorial algebraic topology, chain complex, chain group.