{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# From a qualitative single-cell model to a population model\n", "\n", "We have built a toy model showing the difference between the model outputs when we consider the status of the population or not in a feedback loop from a ligand to a receptor. \n", "The model can be interpreted as a cell differentiation between two cell types T1 and T2. \n", "\n", "The input node I activates a node A, which drives the differntiation into a T1 cell type. In parallel, the node A activates a ligand L, which in turn triggers a receptor R that drives the T2 cell type. To insure mutual exclusivity between the cell types, T2 is only activated in the absence of A and T1 is inhibited by some components of the cascade leading to the T2 cell type.\n", "\n", "Here we show how to go from a qualitative model of a single cell to a probabilistic model of a single cell using bioLQM and MaBoSS, and then to a population-level model using UPMaBoSS. This approach can be used to turn a qualitative model into a population model in a reproducible way. It is particularly useful if we want to apply it to several versions of a qualitative single-cell model." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Model at the single cell level\n", "\n", "The following cells show how to load a qualitative model, convert it to a MaBoSS model and set a few simulation parameters. In this example, we start with a model in the bnet format for the sake of readability, but it would work just as well with a GINsim or SBML qual model." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import biolqm\n", "import maboss\n", "\n", "\n", "# Load the logical model in bioLQM and convert it to a MaBoSS stochastic model\n", "mbs = biolqm.to_maboss( biolqm.load('toy.bnet') )\n", "\n", "# Set the length of the simulation\n", "mbs.update_parameters(max_time=20, sample_count=5000)\n", "\n", "# Activate the input in the initial condition\n", "maboss.set_nodes_istate(mbs, [\"I\"], [0, 1])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now that we have a working MaBoSS model, we can run the simulation and display the results.\n", "\n", "The pie chart shows the distribution of state probabilities at the end of the simulation, we can see that all trajectories lead to the T1 state.\n", "\n", "The second chart show the trajectories of individual node probabilities along the simulation, showing successive waves of activation of components in the pathway." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 2.66 ms, sys: 4.92 ms, total: 7.59 ms\n", "Wall time: 108 ms\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "%time r = mbs.run()\n", "\n", "# Plot the piechart and trajectories\n", "r.plot_piechart()\n", "r.plot_node_trajectory(until=15)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Add rules for the population\n", "\n", "\n", "In the model above, the ligand activates the receptor in the same cell (autocrine effect), however it could also activate the receptor of neighbour cells (paracrine effect). To account for this effect, we will slightly modify the single-cell model to add a parameter representing the amount of ligand produced by the whole cell population. This parameter is then used to trigger the activation of the receptor.\n", "\n", "\n", "We then show that accounting for this population effect enables the activation of T2." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# Work on a copy of the single-cell model, to keep the original one\n", "outer_mbs = mbs.copy()\n", "\n", " # Update simulation parameters\n", "outer_mbs.update_parameters(max_time=1, time_tick=0.1)\n", "\n", "# Add a new parameter for the external ligand, absent in the initial condition\n", "outer_mbs.param[\"$outerL\"] = 0\n", "\n", "# Use this new parameter for the activation of the receptor.\n", "# For simplicity we disable it's inactivation in this example.\n", "outer_mbs.network.get(\"R\").rt_up = \"$outerL\"\n", "outer_mbs.network.get(\"R\").rt_down = 0" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# Create a population model using the maboss API\n", "umbs = maboss.UpdatePopulation(outer_mbs)\n", "\n", "# Set the number of simulation steps\n", "umbs.setStepNumber(20)\n", "\n", "# Set the rule to compute the value of the parameter representing the external ligand.\n", "# In this example, the external ligand depends on the proportion of cells expressing the ligand.\n", "umbs.setExternalVariable(\"$outerL\", \"5*p[(L) = (1)]\")" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "# Alternatively, we can create the population model by loading a handwritten upp file\n", "# This file provides the number of steps and the rule for the external variable\n", "# This file is parsed and turned into the same API calls as above.\n", "umbs = maboss.UpdatePopulation(outer_mbs, uppfile=\"ToyModelUP.upp\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now that we have a population model, we can run the simulation and display the results.\n", "\n", "The pie chart shows the distribution of state probabilities at the end of the simulation, we can see that most trajectories lead to the T1 state, but a subset of cells can now reach the T2 state.\n", "\n", "The second chart show the trajectories of individual node probabilities along the simulation (based on snapshots at each step of the UPMaBoSS simulation). Here we see that the receptor can now be activated in cells which do not express A, which enables the differentiation in the T2 state." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 67.8 ms, sys: 78.9 ms, total: 147 ms\n", "Wall time: 716 ms\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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+NyMz7Fs0rKhhi5ERqiuriY7O5uJEydKs2OMtNbU19dTXV3NpEHcbziWNvS05t1ZjznXhnXcALd7OvI+REKDaj/XWlPzH/+BOSuLkm8adx852HyQB958gDnFc7h3/r2nEroQGcHn81FYWCjJfBCUUhQWFg76W01GJ/RIIIx/byOOWTG8mTp+EB1ED5fmF17E+867lHzrXiz5+XiCHu7ZeA92s50fnf8jrObYvyoJkckkmQ/eUM5ZRje5+Pc2ooORgZtbwLihRcEUyIqhLMZdiGofeghneTm5n/kMWmu+t+V77G/az6pLVqXlrbWEEOkto2vo3p31KKcF+6QB7vmotVFDH8T4LR13IRr93ZUok4nfffI7XjrwEl8v/zrnjj33FCMXQsST2WymvLycM844gxtuuAGPxzPofRw6dAin00l5eTmzZs1ixYoVBIPBkz5n48aNvPXWW53Lq1at4tlnnx30sWOVsQldhzW+PQ04ZxSgzAO8zMaD4DkO42O75VznXYi+8AUc06ez8/hOHtz2IIvHLea2ObfFIXohRDw5nU62b9/Ojh07sNlsrFq1auAn9WHKlCls376djz76iOrqan7729+etHzPhH777bezYsWKIR07Fhmb0P2Hmol4QrE3t0BMNfSedyFq8jVxz8Z7KHIW8f3F38ekMvaUCpERlixZwr59+2hoaOCaa65hzpw5LFq0iA8//BCAlStXcsstt/CpT32KqVOn8otf/KLXPsxmMwsWLODw4cMArFu3joULFzJ37lwuvvhijh07xqFDh1i1ahWPPPII5eXlbN68mZUrV/Lwww8DsH37dhYtWsScOXO49tpraWxsPOXXlrFt6L6d9WAxYZ8Ww42Sq7aCLRuKBx6toHHN8513IVJZTr792r3Ueet49rJnZdREIQbw3XU72XWkZeCCgzBrbA7fuer0mMqGQiFefvllli1bxne+8x3mzp3LCy+8wIYNG1ixYgXbt28H4MMPP2TLli20t7czd+5crrjiim778fl8bN26lcceewyAxYsXs2XLFpRS/PKXv+Shhx7iRz/6Ebfffjtut5t77zV6vL322mud+1ixYgX/8z//w/nnn88DDzzAd7/7XR599NFTOhcZmdA7xj53TM3r/zZzXVVvg9KzYIDbvHXehWjxYrI//WlWf7iaNw6/wb8t/DfOKBrc1aVCiOTxer2U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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "%time ur = umbs.run()\n", "\n", "# Plot the probability distribution at the end of the last step\n", "ur.results[-1].plot_piechart()\n", "\n", "# Extract and plot the stepwise trajectories of individual components (nodes)\n", "traj = ur.get_nodes_stepwise_probability_distribution()\n", "p = traj.plot()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Going further: inside the generated MaBoSS files\n", "\n", "To better understand the definition of MaBoSS models, we can have a look at the original bnet file and the generated network (bnd) and configuration (cfg) files generated in this example. The original bnd file and the one used for the population differ only in the definition of rate_up and rate_down of the receptor. The cfg file used for the population includes an additional parameter for the external ligand ($outer_L).\n", "\n", "\n", "In a separate notebook, we show a variant of this example using handcrafted MaBoSS files, which allows greater flexibility. In particular we show how both variants of the model can be manually encoded in a single model, using an additional parameter to switch between both versions." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "--------------------------- BNET file ---------------------------\n", "\n", "I, I\n", "A, I\n", "L, A\n", "R, L\n", "T1, A & !T2\n", "T2, T2 | (R & !A)\n", "\n", "--------------------------- BND file ---------------------------\n", "\n", "Node I {\n", "\n", "\tlogic = (I);\n", "\trate_up = @logic ? $u_I : 0;\n", "\trate_down = @logic ? 0 : $d_I;\n", "}\n", "Node A {\n", "\n", "\tlogic = (I);\n", "\trate_up = @logic ? $u_A : 0;\n", "\trate_down = @logic ? 0 : $d_A;\n", "}\n", "\n", "Node L {\n", "\n", "\tlogic = (A);\n", "\trate_up = @logic ? $u_L : 0;\n", "\trate_down = @logic ? 0 : $d_L;\n", "}\n", "\n", "Node R {\n", "\n", "\tlogic = (L);\n", "\trate_up = @logic ? $u_R : 0;\n", "\trate_down = @logic ? 0 : $d_R;\n", "}\n", "\n", "Node T1 {\n", "\n", "\tlogic = (A & !T2);\n", "\trate_up = @logic ? $u_T1 : 0;\n", "\trate_down = @logic ? 0 : $d_T1;\n", "}\n", "\n", "Node T2 {\n", "\n", "\tlogic = (!A & !R & T2) | (!A & R) | (A & T2);\n", "\trate_up = @logic ? $u_T2 : 0;\n", "\trate_down = @logic ? 0 : $d_T2;\n", "}\n", "\n", "--------------------------- CFG file---------------------------\n", "\n", "$nb_mutable = 0;\n", "$u_I = 1;\n", "$d_I = 1;\n", "$u_A = 1;\n", "$d_A = 1;\n", "$u_L = 1;\n", "$d_L = 1;\n", "$u_R = 1;\n", "$d_R = 1;\n", "$u_T1 = 1;\n", "$d_T1 = 1;\n", "$u_T2 = 1;\n", "$d_T2 = 1;\n", "I.istate = TRUE;\n", "A.istate = FALSE;\n", "L.istate = FALSE;\n", "R.istate = FALSE;\n", "T1.istate = FALSE;\n", "T2.istate = FALSE;\n", "\n", "time_tick = 0.5;\n", "max_time = 20;\n", "sample_count = 5000;\n", "discrete_time = 0.0;\n", "use_physrandgen = 1.0;\n", "seed_pseudorandom = 0.0;\n", "display_traj = 0.0;\n", "statdist_traj_count = 0.0;\n", "statdist_cluster_threshold = 1.0;\n", "thread_count = 1.0;\n", "statdist_similarity_cache_max_size = 20000.0;\n", "I.is_internal = False;\n", "A.is_internal = False;\n", "L.is_internal = False;\n", "R.is_internal = False;\n", "T1.is_internal = False;\n", "T2.is_internal = False;\n", "\n" ] } ], "source": [ "# Display the original BNET file, and the generated MaBoSS network and configuration files\n", "print(\"--------------------------- BNET file ---------------------------\\n\")\n", "!cat toy.bnet\n", "print(\"\\n--------------------------- BND file ---------------------------\\n\")\n", "mbs.print_bnd()\n", "print(\"\\n--------------------------- CFG file---------------------------\\n\")\n", "mbs.print_cfg()" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "--------------------------- UPP file ---------------------------\n", "\n", "$outerL u= 5*p[(L) = (1)];\n", "steps = 20;\n", "\n", "\n", "--------------------------- BND file ---------------------------\n", "\n", "Node I {\n", "\n", "\tlogic = (I);\n", "\trate_up = @logic ? $u_I : 0;\n", "\trate_down = @logic ? 0 : $d_I;\n", "}\n", "Node A {\n", "\n", "\tlogic = (I);\n", "\trate_up = @logic ? $u_A : 0;\n", "\trate_down = @logic ? 0 : $d_A;\n", "}\n", "\n", "Node L {\n", "\n", "\tlogic = (A);\n", "\trate_up = @logic ? $u_L : 0;\n", "\trate_down = @logic ? 0 : $d_L;\n", "}\n", "\n", "Node R {\n", "\n", "\tlogic = (L);\n", "\trate_up = $outerL;\n", "\trate_down = 0;\n", "}\n", "\n", "Node T1 {\n", "\n", "\tlogic = (A & !T2);\n", "\trate_up = @logic ? $u_T1 : 0;\n", "\trate_down = @logic ? 0 : $d_T1;\n", "}\n", "\n", "Node T2 {\n", "\n", "\tlogic = (!A & !R & T2) | (!A & R) | (A & T2);\n", "\trate_up = @logic ? $u_T2 : 0;\n", "\trate_down = @logic ? 0 : $d_T2;\n", "}\n", "\n", "--------------------------- CFG file ---------------------------\n", "\n", "$nb_mutable = 0;\n", "$u_I = 1;\n", "$d_I = 1;\n", "$u_A = 1;\n", "$d_A = 1;\n", "$u_L = 1;\n", "$d_L = 1;\n", "$u_R = 1;\n", "$d_R = 1;\n", "$u_T1 = 1;\n", "$d_T1 = 1;\n", "$u_T2 = 1;\n", "$d_T2 = 1;\n", "$outerL = 0;\n", "I.istate = TRUE;\n", "A.istate = FALSE;\n", "L.istate = FALSE;\n", "R.istate = FALSE;\n", "T1.istate = FALSE;\n", "T2.istate = FALSE;\n", "\n", "time_tick = 0.1;\n", "max_time = 1;\n", "sample_count = 5000;\n", "discrete_time = 0.0;\n", "use_physrandgen = 1.0;\n", "seed_pseudorandom = 0.0;\n", "display_traj = 0.0;\n", "statdist_traj_count = 0.0;\n", "statdist_cluster_threshold = 1.0;\n", "thread_count = 1.0;\n", "statdist_similarity_cache_max_size = 20000.0;\n", "I.is_internal = False;\n", "A.is_internal = False;\n", "L.is_internal = False;\n", "R.is_internal = False;\n", "T1.is_internal = False;\n", "T2.is_internal = False;\n", "\n" ] } ], "source": [ "# Show the modified MaBoSS files\n", "print(\"\\n--------------------------- UPP file ---------------------------\\n\")\n", "with open(\"ToyModelUP.upp\") as f:\n", " print( f.read() )\n", "print(\"\\n--------------------------- BND file ---------------------------\\n\")\n", "outer_mbs.print_bnd()\n", "print(\"\\n--------------------------- CFG file ---------------------------\\n\")\n", "outer_mbs.print_cfg()" ] } ], "metadata": { "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.7.7" } }, "nbformat": 4, "nbformat_minor": 2 }