In the tumour spheroid tutorial we noted that a cell mutation state is always required
when constructing a cell. In this tutorial, we show how to create a new cell mutation
state class, and how this can be used in a cell-based simulation.
As in previous cell-based Chaste tutorials, we begin by including the necessary
header file and archiving headers.
The next header defines a base class for cell mutation states. Our new
cell mutation state will inherit from this abstract class.
The remaining header files define classes that will be used in the cell-based
simulation test. We have encountered each of these header files in previous cell-based
Chaste tutorials.
As an example, let us consider a cell mutation state representing the p53
172R-H gain-of-function mutant, which is equivalent to the common 175R-H
human breast cancer mutant; for further details on this mutant, see for
example Murphy et al, FASEB J. 14:2291-2302 (2000).
Wild-type p53 has been referred to as the “guardian of the genome”,
responding to DNA damage or checkpoint failure by either arresting cell
cycle progression to facilitate DNA repair or initiating an apoptotic
pathway to remove damaged cells. Approximately 40% of human breast cancers
contain alterations in p53.
As we can see, apart from a serialize() method and a constructor, this class
does not contain any member variables or methods. This is because generally
a cell’s mutation state is used, much like a flag, by other classes when
determining a cell’s behaviour (whether a cell should undergo
apoptosis following prolonged stress, for example, or alter its proliferative
behaviour).
The only public method is a default constructor, which just calls the base
constructor with a single unsigned parameter. This sets the value of the
base class member variable mColour, which can be used by visualization tools
to paint cells with this mutation state a distinct colour if required.
As mentioned in previous cell-based Chaste tutorials, we need to include the next block
of code to be able to archive the cell mutation state object in a cell-based
simulation, and to obtain a unique identifier for our new cell mutation state for writing
results to file.
This completes the code for P53GainOfFunctionCellMutationState. Note that usually this code would
be separated out into a separate declaration in a .hpp file and definition in a .cpp file.
We begin by testing that our new cell mutation state is implemented correctly.
We begin by testing that some of the base class methods work correctly.
We typically use shared pointers to create and access cell mutation states, as
follows. This is because it makes sense for all cells that have the same mutation
to share a pointer to the same cell mutation state object (although strictly speaking,
they are not required to).
Each cell mutation state has a member variable, mCellCount, which
stores the number of cells with this mutation state. In fact, mCellCount
is defined in the class AbstractCellProperty, from which
AbstractCellMutationState inherits, as well as other cell properties
such as CellLabel. We can test whether mCellCount is being
updated correctly by our cell mutation state, as follows.
We can also test that mColour has been set correctly by our constructor, as follows.
We can also test whether our cell mutation state is of a given type, as follows.
We can also test that archiving is implemented correctly for our cell
mutation state, as follows (further details on how to implement and
test archiving can be found at Boost Serialization Guide).
Using the cell mutation state in a cell-based simulation#
We conclude with a brief test demonstrating how P53GainOfFunctionCellMutationState can be used
in a cell-based simulation.
We use the HoneycombMeshGenerator to create a honeycomb mesh covering a
circular domain of given radius, as follows.
We now create a shared pointer to our new cell mutation state, as follows.
Next, we create some cells, as follows.
We now assign the mutation to the 11th and 51st cells.
Now that we have defined the mesh and cells, we can define the cell population. The constructor
takes in the mesh and the cells vector.
In order to visualize labelled cells we need to use the following command.
We then pass in the cell population into an OffLatticeSimulation,
and set the output directory, output multiple, and end time.
We create a force law and pass it to the OffLatticeSimulation.
you should see two cells in black which are the cells with the new mutation. If we want these cells to behave differently we
would need to write an new CellCycleModel, CellKiller, Force, or CellPopulationBoundaryCondition
which checks for the new mutation.