Accessing concentration fields managed by PDE solvers ===================================================== Many of CC3D simulations have at least one diffusing field which represents some sort of chemical it can be growth factor, toxin or nutrient. The concentration fields are created by CC3D PDE solvers. One of the most common tasks that modelers implement is modifying cellular behaviours based on the chemical concentration at the center of mass of a cell (or for that matter any other point belonging to a given cell). In this example, we will show you how to extract and modify values of the concentration fields. You can take a look at ``CompuCellPythonTutorial/diffusion`` example if you want a quick preview of code that deals with diffusion fields. The task here is quite simple. We first have to get a handle to the field and then using Numpy-like syntax either read or modify field values. The example that we will implement here is the following. We will start with "regular" cell-sorting cell layout where condensing and non-condensing cells are mixed together. In the corner of the lattice, we will place the pulse of the chemical and will let the chemical diffuse. We will monitor the values of the concentration at the center of mass of each cell and if this value is greater than ``0.1`` we will change cell type to ``Condensing``. Assuming that the concentration pulse is big enough all cells will become ``Condensing`` after some time. Let’s take a look at the code: .. code-block:: python class CellsortingSteppable(SteppableBasePy): def __init__(self, _simulator, _frequency=1) SteppableBasePy.__init__(self, _simulator, _frequency) def start(self): field = self.getConcentrationField("FGF") field[0, 0, 0] = 2000 def step(self, mcs): field = self.getConcentrationField("FGF") for cell in self.cellList: if field[cell.xCOM, cell.yCOM, cell.zCOM] > 0.1: cell.type = self.CONDENSING In the start function we get a handle to a diffusion field ``FGF``. This field is defined in the XML using the following code: .. code-block:: xml FGF 0.1 1e-05 The XML code above defines diffusion and decay constants but says nothing about initial conditions. We could have defined initial conditions in the XML but we chose to do this in the start function of the Python-based steppable. The content of the start function is almost self-explanatory. In the first line of the function we get a handle to concentration field. Notice that we pass "FGF" to self.getConcentrationField function. It is exactly the same name as we declared in XML. If you use field name that is undefined in the XML you will get None object in return. In the second line we initialize field to have concentration 2000 units at location ``x = 0``, ``y = 0``, ``z = 0`` . If we wanted to extend the area of initial concentration, we could have used the following Numpy slicing operation: .. code-block:: python field[0:5:1, 0:5:1 ,0] = 2000 and this would put 2000 units of concentration in the 5x5 square at the origin of the lattice. Like ``range()`` in Python, slicing works as follows: the first number specifies the lower bound, second specifies upper bound (the maximum index is upper bound minus one), and third specifies step. In our example, ``0:5:1`` will select indices ``0, 1, 2, 3, 4``. When we type ``0:6:2`` then we will select indices ``0, 2, 4`` – again ``6`` being upper bound is not selected. For more information about Numpy slicing please see numpy tutorial online: http://wiki.scipy.org/Tentative_NumPy_Tutorial In the start function we first get a handle to the FGF field, and then we iterate over each cell in the simulation. We check if FGF concentration at the center of mass of each cell is greater than 0.1: .. code-block:: python if field[cell.xCOM, cell.yCOM, cell.zCOM] > 0.1: ... and if so we change the cell type to ``Condensing``. Notice that to access center of mass of a cell we need to include the ``CenterOfMass`` plugin in the XML using the following code: .. code-block:: xml All Twedit++ -generated templates put this plugin by default, but if you type XML manually you need to remember about this module. ``CenterOfMass`` plugin tracks and keeps an up-to-date center of mass of each cell. To access COM value from Python, we use the following syntax: .. code-block:: python cell.xCOM cell.yCOM cell.zCOM When you run the simulation you will notice that gradually all of the cells will turn into Condensing. Min/Max field values --------------------- To access min or max of concentration fields (i.e. defined in the PDE solver) you simply type .. code-block:: python minVal = field.min() or .. code-block:: python maxVal=field.max()