{ "cells": [ { "attachments": {}, "cell_type": "markdown", "id": "073456b9", "metadata": {}, "source": [ "[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/combine-org/combine-notebooks/main?labpath=%2Fnotebooks%2Fsbml.ipynb)\n", "\"Open\n", "\n" ] }, { "attachments": {}, "cell_type": "markdown", "id": "e1699266", "metadata": {}, "source": [ "# Simple SBML example\n" ] }, { "attachments": {}, "cell_type": "markdown", "id": "ef7315d5", "metadata": {}, "source": [ "This notebook creates a simple model in [SBML Level 3 Version 1](https://synonym.caltech.edu/documents/specifications/level-3/version-1/core/release-3/) for illustration. The SBML model will consist of two chemical species called `S1` and `S2`, as well as a compartment where those chemicals reside. We also add a basic reaction that converts `S1` irreversibly into `S2`. We then use [BasiCO](https://basico.readthedocs.io/en/latest/) to build and run a simulation of the SBML model. BasiCO is a simplified interface to using COPASI from python. The result of that simulation can be seen in the plot below.\n", "\n", "
\n", "\"SBML\n", "
" ] }, { "attachments": {}, "cell_type": "markdown", "id": "c59a3e71", "metadata": {}, "source": [ "## 1) Including libraries and helper functions" ] }, { "attachments": {}, "cell_type": "markdown", "id": "0d76b18a", "metadata": {}, "source": [ "Note: Please uncomment the line below if you use the Google Colab." ] }, { "cell_type": "code", "execution_count": 14, "id": "ae75df10", "metadata": {}, "outputs": [], "source": [ "#%pip install git+https://github.com/combine-org/combine-notebooks" ] }, { "cell_type": "code", "execution_count": 15, "id": "4b7c5a24", "metadata": {}, "outputs": [], "source": [ "from pathlib import Path\n", "\n", "import libsbml\n", "from basico import load_model, run_time_course, get_reaction_parameters, get_species\n", "import matplotlib.pyplot as plt\n", "\n", "from combine_notebooks import RESULTS_DIR\n", "from combine_notebooks.validation.validation_sbml import validate_sbml" ] }, { "cell_type": "code", "execution_count": 16, "id": "cfd51931", "metadata": {}, "outputs": [], "source": [ "def pretty_print(doc_before : libsbml.SBMLDocument, doc_after : libsbml.SBMLDocument = None):\n", " # Break the original SBML into lines\n", " original_document = libsbml.writeSBMLToString(doc_before)\n", " original_document_lines = original_document.split('\\n')\n", " # Print the entire document in red\n", " if doc_after == None:\n", " original_document = '\\n'.join(original_document_lines)\n", " print(\"\\x1b[31m\" + original_document + \"\\x1b[0m\") # ANSI escape used to print colours here\n", " # If a new document is also given, highlight the lines that have changed\n", " else:\n", " # Split the updated SBML into lines\n", " new_document = libsbml.writeSBMLToString(doc_after)\n", " new_document_lines = new_document.split('\\n')\n", " # Iterate over each new line\n", " for new_line in new_document_lines:\n", " # Print any new lines in red, otherwise print normally\n", " if new_line in original_document_lines:\n", " print(new_line)\n", " else:\n", " print(\"\\x1b[31m\" + new_line + \"\\x1b[0m\") # ANSI escape used to print colours here" ] }, { "attachments": {}, "cell_type": "markdown", "id": "dfb6d8d0", "metadata": {}, "source": [ "## 2) Declaring the SBML model" ] }, { "attachments": {}, "cell_type": "markdown", "id": "f544db5b", "metadata": { "lines_to_next_cell": 0 }, "source": [ "Create an empty SBMLDocument object. You may also want to check for possible errors. Even when the parameter values are hardwired like this, it is still possible for a failure to occur (e.g., if the operating system runs out of memory). " ] }, { "cell_type": "code", "execution_count": 17, "id": "ae6bbf46", "metadata": { "lines_to_next_cell": 0 }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[31m\n", "\n", "\u001b[0m\n" ] } ], "source": [ "document = libsbml.SBMLDocument(3, 1)\n", "\n", "pretty_print(document)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "a2426962", "metadata": {}, "source": [ "Create the basic Model object inside the SBMLDocument object. To\n", "produce a model with complete units for the reaction rates, we need\n", "to set the 'timeUnits' and 'extentUnits' attributes on Model. We\n", "set 'substanceUnits' too, for good measure, though it's not strictly\n", "necessary here because we also set the units for individual species\n", "in their definitions." ] }, { "cell_type": "code", "execution_count": 18, "id": "63e6af9a", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "\u001b[31m\u001b[0m\n", "\u001b[31m \u001b[0m\n", "\u001b[31m\u001b[0m\n", "\n" ] } ], "source": [ "start_doc = libsbml.SBMLDocument(document)\n", "\n", "model = document.createModel()\n", "model.setTimeUnits(\"second\")\n", "model.setExtentUnits(\"mole\")\n", "model.setSubstanceUnits('mole')\n", "\n", "pretty_print(start_doc, document)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "800b6957", "metadata": {}, "source": [ "Create a unit definition we will need later. Note that SBML Unit\n", "objects must have all four attributes 'kind', 'exponent', 'scale'\n", "and 'multiplier' defined." ] }, { "cell_type": "code", "execution_count": 19, "id": "58e1cd4a", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", "\u001b[31m \u001b[0m\n", "\u001b[31m \u001b[0m\n", "\u001b[31m \u001b[0m\n", "\u001b[31m \u001b[0m\n", "\u001b[31m \u001b[0m\n", "\u001b[31m \u001b[0m\n", "\u001b[31m \u001b[0m\n", "\u001b[31m \u001b[0m\n", "\u001b[31m \u001b[0m\n", "\n", "\n" ] } ], "source": [ "start_doc = libsbml.SBMLDocument(document)\n", "\n", "per_second = model.createUnitDefinition()\n", "per_second.setId('per_second')\n", "unit = per_second.createUnit()\n", "unit.setKind(libsbml.UNIT_KIND_SECOND)\n", "unit.setExponent(-1)\n", "unit.setScale(0)\n", "unit.setMultiplier(1)\n", "\n", "pretty_print(start_doc, document)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "b3277911", "metadata": {}, "source": [ "Create a compartment inside this model, and set the required\n", "attributes for an SBML compartment in SBML Level 3." ] }, { "cell_type": "code", "execution_count": 20, "id": "e5ec79db", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\u001b[31m \u001b[0m\n", "\u001b[31m \u001b[0m\n", "\u001b[31m \u001b[0m\n", " \n", "\n", "\n" ] } ], "source": [ "start_doc = libsbml.SBMLDocument(document)\n", "\n", "c1 = model.createCompartment()\n", "c1.setId('c1')\n", "c1.setConstant(True)\n", "c1.setSize(1)\n", "c1.setSpatialDimensions(3)\n", "c1.setUnits('litre')\n", "\n", "pretty_print(start_doc, document)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "0ec2e677", "metadata": {}, "source": [ "Create two species inside this model, set the required attributes\n", "for each species in SBML Level 3 (which are the 'id', 'compartment',\n", "'constant', 'hasOnlySubstanceUnits', and 'boundaryCondition'\n", "attributes), and initialize the amount of the species along with the\n", "units of the amount." ] }, { "cell_type": "code", "execution_count": 21, "id": "2a942cb8", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\u001b[31m \u001b[0m\n", "\u001b[31m \u001b[0m\n", "\u001b[31m \u001b[0m\n", "\u001b[31m \u001b[0m\n", " \n", "\n", "\n" ] } ], "source": [ "start_doc = libsbml.SBMLDocument(document)\n", "\n", "s1 = model.createSpecies()\n", "s1.setId('S1')\n", "s1.setCompartment('c1')\n", "s1.setConstant(False)\n", "s1.setInitialAmount(5)\n", "s1.setSubstanceUnits('mole')\n", "s1.setBoundaryCondition(False)\n", "s1.setHasOnlySubstanceUnits(False)\n", "\n", "s2 = model.createSpecies()\n", "s2.setId('S2')\n", "s2.setCompartment('c1')\n", "s2.setConstant(False)\n", "s2.setInitialAmount(0)\n", "s2.setSubstanceUnits('mole')\n", "s2.setBoundaryCondition(False)\n", "s2.setHasOnlySubstanceUnits(False)\n", "\n", "pretty_print(start_doc, document)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "0d118d66", "metadata": {}, "source": [ "Create a parameter object inside this model, set the required\n", "attributes 'id' and 'constant' for a parameter in SBML Level 3, and\n", "initialize the parameter with a value along with its units." ] }, { "cell_type": "code", "execution_count": 22, "id": "8e4d6ce7", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\u001b[31m \u001b[0m\n", "\u001b[31m \u001b[0m\n", "\u001b[31m \u001b[0m\n", " \n", "\n", "\n" ] } ], "source": [ "start_doc = libsbml.SBMLDocument(document)\n", "\n", "k = model.createParameter()\n", "k.setId('k')\n", "k.setConstant(True)\n", "k.setValue(1)\n", "k.setUnits('per_second')\n", "\n", "pretty_print(start_doc, document)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "8cd2796b", "metadata": {}, "source": [ "Create a reaction inside this model, set the reactants and products. We\n", "set the minimum required attributes for all of these objects. The\n", "units of the reaction rate are determined from the 'timeUnits' and\n", "'extentUnits' attributes on the Model object.\n", "NOTE: The reactants and products refer the species already in the model. " ] }, { "cell_type": "code", "execution_count": 23, "id": "f03557f6", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\u001b[31m \u001b[0m\n", "\u001b[31m \u001b[0m\n", "\u001b[31m \u001b[0m\n", "\u001b[31m \u001b[0m\n", "\u001b[31m \u001b[0m\n", "\u001b[31m \u001b[0m\n", "\u001b[31m \u001b[0m\n", "\u001b[31m \u001b[0m\n", "\u001b[31m \u001b[0m\n", "\u001b[31m \u001b[0m\n", " \n", "\n", "\n" ] } ], "source": [ "start_doc = libsbml.SBMLDocument(document)\n", "\n", "r1 = model.createReaction()\n", "r1.setId('r1')\n", "r1.setReversible(False)\n", "r1.setFast(False)\n", "\n", "species_ref1 = r1.createReactant()\n", "species_ref1.setSpecies('S1')\n", "species_ref1.setConstant(True)\n", "\n", "species_ref2 = r1.createProduct()\n", "species_ref2.setSpecies('S2')\n", "species_ref2.setConstant(True)\n", "\n", "pretty_print(start_doc, document)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "c10fec68", "metadata": {}, "source": [ "Set the reaction rate expression (the SBML \"kinetic law\"). Here we are using MathML to model the equation ; $k \\times S1 \\times c1$\n", "\n" ] }, { "cell_type": "code", "execution_count": 24, "id": "691507e3", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\u001b[31m \u001b[0m\n", "\u001b[31m \u001b[0m\n", "\u001b[31m \u001b[0m\n", "\u001b[31m \u001b[0m\n", "\u001b[31m k \u001b[0m\n", "\u001b[31m S1 \u001b[0m\n", "\u001b[31m c1 \u001b[0m\n", "\u001b[31m \u001b[0m\n", "\u001b[31m \u001b[0m\n", "\u001b[31m \u001b[0m\n", " \n", " \n", " \n", "\n", "\n" ] } ], "source": [ "start_doc = libsbml.SBMLDocument(document)\n", "\n", "math_ast = libsbml.parseL3Formula('k * S1 * c1')\n", "\n", "kinetic_law = r1.createKineticLaw()\n", "kinetic_law.setMath(math_ast)\n", "\n", "pretty_print(start_doc, document)\n" ] }, { "attachments": {}, "cell_type": "markdown", "id": "39c5e5d1", "metadata": {}, "source": [ "## 3) Write, print and validate the generated model" ] }, { "attachments": {}, "cell_type": "markdown", "id": "b726b49b", "metadata": {}, "source": [ "And we're done creating the basic model. Here we will check if the SBML is valid." ] }, { "cell_type": "code", "execution_count": 25, "id": "f407d8bc", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "--------------------------------------------------------------------------------\n", "validation error(s) : 0\n", "validation warning(s) : 0\n", "--------------------------------------------------------------------------------\n" ] } ], "source": [ "# validate file\n", "validate_sbml(document, units_consistency=False)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "44c1bfd6", "metadata": {}, "source": [ "Now save a text string containing the model into an XML file." ] }, { "cell_type": "code", "execution_count": 26, "id": "199d4f04", "metadata": { "lines_to_next_cell": 2 }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " k \n", " S1 \n", " c1 \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", "\n" ] } ], "source": [ "RESULTS_DIR.mkdir(parents=True, exist_ok=True)\n", "file_loc = RESULTS_DIR / \"hello_world_sbml.xml\"\n", "libsbml.writeSBMLToFile(document, str(file_loc))\n", "xml = open(file_loc).read()\n", "print(xml)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "a8b6a58c", "metadata": {}, "source": [ "## 4) Simulating the model" ] }, { "attachments": {}, "cell_type": "markdown", "id": "cf6ef008", "metadata": {}, "source": [ "Now we will load to model into COPASI (basico) so we can run a simulation." ] }, { "cell_type": "code", "execution_count": 27, "id": "0ad895c1", "metadata": {}, "outputs": [], "source": [ "model = load_model(file_loc)" ] }, { "attachments": {}, "cell_type": "markdown", "id": "d1d249d1", "metadata": {}, "source": [ "To verify our species parameters for s1 and s2 we can call get_species, which returns a dataframe with all information about the species." ] }, { "cell_type": "code", "execution_count": 28, "id": "9d3a22c9", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
compartmenttypeunitinitial_concentrationinitial_particle_numberinitial_expressionexpressionconcentrationparticle_numberrateparticle_number_ratekeysbml_id
name
S1c1reactionsmol/l5.03.011071e+245.03.011071e+24-5.0-3.011071e+24Metabolite_0S1
S2c1reactionsmol/l0.00.000000e+000.00.000000e+005.03.011071e+24Metabolite_1S2
\n", "
" ], "text/plain": [ " compartment type unit initial_concentration \\\n", "name \n", "S1 c1 reactions mol/l 5.0 \n", "S2 c1 reactions mol/l 0.0 \n", "\n", " initial_particle_number initial_expression expression concentration \\\n", "name \n", "S1 3.011071e+24 5.0 \n", "S2 0.000000e+00 0.0 \n", "\n", " particle_number rate particle_number_rate key sbml_id \n", "name \n", "S1 3.011071e+24 -5.0 -3.011071e+24 Metabolite_0 S1 \n", "S2 0.000000e+00 5.0 3.011071e+24 Metabolite_1 S2 " ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "get_species()" ] }, { "attachments": {}, "cell_type": "markdown", "id": "ed4a40af", "metadata": {}, "source": [ "To see the kinetic paramters of our recation we can use get_reaction_parameters." ] }, { "cell_type": "code", "execution_count": 29, "id": "fd520554", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
valuereactiontypemapped_to
name
(r1).k11.0r1globalk
\n", "
" ], "text/plain": [ " value reaction type mapped_to\n", "name \n", "(r1).k1 1.0 r1 global k" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "get_reaction_parameters()" ] }, { "attachments": {}, "cell_type": "markdown", "id": "3c4f4e61", "metadata": {}, "source": [ "Now lets simulate our model for 10 seconds." ] }, { "cell_type": "code", "execution_count": 26, "id": "5255243c", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAioAAAHHCAYAAACRAnNyAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABch0lEQVR4nO3deXxU1f3/8dfMJJnsK1lYsrDvILviAiKbIq7VWq2iVttaRBFrW2wV/VrFfan6c6lVbJVqtWpdKhQREFER0SCgsoSwhpB932fu749JBmICJMNM7mTyfj4e87137ty59zNTv5k3555zrsUwDAMRERERP2Q1uwARERGRo1FQEREREb+loCIiIiJ+S0FFRERE/JaCioiIiPgtBRURERHxWwoqIiIi4rcUVERERMRvKaiIiIiI31JQERFT7d69G4vFwpIlS0w5/+TJk5k8ebJXj3nXXXdhsVi8ekyRrkpBRcTPbN68mZ/85Cekp6cTGhpKz549mTZtGk8++WSz/TIyMrBYLO5HaGgo/fv357bbbqOoqKjZvk0/nFarlX379rU4Z1lZGWFhYVgsFm688Ub39qYQ8fDDD3v0Wd577z0mTZpEUlIS4eHh9OnTh0svvZRly5Z5dDx/UlVVxV133cXq1avNLkUkoCmoiPiRzz77jLFjx7Jp0yauv/56nnrqKa677jqsVitPPPFEi/1POukk/vGPf/CPf/yDp556iqlTp/L4448zc+bMVo9vt9v55z//2WL7W2+95fXP8vDDD3PeeedhsVhYuHAhjz32GBdffDE7duzgtddec++Xnp5OdXU1V155pddr8KWqqiruvvvuVoPKn/70J6qrqzu+KJEAFGR2ASJy2L333ktMTAwbNmwgNja22Wt5eXkt9u/Zsyc///nP3c+vu+46IiMjefjhh9mxYwf9+/dvtv8555zDP//5T373u98127506VJmzZrFv//9b698joaGBu655x6mTZvG//73vxavH/lZmlqDAklQUBBBQfrzKuINalER8SNZWVkMHTq0RUgBSEpKatMxUlJSAFr9obz88svJzMzkhx9+cG/Lzc3l448/5vLLL/es6FYUFBRQVlbGqaee2urrR36W1vqoXH311URGRrJ3717OPfdcIiMj6dmzJ08//TTgujw2ZcoUIiIiSE9PZ+nSpc2Of7Q+IkuWLMFisbB79+6j1l5XV8edd97JmDFjiImJISIigtNPP51Vq1Y1qzkxMRGAu+++23357a677jrq+ZvCW9++fbHb7WRkZHD77bdTW1vbbL+MjAzOPfdcPv30U8aPH09oaCh9+vTh73//+1FrFglkCioifiQ9PZ2NGzeyZcuWNu1fX19PQUEBBQUF7N+/n/fee49HH32UM844g969e7fY/4wzzqBXr17Nfthff/11IiMjmTVrltc+R1JSEmFhYbz33nst+su0lcPh4OyzzyY1NZUHH3yQjIwMbrzxRpYsWcLMmTMZO3YsDzzwAFFRUVx11VVkZ2d7pfaysjJeeOEFJk+ezAMPPMBdd91Ffn4+M2bMIDMzE4DExESeeeYZAC688EL35beLLrroqMe97rrruPPOOxk9ejSPPfYYkyZNYvHixVx22WUt9t25cyc/+clPmDZtGo888ghxcXFcffXVbN261SufUaRTMUTEb/zvf/8zbDabYbPZjFNOOcX43e9+Zyxfvtyoq6trsW96eroBtHiceuqpRkFBQbN9Fy1aZABGfn6+8dvf/tbo16+f+7Vx48YZ11xzjWEYhgEYc+fOdb+WnZ1tAMZDDz3U7s9y5513GoARERFhnH322ca9995rbNy4scV+Ted46aWX3NvmzJljAMZ9993n3lZcXGyEhYUZFovFeO2119zbf/jhBwMwFi1a1OLz/thLL71kAEZ2drZ726RJk4xJkya5nzc0NBi1tbXN3ldcXGwkJycb1157rXtbfn5+i/Me7fyZmZkGYFx33XXN9vvtb39rAMbHH3/s3tb0v+snn3zi3paXl2fY7Xbj1ltvbXEukUCnFhURPzJt2jQ+//xzzjvvPDZt2sSDDz7IjBkz6NmzJ++++26L/SdMmMCKFStYsWIF77//Pvfeey9bt27lvPPOO2pnzssvv5ydO3eyYcMG99Kbl32a3H333SxdupRRo0axfPly/vjHPzJmzBhGjx7N999/36ZjXHfdde712NhYBg4cSEREBJdeeql7+8CBA4mNjWXXrl1eqdtmsxESEgKA0+mkqKiIhoYGxo4dy9dff+3RMf/73/8CsGDBgmbbb731VgA++OCDZtuHDBnC6aef7n6emJjIwIEDvfYZRToTBRURPzNu3DjeeustiouL+fLLL1m4cCHl5eX85Cc/4bvvvmu2b7du3Zg6dSpTp05l1qxZ3H777bzwwgt89tlnvPDCC60ef9SoUQwaNIilS5fy6quvkpKSwpQpU3zyWX72s5+xdu1aiouL+d///sfll1/ON998w+zZs6mpqTnme0NDQ939QJrExMTQq1evFv0/YmJiKC4u9lrdL7/8MiNGjCA0NJSEhAQSExP54IMPKC0t9eh4e/bswWq10q9fv2bbU1JSiI2NZc+ePc22p6WltThGXFycVz+jSGehoCLip0JCQhg3bhz33XcfzzzzDPX19bzxxhvHfd9ZZ50FwCeffHLUfS6//HJef/11li5dyk9/+lOsVt/+KYiOjmbatGm8+uqrzJkzh6ysLNavX3/M99hstnZtNwzDvX60ydYcDsdxa33llVe4+uqr6du3L3/7299YtmwZK1asYMqUKTidzuO+/1jaOglcWz6jSFehoCLSCYwdOxaAgwcPHnffhoYGACoqKo66z+WXX87BgwfZvn27Ty77HEt7Poun4uLiACgpKWm2/cctF61588036dOnD2+99RZXXnklM2bMYOrUqS1agNoz82x6ejpOp5MdO3Y0237o0CFKSkpIT09v87FEuhoFFRE/smrVqlb/1dzUx2HgwIHHPcZ7770HwMiRI4+6T9++fXn88cdZvHgx48eP97Dao6uqquLzzz9v9bUPP/wQaNtn8VTfvn2B5q1KlZWVvPzyy8d9b1NrxpH/O6xfv77F5wkPDwdahqHWnHPOOQA8/vjjzbY/+uijAF4dcSUSaDQjkYgfmTdvHlVVVVx44YUMGjSIuro6PvvsM15//XUyMjK45pprmu1/4MABXnnlFcA1/8emTZt47rnn6NatG/PmzTvmuW6++eY217Vy5cpW+5RccMEFDBs2rMX2qqoqJk6cyMknn8zMmTNJTU2lpKSEd955h7Vr13LBBRcwatSoNp+/vaZPn05aWhq/+MUvuO2227DZbLz44oskJiayd+/eY7733HPP5a233uLCCy9k1qxZZGdn8+yzzzJkyJBmrVRhYWEMGTKE119/nQEDBhAfH8+wYcNa/T5GjhzJnDlzeP755ykpKWHSpEl8+eWXvPzyy1xwwQWceeaZXv8ORAKFgoqIH3n44Yd54403+O9//8vzzz9PXV0daWlp/OY3v+FPf/pTi4ngMjMz3VPPW61WunXrxkUXXcQ999xDz549vVbXsmXLWr0/T0ZGRqs/zLGxsfz1r3/l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+hevvvoqS5cuZejQoWRmZjJ//nx69Oih7zmA6dLPEbp164bNZuPQoUPNth86dIiUlBSTqgpsN954I++//z6rVq2iV69eZpcTUDZu3EheXh6jR48mKCiIoKAg1qxZw1/+8heCgoJwOBxmlxgwunfvzpAhQ5ptGzx4MHv37jWposB022238Yc//IHLLruM4cOHc+WVV3LLLbewePFis0sLWE2/fWb+LiqoHCEkJIQxY8awcuVK9zan08nKlSs55ZRTTKws8BiGwY033sjbb7/Nxx9/TO/evc0uKeCcddZZbN68mczMTPdj7NixXHHFFWRmZmKz2cwuMWCceuqpLYbXb9++nfT0dJMqCkxVVVVYrc1/tmw2G06n06SKAl/v3r1JSUlp9rtYVlbG+vXrO+x3UZd+fmTBggXMmTOHsWPHMn78eB5//HEqKyu55pprzC4toMydO5elS5fyn//8h6ioKPe1zpiYGMLCwkyuLjBERUW16PMTERFBQkKC+gJ52S233MLEiRO57777uPTSS/nyyy95/vnnef75580uLaDMnj2be++9l7S0NIYOHco333zDo48+yrXXXmt2aZ1aRUUFO3fudD/Pzs4mMzOT+Ph40tLSmD9/Pn/+85/p378/vXv35o477qBHjx5ccMEFHVNgh4wt6mSefPJJIy0tzQgJCTHGjx9vfPHFF2aXFHCAVh8vvfSS2aUFNA1P9p333nvPGDZsmGG3241BgwYZzz//vNklBZyysjLj5ptvNtLS0ozQ0FCjT58+xh//+EejtrbW7NI6tVWrVrX693jOnDmGYbiGKN9xxx1GcnKyYbfbjbPOOsvYtm1bh9VnMQxN6SciIiL+SX1URERExG8pqIiIiIjfUlARERERv6WgIiIiIn5LQUVERET8loKKiIiI+C0FFREREfFbCioiYpqrr76642a3FJFOSVPoi4hPWCyWY76+aNEinnjiCTTnpIgci4KKiPjEwYMH3euvv/46d955Z7Mb90VGRhIZGWlGaSLSiejSj4j4REpKivsRExODxWJpti0yMrLFpZ/Jkyczb9485s+fT1xcHMnJyfz1r3913xg0KiqKfv368eGHHzY715YtWzj77LOJjIwkOTmZK6+8koKCgg7+xCLiCwoqIuJXXn75Zbp168aXX37JvHnzuOGGG7jkkkuYOHEiX3/9NdOnT+fKK6+kqqoKgJKSEqZMmcKoUaP46quvWLZsGYcOHeLSSy81+ZOIiDcoqIiIXxk5ciR/+tOf6N+/PwsXLiQ0NJRu3bpx/fXX079/f+68804KCwv59ttvAXjqqacYNWoU9913H4MGDWLUqFG8+OKLrFq1iu3bt5v8aUTkRKmPioj4lREjRrjXbTYbCQkJDB8+3L0tOTkZgLy8PAA2bdrEqlWrWu3vkpWVxYABA3xcsYj4koKKiPiV4ODgZs8tFkuzbU2jiZxOJwAVFRXMnj2bBx54oMWxunfv7sNKRaQjKKiISKc2evRo/v3vf5ORkUFQkP6kiQQa9VERkU5t7ty5FBUV8bOf/YwNGzaQlZXF8uXLueaaa3A4HGaXJyInSEFFRDq1Hj16sG7dOhwOB9OnT2f48OHMnz+f2NhYrFb9iRPp7CyGpoUUERERP6V/boiIiIjfUlARERERv6WgIiIiIn5LQUVERET8loKKiIiI+C0FFREREfFbCioiIiLitxRURERExG8pqIiIiIjfUlARERERv6WgIiIiIn5LQUVERET81v8HWlQmesMmOdEAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "result = run_time_course(duration=10)\n", "result.plot()\n", "plt.title(\"SBML Simulation\")\n", "plt.ylabel(\"Concentration\")\n", "plt.savefig(str(RESULTS_DIR) + \"/sbml_plot.png\")" ] } ], "metadata": { "jupytext": { "cell_metadata_filter": "-all", "main_language": "python", "notebook_metadata_filter": "-all" }, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.12" } }, "nbformat": 4, "nbformat_minor": 5 }