Source code for tyssue.behaviors.monolayer.apoptosis_events

import logging

from ...topology.bulk_topology import HI_transition, IH_transition
from .actions import contract, shrink

logger = logging.getLogger(__name__)


default_apoptosis_spec = {
    "cell_id": -1,
    "contract_rate": 2.0,
    "critical_area": 1e-2,
    "shrink_rate": 0.4,
    "critical_volume": 0.1,
}


[docs]def apoptosis(monolayer, manager, **kwargs): """Apoptotic behavior Parameters ---------- monolayer : a :cass:`Monolayer` object manager : a :class:`EventManager` object Optional Parameters ------------------- cell_id : int id of the apoptotic cell contract_rate : float, default 2. critical_area : float, default 1e-2, shrink_rate : float, default 0.4, critical_volume : float, default 0.1, """ apoptosis_spec = default_apoptosis_spec apoptosis_spec.update(**kwargs) cell = apoptosis_spec["cell_id"] if cell == -1: return done = False cell_to_face = monolayer.get_orbits("cell", "face") try: apical_face = monolayer.face_df[ (monolayer.face_df.index.isin(cell_to_face[cell])) & (monolayer.face_df.segment == "apical") ].index[0] except Exception: # TODO fix that apical_face = None # Apical face has already been removed. # It needs to eliminate lateral face until obtain a cell with 4 faces. if apical_face is None: faces_in_cell = monolayer.face_df.loc[cell_to_face[cell].unique()] if len(faces_in_cell) > 4: # Remove lateral face with 3 sides face_to_eliminate = faces_in_cell[ (faces_in_cell.segment == "lateral") & (faces_in_cell.num_sides == 3) ].index[0] prev_nums = { "edge": monolayer.Ne, "face": monolayer.Nf, "vert": monolayer.Nv, } HI_transition(monolayer, face_to_eliminate) monolayer.face_df.loc[prev_nums["face"] :, "contractility"] = 0 done = False elif len(faces_in_cell) == 4: # Volume reduction if monolayer.cell_df.loc[cell, "vol"] > apoptosis_spec["critical_volume"]: shrink(monolayer, cell, apoptosis_spec["shrink_rate"]) done = False else: done = True else: # Contract apical surface until reached a critical area if monolayer.face_df.loc[apical_face, "area"] > apoptosis_spec["critical_area"]: contract(monolayer, apical_face, apoptosis_spec["contract_rate"], True) done = False elif ( monolayer.face_df.loc[apical_face, "area"] <= apoptosis_spec["critical_area"] ): # Reduce neighbours for the apical face (until 3) if monolayer.face_df.loc[apical_face, "num_sides"] > 3: e_min = monolayer.edge_df[monolayer.edge_df["face"] == apical_face][ "length" ].idxmin() prev_nums = { "edge": monolayer.Ne, "face": monolayer.Nf, "vert": monolayer.Nv, } monolayer.settings["threshold_length"] = 1e-3 IH_transition(monolayer, e_min) monolayer.face_df.loc[prev_nums["face"] :, "contractility"] = 0 done = False elif monolayer.face_df.loc[apical_face, "num_sides"] == 3: prev_nums = { "edge": monolayer.Ne, "face": monolayer.Nf, "vert": monolayer.Nv, } HI_transition(monolayer, apical_face) done = False if not done: manager.append(apoptosis, **apoptosis_spec)