Source code for maboss.upp.upp

from __future__ import print_function
import sys
from .results import UpdatePopulationResults
from .cmaboss_results import CMaBoSSUpdatePopulationResults

[docs] class UpdatePopulation: """ .. py:class:: construct a simulation for Update Population MaBoSS. :param model: MaBoSS model :param uppfile: upp file, default to None :param previous_run: previous run to start from, default to None :param nodes_init: dict in the form { "node1" : TrueProb1, "node2" : TrueProb2, ...} with nodes to be initialised to a specific value at the start of the simulation. These values override the previous run probabilities for the specified nodes, default to None :param verbose: boolean to activate verbose mode, default to False """ def __init__(self, model, uppfile=None, previous_run=None, nodes_init=None, verbose=False): self.model = model self.uppfile = uppfile self.previous_run = previous_run self.nodes_init = nodes_init self.time_step = float(model.param['max_time']) self.time_shift = 0.0 self.base_ratio = 1.0 self.node_list = list(model.network.keys()) self.division_node = "" self.death_node = "" self.update_var = {} self.nodes_formula = {} self.pop_ratio = 1.0 self.step_number = -1 self.verbose = verbose if previous_run: # Chain the results!! prev_pop_ratios = previous_run.get_population_ratios() self.time_shift = prev_pop_ratios.last_valid_index() self.base_ratio = prev_pop_ratios.iloc[-1] self.model = model.copy() if self.uppfile is not None: if "://" in self.uppfile: from colomoto_jupyter.io import ensure_localfile self.uppfile = ensure_localfile(self.uppfile) self._readUppFile()
[docs] def run(self, workdir=None, overwrite=None, verbose=False, host=None, port=7777, cmaboss=False, only_final_state=False): """ .. py:method:: Runs the simulation :param workdir: (optional) Working directory in which to save result files :param overwrite: (optional) Boolean to indicate if you want to overwrite existing results in the working directory :param verbose: (optional) Boolean to indicate if you want debugging information :param host: (optional) Host to use when simulating on a MaBoSS server :param port: (optional) Port to use when simulating on a MaBoSS server :return: The Update Population results object. """ if cmaboss: return CMaBoSSUpdatePopulationResults(self, verbose, workdir, overwrite, self.previous_run, nodes_init=self.nodes_init, only_final_state=only_final_state) else: return UpdatePopulationResults(self, verbose, workdir, overwrite, self.previous_run, host=host, port=port, nodes_init=self.nodes_init)
def _readUppFile(self): try: with open(self.uppfile, 'r') as UPP: for line in UPP.readlines(): if line.startswith("death"): if self.death_node != "": print("Multiple definition of death node", file=sys.stderr) exit() self.death_node = line.split("=")[1] self.death_node = self.death_node.replace(";", "").strip() if self.verbose: print("Death node : %s" % self.death_node) if line.startswith("division"): if self.division_node != "": print("Multiple definition of division node", file=sys.stderr) exit() self.division_node = line.split("=")[1] self.division_node = self.division_node.replace(";", "").strip() if self.verbose: print("Division node : %s" % self.division_node) if line.startswith("steps"): if self.step_number != -1: print("Multiple definition of step number", file=sys.stderr) exit() self.step_number = line.split("=")[1] self.step_number = int(self.step_number.replace(";", "").strip()) if self.verbose: print("Number of steps : %s" % self.step_number) if line.startswith("$"): (varName, value) = line.split("u=", 1) varName = varName.strip() if varName in self.update_var.keys(): print("Multiple definitions of %s" % varName) exit() value = value.replace(";", "").strip() self.update_var.update({varName: value}) if self.verbose: print("Var %s updated by value %s" % (varName, value)) if line.startswith("@"): (nodeName, value) = line.split("u=", 1) nodeName = nodeName.strip()[1:] # remove starting @ if nodeName in self.nodes_formula.keys(): print("Multiple formula definitions for node %s" % nodeName) exit() value = value.replace(";", "").strip() self.nodes_formula.update({nodeName: value}) if self.verbose: print("Node %s has formula %s" % (nodeName, value)) except FileNotFoundError: print("Cannot find .upp file", file=sys.stderr) exit()
[docs] def setStepNumber(self, step_number): """ .. py:method:: Modifies the number of step of the simulation :param step_number: The number of steps of the simulation """ self.step_number = step_number
[docs] def setDeathNode(self, death_node): """ .. py:method:: Modifies the identifier of the node used to represent cellular death :param death_node: The identifier of the node to be used to represent death """ self.death_node = death_node
[docs] def setDivisionNode(self, division_node): """ .. py:method:: Modifies the identifier of the node used to represent cellular division :param division_node: The identifier of the node to be used to represent division """ self.division_node = division_node
[docs] def setExternalVariable(self, name, formula, overwrite=False): """ .. py:method:: Creates a rule to update the external variable at each step :param name: The identifier of the variable to be updated :param formula: The formula for the variable's update :param overwrite: (optional) Overwrite the rule if one already exists for the given name """ if name in self.update_var.keys() and not overwrite: print("External variable %s already exists !" % name, file=sys.stderr) return self.update_var.update({name: formula})
def setNodeFormula(self, node, formula, overwrite=False): if node in self.nodes_formula.keys() and not overwrite: print("Formula for node %s already exists !" % node, file=sys.stderr) return self.nodes_formula.update({node: formula})