Stem cells in the intestinal crypt


This illustrative example shows the emergence of clonal populations from stem cells in an intestinal crypt. Stem cells in the bottom of the crypt divide asymmetrically and produce a population of transit amplifying (TA) cells. For each of the TA cells, the color indicates the stem cell is it derived from.

Asymmetric cell division and changing cell type.

Model description

The model shows several new modeling features, available as of Morpheus 1.2.

Loading domain from image

The crypt-like domain is specified by loading an external 8-bit TIFF image file using Lattice/Domain/Image.

Asymmetric cell division

Stem cells divide asymmetrically using the new ChildID handles in the Proliferation plugin. This sets a user-defined symbol (here called daughter) to either $1$ or $2$. This symbol can then be used to distinguish both daughter cells and treat them differently. In this example, it used to set the stemness ($s$) of one daughter to $1$ and the stemness of the other daughter cell to $0$.

Conditionally changing cell types

When a cell looses its stemness $s$, it is moved to the TA cell type. This is done using the new ChangeCellType plugin.

Upon satisfyiug its Condition, ChangeCellType moves the cell to the specified new cell type. By default, all the properties of a cell that exist in both cell type context are maintained and unspecified ones are set to their default values. This default behavior can be overridden using Triggers that specify Rules stating how to deal with specific properties.


The new PopulationReporter allows the collection of statistical data about the cell population. Here, it is used to count the sizes of the various clonal populations. This number of reported into a Global and subsequently written to file and plotted using a Logger.


In Morpheus GUI: Examples 🠒 CPM 🠒 Crypt.xml.

<?xml version='1.0' encoding='UTF-8'?>
<MorpheusModel version="3">
        <Details>Illustrative model of stem cells in intestinal crypt

Shows the following features of Morpheus:

- Assymetric cell division (Proliferation)

- Conditionally change cell type (ChangeCellType)

- Loading simulation domain from image (Lattice/Domain)</Details>
        <Variable symbol="w_d" value="3000" name="wait time division"/>
        <Variable symbol="num_A" value="0.0" name="Clone A"/>
        <Variable symbol="num_B" value="0.0" name="Clone B"/>
        <Variable symbol="num_C" value="0.0" name="Clone C"/>
        <Variable symbol="num_D" value="0.0" name="Clone D"/>
        <Variable symbol="num_E" value="0.0" name="Clone E"/>
        <Constant symbol="s" value="0.0"/>
        <Constant symbol="clone" value="0.0"/>
        <Lattice class="square">
            <Size symbol="size" value="600 600 0"/>
                <Condition boundary="x" type="periodic"/>
                <Condition boundary="y" type="periodic"/>
            <Domain boundary-type="noflux">
                <Image path="crypt.tif"/>
        <SpaceSymbol symbol="l"/>
        <StartTime value="0"/>
        <StopTime value="50000"/>
        <TimeSymbol symbol="time"/>
        <CellType class="biological" name="stem_cells">
            <Property symbol="clone" value="0.0"/>
            <Property symbol="t_d" value="0.0" name="time of division"/>
            <Property symbol="s" value="1" name="stemness"/>
            <VolumeConstraint target="800" strength="1"/>
            <SurfaceConstraint target="1" mode="aspherity" strength="1"/>
            <ChangeCellType newCellType="TA_cells">
            <DirectedMotion direction="0, -1,  0" strength="0.5"/>
            <CellDivision daughterID="daughter" division-plane="random">
                <Condition>time > t_d</Condition>
                    <Rule symbol-ref="s">
                        <Expression>if( daughter == 1, 1, 0 )</Expression>
                    <Rule symbol-ref="t_d">
                        <Expression>time + rand_norm(w_d,200)</Expression>
        <CellType class="biological" name="TA_cells">
            <Property symbol="clone" value="0.0"/>
            <Property symbol="t_d" value="0" name="time of division"/>
            <Property symbol="d" value="0" name="divisions"/>
            <VolumeConstraint target="600 " strength="1"/>
            <SurfaceConstraint target="0.9" mode="aspherity" strength="1"/>
            <CellDivision daughterID="daughter" division-plane="random">
                <Condition>time > t_d</Condition>
                    <Rule symbol-ref="d">
                    <Rule symbol-ref="t_d">
                        <Expression>time + rand_norm(w_d,500)</Expression>
                <Condition>if( > size.y - 20, 1, 0)</Condition>
            <Mapper name="Count Clone A">
                <Input value="clone==1"/>
                <Output symbol-ref="num_A" mapping="sum"/>
            <Mapper name="Count Clone B">
                <Input value=" clone==2"/>
                <Output symbol-ref="num_B" mapping="sum"/>
            <Mapper name="Count Clone C">
                <Input value="clone==3"/>
                <Output symbol-ref="num_C" mapping="sum"/>
            <Mapper name="Count Clone D">
                <Input value="clone==4"/>
                <Output symbol-ref="num_D" mapping="sum"/>
            <Mapper name="Count Clone E">
                <Input value="clone==5"/>
                <Output symbol-ref="num_E" mapping="sum"/>
        <Interaction default="0">
            <Contact type1="stem_cells" type2="stem_cells" value="-10"/>
            <Contact type1="stem_cells" type2="TA_cells" value="10"/>
        <MonteCarloSampler stepper="edgelist">
            <MCSDuration value="1.0"/>
            <MetropolisKinetics temperature="3" yield="0.1"/>
        <ShapeSurface scaling="norm">
        <Population size="0" type="stem_cells">
            <InitRectangle mode="regular" number-of-cells="5">
                <Dimensions size="100,30,0" origin="250.0, 75.0, 0.0"/>
            <InitProperty symbol-ref="clone">
            <InitProperty symbol-ref="t_d">
        <Population size="0" type="TA_cells">
            <InitRectangle mode="regular" number-of-cells="500">
                <Dimensions size="600, 490, 0" origin="0,80, 0"/>
            <InitProperty symbol-ref="t_d">
        <Gnuplotter time-step="250" decorate="false">
            <Terminal name="png"/>
                <Cells value="clone">
                        <Color value="20" color="gold"/>
                        <Color value="19" color="dark-pink"/>
                        <Color value="18" color="dark-khaki"/>
                        <Color value="17" color="dark-goldenrod"/>
                        <Color value="16" color="cyan"/>
                        <Color value="15" color="coral"/>
                        <Color value="14" color="chartreuse"/>
                        <Color value="13" color="brown4"/>
                        <Color value="12" color="bisque"/>
                        <Color value="11" color="beige"/>
                        <Color value="10" color="light-red"/>
                        <Color value="9" color="light-green"/>
                        <Color value="8" color="light-blue"/>
                        <Color value="7" color="gray"/>
                        <Color value="6" color="black"/>
                        <Color value="5" color="yellow"/>
                        <Color value="4" color="blue"/>
                        <Color value="3" color="green"/>
                        <Color value="2" color="red"/>
        <Logger time-step="100">
                <Symbol symbol-ref="num_A"/>
                <Symbol symbol-ref="num_B"/>
                <Symbol symbol-ref="num_C"/>
                <Symbol symbol-ref="num_D"/>
                <Symbol symbol-ref="num_E"/>
                <Plot title="Clone numbers" time-step="5000">
                    <Style point-size="1" grid="true" style="linespoints" line-width="3.0"/>
                    <Terminal terminal="png"/>
                        <Symbol symbol-ref="time"/>
                        <Symbol symbol-ref="num_A"/>
                        <Symbol symbol-ref="num_B"/>
                        <Symbol symbol-ref="num_C"/>
                        <Symbol symbol-ref="num_D"/>
                        <Symbol symbol-ref="num_E"/>
        <DependencyGraph format="svg" exclude-plugins="Gnuplotter"/>