Source code for tyssue.dynamics.bulk_gradients

"""
Base gradients for bulk geometry
"""
import numpy as np
import pandas as pd


[docs]def volume_grad(eptm): coords = eptm.coords cell_pos = eptm.edge_df[["c" + c for c in coords]].values face_pos = eptm.edge_df[["f" + c for c in coords]].values srce_pos = eptm.edge_df[["s" + c for c in coords]].values trgt_pos = eptm.edge_df[["t" + c for c in coords]].values grad_v_srce = np.cross((trgt_pos - cell_pos), (face_pos - cell_pos)) / 4 grad_v_trgt = -np.cross((srce_pos - cell_pos), (face_pos - cell_pos)) / 4 return ( pd.DataFrame(grad_v_srce, index=eptm.edge_df.index, columns=eptm.coords), pd.DataFrame(grad_v_trgt, index=eptm.edge_df.index, columns=eptm.coords), )
[docs]def lumen_volume_grad(eptm): """ Calculates the gradient for the volume enclosed by the epithelium. For a monolayer, it will by default compute the volume enclosed by the basal side (edges whose 'segment' column is "basal"). If the polarity is reversed and the apical side faces the lumen, this can be changed by setting eptm.settings["lumen_side"] to 'apical' """ coords = eptm.coords if "segment" in eptm.edge_df: lumen_side = eptm.settings.get("lumen_side", "basal") basal_edges = eptm.edge_df[eptm.edge_df.segment == lumen_side] face_pos = basal_edges[["f" + c for c in coords]].values srce_pos = basal_edges[["s" + c for c in coords]].values trgt_pos = basal_edges[["t" + c for c in coords]].values grad_v_srce = pd.DataFrame( np.zeros((eptm.Ne, 3)), index=eptm.edge_df.index, columns=eptm.coords ) grad_v_trgt = pd.DataFrame( np.zeros((eptm.Ne, 3)), index=eptm.edge_df.index, columns=eptm.coords ) grad_v_srce.loc[basal_edges.index] = -np.cross((trgt_pos), (face_pos)) / 4 grad_v_trgt.loc[basal_edges.index] = np.cross((srce_pos), (face_pos)) / 4 return grad_v_srce, grad_v_trgt else: face_pos = eptm.edge_df[["f" + c for c in coords]].values srce_pos = eptm.edge_df[["s" + c for c in coords]].values trgt_pos = eptm.edge_df[["t" + c for c in coords]].values grad_v_srce = np.cross((trgt_pos), (face_pos)) / 4 grad_v_trgt = -np.cross((srce_pos), (face_pos)) / 4 return ( pd.DataFrame(grad_v_srce, index=eptm.edge_df.index, columns=eptm.coords), pd.DataFrame(grad_v_trgt, index=eptm.edge_df.index, columns=eptm.coords), )