Growing ring and roaming agents with energy-driven binding - RuleBase

Growing ring and roaming agents with energy-driven binding

Author: Ricardo Honorato

This is an alternative version of the Kappa model "growing ring with energy-driven moving agents" in which movement and binding are decoupled. As a consequence, we can now measure the number of cluster by observing Sensor agents that are bound on one side but not the other. This way, we can compute the average cluster size. On the other hand, a decision must be made about whether to allow membrane agents be inserted in between two bound Sensors. If we allow it, then we must add the rule Mem(r!1, s!2), Mem(l!1, s!3), Sensor(m!2, r!4), Sensor(m!3, l!4) -> Mem(r!1, s!3), Mem(l!2, s!4), Sensor(m!3, r), Sensor(m!4, l), Mem(l!1, r!2, s). The resulting models display different receptor density and average cluster size. A comparison of both is below (Model 1 doesn't allow membrane insertion in between bound receptors whereas Model 2 does). The third line is the naïve model, which is not driven/modulated by energetic constrains (to make this system, just replace the binding and unbinding rates by 1).

The syntax is KaSim's.

Download View code
%agent: Mem(l, r, s)
%agent: Sensor(l, r, m)

%var: 'kInsert' 2E-6
%var: 'D' 0.018
%var: 'h' 3
%var: 'kMove' 'D'/('h'^2)
%var: 'kGrow' 8E-6

%var: 'alpha' 1/2
%var: 'J' 5
%var: 'lambda' 0 - 1/2
%var: '-1' 0 - 1

'Insert' Mem(s) -> Mem(s!1), Sensor(m!1, l, r) @ 'kInsert'

'Grow1' Mem(r!1, s  ), Mem(l!1, s  ) -> Mem(r!1, s  ), Mem(l!2, s  ), Mem(l!1, r!2, s) @ 'kGrow'
'Grow2' Mem(r!1, s!_), Mem(l!1, s  ) -> Mem(r!1, s!_), Mem(l!2, s  ), Mem(l!1, r!2, s) @ 'kGrow'
'Grow3' Mem(r!1, s  ), Mem(l!1, s!_) -> Mem(r!1, s  ), Mem(l!2, s!_), Mem(l!1, r!2, s) @ 'kGrow'
'Grow4' Mem(r!1, s!2), Mem(l!1, s!3), Sensor(m!2, r), Sensor(m!3, l) -> \
        Mem(r!1, s!3), Mem(l!2, s!4), Sensor(m!3, r), Sensor(m!4, l), Mem(l!1, r!2, s) @ 'kGrow'
# Uncomment next rule if you want to keep the receptor density at 0.2
#'Grow5' Mem(r!1, s!2), Mem(l!1, s!3), Sensor(m!2, r!4), Sensor(m!3, l!4) -> \
#        Mem(r!1, s!3), Mem(l!2, s!4), Sensor(m!3, r  ), Sensor(m!4, l  ), Mem(l!1, r!2, s) @ 'kGrow'

'MoveL' Mem(s!1, l!2), Sensor(m!1, l, r), Mem(r!2, s) -> Mem(s, l!2), Sensor(m!1, l, r), Mem(r!2, s!1) @ 'kMove'
'MoveR' Mem(s!1, r!2), Sensor(m!1, l, r), Mem(l!2, s) -> Mem(s, r!2), Sensor(m!1, l, r), Mem(l!2, s!1) @ 'kMove'

# Binding
'Bind1' Mem(r!1, s!8), Mem(l!1, s!9), Sensor(l, r  , m!8), Sensor(l  , r, m!9) -> \
        Mem(r!1, s!8), Mem(l!1, s!9), Sensor(l, r!5, m!8), Sensor(l!5, r, m!9) @ \
        [exp] ('lambda' * 'J' * (2 * 'alpha' - 1))  # dE = 2aJ - J

'Bind2' Mem(r!1, s!8), Mem(l!1, s!9), Sensor(l!_, r  , m!8), Sensor(l  , r, m!9) -> \
        Mem(r!1, s!8), Mem(l!1, s!9), Sensor(l!_, r!5, m!8), Sensor(l!5, r, m!9) @ \
        [exp] ('lambda' * 'J' * ('alpha' - 1))  # dE = aJ - J

'Bind3' Mem(r!1, s!8), Mem(l!1, s!9), Sensor(l, r  , m!8), Sensor(l  , r!_, m!9) -> \
        Mem(r!1, s!8), Mem(l!1, s!9), Sensor(l, r!5, m!8), Sensor(l!5, r!_, m!9) @ \
        [exp] ('lambda' * 'J' * ('alpha' - 1))  # dE = aJ - J

'Bind4' Mem(r!1, s!8), Mem(l!1, s!9), Sensor(l!_, r  , m!8), Sensor(l  , r!_, m!9) -> \
        Mem(r!1, s!8), Mem(l!1, s!9), Sensor(l!_, r!5, m!8), Sensor(l!5, r!_, m!9) @ \
        [exp] ('lambda' * '-1' * 'J')  # dE = -J

# Unbinding
'Unbind1' Mem(r!1, s!8), Mem(l!1, s!9), Sensor(l, r!5, m!8), Sensor(l!5, r, m!9) -> \
          Mem(r!1, s!8), Mem(l!1, s!9), Sensor(l, r  , m!8), Sensor(l  , r, m!9) @ \
          [exp] ('lambda' * 'J' * (1 - 2 * 'alpha'))  # dE = J - 2aJ

'Unbind2' Mem(r!1, s!8), Mem(l!1, s!9), Sensor(l!_, r!5, m!8), Sensor(l!5, r, m!9) -> \
          Mem(r!1, s!8), Mem(l!1, s!9), Sensor(l!_, r  , m!8), Sensor(l  , r, m!9) @ \
          [exp] ('lambda' * 'J' * (1 - 'alpha'))  # dE = J - aJ

'Unbind3' Mem(r!1, s!8), Mem(l!1, s!9), Sensor(l, r!5, m!8), Sensor(l!5, r!_, m!9) -> \
          Mem(r!1, s!8), Mem(l!1, s!9), Sensor(l, r  , m!8), Sensor(l  , r!_, m!9) @ \
          [exp] ('lambda' * 'J' * (1 - 'alpha'))  # dE = J - aJ

'Unbind4' Mem(r!1, s!8), Mem(l!1, s!9), Sensor(l!_, r!5, m!8), Sensor(l!5, r!_, m!9) -> \
          Mem(r!1, s!8), Mem(l!1, s!9), Sensor(l!_, r  , m!8), Sensor(l  , r!_, m!9) @ \
          [exp] ('lambda' * 'J')  # dE = J


%init: 1 (Mem(l!1, r!2), Mem(l!2, r!1))

%obs: 'Mem' Mem()
%obs: 'Sensor' Sensor()
%obs: 'Free' Sensor(l, r)
%obs: 'NonFreeL' Sensor(l!_, r)
%obs: 'NonFreeR' Sensor(r!_, l)
%obs: 'NonFreeLR' Sensor(l!_, r!_)
#%obs: 'U' Mem(r!1, s!2), Mem(l!1, s!3), Sensor(m!2), Sensor(m!3)
#%obs: 'Pair' Sensor(r!1), Sensor(l!1)

%var: 'ReceptorDensity' 'Sensor'/'Mem'
%plot: 'ReceptorDensity'

%var: 'AvgClusterSize' 'Sensor'/('NonFreeL'+'Free')
%plot: 'AvgClusterSize' 

%var: 'AvgClusterSizeWoFree' ('Sensor'-'Free')/'NonFreeL'
%plot: 'AvgClusterSizeWoFree'