Source code for sbmlsim.examples.experiments.repressilator.repressilator_scans
"""
Example simulation experiment.
"""
from pathlib import Path
from typing import Dict, Union
import numpy as np
from sbmlsim.data import Data
from sbmlsim.experiment import ExperimentRunner, SimulationExperiment
from sbmlsim.model import AbstractModel
from sbmlsim.plot import Axis, Figure
from sbmlsim.resources import REPRESSILATOR_SBML
from sbmlsim.simulation import (
AbstractSim,
Dimension,
ScanSim,
Timecourse,
TimecourseSim,
)
from sbmlsim.simulator.rr_simulator_ray import SimulatorRayRR
from sbmlsim.simulator.rr_simulator_serial import SimulatorSerialRR
from sbmlsim.task import Task
[docs]class RepressilatorScanExperiment(SimulationExperiment):
"""Simple repressilator experiment."""
[docs] def models(self) -> Dict[str, Union[Path, AbstractModel]]:
return {
"model1": REPRESSILATOR_SBML,
"model2": AbstractModel(
REPRESSILATOR_SBML, changes={"X": self.Q_(100, "dimensionless")}
),
}
[docs] def simulations(self) -> Dict[str, AbstractSim]:
return {
**self.sim_scans(),
# **self.sim_sensitivities(),
}
[docs] def tasks(self) -> Dict[str, Task]:
tasks = dict()
for model in ["model1", "model2"]:
for sim_key in self.simulations():
tasks[f"task_{model}_{sim_key}"] = Task(model=model, simulation=sim_key)
return tasks
[docs] def sim_scans(self) -> Dict[str, AbstractSim]:
Q_ = self.Q_
unit_data = "dimensionless"
tc = TimecourseSim(
[
Timecourse(start=0, end=100, steps=2000),
Timecourse(
start=0,
end=100,
steps=2000,
changes={"X": Q_(10, unit_data), "Y": Q_(20, unit_data)},
),
]
)
scan1d = ScanSim(
simulation=tc,
dimensions=[
Dimension(
"dim1", changes={"X": Q_(np.linspace(0, 10, num=11), unit_data)}
)
],
)
scan2d = ScanSim(
simulation=tc,
dimensions=[
Dimension(
"dim1",
changes={"X": Q_(np.random.normal(5, 2, size=10), unit_data)},
),
Dimension(
"dim2",
changes={"Y": Q_(np.random.normal(5, 2, size=10), unit_data)},
),
],
)
scan3d = ScanSim(
simulation=tc,
dimensions=[
Dimension(
"dim1", changes={"X": Q_(np.linspace(0, 10, num=5), unit_data)}
),
Dimension(
"dim2", changes={"Y": Q_(np.linspace(0, 10, num=5), unit_data)}
),
Dimension(
"dim3", changes={"Z": Q_(np.linspace(0, 10, num=5), unit_data)}
),
],
)
return {
"tc": tc,
"scan1d": scan1d,
"scan2d": scan2d,
# "scan3d": scan3d,
}
[docs] def data(self) -> Dict[str, Data]:
"""Data used for plotting and analysis.
Generates promises for results.
:return:
"""
data = []
for model in ["model1", "model2"]:
for selection in ["X", "Y", "Z"]:
# accessed data
data.append(Data(task=f"task_{model}_tc", index=selection))
# Define functions (data generators)
data.extend(
[
Data(
index="f1",
function="(sin(X)+Y+Z)/max(X)",
variables={
"X": Data(index="X", task="task_model1_tc"),
"Y": Data(index="Y", task="task_model1_tc"),
"Z": Data(index="Y", task="task_model1_tc"),
},
parameters={},
),
Data(
index="f2",
function="Y/max(Y)",
variables={
"Y": Data(index="Y", task="task_model1_tc"),
},
),
]
)
# FIXME: arbitrary processing
# [3] arbitrary processing (e.g. pharmacokinetic calculations)
# Processing(variables) # arbitrary functions
# Aggregation over
return {d.sid: d for d in data}
[docs] def figures(self) -> Dict[str, Figure]:
unit_time = "min"
unit_data = "dimensionless"
self.add_selections_data(
selections=["time", "X", "Y"],
task_ids=[f"task_{m}_tc" for m in ["model1", "model2"]],
)
fig1 = Figure(experiment=self, sid="Fig1", num_cols=1, num_rows=1)
plots = fig1.create_plots(
xaxis=Axis("time", unit=unit_time),
yaxis=Axis("data", unit=unit_data),
legend=True,
)
plots[0].set_title(f"{self.sid}_{fig1.sid}")
for model in ["model1", "model2"]:
task_id = f"task_{model}_tc"
plots[0].curve(
x=Data("time", task=task_id),
y=Data("X", task=task_id),
label="X sim",
color="black",
)
plots[0].curve(
x=Data("time", task=task_id),
y=Data("Y", task=task_id),
label="Y sim",
color="blue",
)
fig2 = Figure(experiment=self, sid="Fig2", num_rows=2, num_cols=1)
plots = fig2.create_plots(
xaxis=Axis("data", unit=unit_data),
yaxis=Axis("data", unit=unit_data),
legend=True,
)
plots[0].curve(
x=self._data["f1"],
y=self._data["f2"],
label="f2 ~ f1",
color="black",
marker="o",
alpha=0.3,
)
plots[1].curve(
x=self._data["f1"],
y=self._data["f2"],
label="f2 ~ f1",
color="black",
marker="o",
alpha=0.3,
)
plots[0].xaxis.min = -1.0
plots[0].xaxis.max = 2.0
plots[0].xaxis.grid = True
plots[1].xaxis.scale = "log"
plots[1].yaxis.scale = "log"
return {
fig1.sid: fig1,
fig2.sid: fig2,
}
[docs]def run_repressilator_experiments(output_path: Path) -> Path:
"""Run the repressilator simulation experiments."""
base_path = Path(__file__).parent
data_path = base_path
for simulator in [SimulatorSerialRR(), SimulatorRayRR()]:
runner = ExperimentRunner(
[RepressilatorScanExperiment],
simulator=simulator,
data_path=data_path,
base_path=base_path,
)
_results = runner.run_experiments(
output_path=output_path / "results", show_figures=True
)
if __name__ == "__main__":
run_repressilator_experiments(Path(__file__).parent / "results")