Examples: Mitosis
Related: Mitosis
The folder containing this simulation is
Demos/CompuCellPythonTutorial/steppableBasedMitosis.
File:
Demos/CompuCellPythonTutorial/steppableBasedMitosis/Simulation/steppableBasedMitosisSteppables.py
from PySteppables import *
from PySteppablesExamples import MitosisSteppableBase
import CompuCell
class VolumeParamSteppable(SteppableBasePy):
def __init__(self, _simulator, _frequency=1):
SteppableBasePy.__init__(self, _simulator, _frequency)
def start(self):
for cell in self.cellList:
cell.targetVolume = 25
cell.lambdaVolume = 2.0
def step(self, mcs):
for cell in self.cellList:
cell.targetVolume += 1
class MitosisSteppable(MitosisSteppableBase):
def __init__(self, _simulator, _frequency=1):
MitosisSteppableBase.__init__(self, _simulator, _frequency)
# 0 - parent child position will be randomized between mitosis event
# negative integer - parent appears on the 'left' of the child
# positive integer - parent appears on the 'right' of the child
self.setParentChildPositionFlag(-1)
def step(self, mcs):
cells_to_divide = []
for cell in self.cellList:
if cell.volume > 50:
cells_to_divide.append(cell)
for cell in cells_to_divide:
# to change mitosis mode leave one of the below lines uncommented
self.divideCellRandomOrientation(cell)
def updateAttributes(self):
self.parentCell.targetVolume /= 2.0 # reducing parent target volume
self.cloneParent2Child()
if self.parentCell.type == self.CONDENSING:
self.childCell.type = self.NONCONDENSING
else:
self.childCell.type = self.CONDENSING
Two steppables: VolumeParamSteppable
and MitosisSteppable
are the
the essence of the above simulation. The first steppable initializes the volume
constraint for all the cells present at T=0
MCS (only one cell) and then
every 10
MCS (see the frequency with which VolumeParamSteppable
in
initialized to run -
Demos/CompuCellPythonTutorial/steppableBasedMitosis/Simulation/steppableBasedMitosis.py)
it increases the target volume of cells, effectively causing cells to grow.
from steppableBasedMitosisSteppables import VolumeParamSteppable
volumeParamSteppable=VolumeParamSteppable(sim ,10)
steppableRegistry.registerSteppable(volumeParamSteppable)
from steppableBasedMitosisSteppables import MitosisSteppable
mitosisSteppable=MitosisSteppable(sim, 10)
steppableRegistry.registerSteppable(mitosisSteppable)
The second steppable checks every 10
MCS (we can, of course, run it
every MCS) if a cell has reached its doubling volume of 50
. If it did, that
cell is added to the list cells_to_divide. After construction of
cells_to_divide
is complete, we iterate over this list and divide all
the cells within it.
Warning
It is important to divide cells outside the loop where we iterate over the entire cell inventory. If we keep dividing cells in this loop we are adding elements to the list over which we iterate and this might have unwanted side effects. The solution is to use a list of cells to divide as we did in the example.
Notice that we call self.divideCellRandomOrientation(cell
) function to
divide cells. Other modes of division are available as well and they are
as follows:
self.divideCellOrientationVectorBased(cell,1,0,0)
self.divideCellAlongMajorAxis(cell)
self.divideCellAlongMinorAxis(cell)