In [1]:
import pypint

You are using Pint version 2017-09-25 and pypint 1.3.1

Model : tumour cell invasion model

Published in Cohen, Zinovyev, Calzone et al, Plos Comput Biol 2015

Hello

Influence graph

In [2]:
model = pypint.load()
In [6]:
#invasion = pypint.load("https://cellcollective.org/#5884/tumour-cell-invasion-and-migration")
invasion = pypint.load("models/invasion.sbml")

Source file is in sbml format, importing with GINsim

Simplifying model...

In [7]:
invasion.summary()
Out[7]:
{'max_local_states': 2,
 'nb_automata': 32,
 'nb_local_states': 64,
 'nb_states': 4294967296,
 'nb_transitions': 245}

Computations of mutations for preventing non-tumoral state

Mutation computation

specification

Non-tumoral state: either Apoptosis or CellCycleArrest active.

In [8]:
goal = pypint.Goal("Apoptosis=1")|pypint.Goal("CellCycleArrest=1")
model = invasion.having(ECM=1, DNAdamage=0) # assumes other nodes are 0

computation

In [10]:
model.reachability(goal)
Out[10]:
True
In [11]:
model.reachability("Metastasis=1")
Out[11]:
True
In [12]:
mutations = model.oneshot_mutations_for_cut(goal, maxsize=3, exclude={"ECM", "DNAdamage"})
mutations

This computation is an under-approximation: returned mutations are all valid, but they may be non-minimal, and some solutions may be missed.

Limiting solutions to mutations of at most 3 automata. Use maxsize argument to change.

Out[12]:
[{'AKT1': 1},
 {'CDH2': 1, 'NICD': 0},
 {'CTNNB1': 0, 'NICD': 0},
 {'DKK1': 1, 'NICD': 0},
 {'CDH1': 1, 'NICD': 0},
 {'ERK': 1, 'SNAI2': 1, 'p63': 1},
 {'ERK': 1, 'miR200': 0, 'p63': 1},
 {'ERK': 1, 'ZEB1': 1, 'p63': 1},
 {'AKT2': 1, 'ERK': 1, 'p63': 1},
 {'ERK': 1, 'SNAI1': 1, 'ZEB2': 0},
 {'SNAI2': 1, 'ZEB2': 0, 'p21': 0},
 {'ERK': 1, 'SNAI2': 1, 'ZEB2': 0},
 {'NICD': 0, 'SNAI2': 1, 'TWIST1': 0},
 {'ZEB2': 0, 'p21': 0, 'p53': 0},
 {'AKT2': 1, 'ZEB2': 0, 'p21': 0},
 {'ERK': 1, 'ZEB1': 1, 'ZEB2': 0},
 {'ERK': 1, 'ZEB2': 0, 'p53': 0},
 {'AKT2': 1, 'ERK': 1, 'ZEB2': 0},
 {'NICD': 0, 'TWIST1': 0, 'p53': 0},
 {'ERK': 1, 'ZEB1': 1, 'p53': 1}]
In [13]:
model.lock( {'CDH1': 1, 'NICD': 0}).reachability(goal)
Out[13]:
False
In [14]:
[m for m in mutations if model.lock(m).reachability("Metastasis=1")]

Approximations are inconclusive, fallback to exact model-checking with its

Approximations are inconclusive, fallback to exact model-checking with its

Approximations are inconclusive, fallback to exact model-checking with its

Approximations are inconclusive, fallback to exact model-checking with its

Approximations are inconclusive, fallback to exact model-checking with its

Approximations are inconclusive, fallback to exact model-checking with its

Approximations are inconclusive, fallback to exact model-checking with its

Approximations are inconclusive, fallback to exact model-checking with its

Out[14]:
[{'ERK': 1, 'SNAI1': 1, 'ZEB2': 0},
 {'SNAI2': 1, 'ZEB2': 0, 'p21': 0},
 {'ERK': 1, 'SNAI2': 1, 'ZEB2': 0},
 {'ZEB2': 0, 'p21': 0, 'p53': 0},
 {'AKT2': 1, 'ZEB2': 0, 'p21': 0},
 {'ERK': 1, 'ZEB1': 1, 'ZEB2': 0},
 {'ERK': 1, 'ZEB2': 0, 'p53': 0},
 {'AKT2': 1, 'ERK': 1, 'ZEB2': 0}]

Computations of cutsets to metastasis

In [15]:
model.cutsets("Metastasis=1", maxsize=3, exclude={"ECM"})

This computation is an under-approximation: returned cut-sets are all valid, but they may be non-minimal, and some cut-sets may be missed.

Limiting results to cut-sets with at most 3 elements. Use maxsize argument to change.

Out[15]:
[{'CDH2': 1},
 {'p63': 0},
 {'EMT': 1},
 {'miR200': 0},
 {'miR34': 0},
 {'Invasion': 1},
 {'VIM': 1},
 {'Migration': 1},
 {'TWIST1': 1},
 {'miR203': 0},
 {'CDH1': 0},
 {'p53': 0},
 {'AKT2': 1},
 {'ERK': 1},
 {'AKT1': 0},
 {'CDH2': 0, 'CTNNB1': 0},
 {'CDH2': 0, 'SMAD': 1},
 {'CDH2': 0, 'TGFbeta': 1},
 {'CDH2': 0, 'ZEB2': 1},
 {'CTNNB1': [0, 1]},
 {'CTNNB1': 0, 'DKK1': 0},
 {'CTNNB1': 1, 'SMAD': 1},
 {'CTNNB1': 1, 'TGFbeta': 1},
 {'CTNNB1': 1, 'ZEB2': 1},
 {'DKK1': 0, 'SMAD': 1},
 {'DKK1': 0, 'TGFbeta': 1},
 {'DKK1': 0, 'ZEB2': 1},
 {'CDH2': 0, 'SNAI1': [0, 1]},
 {'CDH2': 0, 'SNAI1': 1, 'p73': 0},
 {'CDH2': 0, 'NICD': 1, 'SNAI1': 1},
 {'CTNNB1': 1, 'SNAI1': [0, 1]},
 {'CTNNB1': 1, 'SNAI1': 1, 'p73': 0},
 {'CTNNB1': 1, 'NICD': 1, 'SNAI1': 1},
 {'DKK1': 0, 'SNAI1': [0, 1]},
 {'DKK1': 0, 'SNAI1': 1, 'p73': 0},
 {'DKK1': 0, 'NICD': 1, 'SNAI1': 1}]

More information

See tutorial (link on the PDF of the article ; quick-tutorial on http://tmpnb.loicpauleve.name)

Thank you for your attention !

Ack:

  • Olivier Roux, Morgan Magnin, Maxime Folschette, Louis Fippo Fittime (LS2N, Nantes)
  • Laurence Calzone, Andrei Zinovyev (Institut Curie, Paris)