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
|