Cell area compression

22 views
Skip to first unread message

Jessica Chen

unread,
Dec 16, 2024, 4:25:51 PM12/16/24
to Morpheus users
Hello! 
I am currently working on a 2D simulation that involves two main components: 1) cells secreting a ligand (we assume the ligand is well-mixed) and 2) cell area becoming compressed as cells divide and fill up a domain. Currently, I have a circular domain and cell proliferation implemented, and it is expected that as the number of cells increases, the amount of ligands will increase linearly. This is indeed observed when the cells are not restrained by the domain. However, as the cells begin filling up the domain (their areas decrease), the amount of ligand stays constant even when the number of cells increases.

For more detail, I currently have the ligand implemented as a field and a mapper implemented that maps the amount of ligand each cell senses. I am unsure if the mapper depends on the target area of the cell, or if the field depends on how much unoccupied space is in the domain.

I was wondering if there was an explanation for this.

Thank you in advance,
Jessica

Lutz Brusch

unread,
Dec 17, 2024, 9:20:20 AM12/17/24
to Morpheus users
Hi Jessica,

thank you for this relevant question! 
In short: the Global/System sees the local secretion flux density in each occupied lattice node and this density (but not the total flux per cell) is given by a Property or Constant of a CellType. This could have been defined the other way around but we decided for the density. You can scale this Property by cell.volume inside the CellType to control the total secretion flux per cell.

For example models with ligand secretion, please see
and assuming that your model has a Global/Field "Ligand" (with Diffusion=well-mixed) and your Global/System has a differential equation for Ligand with the secretion term "+k", then inside the CellType you need a Property "k" (not a Constant) and a second Property (or Constant) "total_flux" and an Equation for "k" with expression "total_flux / cell.volume" which will provide the flux density "k" for each occupied lattice node to the Global/System.

And to explain, what you have observed in your previous simulations: As long as cells were not compressed by crowding, they had cell.volume close to a target_volume and the observed total ligand secretion flux for the whole system must have been approx. equal to "k*target_volume*celltype.cells.size" (assuming your CellType was named "cells"). When the domain got filled, then each individual cell.volume compressed approx. to  "number_of_nodes_in_domain/celltype.cells.size" and you observed saturation of the total ligand secretion flux at a level "k*number_of_nodes_in_domain".

Now on the sensor part: You correctly use a Mapper inside CellType to sense the local ligand concentration from your Global/Field "Ligand". As "Ligand" may have different values (not in your welll-mixed case but in general) at the lattice nodes occupied by any given cell, the Mapper needs to apply statistics to map multiple values to one value per cell. Hence, under Mapper/Output/mapping you can select how your sensor should do the stats. The default is "average" (and returns the Ligand value in your case) but you can also choose "sum" to add up the values of Ligand over all occupied lattice nodes of a given cell. There are also four other mapping stats, please see the in-app docu in the GUI for details.

Hope this helps, else please share a minimal xml file and we add these lines together.

Best,
Lutz
for Morpheus.lab

Jessica Chen

unread,
Dec 18, 2024, 12:30:18 AM12/18/24
to Morpheus users
Thank you for your response!

Another quick question: How do we go about taking the sum of all cell volumes? I need to calculate the area of the entire colony and cell.volume only looks at one cell.

Best,
Jessica

Lutz Brusch

unread,
Dec 18, 2024, 2:33:24 AM12/18/24
to Morpheus users
Hi Jessica,

yes, this can be done by a Variable and a Mapper with mapping="sum" in Global, like:
        <Variable symbol="V_spheroid" value="0"/>
        <Mapper>
            <Input value="cell.volume*(cell.type!=celltype.medium.id)"/>
            <Output symbol-ref="V_spheroid" mapping="sum"/>
        </Mapper>

Note, the medium also has a volume and this is included in the sum but here enters as zero since the Boolean factor "(cell.type!=celltype.medium.id)" gives zero for medium. This was used in other models, like https://identifiers.org/morpheus/M0007

Best,
Lutz
for Morpheus.lab
Reply all
Reply to author
Forward
0 new messages