{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Application of MPBNs to the Tumour invasion model by Cohen et al. 2015\n", "\n", "We use Most Permissive Boolean Networks to analyse the Boolean model published in\n", "[(Cohen et al., 2015)](https://doi.org/10.1371/journal.pcbi.1004571)\n", "which shows cell fate decision processes related to tumour development." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import ginsim\n", "from colomoto_jupyter import tabulate" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import mpbn" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Model setup\n", "### Original model" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "Downloading http://ginsim.org/sites/default/files/SuppMat_Model_Master_Model.zginml" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lrg = ginsim.load(\"http://ginsim.org/sites/default/files/SuppMat_Model_Master_Model.zginml\")\n", "ginsim.show(lrg)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Conversion to MPBN" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "32" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bn = ginsim.to_minibn(lrg)\n", "mbn = mpbn.MPBooleanNetwork(bn)\n", "len(mbn) # display number of nodes" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Input and output nodes" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "inputs = [\"DNAdamage\", \"ECMicroenv\"]\n", "outputs = [\"Apoptosis\",\"CellCycleArrest\",\"EMT\",\"Invasion\",\"Migration\",\"Metastasis\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Analysis of reachable attractors" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Complete listing of attractors\n", "Let us first compute the full list of attractors of the MPBN." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 9.13 ms, sys: 1.07 ms, total: 10.2 ms\n", "Wall time: 9.39 ms\n" ] }, { "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", "
ApoptosisCellCycleArrestEMTInvasionMigrationMetastasis
0000000
1011000
2011111
3110000
\n", "
" ], "text/plain": [ " Apoptosis CellCycleArrest EMT Invasion Migration Metastasis\n", "0 0 0 0 0 0 0\n", "1 0 1 1 0 0 0\n", "2 0 1 1 1 1 1\n", "3 1 1 0 0 0 0" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%time a = list(mbn.attractors())\n", "tabulate(a, columns=outputs)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Remark they are all fixed points and thus match exactly with the attractors using asynchronous BNs." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Rechable attractors\n", "\n", "Starting from all nodes but inputs to 0, we are interested in the set of reachable attractors, whatever the value of input nodes." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "initial_condition = dict([(n,0) for n in bn if n not in inputs])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Wild-type\n", "Let us first compute the reachable attractors in the wild type model. They match with the full attract listing." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 20.9 ms, sys: 1.01 ms, total: 21.9 ms\n", "Wall time: 20.6 ms\n" ] }, { "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", "
ApoptosisCellCycleArrestEMTInvasionMigrationMetastasis
0000000
1011000
2011111
3110000
\n", "
" ], "text/plain": [ " Apoptosis CellCycleArrest EMT Invasion Migration Metastasis\n", "0 0 0 0 0 0 0\n", "1 0 1 1 0 0 0\n", "2 0 1 1 1 1 1\n", "3 1 1 0 0 0 0" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%time a = list(mbn.attractors(reachable_from=initial_condition))\n", "tabulate(a, columns=outputs)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Notch GoF mutant\n", "Now, we apply the Notch gain of function, and predict, as MaBoSS with asynchronous BNs, the loss of apoptotic attractor reachability." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 21.1 ms, sys: 37 µs, total: 21.2 ms\n", "Wall time: 19.5 ms\n" ] }, { "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", "
ApoptosisCellCycleArrestEMTInvasionMigrationMetastasis
0011000
1011100
2011111
\n", "
" ], "text/plain": [ " Apoptosis CellCycleArrest EMT Invasion Migration Metastasis\n", "0 0 1 1 0 0 0\n", "1 0 1 1 1 0 0\n", "2 0 1 1 1 1 1" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mbn_mut = mbn.copy()\n", "mbn_mut[\"NICD\"] = 1\n", "%time a = list(mbn_mut.attractors(reachable_from=initial_condition))\n", "tabulate(a, columns=outputs)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Notch GoF/p53 LoF double mutant\n", "Adding p53 loss of function, leads, as MaBoSS, only to the metastatic attractor." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 10.2 ms, sys: 949 µs, total: 11.2 ms\n", "Wall time: 10.2 ms\n" ] }, { "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", "
ApoptosisCellCycleArrestEMTInvasionMigrationMetastasis
0011111
\n", "
" ], "text/plain": [ " Apoptosis CellCycleArrest EMT Invasion Migration Metastasis\n", "0 0 1 1 1 1 1" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mbn_mut[\"p53\"] = 0\n", "%time a = list(mbn_mut.attractors(reachable_from=initial_condition))\n", "tabulate(a, columns=outputs)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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 }