Source code for vivarium.processes.meta_division
from __future__ import absolute_import, division, print_function
import uuid
import logging as log
from vivarium.core.process import Deriver
# functions for generating daughter ids
[docs]class MetaDivision(Deriver):
name = 'meta_division'
defaults = {
'initial_state': {},
'daughter_path': ('cell',),
'daughter_ids_function': daughter_phylogeny_id}
def __init__(self, initial_parameters=None):
if initial_parameters is None:
initial_parameters = {}
self.division = 0
# must provide a compartment to generate new daughters
self.agent_id = initial_parameters['agent_id']
self.compartment = initial_parameters['compartment']
self.daughter_ids_function = self.or_default(
initial_parameters, 'daughter_ids_function')
self.daughter_path = self.or_default(
initial_parameters, 'daughter_path')
super(MetaDivision, self).__init__(initial_parameters)
[docs] def ports_schema(self):
return {
'global': {
'divide': {
'_default': False,
'_updater': 'set',
'_divider': divider_set_false,
}},
'cells': {
'*': {}}}
[docs] def next_update(self, timestep, states):
divide = states['global']['divide']
if divide:
daughter_ids = self.daughter_ids_function(self.agent_id)
daughter_updates = []
for daughter_id in daughter_ids:
compartment = self.compartment.generate({
'agent_id': daughter_id})
daughter_updates.append({
'daughter': daughter_id,
'path': (daughter_id,) + self.daughter_path,
'processes': compartment['processes'],
'topology': compartment['topology'],
'initial_state': {}})
log.info(
'DIVIDE! \n--> MOTHER: {} \n--> DAUGHTERS: {}'.format(
self.agent_id, daughter_ids))
# initial state will be provided by division in the tree
return {
'cells': {
'_divide': {
'mother': self.agent_id,
'daughters': daughter_updates}}}
else:
return {}