Source code for ecoli.processes.environment.media_update
import numpy as np
from ecoli.processes.registries import topology_registry
from vivarium.core.process import Step
from vivarium.library.units import units
NAME = "media_update"
TOPOLOGY = {
"boundary": ("boundary",),
"environment": ("environment",),
}
topology_registry.register(NAME, TOPOLOGY)
[docs]
class MediaUpdate(Step):
"""
Update environment concentrations according to current media ID.
"""
name = NAME
topology = TOPOLOGY
defaults = {"saved_media": {}, "time_step": 1, "media_id": "minimal"}
def __init__(self, parameters=None):
super().__init__(parameters)
self.saved_media = {}
for media_id, env_concs in self.parameters["saved_media"].items():
self.saved_media[media_id] = {}
for env_mol in env_concs.keys():
self.saved_media[media_id][env_mol] = env_concs[env_mol] * units.mM
self.zero_diff = 0 * units.mM
self.curr_media_id = self.parameters["media_id"]
[docs]
def ports_schema(self):
return {
"boundary": {"external": {"*": {"_default": 0 * units.mM}}},
"environment": {"media_id": {"_default": ""}},
}
[docs]
def next_update(self, timestep, states):
if states["environment"]["media_id"] == self.curr_media_id:
return {}
self.curr_media_id = states["environment"]["media_id"]
env_concs = self.saved_media[self.curr_media_id]
conc_update = {}
# Calculate concentration delta to get from environment specified
# by old media ID to the one specified by the current media ID
for mol, conc in env_concs.items():
diff = conc - states["boundary"]["external"][mol]
# Arithmetic with np.inf gets messy
if np.isnan(diff):
diff = self.zero_diff
conc_update[mol] = diff
return {"boundary": {"external": conc_update}}