{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Cancer Metastasis" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

BooLEVARD Tutorials

\n", "
\n", " [Tutorial 3] Activatory perturbations of p63, p53, and miR34 dampen cancer invasiveness.\n", "
\n", "

\n", "\n", "In this tutorial, we will use a Boolean model representing key molecular cascades in **cancer metastasis**. The tutorial showcases how activatory perturbations of two tumor suppressor (p53 and p63) and micro RNA 34 successfully dampen invasiveness and increases apoptotic cell-fate decisions. This model is available in [Cell Collective](https://research.cellcollective.org/dashboard#module/5884:1) (SBML) and [GinSIM's model repository](http://ginsim.org/node/191) (ZGINML). This model was used as a showcase in the BooLEVARD's paper, for which a BoolNet version was generated, and therefore, we will use that version. To know how to convert Boolean models in SBML format to BoolNet format, please refer to [Tutorial 2](https://github.com/farinasm/boolevard/blob/main/tutorials/Guard_Cell_Abscisic_Acid.ipynb).\n", "\n", "

\n", "\n", "

Cohen DPA, Martignetti L, Robine S, Barillot E, Zinovyev A, et al. (2015). Mathematical Modelling of Molecular Pathways Enabling Tumour Cell Invasion and Migration. PLOS Computational Biology 11(11): e1004571. https://doi.org/10.1371/journal.pcbi.1004571

" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/marco/.local/lib/python3.11/site-packages/pandas/core/arrays/masked.py:60: UserWarning: Pandas requires version '1.3.6' or newer of 'bottleneck' (version '1.3.5' currently installed).\n", " from pandas.core import (\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "/home/marco/.local/lib/python3.11/site-packages/matplotlib/projections/__init__.py:63: UserWarning: Unable to import Axes3D. This may be due to multiple versions of Matplotlib being installed (e.g. as a system package and as a pip package). As a result, the 3D projection is not available.\n", " warnings.warn(\"Unable to import Axes3D. This may be due to multiple versions of \"\n" ] } ], "source": [ "import boolevard as blv\n", "import pandas as pd\n", "import numpy as np\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We will load the model and set up the ***Apoptosis*** and ***Invasion*** phenotype nodes as read outs. In addition, we will define a set of perturbations to perform (**inhibition** of ***AKT1*** and ***AKT2***, and **activation** of ***p53***), in order to study their inpact in the apoptotic and invasive fates. Let's first load the model and retrieve some basic information:" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of nodes: 33\n", "Number of inputs: 2, (ECMicroenv, DNAdamage)\n", "Number of stable states: 9\n" ] } ], "source": [ "model = blv.Load(\"resources/Cohen_2015.bnet\") # Load the model (BoolNet format)\n", "model.Info.columns = list(range(len(model.Info.columns)-2)) + [\"DNF\", \"NDNF\"] # Let's reset the stable states so that they start from 0\n", "phenotypes = [\"Apoptosis\", \"Invasion\"] # Set node(s) to check\n", "perturbations = [\"p63%ACT\", \"p53%ACT\", \"miR34%ACT\"] # Set list of perturbations to apply\n", "print(f\"Number of nodes: {len(model.Nodes)}\")\n", "print(f\"Number of inputs: {len(model.Info.index[model.Info.index == model.Info['DNF'].apply(str)])}, ({', '.join(list((model.Info.index[model.Info.index == model.Info['DNF'].apply(str)])))})\")\n", "print(f\"Number of stable states: {len(model.Info.columns)-2}\")" ] }, { "cell_type": "code", "execution_count": 38, "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", " \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", " \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", " \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", " \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", " \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", " \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", "
012345678DNFNDNF
TGFbeta_e000001111ECMicroenv~ECMicroenv
TGFbeta_i000000011And(~CTNNB1, NICD)Or(CTNNB1, ~NICD)
TGFbeta000001111Or(TGFbeta_e, TGFbeta_i)And(~TGFbeta_e, ~TGFbeta_i)
ECMicroenv000001111ECMicroenv~ECMicroenv
GF000110011Or(And(~CDH1, CDH2), And(~CDH1, GF))Or(CDH1, And(~CDH2, ~GF))
CDH1111001100And(~AKT2, ~SNAI1, ~SNAI2, ~TWIST1, ~ZEB1, ~ZEB2)Or(AKT2, SNAI1, SNAI2, TWIST1, ZEB1, ZEB2)
ERK000110011Or(And(~AKT1, CDH2), And(~AKT1, GF), And(~AKT1...Or(AKT1, And(~CDH2, ~GF, ~NICD, ~SMAD))
EMT000110011And(~CDH1, CDH2)Or(CDH1, ~CDH2)
CDH2000110011TWIST1~TWIST1
VIM000110011Or(CTNNB1, ZEB2)And(~CTNNB1, ~ZEB2)
SNAI1000110011Or(And(~CTNNB1, NICD, ~miR203, ~miR34, ~p53), ...Or(CTNNB1, miR203, miR34, p53, And(~NICD, ~TWI...
ZEB2000110011Or(And(NICD, ~miR200, ~miR203), And(SNAI1, ~mi...Or(miR200, miR203, And(~NICD, ~SNAI1, ~SNAI2),...
SNAI2000110011Or(And(CTNNB1, ~miR200, ~miR203, ~p53), And(NI...Or(miR200, miR203, p53, And(~CTNNB1, ~NICD, ~T...
ZEB1000110011Or(And(CTNNB1, ~miR200), And(NICD, ~miR200), A...Or(miR200, And(~CTNNB1, ~NICD, ~SNAI1, ~SNAI2)...
TWIST1000110011Or(CTNNB1, NICD, SNAI1)And(~CTNNB1, ~NICD, ~SNAI1)
NICD000000011And(ECMicroenv, ~miR200, ~miR34, ~p53, ~p63, ~...Or(~ECMicroenv, miR200, miR34, p53, p63, p73)
DKK1000000011Or(CTNNB1, NICD)And(~CTNNB1, ~NICD)
SMAD000000011And(TGFbeta, ~miR200, ~miR203)Or(~TGFbeta, miR200, miR203)
CTNNB1000000000And(~AKT1, ~CDH1, ~CDH2, ~DKK1, ~miR200, ~miR3...Or(AKT1, CDH1, CDH2, DKK1, miR200, miR34, p53,...
AKT2000110011Or(And(CDH2, TWIST1, ~miR203, ~miR34, ~p53), A...Or(~TWIST1, miR203, miR34, p53, And(~CDH2, ~GF...
AKT1000000000Or(And(~CDH1, CDH2, CTNNB1, ~miR34, ~p53), And...Or(CDH1, ~CTNNB1, miR34, p53, And(~CDH2, ~GF, ...
miR203001000100And(~SNAI1, ~ZEB1, ~ZEB2, p53)Or(SNAI1, ZEB1, ZEB2, ~p53)
miR200011001100Or(And(~AKT2, ~SNAI1, ~SNAI2, ~ZEB1, ~ZEB2, p5...Or(AKT2, SNAI1, SNAI2, ZEB1, ZEB2, And(~p53, ~...
miR34000000000Or(And(~AKT1, AKT2, ~SNAI1, ~ZEB1, ~ZEB2, p53,...Or(AKT1, ~AKT2, SNAI1, ZEB1, ZEB2, p63, And(~p...
Migration000000011And(~AKT1, AKT2, EMT, ERK, Invasion, VIM, ~miR...Or(AKT1, ~AKT2, ~EMT, ~ERK, ~Invasion, ~VIM, m...
Invasion000000011Or(CTNNB1, And(CDH2, SMAD))Or(And(~CDH2, ~CTNNB1), And(~CTNNB1, ~SMAD))
CellCycleArrest011111111Or(And(~AKT1, ZEB2), And(~AKT1, miR200), And(~...Or(AKT1, And(~ZEB2, ~miR200, ~miR203, ~miR34, ...
p21011001100Or(And(~AKT1, AKT2, ~ERK), And(~AKT1, ~ERK, NI...Or(AKT1, ERK, And(~AKT2, ~NICD, ~p53, ~p63, ~p...
p73010001000And(~AKT1, ~AKT2, DNAdamage, ~ZEB1, ~p53)Or(AKT1, AKT2, ~DNAdamage, ZEB1, p53)
p53001000100Or(And(~AKT1, ~AKT2, CTNNB1, ~SNAI2, ~p73), An...Or(AKT1, AKT2, SNAI2, p73, And(~CTNNB1, ~DNAda...
Apoptosis011001100Or(And(~AKT1, ~ERK, ~ZEB2, miR200), And(~AKT1,...Or(AKT1, ERK, ZEB2, And(~miR200, ~miR34, ~p53,...
p63010001000And(~AKT1, ~AKT2, DNAdamage, ~NICD, ~miR203, ~...Or(AKT1, AKT2, ~DNAdamage, NICD, miR203, p53)
DNAdamage011011101DNAdamage~DNAdamage
\n", "
" ], "text/plain": [ " 0 1 2 3 4 5 6 7 8 \\\n", "TGFbeta_e 0 0 0 0 0 1 1 1 1 \n", "TGFbeta_i 0 0 0 0 0 0 0 1 1 \n", "TGFbeta 0 0 0 0 0 1 1 1 1 \n", "ECMicroenv 0 0 0 0 0 1 1 1 1 \n", "GF 0 0 0 1 1 0 0 1 1 \n", "CDH1 1 1 1 0 0 1 1 0 0 \n", "ERK 0 0 0 1 1 0 0 1 1 \n", "EMT 0 0 0 1 1 0 0 1 1 \n", "CDH2 0 0 0 1 1 0 0 1 1 \n", "VIM 0 0 0 1 1 0 0 1 1 \n", "SNAI1 0 0 0 1 1 0 0 1 1 \n", "ZEB2 0 0 0 1 1 0 0 1 1 \n", "SNAI2 0 0 0 1 1 0 0 1 1 \n", "ZEB1 0 0 0 1 1 0 0 1 1 \n", "TWIST1 0 0 0 1 1 0 0 1 1 \n", "NICD 0 0 0 0 0 0 0 1 1 \n", "DKK1 0 0 0 0 0 0 0 1 1 \n", "SMAD 0 0 0 0 0 0 0 1 1 \n", "CTNNB1 0 0 0 0 0 0 0 0 0 \n", "AKT2 0 0 0 1 1 0 0 1 1 \n", "AKT1 0 0 0 0 0 0 0 0 0 \n", "miR203 0 0 1 0 0 0 1 0 0 \n", "miR200 0 1 1 0 0 1 1 0 0 \n", "miR34 0 0 0 0 0 0 0 0 0 \n", "Migration 0 0 0 0 0 0 0 1 1 \n", "Invasion 0 0 0 0 0 0 0 1 1 \n", "CellCycleArrest 0 1 1 1 1 1 1 1 1 \n", "p21 0 1 1 0 0 1 1 0 0 \n", "p73 0 1 0 0 0 1 0 0 0 \n", "p53 0 0 1 0 0 0 1 0 0 \n", "Apoptosis 0 1 1 0 0 1 1 0 0 \n", "p63 0 1 0 0 0 1 0 0 0 \n", "DNAdamage 0 1 1 0 1 1 1 0 1 \n", "\n", " DNF \\\n", "TGFbeta_e ECMicroenv \n", "TGFbeta_i And(~CTNNB1, NICD) \n", "TGFbeta Or(TGFbeta_e, TGFbeta_i) \n", "ECMicroenv ECMicroenv \n", "GF Or(And(~CDH1, CDH2), And(~CDH1, GF)) \n", "CDH1 And(~AKT2, ~SNAI1, ~SNAI2, ~TWIST1, ~ZEB1, ~ZEB2) \n", "ERK Or(And(~AKT1, CDH2), And(~AKT1, GF), And(~AKT1... \n", "EMT And(~CDH1, CDH2) \n", "CDH2 TWIST1 \n", "VIM Or(CTNNB1, ZEB2) \n", "SNAI1 Or(And(~CTNNB1, NICD, ~miR203, ~miR34, ~p53), ... \n", "ZEB2 Or(And(NICD, ~miR200, ~miR203), And(SNAI1, ~mi... \n", "SNAI2 Or(And(CTNNB1, ~miR200, ~miR203, ~p53), And(NI... \n", "ZEB1 Or(And(CTNNB1, ~miR200), And(NICD, ~miR200), A... \n", "TWIST1 Or(CTNNB1, NICD, SNAI1) \n", "NICD And(ECMicroenv, ~miR200, ~miR34, ~p53, ~p63, ~... \n", "DKK1 Or(CTNNB1, NICD) \n", "SMAD And(TGFbeta, ~miR200, ~miR203) \n", "CTNNB1 And(~AKT1, ~CDH1, ~CDH2, ~DKK1, ~miR200, ~miR3... \n", "AKT2 Or(And(CDH2, TWIST1, ~miR203, ~miR34, ~p53), A... \n", "AKT1 Or(And(~CDH1, CDH2, CTNNB1, ~miR34, ~p53), And... \n", "miR203 And(~SNAI1, ~ZEB1, ~ZEB2, p53) \n", "miR200 Or(And(~AKT2, ~SNAI1, ~SNAI2, ~ZEB1, ~ZEB2, p5... \n", "miR34 Or(And(~AKT1, AKT2, ~SNAI1, ~ZEB1, ~ZEB2, p53,... \n", "Migration And(~AKT1, AKT2, EMT, ERK, Invasion, VIM, ~miR... \n", "Invasion Or(CTNNB1, And(CDH2, SMAD)) \n", "CellCycleArrest Or(And(~AKT1, ZEB2), And(~AKT1, miR200), And(~... \n", "p21 Or(And(~AKT1, AKT2, ~ERK), And(~AKT1, ~ERK, NI... \n", "p73 And(~AKT1, ~AKT2, DNAdamage, ~ZEB1, ~p53) \n", "p53 Or(And(~AKT1, ~AKT2, CTNNB1, ~SNAI2, ~p73), An... \n", "Apoptosis Or(And(~AKT1, ~ERK, ~ZEB2, miR200), And(~AKT1,... \n", "p63 And(~AKT1, ~AKT2, DNAdamage, ~NICD, ~miR203, ~... \n", "DNAdamage DNAdamage \n", "\n", " NDNF \n", "TGFbeta_e ~ECMicroenv \n", "TGFbeta_i Or(CTNNB1, ~NICD) \n", "TGFbeta And(~TGFbeta_e, ~TGFbeta_i) \n", "ECMicroenv ~ECMicroenv \n", "GF Or(CDH1, And(~CDH2, ~GF)) \n", "CDH1 Or(AKT2, SNAI1, SNAI2, TWIST1, ZEB1, ZEB2) \n", "ERK Or(AKT1, And(~CDH2, ~GF, ~NICD, ~SMAD)) \n", "EMT Or(CDH1, ~CDH2) \n", "CDH2 ~TWIST1 \n", "VIM And(~CTNNB1, ~ZEB2) \n", "SNAI1 Or(CTNNB1, miR203, miR34, p53, And(~NICD, ~TWI... \n", "ZEB2 Or(miR200, miR203, And(~NICD, ~SNAI1, ~SNAI2),... \n", "SNAI2 Or(miR200, miR203, p53, And(~CTNNB1, ~NICD, ~T... \n", "ZEB1 Or(miR200, And(~CTNNB1, ~NICD, ~SNAI1, ~SNAI2)... \n", "TWIST1 And(~CTNNB1, ~NICD, ~SNAI1) \n", "NICD Or(~ECMicroenv, miR200, miR34, p53, p63, p73) \n", "DKK1 And(~CTNNB1, ~NICD) \n", "SMAD Or(~TGFbeta, miR200, miR203) \n", "CTNNB1 Or(AKT1, CDH1, CDH2, DKK1, miR200, miR34, p53,... \n", "AKT2 Or(~TWIST1, miR203, miR34, p53, And(~CDH2, ~GF... \n", "AKT1 Or(CDH1, ~CTNNB1, miR34, p53, And(~CDH2, ~GF, ... \n", "miR203 Or(SNAI1, ZEB1, ZEB2, ~p53) \n", "miR200 Or(AKT2, SNAI1, SNAI2, ZEB1, ZEB2, And(~p53, ~... \n", "miR34 Or(AKT1, ~AKT2, SNAI1, ZEB1, ZEB2, p63, And(~p... \n", "Migration Or(AKT1, ~AKT2, ~EMT, ~ERK, ~Invasion, ~VIM, m... \n", "Invasion Or(And(~CDH2, ~CTNNB1), And(~CTNNB1, ~SMAD)) \n", "CellCycleArrest Or(AKT1, And(~ZEB2, ~miR200, ~miR203, ~miR34, ... \n", "p21 Or(AKT1, ERK, And(~AKT2, ~NICD, ~p53, ~p63, ~p... \n", "p73 Or(AKT1, AKT2, ~DNAdamage, ZEB1, p53) \n", "p53 Or(AKT1, AKT2, SNAI2, p73, And(~CTNNB1, ~DNAda... \n", "Apoptosis Or(AKT1, ERK, ZEB2, And(~miR200, ~miR34, ~p53,... \n", "p63 Or(AKT1, AKT2, ~DNAdamage, NICD, miR203, p53) \n", "DNAdamage ~DNAdamage " ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model.Info" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The model reaches a total of 9 stable states upon any combination of the local states *ECMicroenv* and *DNAdamage* input nodes. We can observe that *Apoptosis* is active in 4 states (1, 2, 5, 6), whereas *Invasion* is active in two (7, 8).\n", "- Apoptosis: reached upon *DNAdamage*, *DNAdamage* and *ECMicroenv*.\n", "- Invasion: reached upon *ECMicroenv*, *DNAdamage* and *ECMicroenv*.\n", "\n", "Let's now count the paths toward these phenotype nodes across every stable state:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Evaluating Stable State: 0\n", "Apoptosis: -355, 1.0629494984944662e-05 minutes.\n", "Invasion: -96, 2.3802121480305988e-06 minutes.\n", "Evaluating Stable State: 1\n", "Apoptosis: 650803, 0.03362019062042236 minutes.\n", "Invasion: -79488, 0.004182140032450358 minutes.\n", "Evaluating Stable State: 2\n", "Apoptosis: 547393, 0.031016747156778973 minutes.\n", "Invasion: -137450, 0.007069091002146403 minutes.\n", "Evaluating Stable State: 3\n", "Apoptosis: -92533, 0.005101394653320312 minutes.\n", "Invasion: -2867, 0.0001383662223815918 minutes.\n", "Evaluating Stable State: 4\n", "Apoptosis: -2371, 0.0008930842081705729 minutes.\n", "Invasion: -213, 4.831155141194661e-05 minutes.\n", "Evaluating Stable State: 5\n", "Apoptosis: 69198, 0.007056013743082682 minutes.\n", "Invasion: -7297, 0.0008472879727681478 minutes.\n", "Evaluating Stable State: 6\n", "Apoptosis: 47620, 0.008798758188883463 minutes.\n", "Invasion: -10026, 0.001911294460296631 minutes.\n", "Evaluating Stable State: 7\n", "Apoptosis: -4106274, 0.27379823525746666 minutes.\n", "Invasion: 554895, 0.04231379429499308 minutes.\n", "Evaluating Stable State: 8\n", "Apoptosis: -1376996, 0.17505908807118734 minutes.\n", "Invasion: 179328, 0.025075976053873697 minutes.\n" ] } ], "source": [ "paths = model.CountPaths(phenotypes, ss_wise = True) # Count the number of paths leading to the Apoptosis and Invasion nodes" ] }, { "cell_type": "code", "execution_count": 39, "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", "
ApoptosisInvasion
0-355-96
1650803-79488
2547393-137450
3-92533-2867
4-2371-213
569198-7297
647620-10026
7-4106274554895
8-1376996179328
\n", "
" ], "text/plain": [ " Apoptosis Invasion\n", "0 -355 -96\n", "1 650803 -79488\n", "2 547393 -137450\n", "3 -92533 -2867\n", "4 -2371 -213\n", "5 69198 -7297\n", "6 47620 -10026\n", "7 -4106274 554895\n", "8 -1376996 179328" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "paths_sum = pd.DataFrame(paths)\n", "paths_sum.columns = phenotypes\n", "paths_sum" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We observe that stable states triggering Apoptosis can be divided into two groups based on the number of paths activating this phenotype:\n", "- **Higher Apoptosis (HiA):** stable state **1** (*DNAdamage*: ON, *ECMicroenv*: OFF) and stable state **2** (*DNAdamage*: ON, *ECMicroenv*: OFF)\n", "- **Lower Apoptosis (LoA):** stable state **5** (*DNAdamage*: ON, *ECMicroenv*: ON) and stable state **6** (*DNAdamage*: ON, *ECMicroenv*: ON)\n", "\n", "The HiA states have around 10 times more paths inhibiting apoptosis than the LoA ones.\n", "\n", "Regarding the stable states triggering Invasion, we have one with around 3 times more paths than the other:\n", "- **Higher Invasion (HiI):** stable state **7** (*DNAdamage*: OFF, *ECMicroenv*: ON)\n", "- **Lower Invasion (LoI):** stable state **8** (*DNAdamage*: ON, *ECMicroenv*: ON)\n", "\n", "We observe that ***DNAdamage* negatively impacts the *ECMicroenv*-triggered invassive fate**, and that ***ECMicroenv* negatively impacts the *DNAdamage*-triggered apoptotic fate**.\n", "\n", "Let's now perform the perturbations and count the paths triggering the states of this phenotype nodes:" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Evaluating Stable State: 1\n", "Apoptosis: 650803, 0.03550153175989787 minutes.\n", "Invasion: -79488, 0.004427965482076009 minutes.\n", "Evaluating Stable State: 2\n", "Apoptosis: 547393, 0.031353513399759926 minutes.\n", "Invasion: -137450, 0.007886393864949545 minutes.\n", "Evaluating Stable State: 4\n", "Apoptosis: -2371, 0.0009159564971923829 minutes.\n", "Invasion: -213, 4.942417144775391e-05 minutes.\n", "Evaluating Stable State: 5\n", "Apoptosis: 69198, 0.007487761974334717 minutes.\n", "Invasion: -7297, 0.0009128570556640625 minutes.\n", "Evaluating Stable State: 6\n", "Apoptosis: 47620, 0.009185870488484701 minutes.\n", "Invasion: -10026, 0.002027567227681478 minutes.\n", "Evaluating Stable State: 7\n", "Apoptosis: -4106274, 0.29480555057525637 minutes.\n", "Invasion: 554895, 0.04455423355102539 minutes.\n", "Evaluating Stable State: 8\n", "Apoptosis: -1376996, 0.18616377115249633 minutes.\n", "Invasion: 179328, 0.026827104886372886 minutes.\n", "Evaluating Stable State: 1\n", "Apoptosis: 726108, 0.03727216323216756 minutes.\n", "Invasion: -85524, 0.004598780473073324 minutes.\n", "Evaluating Stable State: 2\n", "Apoptosis: 2597481, 0.09866807063420614 minutes.\n", "Invasion: -418316, 0.015083523591359456 minutes.\n", "Evaluating Stable State: 4\n", "Apoptosis: -8087, 0.0008593916893005372 minutes.\n", "Invasion: -157, 3.064473470052083e-05 minutes.\n", "Evaluating Stable State: 5\n", "Apoptosis: 4519, 0.0001856406529744466 minutes.\n", "Invasion: -696, 3.170569737752278e-05 minutes.\n", "Evaluating Stable State: 6\n", "Apoptosis: 98526, 0.007704083124796549 minutes.\n", "Invasion: -9770, 0.0009197592735290527 minutes.\n", "Evaluating Stable State: 7\n", "Apoptosis: 505441, 0.02979077895482381 minutes.\n", "Invasion: -70079, 0.004510140419006348 minutes.\n", "Evaluating Stable State: 8\n", "Apoptosis: -76913, 0.003245238463083903 minutes.\n", "Invasion: 13556, 0.0005586822827657064 minutes.\n", "Evaluating Stable State: 9\n", "Apoptosis: -16942, 0.0015027244885762532 minutes.\n", "Invasion: 3336, 0.00028112332026163734 minutes.\n", "Evaluating Stable State: 1\n", "Apoptosis: 640545, 0.03310054143269857 minutes.\n", "Invasion: -153171, 0.007697677612304688 minutes.\n", "Evaluating Stable State: 2\n", "Apoptosis: 47620, 0.001430976390838623 minutes.\n", "Invasion: -10026, 0.00030887921651204426 minutes.\n", "Evaluating Stable State: 3\n", "Apoptosis: 95238, 0.009834237893422445 minutes.\n", "Invasion: -20052, 0.00214764674504598 minutes.\n", "Evaluating Stable State: 0\n", "Apoptosis: 1998981, 0.06153324047724406 minutes.\n", "Invasion: -194425, 0.00604479710261027 minutes.\n", "Evaluating Stable State: 2\n", "Apoptosis: 3493902, 0.11173041661580403 minutes.\n", "Invasion: -577853, 0.017530858516693115 minutes.\n", "Evaluating Stable State: 3\n", "Apoptosis: 497384, 0.016261287530263267 minutes.\n", "Invasion: -45067, 0.0014878908793131511 minutes.\n", "Evaluating Stable State: 4\n", "Apoptosis: 544103, 0.019650065898895265 minutes.\n", "Invasion: -82159, 0.0029144962628682453 minutes.\n", "Evaluating Stable State: 5\n", "Apoptosis: 895925, 0.03503890832265218 minutes.\n", "Invasion: -137210, 0.005308918158213298 minutes.\n" ] } ], "source": [ "pert_models = {\n", " \"Unperturbed\": model,\n", " \"p63a\": model.Pert(perturbations[0]),\n", " \"p53a\": model.Pert(perturbations[1]),\n", " \"miR34a\": model.Pert(perturbations[2])\n", "}\n", "\n", "pert_paths = {}\n", "for key in pert_models:\n", " pert_models[key].Info.columns = list(range(len(pert_models[key].Info.columns)-2)) + [\"DNF\", \"NDNF\"]\n", " pert_models[key].Info = pert_models[key].Info.loc[:, ~((pert_models[key].Info.loc[\"ECMicroenv\"] == 0) & (pert_models[key].Info.loc[\"DNAdamage\"] == 0))]\n", " pert_paths[key] = pd.DataFrame(pert_models[key].CountPaths(phenotypes, ss_wise=True))\n", " pert_paths[key].columns = phenotypes\n", " pert_paths[key].index = pert_models[key].Info.columns[:-2]\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now that we have counted the paths toward *Apoptosis* and *Invasion* phenotype nodes for the three perturbations, let's plot the results:" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "image/png": "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F+MvQmT5mD/MHyKlMH+YP0RKYf4wf8wd775HRlWrVi2tW5Da2NggJydHa54DBw5gwIAB6NKlC4AnYXHt2rV8bR0+fDjf45o1axa43gYNGmD9+vUoV64cXFxcil2/v78/HB0d8ejRIwCAra1tvvqPHTuG3NxcLFy4EFZWT8Z5f/75Z615Clqufv36yMnJQUJCAl555ZVCa/D19cXQoUMxdOhQTJkyBcuXL8eoUaOK/ZqISgrmDwpdjvlDZFzMHxS6HPOHyLiYPyh0OeaPOvFIKZLF/fv30aZNG/zwww84ffo0YmJisGHDBixYsACdOnWS5vP390dkZCTi4+ORmJgIAKhWrRo2bdqEkydP4tSpU+jduzdyc3PzrePAgQNYsGAB/vvvPyxZsgQbNmzAmDFjCqynT58+8PDwQKdOnbBv3z7ExMQgOjoao0ePxq1btwpcZubMmZg4cSKio6MRExODEydOYNCgQcjKykK7du2k+mNiYnDy5Encu3cPGRkZqFq1KrKysvD111/j6tWriIiIwDfffKPVtr+/P1JTUxEZGYl79+4hLS0NL7zwAvr06YP+/ftj06ZNiImJwdGjRzFv3jxs27YNAPDBBx9gx44diImJwfHjxxEVFVXoPwKikor5w/whUgrzh/lDpBTmD/PHYih9USuyDOnp6WLy5MmiQYMGwtXVVTg6Oorq1auLadOmibS0NGm+3377TVStWlWUKlVKuiVpTEyMaN26tXBwcBC+vr5i8eLFomXLlmLMmDHScn5+fuLjjz8W3bt3F46OjsLb21t8+eWXWjXgmYv43b59W/Tv3194eHgIOzs7ERAQIIYMGSKSkpIKfA27d+8Wb7/9tvD19RW2trbCy8tLBAcHi3379mm9zrffflu4ublp3ZL0iy++EOXLlxcODg6iffv2Ys2aNQKASExMlJYdOnSoKFu2rNYtSTMzM8WMGTOEv7+/sLGxEeXLlxddunQRp0+fFkIIMXLkSFGlShVhZ2cnPD09Rb9+/cS9e/f03DpElo35w/whUgrzh/lDpBTmD/PHUmiEEML0Q2FERERERERERFSS8fQ9IiIiIiIiIiIyOQ5KERERERERERGRyXFQioiIiIiIiIiITI6DUkREREREREREZHIclCIiIiIiIiIiIpPjoBQREREREREREZkcB6WIiIiIiIiIiMjkOChFREREREREREQmx0EpIiIiIiIiIiIyOQ5KERERERERERGRyXFQioiIiIiIiIiITI6DUkREREREREREZHL/B9PAw3f9XgFSAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Define a function to generate a bar plot with BooLEVARD's results for the stable states\n", "def SSbars(data, sizex = 3, sizey = 2.5, labs = (\"Invasion\", \"Apoptosis\"), ax = None):\n", " def log_signed(x, base = 2):\n", " return np.sign(x) * np.log1p(np.abs(x))/np.log(base)\n", " states = data.index.astype(str).tolist()\n", " inv = log_signed(data[\"Invasion\"].values, base = 2)\n", " apo = log_signed(data[\"Apoptosis\"].values, base = 2)\n", " n = len(states)\n", " x_inv = np.arange(n)\n", " x_apo = x_inv + n + 0.5\n", " def col(v): return \"#FC766A\" if v > 0 else \"#5B84B1\"\n", " cols_inv = [col(v) for v in inv]\n", " cols_apo = [col(v) for v in apo]\n", " if ax is None:\n", " fig, ax = plt.subplots(figsize = (sizex, sizey))\n", " ax.bar(x_inv, inv, color = cols_inv, edgecolor = \"white\")\n", " ax.bar(x_apo, apo, color = cols_apo, edgecolor = \"white\")\n", " ax.axhline(0, color = \"black\", linestyle = \"--\", linewidth = 0.7)\n", " y_max = max(inv.max(), apo.max())\n", " y_min = min(inv.min(), apo.min())\n", " sep = y_max * 1.1\n", " ax.hlines(sep, x_inv[0]-0.5, x_inv[-1]+0.5, color = \"black\", linewidth = 0.7); ax.hlines(sep, x_apo[0]-0.5, x_apo[-1]+0.5, color = \"black\", linewidth = 0.7)\n", " ax.set_xticks(list(x_inv) + list(x_apo))\n", " ax.set_xticklabels(states*2, rotation = 30, ha = \"right\", fontsize = 7)\n", " ax.set_xlim(-0.5, x_apo[-1]+0.5); ax.set_ylim(y_min*1.2, y_max*1.3)\n", " ax.text((x_inv[0]+x_inv[-1])/2, sep*1.02, labs[0], ha=\"center\", fontsize=9)\n", " ax.text((x_apo[0]+x_apo[-1])/2, sep*1.02, labs[1], ha=\"center\", fontsize=9)\n", " title = getattr(data, \"name\", \"\")\n", " ax.set_title(title, fontweight = \"bold\", fontsize = 12)\n", " ax.set_ylabel(\"Path count (signed-logâ‚‚)\", fontsize = 10); ax.set_xlabel(\"Stable States\")\n", " plt.tight_layout()\n", " return ax\n", "\n", "# Plot the results\n", "fig, ax = plt.subplots(1, 4, figsize = (12, 3), sharey = True)\n", "for ax, key in zip(ax, [\"Unperturbed\", \"p63a\", \"p53a\", \"miR34a\"]):\n", " df = pert_paths[key]\n", " df.name = key\n", " SSbars(df, sizex = 3, sizey = 3, labs = (\"Invasion\", \"Apoptosis\"), ax = ax)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", " Figure 1: Barplots showing the signed-log-scaled path count score leading to the local states of Invasion and Apoptosis phenotype nodes. Each plot represents a perturbation, and bars delimited by Invasion and Apoptosis show the path count scores resulting in the inactivation (blue) or activation (red) of the Invasion and Apoptosis phenotype nodes.\n", "
\n", "\n", "
\n", "\n", "**p63 activatory perturbation**\n", "\n", "We can observe that upon activatory perturbation of *p63*, the local states of *Invasion* and *Apoptosis* are identical as in the perturbed configuration, except for an extra stable state. We still observe that there are two invasive stable states, but the paths leading to *Invasion* activation are substantially reduced upon *p63* activatory perturbation:" ] }, { "cell_type": "code", "execution_count": 47, "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", "
Unperturbed1245678
ECMicroenv0001111
DNAdamage1111101
Apoptosis650803547393-23716919847620-4106274-1376996
Invasion-79488-137450-213-7297-10026554895179328
\n", "
" ], "text/plain": [ "Unperturbed 1 2 4 5 6 7 8\n", "ECMicroenv 0 0 0 1 1 1 1\n", "DNAdamage 1 1 1 1 1 0 1\n", "Apoptosis 650803 547393 -2371 69198 47620 -4106274 -1376996\n", "Invasion -79488 -137450 -213 -7297 -10026 554895 179328" ] }, "metadata": {}, "output_type": "display_data" }, { "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", "
p63a12456789
ECMicroenv00011111
DNAdamage11101101
Apoptosis7261082597481-8087451998526505441-76913-16942
Invasion-85524-418316-157-696-9770-70079135563336
\n", "
" ], "text/plain": [ "p63a 1 2 4 5 6 7 8 9\n", "ECMicroenv 0 0 0 1 1 1 1 1\n", "DNAdamage 1 1 1 0 1 1 0 1\n", "Apoptosis 726108 2597481 -8087 4519 98526 505441 -76913 -16942\n", "Invasion -85524 -418316 -157 -696 -9770 -70079 13556 3336" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sum_upt = pd.concat([pert_models[\"Unperturbed\"].Info.loc[[\"ECMicroenv\", \"DNAdamage\"], ~pert_models[\"Unperturbed\"].Info.columns.isin([\"DNF\", \"NDNF\"])],pert_paths[\"Unperturbed\"].T]); sum_upt.columns.name = \"Unperturbed\"\n", "sum_p63a = pd.concat([pert_models[\"p63a\"].Info.loc[[\"ECMicroenv\", \"DNAdamage\"], ~pert_models[\"p63a\"].Info.columns.isin([\"DNF\", \"NDNF\"])],pert_paths[\"p63a\"].T]); sum_p63a.columns.name = \"p63a\"\n", "display(sum_upt); sum_p63a" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- The high apoptosis (HiA) states (**1** and **2**) from the *Unperturbed* model correspond to stable states **1** and **2** in the *p63a* model. These show an overall **increase in apoptotic signaling** under the *p63a* perturbation.\n", "\n", "- The low apoptosis (LoA) states (**5** and **6**) from the *Unperturbed* model match stable states **6** and **7** in the *p63a* model. These states also exhibit an **elevated apoptotic response** following *p63a* perturbation.\n", "\n", "- The high and low invasion (HiI and LoI) states (**7** and **8**, respectively) in the *Unperturbed* model correspond to stable states **8** and **9** in the *p63a* model. In this case, a **marked reduction in invasive potential** is observed under *p63a* conditions.\n", "\n", "
\n", "\n", "**p53 activatory perturbation**\n", "\n", "In this case, activatory perturbation of *p53* blocked the reachability of any invasive states:" ] }, { "cell_type": "code", "execution_count": 49, "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", "
Unperturbed1245678
ECMicroenv0001111
DNAdamage1111101
Apoptosis650803547393-23716919847620-4106274-1376996
Invasion-79488-137450-213-7297-10026554895179328
\n", "
" ], "text/plain": [ "Unperturbed 1 2 4 5 6 7 8\n", "ECMicroenv 0 0 0 1 1 1 1\n", "DNAdamage 1 1 1 1 1 0 1\n", "Apoptosis 650803 547393 -2371 69198 47620 -4106274 -1376996\n", "Invasion -79488 -137450 -213 -7297 -10026 554895 179328" ] }, "metadata": {}, "output_type": "display_data" }, { "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", "
p53a123
ECMicroenv011
DNAdamage101
Apoptosis6405454762095238
Invasion-153171-10026-20052
\n", "
" ], "text/plain": [ "p53a 1 2 3\n", "ECMicroenv 0 1 1\n", "DNAdamage 1 0 1\n", "Apoptosis 640545 47620 95238\n", "Invasion -153171 -10026 -20052" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sum_p53a = pd.concat([pert_models[\"p53a\"].Info.loc[[\"ECMicroenv\", \"DNAdamage\"], ~pert_models[\"p53a\"].Info.columns.isin([\"DNF\", \"NDNF\"])],pert_paths[\"p53a\"].T]); sum_p53a.columns.name = \"p53a\"\n", "display(sum_upt); sum_p53a" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- The high apoptosis (HiA) states (**1** and **2**) in the *Unperturbed* model converge into a single stable state (**1**) in the *p53a* model, preserving a similar apoptotic profile.\n", "\n", "- The low apoptosis (LoA) states (**5** and **6**) and the high invasion (HiI) state **8** from the *Unperturbed* model merge into a unified pro-apoptotic and anti-invasive state (**3**) in the *p53a* model, exhibiting both increased apoptosis and reduced invasion compared to their original forms.\n", "\n", "- The remaining LoI state (**7**) transitions into stable state **2** in the *p53a* model, also showing a shift toward **higher apoptosis and reduced invasive capacity**.\n", "\n", "
\n", "\n", "**miR34 activatory perturbation**\n", "\n", "In this case, we can see a similar trend as in the *p53a*, with overall even higher apoptosis and lower invasion:" ] }, { "cell_type": "code", "execution_count": 50, "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", "
Unperturbed1245678
ECMicroenv0001111
DNAdamage1111101
Apoptosis650803547393-23716919847620-4106274-1376996
Invasion-79488-137450-213-7297-10026554895179328
\n", "
" ], "text/plain": [ "Unperturbed 1 2 4 5 6 7 8\n", "ECMicroenv 0 0 0 1 1 1 1\n", "DNAdamage 1 1 1 1 1 0 1\n", "Apoptosis 650803 547393 -2371 69198 47620 -4106274 -1376996\n", "Invasion -79488 -137450 -213 -7297 -10026 554895 179328" ] }, "metadata": {}, "output_type": "display_data" }, { "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", "
02345
ECMicroenv00111
DNAdamage11101
Apoptosis19989813493902497384544103895925
Invasion-194425-577853-45067-82159-137210
\n", "
" ], "text/plain": [ " 0 2 3 4 5\n", "ECMicroenv 0 0 1 1 1\n", "DNAdamage 1 1 1 0 1\n", "Apoptosis 1998981 3493902 497384 544103 895925\n", "Invasion -194425 -577853 -45067 -82159 -137210" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sum_miR34a = pd.concat([pert_models[\"miR34a\"].Info.loc[[\"ECMicroenv\", \"DNAdamage\"], ~pert_models[\"miR34a\"].Info.columns.isin([\"DNF\", \"NDNF\"])],pert_paths[\"miR34a\"].T]); sum_p53a.columns.name = \"miR34a\"\n", "display(sum_upt); sum_miR34a" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- The high apoptosis (HiA) states (**1** and **2**) in the *Unperturbed* model are equivalent to stable states **0** and **2** in the *p63a* model, with overall more apoptotic and less invasive fates.\n", "\n", "- The low apoptosis (LoA) states (**5** and **6**) and the high invasion (HiA) state **8** from the *Unperturbed* model have also collapsed into two pro-apoptotic and anti-invasive states (**3** and **5**) with overall increased apoptosis and decreased invasiveness.\n", "\n", "- The remaining LoI state (**7**) transitions into stable state **4** in the *miR34a* model, also showing a shift toward **higher apoptosis and reduced invasive capacity**.\n" ] } ], "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.11.2" } }, "nbformat": 4, "nbformat_minor": 2 }