mxlmodels 1.0.0__py3-none-any.whl

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.
@@ -0,0 +1,1469 @@
1
+ """Matuszynska 2019 photosynthesis model with NPQ, state transitions, and Calvin cycle.
2
+
3
+ Reference: Matuszyńska, Anna, Nima P. Saadat, and Oliver Ebenhöh.
4
+ "Balancing energy supply during photosynthesis - a theoretical perspective."
5
+ Physiologia plantarum 166.1 (2019): 392-402.
6
+ """
7
+
8
+ import math
9
+
10
+ import numpy as np
11
+ from mxlpy import Derived, Model
12
+ from mxlpy.surrogates import qss
13
+
14
+
15
+ def _mass_action_1s(
16
+ s1: float,
17
+ k_fwd: float,
18
+ ) -> float:
19
+ """Mass-action rate for one substrate."""
20
+ return k_fwd * s1
21
+
22
+
23
+ def _dg_ph(
24
+ r: float,
25
+ t: float,
26
+ ) -> float:
27
+ """Thermodynamic coefficient dG/dpH = RT*ln(10) in kJ/mol."""
28
+ return np.log(10) * r * t
29
+
30
+
31
+ def _ph_lumen(
32
+ protons: float,
33
+ ) -> float:
34
+ """Lumenal pH from proton concentration in mmol/mmol_Chl (conversion factor 0.00025)."""
35
+ return -np.log10(protons * 0.00025)
36
+
37
+
38
+ def _moiety_1(
39
+ concentration: float,
40
+ total: float,
41
+ ) -> float:
42
+ """Conservation moiety: total - concentration."""
43
+ return total - concentration
44
+
45
+
46
+ def _quencher(
47
+ psbs: float,
48
+ vx: float,
49
+ psbsp: float,
50
+ zx: float,
51
+ y0: float,
52
+ y1: float,
53
+ y2: float,
54
+ y3: float,
55
+ k_z_sat: float,
56
+ ) -> float:
57
+ """co-operative 4-state quenching mechanism.
58
+
59
+ gamma0: slow quenching of (Vx - protonation)
60
+ gamma1: fast quenching (Vx + protonation)
61
+ gamma2: fastest possible quenching (Zx + protonation)
62
+ gamma3: slow quenching of Zx present (Zx - protonation).
63
+ """
64
+ ZAnt = zx / (zx + k_z_sat)
65
+ return y0 * vx * psbs + y1 * vx * psbsp + y2 * ZAnt * psbsp + y3 * ZAnt * psbs
66
+
67
+
68
+ def _keq_pq_red(
69
+ e0_qa: float,
70
+ f: float,
71
+ e0_pq: float,
72
+ p_hstroma: float,
73
+ d_g_p_h: float,
74
+ rt: float,
75
+ ) -> float:
76
+ """Equilibrium constant for PQ reduction by QA, pH-corrected via stroma proton contribution."""
77
+ dg1 = -e0_qa * f
78
+ dg2 = -2 * e0_pq * f
79
+ dg = -2 * dg1 + dg2 + 2 * p_hstroma * d_g_p_h
80
+ return np.exp(-dg / rt)
81
+
82
+
83
+ def _ps2_crosssection(
84
+ lhc: float,
85
+ static_ant_ii: float,
86
+ static_ant_i: float,
87
+ ) -> float:
88
+ """Equilibrium constant for PQ reduction by QA, pH-corrected via stroma proton contribution."""
89
+ return static_ant_ii + (1 - static_ant_ii - static_ant_i) * lhc
90
+
91
+
92
+ def _pi_cbb(
93
+ phosphate_total: float,
94
+ pga: float,
95
+ bpga: float,
96
+ gap: float,
97
+ dhap: float,
98
+ fbp: float,
99
+ f6p: float,
100
+ g6p: float,
101
+ g1p: float,
102
+ sbp: float,
103
+ s7p: float,
104
+ e4p: float,
105
+ x5p: float,
106
+ r5p: float,
107
+ rubp: float,
108
+ ru5p: float,
109
+ atp: float,
110
+ ) -> float:
111
+ """Free orthophosphate from total minus all phosphorylated CBB intermediates (bisphosphates count twice)."""
112
+ return phosphate_total - (
113
+ pga
114
+ + 2 * bpga
115
+ + gap
116
+ + dhap
117
+ + 2 * fbp
118
+ + f6p
119
+ + g6p
120
+ + g1p
121
+ + 2 * sbp
122
+ + s7p
123
+ + e4p
124
+ + x5p
125
+ + r5p
126
+ + 2 * rubp
127
+ + ru5p
128
+ + atp
129
+ )
130
+
131
+
132
+ def _keq_atp(
133
+ p_h: float,
134
+ delta_g0_atp: float,
135
+ d_g_p_h: float,
136
+ hpr: float,
137
+ p_hstroma: float,
138
+ pi_mol: float,
139
+ rt: float,
140
+ ) -> float:
141
+ """Equilibrium constant for ATP synthase, driven by the transmembrane proton gradient."""
142
+ delta_g = delta_g0_atp - d_g_p_h * hpr * (p_hstroma - p_h)
143
+ return pi_mol * math.exp(-delta_g / rt)
144
+
145
+
146
+ def _keq_cytb6f(
147
+ p_h: float,
148
+ f: float,
149
+ e0_pq: float,
150
+ e0_pc: float,
151
+ p_hstroma: float,
152
+ rt: float,
153
+ d_g_p_h: float,
154
+ ) -> float:
155
+ """Equilibrium constant of cytochrome b6f from redox potentials and transmembrane pH gradient."""
156
+ DG1 = -2 * f * e0_pq
157
+ DG2 = -f * e0_pc
158
+ DG = -(DG1 + 2 * d_g_p_h * p_h) + 2 * DG2 + 2 * d_g_p_h * (p_hstroma - p_h)
159
+ return math.exp(-DG / rt)
160
+
161
+
162
+ def _keq_fnr(
163
+ e0_fd: float,
164
+ f: float,
165
+ e0_nadp: float,
166
+ p_hstroma: float,
167
+ d_g_p_h: float,
168
+ rt: float,
169
+ ) -> float:
170
+ """Equilibrium constant for FNR: Fd-mediated NADP+ reduction, pH-corrected."""
171
+ dg1 = -e0_fd * f
172
+ dg2 = -2 * e0_nadp * f
173
+ dg = -2 * dg1 + dg2 + d_g_p_h * p_hstroma
174
+ return math.exp(-dg / rt)
175
+
176
+
177
+ def _keq_pcp700(
178
+ e0_pc: float,
179
+ f: float,
180
+ eo_p700: float,
181
+ rt: float,
182
+ ) -> float:
183
+ """Equilibrium constant for PC -> P700 electron transfer from standard redox potentials."""
184
+ dg1 = -e0_pc * f
185
+ dg2 = -eo_p700 * f
186
+ dg = -dg1 + dg2
187
+ return math.exp(-dg / rt)
188
+
189
+
190
+ def _keq_faf_d(
191
+ e0_fa: float,
192
+ f: float,
193
+ e0_fd: float,
194
+ rt: float,
195
+ ) -> float:
196
+ """Equilibrium constant for FA -> Fd electron transfer from standard redox potentials."""
197
+ dg1 = -e0_fa * f
198
+ dg2 = -e0_fd * f
199
+ dg = -dg1 + dg2
200
+ return math.exp(-dg / rt)
201
+
202
+
203
+ def _ps1states_2019(
204
+ pc_px: float,
205
+ pc_red: float,
206
+ fd_ox: float,
207
+ fd_red: float,
208
+ ps2cs: float,
209
+ psi_tot: float,
210
+ k_fd_red: float,
211
+ keq_fafd: float,
212
+ keq_pcp700: float,
213
+ k_pc_ox: float,
214
+ pfd: float,
215
+ ) -> float:
216
+ """QSSA calculates open state of PSI.
217
+
218
+ depends on reduction states of plastocyanin and ferredoxin
219
+ C = [PC], F = [Fd] (ox. forms).
220
+ """
221
+ L = (1 - ps2cs) * pfd
222
+ return psi_tot / (
223
+ 1
224
+ + L / (k_fd_red * fd_ox)
225
+ + (1 + fd_red / (keq_fafd * fd_ox))
226
+ * (pc_px / (keq_pcp700 * pc_red) + L / (k_pc_ox * pc_red))
227
+ )
228
+
229
+
230
+ def _rate_translocator(
231
+ pi: float,
232
+ pga: float,
233
+ gap: float,
234
+ dhap: float,
235
+ k_pxt: float,
236
+ p_ext: float,
237
+ k_pi: float,
238
+ k_pga: float,
239
+ k_gap: float,
240
+ k_dhap: float,
241
+ ) -> float:
242
+ """Denominator term N for the phosphate translocator shared by all triose-P export reactions."""
243
+ return 1 + (1 + k_pxt / p_ext) * (
244
+ pi / k_pi + pga / k_pga + gap / k_gap + dhap / k_dhap
245
+ )
246
+
247
+
248
+ def _rate_atp_synthase_2019(
249
+ atp: float,
250
+ adp: float,
251
+ keq_at_psynthase: float,
252
+ k_at_psynth: float,
253
+ convf: float,
254
+ ) -> float:
255
+ """ATP synthase rate (2019 formulation): same as 2016 but ADP/ATP scaled by convf."""
256
+ return k_at_psynth * (adp / convf - atp / convf / keq_at_psynthase)
257
+
258
+
259
+ def _neg_div(
260
+ x: float,
261
+ y: float,
262
+ ) -> float:
263
+ """Return -x / y."""
264
+ return -x / y
265
+
266
+
267
+ def _value(
268
+ x: float,
269
+ ) -> float:
270
+ """Return x unchanged."""
271
+ return x
272
+
273
+
274
+ def _b6f(
275
+ pc_ox: float,
276
+ pq_ox: float,
277
+ pq_red: float,
278
+ pc_red: float,
279
+ keq_b6f: float,
280
+ k_cytb6f: float,
281
+ ) -> float:
282
+ """Cytochrome b6f rate: reversible mass action clamped to -kCytb6f to avoid runaway reverse flux."""
283
+ return max(
284
+ k_cytb6f * (pq_red * pc_ox**2 - pq_ox * pc_red**2 / keq_b6f),
285
+ -k_cytb6f,
286
+ )
287
+
288
+
289
+ def _four_div_by(
290
+ x: float,
291
+ ) -> float:
292
+ """Return 4/x; used for the 4-proton stoichiometry of b6f scaled by buffering capacity."""
293
+ return 4.0 / x
294
+
295
+
296
+ def _protons_stroma_2016(
297
+ ph: float,
298
+ ) -> float:
299
+ """Convert stromal pH to proton concentration (µmol/L).
300
+
301
+ Introduced by the Matuszynska 2016 PhD model.
302
+ """
303
+ return 4000.0 * 10 ** (-ph)
304
+
305
+
306
+ def _protonation_hill(
307
+ vx: float,
308
+ h: float,
309
+ nh: float,
310
+ k_fwd: float,
311
+ k_ph_sat: float,
312
+ ) -> float:
313
+ """Hill-type protonation rate scaled by lumenal proton concentration."""
314
+ return k_fwd * (h**nh / (h**nh + _protons_stroma_2016(k_ph_sat) ** nh)) * vx # type: ignore
315
+
316
+
317
+ def _rate_cyclic_electron_flow(
318
+ pox: float,
319
+ fdred: float,
320
+ kcyc: float,
321
+ ) -> float:
322
+ """Cyclic electron flow rate: mass action on Fd_red^2 and PQ_ox."""
323
+ return kcyc * fdred**2 * pox
324
+
325
+
326
+ def _rate_protonation_hill(
327
+ vx: float,
328
+ h: float,
329
+ k_fwd: float,
330
+ n_h: float,
331
+ kph_sat: float,
332
+ ) -> float:
333
+ """Hill-type deepoxidase rate activated by lumenal proton concentration."""
334
+ return k_fwd * (h**n_h / (h**n_h + _protons_stroma_2016(kph_sat) ** n_h)) * vx # type: ignore
335
+
336
+
337
+ def _rate_fnr_2019(
338
+ fd_ox: float,
339
+ fd_red: float,
340
+ nadph: float,
341
+ nadp: float,
342
+ km_fnr_f: float,
343
+ km_fnr_n: float,
344
+ vmax: float,
345
+ keq_fnr: float,
346
+ convf: float,
347
+ ) -> float:
348
+ """FNR rate (2019 formulation): same as 2016 but NADP/H concentrations scaled by convf."""
349
+ fdred = fd_red / km_fnr_f
350
+ fdox = fd_ox / km_fnr_f
351
+ nadph = nadph / convf / km_fnr_n
352
+ nadp = nadp / convf / km_fnr_n
353
+ return (
354
+ vmax
355
+ * (fdred**2 * nadp - fdox**2 * nadph / keq_fnr)
356
+ / ((1 + fdred + fdred**2) * (1 + nadp) + (1 + fdox + fdox**2) * (1 + nadph) - 1)
357
+ )
358
+
359
+
360
+ def _rate_ps2(
361
+ b1: float,
362
+ k2: float,
363
+ ) -> float:
364
+ """PSII electron transfer rate from the open-excited state B1 and photochemistry rate constant k2."""
365
+ return 0.5 * k2 * b1
366
+
367
+
368
+ def _two_div_by(
369
+ x: float,
370
+ ) -> float:
371
+ """Return 2/x; used for the 2-proton stoichiometry of PSII scaled by buffering capacity."""
372
+ return 2.0 / x
373
+
374
+
375
+ def _rate_ps1(
376
+ a: float,
377
+ ps2cs: float,
378
+ pfd: float,
379
+ ) -> float:
380
+ """PSI electron transfer rate: open PSI centers (a) * light absorbed by PSI antenna."""
381
+ return (1 - ps2cs) * pfd * a
382
+
383
+
384
+ def _rate_leak(
385
+ protons_lumen: float,
386
+ ph_stroma: float,
387
+ k_leak: float,
388
+ ) -> float:
389
+ """Passive proton leak across the thylakoid membrane, proportional to the proton gradient."""
390
+ return k_leak * (protons_lumen - _protons_stroma_2016(ph_stroma))
391
+
392
+
393
+ def _neg_one_div_by(
394
+ x: float,
395
+ ) -> float:
396
+ """Return -1/x; used for negated unit stoichiometry scaled by buffering capacity."""
397
+ return -1.0 / x
398
+
399
+
400
+ def _mass_action_2s(
401
+ s1: float,
402
+ s2: float,
403
+ k_fwd: float,
404
+ ) -> float:
405
+ """Mass-action rate for two substrates."""
406
+ return k_fwd * s1 * s2
407
+
408
+
409
+ def _rate_state_transition_ps1_ps2(
410
+ ant: float,
411
+ pox: float,
412
+ p_tot: float,
413
+ k_stt7: float,
414
+ km_st: float,
415
+ n_st: float,
416
+ ) -> float:
417
+ """STT7-kinase phosphorylation of LHC; inhibited by oxidised PQ (state 1 → 2 transition)."""
418
+ return k_stt7 * (1 / (1 + (pox / p_tot / km_st) ** n_st)) * ant
419
+
420
+
421
+ def _rate_poolman_5i(
422
+ rubp: float,
423
+ pga: float,
424
+ co2: float,
425
+ vmax: float,
426
+ kms_rubp: float,
427
+ kms_co2: float,
428
+ # inhibitors
429
+ ki_pga: float,
430
+ fbp: float,
431
+ ki_fbp: float,
432
+ sbp: float,
433
+ ki_sbp: float,
434
+ pi: float,
435
+ ki_p: float,
436
+ nadph: float,
437
+ ki_nadph: float,
438
+ ) -> float:
439
+ """Rubisco carboxylation rate (Poolman 2000): bi-substrate with 5 competitive inhibitors."""
440
+ top = vmax * rubp * co2
441
+ btm = (
442
+ rubp
443
+ + kms_rubp
444
+ * (
445
+ 1
446
+ + pga / ki_pga
447
+ + fbp / ki_fbp
448
+ + sbp / ki_sbp
449
+ + pi / ki_p
450
+ + nadph / ki_nadph
451
+ )
452
+ ) * (co2 + kms_co2)
453
+ return top / btm
454
+
455
+
456
+ def _rapid_equilibrium_2s_2p(
457
+ s1: float,
458
+ s2: float,
459
+ p1: float,
460
+ p2: float,
461
+ k_re: float,
462
+ q: float,
463
+ ) -> float:
464
+ """Rapid-equilibrium rate for two substrates, two products."""
465
+ return k_re * (s1 * s2 - p1 * p2 / q)
466
+
467
+
468
+ def _rapid_equilibrium_3s_3p(
469
+ s1: float,
470
+ s2: float,
471
+ s3: float,
472
+ p1: float,
473
+ p2: float,
474
+ p3: float,
475
+ k_re: float,
476
+ q: float,
477
+ ) -> float:
478
+ """Rapid-equilibrium rate for three substrates, three products."""
479
+ return k_re * (s1 * s2 * s3 - p1 * p2 * p3 / q)
480
+
481
+
482
+ def _rapid_equilibrium_1s_1p(
483
+ s1: float,
484
+ p1: float,
485
+ k_re: float,
486
+ q: float,
487
+ ) -> float:
488
+ """Rapid-equilibrium rate for one substrate, one product."""
489
+ return k_re * (s1 - p1 / q)
490
+
491
+
492
+ def _rapid_equilibrium_2s_1p(
493
+ s1: float,
494
+ s2: float,
495
+ p1: float,
496
+ k_re: float,
497
+ q: float,
498
+ ) -> float:
499
+ """Rapid-equilibrium rate for two substrates, one product."""
500
+ return k_re * (s1 * s2 - p1 / q)
501
+
502
+
503
+ def _michaelis_menten_1s_2i(
504
+ s: float,
505
+ i1: float,
506
+ i2: float,
507
+ vmax: float,
508
+ km: float,
509
+ ki1: float,
510
+ ki2: float,
511
+ ) -> float:
512
+ """Irreversible Michaelis-Menten rate for one substrate with two inhibitors."""
513
+ return vmax * s / (s + km * (1 + i1 / ki1 + i2 / ki2))
514
+
515
+
516
+ def _michaelis_menten_1s_1i(
517
+ s: float,
518
+ i: float,
519
+ vmax: float,
520
+ km: float,
521
+ ki: float,
522
+ ) -> float:
523
+ """Irreversible Michaelis-Menten rate for one substrate with one inhibitor."""
524
+ return vmax * s / (s + km * (1 + i / ki))
525
+
526
+
527
+ def _rate_prk(
528
+ ru5p: float,
529
+ atp: float,
530
+ pi: float,
531
+ pga: float,
532
+ rubp: float,
533
+ adp: float,
534
+ v13: float,
535
+ km131: float,
536
+ km132: float,
537
+ ki131: float,
538
+ ki132: float,
539
+ ki133: float,
540
+ ki134: float,
541
+ ki135: float,
542
+ ) -> float:
543
+ """Phosphoribulokinase rate: ordered bi-substrate kinetics with PGA, RuBP, Pi and ADP inhibition."""
544
+ return (
545
+ v13
546
+ * ru5p
547
+ * atp
548
+ / (
549
+ (ru5p + km131 * (1 + pga / ki131 + rubp / ki132 + pi / ki133))
550
+ * (atp * (1 + adp / ki134) + km132 * (1 + adp / ki135))
551
+ )
552
+ )
553
+
554
+
555
+ def _rate_out(
556
+ s1: float,
557
+ n_total: float,
558
+ vmax_efflux: float,
559
+ k_efflux: float,
560
+ ) -> float:
561
+ """Individual substrate export rate normalised by the translocator occupancy N."""
562
+ return vmax_efflux * s1 / (n_total * k_efflux)
563
+
564
+
565
+ def _rate_starch(
566
+ g1p: float,
567
+ atp: float,
568
+ adp: float,
569
+ pi: float,
570
+ pga: float,
571
+ f6p: float,
572
+ fbp: float,
573
+ v_st: float,
574
+ kmst1: float,
575
+ kmst2: float,
576
+ ki_st: float,
577
+ kast1: float,
578
+ kast2: float,
579
+ kast3: float,
580
+ ) -> float:
581
+ """Starch synthesis rate via G1P+ATP with ADP inhibition and allosteric activation by PGA/F6P/FBP."""
582
+ return (
583
+ v_st
584
+ * g1p
585
+ * atp
586
+ / (
587
+ (g1p + kmst1)
588
+ * (
589
+ (1 + adp / ki_st) * (atp + kmst2)
590
+ + kmst2 * pi / (kast1 * pga + kast2 * f6p + kast3 * fbp)
591
+ )
592
+ )
593
+ )
594
+
595
+
596
+ def _ps2states_2016_phd_surrogate(
597
+ pq_ox: float,
598
+ pq_red: float,
599
+ ps2cs: float,
600
+ quencher: float,
601
+ psii_tot: float,
602
+ k2: float,
603
+ k_f: float,
604
+ _kh: float,
605
+ keq_pq_red: float,
606
+ k_pq_red: float,
607
+ pfd: float,
608
+ k_h0: float,
609
+ ) -> tuple[float, float, float, float]:
610
+ """PSII state populations (PHD quenching model, 2016) via analytical closed-form surrogate."""
611
+ x0 = k_f**2
612
+ x1 = k_h0**2
613
+ x2 = k2 * k_f
614
+ x3 = k2 * k_h0
615
+ x4 = 2 * k_f
616
+ x5 = k_h0 * x4
617
+ x6 = _kh * quencher
618
+ x7 = k2 * x6
619
+ x8 = x4 * x6
620
+ x9 = 2 * x6
621
+ x10 = k_h0 * x9
622
+ x11 = _kh**2 * quencher**2
623
+ x12 = k2 * keq_pq_red
624
+ x13 = k_pq_red * keq_pq_red * pq_ox
625
+ x14 = k_pq_red * pq_red
626
+ x15 = k2 * x14
627
+ x16 = pfd * ps2cs
628
+ x17 = k_f * x14
629
+ x18 = k_h0 * x14
630
+ x19 = x14 * x6
631
+ x20 = x13 * x16
632
+ x21 = keq_pq_red * x16
633
+ x22 = (
634
+ x0 * x14
635
+ + x1 * x14
636
+ + x11 * x14
637
+ + x14 * x2
638
+ + x14 * x3
639
+ + x14 * x5
640
+ + x14 * x7
641
+ + x14 * x8
642
+ + x18 * x9
643
+ + x2 * x21
644
+ + x21 * x3
645
+ + x21 * x7
646
+ )
647
+ x23 = psii_tot / (
648
+ k_f * x20
649
+ + k_h0 * x20
650
+ + pfd**2 * ps2cs**2 * x12
651
+ + x0 * x13
652
+ + x1 * x13
653
+ + x10 * x13
654
+ + x11 * x13
655
+ + x13 * x2
656
+ + x13 * x3
657
+ + x13 * x5
658
+ + x13 * x7
659
+ + x13 * x8
660
+ + x15 * x16
661
+ + x16 * x17
662
+ + x16 * x18
663
+ + x16 * x19
664
+ + x20 * x6
665
+ + x22
666
+ )
667
+ x24 = x16 * x23
668
+ _B0 = x13 * x23 * (x0 + x1 + x10 + x11 + x2 + x3 + x5 + x7 + x8)
669
+ _B1 = x13 * x24 * (k_f + k_h0 + x6)
670
+ _B2 = x22 * x23
671
+ _B3 = x24 * (x12 * x16 + x15 + x17 + x18 + x19)
672
+ return _B0, _B1, _B2, _B3
673
+
674
+
675
+ def _div(
676
+ x: float,
677
+ y: float,
678
+ ) -> float:
679
+ """Return x / y."""
680
+ return x / y
681
+
682
+
683
+ def _rate_fluorescence(
684
+ q: float,
685
+ b0: float,
686
+ b2: float,
687
+ ps2cs: float,
688
+ k2: float,
689
+ k_f: float,
690
+ k_h: float,
691
+ ) -> float:
692
+ """Chlorophyll fluorescence yield from open (B0) and closed (B2) PSII centres."""
693
+ return ps2cs * k_f * b0 / (k_f + k2 + k_h * q) + ps2cs * k_f * b2 / (k_f + k_h * q)
694
+
695
+
696
+ def create_model() -> Model:
697
+ """Matuszynska 2019 photosynthesis model with NPQ, state transitions, and Calvin cycle.
698
+
699
+ Reference: Matuszyńska, Anna, Nima P. Saadat, and Oliver Ebenhöh.
700
+ "Balancing energy supply during photosynthesis - a theoretical perspective."
701
+ Physiologia plantarum 166.1 (2019): 392-402.
702
+ """
703
+ m: Model = Model()
704
+ m = m.add_variable("3PGA", initial_value=0.9928653922138561)
705
+ m = m.add_variable("BPGA", initial_value=0.0005297732935310749)
706
+ m = m.add_variable("GAP", initial_value=0.0062663539939955834)
707
+ m = m.add_variable("DHAP", initial_value=0.13785977143668732)
708
+ m = m.add_variable("FBP", initial_value=0.006133532145409954)
709
+ m = m.add_variable("F6P", initial_value=0.31271973359685457)
710
+ m = m.add_variable("G6P", initial_value=0.719255387166192)
711
+ m = m.add_variable("G1P", initial_value=0.041716812452951633)
712
+ m = m.add_variable("SBP", initial_value=0.013123745088361893)
713
+ m = m.add_variable("S7P", initial_value=0.15890073845176905)
714
+ m = m.add_variable("E4P", initial_value=0.007322797350442026)
715
+ m = m.add_variable("X5P", initial_value=0.022478763225333428)
716
+ m = m.add_variable("R5P", initial_value=0.037651927659696716)
717
+ m = m.add_variable("RUBP", initial_value=0.13184790283048484)
718
+ m = m.add_variable("RU5P", initial_value=0.015060770937455408)
719
+ m = m.add_variable("ATP", initial_value=1.612922506604933)
720
+ m = m.add_variable("Ferredoxine (oxidised)", initial_value=3.8624032084329674)
721
+ m = m.add_variable("protons_lumen", initial_value=0.002208423037307405)
722
+ m = m.add_variable("Light-harvesting complex", initial_value=0.80137477470646)
723
+ m = m.add_variable("NADPH", initial_value=0.491395685599137)
724
+ m = m.add_variable("Plastocyanine (oxidised)", initial_value=1.885391998090184)
725
+ m = m.add_variable("Plastoquinone (oxidised)", initial_value=10.991562708096392)
726
+ m = m.add_variable("PsbS (de-protonated)", initial_value=0.9610220887579118)
727
+ m = m.add_variable("Violaxanthin", initial_value=0.9514408605906095)
728
+ m = m.add_parameter("protons", value=1.2589254117941661e-05)
729
+ m = m.add_parameter("pH", value=7.9)
730
+ m = m.add_parameter("CO2 (dissolved)", value=0.2)
731
+ m = m.add_parameter("O2 (dissolved)_lumen", value=8.0)
732
+ m = m.add_parameter("PPFD", value=100.0)
733
+ m = m.add_parameter("bH", value=100.0)
734
+ m = m.add_parameter("F", value=96.485)
735
+ m = m.add_parameter("E^0_PC", value=0.38)
736
+ m = m.add_parameter("E^0_P700", value=0.48)
737
+ m = m.add_parameter("E^0_FA", value=-0.55)
738
+ m = m.add_parameter("E^0_Fd", value=-0.43)
739
+ m = m.add_parameter("E^0_NADP", value=-0.113)
740
+ m = m.add_parameter("convf", value=0.032)
741
+ m = m.add_parameter("R", value=0.0083)
742
+ m = m.add_parameter("T", value=298.0)
743
+ m = m.add_parameter("Carotenoids_tot", value=1.0)
744
+ m = m.add_parameter("Fd*", value=5.0)
745
+ m = m.add_parameter("PC_tot", value=4.0)
746
+ m = m.add_parameter("PSBS_tot", value=1.0)
747
+ m = m.add_parameter("LHC_tot", value=1.0)
748
+ m = m.add_parameter("gamma0", value=0.1)
749
+ m = m.add_parameter("gamma1", value=0.25)
750
+ m = m.add_parameter("gamma2", value=0.6)
751
+ m = m.add_parameter("gamma3", value=0.15)
752
+ m = m.add_parameter("kZSat", value=0.12)
753
+ m = m.add_parameter("E^0_QA", value=-0.14)
754
+ m = m.add_parameter("E^0_PQ", value=0.354)
755
+ m = m.add_parameter("PQ_tot", value=17.5)
756
+ m = m.add_parameter("staticAntII", value=0.1)
757
+ m = m.add_parameter("staticAntI", value=0.37)
758
+ m = m.add_parameter("NADP*", value=0.8)
759
+ m = m.add_parameter("A*P", value=2.55)
760
+ m = m.add_parameter("Pi_tot", value=17.05)
761
+ m = m.add_parameter("kf_atp_synthase", value=20.0)
762
+ m = m.add_parameter("HPR", value=4.666666666666667)
763
+ m = m.add_parameter("Pi_mol", value=0.01)
764
+ m = m.add_parameter("DeltaG0_ATP", value=30.6)
765
+ m = m.add_parameter("kcat_b6f", value=2.5)
766
+ m = m.add_parameter("kh_lhc_protonation", value=3.0)
767
+ m = m.add_parameter("kf_lhc_protonation", value=0.0096)
768
+ m = m.add_parameter("ksat_lhc_protonation", value=5.8)
769
+ m = m.add_parameter("kf_lhc_deprotonation", value=0.0096)
770
+ m = m.add_parameter("kf_cyclic_electron_flow", value=1.0)
771
+ m = m.add_parameter("kf_violaxanthin_deepoxidase", value=0.0024)
772
+ m = m.add_parameter("kh_violaxanthin_deepoxidase", value=5.0)
773
+ m = m.add_parameter("ksat_violaxanthin_deepoxidase", value=5.8)
774
+ m = m.add_parameter("kf_zeaxanthin_epoxidase", value=0.00024)
775
+ m = m.add_parameter("km_fnr_Ferredoxine (reduced)", value=1.56)
776
+ m = m.add_parameter("km_fnr_NADP", value=0.22)
777
+ m = m.add_parameter("E0_fnr", value=3.0)
778
+ m = m.add_parameter("kcat_fnr", value=500.0)
779
+ m = m.add_parameter("kf_ndh", value=0.002)
780
+ m = m.add_parameter("PSII_total", value=2.5)
781
+ m = m.add_parameter("PSI_total", value=2.5)
782
+ m = m.add_parameter("kH0", value=500000000.0)
783
+ m = m.add_parameter("kPQred", value=250.0)
784
+ m = m.add_parameter("kPCox", value=2500.0)
785
+ m = m.add_parameter("kFdred", value=250000.0)
786
+ m = m.add_parameter("k2", value=5000000000.0)
787
+ m = m.add_parameter("kH", value=5000000000.0)
788
+ m = m.add_parameter("kF", value=625000000.0)
789
+ m = m.add_parameter("kf_proton_leak", value=10.0)
790
+ m = m.add_parameter("kPTOX", value=0.01)
791
+ m = m.add_parameter("kStt7", value=0.0035)
792
+ m = m.add_parameter("km_lhc_state_transition_12", value=0.2)
793
+ m = m.add_parameter("n_ST", value=2.0)
794
+ m = m.add_parameter("kPph1", value=0.0013)
795
+ m = m.add_parameter("E0_rubisco", value=1.0)
796
+ m = m.add_parameter("kcat_rubisco_carboxylase", value=2.72)
797
+ m = m.add_parameter("km_rubisco_carboxylase_RUBP", value=0.02)
798
+ m = m.add_parameter("km_rubisco_carboxylase_CO2 (dissolved)", value=0.0107)
799
+ m = m.add_parameter("ki_rubisco_carboxylase_3PGA", value=0.04)
800
+ m = m.add_parameter("ki_rubisco_carboxylase_FBP", value=0.04)
801
+ m = m.add_parameter("ki_rubisco_carboxylase_SBP", value=0.075)
802
+ m = m.add_parameter("ki_rubisco_carboxylase_Orthophosphate", value=0.9)
803
+ m = m.add_parameter("ki_rubisco_carboxylase_NADPH", value=0.07)
804
+ m = m.add_parameter("kre_phosphoglycerate_kinase", value=800000000.0)
805
+ m = m.add_parameter("keq_phosphoglycerate_kinase", value=0.00031)
806
+ m = m.add_parameter("kre_gadph", value=800000000.0)
807
+ m = m.add_parameter("keq_gadph", value=16000000.0)
808
+ m = m.add_parameter("kre_triose_phosphate_isomerase", value=800000000.0)
809
+ m = m.add_parameter("keq_triose_phosphate_isomerase", value=22.0)
810
+ m = m.add_parameter("kre_aldolase_dhap_gap", value=800000000.0)
811
+ m = m.add_parameter("keq_aldolase_dhap_gap", value=7.1)
812
+ m = m.add_parameter("kre_aldolase_dhap_e4p", value=800000000.0)
813
+ m = m.add_parameter("keq_aldolase_dhap_e4p", value=13.0)
814
+ m = m.add_parameter("E0_fbpase", value=1.0)
815
+ m = m.add_parameter("kcat_fbpase", value=1.6)
816
+ m = m.add_parameter("km_fbpase_s", value=0.03)
817
+ m = m.add_parameter("ki_fbpase_F6P", value=0.7)
818
+ m = m.add_parameter("ki_fbpase_Orthophosphate", value=12.0)
819
+ m = m.add_parameter("kre_transketolase_gap_f6p", value=800000000.0)
820
+ m = m.add_parameter("keq_transketolase_gap_f6p", value=0.084)
821
+ m = m.add_parameter("kre_transketolase_gap_s7p", value=800000000.0)
822
+ m = m.add_parameter("keq_transketolase_gap_s7p", value=0.85)
823
+ m = m.add_parameter("E0_SBPase", value=1.0)
824
+ m = m.add_parameter("kcat_SBPase", value=0.32)
825
+ m = m.add_parameter("km_SBPase_s", value=0.013)
826
+ m = m.add_parameter("ki_SBPase_Orthophosphate", value=12.0)
827
+ m = m.add_parameter("kre_ribose_phosphate_isomerase", value=800000000.0)
828
+ m = m.add_parameter("keq_ribose_phosphate_isomerase", value=0.4)
829
+ m = m.add_parameter("kre_ribulose_phosphate_epimerase", value=800000000.0)
830
+ m = m.add_parameter("keq_ribulose_phosphate_epimerase", value=0.67)
831
+ m = m.add_parameter("E0_phosphoribulokinase", value=1.0)
832
+ m = m.add_parameter("kcat_phosphoribulokinase", value=7.9992)
833
+ m = m.add_parameter("km_phosphoribulokinase_RU5P", value=0.05)
834
+ m = m.add_parameter("km_phosphoribulokinase_ATP", value=0.05)
835
+ m = m.add_parameter("ki_phosphoribulokinase_3PGA", value=2.0)
836
+ m = m.add_parameter("ki_phosphoribulokinase_RUBP", value=0.7)
837
+ m = m.add_parameter("ki_phosphoribulokinase_Orthophosphate", value=4.0)
838
+ m = m.add_parameter("ki_phosphoribulokinase_4", value=2.5)
839
+ m = m.add_parameter("ki_phosphoribulokinase_5", value=0.4)
840
+ m = m.add_parameter("kre_g6pi", value=800000000.0)
841
+ m = m.add_parameter("keq_g6pi", value=2.3)
842
+ m = m.add_parameter("kre_phosphoglucomutase", value=800000000.0)
843
+ m = m.add_parameter("keq_phosphoglucomutase", value=0.058)
844
+ m = m.add_parameter("Orthophosphate (external)", value=0.5)
845
+ m = m.add_parameter("km_ex_pga", value=0.25)
846
+ m = m.add_parameter("km_ex_gap", value=0.075)
847
+ m = m.add_parameter("km_ex_dhap", value=0.077)
848
+ m = m.add_parameter("km_N_translocator_Orthophosphate (external)", value=0.74)
849
+ m = m.add_parameter("km_N_translocator_Orthophosphate", value=0.63)
850
+ m = m.add_parameter("kcat_N_translocator", value=2.0)
851
+ m = m.add_parameter("E0_N_translocator", value=1.0)
852
+ m = m.add_parameter("E0_ex_g1p", value=1.0)
853
+ m = m.add_parameter("km_ex_g1p_G1P", value=0.08)
854
+ m = m.add_parameter("km_ex_g1p_ATP", value=0.08)
855
+ m = m.add_parameter("ki_ex_g1p", value=10.0)
856
+ m = m.add_parameter("ki_ex_g1p_3PGA", value=0.1)
857
+ m = m.add_parameter("ki_ex_g1p_F6P", value=0.02)
858
+ m = m.add_parameter("ki_ex_g1p_FBP", value=0.02)
859
+ m = m.add_parameter("kcat_ex_g1p", value=0.32)
860
+ m = m.add_derived(
861
+ "RT",
862
+ fn=_mass_action_1s,
863
+ args=["R", "T"],
864
+ )
865
+ m = m.add_derived(
866
+ "dG_pH",
867
+ fn=_dg_ph,
868
+ args=["R", "T"],
869
+ )
870
+ m = m.add_derived(
871
+ "pH_lumen",
872
+ fn=_ph_lumen,
873
+ args=["protons_lumen"],
874
+ )
875
+ m = m.add_derived(
876
+ "Zeaxanthin",
877
+ fn=_moiety_1,
878
+ args=["Violaxanthin", "Carotenoids_tot"],
879
+ )
880
+ m = m.add_derived(
881
+ "Ferredoxine (reduced)",
882
+ fn=_moiety_1,
883
+ args=["Ferredoxine (oxidised)", "Fd*"],
884
+ )
885
+ m = m.add_derived(
886
+ "Plastocyanine (reduced)",
887
+ fn=_moiety_1,
888
+ args=["Plastocyanine (oxidised)", "PC_tot"],
889
+ )
890
+ m = m.add_derived(
891
+ "PsbS (protonated)",
892
+ fn=_moiety_1,
893
+ args=["PsbS (de-protonated)", "PSBS_tot"],
894
+ )
895
+ m = m.add_derived(
896
+ "Light-harvesting complex (protonated)",
897
+ fn=_moiety_1,
898
+ args=["Light-harvesting complex", "LHC_tot"],
899
+ )
900
+ m = m.add_derived(
901
+ "Q",
902
+ fn=_quencher,
903
+ args=[
904
+ "PsbS (de-protonated)",
905
+ "Violaxanthin",
906
+ "PsbS (protonated)",
907
+ "Zeaxanthin",
908
+ "gamma0",
909
+ "gamma1",
910
+ "gamma2",
911
+ "gamma3",
912
+ "kZSat",
913
+ ],
914
+ )
915
+ m = m.add_derived(
916
+ "keq_Plastoquinone (reduced)",
917
+ fn=_keq_pq_red,
918
+ args=["E^0_QA", "F", "E^0_PQ", "pH", "dG_pH", "RT"],
919
+ )
920
+ m = m.add_derived(
921
+ "Plastoquinone (reduced)",
922
+ fn=_moiety_1,
923
+ args=["Plastoquinone (oxidised)", "PQ_tot"],
924
+ )
925
+ m = m.add_derived(
926
+ "PSII_cross_section",
927
+ fn=_ps2_crosssection,
928
+ args=["Light-harvesting complex", "staticAntII", "staticAntI"],
929
+ )
930
+ m = m.add_derived(
931
+ "NADP",
932
+ fn=_moiety_1,
933
+ args=["NADPH", "NADP*"],
934
+ )
935
+ m = m.add_derived(
936
+ "ADP",
937
+ fn=_moiety_1,
938
+ args=["ATP", "A*P"],
939
+ )
940
+ m = m.add_derived(
941
+ "Orthophosphate",
942
+ fn=_pi_cbb,
943
+ args=[
944
+ "Pi_tot",
945
+ "3PGA",
946
+ "BPGA",
947
+ "GAP",
948
+ "DHAP",
949
+ "FBP",
950
+ "F6P",
951
+ "G6P",
952
+ "G1P",
953
+ "SBP",
954
+ "S7P",
955
+ "E4P",
956
+ "X5P",
957
+ "R5P",
958
+ "RUBP",
959
+ "RU5P",
960
+ "ATP",
961
+ ],
962
+ )
963
+ m = m.add_derived(
964
+ "keq_atp_synthase",
965
+ fn=_keq_atp,
966
+ args=["pH_lumen", "DeltaG0_ATP", "dG_pH", "HPR", "pH", "Pi_mol", "RT"],
967
+ )
968
+ m = m.add_derived(
969
+ "keq_b6f",
970
+ fn=_keq_cytb6f,
971
+ args=["pH_lumen", "F", "E^0_PQ", "E^0_PC", "pH", "RT", "dG_pH"],
972
+ )
973
+ m = m.add_derived(
974
+ "keq_fnr",
975
+ fn=_keq_fnr,
976
+ args=["E^0_Fd", "F", "E^0_NADP", "pH", "dG_pH", "RT"],
977
+ )
978
+ m = m.add_derived(
979
+ "vmax_fnr",
980
+ fn=_mass_action_1s,
981
+ args=["kcat_fnr", "E0_fnr"],
982
+ )
983
+ m = m.add_derived(
984
+ "keq_PCP700",
985
+ fn=_keq_pcp700,
986
+ args=["E^0_PC", "F", "E^0_P700", "RT"],
987
+ )
988
+ m = m.add_derived(
989
+ "keq_ferredoxin_reductase",
990
+ fn=_keq_faf_d,
991
+ args=["E^0_FA", "F", "E^0_Fd", "RT"],
992
+ )
993
+ m = m.add_derived(
994
+ "A1",
995
+ fn=_ps1states_2019,
996
+ args=[
997
+ "Plastocyanine (oxidised)",
998
+ "Plastocyanine (reduced)",
999
+ "Ferredoxine (oxidised)",
1000
+ "Ferredoxine (reduced)",
1001
+ "PSII_cross_section",
1002
+ "PSI_total",
1003
+ "kFdred",
1004
+ "keq_ferredoxin_reductase",
1005
+ "keq_PCP700",
1006
+ "kPCox",
1007
+ "PPFD",
1008
+ ],
1009
+ )
1010
+ m = m.add_derived(
1011
+ "vmax_rubisco_carboxylase",
1012
+ fn=_mass_action_1s,
1013
+ args=["kcat_rubisco_carboxylase", "E0_rubisco"],
1014
+ )
1015
+ m = m.add_derived(
1016
+ "vmax_fbpase",
1017
+ fn=_mass_action_1s,
1018
+ args=["kcat_fbpase", "E0_fbpase"],
1019
+ )
1020
+ m = m.add_derived(
1021
+ "vmax_SBPase",
1022
+ fn=_mass_action_1s,
1023
+ args=["kcat_SBPase", "E0_SBPase"],
1024
+ )
1025
+ m = m.add_derived(
1026
+ "vmax_phosphoribulokinase",
1027
+ fn=_mass_action_1s,
1028
+ args=["kcat_phosphoribulokinase", "E0_phosphoribulokinase"],
1029
+ )
1030
+ m = m.add_derived(
1031
+ "vmax_ex_pga",
1032
+ fn=_mass_action_1s,
1033
+ args=["kcat_N_translocator", "E0_N_translocator"],
1034
+ )
1035
+ m = m.add_derived(
1036
+ "N_translocator",
1037
+ fn=_rate_translocator,
1038
+ args=[
1039
+ "Orthophosphate",
1040
+ "3PGA",
1041
+ "GAP",
1042
+ "DHAP",
1043
+ "km_N_translocator_Orthophosphate (external)",
1044
+ "Orthophosphate (external)",
1045
+ "km_N_translocator_Orthophosphate",
1046
+ "km_ex_pga",
1047
+ "km_ex_gap",
1048
+ "km_ex_dhap",
1049
+ ],
1050
+ )
1051
+ m = m.add_derived(
1052
+ "vmax_ex_g1p",
1053
+ fn=_mass_action_1s,
1054
+ args=["kcat_ex_g1p", "E0_ex_g1p"],
1055
+ )
1056
+ m = m.add_reaction(
1057
+ "atp_synthase",
1058
+ fn=_rate_atp_synthase_2019,
1059
+ args=["ATP", "ADP", "keq_atp_synthase", "kf_atp_synthase", "convf"],
1060
+ stoichiometry={
1061
+ "protons_lumen": Derived(fn=_neg_div, args=["HPR", "bH"]),
1062
+ "ATP": Derived(fn=_value, args=["convf"]),
1063
+ },
1064
+ )
1065
+ m = m.add_reaction(
1066
+ "b6f",
1067
+ fn=_b6f,
1068
+ args=[
1069
+ "Plastocyanine (oxidised)",
1070
+ "Plastoquinone (oxidised)",
1071
+ "Plastoquinone (reduced)",
1072
+ "Plastocyanine (reduced)",
1073
+ "keq_b6f",
1074
+ "kcat_b6f",
1075
+ ],
1076
+ stoichiometry={
1077
+ "Plastocyanine (oxidised)": -2,
1078
+ "Plastoquinone (oxidised)": 1,
1079
+ "protons_lumen": Derived(fn=_four_div_by, args=["bH"]),
1080
+ },
1081
+ )
1082
+ m = m.add_reaction(
1083
+ "lhc_protonation",
1084
+ fn=_protonation_hill,
1085
+ args=[
1086
+ "PsbS (de-protonated)",
1087
+ "protons_lumen",
1088
+ "kh_lhc_protonation",
1089
+ "kf_lhc_protonation",
1090
+ "ksat_lhc_protonation",
1091
+ ],
1092
+ stoichiometry={"PsbS (de-protonated)": -1},
1093
+ )
1094
+ m = m.add_reaction(
1095
+ "lhc_deprotonation",
1096
+ fn=_mass_action_1s,
1097
+ args=["PsbS (protonated)", "kf_lhc_deprotonation"],
1098
+ stoichiometry={"PsbS (de-protonated)": 1},
1099
+ )
1100
+ m = m.add_reaction(
1101
+ "cyclic_electron_flow",
1102
+ fn=_rate_cyclic_electron_flow,
1103
+ args=[
1104
+ "Plastoquinone (oxidised)",
1105
+ "Ferredoxine (reduced)",
1106
+ "kf_cyclic_electron_flow",
1107
+ ],
1108
+ stoichiometry={"Plastoquinone (oxidised)": -1, "Ferredoxine (oxidised)": 2},
1109
+ )
1110
+ m = m.add_reaction(
1111
+ "violaxanthin_deepoxidase",
1112
+ fn=_rate_protonation_hill,
1113
+ args=[
1114
+ "Violaxanthin",
1115
+ "protons_lumen",
1116
+ "kf_violaxanthin_deepoxidase",
1117
+ "kh_violaxanthin_deepoxidase",
1118
+ "ksat_violaxanthin_deepoxidase",
1119
+ ],
1120
+ stoichiometry={"Violaxanthin": -1},
1121
+ )
1122
+ m = m.add_reaction(
1123
+ "zeaxanthin_epoxidase",
1124
+ fn=_mass_action_1s,
1125
+ args=["Zeaxanthin", "kf_zeaxanthin_epoxidase"],
1126
+ stoichiometry={"Violaxanthin": 1},
1127
+ )
1128
+ m = m.add_reaction(
1129
+ "fnr",
1130
+ fn=_rate_fnr_2019,
1131
+ args=[
1132
+ "Ferredoxine (oxidised)",
1133
+ "Ferredoxine (reduced)",
1134
+ "NADPH",
1135
+ "NADP",
1136
+ "km_fnr_Ferredoxine (reduced)",
1137
+ "km_fnr_NADP",
1138
+ "vmax_fnr",
1139
+ "keq_fnr",
1140
+ "convf",
1141
+ ],
1142
+ stoichiometry={
1143
+ "Ferredoxine (oxidised)": 2,
1144
+ "NADPH": Derived(fn=_value, args=["convf"]),
1145
+ },
1146
+ )
1147
+ m = m.add_reaction(
1148
+ "ndh",
1149
+ fn=_mass_action_1s,
1150
+ args=["Plastoquinone (oxidised)", "kf_ndh"],
1151
+ stoichiometry={"Plastoquinone (oxidised)": -1},
1152
+ )
1153
+ m = m.add_reaction(
1154
+ "PSII",
1155
+ fn=_rate_ps2,
1156
+ args=["B1", "k2"],
1157
+ stoichiometry={
1158
+ "Plastoquinone (oxidised)": -1,
1159
+ "protons_lumen": Derived(fn=_two_div_by, args=["bH"]),
1160
+ },
1161
+ )
1162
+ m = m.add_reaction(
1163
+ "PSI",
1164
+ fn=_rate_ps1,
1165
+ args=["A1", "PSII_cross_section", "PPFD"],
1166
+ stoichiometry={"Ferredoxine (oxidised)": -1, "Plastocyanine (oxidised)": 1},
1167
+ )
1168
+ m = m.add_reaction(
1169
+ "proton_leak",
1170
+ fn=_rate_leak,
1171
+ args=["protons_lumen", "pH", "kf_proton_leak"],
1172
+ stoichiometry={"protons_lumen": Derived(fn=_neg_one_div_by, args=["bH"])},
1173
+ )
1174
+ m = m.add_reaction(
1175
+ "PTOX",
1176
+ fn=_mass_action_2s,
1177
+ args=["Plastoquinone (reduced)", "O2 (dissolved)_lumen", "kPTOX"],
1178
+ stoichiometry={"Plastoquinone (oxidised)": 1},
1179
+ )
1180
+ m = m.add_reaction(
1181
+ "lhc_state_transition_12",
1182
+ fn=_rate_state_transition_ps1_ps2,
1183
+ args=[
1184
+ "Light-harvesting complex",
1185
+ "Plastoquinone (oxidised)",
1186
+ "PQ_tot",
1187
+ "kStt7",
1188
+ "km_lhc_state_transition_12",
1189
+ "n_ST",
1190
+ ],
1191
+ stoichiometry={"Light-harvesting complex": -1},
1192
+ )
1193
+ m = m.add_reaction(
1194
+ "lhc_state_transition_21",
1195
+ fn=_mass_action_1s,
1196
+ args=["Light-harvesting complex (protonated)", "kPph1"],
1197
+ stoichiometry={"Light-harvesting complex": 1},
1198
+ )
1199
+ m = m.add_reaction(
1200
+ "rubisco_carboxylase",
1201
+ fn=_rate_poolman_5i,
1202
+ args=[
1203
+ "RUBP",
1204
+ "3PGA",
1205
+ "CO2 (dissolved)",
1206
+ "vmax_rubisco_carboxylase",
1207
+ "km_rubisco_carboxylase_RUBP",
1208
+ "km_rubisco_carboxylase_CO2 (dissolved)",
1209
+ "ki_rubisco_carboxylase_3PGA",
1210
+ "FBP",
1211
+ "ki_rubisco_carboxylase_FBP",
1212
+ "SBP",
1213
+ "ki_rubisco_carboxylase_SBP",
1214
+ "Orthophosphate",
1215
+ "ki_rubisco_carboxylase_Orthophosphate",
1216
+ "NADPH",
1217
+ "ki_rubisco_carboxylase_NADPH",
1218
+ ],
1219
+ stoichiometry={"RUBP": -1.0, "3PGA": 2.0},
1220
+ )
1221
+ m = m.add_reaction(
1222
+ "phosphoglycerate_kinase",
1223
+ fn=_rapid_equilibrium_2s_2p,
1224
+ args=[
1225
+ "3PGA",
1226
+ "ATP",
1227
+ "BPGA",
1228
+ "ADP",
1229
+ "kre_phosphoglycerate_kinase",
1230
+ "keq_phosphoglycerate_kinase",
1231
+ ],
1232
+ stoichiometry={"3PGA": -1.0, "ATP": -1.0, "BPGA": 1.0},
1233
+ )
1234
+ m = m.add_reaction(
1235
+ "gadph",
1236
+ fn=_rapid_equilibrium_3s_3p,
1237
+ args=[
1238
+ "BPGA",
1239
+ "NADPH",
1240
+ "protons",
1241
+ "GAP",
1242
+ "NADP",
1243
+ "Orthophosphate",
1244
+ "kre_gadph",
1245
+ "keq_gadph",
1246
+ ],
1247
+ stoichiometry={"NADPH": -1.0, "BPGA": -1.0, "GAP": 1.0},
1248
+ )
1249
+ m = m.add_reaction(
1250
+ "triose_phosphate_isomerase",
1251
+ fn=_rapid_equilibrium_1s_1p,
1252
+ args=[
1253
+ "GAP",
1254
+ "DHAP",
1255
+ "kre_triose_phosphate_isomerase",
1256
+ "keq_triose_phosphate_isomerase",
1257
+ ],
1258
+ stoichiometry={"GAP": -1, "DHAP": 1},
1259
+ )
1260
+ m = m.add_reaction(
1261
+ "aldolase_dhap_gap",
1262
+ fn=_rapid_equilibrium_2s_1p,
1263
+ args=["GAP", "DHAP", "FBP", "kre_aldolase_dhap_gap", "keq_aldolase_dhap_gap"],
1264
+ stoichiometry={"GAP": -1, "DHAP": -1, "FBP": 1},
1265
+ )
1266
+ m = m.add_reaction(
1267
+ "aldolase_dhap_e4p",
1268
+ fn=_rapid_equilibrium_2s_1p,
1269
+ args=["DHAP", "E4P", "SBP", "kre_aldolase_dhap_e4p", "keq_aldolase_dhap_e4p"],
1270
+ stoichiometry={"DHAP": -1, "E4P": -1, "SBP": 1},
1271
+ )
1272
+ m = m.add_reaction(
1273
+ "fbpase",
1274
+ fn=_michaelis_menten_1s_2i,
1275
+ args=[
1276
+ "FBP",
1277
+ "F6P",
1278
+ "Orthophosphate",
1279
+ "vmax_fbpase",
1280
+ "km_fbpase_s",
1281
+ "ki_fbpase_F6P",
1282
+ "ki_fbpase_Orthophosphate",
1283
+ ],
1284
+ stoichiometry={"FBP": -1, "F6P": 1},
1285
+ )
1286
+ m = m.add_reaction(
1287
+ "transketolase_gap_f6p",
1288
+ fn=_rapid_equilibrium_2s_2p,
1289
+ args=[
1290
+ "GAP",
1291
+ "F6P",
1292
+ "E4P",
1293
+ "X5P",
1294
+ "kre_transketolase_gap_f6p",
1295
+ "keq_transketolase_gap_f6p",
1296
+ ],
1297
+ stoichiometry={"GAP": -1, "F6P": -1, "E4P": 1, "X5P": 1},
1298
+ )
1299
+ m = m.add_reaction(
1300
+ "transketolase_gap_s7p",
1301
+ fn=_rapid_equilibrium_2s_2p,
1302
+ args=[
1303
+ "GAP",
1304
+ "S7P",
1305
+ "R5P",
1306
+ "X5P",
1307
+ "kre_transketolase_gap_s7p",
1308
+ "keq_transketolase_gap_s7p",
1309
+ ],
1310
+ stoichiometry={"GAP": -1, "S7P": -1, "R5P": 1, "X5P": 1},
1311
+ )
1312
+ m = m.add_reaction(
1313
+ "SBPase",
1314
+ fn=_michaelis_menten_1s_1i,
1315
+ args=[
1316
+ "SBP",
1317
+ "Orthophosphate",
1318
+ "vmax_SBPase",
1319
+ "km_SBPase_s",
1320
+ "ki_SBPase_Orthophosphate",
1321
+ ],
1322
+ stoichiometry={"SBP": -1, "S7P": 1},
1323
+ )
1324
+ m = m.add_reaction(
1325
+ "ribose_phosphate_isomerase",
1326
+ fn=_rapid_equilibrium_1s_1p,
1327
+ args=[
1328
+ "R5P",
1329
+ "RU5P",
1330
+ "kre_ribose_phosphate_isomerase",
1331
+ "keq_ribose_phosphate_isomerase",
1332
+ ],
1333
+ stoichiometry={"R5P": -1, "RU5P": 1},
1334
+ )
1335
+ m = m.add_reaction(
1336
+ "ribulose_phosphate_epimerase",
1337
+ fn=_rapid_equilibrium_1s_1p,
1338
+ args=[
1339
+ "X5P",
1340
+ "RU5P",
1341
+ "kre_ribulose_phosphate_epimerase",
1342
+ "keq_ribulose_phosphate_epimerase",
1343
+ ],
1344
+ stoichiometry={"X5P": -1, "RU5P": 1},
1345
+ )
1346
+ m = m.add_reaction(
1347
+ "phosphoribulokinase",
1348
+ fn=_rate_prk,
1349
+ args=[
1350
+ "RU5P",
1351
+ "ATP",
1352
+ "Orthophosphate",
1353
+ "3PGA",
1354
+ "RUBP",
1355
+ "ADP",
1356
+ "vmax_phosphoribulokinase",
1357
+ "km_phosphoribulokinase_RU5P",
1358
+ "km_phosphoribulokinase_ATP",
1359
+ "ki_phosphoribulokinase_3PGA",
1360
+ "ki_phosphoribulokinase_RUBP",
1361
+ "ki_phosphoribulokinase_Orthophosphate",
1362
+ "ki_phosphoribulokinase_4",
1363
+ "ki_phosphoribulokinase_5",
1364
+ ],
1365
+ stoichiometry={"RU5P": -1.0, "ATP": -1.0, "RUBP": 1.0},
1366
+ )
1367
+ m = m.add_reaction(
1368
+ "g6pi",
1369
+ fn=_rapid_equilibrium_1s_1p,
1370
+ args=["F6P", "G6P", "kre_g6pi", "keq_g6pi"],
1371
+ stoichiometry={"F6P": -1, "G6P": 1},
1372
+ )
1373
+ m = m.add_reaction(
1374
+ "phosphoglucomutase",
1375
+ fn=_rapid_equilibrium_1s_1p,
1376
+ args=["G6P", "G1P", "kre_phosphoglucomutase", "keq_phosphoglucomutase"],
1377
+ stoichiometry={"G6P": -1, "G1P": 1},
1378
+ )
1379
+ m = m.add_reaction(
1380
+ "ex_pga",
1381
+ fn=_rate_out,
1382
+ args=["3PGA", "N_translocator", "vmax_ex_pga", "km_ex_pga"],
1383
+ stoichiometry={"3PGA": -1},
1384
+ )
1385
+ m = m.add_reaction(
1386
+ "ex_gap",
1387
+ fn=_rate_out,
1388
+ args=["GAP", "N_translocator", "vmax_ex_pga", "km_ex_gap"],
1389
+ stoichiometry={"GAP": -1},
1390
+ )
1391
+ m = m.add_reaction(
1392
+ "ex_dhap",
1393
+ fn=_rate_out,
1394
+ args=["DHAP", "N_translocator", "vmax_ex_pga", "km_ex_dhap"],
1395
+ stoichiometry={"DHAP": -1},
1396
+ )
1397
+ m = m.add_reaction(
1398
+ "ex_g1p",
1399
+ fn=_rate_starch,
1400
+ args=[
1401
+ "G1P",
1402
+ "ATP",
1403
+ "ADP",
1404
+ "Orthophosphate",
1405
+ "3PGA",
1406
+ "F6P",
1407
+ "FBP",
1408
+ "vmax_ex_g1p",
1409
+ "km_ex_g1p_G1P",
1410
+ "km_ex_g1p_ATP",
1411
+ "ki_ex_g1p",
1412
+ "ki_ex_g1p_3PGA",
1413
+ "ki_ex_g1p_F6P",
1414
+ "ki_ex_g1p_FBP",
1415
+ ],
1416
+ stoichiometry={"G1P": -1.0, "ATP": -1.0},
1417
+ )
1418
+ m = m.add_surrogate(
1419
+ "ps2states",
1420
+ qss.Surrogate(
1421
+ model=_ps2states_2016_phd_surrogate,
1422
+ args=[
1423
+ "Plastoquinone (oxidised)",
1424
+ "Plastoquinone (reduced)",
1425
+ "PSII_cross_section",
1426
+ "Q",
1427
+ "PSII_total",
1428
+ "k2",
1429
+ "kF",
1430
+ "kH",
1431
+ "keq_Plastoquinone (reduced)",
1432
+ "kPQred",
1433
+ "PPFD",
1434
+ "kH0",
1435
+ ],
1436
+ outputs=["B0", "B1", "B2", "B3"],
1437
+ ),
1438
+ )
1439
+ m = m.add_readout(
1440
+ "PQ_ox/tot",
1441
+ fn=_div,
1442
+ args=["Plastoquinone (reduced)", "PQ_tot"],
1443
+ )
1444
+ m = m.add_readout(
1445
+ "Fd_ox/tot",
1446
+ fn=_div,
1447
+ args=["Ferredoxine (reduced)", "Fd*"],
1448
+ )
1449
+ m = m.add_readout(
1450
+ "PC_ox/tot",
1451
+ fn=_div,
1452
+ args=["Plastocyanine (reduced)", "PC_tot"],
1453
+ )
1454
+ m = m.add_readout(
1455
+ "NADPH/tot",
1456
+ fn=_div,
1457
+ args=["NADPH", "NADP*"],
1458
+ )
1459
+ m = m.add_readout(
1460
+ "ATP/tot",
1461
+ fn=_div,
1462
+ args=["ATP", "A*P"],
1463
+ )
1464
+ m = m.add_readout(
1465
+ "Fluo",
1466
+ fn=_rate_fluorescence,
1467
+ args=["Q", "B0", "B2", "PSII_cross_section", "k2", "kF", "kH"],
1468
+ )
1469
+ return m # noqa: RET504