y_petri 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +20 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +31 -0
- data/Rakefile +2 -0
- data/lib/y_petri/demonstrator.rb +164 -0
- data/lib/y_petri/demonstrator_2.rb +176 -0
- data/lib/y_petri/demonstrator_3.rb +150 -0
- data/lib/y_petri/demonstrator_4.rb +217 -0
- data/lib/y_petri/manipulator.rb +598 -0
- data/lib/y_petri/net.rb +458 -0
- data/lib/y_petri/place.rb +189 -0
- data/lib/y_petri/simulation.rb +1313 -0
- data/lib/y_petri/timed_simulation.rb +281 -0
- data/lib/y_petri/transition.rb +921 -0
- data/lib/y_petri/version.rb +3 -0
- data/lib/y_petri/workspace/instance_methods.rb +254 -0
- data/lib/y_petri/workspace/parametrized_subclassing.rb +26 -0
- data/lib/y_petri/workspace.rb +16 -0
- data/lib/y_petri.rb +141 -0
- data/test/simple_manual_examples.rb +28 -0
- data/test/y_petri_graph.png +0 -0
- data/test/y_petri_test.rb +1521 -0
- data/y_petri.gemspec +21 -0
- metadata +112 -0
    
        checksums.yaml
    ADDED
    
    | @@ -0,0 +1,7 @@ | |
| 1 | 
            +
            ---
         | 
| 2 | 
            +
            SHA1:
         | 
| 3 | 
            +
              metadata.gz: 1347ac63d577bc10cd1097a90b6aec47bdfda2a9
         | 
| 4 | 
            +
              data.tar.gz: 792b0903dae48bd92ccc12058780c6a4c1a33e9e
         | 
| 5 | 
            +
            SHA512:
         | 
| 6 | 
            +
              metadata.gz: 32780effaa62b9d5637b21d57246b7d64ce6ec9ba21edfdfd6c40c22e3c343e210e1ed422e0540d6bc7c05d3f2a780a5ca9ef213802697e4af7e54a0041926c2
         | 
| 7 | 
            +
              data.tar.gz: cc7e2eb8d2de3b44d7cd4a2691d3ec32031f2a1a71125cc22e655a18a55c71d78ce1b6be41820399e625c1ed5c5ed842095ad7e2529def359dad8410704bd543
         | 
    
        data/.gitignore
    ADDED
    
    
    
        data/Gemfile
    ADDED
    
    
    
        data/LICENSE
    ADDED
    
    | @@ -0,0 +1,22 @@ | |
| 1 | 
            +
            Copyright (c) 2012 boris
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            MIT License
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            Permission is hereby granted, free of charge, to any person obtaining
         | 
| 6 | 
            +
            a copy of this software and associated documentation files (the
         | 
| 7 | 
            +
            "Software"), to deal in the Software without restriction, including
         | 
| 8 | 
            +
            without limitation the rights to use, copy, modify, merge, publish,
         | 
| 9 | 
            +
            distribute, sublicense, and/or sell copies of the Software, and to
         | 
| 10 | 
            +
            permit persons to whom the Software is furnished to do so, subject to
         | 
| 11 | 
            +
            the following conditions:
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            The above copyright notice and this permission notice shall be
         | 
| 14 | 
            +
            included in all copies or substantial portions of the Software.
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
         | 
| 17 | 
            +
            EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
         | 
| 18 | 
            +
            MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
         | 
| 19 | 
            +
            NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
         | 
| 20 | 
            +
            LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
         | 
| 21 | 
            +
            OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
         | 
| 22 | 
            +
            WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
         | 
    
        data/README.md
    ADDED
    
    | @@ -0,0 +1,31 @@ | |
| 1 | 
            +
            # YPetri
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            y_petri is a Petri net domain model and simulator
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            ## Installation
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            Add this line to your application's Gemfile:
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                gem 'y_petri'
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            And then execute:
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                $ bundle
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            Or install it yourself as:
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                $ gem install y_petri
         | 
| 18 | 
            +
             | 
| 19 | 
            +
            ## Usage
         | 
| 20 | 
            +
             | 
| 21 | 
            +
            y_petri can be used either interactively (in irb with
         | 
| 22 | 
            +
            'include YPetri'), or from another program. YPetri::Manipulator
         | 
| 23 | 
            +
            provides the command interface.
         | 
| 24 | 
            +
             | 
| 25 | 
            +
            ## Contributing
         | 
| 26 | 
            +
             | 
| 27 | 
            +
            1. Fork it
         | 
| 28 | 
            +
            2. Create your feature branch (`git checkout -b my-new-feature`)
         | 
| 29 | 
            +
            3. Commit your changes (`git commit -am 'Added some feature'`)
         | 
| 30 | 
            +
            4. Push to the branch (`git push origin my-new-feature`)
         | 
| 31 | 
            +
            5. Create new Pull Request
         | 
    
        data/Rakefile
    ADDED
    
    
| @@ -0,0 +1,164 @@ | |
| 1 | 
            +
            #encoding: utf-8
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'y_petri'
         | 
| 4 | 
            +
            include YPetri
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            # general assumptions
         | 
| 7 | 
            +
            Cytoplasm_volume_in_litres = 5.0e-11
         | 
| 8 | 
            +
            NA = 6.022e23
         | 
| 9 | 
            +
            Pieces_per_micromolar = NA / 1_000_000 * Cytoplasm_volume_in_litres
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            # simulation settings
         | 
| 12 | 
            +
            set_step 60
         | 
| 13 | 
            +
            set_target_time 60 * 60 * 24
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            # places
         | 
| 16 | 
            +
            AMP = Place m!: 8695.0
         | 
| 17 | 
            +
            ADP = Place m!: 6521.0
         | 
| 18 | 
            +
            ATP = Place m!: 3152.0
         | 
| 19 | 
            +
            Deoxycytidine = Place( m!: 0.5 )
         | 
| 20 | 
            +
            DeoxyCTP = Place( m!: 1.0 )
         | 
| 21 | 
            +
            DeoxyGMP = Place( m!: 1.0 )
         | 
| 22 | 
            +
            U12P = Place( m!: 2737.0 )
         | 
| 23 | 
            +
            DeoxyUMP_DeoxyUDP_pool = Place( m!: 0.0 )
         | 
| 24 | 
            +
            DeoxyTMP = Place( m!: 3.3 )
         | 
| 25 | 
            +
            DeoxyTDP_DeoxyTTP_pool = Place( m!: 5.0 )
         | 
| 26 | 
            +
            Thymidine = Place( m!: 0.5 )
         | 
| 27 | 
            +
            TK1 = Place( m!: 100_000 )
         | 
| 28 | 
            +
            TYMS = Place( m!: 100_000 )
         | 
| 29 | 
            +
            RNR = Place( m!: 100_000 )
         | 
| 30 | 
            +
            TMPK = Place( m!: 100_000 )
         | 
| 31 | 
            +
             | 
| 32 | 
            +
            # molecular masses
         | 
| 33 | 
            +
            TK1_kDa = 24.8
         | 
| 34 | 
            +
            TYMS_kDa = 66.0
         | 
| 35 | 
            +
            RNR_kDa = 140.0
         | 
| 36 | 
            +
            TMPK_kDa = 50.0
         | 
| 37 | 
            +
             | 
| 38 | 
            +
            # enzyme specific activities
         | 
| 39 | 
            +
            TK1_a = 5.40
         | 
| 40 | 
            +
            TYMS_a = 3.80
         | 
| 41 | 
            +
            RNR_a = 1.00
         | 
| 42 | 
            +
            TMPK_a = 0.83
         | 
| 43 | 
            +
             | 
| 44 | 
            +
            # clamps
         | 
| 45 | 
            +
            clamp AMP: 8695.0, ADP: 6521.0, ATP: 3152.0
         | 
| 46 | 
            +
            clamp Deoxycytidine: 0.5, DeoxyCTP: 1.0, DeoxyGMP: 1.0
         | 
| 47 | 
            +
            clamp Thymidine: 0.5
         | 
| 48 | 
            +
            clamp U12P: 2737.0
         | 
| 49 | 
            +
             | 
| 50 | 
            +
            # functions
         | 
| 51 | 
            +
            Vmax_per_minute_per_enzyme_molecule =
         | 
| 52 | 
            +
              lambda { |enzyme_specific_activity_in_micromol_per_minute_per_mg,
         | 
| 53 | 
            +
                        enzyme_molecular_mass_in_kDa|
         | 
| 54 | 
            +
                          enzyme_specific_activity_in_micromol_per_minute_per_mg *
         | 
| 55 | 
            +
                            enzyme_molecular_mass_in_kDa }
         | 
| 56 | 
            +
            Vmax_per_minute =
         | 
| 57 | 
            +
              lambda { |specific_activity, kDa, enzyme_molecules_per_cell|
         | 
| 58 | 
            +
                       Vmax_per_minute_per_enzyme_molecule.( specific_activity, kDa ) *
         | 
| 59 | 
            +
                         enzyme_molecules_per_cell }
         | 
| 60 | 
            +
            Vmax_per_second =
         | 
| 61 | 
            +
              lambda { |specific_activity, kDa, enzyme_molecules_per_cell|
         | 
| 62 | 
            +
                       Vmax_per_minute.( specific_activity,
         | 
| 63 | 
            +
                                         kDa,
         | 
| 64 | 
            +
                                         enzyme_molecules_per_cell ) / 60 }
         | 
| 65 | 
            +
            Km_reduced =
         | 
| 66 | 
            +
              lambda { |km, ki_hash={}|
         | 
| 67 | 
            +
                       ki_hash.map { |concentration, ci_Ki|
         | 
| 68 | 
            +
                                     concentration / ci_Ki
         | 
| 69 | 
            +
                                   }.reduce( 1, :+ ) * km }
         | 
| 70 | 
            +
            Occupancy =
         | 
| 71 | 
            +
              lambda { |concentration, reactant_Km, compet_inh_w_Ki_hash={}|
         | 
| 72 | 
            +
                       concentration / ( concentration +
         | 
| 73 | 
            +
                                         Km_reduced.( reactant_Km,
         | 
| 74 | 
            +
                                                      compet_inh_w_Ki_hash ) ) }
         | 
| 75 | 
            +
            MM_with_inh_micromolars_per_second =
         | 
| 76 | 
            +
              lambda { |reactant_concentration,
         | 
| 77 | 
            +
                        enzyme_specific_activity,
         | 
| 78 | 
            +
                        enzyme_mass_in_kDa,
         | 
| 79 | 
            +
                        enzyme_molecules_per_cell,
         | 
| 80 | 
            +
                        reactant_Km,
         | 
| 81 | 
            +
                        competitive_inh_w_Ki_hash={}|
         | 
| 82 | 
            +
                        Vmax_per_second.( enzyme_specific_activity,
         | 
| 83 | 
            +
                                          enzyme_mass_in_kDa,
         | 
| 84 | 
            +
                                          enzyme_molecules_per_cell ) *
         | 
| 85 | 
            +
                          Occupancy.( reactant_concentration,
         | 
| 86 | 
            +
                                      reactant_Km,
         | 
| 87 | 
            +
                                      competitive_inh_w_Ki_hash ) }
         | 
| 88 | 
            +
            MMi = MM_with_inh_micromolars_per_second
         | 
| 89 | 
            +
             | 
| 90 | 
            +
            # michaelis constants
         | 
| 91 | 
            +
            TK1_Thymidine_Km = 5.0
         | 
| 92 | 
            +
            TYMS_DeoxyUMP_Km = 2.0
         | 
| 93 | 
            +
            RNR_UDP_Km = 1.0
         | 
| 94 | 
            +
            TMPK_DeoxyTMP_Km = 12.0
         | 
| 95 | 
            +
             | 
| 96 | 
            +
            # DNA synthesis speed
         | 
| 97 | 
            +
            DNA_creation_speed = 3_000_000_000 / ( 12 * 3600 )
         | 
| 98 | 
            +
             | 
| 99 | 
            +
            # transitions
         | 
| 100 | 
            +
            Transition name: :TK1_Thymidine_DeoxyTMP,
         | 
| 101 | 
            +
                       domain: [ Thymidine,
         | 
| 102 | 
            +
                                 TK1,
         | 
| 103 | 
            +
                                 DeoxyTDP_DeoxyTTP_pool,
         | 
| 104 | 
            +
                                 DeoxyCTP,
         | 
| 105 | 
            +
                                 Deoxycytidine,
         | 
| 106 | 
            +
                                 AMP,
         | 
| 107 | 
            +
                                 ADP,
         | 
| 108 | 
            +
                                 ATP ],
         | 
| 109 | 
            +
                       stoichiometry: { Thymidine: -1,
         | 
| 110 | 
            +
                                        DeoxyTMP: 1 },
         | 
| 111 | 
            +
                       rate: proc { |rc, e, pool1, ci2, ci3, master1, master2, master3|
         | 
| 112 | 
            +
                                    ci1 = pool1 * master3 / ( master2 + master3 )
         | 
| 113 | 
            +
                                    MMi.( rc, TK1_a, TK1_kDa, e, TK1_Thymidine_Km,
         | 
| 114 | 
            +
                                          ci1 => 13.5, ci2 => 0.8, ci3 => 40.0 )
         | 
| 115 | 
            +
                                  }
         | 
| 116 | 
            +
            Transition name: :TYMS_DeoxyUMP_DeoxyTMP,
         | 
| 117 | 
            +
                       domain: [ DeoxyUMP_DeoxyUDP_pool,
         | 
| 118 | 
            +
                                 TYMS,
         | 
| 119 | 
            +
                                 AMP,
         | 
| 120 | 
            +
                                 ADP,
         | 
| 121 | 
            +
                                 ATP ],
         | 
| 122 | 
            +
                       stoichiometry: { DeoxyUMP_DeoxyUDP_pool: -1,
         | 
| 123 | 
            +
                                        DeoxyTMP: 1 },
         | 
| 124 | 
            +
                       rate: proc { |pool, e, master1, master2, master3|
         | 
| 125 | 
            +
                                    rc = pool * master2 / ( master1 + master2 )
         | 
| 126 | 
            +
                                    MMi.( rc, TYMS_a, TYMS_kDa, e, TYMS_DeoxyUMP_Km )
         | 
| 127 | 
            +
                                  }
         | 
| 128 | 
            +
            Transition name: :RNR_UDP_DeoxyUDP,
         | 
| 129 | 
            +
                       domain: [ U12P,
         | 
| 130 | 
            +
                                 RNR, DeoxyUMP_DeoxyUDP_pool,
         | 
| 131 | 
            +
                                 AMP,
         | 
| 132 | 
            +
                                 ADP,
         | 
| 133 | 
            +
                                 ATP ],
         | 
| 134 | 
            +
                          stoichiometry: { U12P: -1,
         | 
| 135 | 
            +
                                           DeoxyUMP_DeoxyUDP_pool: 1 },
         | 
| 136 | 
            +
                          rate: proc { |pool, e, master1, master2, master3|
         | 
| 137 | 
            +
                                       rc = pool * master2 / ( master1 + master2 )
         | 
| 138 | 
            +
                                       MMi.( rc, RNR_a, RNR_kDa, e, RNR_UDP_Km )
         | 
| 139 | 
            +
                                     }
         | 
| 140 | 
            +
            Transition name: :DNA_polymerase_consumption_of_DeoxyTTP,
         | 
| 141 | 
            +
                       stoichiometry: { DeoxyTDP_DeoxyTTP_pool: -1 },
         | 
| 142 | 
            +
                       rate: proc { DNA_creation_speed / 4 }
         | 
| 143 | 
            +
            Transition name: :TMPK_DeoxyTMP_DeoxyTDP,
         | 
| 144 | 
            +
                       domain: [ DeoxyTMP,
         | 
| 145 | 
            +
                                 TMPK,
         | 
| 146 | 
            +
                                 ADP,
         | 
| 147 | 
            +
                                 DeoxyTDP_DeoxyTTP_pool,
         | 
| 148 | 
            +
                                 DeoxyGMP,
         | 
| 149 | 
            +
                                 AMP,
         | 
| 150 | 
            +
                                 ATP ],
         | 
| 151 | 
            +
                       stoichiometry: { DeoxyTMP: -1,
         | 
| 152 | 
            +
                                        TMPK: 0,
         | 
| 153 | 
            +
                                        DeoxyTDP_DeoxyTTP_pool: 1 },
         | 
| 154 | 
            +
                       rate: proc { |rc, e, ci1, pool, ci4, master1, master3|
         | 
| 155 | 
            +
                                    master2 = ci1
         | 
| 156 | 
            +
                                    ci2 = pool * master2 / ( master2 + master3 )
         | 
| 157 | 
            +
                                    ci3 = pool * master3 / ( master2 + master3 )
         | 
| 158 | 
            +
                                    MMi.( rc, TMPK_a, TMPK_kDa, e, TMPK_DeoxyTMP_Km,
         | 
| 159 | 
            +
                                          ci1 => 250.0, ci2 => 30.0, ci3 => 750, ci4 => 117 )
         | 
| 160 | 
            +
                                  }
         | 
| 161 | 
            +
             | 
| 162 | 
            +
            # execution
         | 
| 163 | 
            +
            run!
         | 
| 164 | 
            +
            plot_recording
         | 
| @@ -0,0 +1,176 @@ | |
| 1 | 
            +
            #encoding: utf-8
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'y_petri'
         | 
| 4 | 
            +
            include YPetri
         | 
| 5 | 
            +
            require 'sy'
         | 
| 6 | 
            +
             | 
| 7 | 
            +
             | 
| 8 | 
            +
            # === General assumptions
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            Cytoplasm_volume = 5.0e-11.l
         | 
| 11 | 
            +
            Pieces_per_concentration = SY::Nᴀ * Cytoplasm_volume
         | 
| 12 | 
            +
             | 
| 13 | 
            +
             | 
| 14 | 
            +
            # === Simulation settings
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            set_step 60.s
         | 
| 17 | 
            +
            set_target_time 20.min
         | 
| 18 | 
            +
            set_sampling 120.s
         | 
| 19 | 
            +
             | 
| 20 | 
            +
             | 
| 21 | 
            +
            # === Places
         | 
| 22 | 
            +
             | 
| 23 | 
            +
            AMP = Place m!: 8695.0.µM
         | 
| 24 | 
            +
            ADP = Place m!: 6521.0.µM
         | 
| 25 | 
            +
            ATP = Place m!: 3152.0.µM
         | 
| 26 | 
            +
            Deoxycytidine = Place m!: 0.5.µM
         | 
| 27 | 
            +
            DeoxyCTP = Place m!: 1.0.µM
         | 
| 28 | 
            +
            DeoxyGMP = Place m!: 1.0.µM
         | 
| 29 | 
            +
            U12P = Place m!: 2737.0.µM
         | 
| 30 | 
            +
            DeoxyU12P = Place m!: 0.0.µM
         | 
| 31 | 
            +
            DeoxyTMP = Place m!: 3.3.µM
         | 
| 32 | 
            +
            DeoxyT23P = Place m!: 5.0.µM
         | 
| 33 | 
            +
            Thymidine = Place m!: 0.5.µM
         | 
| 34 | 
            +
            TK1 = Place m!: 100_000.unit.( SY::MoleAmount ) / Cytoplasm_volume
         | 
| 35 | 
            +
            TYMS = Place m!: 100_000.unit.( SY::MoleAmount ) / Cytoplasm_volume
         | 
| 36 | 
            +
            RNR = Place m!: 100_000.unit.( SY::MoleAmount ) / Cytoplasm_volume
         | 
| 37 | 
            +
            TMPK = Place m!: 100_000.unit.( SY::MoleAmount ) / Cytoplasm_volume
         | 
| 38 | 
            +
             | 
| 39 | 
            +
             | 
| 40 | 
            +
            # === Enzyme molecular masses
         | 
| 41 | 
            +
             | 
| 42 | 
            +
            TK1_m = 24.8.kDa
         | 
| 43 | 
            +
            TYMS_m = 66.0.kDa
         | 
| 44 | 
            +
            RNR_m = 140.0.kDa
         | 
| 45 | 
            +
            TMPK_m = 50.0.kDa
         | 
| 46 | 
            +
             | 
| 47 | 
            +
             | 
| 48 | 
            +
            # === Specific activities of the enzymes
         | 
| 49 | 
            +
             | 
| 50 | 
            +
            TK1_a = 5.40.µmol.min⁻¹.mg⁻¹
         | 
| 51 | 
            +
            TYMS_a = 3.80.µmol.min⁻¹.mg⁻¹
         | 
| 52 | 
            +
            RNR_a = 1.00.µmol.min⁻¹.mg⁻¹
         | 
| 53 | 
            +
            TMPK_a = 0.83.µmol.min⁻¹.mg⁻¹
         | 
| 54 | 
            +
             | 
| 55 | 
            +
             | 
| 56 | 
            +
            # === Clamps
         | 
| 57 | 
            +
             | 
| 58 | 
            +
            clamp AMP: 8695.0.µM, ADP: 6521.0.µM, ATP: 3152.0.µM
         | 
| 59 | 
            +
            clamp Deoxycytidine: 0.5.µM, DeoxyCTP: 1.0.µM, DeoxyGMP: 1.0.µM
         | 
| 60 | 
            +
            clamp Thymidine: 0.5.µM
         | 
| 61 | 
            +
            clamp U12P: 2737.0.µM
         | 
| 62 | 
            +
             | 
| 63 | 
            +
             | 
| 64 | 
            +
            # === Function closures
         | 
| 65 | 
            +
             | 
| 66 | 
            +
            # Vmax of an enzyme.
         | 
| 67 | 
            +
            # 
         | 
| 68 | 
            +
            Vmax_enzyme = lambda { |specific_activity, mass, enz_conc|
         | 
| 69 | 
            +
              specific_activity * mass * enz_conc.( SY::Molecularity )
         | 
| 70 | 
            +
            }
         | 
| 71 | 
            +
             | 
| 72 | 
            +
            # Michaelis constant reduced for competitive inhibitors.
         | 
| 73 | 
            +
            # 
         | 
| 74 | 
            +
            Km_reduced = lambda { |km, ki_hash={}|
         | 
| 75 | 
            +
              ki_hash.map { |concentration, ci_Ki| concentration / ci_Ki }
         | 
| 76 | 
            +
                .reduce( 1, :+ ) * km
         | 
| 77 | 
            +
            }
         | 
| 78 | 
            +
             | 
| 79 | 
            +
            # Occupancy of enzyme active sites at given concentration of reactants
         | 
| 80 | 
            +
            # and competitive inhibitors.
         | 
| 81 | 
            +
            # 
         | 
| 82 | 
            +
            Occupancy = lambda { |reactant_conc, reactant_Km, ci_Ki={}|
         | 
| 83 | 
            +
              reactant_conc / ( reactant_conc + Km_reduced.( reactant_Km, ci_Ki ) )
         | 
| 84 | 
            +
            }
         | 
| 85 | 
            +
             | 
| 86 | 
            +
            # Michaelis and Menten equation with competitive inhibitors.
         | 
| 87 | 
            +
            # 
         | 
| 88 | 
            +
            MMi = MM_equation_with_inhibitors = lambda {
         | 
| 89 | 
            +
              |reactant_conc, enz_spec_act, enz_mass, enz_conc, r_Km, ci_Ki={}|
         | 
| 90 | 
            +
              Vmax_enzyme.( enz_spec_act, enz_mass, enz_conc ) *
         | 
| 91 | 
            +
                Occupancy.( reactant_conc, r_Km, ci_Ki )
         | 
| 92 | 
            +
            }
         | 
| 93 | 
            +
             | 
| 94 | 
            +
             | 
| 95 | 
            +
            # === Michaelis constants of the enzymes involved.
         | 
| 96 | 
            +
             | 
| 97 | 
            +
            TK1_Thymidine_Km = 5.0.µM
         | 
| 98 | 
            +
            TYMS_DeoxyUMP_Km = 2.0.µM
         | 
| 99 | 
            +
            RNR_UDP_Km = 1.0.µM
         | 
| 100 | 
            +
            TMPK_DeoxyTMP_Km = 12.0.µM
         | 
| 101 | 
            +
             | 
| 102 | 
            +
             | 
| 103 | 
            +
            # === DNA synthesis speed.
         | 
| 104 | 
            +
             | 
| 105 | 
            +
            DNA_creation_speed =
         | 
| 106 | 
            +
              3_000_000_000.unit.( SY::MoleAmount ) / 12.h / Cytoplasm_volume
         | 
| 107 | 
            +
             | 
| 108 | 
            +
             | 
| 109 | 
            +
            # === Transitions
         | 
| 110 | 
            +
             | 
| 111 | 
            +
            # Synthesis of TMP by TK1.
         | 
| 112 | 
            +
            # 
         | 
| 113 | 
            +
            TK1_Thymidine_DeoxyTMP = Transition s: { Thymidine: -1, DeoxyTMP: 1 },
         | 
| 114 | 
            +
              domain: [ Thymidine, TK1, DeoxyT23P, DeoxyCTP, Deoxycytidine, AMP, ADP, ATP ],
         | 
| 115 | 
            +
                rate: proc { |rc, e, pool1, ci2, ci3, master1, master2, master3|
         | 
| 116 | 
            +
                        ci1 = pool1 * master3 / ( master2 + master3 )
         | 
| 117 | 
            +
                        MMi.( rc, TK1_a, TK1_m, e, TK1_Thymidine_Km,
         | 
| 118 | 
            +
                              ci1 => 13.5.µM, ci2 => 0.8.µM, ci3 => 40.0.µM )
         | 
| 119 | 
            +
                      }
         | 
| 120 | 
            +
             | 
| 121 | 
            +
            # Methylation of DeoxyUMP into TMP by TYMS.
         | 
| 122 | 
            +
            # 
         | 
| 123 | 
            +
            TYMS_DeoxyUMP_DeoxyTMP = Transition s: { DeoxyU12P: -1, DeoxyTMP: 1 },
         | 
| 124 | 
            +
              domain: [ DeoxyU12P, TYMS, AMP, ADP, ATP ],
         | 
| 125 | 
            +
                rate: proc { |pool, e, master1, master2, master3|
         | 
| 126 | 
            +
                        rc = pool * master2 / ( master1 + master2 )
         | 
| 127 | 
            +
                        MMi.( rc, TYMS_a, TYMS_m, e, TYMS_DeoxyUMP_Km )
         | 
| 128 | 
            +
                      }
         | 
| 129 | 
            +
             | 
| 130 | 
            +
            # Reduction of UDP into DeoxyUDP by RNR.
         | 
| 131 | 
            +
            # 
         | 
| 132 | 
            +
            RNR_UDP_DeoxyUDP = Transition s: { U12P: -1, DeoxyU12P: 1 },
         | 
| 133 | 
            +
              domain: [ U12P, RNR, DeoxyU12P, AMP, ADP, ATP ],
         | 
| 134 | 
            +
                rate: proc { |pool, e, master1, master2, master3|
         | 
| 135 | 
            +
                        rc = pool * master2 / ( master1 + master2 )
         | 
| 136 | 
            +
                        MMi.( rc, RNR_a, RNR_m, e, RNR_UDP_Km )
         | 
| 137 | 
            +
                      }
         | 
| 138 | 
            +
             | 
| 139 | 
            +
            # Consumption of TTP by DNA synthesis.
         | 
| 140 | 
            +
            # 
         | 
| 141 | 
            +
            DeoxyTTP_to_DNA = Transition s: { DeoxyT23P: -1 },
         | 
| 142 | 
            +
                rate: proc { DNA_creation_speed / 4 }
         | 
| 143 | 
            +
             | 
| 144 | 
            +
            # Phosphorylation of TMP into TDP-TTP pool.
         | 
| 145 | 
            +
            # 
         | 
| 146 | 
            +
            TMPK_DeoxyTMP_DeoxyTDP = Transition s: { DeoxyTMP: -1, TMPK: 0, DeoxyT23P: 1 },
         | 
| 147 | 
            +
              domain: [ DeoxyTMP, TMPK, ADP, DeoxyT23P, DeoxyGMP, AMP, ATP ],
         | 
| 148 | 
            +
                rate: proc { |rc, e, ci1, pool, ci4, master1, master3|
         | 
| 149 | 
            +
                        master2 = ci1
         | 
| 150 | 
            +
                        ci2 = pool * master2 / ( master2 + master3 )
         | 
| 151 | 
            +
                        ci3 = pool * master3 / ( master2 + master3 )
         | 
| 152 | 
            +
                        MMi.( rc, TMPK_a, TMPK_m, e, TMPK_DeoxyTMP_Km,
         | 
| 153 | 
            +
                              ci1 => 250.0.µM, ci2 => 30.0.µM, ci3 => 750.µM, ci4 => 117.µM )
         | 
| 154 | 
            +
                      }
         | 
| 155 | 
            +
             | 
| 156 | 
            +
            # TMPK_DeoxyTMP_DeoxyTDP = SR_transition DeoxyTMP: -1, TMPK: 0, DeoxyT23P: 1 do
         | 
| 157 | 
            +
            #   MMi.( DeoxyTMP, TMPK_a, TMPK_m, TMPK, TMPK_DeoxyTMP_Km,
         | 
| 158 | 
            +
            #         ADP => 250.0.µM,
         | 
| 159 | 
            +
            #         ( DeoxyT23P * ADP / ( ADP + ATP ) ) => 30.0.µM,
         | 
| 160 | 
            +
            #         ( DeoxyT23P * ATP / ( ADP + ATP ) ) => 750.µM,
         | 
| 161 | 
            +
            #         DeoxyGMP => 117.µM )
         | 
| 162 | 
            +
            # end
         | 
| 163 | 
            +
             | 
| 164 | 
            +
            # RubyVM::InstructionSequence.disassemble( block )
         | 
| 165 | 
            +
            # # and then process it to reconstruct the domain and construct the real closure
         | 
| 166 | 
            +
             | 
| 167 | 
            +
             | 
| 168 | 
            +
            # === Simulation execution
         | 
| 169 | 
            +
             | 
| 170 | 
            +
            # YPetri::DEBUG = true
         | 
| 171 | 
            +
            run!
         | 
| 172 | 
            +
             | 
| 173 | 
            +
             | 
| 174 | 
            +
            # === Plotting of the results
         | 
| 175 | 
            +
             | 
| 176 | 
            +
            plot_recording
         | 
| @@ -0,0 +1,150 @@ | |
| 1 | 
            +
            #encoding: utf-8
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'y_petri'
         | 
| 4 | 
            +
            include YPetri
         | 
| 5 | 
            +
            require 'sy'
         | 
| 6 | 
            +
            require 'mathn'
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            # === General assumptions
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            Cell_diameter = 10.µm
         | 
| 11 | 
            +
            Cytoplasm_volume = ( 4 / 3 * Math::PI * ( Cell_diameter / 2 ) ** 3 ).( SY::LitreVolume )
         | 
| 12 | 
            +
            # Cytoplasm_volume = 5.0e-11.l         # of an average cell
         | 
| 13 | 
            +
            # How many molecules are there in the average cell per micromolar.
         | 
| 14 | 
            +
            Pieces_per_µM = ( 1.µM * Cytoplasm_volume ).in( :unit )
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            # === Simulation settings
         | 
| 17 | 
            +
             | 
| 18 | 
            +
            set_step 60.s.in( :s )
         | 
| 19 | 
            +
            set_target_time 20.min.in( :s )
         | 
| 20 | 
            +
            set_sampling 120.s.in( :s )
         | 
| 21 | 
            +
             | 
| 22 | 
            +
            # === Places (all in µM)
         | 
| 23 | 
            +
             | 
| 24 | 
            +
            AMP = Place m!: 8695.0
         | 
| 25 | 
            +
            ADP = Place m!: 6521.0
         | 
| 26 | 
            +
            ATP = Place m!: 3152.0
         | 
| 27 | 
            +
            DeoxyCytidine = Place m!: 0.5
         | 
| 28 | 
            +
            DeoxyCTP = Place m!: 1.0
         | 
| 29 | 
            +
            DeoxyGMP = Place m!: 1.0
         | 
| 30 | 
            +
            U12P = Place m!: 2737.0
         | 
| 31 | 
            +
            DeoxyU12P = Place m!: 0.0
         | 
| 32 | 
            +
            DeoxyTMP = Place m!: 3.3
         | 
| 33 | 
            +
            DeoxyT23P = Place m!: 5.0
         | 
| 34 | 
            +
            Thymidine = Place m!: 0.5
         | 
| 35 | 
            +
            TK1 = Place m!: 100_000 / Pieces_per_µM
         | 
| 36 | 
            +
            TYMS = Place m!: 100_000 / Pieces_per_µM
         | 
| 37 | 
            +
            RNR = Place m!: 100_000 / Pieces_per_µM
         | 
| 38 | 
            +
            TMPK = Place m!: 100_000 / Pieces_per_µM
         | 
| 39 | 
            +
             | 
| 40 | 
            +
            # === Molecular masses
         | 
| 41 | 
            +
             | 
| 42 | 
            +
            TK1_m = 24.8.kDa
         | 
| 43 | 
            +
            TYMS_m = 66.0.kDa
         | 
| 44 | 
            +
            RNR_m = 140.0.kDa
         | 
| 45 | 
            +
            TMPK_m = 50.0.kDa
         | 
| 46 | 
            +
             | 
| 47 | 
            +
            # === Enzyme specific activities
         | 
| 48 | 
            +
             | 
| 49 | 
            +
            TK1_a = 5.40.µmol.min⁻¹.mg⁻¹
         | 
| 50 | 
            +
            TYMS_a = 3.80.µmol.min⁻¹.mg⁻¹
         | 
| 51 | 
            +
            RNR_a = 1.00.µmol.min⁻¹.mg⁻¹
         | 
| 52 | 
            +
            TMPK_a = 0.83.µmol.min⁻¹.mg⁻¹
         | 
| 53 | 
            +
             | 
| 54 | 
            +
            # === Enzyme kcat
         | 
| 55 | 
            +
             | 
| 56 | 
            +
            TK1_k_cat = ( TK1_a * TK1_m ).( SY::Amount / SY::Time ).in :s⁻¹
         | 
| 57 | 
            +
            TYMS_k_cat = ( TYMS_a * TYMS_m ).( SY::Amount / SY::Time ).in :s⁻¹
         | 
| 58 | 
            +
            RNR_k_cat = ( RNR_a * RNR_m ).( SY::Amount / SY::Time ).in :s⁻¹
         | 
| 59 | 
            +
            TMPK_k_cat = ( TMPK_a * TMPK_m ).( SY::Amount / SY::Time ).in :s⁻¹
         | 
| 60 | 
            +
             | 
| 61 | 
            +
            # === Clamps (all in µM)
         | 
| 62 | 
            +
             | 
| 63 | 
            +
            clamp AMP: 8695.0, ADP: 6521.0, ATP: 3152.0
         | 
| 64 | 
            +
            clamp DeoxyCytidine: 0.5, DeoxyCTP: 1.0, DeoxyGMP: 1.0
         | 
| 65 | 
            +
            clamp Thymidine: 0.5
         | 
| 66 | 
            +
            clamp U12P: 2737.0
         | 
| 67 | 
            +
             | 
| 68 | 
            +
            # === Function closures
         | 
| 69 | 
            +
             | 
| 70 | 
            +
            # Vmax of an enzyme.
         | 
| 71 | 
            +
            # 
         | 
| 72 | 
            +
            Vmax = -> enzyme_µM, k_cat do enzyme_µM * k_cat end
         | 
| 73 | 
            +
             | 
| 74 | 
            +
            # Michaelis constant reduced for competitive inhibitors.
         | 
| 75 | 
            +
            # 
         | 
| 76 | 
            +
            Km_reduced = -> reactant_Km, hash_Ki=Hash.new do
         | 
| 77 | 
            +
              hash_Ki.map { |compet_inhibitor_concentration, compet_inhibitor_Ki|
         | 
| 78 | 
            +
                compet_inhibitor_concentration / compet_inhibitor_Ki
         | 
| 79 | 
            +
              }.reduce( 1, :+ ) * reactant_Km
         | 
| 80 | 
            +
            end
         | 
| 81 | 
            +
             | 
| 82 | 
            +
            # Occupancy fraction of the Michaelis-Menten equation.
         | 
| 83 | 
            +
            # 
         | 
| 84 | 
            +
            Occupancy = -> reactant_µM, reactant_Km, hash_Ki=Hash.new do
         | 
| 85 | 
            +
              reactant_µM / ( reactant_µM + Km_reduced.( reactant_Km, hash_Ki ) )
         | 
| 86 | 
            +
            end
         | 
| 87 | 
            +
             | 
| 88 | 
            +
            # Michaelis-Menten equation with competitive inhibitors.
         | 
| 89 | 
            +
            # 
         | 
| 90 | 
            +
            MMi = -> reactant_µM, reactant_Km, enzyme_µM, k_cat, hash_Ki=Hash.new do
         | 
| 91 | 
            +
              Vmax.( enzyme_µM, k_cat ) * Occupancy.( reactant_µM, reactant_Km, hash_Ki )
         | 
| 92 | 
            +
            end
         | 
| 93 | 
            +
             | 
| 94 | 
            +
            # === Michaelis constants (all in µM)
         | 
| 95 | 
            +
             | 
| 96 | 
            +
            TK1_Thymidine_Km = 5.0
         | 
| 97 | 
            +
            TYMS_DeoxyUMP_Km = 2.0
         | 
| 98 | 
            +
            RNR_UDP_Km = 1.0
         | 
| 99 | 
            +
            TMPK_DeoxyTMP_Km = 12.0
         | 
| 100 | 
            +
             | 
| 101 | 
            +
            # === DNA synthesis speed
         | 
| 102 | 
            +
             | 
| 103 | 
            +
            S_phase_duration = 12.h
         | 
| 104 | 
            +
            Genome_size = 3_000_000_000          # of bases
         | 
| 105 | 
            +
            DNA_creation_speed = Genome_size / S_phase_duration.in( :s ) # in base.s⁻¹
         | 
| 106 | 
            +
             | 
| 107 | 
            +
            # === Transitions
         | 
| 108 | 
            +
             | 
| 109 | 
            +
            Transition name: :TK1_Thymidine_DeoxyTMP,
         | 
| 110 | 
            +
                       domain: [ Thymidine, TK1, DeoxyT23P, DeoxyCTP, DeoxyCytidine, AMP, ADP, ATP ],
         | 
| 111 | 
            +
                       stoichiometry: { Thymidine: -1, DeoxyTMP: 1 },
         | 
| 112 | 
            +
                       rate: proc { |reactant, enzyme, pool, inhibitor_2, inhibitor_3, mono, di, tri|
         | 
| 113 | 
            +
                         inhibitor_1 = pool * tri / ( di + tri ) # conc. of DeoxyTTP
         | 
| 114 | 
            +
                         MMi.( reactant, TK1_Thymidine_Km, enzyme, TK1_k_cat,
         | 
| 115 | 
            +
                               inhibitor_1 => 13.5, inhibitor_2 => 0.8, inhibitor_3 => 40.0 )
         | 
| 116 | 
            +
                       }
         | 
| 117 | 
            +
             | 
| 118 | 
            +
            Transition name: :TYMS_DeoxyUMP_DeoxyTMP,
         | 
| 119 | 
            +
                       domain: [ DeoxyU12P, TYMS, AMP, ADP, ATP ],
         | 
| 120 | 
            +
                       stoichiometry: { DeoxyU12P: -1, DeoxyTMP: 1 },
         | 
| 121 | 
            +
                       rate: proc { |pool, enzyme, mono, di, tri|
         | 
| 122 | 
            +
                         reactant = pool * di / ( mono + di ) # conc. of DeoxyUMP
         | 
| 123 | 
            +
                         MMi.( reactant, TYMS_DeoxyUMP_Km, enzyme, TYMS_k_cat )
         | 
| 124 | 
            +
                       }
         | 
| 125 | 
            +
             | 
| 126 | 
            +
            Transition name: :RNR_UDP_DeoxyUDP,
         | 
| 127 | 
            +
                       domain: [ U12P, RNR, DeoxyU12P, AMP, ADP, ATP ],
         | 
| 128 | 
            +
                       stoichiometry: { U12P: -1, DeoxyU12P: 1 },
         | 
| 129 | 
            +
                       rate: proc { |pool, enzyme, mono, di, tri|
         | 
| 130 | 
            +
                         reactant = pool * di / ( mono + di )
         | 
| 131 | 
            +
                         MMi.( reactant, RNR_UDP_Km, enzyme, RNR_k_cat )
         | 
| 132 | 
            +
                       }
         | 
| 133 | 
            +
             | 
| 134 | 
            +
            Transition name: :DNA_polymerase_consumption_of_DeoxyTTP,
         | 
| 135 | 
            +
                       stoichiometry: { DeoxyT23P: -1 },
         | 
| 136 | 
            +
                       rate: proc { DNA_creation_speed / 4 }
         | 
| 137 | 
            +
             | 
| 138 | 
            +
            Transition name: :TMPK_DeoxyTMP_DeoxyTDP,
         | 
| 139 | 
            +
                       domain: [ DeoxyTMP, TMPK, DeoxyT23P, DeoxyGMP, AMP, ADP, ATP ],
         | 
| 140 | 
            +
                       stoichiometry: { DeoxyTMP: -1, DeoxyT23P: 1 },
         | 
| 141 | 
            +
                       rate: proc { |reactant, enzyme, pool, inhibitor_4, mono, di, tri|
         | 
| 142 | 
            +
                         inhibitor_1 = di
         | 
| 143 | 
            +
                         inhibitor_2 = pool * di / ( di + tri ) # conc. of DeoxyTDP
         | 
| 144 | 
            +
                         inhibitor_3 = pool * tri / ( di + tri ) # conc. of DeoxyTTP
         | 
| 145 | 
            +
                         MMi.( reactant, TMPK_DeoxyTMP_Km, enzyme, TMPK_k_cat )
         | 
| 146 | 
            +
                       }
         | 
| 147 | 
            +
             | 
| 148 | 
            +
            # execution
         | 
| 149 | 
            +
            run!
         | 
| 150 | 
            +
            plot_recording
         |