"""
Overview
========
PySB implementations of the extrinsic apoptosis reaction model version 1.0
(EARM 1.0) originally published in [Albeck2008]_.
This file contains functions that implement the extrinsic pathway in three
modules:
- Receptor ligation to Bid cleavage (:py:func:`rec_to_bid`)
- Mitochondrial Outer Membrane Permeabilization (MOMP, see below)
- Pore transport to effector caspase activation and PARP cleavage
(:py:func:`pore_to_parp`).
For the (MOMP) segment there are five variants, which correspond to the five
models described in Figure 11 of [Albeck2008]_:
- "Minimal Model" (Figure 11b, :py:func:`albeck_11b`)
- "Model B + Bax multimerization" (Figure 11c, :py:func:`albeck_11c`)
- "Model C + mitochondrial transport" (Figure 11d, :py:func:`albeck_11d`)
- "Current model" (Figure 11e, :py:func:`albeck_11e`)
- "Current model + cooperativity" (Figure 11f, :py:func:`albeck_11f`)
"""
from pysb import *
from pysb.util import alias_model_components
from earm.shared import *
from pysb.macros import equilibrate
# Default forward, reverse, and catalytic rates:
KF = 1e-6
KR = 1e-3
KC = 1
# Monomer declarations
# ====================
[docs]def ligand_to_c8_monomers():
""" Declares ligand, receptor, DISC, Flip, Bar and Caspase 8.
'bf' is the site to be used for all binding reactions.
The 'state' site denotes various localization and/or activity states of a
Monomer, with 'C' denoting cytoplasmic localization and 'M' mitochondrial
localization.
"""
Monomer('L', ['bf']) # Ligand
Monomer('R', ['bf']) # Receptor
Monomer('DISC', ['bf']) # Death-Inducing Signaling Complex
Monomer('flip', ['bf'])
# Caspase 8, states: pro, Active
Monomer('C8', ['bf', 'state'], {'state':['pro', 'A']})
Monomer('BAR', ['bf'])
alias_model_components()
# == Annotations
Annotation(L, 'http://identifiers.org/uniprot/P50591')
Annotation(R, 'http://identifiers.org/uniprot/O14763')
Annotation(DISC, 'http://identifiers.org/obo.go/GO:0031264')
Annotation(flip, 'http://identifiers.org/uniprot/O15519')
Annotation(C8, 'http://identifiers.org/uniprot/Q14790')
Annotation(BAR, 'http://identifiers.org/uniprot/Q9NZS9')
[docs]def momp_monomers():
"""Declare the monomers used in the Albeck MOMP modules."""
# == Activators
# Bid, states: Untruncated, Truncated, truncated and Mitochondrial
Monomer('Bid', ['bf', 'state'], {'state':['U', 'T', 'M']})
# == Effectors
# Bax, states: Cytoplasmic, Mitochondrial, Active
# sites 's1' and 's2' are used for pore formation
Monomer('Bax', ['bf', 's1', 's2', 'state'], {'state':['C', 'M', 'A']})
# == Anti-Apoptotics
Monomer('Bcl2', ['bf'])
# == Cytochrome C and Smac
Monomer('CytoC', ['bf', 'state'], {'state':['M', 'C', 'A']})
Monomer('Smac', ['bf', 'state'], {'state':['M', 'C', 'A']})
alias_model_components()
# == Annotations
Annotation(Bid, 'http://identifiers.org/uniprot/P55957')
Annotation(Bax, 'http://identifiers.org/uniprot/Q07812')
Annotation(Bcl2, 'http://identifiers.org/uniprot/P10415')
Annotation(CytoC, 'http://identifiers.org/uniprot/P99999')
Annotation(Smac, 'http://identifiers.org/uniprot/Q9NR28')
[docs]def apaf1_to_parp_monomers():
""" Declares CytochromeC, Smac, Apaf-1, the Apoptosome, Caspases 3, 6, 9,
XIAP and PARP.
The package variable 'bf' specifies the name of the site to be used
for all binding reactions.
The 'state' site denotes various localization and/or activity states of a
Monomer, with 'C' denoting cytoplasmic localization and 'M' mitochondrial
localization.
"""
# Apaf-1 and Apoptosome
Monomer('Apaf', ['bf', 'state'], {'state':['I', 'A']}) # Apaf-1
# Apoptosome (activated Apaf-1 + caspase 9)
Monomer('Apop', ['bf'])
# Csp 3, states: pro, active, ubiquitinated
Monomer('C3', ['bf', 'state'], {'state':['pro', 'A', 'ub']})
# Caspase 6, states: pro-, Active
Monomer('C6', ['bf', 'state'], {'state':['pro', 'A']})
# Caspase 9
Monomer('C9', ['bf'])
# PARP, states: Uncleaved, Cleaved
Monomer('PARP', ['bf', 'state'], {'state':['U', 'C']})
# X-linked Inhibitor of Apoptosis Protein
Monomer('XIAP', ['bf'])
alias_model_components()
# == Annotations
Annotation(Apaf, 'http://identifiers.org/uniprot/O14727')
Annotation(Apop, 'http://identifiers.org/obo.go/GO:0043293')
Annotation(C3, 'http://identifiers.org/uniprot/P42574')
Annotation(C6, 'http://identifiers.org/uniprot/P55212')
Annotation(C9, 'http://identifiers.org/uniprot/P55211')
Annotation(PARP, 'http://identifiers.org/uniprot/P09874')
Annotation(XIAP, 'http://identifiers.org/uniprot/P98170')
[docs]def all_monomers():
"""Shorthand for calling ligand_to_c8, momp, and apaf1_to_parp macros.
Internally calls the macros ligand_to_c8_monomers(), momp_monomers(), and
apaf1_to_parp_monomers() to instantiate the monomers for each portion of the
pathway.
"""
ligand_to_c8_monomers()
momp_monomers()
apaf1_to_parp_monomers()
# Extrinsic apoptosis module implementations
# ==========================================
#
# These functions implement the upstream (:py:func:`rec_to_bid`) and downstream
# (:py:func:`pore_to_parp`) elements of the extrinsic apoptosis pathway.
[docs]def rec_to_bid():
"""Defines the interactions from ligand (e.g. TRAIL) binding to Bid
activation as per EARM 1.0.
Uses L, R, DISC, flip, C8, BAR, and Bid monomers and their
associated parameters to generate the rules that describe Ligand/Receptor
binding, DISC formation, Caspase-8 activation and
inhibition by flip and BAR as originally specified in EARM 1.0.
Declares initial conditions for ligand, receptor, Flip, C8, and Bar.
"""
# Declare initial conditions for ligand, receptor, Flip, C8, and Bar.
Parameter('L_0', 3000) # 3000 Ligand corresponds to 50 ng/ml SK-TRAIL
Parameter('R_0' , 200) # 200 TRAIL receptor
Parameter('flip_0' , 1.0e2) # Flip
Parameter('C8_0' , 2.0e4) # procaspase-8
Parameter('BAR_0' , 1.0e3) # Bifunctional apoptosis regulator
# Needed to recognize the monomer and parameter names in the present scope
alias_model_components()
Initial(L(bf=None), L_0)
Initial(R(bf=None), R_0)
Initial(flip(bf=None), flip_0)
Initial(C8(bf=None, state='pro'), C8_0)
Initial(BAR(bf=None), BAR_0)
# =====================
# tBID Activation Rules
# ---------------------
# L + R <--> L:R --> DISC
# pC8 + DISC <--> DISC:pC8 --> C8 + DISC
# Bid + C8 <--> Bid:C8 --> tBid + C8
# ---------------------
catalyze_convert(L(), R(), DISC(bf=None ), [4e-7, KR, 1e-5])
catalyze(DISC(), C8(state='pro'), C8(state='A'), [KF, KR, KC])
catalyze(C8(state='A'), Bid(state='U'), Bid(state='T'), [KF, KR, KC])
# ---------------------
# Inhibition Rules
# ---------------------
# flip + DISC <--> flip:DISC
# C8 + BAR <--> BAR:C8
# ---------------------
bind(DISC(), flip(), [KF, KR])
bind(BAR(), C8(state='A'), [KF, KR])
[docs]def pore_to_parp():
"""Defines what happens after the pore is activated and Cytochrome C and
Smac are released.
Uses CytoC, Smac, Apaf, Apop, C3, C6, C8, C9, PARP, XIAP monomers and their
associated parameters to generate the rules that describe apoptosome
formation, XIAP inhibition, activation of caspases (including
caspase-6-mediated feedback), and cleavage of effector caspase substrates
as specified in EARM 1.0.
Declares initial conditions for CytoC, Smac, Apaf-1, Apoptosome, caspases
3, 6, and 9, XIAP, and PARP.
"""
# Declare initial conditions:
Parameter('Apaf_0' , 1.0e5) # Apaf-1
Parameter('C3_0' , 1.0e4) # procaspase-3 (pro-C3)
Parameter('C6_0' , 1.0e4) # procaspase-6 (pro-C6)
Parameter('C9_0' , 1.0e5) # procaspase-9 (pro-C9)
Parameter('XIAP_0' , 1.0e5) # X-linked inhibitor of apoptosis protein
Parameter('PARP_0' , 1.0e6) # C3* substrate
alias_model_components()
Initial(Apaf(bf=None, state='I'), Apaf_0)
Initial(C3(bf=None, state='pro'), C3_0)
Initial(C6(bf=None, state='pro'), C6_0)
Initial(C9(bf=None), C9_0)
Initial(PARP(bf=None, state='U'), PARP_0)
Initial(XIAP(bf=None), XIAP_0)
# CytoC and Smac activation after release
# --------------------------------------
equilibrate(Smac(bf=None, state='C'), Smac(bf=None, state='A'),
transloc_rates)
equilibrate(CytoC(bf=None, state='C'), CytoC(bf=None, state='A'),
transloc_rates)
# Apoptosome formation
# --------------------
# Apaf + cCytoC <--> Apaf:cCytoC --> aApaf + cCytoC
# aApaf + pC9 <--> Apop
# Apop + pC3 <--> Apop:pC3 --> Apop + C3
catalyze(CytoC(state='A'), Apaf(state='I'), Apaf(state='A'), [5e-7, KR, KC])
one_step_conv(Apaf(state='A'), C9(), Apop(bf=None), [5e-8, KR])
catalyze(Apop(), C3(state='pro'), C3(bf=None, state='A'), [5e-9, KR, KC])
# Apoptosome-related inhibitors
# -----------------------------
# Apop + XIAP <--> Apop:XIAP
# cSmac + XIAP <--> cSmac:XIAP
bind(Apop(), XIAP(), [2e-6, KR])
bind(Smac(state='A'), XIAP(), [7e-6, KR])
# Caspase reactions
# -----------------
# Includes effectors, inhibitors, and feedback initiators:
#
# pC3 + C8 <--> pC3:C8 --> C3 + C8 CSPS
# pC6 + C3 <--> pC6:C3 --> C6 + C3 CSPS
# XIAP + C3 <--> XIAP:C3 --> XIAP + C3_U CSPS
# PARP + C3 <--> PARP:C3 --> CPARP + C3 CSPS
# pC8 + C6 <--> pC8:C6 --> C8 + C6 CSPS
catalyze(C8(state='A'), C3(state='pro'), C3(state='A'), [1e-7, KR, KC])
catalyze(XIAP(), C3(state='A'), C3(state = 'ub'), [2e-6, KR, 1e-1])
catalyze(C3(state='A'), PARP(state='U'), PARP(state='C'), [KF, 1e-2, KC])
catalyze(C3(state='A'), C6(state='pro'), C6(state='A'), [KF, KR, KC])
catalyze(C6(state='A'), C8(state='pro'), C8(state='A'), [3e-8, KR, KC])
# MOMP module implementations
# ===========================
# Motifs
# ------
# Because several of the models in [Albeck2008]_ overlap, some mechanistic
# aspects have been refactored into the following "motifs", implemented as
# functions:
[docs]def Bax_tetramerizes(bax_active_state='A', rate_scaling_factor=1):
"""Creates rules for the rxns Bax + Bax <> Bax2, and Bax2 + Bax2 <> Bax4.
Parameters
----------
bax_active_state : string: 'A' or 'M'
The state value that should be assigned to the site "state" for
dimerization and tetramerization to occur.
rate_scaling_factor : number
A scaling factor applied to the forward rate constants for dimerization
and tetramerization.
"""
active_unbound = {'state': bax_active_state, 'bf': None}
active_bax_monomer = Bax(s1=None, s2=None, **active_unbound)
bax2 =(Bax(s1=1, s2=None, **active_unbound) %
Bax(s1=None, s2=1, **active_unbound))
bax4 =(Bax(s1=1, s2=4, **active_unbound) %
Bax(s1=2, s2=1, **active_unbound) %
Bax(s1=3, s2=2, **active_unbound) %
Bax(s1=4, s2=3, **active_unbound))
Rule('Bax_dimerization', active_bax_monomer + active_bax_monomer <> bax2,
Parameter('Bax_dimerization_kf', KF*rate_scaling_factor),
Parameter('Bax_dimerization_kr', KR))
# Notes on the parameter values used below:
# - The factor 2 is applied to the forward tetramerization rate because
# BNG (correctly) divides the provided forward rate constant by 1/2 to
# account for the fact that Bax2 + Bax2 is a homodimerization reaction,
# and hence the effective rate is half that of an analogous
# heterodimerization reaction. However, Albeck et al. used the same
# default rate constant of 1e-6 for this reaction as well, therefore it
# must be multiplied by 2 in order to match the original model
# - BNG apparently applies a scaling factor of 2 to the reverse reaction
# rate, for reasons we do not entirely understand. The factor of 0.5 is
# applied here to make the rate match the original Albeck ODEs.
Rule('Bax_tetramerization', bax2 + bax2 <> bax4,
Parameter('Bax_tetramerization_kf', 2*KF*rate_scaling_factor),
Parameter('Bax_tetramerization_kr', 0.5*KR))
[docs]def Bcl2_binds_Bax1_Bax2_and_Bax4(bax_active_state='A', rate_scaling_factor=1):
"""Creates rules for binding of Bcl2 to Bax monomers and oligomers.
Parameters
----------
bax_active_state : string: 'A' or 'M'
The state value that should be assigned to the site "state" for
the Bax subunits in the pore.
rate_scaling_factor : number
A scaling factor applied to the forward rate constants for binding
between Bax (monomers, oligomers) and Bcl2.
"""
bind(Bax(state=bax_active_state, s1=None, s2=None), Bcl2,
[KF*rate_scaling_factor, KR])
pore_bind(Bax(state=bax_active_state), 's1', 's2', 'bf', 2, Bcl2, 'bf',
[KF*rate_scaling_factor, KR])
pore_bind(Bax(state=bax_active_state), 's1', 's2', 'bf', 4, Bcl2, 'bf',
[KF*rate_scaling_factor, KR])
# Modules
# -------
[docs]def albeck_11b(do_pore_transport=True):
"""Minimal MOMP model shown in Figure 11b.
Features:
- Bid activates Bax
- Active Bax is inhibited by Bcl2
- Free active Bax binds to and transports Smac to the cytosol
"""
alias_model_components()
# Set initial conditions
Initial(Bid(state='U', bf=None), Parameter('Bid_0', 1e5))
Initial(Bax(bf=None, **inactive_monomer), Parameter('Bax_0', 1e5))
Initial(Bcl2(bf=None), Parameter('Bcl2_0', 2e4))
# MOMP Mechanism
catalyze(Bid(state='T'), Bax(inactive_monomer), Bax(active_monomer),
[1e-7, KR, KC])
bind(Bax(active_monomer), Bcl2, [KF, KR])
# Transport of Smac and Cytochrome C
if do_pore_transport:
Initial(Smac(state='M', bf=None), Parameter('Smac_0', 1e6))
Initial(CytoC(state='M', bf=None), Parameter('CytoC_0', 1e6))
catalyze(Bax(state='A'), Smac(state='M'), Smac(state='C'),
[KF, KR, 10])
catalyze(Bax(state='A'), CytoC(state='M'), CytoC(state='C'),
[KF, KR, 10])
[docs]def albeck_11c(do_pore_transport=True):
"""Model incorporating Bax oligomerization.
Features:
- Bid activates Bax
- Active Bax dimerizes; Bax dimers dimerize to form tetramers
- Bcl2 binds/inhibits Bax monomers, dimers, and tetramers
- Bax tetramers bind to and transport Smac to the cytosol
"""
alias_model_components()
Initial(Bid(state='U', bf=None), Parameter('Bid_0', 4e4))
Initial(Bax(bf=None, **inactive_monomer), Parameter('Bax_0', 1e5))
Initial(Bcl2(bf=None), Parameter('Bcl2_0', 2e4))
# tBid activates Bax
catalyze(Bid(state='T'), Bax(inactive_monomer), Bax(active_monomer),
[1e-7, KR, KC])
# Bax dimerizes/tetramerizes
Bax_tetramerizes(bax_active_state='A')
# Bcl2 inhibits Bax, Bax2, and Bax4
Bcl2_binds_Bax1_Bax2_and_Bax4(bax_active_state='A')
if do_pore_transport:
Initial(Smac(state='M', bf=None), Parameter('Smac_0', 1e6))
Initial(CytoC(state='M', bf=None), Parameter('CytoC_0', 1e6))
# NOTE change in KF here from previous model!!!!
pore_transport(Bax(state='A'), 4, Smac(state='M'), Smac(state='C'),
[[2*KF, KR, 10]])
pore_transport(Bax(state='A'), 4, CytoC(state='M'), CytoC(state='C'),
[[KF, KR, 10]])
[docs]def albeck_11d(do_pore_transport=True):
"""Model incorporating mitochondrial transport.
Features:
- Bid activates Bax
- Active Bax translocates to the mitochondria
- All reactions on the mito membrane have increased association rates
- Mitochondrial Bax dimerizes; Bax dimers dimerize to form tetramers
- Bcl2 binds/inhibits Bax monomers, dimers, and tetramers
- Bax tetramers bind to and transport Smac to the cytosol
"""
alias_model_components()
Initial(Bid(state='U', bf=None), Parameter('Bid_0', 4e4))
Initial(Bax(bf=None, **inactive_monomer), Parameter('Bax_0', 1e5))
Initial(Bcl2(bf=None), Parameter('Bcl2_0', 2e4))
# Fractional volume of the mitochondrial membrane compartment
v = 0.07
rate_scaling_factor = 1./v
# tBid activates Bax in the cytosol
catalyze(Bid(state='T'), Bax(inactive_monomer), Bax(active_monomer),
[1e-7, KR, KC])
# Active Bax translocates to the mitochondria
equilibrate(Bax(bf=None, **active_monomer),
Bax(bf=None, state='M', s1=None, s2=None),
[1e-2, 1e-2])
# Bax dimerizes/tetramerizes
Bax_tetramerizes(bax_active_state='M',
rate_scaling_factor=rate_scaling_factor)
# Bcl2 inhibits Bax, Bax2, and Bax4
Bcl2_binds_Bax1_Bax2_and_Bax4(bax_active_state='M',
rate_scaling_factor=rate_scaling_factor)
if do_pore_transport:
Initial(Smac(state='M', bf=None), Parameter('Smac_0', 1e6))
Initial(CytoC(state='M', bf=None), Parameter('CytoC_0', 1e6))
pore_transport(Bax(state='M'), 4, Smac(state='M'), Smac(state='C'),
[[rate_scaling_factor*2*KF, KR, 10]])
pore_transport(Bax(state='M'), 4, CytoC(state='M'), CytoC(state='C'),
[[KF, KR, 10]])
[docs]def albeck_11e(do_pore_transport=True):
"""Model incorporating mitochondrial transport and pore "insertion."
Features:
- Bid activates Bax
- Active Bax translocates to the mitochondria
- All reactions on the mitochondria have increased association rates
- Mitochondrial Bax dimerizes; Bax dimers dimerize to form tetramers
- Bcl2 binds/inhibits Bax monomers, dimers, and tetramers
- Bax tetramers bind to mitochondrial "sites" and become active pores
- Active pores bind to and transport Smac to the cytosol
"""
# Build off of the previous model
albeck_11d(do_pore_transport=False)
# Add the "Mito" species, with states "Inactive" and "Active".
Monomer('Mito', ['bf', 'state'], {'state': ['I', 'A']})
alias_model_components()
Initial(Mito(state='I', bf=None), Parameter('Mito_0', 5e5))
v = 0.07
rate_scaling_factor = 1./v
# Add activation of mitochondrial pore sites by Bax4
pore_bind(Bax(state='M'), 's1', 's2', 'bf', 4, Mito(state='I'), 'bf',
[KF*rate_scaling_factor, KR])
Rule('Mito_activation',
MatchOnce(Bax(state='M', bf=5, s1=1, s2=4) %
Bax(state='M', bf=None, s1=2, s2=1) %
Bax(state='M', bf=None, s1=3, s2=2) %
Bax(state='M', bf=None, s1=4, s2=3) %
Mito(state='I', bf=5)) >>
Mito(state='A', bf=None),
Parameter('Mito_activation_kc', KC))
if do_pore_transport:
Initial(Smac(state='M', bf=None), Parameter('Smac_0', 1e6))
Initial(CytoC(state='M', bf=None), Parameter('CytoC_0', 1e6))
catalyze(Mito(state='A'), Smac(state='M'), Smac(state='C'),
[rate_scaling_factor*2*KF, KR, 10])
catalyze(Mito(state='A'), CytoC(state='M'), CytoC(state='C'),
[rate_scaling_factor*2*KF, KR, 10])
[docs]def albeck_11f(do_pore_transport=True):
"""Model as in 11e, but with cooperative assembly of Bax pores.
Association rate constants for Bax dimerization, tetramerization, and
insertion are set so that they increase at each step (from 1e-8 to 1e-7 and
then 1e-6), thereby creating cooperative assembly.
See also the documentation for albeck_11e().
"""
albeck_11e(do_pore_transport=do_pore_transport)
alias_model_components()
# Set parameter values for cooperative pore formation
equilibrate_BaxA_to_BaxM_kf.value = 1e-4 # was 1e-2 in 11e
equilibrate_BaxA_to_BaxM_kr.value = 1e-4 # was 1e-2 in 11e
Bax_dimerization_kf.value /= 100 # was 1e-6 in 11e
Bax_tetramerization_kf.value /= 10 # was 1e-6 in 11e