A demonstration of cell division with the leg-joint epithelium model

Initialisation

In [37]:
%load_ext autoreload
%autoreload 2

%matplotlib inline

%run nb_init.py
The autoreload extension is already loaded. To reload it, use:
  %reload_ext autoreload
In [38]:
eptm = lj.Epithelium(lj.data.small_xml(),
                     save_dir='saved_graphs',
                     identifier='division',
                     copy=True)
eptm.isotropic_relax()
2015-01-26 11:14:59,162 -leg_joint.epithelium -INFO -Instanciating epithelium division
2015-01-26 11:14:59,214 -leg_joint.epithelium -INFO -Initial cells
2015-01-26 11:14:59,214 -leg_joint.epithelium -INFO -Initial junctions
2015-01-26 11:14:59,554 -leg_joint.epithelium -INFO -Update geometry

Let's take a slice of the epithelium to pick a cell and look at the division

In [39]:
eptm.set_local_mask(None)
lj.local_slice(eptm, theta_c=0, theta_amp=np.pi/9, zed_c=0, zed_amp=6.)
fig, axes=plt.subplots(1, 2, figsize=(12, 8), sharey=True)


lj.plot_2pannels(eptm,
                 cell_kwargs={'c_text':True},
                 edge_kwargs={'c':'g', 'lw':1, 'alpha':0.4},
                 axes=axes)

eptm.set_local_mask(None)

cell n°3 looks fine, let's call it mother_cell, and look at it more closely.

In [40]:
mother_cell = eptm.graph.vertex(3)

## Clear local mask and set it to be centered on 
## the mother cell
eptm.set_local_mask(None)
eptm.set_local_mask(mother_cell, wider=True)

## Create a figure
fig, axes=plt.subplots(1, 2, figsize=(10, 4))#, sharey=True)
axes = lj.plot_2pannels(eptm, axes=axes)

## Show the forces exerted on the vertices of our cell
axes = lj.plot_2pannels_gradients(eptm, axes=axes, scale=10., approx=1)
axes = lj.plot_2pannels_gradients(eptm, axes=axes, scale=10., approx=0)
plt.tight_layout()
plt.draw()

Cell division

Cell growth

To simulate cell growth, we simply augment its equilibrium volume $V_0$

In [41]:
area0 = eptm.cells.areas[mother_cell]
growth_rate = 1.5
eptm.cells.prefered_vol[mother_cell] *= growth_rate

eptm.update_gradient()
In [42]:
fig, axes=plt.subplots(1, 2, figsize=(10, 4))

axes = lj.plot_2pannels(eptm, axes=axes)
axes = lj.plot_2pannels_gradients(eptm, axes=axes, scale=20., approx=0)
axes = lj.plot_2pannels_gradients(eptm, axes=axes, scale=20., approx=1)
plt.tight_layout()
In [43]:
jv0, jv1 = eptm.cells.junctions[mother_cell][2]
In [44]:
def grad_norm(jv):
    return (eptm.grad_ix[jv]**2 + eptm.grad_zed[jv]**2 + eptm.grad_wy[jv]**2)**0.5
In [45]:
grad_norm(jv0), grad_norm(jv1)
Out[45]:
(5080.824747678576, 5080.824747678571)
In [46]:
for jv0, jv1 in eptm.cells.junctions[mother_cell]:
    print(jv0, jv1, grad_norm(jv0), grad_norm(jv1))
    
63 64 4845.101480534979 5080.824747678576
63 67 4845.101480534979 5080.824748899601
64 70 5080.824747678576 5080.824747678571
67 68 5080.824748899601 5080.824748779011
68 69 5080.824748779011 4845.101479826948
69 70 4845.101479826948 5080.824747678571
In [47]:
pos0, pos1 = lj.find_energy_min(eptm, method='fmin_ncg')
print('Current relative area: %.3f' 
      % (eptm.cells.areas[mother_cell] / area0))
Current relative area: 1.568
In [48]:
pos0, pos1 = lj.find_energy_min(eptm, method='fmin_ncg')
Optimization terminated successfully.
         Current function value: 9.986988
         Iterations: 1
         Function evaluations: 2
         Gradient evaluations: 4
         Hessian evaluations: 0
In [9]:
%pdb
Automatic pdb calling has been turned ON
In [49]:
@before_after
def show_division(eptm, mother_cell):
    septum = lj.cell_division(eptm, mother_cell, verbose=True)
    return septum
eptm.graph.set_edge_filter(None)
eptm.graph.set_vertex_filter(None)
septum = show_division(eptm, mother_cell)
if septum is not None:
    jv0, jv1, mother_cell, daughter_cell = septum
2015-01-26 11:33:16,373 -leg_joint.epithelium -INFO -Cell 152 is born
2015-01-26 11:33:17,106 -leg_joint.epithelium -INFO -Division completed
In [50]:
import scipy.optimize as opt
In [51]:
opt.fmin_ncg?

Energy minimisation

In [11]:
eptm.isotropic_relax()

pos0, pos1 = show_optimisation(eptm)
eptm.isotropic_relax()
Optimization terminated successfully.
         Current function value: 11.149816
         Iterations: 1
         Function evaluations: 2
         Gradient evaluations: 4
         Hessian evaluations: 0

Type one transition

Please refer the original definition in Farhadifar et al. Curr Biol. 2007, Suppplementary figure S1)

In ASCII art (letters represent junctions and number represent cells):

e 2 d                  
 \ /         e  d        e  2  d  
  b           \/          \   /
1 | 3  ---->  ab  ----> 1  a-b  3  
  a           /\          /   \    
 / \         f  c        f  4  c 
f 4 c                     

Paramters

The arguments can be either:

  • two cell vertices (1 and 3),
  • two junction vertices (a and b)
  • or a single edge (between a and b)

On choisit deux cellules côte à côte

In [12]:
eptm.set_local_mask(None)
cell1, cell3 = eptm.graph.vertex(912), eptm.graph.vertex(4745)
eptm.set_local_mask(cell1)
eptm.set_local_mask(cell3)

Et on peut provoquer une transition de type 1

In [13]:
%pdb
Automatic pdb calling has been turned OFF
In [14]:
@before_after
def show_type1(eptm, cells):
    cell1, cell3 = cells
    modified_cells, modified_jverts = lj.type1_transition(eptm, (cell1, cell3))
    
show_type1(eptm, (cell1, cell3))
In [16]:
po0, pos1 = show_optimisation(eptm, tol=1e-5, approx_grad=0)
Optimization terminated successfully.
         Current function value: 7.159777
         Iterations: 1
         Function evaluations: 2
         Gradient evaluations: 4
         Hessian evaluations: 0
In [11]: