Application of MPBNs to the Bladder Tumorigenesis model by Remy et al. 2015

We use Most Permissive Boolean Networks to analyze reachable attractors in the logical model published in (Remy et al., 2015), by reproducing part of the experiments performed in Estimating Attractor Reachability in Asynchronous Logical Models (Mendes et al, 2018 (Table 3).

Note that, currently, the mpbn tool does not provide quantification of the propensity of reachable attractors. However, it guarantees their exhaustive identification.

In [1]:
import biolqm
import ginsim
import mpbn
from colomoto_jupyter import tabulate

This notebook has been executed using the docker image colomoto/colomoto-docker:2020-03-19

Model

Original multivalued model

In [2]:
lrg = ginsim.load("https://zenodo.org/record/3719018/files/Bladder_Model.zginml?download=1")
ginsim.show(lrg)

We use biolqm to convert it to a pure Boolean model.

In [3]:
bn = biolqm.to_minibn(biolqm.booleanize(lrg.getModel()))
mbn = mpbn.MPBooleanNetwork(bn)
len(mbn) # display number of components
Out[3]:
35
In [4]:
inputs = bn.inputs()
inputs
Out[4]:
['DNAdamage', 'EGFR_stimulus', 'FGFR3_stimulus', 'GrowthInhibitors']
In [5]:
outputs = ["Apoptosis_b1", "Growth_Arrest", "Proliferation"]
non_outputs = [n for n in bn if n not in outputs]

Attractors

We first compute the full list of attractors of the Most Permissive semantics. We recover exactly the same number as reported in the original publication.

In [6]:
%time a = list(mbn.attractors())
tabulate(a)
CPU times: user 6.21 ms, sys: 44 µs, total: 6.26 ms
Wall time: 5.73 ms
Out[6]:
AKT ATM_b1 ATM_b2 Apoptosis_b1 Apoptosis_b2 CDC25A CHEK1_2_b1 CHEK1_2_b2 CyclinA CyclinD1 CyclinE1 DNAdamage E2F1_b1 E2F1_b2 E2F3_b1 E2F3_b2 EGFR EGFR_stimulus FGFR3 FGFR3_stimulus GRB2 GrowthInhibitors Growth_Arrest MDM2 PI3K PTEN Proliferation RAS RB1 RBL2 SPRY TP53 p14ARF p16INK4a p21CIP
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 1 1
2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 1
3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 1 1 1 1 0 0 0 1
4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 0 0 0 0 1 1 1 1 0 0 0 1
5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1 1 0 0 0 0 1 0 1 1 0 0 1 1
6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 1 0 1 1 0 0 0 0 1 0 1 1 0 0 1 1
7 0 0 0 0 0 1 0 0 1 0 1 0 1 0 1 0 0 0 1 1 0 1 0 0 0 0 1 1 0 0 1 0 1 1 0
8 0 0 0 0 0 1 0 0 1 0 1 0 1 0 1 0 0 1 1 1 0 1 0 0 0 0 1 1 0 0 1 0 1 1 0
9 0 0 0 0 0 1 0 0 1 1 1 0 1 0 1 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0
10 0 0 0 0 0 1 0 0 1 1 1 0 1 0 1 0 0 1 1 1 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0
11 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 1 0 0 1
12 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0 1 0 1 1
13 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 1 1 0 1 0 0 1
14 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 1 1 1 1 1 0 0 1
15 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 1 0 1 1 0 0 1 0 1 1 1 1 1 0 0 1
16 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 1 0 0 1 0 1 1 1 1 1 0 0 1
17 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 1 1 1 0 1 1 0 0 1 0 1 1 1 1 1 0 0 1
18 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 * 1 0 0 * 0 1 0 0 1 0 * 1 1 * 1 0 0 1
19 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 * 1 0 0 * 1 1 0 0 1 0 * 1 1 * 1 0 0 1
20 0 1 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1 1 0 1 1 0 0 1 0 1 0 1 1 1 0 1 1
21 0 1 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 1 1 1 0 1 1 0 0 1 0 1 0 1 1 1 0 1 1
22 0 1 0 1 0 0 1 0 0 0 0 1 0 0 * 0 * 1 0 0 * 1 1 0 0 1 0 * 0 1 * 1 0 1 1
23 * 0 0 0 0 0 0 0 0 0 0 0 0 0 * 0 * 1 0 0 * 1 1 * * 0 0 * 0 1 * 0 0 1 *
24 * 0 0 0 0 * 0 0 * * * 0 * 0 * 0 * 1 0 0 * 0 * * * 0 * * * * * 0 * 0 0

To have a better overview of the input/output behaviour, we display the attractors by selecting only input and output components and then only output components.

In [7]:
tabulate(a, columns=inputs+outputs)
Out[7]:
DNAdamage EGFR_stimulus FGFR3_stimulus GrowthInhibitors Apoptosis_b1 Growth_Arrest Proliferation
0 0 0 0 0 0 1 0
1 0 0 0 1 0 1 0
2 0 0 1 0 0 0 1
3 0 0 1 1 0 0 1
4 0 0 1 1 0 1 0
5 0 1 0 0 0 * *
6 0 1 0 1 0 1 0
7 0 1 1 0 0 0 1
8 0 1 1 1 0 0 1
9 0 1 1 1 0 1 0
10 1 0 0 0 1 1 0
11 1 0 0 1 1 1 0
12 1 0 1 0 1 1 0
13 1 0 1 1 1 1 0
14 1 1 0 0 1 1 0
15 1 1 0 1 1 1 0
16 1 1 1 0 1 1 0
17 1 1 1 1 1 1 0
In [8]:
tabulate(a, columns=outputs)
Out[8]:
Apoptosis_b1 Growth_Arrest Proliferation
0 0 0 1
1 0 1 0
2 0 * *
3 1 1 0

Reachable attractors

For different input settings, and starting from all the other nodes being inactive, we compute the reachable attractors in the wild-type model.

In [9]:
all_zero = dict([(n,0) for n in bn])
In [10]:
init = all_zero.copy()
init["GrowthInhibitors"] = 1
%time a = list(mbn.attractors(reachable_from=init))
tabulate(a, columns=outputs+non_outputs)
CPU times: user 4.47 ms, sys: 1.73 ms, total: 6.2 ms
Wall time: 5.75 ms
Out[10]:
Apoptosis_b1 Growth_Arrest Proliferation AKT ATM_b1 ATM_b2 Apoptosis_b2 CDC25A CHEK1_2_b1 CHEK1_2_b2 CyclinA CyclinD1 CyclinE1 DNAdamage E2F1_b1 E2F1_b2 E2F3_b1 E2F3_b2 EGFR EGFR_stimulus FGFR3 FGFR3_stimulus GRB2 GrowthInhibitors MDM2 PI3K PTEN RAS RB1 RBL2 SPRY TP53 p14ARF p16INK4a p21CIP
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 1
1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1
In [11]:
init = all_zero.copy()
init["EGFR_stimulus"] = 1
%time a = list(mbn.attractors(reachable_from=init))
tabulate(a, columns=outputs+non_outputs)
CPU times: user 5.89 ms, sys: 940 µs, total: 6.83 ms
Wall time: 6.05 ms
Out[11]:
Apoptosis_b1 Growth_Arrest Proliferation AKT ATM_b1 ATM_b2 Apoptosis_b2 CDC25A CHEK1_2_b1 CHEK1_2_b2 CyclinA CyclinD1 CyclinE1 DNAdamage E2F1_b1 E2F1_b2 E2F3_b1 E2F3_b2 EGFR EGFR_stimulus FGFR3 FGFR3_stimulus GRB2 GrowthInhibitors MDM2 PI3K PTEN RAS RB1 RBL2 SPRY TP53 p14ARF p16INK4a p21CIP
0 0 * * * 0 0 0 * 0 0 * * * 0 * 0 * 0 * 1 0 0 * 0 * * 0 * * * * 0 * 0 0
In [12]:
init = all_zero.copy()
init["EGFR_stimulus"] = 1
init["GrowthInhibitors"] = 1
%time a = list(mbn.attractors(reachable_from=init))
tabulate(a, columns=outputs+non_outputs)
CPU times: user 6.91 ms, sys: 25 µs, total: 6.94 ms
Wall time: 6.09 ms
Out[12]:
Apoptosis_b1 Growth_Arrest Proliferation AKT ATM_b1 ATM_b2 Apoptosis_b2 CDC25A CHEK1_2_b1 CHEK1_2_b2 CyclinA CyclinD1 CyclinE1 DNAdamage E2F1_b1 E2F1_b2 E2F3_b1 E2F3_b2 EGFR EGFR_stimulus FGFR3 FGFR3_stimulus GRB2 GrowthInhibitors MDM2 PI3K PTEN RAS RB1 RBL2 SPRY TP53 p14ARF p16INK4a p21CIP
0 0 1 0 * 0 0 0 0 0 0 0 0 0 0 0 0 * 0 * 1 0 0 * 1 * * 0 * 0 1 * 0 0 1 *
In [13]:
init = all_zero.copy()
init["EGFR_stimulus"] = 1
init["FGFR3_stimulus"] = 1
init["GrowthInhibitors"] = 1
%time a = list(mbn.attractors(reachable_from=init))
tabulate(a, columns=outputs+non_outputs)
CPU times: user 7.24 ms, sys: 189 µs, total: 7.43 ms
Wall time: 6.25 ms
Out[13]:
Apoptosis_b1 Growth_Arrest Proliferation AKT ATM_b1 ATM_b2 Apoptosis_b2 CDC25A CHEK1_2_b1 CHEK1_2_b2 CyclinA CyclinD1 CyclinE1 DNAdamage E2F1_b1 E2F1_b2 E2F3_b1 E2F3_b2 EGFR EGFR_stimulus FGFR3 FGFR3_stimulus GRB2 GrowthInhibitors MDM2 PI3K PTEN RAS RB1 RBL2 SPRY TP53 p14ARF p16INK4a p21CIP
0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 1 0 1 0 0 1 1 1 0 1 0 0 0 1 0 0 1 0 1 1 0
1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 1 1 1 1 0 0 0 1
2 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 1 0 1 0 0 0 1 0 1 1 0 0 1 1

Attractors with model perturbations

We reproduce the analysis of attractors under various mutations, focusing when DNAdamage is off. They match with Table 2 of (Remy et al., 2015).

In [14]:
%time a = list(mbn.attractors(constraints={"DNAdamage":0}))
tabulate(a, columns=outputs)
CPU times: user 69 µs, sys: 5.98 ms, total: 6.04 ms
Wall time: 4.93 ms
Out[14]:
Apoptosis_b1 Growth_Arrest Proliferation
0 0 0 1
1 0 1 0
2 0 * *
In [15]:
bn_mut = mbn.copy()
bn_mut["FGFR3"] = 1
%time a = list(bn_mut.attractors(constraints={"DNAdamage":0}))
tabulate(a, columns=outputs)
CPU times: user 6.07 ms, sys: 23 µs, total: 6.09 ms
Wall time: 4.86 ms
Out[15]:
Apoptosis_b1 Growth_Arrest Proliferation
0 0 0 1
1 0 1 0
In [16]:
bn_mut = mbn.copy()
bn_mut["PI3K"] = 1
%time a = list(bn_mut.attractors(constraints={"DNAdamage":0}))
tabulate(a, columns=outputs)
CPU times: user 4.84 ms, sys: 724 µs, total: 5.57 ms
Wall time: 4.74 ms
Out[16]:
Apoptosis_b1 Growth_Arrest Proliferation
0 0 0 0
1 0 0 1
2 0 0 *
3 0 1 0
In [17]:
bn_mut = mbn.copy()
bn_mut["PI3K"] = 1
bn_mut["FGFR3"] = 1
%time a = list(bn_mut.attractors(constraints={"DNAdamage":0}))
tabulate(a, columns=outputs)
CPU times: user 5.27 ms, sys: 25 µs, total: 5.3 ms
Wall time: 4.56 ms
Out[17]:
Apoptosis_b1 Growth_Arrest Proliferation
0 0 0 1
1 0 1 0
In [18]:
bn_mut = mbn.copy()
bn_mut["PI3K"] = 1
bn_mut["FGFR3"] = 1
bn_mut["p16INK4a"] = 0
%time a = list(bn_mut.attractors(constraints={"DNAdamage":0}))
tabulate(a, columns=outputs)
CPU times: user 4.71 ms, sys: 404 µs, total: 5.12 ms
Wall time: 4.34 ms
Out[18]:
Apoptosis_b1 Growth_Arrest Proliferation
0 0 0 1
In [ ]: