8.10. Multiple Occupancy in TX/TL

Contributed by: Matthieu Kratz

Why this model?

Like most genetic circuit models, you typically start with a model that captures the two fundamental processes of transcription and translation. These processes can modelled with varying degrees of complexity, ranging from a basic tx/tl model (Equation 1) to complex models that simulate tx/tl at a base pair level. For my project, it was of particular importance that I accurately model the sequestration of transcriptional machinery. Further, I was working without RPU data, making typical models that assume some maximum steady state saturation e.g. positive proportional hill intractable for my system.

\begin{align} \\ \\ &G \xrightarrow{ktx} T + G \\ \\ &\textbf{Equation 1.} \ \ \text{Simple Transcription} \\ \end{align}

Hence, I needed a model that gave reasonable steady state transcription and translation dynamics from non-RPU parameters, all while accurately tracking the sequestration of the relevant machinery.

The Multi-TX Model

The model CRN is below and the mechanism effectively relies on accounting for all possible RNAp occupancy states, including the various transitions between these occupancy states.

\begin{align} \\ \\ &\textbf{1. Binding} \\ &T7_p + T7_p:G_n \underset{kT72}{\overset{kT71}\rightleftharpoons} T7_p:G_{n\alpha} \ \ , \ \text{n $\neq$ $n_{max}$} \\ \\ &\textbf{2. Closed --> Open} \\ &T7_p:G_{n\alpha} \xrightarrow{k_{iso}} T7_p:G_{n+1} \ \ , \ \text{n $\neq$ $n_{max}$} \\ \\ &\textbf{3. TX} \\ &T7_p:G_{n\alpha} \xrightarrow{ktx} nT7_m + nT7_p + T7_p:G_{0\alpha} \ \ , \ \text{n $\neq$ 0} \\ &T7_p:G_n \xrightarrow{ktx} nT7_m + nT7_p + T7_p:G_{0} \ \ , \ \text{n $\neq$ 0} \\ \end{align}

kT71 –> Promoter binding rate constant (bimolecular)

kT72 –> Promoter unbinding rate constant (unimolecular)

k_iso –> Closed to open complex transition rate constant (unimolecular)

ktx –> Single polymerase mRNA synthesis rate constant (unimolecular)

A couple of comments:

  • We explicitly model the process of transitioning from the closed (\(T7_p:G_{n\alpha}\)) to open complex (\(T7_p:G_{n+1}\)). This a pretty slow reaction in vivo, and in the various iterations of this model, including this seemed to be key in accurately reflecting transcription dynamics.

  • \(n_{max}\) refers to the maximum possible occupancy of the gene. This is the physical limit which is ultimately determined by the footprint of the polymerase and the length of the gene. In relation to the point above, without isomerization, this physical limit is always met. With the explicit isomerization, this physical saturation is not met (with my parameter set at least).

  • Polymerase can only be added one at a time to existing genes i.e. cannot have multiple binding events or closed complexes simultaneously.

  • We have two TX reactions, one from the closed state and the other from the open state, both with \(N\) actively transcribing polymerases. We decided to allow release from the closed state as there is no reason why one polymerase in the closed form should inhibit of other activitely transcribing polymerases. Further, at a modelling level, not allowing release from the closed state results in excessive sequestration of polymerase due to the long time scale of isomerization.

  • In both TX reactions, the entirety of the \(N\) polymerases (bar the one in the closed state) are simultaneously release, along with \(N\) transcripts and the unoccupied gene (\(T7_p:G_{0}\))

Biocrnpyler multi_tx Mechanism subclass

Subclass should be availabe via from biocrnpyler.mechanisms import multi_tx, code is below for clarity

Couple of comments:

  • The subclass has been designed to be used in concert with the Promoter and DNA assemblies subclasses

  • Have to define a maximum occupancy (int) and cognate polymerase (species or str) when instantiating

  • The various complex species are generated within the subclass from the names of the polymerase and dna objects in the DNAassembly object. They are defined as species with DNA material types.

Example: T7 Polymerase Transcription of GFP mRNA

Now we define a DNA assembly that use our mechanism in the following steps:

  • Create a species for the relevant polymerase

  • Create multi_tx Mechanism, give a maximum occupancy and polymerase (must be species)

  • Associate this mechanism with a promoter

  • Place this promoter into a DNA assembly

And voila, the cassette regulated by T7p is ready to use!

This DNAassembly will be placed in a SimpleTxTlExtract which only dilutes mRNA, not proteins. I haven’t used protein dilution as it makes it easier to glean the degree of sequestration present with this mechanism. In practical use, you would of course allow your polymerase to be diluted.

[1]:
from biocrnpyler.core import Species
from biocrnpyler.components import Promoter, DNAassembly
from biocrnpyler.mechanisms import multi_tx
from biocrnpyler.mixtures import SimpleTxTlDilutionMixture


#the most important parameters for multi_tx
#max_occ is the number of ribosomes that can bind to a transcript
#k_iso is the rate of isomerization
parameters = {"max_occ":10, "k_iso":10}

# Define Polymerase, and max occupancy and instatiate Mechanism Object
T7P = Species('T7p','protein')
#Multi-tx mechanism
MX = multi_tx(pol=T7P,name='MX')

# create promoter object, associated MX and params with it
pT7_mx = Promoter(name='pT7',mechanisms={'transcription':MX})

# place promoter object into DNA assembly with GFP reporter
GFP = Species("GFP", material_type = "protein")
PFL_mx = DNAassembly('PFL', promoter=pT7_mx, rbs = "weak", protein=GFP)

# create simple promoter and DNA assembly objects that synthesize polymerase
SC = DNAassembly('T7_const', promoter="weak", rbs = "weak", protein=T7P)

# make extract with T7p source and GFP and compile CRN
mixture = SimpleTxTlDilutionMixture(components=[PFL_mx, SC],
                                    parameter_file = "default_parameters.txt",
                                    parameters = parameters)

CRN1 = mixture.compile_crn()

print(CRN1.pretty_print(show_rates = False))
print(mixture.components)
Species(N = 26) = {
    complex[dna[PFL]:9x_protein[T7p](closed)] (@ 0),
    complex[dna[PFL]:9x_protein[T7p](open)] (@ 0),
    complex[dna[PFL]:8x_protein[T7p](closed)] (@ 0),
    complex[dna[PFL]:8x_protein[T7p](open)] (@ 0),
    complex[dna[PFL]:7x_protein[T7p](closed)] (@ 0),
    complex[dna[PFL]:7x_protein[T7p](open)] (@ 0),
    complex[dna[PFL]:6x_protein[T7p](closed)] (@ 0),
    complex[dna[PFL]:6x_protein[T7p](open)] (@ 0),
    complex[dna[PFL]:5x_protein[T7p](closed)] (@ 0),
    complex[dna[PFL]:5x_protein[T7p](open)] (@ 0),
    complex[dna[PFL]:4x_protein[T7p](closed)] (@ 0),
    complex[dna[PFL]:4x_protein[T7p](open)] (@ 0),
    complex[dna[PFL]:3x_protein[T7p](closed)] (@ 0),
    complex[dna[PFL]:3x_protein[T7p](open)] (@ 0),
    complex[dna[PFL]:2x_protein[T7p](closed)] (@ 0),
    complex[dna[PFL]:2x_protein[T7p](open)] (@ 0),
    complex[dna[PFL]:10x_protein[T7p](closed)] (@ 0),
    complex[dna[PFL]:10x_protein[T7p](open)] (@ 0),
    complex[dna[PFL]:protein[T7p](closed)] (@ 0),
    complex[dna[PFL]:protein[T7p](open)] (@ 0),
    protein[T7p] (@ 0),
    rna[T7_const] (@ 0),
    dna[T7_const] (@ 0),
    rna[PFL] (@ 0),
    dna[PFL] (@ 0),
    protein[GFP] (@ 0),
}

Reactions (48) = [
0. protein[T7p]+complex[dna[PFL]:protein[T7p](open)] <--> complex[dna[PFL]:2x_protein[T7p](closed)]
1. protein[T7p]+complex[dna[PFL]:2x_protein[T7p](open)] <--> complex[dna[PFL]:3x_protein[T7p](closed)]
2. protein[T7p]+complex[dna[PFL]:3x_protein[T7p](open)] <--> complex[dna[PFL]:4x_protein[T7p](closed)]
3. protein[T7p]+complex[dna[PFL]:4x_protein[T7p](open)] <--> complex[dna[PFL]:5x_protein[T7p](closed)]
4. protein[T7p]+complex[dna[PFL]:5x_protein[T7p](open)] <--> complex[dna[PFL]:6x_protein[T7p](closed)]
5. protein[T7p]+complex[dna[PFL]:6x_protein[T7p](open)] <--> complex[dna[PFL]:7x_protein[T7p](closed)]
6. protein[T7p]+complex[dna[PFL]:7x_protein[T7p](open)] <--> complex[dna[PFL]:8x_protein[T7p](closed)]
7. protein[T7p]+complex[dna[PFL]:8x_protein[T7p](open)] <--> complex[dna[PFL]:9x_protein[T7p](closed)]
8. protein[T7p]+complex[dna[PFL]:9x_protein[T7p](open)] <--> complex[dna[PFL]:10x_protein[T7p](closed)]
9. complex[dna[PFL]:protein[T7p](closed)] --> complex[dna[PFL]:protein[T7p](open)]
10. complex[dna[PFL]:2x_protein[T7p](closed)] --> complex[dna[PFL]:2x_protein[T7p](open)]
11. complex[dna[PFL]:3x_protein[T7p](closed)] --> complex[dna[PFL]:3x_protein[T7p](open)]
12. complex[dna[PFL]:4x_protein[T7p](closed)] --> complex[dna[PFL]:4x_protein[T7p](open)]
13. complex[dna[PFL]:5x_protein[T7p](closed)] --> complex[dna[PFL]:5x_protein[T7p](open)]
14. complex[dna[PFL]:6x_protein[T7p](closed)] --> complex[dna[PFL]:6x_protein[T7p](open)]
15. complex[dna[PFL]:7x_protein[T7p](closed)] --> complex[dna[PFL]:7x_protein[T7p](open)]
16. complex[dna[PFL]:8x_protein[T7p](closed)] --> complex[dna[PFL]:8x_protein[T7p](open)]
17. complex[dna[PFL]:9x_protein[T7p](closed)] --> complex[dna[PFL]:9x_protein[T7p](open)]
18. complex[dna[PFL]:10x_protein[T7p](closed)] --> complex[dna[PFL]:10x_protein[T7p](open)]
19. complex[dna[PFL]:protein[T7p](open)] --> protein[T7p]+rna[PFL]+dna[PFL]
20. complex[dna[PFL]:2x_protein[T7p](open)] --> 2protein[T7p]+2rna[PFL]+dna[PFL]
21. complex[dna[PFL]:3x_protein[T7p](open)] --> 3protein[T7p]+3rna[PFL]+dna[PFL]
22. complex[dna[PFL]:4x_protein[T7p](open)] --> 4protein[T7p]+4rna[PFL]+dna[PFL]
23. complex[dna[PFL]:5x_protein[T7p](open)] --> 5protein[T7p]+5rna[PFL]+dna[PFL]
24. complex[dna[PFL]:6x_protein[T7p](open)] --> 6protein[T7p]+6rna[PFL]+dna[PFL]
25. complex[dna[PFL]:7x_protein[T7p](open)] --> 7protein[T7p]+7rna[PFL]+dna[PFL]
26. complex[dna[PFL]:8x_protein[T7p](open)] --> 8protein[T7p]+8rna[PFL]+dna[PFL]
27. complex[dna[PFL]:9x_protein[T7p](open)] --> 9protein[T7p]+9rna[PFL]+dna[PFL]
28. complex[dna[PFL]:10x_protein[T7p](open)] --> 10protein[T7p]+10rna[PFL]+dna[PFL]
29. complex[dna[PFL]:2x_protein[T7p](closed)] --> protein[T7p]+rna[PFL]+complex[dna[PFL]:protein[T7p](closed)]
30. complex[dna[PFL]:3x_protein[T7p](closed)] --> 2protein[T7p]+2rna[PFL]+complex[dna[PFL]:protein[T7p](closed)]
31. complex[dna[PFL]:4x_protein[T7p](closed)] --> 3protein[T7p]+3rna[PFL]+complex[dna[PFL]:protein[T7p](closed)]
32. complex[dna[PFL]:5x_protein[T7p](closed)] --> 4protein[T7p]+4rna[PFL]+complex[dna[PFL]:protein[T7p](closed)]
33. complex[dna[PFL]:6x_protein[T7p](closed)] --> 5protein[T7p]+5rna[PFL]+complex[dna[PFL]:protein[T7p](closed)]
34. complex[dna[PFL]:7x_protein[T7p](closed)] --> 6protein[T7p]+6rna[PFL]+complex[dna[PFL]:protein[T7p](closed)]
35. complex[dna[PFL]:8x_protein[T7p](closed)] --> 7protein[T7p]+7rna[PFL]+complex[dna[PFL]:protein[T7p](closed)]
36. complex[dna[PFL]:9x_protein[T7p](closed)] --> 8protein[T7p]+8rna[PFL]+complex[dna[PFL]:protein[T7p](closed)]
37. complex[dna[PFL]:10x_protein[T7p](closed)] --> 9protein[T7p]+9rna[PFL]+complex[dna[PFL]:protein[T7p](closed)]
38. dna[PFL]+protein[T7p] <--> complex[dna[PFL]:protein[T7p](closed)]
39. rna[PFL] --> rna[PFL]+protein[GFP]
40. dna[T7_const] --> dna[T7_const]+rna[T7_const]
41. rna[T7_const] --> rna[T7_const]+protein[T7p]
42. protein[GFP] -->
43. rna[PFL] -->
44. protein[T7p] -->
45. rna[T7_const] -->
46. rna[PFL] -->
47. rna[T7_const] -->
]
[DNAassembly: PFL
        pT7
        transcript = rna_PFL
        weak
        protein = protein_GFP, DNAassembly: T7_const
        weak
        transcript = rna_T7_const
        weak
        protein = protein_T7p]
/Users/murray/Library/CloudStorage/Dropbox/macosx/src/biocrnpyler/biocrnpyler/core/parameter.py:1550: UserWarning: parameter file contains no unit column! Please add a column named ['unit', 'units'].
  warn(
[2]:
try:
    import numpy as np
    import matplotlib.pyplot as plt

    ts = np.arange(0,5000,1)

    x0_dict = {repr(PFL_mx.dna):1.,repr(SC.dna):.1}

    R1 = CRN1.simulate_with_bioscrape_via_sbml(ts, initial_condition_dict = x0_dict, stochastic = False)
    if R1 is not None:
        fig, ax = plt.subplots(1,2,figsize=(18,8))
        ax[0].set_title('Polymerase Levels',pad=20,fontdict={'fontsize':18})
        ax[0].plot(R1[str(T7P)],linewidth=3)
        ax[0].set_xlabel('Time (sec)',labelpad=15,fontdict={'fontsize':14})
        ax[0].set_ylabel('Polymerase Count',labelpad=15,fontdict={'fontsize':14})

        ax[1].set_title('GFP Levels',pad=20,fontdict={'fontsize':18})
        ax[1].plot(R1[str(GFP)],linewidth=3,c='k')
        ax[1].set_xlabel('Time (sec)',labelpad=15,fontdict={'fontsize':14})
        ax[1].set_ylabel('[GFP]',labelpad=15,fontdict={'fontsize':14})
except ModuleNotFoundError:
    print('please install the plotting libraries: pip install biocrnpyler[all]')


../_images/examples_3._Multiple_Occupancy_in_TX-TL_11_0.png

Comparison of Transcript SS with RPU Data

Here we will do a head to head comparison with a simple transcription model built using RPU data. I consider this to effectively be the ground truth for the SS Transcript Count, although it should be noted this comparison does not necessary validate any of the pre-SS dynamics as the simple transcription model assumes immediate saturation. RPU data is from Qi et al.(2012) and RPU standard is from supplement of Nielsen et al. (2016).

[3]:
from biocrnpyler.mechanisms import Transcription_MM
# place promoter object into DNA assembly
mech_default = Transcription_MM(rnap=T7P,name='MX')
pT7 = Promoter("pT7", mechanisms = [mech_default])
PFL_default = DNAassembly('PFL',dna='T7',promoter=pT7,rbs = "weak", protein = GFP)

# make extract with T7p source and GFP and compile CRN
Test_EX = SimpleTxTlDilutionMixture(components=[PFL_default, SC],parameter_file = "default_parameters.txt")
CRN2 = Test_EX.compile_crn()
/Users/murray/Library/CloudStorage/Dropbox/macosx/src/biocrnpyler/biocrnpyler/core/parameter.py:1550: UserWarning: parameter file contains no unit column! Please add a column named ['unit', 'units'].
  warn(
[4]:
try:
    import numpy as np
    import matplotlib.pyplot as plt

    ts = np.arange(0,5000,1)
    x0_dict = {PFL_default.dna:1, SC.dna:.1}

    R2 = CRN2.simulate_with_bioscrape_via_sbml(ts, initial_condition_dict = x0_dict, stochastic = False,)
    if R2 is not None:
        fig = plt.figure(figsize=(10,6))
        plt.title('GFP Levels',pad=20,fontdict={'fontsize':18})
        plt.plot(R1[str(GFP)],linewidth=3,c='k',label='MTX Model')
        plt.plot(R2[str(GFP)],linewidth=3,c='b', label='RPU Model')
        plt.xlabel('Time (sec)',labelpad=15,fontdict={'fontsize':14})
        plt.ylabel('[GFP]',labelpad=15,fontdict={'fontsize':14})
        plt.legend(fontsize=14)

        print('\n \n')
        print(f"MX Model predicts {np.round(R1[str(str(GFP))].iloc[-1])} GFP and RPU Model predicts {np.round(R2[str(str(GFP))].iloc[-1])} GFP at SS \n \n")
except ModuleNotFoundError:
    print('please install the plotting libraries: pip install biocrnpyler[all]')





MX Model predicts 240754.0 GFP and RPU Model predicts 24745.0 GFP at SS


../_images/examples_3._Multiple_Occupancy_in_TX-TL_15_1.png

The two models seem to agree pretty well, with some minor difference. This is pretty cool given the fact that MX model uses indirect parameters (promoter affinity, isomerization and tx rates) to predict this SS value. Of course, it’s also important to keep in mind that alternative models typically do to not account for the constant sequestration of the polymerase machinery to sustain this SS transcript level. As such, they may not reflect key dynamics resulting from machinery allocation/sharing e.g. retroactivity in tx/tl.

Putative Multi-TL Model

The general model of binding, isomerization and production can be readily extended to the process of translation. However, there are several caveats for translation.

  • First of all, I don’t have any direct data like RPU experiments to compare my model with. All I can say is that with biologically reasonable parameter sets, you get something like a few 100 proteins per mRNA (RBZ in excess) and e. coli has a protein to mRNA ratio in that range (100:1 - 1000:1) (Taniguchi et al.(2010) or bionumbers book).

  • Second of all, since we’re no longer working with DNA complexes, the mRNA-RBZ complexes should be subject to degradation/dilution. However, it seems that at the level of the biology, initiation can have a stabilizing effect and for elongation it is uncertain (Roy et al. (2013)). In my simulations, I’ve effectively done as if only dilution is applied to these complexes, but there is an argument to include some form of active degradation (at a reduced rate). Depending on how this implemented, one may need to make a new degradation mechanism where the complexes effectively releases the ribosomes i.e. only mRNA degraded. This is also complicated by the fact that using subclasses like ComplexSpecies() results in inheritance of degradation/material properties.

Quick Example

PFL is transcribed through simple transcription and translated through my multi_tl mechanism. We also have a constitutive source of our RBZ being produced to provide a constant saturating concentration of RBZ.

[5]:
from biocrnpyler.mixtures import TxTlDilutionMixture
from biocrnpyler.mechanisms import multi_tl

#the most important parameters for multi_tl
#max_occ is the number of ribosomes that can bind to a transcript
#k_iso is the rate of isomerization
parameters = {"max_occ":2, "k_iso":10}

#Create a DNA assembly and Mixture
PFL = DNAassembly('PFL', dna='T7', rbs='medium', promoter='medium',transcript='GFP',protein='GFP')
EM = TxTlDilutionMixture(name = 'e coli',components=[PFL], parameter_file = "default_parameters.txt", parameters = parameters)

# Instantiate mechanism and pass it the ribosome
ML = multi_tl(EM.ribosome.get_species())

#Overwrite the translation mechanism
EM.add_mechanism(ML, overwrite = True)

CRN3 = EM.compile_crn()
print(CRN3.pretty_print(show_rates = False))
Species(N = 29) = {
    protein[Ribo(machinery)] (@ 120.0),
    found_key=(mech=None, partid=e coli, name=Ribo).
    search_key=(mech=initial concentration, partid=e coli, name=Ribo).

    protein[RNAase(machinery)] (@ 30.0),
    found_key=(mech=None, partid=e coli, name=RNAase).
    search_key=(mech=initial concentration, partid=e coli, name=RNAase).

    protein[RNAP(machinery)] (@ 15.0),
    found_key=(mech=None, partid=e coli, name=RNAP).
    search_key=(mech=initial concentration, partid=e coli, name=RNAP).

    complex[protein[Ribo]:rna[cellular_processes](closed)] (@ 0),
    complex[protein[Ribo]:rna[cellular_processes](open)] (@ 0),
    complex[protein[Ribo]:rna[GFP](closed)] (@ 0),
    complex[protein[Ribo]:rna[GFP](open)] (@ 0),
    complex[2x_protein[Ribo]:rna[cellular_processes](closed)] (@ 0),
    complex[2x_protein[Ribo]:rna[cellular_processes](open)] (@ 0),
    complex[2x_protein[Ribo]:rna[GFP](closed)] (@ 0),
    complex[2x_protein[Ribo]:rna[GFP](open)] (@ 0),
    complex[protein[RNAase]:rna[cellular_processes]] (@ 0),
    complex[protein[RNAase]:rna[GFP]] (@ 0),
    complex[dna[cellular_processes]:protein[RNAP]] (@ 0),
    complex[dna[T7]:protein[RNAP]] (@ 0),
    complex[complex[protein[Ribo]:rna[cellular_processes]]:protein[RNAase]] (@ 0),
    complex[complex[protein[Ribo]:rna[cellular_processes]]:protein[RNAase]] (@ 0),
    complex[complex[protein[Ribo]:rna[GFP]]:protein[RNAase]] (@ 0),
    complex[complex[protein[Ribo]:rna[GFP]]:protein[RNAase]] (@ 0),
    complex[complex[2x_protein[Ribo]:rna[cellular_processes]]:protein[RNAase]] (@ 0),
    complex[complex[2x_protein[Ribo]:rna[cellular_processes]]:protein[RNAase]] (@ 0),
    complex[complex[2x_protein[Ribo]:rna[GFP]]:protein[RNAase]] (@ 0),
    complex[complex[2x_protein[Ribo]:rna[GFP]]:protein[RNAase]] (@ 0),
    protein[cellular_processes] (@ 0),
    rna[cellular_processes] (@ 0),
    dna[cellular_processes] (@ 0),
    dna[T7] (@ 0),
    protein[GFP] (@ 0),
    rna[GFP] (@ 0),
}

Reactions (42) = [
0. dna[T7]+protein[RNAP(machinery)] <--> complex[dna[T7]:protein[RNAP]]
1. complex[dna[T7]:protein[RNAP]] --> dna[T7]+rna[GFP]+protein[RNAP(machinery)]
2. rna[GFP]+protein[Ribo(machinery)] <--> complex[protein[Ribo]:rna[GFP](closed)]
3. complex[protein[Ribo]:rna[GFP](closed)] --> complex[protein[Ribo]:rna[GFP](open)]
4. complex[2x_protein[Ribo]:rna[GFP](closed)] --> complex[2x_protein[Ribo]:rna[GFP](open)]
5. protein[Ribo(machinery)]+complex[protein[Ribo]:rna[GFP](open)] <--> complex[2x_protein[Ribo]:rna[GFP](closed)]
6. complex[protein[Ribo]:rna[GFP](open)] --> protein[Ribo(machinery)]+protein[GFP]+rna[GFP]
7. complex[2x_protein[Ribo]:rna[GFP](open)] --> 2protein[Ribo(machinery)]+2protein[GFP]+rna[GFP]
8. complex[2x_protein[Ribo]:rna[GFP](closed)] --> protein[Ribo(machinery)]+protein[GFP]+complex[protein[Ribo]:rna[GFP](closed)]
9. dna[cellular_processes]+protein[RNAP(machinery)] <--> complex[dna[cellular_processes]:protein[RNAP]]
10. complex[dna[cellular_processes]:protein[RNAP]] --> dna[cellular_processes]+rna[cellular_processes]+protein[RNAP(machinery)]
11. rna[cellular_processes]+protein[Ribo(machinery)] <--> complex[protein[Ribo]:rna[cellular_processes](closed)]
12. complex[protein[Ribo]:rna[cellular_processes](closed)] --> complex[protein[Ribo]:rna[cellular_processes](open)]
13. complex[2x_protein[Ribo]:rna[cellular_processes](closed)] --> complex[2x_protein[Ribo]:rna[cellular_processes](open)]
14. protein[Ribo(machinery)]+complex[protein[Ribo]:rna[cellular_processes](open)] <--> complex[2x_protein[Ribo]:rna[cellular_processes](closed)]
15. complex[protein[Ribo]:rna[cellular_processes](open)] --> protein[Ribo(machinery)]+protein[cellular_processes]+rna[cellular_processes]
16. complex[2x_protein[Ribo]:rna[cellular_processes](open)] --> 2protein[Ribo(machinery)]+2protein[cellular_processes]+rna[cellular_processes]
17. complex[2x_protein[Ribo]:rna[cellular_processes](closed)] --> protein[Ribo(machinery)]+protein[cellular_processes]+complex[protein[Ribo]:rna[cellular_processes](closed)]
18. complex[protein[Ribo]:rna[cellular_processes](closed)]+protein[RNAase(machinery)] <--> complex[complex[protein[Ribo]:rna[cellular_processes]]:protein[RNAase]]
19. complex[complex[protein[Ribo]:rna[cellular_processes]]:protein[RNAase]] --> protein[Ribo(machinery)]+protein[RNAase(machinery)]
20. complex[2x_protein[Ribo]:rna[cellular_processes](open)]+protein[RNAase(machinery)] <--> complex[complex[2x_protein[Ribo]:rna[cellular_processes]]:protein[RNAase]]
21. complex[complex[2x_protein[Ribo]:rna[cellular_processes]]:protein[RNAase]] --> 2protein[Ribo(machinery)]+protein[RNAase(machinery)]
22. complex[protein[Ribo]:rna[GFP](closed)]+protein[RNAase(machinery)] <--> complex[complex[protein[Ribo]:rna[GFP]]:protein[RNAase]]
23. complex[complex[protein[Ribo]:rna[GFP]]:protein[RNAase]] --> protein[Ribo(machinery)]+protein[RNAase(machinery)]
24. complex[2x_protein[Ribo]:rna[GFP](closed)]+protein[RNAase(machinery)] <--> complex[complex[2x_protein[Ribo]:rna[GFP]]:protein[RNAase]]
25. complex[complex[2x_protein[Ribo]:rna[GFP]]:protein[RNAase]] --> 2protein[Ribo(machinery)]+protein[RNAase(machinery)]
26. complex[protein[Ribo]:rna[GFP](open)]+protein[RNAase(machinery)] <--> complex[complex[protein[Ribo]:rna[GFP]]:protein[RNAase]]
27. complex[complex[protein[Ribo]:rna[GFP]]:protein[RNAase]] --> protein[Ribo(machinery)]+protein[RNAase(machinery)]
28. rna[GFP]+protein[RNAase(machinery)] <--> complex[protein[RNAase]:rna[GFP]]
29. complex[protein[RNAase]:rna[GFP]] --> protein[RNAase(machinery)]
30. rna[cellular_processes]+protein[RNAase(machinery)] <--> complex[protein[RNAase]:rna[cellular_processes]]
31. complex[protein[RNAase]:rna[cellular_processes]] --> protein[RNAase(machinery)]
32. complex[protein[Ribo]:rna[cellular_processes](open)]+protein[RNAase(machinery)] <--> complex[complex[protein[Ribo]:rna[cellular_processes]]:protein[RNAase]]
33. complex[complex[protein[Ribo]:rna[cellular_processes]]:protein[RNAase]] --> protein[Ribo(machinery)]+protein[RNAase(machinery)]
34. complex[2x_protein[Ribo]:rna[cellular_processes](closed)]+protein[RNAase(machinery)] <--> complex[complex[2x_protein[Ribo]:rna[cellular_processes]]:protein[RNAase]]
35. complex[complex[2x_protein[Ribo]:rna[cellular_processes]]:protein[RNAase]] --> 2protein[Ribo(machinery)]+protein[RNAase(machinery)]
36. complex[2x_protein[Ribo]:rna[GFP](open)]+protein[RNAase(machinery)] <--> complex[complex[2x_protein[Ribo]:rna[GFP]]:protein[RNAase]]
37. complex[complex[2x_protein[Ribo]:rna[GFP]]:protein[RNAase]] --> 2protein[Ribo(machinery)]+protein[RNAase(machinery)]
38. protein[cellular_processes] -->
39. protein[GFP] -->
40. rna[GFP] -->
41. rna[cellular_processes] -->
]
/Users/murray/Library/CloudStorage/Dropbox/macosx/src/biocrnpyler/biocrnpyler/core/parameter.py:1550: UserWarning: parameter file contains no unit column! Please add a column named ['unit', 'units'].
  warn(
[6]:
try:

    import numpy as np
    import matplotlib.pyplot as plt

    ts = np.arange(0,10000,1)
    x0_dict = {PFL.dna:1, EM.ribosome.get_species():100,  EM.rnap.get_species():20}

    R3 = CRN3.simulate_with_bioscrape_via_sbml(ts, initial_condition_dict = x0_dict, stochastic = False,)

    if R3 is not None:
        fig, ax = plt.subplots(1,2,figsize=(18,8))
        ax[0].set_title('GFP Protein Levels',pad=20,fontdict={'fontsize':18})
        ax[0].plot(R3[str(PFL.protein)],linewidth=3)
        #ax[0].plot(R3[str(EM.ribosome.get_species())],linewidth=3)
        ax[0].set_xlabel('Time (sec)',labelpad=15,fontdict={'fontsize':14})
        ax[0].set_ylabel('GFP Protein Count',labelpad=15,fontdict={'fontsize':14})

        ax[1].set_title('GFP Transcript Levels',pad=20,fontdict={'fontsize':18})
        ax[1].plot(R3[str(PFL.transcript)],linewidth=3,c='k')
        ax[1].set_xlabel('Time (sec)',labelpad=15,fontdict={'fontsize':14})
        ax[1].set_ylabel('GFP Transcript Count',labelpad=15,fontdict={'fontsize':14})
except ModuleNotFoundError:
    print('please install the plotting libraries: pip install biocrnpyler[all]')


../_images/examples_3._Multiple_Occupancy_in_TX-TL_21_0.png

Future Work

  • Want to do more rigorous validation of multi-tx mechanism. As part of that, I first plan on comparing RPU data of existing consitutive promoters and non-native polymerase expression systems e.g. T5 with what the multi-tx model would predict.

  • Is there data out there that would help validate the predicted RNAp occupancy of genes from the multi-tx model (same story for multi-tl model)?

  • Eventually want to develop a multi-tx mechanism that can be used for TF-mediated transcription.

  • Start looking towards validating multi-tl model, currently plan on seeing what data and parameters I could scrape from existing resource e.g. BCD RBS binding rates from biocrnpyler.

  • Do some model comparison using bioscrape inference, where I generate parameters with RPU data model and fit parameters (vary known and unknown parameters) from the MTX model. Definitely very interesting for deriving isomerization rates as that seems hard to come by in literature and seems to be a key part of the model in determining system behaviour (Pre-SS and SS dynamics).

References

T7 parameters:

  • Promoter Binding and Unbinding: Jia, Y., Kumar, A., & Patel, S. S. (1996). Equilibrium and Stopped-flow Kinetic Studies of Interaction between T7 RNA Polymerase and Its Promoters Measured by Protein and 2-Aminopurine Fluorescence Changes. Journal of Biological Chemistry , 271(48), 30451–30458. https://doi.org/10.1074/jbc.271.48.30451

  • Isomerization Rate: Skinner, G. M., Baumann, C. G., Quinn, D. M., Molloy, J. E., & Hoggett, J. G. (2004). Promoter Binding, Initiation, and Elongation By Bacteriophage T7 RNA Polymerase: A SINGLE-MOLECULE VIEW OF THE TRANSCRIPTION CYCLE . Journal of Biological Chemistry , 279(5), 3239–3244. https://doi.org/10.1074/jbc.M310471200

  • Translation Rate (T7p is VERY fast): Kochetkov, S. N., Rusakova, E. E., & Tunitskaya, V. L. (1998). Recent studies of T7 RNA polymerase mechanism. FEBS Letters, 440(3), 264–267. https://doi.org/https://doi.org/10.1016/S0014-5793(98)01484-7

Translation Parameters:

  • RBS Binding and Unbinding: Chandra, F., & Del Vecchio, D. (2016). The Effects of Ribosome Autocatalysis and Negative Feedback in Resource Competition. bioRxiv. https://doi.org/10.1101/042127

  • Isomerization Rate: Draper, D. E. (1993). Mechanisms of Translational Initiation and Repression in Prokaryotes BT - The Translational Apparatus: Structure, Function, Regulation, Evolution. In K. H. Nierhaus, F. Franceschi, A. R. Subramanian, V. A. Erdmann, & B. Wittmann-Liebold (Eds.) (pp. 197–207). Boston, MA: Springer US. https://doi.org/10.1007/978-1-4615-2407-6_19

Misc:

  • mRNA Degradation: Roy, B., & Jacobson, A. (2013). The intimate relationships of mRNA decay and translation. Trends in Genetics : TIG, 29(12), 691–699. https://doi.org/10.1016/j.tig.2013.09.002

  • RPU Data: Nielsen, A. A. K., Der, B. S., Shin, J., Vaidyanathan, P., Paralanov, V., Strychalski, E. A., … Voigt, C. A. (2016). Genetic circuit design automation. Science, 352(6281), aac7341. https://doi.org/10.1126/science.aac7341 and Qi, L., Haurwitz, R. E., Shao, W., Doudna, J. A., & Arkin, A. P. (2012). RNA processing enables predictable programming of gene expression. Nature Biotechnology, 30(10), 1002–1006. https://doi.org/10.1038/nbt.2355

  • Protein:mRNA ratios: Taniguchi, Y., Choi, P. J., Li, G.-W., Chen, H., Babu, M., Hearn, J., … Xie, X. S. (2010). Quantifying E. coli Proteome and Transcriptome with Single-Molecule Sensitivity in Single Cells. Science, 329(5991), 533 LP – 538. https://doi.org/10.1126/science.1188308

[7]:
# End