{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Cell Division " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## On a 2D mesh" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import json\n", "import matplotlib.pylab as plt\n", "import ipyvolume as ipv\n", "%matplotlib inline\n", "\n", "from tyssue import Sheet, config\n", "\n", "\n", "from tyssue.geometry.planar_geometry import PlanarGeometry as geom\n", "from tyssue.solvers.quasistatic import QSSolver\n", "from tyssue.dynamics.planar_vertex_model import PlanarModel as model\n", "\n", "from tyssue.draw import sheet_view\n", "from tyssue.stores import load_datasets\n", "\n", "from tyssue.topology.sheet_topology import remove_face, cell_division\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "solver = QSSolver()\n", "sheet = Sheet.planar_sheet_2d('division', 6, 6, 1, 1)\n", "sheet.sanitize(trim_borders=True, order_edges=True)\n", "geom.update_all(sheet)\n", "\n", "sheet.get_opposite()\n", "\n", "# ## Set up the model\n", "nondim_specs = config.dynamics.quasistatic_plane_spec()\n", "dim_model_specs = model.dimensionalize(nondim_specs)\n", "sheet.update_specs(dim_model_specs, reset=True)\n", "\n", "print(\"Number of cells: {}\\n\"\n", " \" edges: {}\\n\"\n", " \" vertices: {}\\n\".format(sheet.Nf, sheet.Ne, sheet.Nv))\n", "\n", "# ## Minimize energy\n", "res = solver.find_energy_min(sheet, geom, model)\n", "\n", "# ## View the result\n", "draw_specs = config.draw.sheet_spec()\n", "draw_specs['vert']['visible'] = False\n", "draw_specs['edge']['head_width'] = 0.1\n", "fig, ax = sheet_view(sheet, **draw_specs)\n", "fig.set_size_inches(12, 5)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "daughter = cell_division(sheet, 7, geom, angle=np.pi/2)\n", "\n", "res = solver.find_energy_min(sheet, geom, model)\n", "print(res['success'])\n", "\n", "fig, ax = sheet_view(sheet, **draw_specs)\n", "fig.set_size_inches(12, 5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Division in a 3D single layer epithelium" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from tyssue.io.hdf5 import save_datasets, load_datasets\n", "# redefine cell_division from monolayer related topology module\n", "from tyssue.topology.monolayer_topology import cell_division\n", "\n", "from tyssue.core.monolayer import Monolayer\n", "from tyssue.geometry.bulk_geometry import ClosedMonolayerGeometry as monolayer_geom\n", "from tyssue.dynamics.bulk_model import ClosedMonolayerModel\n", "from tyssue.draw import highlight_cells\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "datasets = load_datasets('data/small_ellipsoid.hf5',\n", " data_names=['vert', 'edge',\n", " 'face', 'cell'])\n", "\n", "specs = config.geometry.bulk_spec()\n", "monolayer = Monolayer('ell', datasets, specs)\n", "monolayer_geom.update_all(monolayer)\n", "\n", "specs = {\n", " \"edge\": {\n", " \"line_tension\": 0.0,\n", " },\n", " \"face\": {\n", " \"contractility\": 0.01,\n", " },\n", " \"cell\": {\n", " \"prefered_vol\": monolayer.cell_df['vol'].median(),\n", " \"vol_elasticity\": 0.1,\n", " \"prefered_area\": monolayer.cell_df['area'].median(),\n", " \"area_elasticity\": 0.1,\n", " },\n", " \"settings\": {\n", " 'lumen_prefered_vol': monolayer.settings['lumen_vol'],\n", " 'lumen_vol_elasticity': 1e-2\n", "\n", " }\n", "}\n", "\n", "monolayer.update_specs(specs, reset=True)\n", "\n", "res = solver.find_energy_min(monolayer, monolayer_geom, ClosedMonolayerModel)\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "mother = 8\n", "daughter = cell_division(monolayer, mother, \n", " orientation='vertical')\n", "\n", "monolayer.validate()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "rho = np.linalg.norm(monolayer.vert_df[monolayer.coords], axis=1)\n", "draw_specs['edge']['color'] = rho\n", "draw_specs['face']['visible'] = True\n", "\n", "ipv.clear()\n", "highlight_cells(monolayer, mother, reset_visible=True)\n", "fig, mesh = sheet_view(monolayer, mode=\"3D\",\n", " coords=['z', 'x', 'y'], **draw_specs)\n", "fig" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "mother = 18\n", "daughter = cell_division(monolayer, mother, \n", " orientation='horizontal')\n", "monolayer.validate()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "rho = np.linalg.norm(monolayer.vert_df[monolayer.coords], axis=1)\n", "draw_specs['edge']['color'] = rho\n", "draw_specs['face']['visible'] = True\n", "ipv.clear()\n", "highlight_cells(monolayer, mother)\n", "fig, mesh = sheet_view(monolayer, mode=\"3D\",\n", " coords=['z', 'x', 'y'], **draw_specs)\n", "fig" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Energy minimisation of the monolayer after division\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "\n", "monolayer.cell_df.loc[[mother, daughter], 'prefered_area'] /= 2\n", "monolayer.cell_df.loc[[mother, daughter], 'prefered_vol'] /= 3\n", "monolayer.settings['lumen_prefered_vol'] = monolayer.settings['lumen_vol']\n", "monolayer.settings['lumen_vol_elasticity'] = 1e-2\n", "\n", "res = solver.find_energy_min(monolayer, monolayer_geom, ClosedMonolayerModel)\n", "print(res['message'])\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "rho = np.linalg.norm(monolayer.vert_df[monolayer.coords], axis=1)\n", "draw_specs['edge']['color'] = rho\n", "ipv.clear()\n", "highlight_cells(monolayer, mother)\n", "fig, mesh = sheet_view(monolayer, mode=\"3D\",\n", " coords=['z', 'x', 'y'], **draw_specs)\n", "fig" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from tyssue.generation import three_faces_sheet, extrude\n", "from tyssue.geometry.bulk_geometry import MonoLayerGeometry\n", "\n", "\n", "datasets_2d, _ = three_faces_sheet(zaxis=True)\n", "datasets = extrude(datasets_2d, method='translation')\n", "eptm = Monolayer('test_volume', datasets, \n", " config.geometry.bulk_spec(),\n", " coords=['x','y','z'])\n", "#eptm.vert_df[eptm.coords] += np.random.normal(scale=1e-3,\n", "# size=eptm.vert_df[eptm.coords].shape)\n", "MonoLayerGeometry.update_all(eptm)\n", "\n", "for orientation in ['vertical', 'horizontal']:\n", " print(orientation)\n", " daughter = cell_division(eptm, 1,\n", " orientation=orientation)\n", " eptm.reset_topo()\n", " eptm.reset_index()\n", " MonoLayerGeometry.update_all(eptm)\n", " print(f'Valid division for {orientation}:')\n", " print(eptm.validate()) #break" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 1 }