Source code for tyssue.geometry.base_geometry
import numpy as np
from ..utils.utils import to_nd
[docs]class BaseGeometry:
""" """
[docs] @staticmethod
def update_all(sheet):
raise NotImplementedError
[docs] @staticmethod
def scale(sheet, delta, coords):
"""Scales the coordinates `coords`
by a factor `delta`
"""
sheet.vert_df[coords] = sheet.vert_df[coords] * delta
[docs] @staticmethod
def update_dcoords(sheet):
"""
Update the edge vector coordinates on the
`coords` basis (`default_coords` by default).
Modifies the corresponding
columns (i.e `['dx', 'dy', 'dz']`) in sheet.edge_df.
Also updates the upcasted coordinates of the source and target
vertices
"""
if sheet.settings.get("boundaries") is None:
data = sheet.vert_df[sheet.coords]
srce_pos = sheet.upcast_srce(data)
trgt_pos = sheet.upcast_trgt(data)
sheet.edge_df[["s" + c for c in sheet.coords]] = srce_pos
sheet.edge_df[["t" + c for c in sheet.coords]] = trgt_pos
sheet.edge_df[sheet.dcoords] = trgt_pos - srce_pos
else:
update_periodic_dcoords(sheet)
[docs] @staticmethod
def update_ucoords(sheet):
sheet.edge_df[sheet.ucoords] = sheet.edge_df[sheet.dcoords] / to_nd(
sheet.edge_df["length"], sheet.dim
)
[docs] @staticmethod
def update_length(sheet):
"""
Updates the edge_df `length` column on the `coords` basis
"""
sheet.edge_df["length"] = np.linalg.norm(sheet.edge_df[sheet.dcoords], axis=1)
[docs] @staticmethod
def update_perimeters(sheet):
"""
Updates the perimeter of each face.
"""
sheet.face_df["perimeter"] = sheet.sum_face(sheet.edge_df["length"])
[docs] @staticmethod
def update_centroid(sheet):
"""
Updates the face_df `coords` columns as the face's vertices
center of mass. Also updates the edge_df fx, fy, fz columns
with their upcasted values
"""
scoords = ["s" + c for c in sheet.coords]
sheet.face_df[sheet.coords] = sheet.edge_df.groupby("face")[scoords].mean()
face_pos = sheet.upcast_face(sheet.face_df[sheet.coords])
for c in sheet.coords:
sheet.edge_df["f" + c] = face_pos[c]
sheet.edge_df["r" + c] = sheet.edge_df["s" + c] - sheet.edge_df["f" + c]
[docs] @staticmethod
def center(eptm):
"""
Transates the epithelium vertices so that the center
of mass is at the center of the coordinate system,
and updates the geometry
"""
eptm.vert_df[eptm.coords] = (
eptm.vert_df[eptm.coords].values
- eptm.vert_df[eptm.coords].mean(axis=0).values[np.newaxis, :]
)
[docs] @staticmethod
def dist_to_point(vert_df, point, coords):
"""
Returns the distance of all vertices from point over the
coordinates
Parameters
----------
vert_df: a :class:`pandas.DataFrame` with the points coordinates
in the columns given by the `coords` argument
point: a doublet (in 2D) or triplet (in 3D) giving the reference point
coordinates
coords: list of 2 or 3 strings giving the column names
Returns
-------
distance: a :class:`pandas.Series` with the same length
as the input `vert_df`
"""
return sum(((vert_df[c] - u) ** 2 for c, u in zip(coords, point))) ** 0.5
[docs]def update_periodic_dcoords(sheet):
"""Updates the coordinates for periodic boundary conditions."""
for u, boundary in sheet.settings["boundaries"].items():
period = boundary[1] - boundary[0]
shift = period * (
-(sheet.vert_df[u] > boundary[1]).astype(float)
+ (sheet.vert_df[u] <= boundary[0]).astype(float)
)
sheet.vert_df[u] = sheet.vert_df[u] + shift
srce_pos = sheet.upcast_srce(sheet.vert_df[sheet.coords])
trgt_pos = sheet.upcast_trgt(sheet.vert_df[sheet.coords])
sheet.edge_df[["s" + u for u in sheet.coords]] = srce_pos
sheet.edge_df[["t" + u for u in sheet.coords]] = trgt_pos
sheet.edge_df[sheet.dcoords] = trgt_pos - srce_pos
for u, boundary in sheet.settings["boundaries"].items():
period = boundary[1] - boundary[0]
center = boundary[1] - period / 2
shift = period * (
-(sheet.edge_df["d" + u] >= period / 2).astype(float)
+ (sheet.edge_df["d" + u] < -period / 2).astype(float)
)
sheet.edge_df["d" + u] = sheet.edge_df["d" + u] + shift
sheet.edge_df[f"at_{u}_boundary"] = shift != 0
sheet.face_df[f"at_{u}_boundary"] = sheet.edge_df.groupby("face")[
f"at_{u}_boundary"
].apply(any)
f_at_boundary = sheet.upcast_face(sheet.face_df[f"at_{u}_boundary"]).astype(int)
period = boundary[1] - boundary[0]
srce_shift = f_at_boundary * (sheet.edge_df["s" + u] < center) * period
trgt_shift = f_at_boundary * (sheet.edge_df["t" + u] < center) * period
sheet.edge_df["s" + u] += srce_shift
sheet.edge_df["t" + u] += trgt_shift