Toggle Switch

Intro

The Toggle Switch is a seminal synthetic biological circuit that consists of two mutually repressing operons, [Gardner2000] with lacI being regulated by a Plambda promoter and cI (a repressor of Plambda) being in turn regulated by Plac. The operon that codes for CI also codes for green fluorescent protein (GFP). Using this repressor pair allows the toggle switch to be activated by induction via IPTG and deactivated via aTc. The negative feedback cycle ensures that the switch maintain its on-or-off state even when the triggering inducer is washed out. The bistable behaviour of the switch depends on the cooperativity of the repressor proteins - more specifically, on the right choice of regulators and promoters and their correct dimerization.

Below we simulate the toggle switch in four separate scenarios, each one initialized with the average final state of the previous simulation. That is, we first suspended the cell in a region rich in IPTG and simulate its response in CI, LacI, and GFP production over a period of one hour. We then use the average of the total CI, LacI, and GFP concentrations as initial values for CI, LacI, and GFP for simulation of the cell in an IPTG-depleted region. Again, the average final state after one hour is used to initialize the cell state in a region rich in aTc, a.s.o.

IBL Modelling

Outlined below are the four Toggle Switch IBL models, corresponding to the four scenarios described above, while the corresponding IBL files can be downloaded here.

Toggle Switch Scenario 1

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
     define ToggleSwitchCell typeof CELL()
     {
             LacI   = PROTEIN()
             CI     = PROTEIN()
             GFP    = PROTEIN()

             Plac    = PROMOTER(URI="http://parts.igem.org/Part:BBa_R0010")
             Plambda = PROMOTER(URI="http://parts.igem.org/Part:BBa_R0051")
             cI      = GENE(URI="http://parts.igem.org/Part:BBa_K105004")
             gfp     = GENE(URI="http://parts.igem.org/Part:BBa_E0040")
             lacI    = GENE(URI="http://parts.igem.org/Part:BBa_C0012")

             IPTG = MOLECULE(concentration=10 uM)
             aTc  = MOLECULE()

             RULE iptg_induction : IPTG + LacI <-> LacI~IPTG
             iptg_induction.forwardRate = 1e0 min-1
             iptg_induction.backwardRate = 50 min-1

             RULE atc_induction : aTc + CI <-> aTc~CI
             atc_induction.forwardRate = 1e0 min-1
             atc_induction.backwardRate = 50 min-1

             RULE lac_dimerization : LacI + LacI <-> LacI~LacI
             lac_dimerization.forwardRate = 1e0 min-1
             lac_dimerization.backwardRate = 125 min-1

             RULE cI_dimerization : CI + CI <-> CI~CI
             cI_dimerization.forwardRate = 1e0 min-1
             cI_dimerization.backwardRate = 125 min-1

             // cI degradation
             RULE cI_degradation : CI ->
             cI_degradation.forwardRate = 4.2e-1 min-1

             // LacI degradation
             RULE lac_degradation : LacI ->
             lac_degradation.forwardRate = 13.2e0 min-1

             RULE gfp_degradation : GFP ->
             gfp_degradation.forwardRate = 6.2e-2 min-1 // 13.216397448e-3 min-1 from Gardner data // 2.5e-2 min-1 // from Andersen et al. Appl Env Microbiol (1998) 64(6):2240-2246

             operon_1 = DEVICE(
                     parts=[Plac,cI,gfp],
                     input=[LacI~LacI],
                     output=[CI,GFP]
             )
             {
                     rna = RNA()

                     // repression
                     RULE repression : Plac + LacI~LacI <-> Plac~LacI~LacI
                     repression.forwardRate = 1e0 min-1
                     repression.backwardRate = 10 min-1

                     // transcription
                     RULE transcription : Plac -> Plac + rna
                     transcription.forwardRate = 1.e0 min-1

                     // translation
                     RULE translation : rna -> rna + CI + GFP
                     translation.forwardRate = 100 min-1

                     // rna degradation
                     RULE rna_degradation : rna ->
                     rna_degradation.forwardRate = 1e-1 min-1
             }

             operon_2 = DEVICE(
                     parts=[Plambda,lacI],
                     input=[CI~CI],
                     output=[LacI]
             )
             {
                     rna = RNA()

                     // repression
                     RULE repression : Plambda + CI~CI <-> Plambda~CI~CI
                     repression.forwardRate = 1e0 min-1
                     repression.backwardRate = 10 min-1

                     // transcription
                     RULE transcription : Plambda -> Plambda + rna
                     transcription.forwardRate = 1.e0 min-1

                     // translation
                     RULE translation : rna -> rna + LacI
                     translation.forwardRate = 100 min-1

                     // rna degradation
                     RULE rna_degradation : rna ->
                     rna_degradation.forwardRate = 1e-1 min-1

                     ATGC DIRECTION : BACKWARD
             }

             ATGC ARRANGE Plambda,Plac

             VERIFY [ IPTG >= 10uM ] IS FOLLOWED BY [ GFP > 10uM ]
             VERIFY [ IPTG >= 10uM ] IS FOLLOWED BY [ GFP > 10uM ] WITH PROBABILITY?

     }

      define site typeof REGION() {
             CELL cell = new ToggleSwitchCell()
     }

Toggle Switch Scenario 2

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
     define ToggleSwitchCell typeof CELL()
     {
             LacI   = PROTEIN(concentration=0.1 uM)
             CI     = PROTEIN(concentration=2 uM)
             GFP    = PROTEIN(concentration=10 uM)

             Plac    = PROMOTER(URI="http://parts.igem.org/Part:BBa_R0010")
             Plambda = PROMOTER(URI="http://parts.igem.org/Part:BBa_R0051")
             cI      = GENE(URI="http://parts.igem.org/Part:BBa_K105004")
             gfp     = GENE(URI="http://parts.igem.org/Part:BBa_E0040")
             lacI    = GENE(URI="http://parts.igem.org/Part:BBa_C0012")

             IPTG = MOLECULE()
             aTc  = MOLECULE()

             RULE iptg_induction : IPTG + LacI <-> LacI~IPTG
             iptg_induction.forwardRate = 1e0 min-1
             iptg_induction.backwardRate = 50 min-1

             RULE atc_induction : aTc + CI <-> aTc~CI
             atc_induction.forwardRate = 1e0 min-1
             atc_induction.backwardRate = 50 min-1

             RULE lac_dimerization : LacI + LacI <-> LacI~LacI
             lac_dimerization.forwardRate = 1e0 min-1
             lac_dimerization.backwardRate = 125 min-1

             RULE cI_dimerization : CI + CI <-> CI~CI
             cI_dimerization.forwardRate = 1e0 min-1
             cI_dimerization.backwardRate = 125 min-1

             /// cI degradation
             RULE cI_degradation : CI ->
             cI_degradation.forwardRate = 4.2e-1 min-1

             // LacI degradation
             RULE lac_degradation : LacI ->
             lac_degradation.forwardRate = 13.2e0 min-1

             RULE gfp_degradation : GFP ->
             gfp_degradation.forwardRate = 6.2e-2 min-1 // 13.216397448e-3 min-1 from Gardner data // 2.5e-2 min-1 // from Andersen et al. Appl Env Microbiol (1998) 64(6):2240-2246

             repressor1 = DEVICE(
                     parts=[Plac,cI,gfp],
                     input=[LacI~LacI],
                     output=[CI,GFP]
             )
             {
                     rna = RNA()

                     // repression
                     RULE repression : Plac + LacI~LacI <-> Plac~LacI~LacI
                     repression.forwardRate = 1e0 min-1
                     repression.backwardRate = 10 min-1

                     // transcription
                     RULE transcription : Plac -> Plac + rna
                     transcription.forwardRate = 1.e0 min-1

                     // translation
                     RULE translation : rna -> rna + CI + GFP
                     translation.forwardRate = 100 min-1

                     // rna degradation
                     RULE rna_degradation : rna ->
                     rna_degradation.forwardRate = 1e-1 min-1
             }

             repressor2 = DEVICE(
                     parts=[Plambda,lacI],
                     input=[CI~CI],
                     output=[LacI]
             )
             {
                     rna = RNA()

                     // repression
                     RULE repression : Plambda + CI~CI <-> Plambda~CI~CI
                     repression.forwardRate = 1e0 min-1
                     repression.backwardRate = 10 min-1

                     // transcription
                     RULE transcription : Plambda -> Plambda + rna
                     transcription.forwardRate = 1.e0 min-1

                     // translation
                     RULE translation : rna -> rna + LacI
                     translation.forwardRate = 100 min-1

                     // rna degradation
                     RULE rna_degradation : rna ->
                     rna_degradation.forwardRate = 1e-1 min-1
                     ATGC DIRECTION : BACKWARD
             }

             ATGC ARRANGE Plambda,Plac

             VERIFY [ IPTG >= 0uM ]  IS FOLLOWED BY [ GFP/CI > 10] WITH PROBABILITY?
     }

     define site typeof REGION() {
             CELL cell = new ToggleSwitchCell()
     }

Toggle Switch Scenario 3

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
     define ToggleSwitchCell typeof CELL()
     {
             LacI   = PROTEIN(concentration=0.1 uM)
             CI     = PROTEIN(concentration=2 uM)
             GFP    = PROTEIN(concentration=40 uM)

             Plac    = PROMOTER(URI="http://parts.igem.org/Part:BBa_R0010")
             Plambda = PROMOTER(URI="http://parts.igem.org/Part:BBa_R0051")
             cI      = GENE(URI="http://parts.igem.org/Part:BBa_K105004")
             gfp     = GENE(URI="http://parts.igem.org/Part:BBa_E0040")
             lacI    = GENE(URI="http://parts.igem.org/Part:BBa_C0012")

             IPTG = MOLECULE()
             aTc  = MOLECULE(concentration=100 uM)

             RULE iptg_induction : IPTG + LacI <-> LacI~IPTG
             iptg_induction.forwardRate = 1e0 min-1
             iptg_induction.backwardRate = 50 min-1

             RULE atc_induction : aTc + CI <-> aTc~CI
             atc_induction.forwardRate = 1e0 min-1
             atc_induction.backwardRate = 50 min-1

             RULE lac_dimerization : LacI + LacI <-> LacI~LacI
             lac_dimerization.forwardRate = 1e0 min-1
             lac_dimerization.backwardRate = 125 min-1

             RULE cI_dimerization : CI + CI <-> CI~CI
             cI_dimerization.forwardRate = 1e0 min-1
             cI_dimerization.backwardRate = 125 min-1

        // cI degradation
             RULE cI_degradation : CI ->
             cI_degradation.forwardRate = 13.2e0 min-1

             // LacI degradation
             RULE lac_degradation : LacI ->
             lac_degradation.forwardRate = 4.2e-1 min-1

             RULE gfp_degradation : GFP ->
             gfp_degradation.forwardRate = 6.2e-2 min-1  // 13.216397448e-3 min-1 from Gardner data // 2.5e-2 min-1 // from Andersen et al. Appl Env Microbiol (1998) 64(6):2240-2246

             repressor1 = DEVICE(
                     parts=[Plac,cI,gfp],
                     input=[LacI~LacI],
                     output=[CI,GFP]
             )
             {
                     rna = RNA()

                     // repression
                     RULE repression : Plac + LacI~LacI <-> Plac~LacI~LacI
                     repression.forwardRate = 1e0 min-1
                     repression.backwardRate = 10 min-1

                     // transcription
                     RULE transcription : Plac -> Plac + rna
                     transcription.forwardRate = 1.e0 min-1

                     // translation
                     RULE translation : rna -> rna + CI + GFP
                     translation.forwardRate = 100 min-1

                     // rna degradation
                     RULE rna_degradation : rna ->
                     rna_degradation.forwardRate = 1e-1 min-1
             }

             repressor2 = DEVICE(
                     parts=[Plambda,lacI],
                     input=[CI~CI],
                     output=[LacI]
             )
             {
                     rna = RNA()

                     // repression
                     RULE repression : Plambda + CI~CI <-> Plambda~CI~CI
                     repression.forwardRate = 1e0 min-1
                     repression.backwardRate = 10 min-1

                     // transcription
                     RULE transcription : Plambda -> Plambda + rna
                     transcription.forwardRate = 1.e0 min-1

                     // translation
                     RULE translation : rna -> rna + LacI
                     translation.forwardRate = 100 min-1

                     // rna degradation
                     RULE rna_degradation : rna ->
                     rna_degradation.forwardRate = 1e-1 min-1
                     ATGC DIRECTION : BACKWARD
             }

             ATGC ARRANGE Plambda,Plac

             VERIFY [GFP] EVENTUALLY DECREASES WITH PROBABILITY ? GIVEN [aTc=100 uM]

     }

      define site typeof REGION() {
             CELL cell = new ToggleSwitchCell()
     }

Toggle Switch Scenario 4

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
     define ToggleSwitchCell typeof CELL()
     {
             LacI   = PROTEIN(concentration=2 uM)
             CI = PROTEIN(concentration=0.1 uM)
             GFP    = PROTEIN(concentration=23 uM)

             Plac    = PROMOTER(URI="http://parts.igem.org/Part:BBa_R0010")
             Plambda = PROMOTER(URI="http://parts.igem.org/Part:BBa_R0051")
             cI      = GENE(URI="http://parts.igem.org/Part:BBa_K105004")
             gfp     = GENE(URI="http://parts.igem.org/Part:BBa_E0040")
             lacI    = GENE(URI="http://parts.igem.org/Part:BBa_C0012")

             IPTG = MOLECULE()
             aTc  = MOLECULE()

             RULE iptg_induction : IPTG + LacI <-> LacI~IPTG
             iptg_induction.forwardRate = 1e0 min-1
             iptg_induction.backwardRate = 50 min-1

             RULE atc_induction : aTc + CI <-> aTc~CI
             atc_induction.forwardRate = 1e0 min-1
             atc_induction.backwardRate = 50 min-1

             RULE lac_dimerization : LacI + LacI <-> LacI~LacI
             lac_dimerization.forwardRate = 1e0 min-1
             lac_dimerization.backwardRate = 125 min-1

             RULE cI_dimerization : CI + CI <-> CI~CI
             cI_dimerization.forwardRate = 1e0 min-1
             cI_dimerization.backwardRate = 125 min-1

             // cI degradation
             RULE cI_degradation : CI ->
             cI_degradation.forwardRate = 13.2e0 min-1

             // LacI degradation
             RULE lac_degradation : LacI ->
             lac_degradation.forwardRate = 4.2e-1 min-1

             RULE gfp_degradation : GFP ->
             gfp_degradation.forwardRate = 6.2e-2 min-1  // 13.216397448e-3 min-1 from Gardner data // 2.5e-2 min-1 // from Andersen et al. Appl Env Microbiol (1998) 64(6):2240-2246

             repressor1 = DEVICE(
                     parts=[Plac,cI,gfp],
                     input=[LacI~LacI],
                     output=[CI,GFP]
             )
             {
                     rna = RNA()

                     // repression
                     RULE repression : Plac + LacI~LacI <-> Plac~LacI~LacI
                     repression.forwardRate = 1e0 min-1
                     repression.backwardRate = 10 min-1

                     // transcription
                     RULE transcription : Plac -> Plac + rna
                     transcription.forwardRate = 1.e0 min-1

                     // translation
                     RULE translation : rna -> rna + CI + GFP
                     translation.forwardRate = 100 min-1

                     // rna degradation
                     RULE rna_degradation : rna ->
                     rna_degradation.forwardRate = 1e-1 min-1
             }

             repressor2 = DEVICE(
                     parts=[Plambda,lacI],
                     input=[CI~CI],
                     output=[LacI]
             )
             {
                     rna = RNA()

                     // repression
                     RULE repression : Plambda + CI~CI <-> Plambda~CI~CI
                     repression.forwardRate = 1e0 min-1
                     repression.backwardRate = 10 min-1

                     // transcription
                     RULE transcription : Plambda -> Plambda + rna
                     transcription.forwardRate = 1.e0 min-1

                     // translation
                     RULE translation : rna -> rna + LacI
                     translation.forwardRate = 100 min-1

                     // rna degradation
                     RULE rna_degradation : rna ->
                     rna_degradation.forwardRate = 1e-1 min-1
                     ATGC DIRECTION : BACKWARD
             }

             ATGC ARRANGE Plambda,Plac

     }

      define site typeof REGION() {
             CELL cell = new ToggleSwitchCell()
     }

Simulation

In order to analyse the evolution in the concentration of GFP (red), CI (green) and LacI (orange), stochastic simulation has been performed for each of the four scenarios presented above, using the following parameters:

  • Max Time: 1000 seconds;
  • Interval: 10 seconds;
  • Number of runs: 50;
  • Gillespie algorithm: Direct Method.

Toggle Switch Scenario 1

The cell is suspended in IPTG, leading to the activation of the switch and production of GFP and CI.

Toggle Switch Scenario 1 Simulation

Toggle Switch Scenario 2

CI and GFP production is maintained, despite the absence of IPTG.

Toggle Switch Scenario 2 Simulation

Toggle Switch Scenario 3

The cell is suspended in aTc, leading to the deactivation of the switch, production of LacI and decay of GFP.

Toggle Switch Scenario 3 Simulation

Toggle Switch Scenario 4

The switch resides in its off state, despite the absence of aTc.

Toggle Switch Scenario 4 Simulation

Verification

The properties below have been verified in order to validate the system behaviour. The verification has been performed using the embedded Prism and MC2 model checkers.

  1. The suspension of the cell with IPTG will lead to the production of GFP;
  2. Once the cell is suspended with IPTG, the GFP concentration will eventually exceed 10uM, with a probability of 79%;
  3. GFP is produced at least 10 times more than CI, despite the absence of IPTG, with a probability of 49%;
  4. GFP production will decline if the cell is suspended with aTc.
# Verification Statement Result
1 VERIFY [IPTG >= 10 uM] IS FOLLOWED BY [GFP > 10 uM] True
2 VERIFY [IPTG >= 10 uM] IS FOLLOWED BY [GFP > 10 uM] WITH PROBABILITY ? 79%
3 VERIFY [IPTG = 0 uM] IS FOLLOWED BY [GFP/CI > 10] WITH PROBABILITY ? 49%
4 VERIFY [GFP] EVENTUALLY DECREASES WITH PROBABILITY ? GIVEN [aTc = 100 uM] 100%

Biocompilation

Depicted below is the biocompilation result of the Toggle Switch specification.

Toggle Switch Biocompilation