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,1871 @@
1
+ """Saadat 2021 chloroplast model with ROS scavenging, Calvin cycle, and thioredoxin regulation.
2
+
3
+ Reference: Saadat, Nima P., et al.
4
+ "Computational analysis of alternative photosynthetic electron flows linked with oxidative stress."
5
+ Frontiers in plant science 12 (2021): 750580
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 _moiety_2(
133
+ x1: float,
134
+ x2: float,
135
+ total: float,
136
+ ) -> float:
137
+ """Conservation moiety: total - x1 - x2."""
138
+ return total - x1 - x2
139
+
140
+
141
+ def _glutathion_moiety(
142
+ gssg: float,
143
+ gs_total: float,
144
+ ) -> float:
145
+ """Conservation moiety: GSH = total - 2*GSSG (one GSSG releases two GSH)."""
146
+ return gs_total - 2 * gssg
147
+
148
+
149
+ def _keq_atp(
150
+ p_h: float,
151
+ delta_g0_atp: float,
152
+ d_g_p_h: float,
153
+ hpr: float,
154
+ p_hstroma: float,
155
+ pi_mol: float,
156
+ rt: float,
157
+ ) -> float:
158
+ """Equilibrium constant for ATP synthase, driven by the transmembrane proton gradient."""
159
+ delta_g = delta_g0_atp - d_g_p_h * hpr * (p_hstroma - p_h)
160
+ return pi_mol * math.exp(-delta_g / rt)
161
+
162
+
163
+ def _keq_cytb6f(
164
+ p_h: float,
165
+ f: float,
166
+ e0_pq: float,
167
+ e0_pc: float,
168
+ p_hstroma: float,
169
+ rt: float,
170
+ d_g_p_h: float,
171
+ ) -> float:
172
+ """Equilibrium constant of cytochrome b6f from redox potentials and transmembrane pH gradient."""
173
+ DG1 = -2 * f * e0_pq
174
+ DG2 = -f * e0_pc
175
+ DG = -(DG1 + 2 * d_g_p_h * p_h) + 2 * DG2 + 2 * d_g_p_h * (p_hstroma - p_h)
176
+ return math.exp(-DG / rt)
177
+
178
+
179
+ def _keq_fnr(
180
+ e0_fd: float,
181
+ f: float,
182
+ e0_nadp: float,
183
+ p_hstroma: float,
184
+ d_g_p_h: float,
185
+ rt: float,
186
+ ) -> float:
187
+ """Equilibrium constant for FNR: Fd-mediated NADP+ reduction, pH-corrected."""
188
+ dg1 = -e0_fd * f
189
+ dg2 = -2 * e0_nadp * f
190
+ dg = -2 * dg1 + dg2 + d_g_p_h * p_hstroma
191
+ return math.exp(-dg / rt)
192
+
193
+
194
+ def _keq_pcp700(
195
+ e0_pc: float,
196
+ f: float,
197
+ eo_p700: float,
198
+ rt: float,
199
+ ) -> float:
200
+ """Equilibrium constant for PC -> P700 electron transfer from standard redox potentials."""
201
+ dg1 = -e0_pc * f
202
+ dg2 = -eo_p700 * f
203
+ dg = -dg1 + dg2
204
+ return math.exp(-dg / rt)
205
+
206
+
207
+ def _keq_faf_d(
208
+ e0_fa: float,
209
+ f: float,
210
+ e0_fd: float,
211
+ rt: float,
212
+ ) -> float:
213
+ """Equilibrium constant for FA -> Fd electron transfer from standard redox potentials."""
214
+ dg1 = -e0_fa * f
215
+ dg2 = -e0_fd * f
216
+ dg = -dg1 + dg2
217
+ return math.exp(-dg / rt)
218
+
219
+
220
+ def _mul(
221
+ x: float,
222
+ y: float,
223
+ ) -> float:
224
+ """Calculate the product of two values.
225
+
226
+ Parameters
227
+ ----------
228
+ x
229
+ First factor
230
+ y
231
+ Second factor
232
+
233
+ Returns
234
+ -------
235
+ Float
236
+ Product of x and y (x * y)
237
+
238
+ Examples
239
+ --------
240
+ >>> mul(2.0, 3.0)
241
+ 6.0
242
+ >>> mul(0.5, 4.0)
243
+ 2.0
244
+
245
+ """
246
+ return x * y
247
+
248
+
249
+ def _rate_translocator(
250
+ pi: float,
251
+ pga: float,
252
+ gap: float,
253
+ dhap: float,
254
+ k_pxt: float,
255
+ p_ext: float,
256
+ k_pi: float,
257
+ k_pga: float,
258
+ k_gap: float,
259
+ k_dhap: float,
260
+ ) -> float:
261
+ """Denominator term N for the phosphate translocator shared by all triose-P export reactions."""
262
+ return 1 + (1 + k_pxt / p_ext) * (
263
+ pi / k_pi + pga / k_pga + gap / k_gap + dhap / k_dhap
264
+ )
265
+
266
+
267
+ def _mass_action_2s(
268
+ s1: float,
269
+ s2: float,
270
+ k_fwd: float,
271
+ ) -> float:
272
+ """Mass-action rate for two substrates."""
273
+ return k_fwd * s1 * s2
274
+
275
+
276
+ def _rate_atp_synthase_2019(
277
+ atp: float,
278
+ adp: float,
279
+ keq_at_psynthase: float,
280
+ k_at_psynth: float,
281
+ convf: float,
282
+ ) -> float:
283
+ """ATP synthase rate (2019 formulation): same as 2016 but ADP/ATP scaled by convf."""
284
+ return k_at_psynth * (adp / convf - atp / convf / keq_at_psynthase)
285
+
286
+
287
+ def _neg_div(
288
+ x: float,
289
+ y: float,
290
+ ) -> float:
291
+ """Return -x / y."""
292
+ return -x / y
293
+
294
+
295
+ def _value(
296
+ x: float,
297
+ ) -> float:
298
+ """Return x unchanged."""
299
+ return x
300
+
301
+
302
+ def _b6f(
303
+ pc_ox: float,
304
+ pq_ox: float,
305
+ pq_red: float,
306
+ pc_red: float,
307
+ keq_b6f: float,
308
+ k_cytb6f: float,
309
+ ) -> float:
310
+ """Cytochrome b6f rate: reversible mass action clamped to -kCytb6f to avoid runaway reverse flux."""
311
+ return max(
312
+ k_cytb6f * (pq_red * pc_ox**2 - pq_ox * pc_red**2 / keq_b6f),
313
+ -k_cytb6f,
314
+ )
315
+
316
+
317
+ def _four_div_by(
318
+ x: float,
319
+ ) -> float:
320
+ """Return 4/x; used for the 4-proton stoichiometry of b6f scaled by buffering capacity."""
321
+ return 4.0 / x
322
+
323
+
324
+ def _protons_stroma_2016(
325
+ ph: float,
326
+ ) -> float:
327
+ """Convert stromal pH to proton concentration (µmol/L).
328
+
329
+ Introduced by the Matuszynska 2016 PhD model.
330
+ """
331
+ return 4000.0 * 10 ** (-ph)
332
+
333
+
334
+ def _protonation_hill(
335
+ vx: float,
336
+ h: float,
337
+ nh: float,
338
+ k_fwd: float,
339
+ k_ph_sat: float,
340
+ ) -> float:
341
+ """Hill-type protonation rate scaled by lumenal proton concentration."""
342
+ return k_fwd * (h**nh / (h**nh + _protons_stroma_2016(k_ph_sat) ** nh)) * vx # type: ignore
343
+
344
+
345
+ def _rate_cyclic_electron_flow(
346
+ pox: float,
347
+ fdred: float,
348
+ kcyc: float,
349
+ ) -> float:
350
+ """Cyclic electron flow rate: mass action on Fd_red^2 and PQ_ox."""
351
+ return kcyc * fdred**2 * pox
352
+
353
+
354
+ def _rate_protonation_hill(
355
+ vx: float,
356
+ h: float,
357
+ k_fwd: float,
358
+ n_h: float,
359
+ kph_sat: float,
360
+ ) -> float:
361
+ """Hill-type deepoxidase rate activated by lumenal proton concentration."""
362
+ return k_fwd * (h**n_h / (h**n_h + _protons_stroma_2016(kph_sat) ** n_h)) * vx # type: ignore
363
+
364
+
365
+ def _rate_fnr_2019(
366
+ fd_ox: float,
367
+ fd_red: float,
368
+ nadph: float,
369
+ nadp: float,
370
+ km_fnr_f: float,
371
+ km_fnr_n: float,
372
+ vmax: float,
373
+ keq_fnr: float,
374
+ convf: float,
375
+ ) -> float:
376
+ """FNR rate (2019 formulation): same as 2016 but NADP/H concentrations scaled by convf."""
377
+ fdred = fd_red / km_fnr_f
378
+ fdox = fd_ox / km_fnr_f
379
+ nadph = nadph / convf / km_fnr_n
380
+ nadp = nadp / convf / km_fnr_n
381
+ return (
382
+ vmax
383
+ * (fdred**2 * nadp - fdox**2 * nadph / keq_fnr)
384
+ / ((1 + fdred + fdred**2) * (1 + nadp) + (1 + fdox + fdox**2) * (1 + nadph) - 1)
385
+ )
386
+
387
+
388
+ def _rate_ps2(
389
+ b1: float,
390
+ k2: float,
391
+ ) -> float:
392
+ """PSII electron transfer rate from the open-excited state B1 and photochemistry rate constant k2."""
393
+ return 0.5 * k2 * b1
394
+
395
+
396
+ def _two_div_by(
397
+ x: float,
398
+ ) -> float:
399
+ """Return 2/x; used for the 2-proton stoichiometry of PSII scaled by buffering capacity."""
400
+ return 2.0 / x
401
+
402
+
403
+ def _rate_ps1(
404
+ a: float,
405
+ ps2cs: float,
406
+ pfd: float,
407
+ ) -> float:
408
+ """PSI electron transfer rate: open PSI centers (a) * light absorbed by PSI antenna."""
409
+ return (1 - ps2cs) * pfd * a
410
+
411
+
412
+ def _rate_ferredoxin_reductase(
413
+ fd: float,
414
+ fdred: float,
415
+ a1: float,
416
+ a2: float,
417
+ k_fdred: float,
418
+ keq_fa_fd: float,
419
+ ) -> float:
420
+ """Rate of the redcution of Fd by the activity of PSI.
421
+
422
+ used to be equall to the rate of PSI but now
423
+ alternative electron pathway from Fd allows for the production of ROS
424
+ hence this rate has to be separate.
425
+ """
426
+ return k_fdred * fd * a1 - k_fdred / keq_fa_fd * fdred * a2
427
+
428
+
429
+ def _rate_leak(
430
+ protons_lumen: float,
431
+ ph_stroma: float,
432
+ k_leak: float,
433
+ ) -> float:
434
+ """Passive proton leak across the thylakoid membrane, proportional to the proton gradient."""
435
+ return k_leak * (protons_lumen - _protons_stroma_2016(ph_stroma))
436
+
437
+
438
+ def _neg_one_div_by(
439
+ x: float,
440
+ ) -> float:
441
+ """Return -1/x; used for negated unit stoichiometry scaled by buffering capacity."""
442
+ return -1.0 / x
443
+
444
+
445
+ def _rate_state_transition_ps1_ps2(
446
+ ant: float,
447
+ pox: float,
448
+ p_tot: float,
449
+ k_stt7: float,
450
+ km_st: float,
451
+ n_st: float,
452
+ ) -> float:
453
+ """STT7-kinase phosphorylation of LHC; inhibited by oxidised PQ (state 1 → 2 transition)."""
454
+ return k_stt7 * (1 / (1 + (pox / p_tot / km_st) ** n_st)) * ant
455
+
456
+
457
+ def _rate_poolman_5i(
458
+ rubp: float,
459
+ pga: float,
460
+ co2: float,
461
+ vmax: float,
462
+ kms_rubp: float,
463
+ kms_co2: float,
464
+ # inhibitors
465
+ ki_pga: float,
466
+ fbp: float,
467
+ ki_fbp: float,
468
+ sbp: float,
469
+ ki_sbp: float,
470
+ pi: float,
471
+ ki_p: float,
472
+ nadph: float,
473
+ ki_nadph: float,
474
+ ) -> float:
475
+ """Rubisco carboxylation rate (Poolman 2000): bi-substrate with 5 competitive inhibitors."""
476
+ top = vmax * rubp * co2
477
+ btm = (
478
+ rubp
479
+ + kms_rubp
480
+ * (
481
+ 1
482
+ + pga / ki_pga
483
+ + fbp / ki_fbp
484
+ + sbp / ki_sbp
485
+ + pi / ki_p
486
+ + nadph / ki_nadph
487
+ )
488
+ ) * (co2 + kms_co2)
489
+ return top / btm
490
+
491
+
492
+ def _rapid_equilibrium_2s_2p(
493
+ s1: float,
494
+ s2: float,
495
+ p1: float,
496
+ p2: float,
497
+ k_re: float,
498
+ q: float,
499
+ ) -> float:
500
+ """Rapid-equilibrium rate for two substrates, two products."""
501
+ return k_re * (s1 * s2 - p1 * p2 / q)
502
+
503
+
504
+ def _rapid_equilibrium_3s_3p(
505
+ s1: float,
506
+ s2: float,
507
+ s3: float,
508
+ p1: float,
509
+ p2: float,
510
+ p3: float,
511
+ k_re: float,
512
+ q: float,
513
+ ) -> float:
514
+ """Rapid-equilibrium rate for three substrates, three products."""
515
+ return k_re * (s1 * s2 * s3 - p1 * p2 * p3 / q)
516
+
517
+
518
+ def _rapid_equilibrium_1s_1p(
519
+ s1: float,
520
+ p1: float,
521
+ k_re: float,
522
+ q: float,
523
+ ) -> float:
524
+ """Rapid-equilibrium rate for one substrate, one product."""
525
+ return k_re * (s1 - p1 / q)
526
+
527
+
528
+ def _rapid_equilibrium_2s_1p(
529
+ s1: float,
530
+ s2: float,
531
+ p1: float,
532
+ k_re: float,
533
+ q: float,
534
+ ) -> float:
535
+ """Rapid-equilibrium rate for two substrates, one product."""
536
+ return k_re * (s1 * s2 - p1 / q)
537
+
538
+
539
+ def _michaelis_menten_1s_2i(
540
+ s: float,
541
+ i1: float,
542
+ i2: float,
543
+ vmax: float,
544
+ km: float,
545
+ ki1: float,
546
+ ki2: float,
547
+ ) -> float:
548
+ """Irreversible Michaelis-Menten rate for one substrate with two inhibitors."""
549
+ return vmax * s / (s + km * (1 + i1 / ki1 + i2 / ki2))
550
+
551
+
552
+ def _michaelis_menten_1s_1i(
553
+ s: float,
554
+ i: float,
555
+ vmax: float,
556
+ km: float,
557
+ ki: float,
558
+ ) -> float:
559
+ """Irreversible Michaelis-Menten rate for one substrate with one inhibitor."""
560
+ return vmax * s / (s + km * (1 + i / ki))
561
+
562
+
563
+ def _rate_prk(
564
+ ru5p: float,
565
+ atp: float,
566
+ pi: float,
567
+ pga: float,
568
+ rubp: float,
569
+ adp: float,
570
+ v13: float,
571
+ km131: float,
572
+ km132: float,
573
+ ki131: float,
574
+ ki132: float,
575
+ ki133: float,
576
+ ki134: float,
577
+ ki135: float,
578
+ ) -> float:
579
+ """Phosphoribulokinase rate: ordered bi-substrate kinetics with PGA, RuBP, Pi and ADP inhibition."""
580
+ return (
581
+ v13
582
+ * ru5p
583
+ * atp
584
+ / (
585
+ (ru5p + km131 * (1 + pga / ki131 + rubp / ki132 + pi / ki133))
586
+ * (atp * (1 + adp / ki134) + km132 * (1 + adp / ki135))
587
+ )
588
+ )
589
+
590
+
591
+ def _rate_out(
592
+ s1: float,
593
+ n_total: float,
594
+ vmax_efflux: float,
595
+ k_efflux: float,
596
+ ) -> float:
597
+ """Individual substrate export rate normalised by the translocator occupancy N."""
598
+ return vmax_efflux * s1 / (n_total * k_efflux)
599
+
600
+
601
+ def _rate_starch(
602
+ g1p: float,
603
+ atp: float,
604
+ adp: float,
605
+ pi: float,
606
+ pga: float,
607
+ f6p: float,
608
+ fbp: float,
609
+ v_st: float,
610
+ kmst1: float,
611
+ kmst2: float,
612
+ ki_st: float,
613
+ kast1: float,
614
+ kast2: float,
615
+ kast3: float,
616
+ ) -> float:
617
+ """Starch synthesis rate via G1P+ATP with ADP inhibition and allosteric activation by PGA/F6P/FBP."""
618
+ return (
619
+ v_st
620
+ * g1p
621
+ * atp
622
+ / (
623
+ (g1p + kmst1)
624
+ * (
625
+ (1 + adp / ki_st) * (atp + kmst2)
626
+ + kmst2 * pi / (kast1 * pga + kast2 * f6p + kast3 * fbp)
627
+ )
628
+ )
629
+ )
630
+
631
+
632
+ def _rate_mda_reductase1(
633
+ mda: float,
634
+ k3: float,
635
+ ) -> float:
636
+ """MDA reductase rate: second-order disproportionation of monodehydroascorbate."""
637
+ return k3 * mda**2
638
+
639
+
640
+ def _rate_mda_reductase2(
641
+ nadph: float,
642
+ mda: float,
643
+ vmax: float,
644
+ km_nadph: float,
645
+ km_mda: float,
646
+ ) -> float:
647
+ """Compare Valero et al. 2016."""
648
+ nom = vmax * nadph * mda
649
+ denom = km_nadph * mda + km_mda * nadph + nadph * mda + km_nadph * km_mda
650
+ return nom / denom
651
+
652
+
653
+ def _rate_ascorbate_peroxidase(
654
+ a: float,
655
+ h: float,
656
+ kf1: float,
657
+ kr1: float,
658
+ kf2: float,
659
+ kr2: float,
660
+ kf3: float,
661
+ kf4: float,
662
+ kr4: float,
663
+ kf5: float,
664
+ xt: float,
665
+ ) -> float:
666
+ """Lumped reaction of ascorbate peroxidase.
667
+
668
+ the cycle stretched to a linear chain with
669
+ two steps producing the MDA
670
+ two steps releasing ASC
671
+ and one step producing hydrogen peroxide.
672
+ """
673
+ nom = a * h * xt
674
+ denom = (
675
+ a * h * (1 / kf3 + 1 / kf5)
676
+ + a / kf1
677
+ + h / kf4
678
+ + h * kr4 / (kf4 * kf5)
679
+ + h / kf2
680
+ + h * kr2 / (kf2 * kf3)
681
+ + kr1 / (kf1 * kf2)
682
+ + kr1 * kr2 / (kf1 * kf2 * kf3)
683
+ )
684
+ return nom / denom
685
+
686
+
687
+ def _rate_glutathion_reductase(
688
+ nadph: float,
689
+ gssg: float,
690
+ vmax: float,
691
+ km_nadph: float,
692
+ km_gssg: float,
693
+ ) -> float:
694
+ """Glutathione reductase rate: bi-substrate Michaelis-Menten for NADPH + GSSG."""
695
+ nom = vmax * nadph * gssg
696
+ denom = km_nadph * gssg + km_gssg * nadph + nadph * gssg + km_nadph * km_gssg
697
+ return nom / denom
698
+
699
+
700
+ def _rate_dhar(
701
+ dha: float,
702
+ gsh: float,
703
+ vmax: float,
704
+ km_dha: float,
705
+ km_gsh: float,
706
+ k: float,
707
+ ) -> float:
708
+ """Dehydroascorbate reductase rate: bi-substrate random-order Michaelis-Menten."""
709
+ nom = vmax * dha * gsh
710
+ denom = k + km_dha * gsh + km_gsh * dha + dha * gsh
711
+ return nom / denom
712
+
713
+
714
+ def _ps2states_2016_phd_surrogate(
715
+ pq_ox: float,
716
+ pq_red: float,
717
+ ps2cs: float,
718
+ quencher: float,
719
+ psii_tot: float,
720
+ k2: float,
721
+ k_f: float,
722
+ _kh: float,
723
+ keq_pq_red: float,
724
+ k_pq_red: float,
725
+ pfd: float,
726
+ k_h0: float,
727
+ ) -> tuple[float, float, float, float]:
728
+ """PSII state populations (PHD quenching model, 2016) via analytical closed-form surrogate."""
729
+ x0 = k_f**2
730
+ x1 = k_h0**2
731
+ x2 = k2 * k_f
732
+ x3 = k2 * k_h0
733
+ x4 = 2 * k_f
734
+ x5 = k_h0 * x4
735
+ x6 = _kh * quencher
736
+ x7 = k2 * x6
737
+ x8 = x4 * x6
738
+ x9 = 2 * x6
739
+ x10 = k_h0 * x9
740
+ x11 = _kh**2 * quencher**2
741
+ x12 = k2 * keq_pq_red
742
+ x13 = k_pq_red * keq_pq_red * pq_ox
743
+ x14 = k_pq_red * pq_red
744
+ x15 = k2 * x14
745
+ x16 = pfd * ps2cs
746
+ x17 = k_f * x14
747
+ x18 = k_h0 * x14
748
+ x19 = x14 * x6
749
+ x20 = x13 * x16
750
+ x21 = keq_pq_red * x16
751
+ x22 = (
752
+ x0 * x14
753
+ + x1 * x14
754
+ + x11 * x14
755
+ + x14 * x2
756
+ + x14 * x3
757
+ + x14 * x5
758
+ + x14 * x7
759
+ + x14 * x8
760
+ + x18 * x9
761
+ + x2 * x21
762
+ + x21 * x3
763
+ + x21 * x7
764
+ )
765
+ x23 = psii_tot / (
766
+ k_f * x20
767
+ + k_h0 * x20
768
+ + pfd**2 * ps2cs**2 * x12
769
+ + x0 * x13
770
+ + x1 * x13
771
+ + x10 * x13
772
+ + x11 * x13
773
+ + x13 * x2
774
+ + x13 * x3
775
+ + x13 * x5
776
+ + x13 * x7
777
+ + x13 * x8
778
+ + x15 * x16
779
+ + x16 * x17
780
+ + x16 * x18
781
+ + x16 * x19
782
+ + x20 * x6
783
+ + x22
784
+ )
785
+ x24 = x16 * x23
786
+ _B0 = x13 * x23 * (x0 + x1 + x10 + x11 + x2 + x3 + x5 + x7 + x8)
787
+ _B1 = x13 * x24 * (k_f + k_h0 + x6)
788
+ _B2 = x22 * x23
789
+ _B3 = x24 * (x12 * x16 + x15 + x17 + x18 + x19)
790
+ return _B0, _B1, _B2, _B3
791
+
792
+
793
+ def _ps1states_2021_surrogate(
794
+ pc_ox: float,
795
+ pc_red: float,
796
+ fd_ox: float,
797
+ fd_red: float,
798
+ ps2cs: float,
799
+ ps1_tot: float,
800
+ k_fd_red: float,
801
+ keq_f: float,
802
+ keq_c: float,
803
+ k_pc_ox: float,
804
+ pfd: float,
805
+ k0: float,
806
+ o2: float,
807
+ ) -> tuple[float, float, float]:
808
+ """QSSA calculates open state of PSI.
809
+
810
+ depends on reduction states of plastocyanin and ferredoxin
811
+ C = [PC], F = [Fd] (ox. forms).
812
+ """
813
+ kLI = (1 - ps2cs) * pfd
814
+
815
+ y0 = (
816
+ keq_c
817
+ * keq_f
818
+ * pc_red
819
+ * ps1_tot
820
+ * k_pc_ox
821
+ * (fd_ox * k_fd_red + o2 * k0)
822
+ / (
823
+ fd_ox * keq_c * keq_f * pc_red * k_fd_red * k_pc_ox
824
+ + fd_ox * keq_f * k_fd_red * (keq_c * kLI + pc_ox * k_pc_ox)
825
+ + fd_red * k_fd_red * (keq_c * kLI + pc_ox * k_pc_ox)
826
+ + keq_c * keq_f * o2 * pc_red * k0 * k_pc_ox
827
+ + keq_c * keq_f * pc_red * kLI * k_pc_ox
828
+ + keq_f * o2 * k0 * (keq_c * kLI + pc_ox * k_pc_ox)
829
+ )
830
+ )
831
+
832
+ y1 = (
833
+ ps1_tot
834
+ * (
835
+ fd_red * k_fd_red * (keq_c * kLI + pc_ox * k_pc_ox)
836
+ + keq_c * keq_f * pc_red * kLI * k_pc_ox
837
+ )
838
+ / (
839
+ fd_ox * keq_c * keq_f * pc_red * k_fd_red * k_pc_ox
840
+ + fd_ox * keq_f * k_fd_red * (keq_c * kLI + pc_ox * k_pc_ox)
841
+ + fd_red * k_fd_red * (keq_c * kLI + pc_ox * k_pc_ox)
842
+ + keq_c * keq_f * o2 * pc_red * k0 * k_pc_ox
843
+ + keq_c * keq_f * pc_red * kLI * k_pc_ox
844
+ + keq_f * o2 * k0 * (keq_c * kLI + pc_ox * k_pc_ox)
845
+ )
846
+ )
847
+ y2 = ps1_tot - y0 - y1
848
+
849
+ return y0, y1, y2
850
+
851
+
852
+ def _div(
853
+ x: float,
854
+ y: float,
855
+ ) -> float:
856
+ """Return x / y."""
857
+ return x / y
858
+
859
+
860
+ def _rate_fluorescence(
861
+ q: float,
862
+ b0: float,
863
+ b2: float,
864
+ ps2cs: float,
865
+ k2: float,
866
+ k_f: float,
867
+ k_h: float,
868
+ ) -> float:
869
+ """Chlorophyll fluorescence yield from open (B0) and closed (B2) PSII centres."""
870
+ return ps2cs * k_f * b0 / (k_f + k2 + k_h * q) + ps2cs * k_f * b2 / (k_f + k_h * q)
871
+
872
+
873
+ def create_model() -> Model:
874
+ """Saadat 2021 chloroplast model with ROS scavenging, Calvin cycle, and thioredoxin regulation.
875
+
876
+ Reference: Saadat, Nima P., et al.
877
+ "Computational analysis of alternative photosynthetic electron flows linked with oxidative stress."
878
+ Frontiers in plant science 12 (2021): 750580
879
+ """
880
+ m: Model = Model()
881
+ m = m.add_variable("3PGA", initial_value=0.9167729479368978)
882
+ m = m.add_variable("BPGA", initial_value=0.0003814495319659031)
883
+ m = m.add_variable("GAP", initial_value=0.00580821050261484)
884
+ m = m.add_variable("DHAP", initial_value=0.1277806166216142)
885
+ m = m.add_variable("FBP", initial_value=0.005269452472931973)
886
+ m = m.add_variable("F6P", initial_value=0.2874944558066638)
887
+ m = m.add_variable("G6P", initial_value=0.6612372482712676)
888
+ m = m.add_variable("G1P", initial_value=0.03835176039761378)
889
+ m = m.add_variable("SBP", initial_value=0.011101373736607443)
890
+ m = m.add_variable("S7P", initial_value=0.1494578301900007)
891
+ m = m.add_variable("E4P", initial_value=0.00668295494870102)
892
+ m = m.add_variable("X5P", initial_value=0.020988553174809618)
893
+ m = m.add_variable("R5P", initial_value=0.035155825913785584)
894
+ m = m.add_variable("RUBP", initial_value=0.11293260727162346)
895
+ m = m.add_variable("RU5P", initial_value=0.014062330254191594)
896
+ m = m.add_variable("ATP", initial_value=1.4612747767895344)
897
+ m = m.add_variable("Ferredoxine (oxidised)", initial_value=3.715702384326767)
898
+ m = m.add_variable("protons_lumen", initial_value=0.002086128887296243)
899
+ m = m.add_variable("Light-harvesting complex", initial_value=0.7805901436176024)
900
+ m = m.add_variable("NADPH", initial_value=0.5578718406315588)
901
+ m = m.add_variable("Plastocyanine (oxidised)", initial_value=1.8083642974980014)
902
+ m = m.add_variable("Plastoquinone (oxidised)", initial_value=10.251099271612473)
903
+ m = m.add_variable("PsbS (de-protonated)", initial_value=0.9667381262477079)
904
+ m = m.add_variable("Violaxanthin", initial_value=0.9629870646993118)
905
+ m = m.add_variable("MDA", initial_value=2.0353396709300447e-07)
906
+ m = m.add_variable("H2O2", initial_value=1.2034405327140102e-07)
907
+ m = m.add_variable("DHA", initial_value=1.0296456279861962e-11)
908
+ m = m.add_variable("GSSG", initial_value=4.99986167652437e-12)
909
+ m = m.add_variable("Thioredoxin (oxidised)", initial_value=0.9334426859846461)
910
+ m = m.add_variable("E_inactive", initial_value=3.6023635680406634)
911
+ m = m.add_parameter("PPFD", value=100.0)
912
+ m = m.add_parameter("CO2 (dissolved)", value=0.2)
913
+ m = m.add_parameter("O2 (dissolved)_lumen", value=8.0)
914
+ m = m.add_parameter("pH", value=7.9)
915
+ m = m.add_parameter("protons", value=1.2589254117941661e-05)
916
+ m = m.add_parameter("bH", value=100.0)
917
+ m = m.add_parameter("F", value=96.485)
918
+ m = m.add_parameter("E^0_PC", value=0.38)
919
+ m = m.add_parameter("E^0_P700", value=0.48)
920
+ m = m.add_parameter("E^0_FA", value=-0.55)
921
+ m = m.add_parameter("E^0_Fd", value=-0.43)
922
+ m = m.add_parameter("E^0_NADP", value=-0.113)
923
+ m = m.add_parameter("convf", value=0.032)
924
+ m = m.add_parameter("R", value=0.0083)
925
+ m = m.add_parameter("T", value=298.0)
926
+ m = m.add_parameter("Carotenoids_tot", value=1.0)
927
+ m = m.add_parameter("Fd*", value=5.0)
928
+ m = m.add_parameter("PC_tot", value=4.0)
929
+ m = m.add_parameter("PSBS_tot", value=1.0)
930
+ m = m.add_parameter("LHC_tot", value=1.0)
931
+ m = m.add_parameter("gamma0", value=0.1)
932
+ m = m.add_parameter("gamma1", value=0.25)
933
+ m = m.add_parameter("gamma2", value=0.6)
934
+ m = m.add_parameter("gamma3", value=0.15)
935
+ m = m.add_parameter("kZSat", value=0.12)
936
+ m = m.add_parameter("E^0_QA", value=-0.14)
937
+ m = m.add_parameter("E^0_PQ", value=0.354)
938
+ m = m.add_parameter("PQ_tot", value=17.5)
939
+ m = m.add_parameter("staticAntII", value=0.1)
940
+ m = m.add_parameter("staticAntI", value=0.37)
941
+ m = m.add_parameter("Thioredoxin_tot", value=1.0)
942
+ m = m.add_parameter("E_total", value=6.0)
943
+ m = m.add_parameter("NADP*", value=0.8)
944
+ m = m.add_parameter("A*P", value=2.55)
945
+ m = m.add_parameter("Pi_tot", value=17.05)
946
+ m = m.add_parameter("kf_ferredoxin_thioredoxin_reductase", value=1.0)
947
+ m = m.add_parameter("kf_tr_activation", value=1.0)
948
+ m = m.add_parameter("kf_tr_inactivation", value=0.1)
949
+ m = m.add_parameter("ASC_tot*", value=10)
950
+ m = m.add_parameter("Glutathion_tot", value=10.0)
951
+ m = m.add_parameter("kf_atp_synthase", value=20.0)
952
+ m = m.add_parameter("HPR", value=4.666666666666667)
953
+ m = m.add_parameter("Pi_mol", value=0.01)
954
+ m = m.add_parameter("DeltaG0_ATP", value=30.6)
955
+ m = m.add_parameter("kcat_b6f", value=2.5)
956
+ m = m.add_parameter("kh_lhc_protonation", value=3.0)
957
+ m = m.add_parameter("kf_lhc_protonation", value=0.0096)
958
+ m = m.add_parameter("ksat_lhc_protonation", value=5.8)
959
+ m = m.add_parameter("kf_lhc_deprotonation", value=0.0096)
960
+ m = m.add_parameter("kf_cyclic_electron_flow", value=1.0)
961
+ m = m.add_parameter("kf_violaxanthin_deepoxidase", value=0.0024)
962
+ m = m.add_parameter("kh_violaxanthin_deepoxidase", value=5.0)
963
+ m = m.add_parameter("ksat_violaxanthin_deepoxidase", value=5.8)
964
+ m = m.add_parameter("kf_zeaxanthin_epoxidase", value=0.00024)
965
+ m = m.add_parameter("km_fnr_Ferredoxine (reduced)", value=1.56)
966
+ m = m.add_parameter("km_fnr_NADP", value=0.22)
967
+ m = m.add_parameter("E0_fnr", value=3.0)
968
+ m = m.add_parameter("kcat_fnr", value=500.0)
969
+ m = m.add_parameter("kf_ndh", value=0.002)
970
+ m = m.add_parameter("PSII_total", value=2.5)
971
+ m = m.add_parameter("PSI_total", value=2.5)
972
+ m = m.add_parameter("kH0", value=500000000.0)
973
+ m = m.add_parameter("kPQred", value=250.0)
974
+ m = m.add_parameter("kPCox", value=2500.0)
975
+ m = m.add_parameter("kFdred", value=250000.0)
976
+ m = m.add_parameter("k2", value=5000000000.0)
977
+ m = m.add_parameter("kH", value=5000000000.0)
978
+ m = m.add_parameter("kF", value=625000000.0)
979
+ m = m.add_parameter("kMehler", value=1.0)
980
+ m = m.add_parameter("E0_ferredoxin_reductase", value=1.0)
981
+ m = m.add_parameter("kcat_ferredoxin_reductase", value=250000.0)
982
+ m = m.add_parameter("kf_proton_leak", value=10.0)
983
+ m = m.add_parameter("kPTOX", value=0.01)
984
+ m = m.add_parameter("kStt7", value=0.0035)
985
+ m = m.add_parameter("km_lhc_state_transition_12", value=0.2)
986
+ m = m.add_parameter("n_ST", value=2.0)
987
+ m = m.add_parameter("kPph1", value=0.0013)
988
+ m = m.add_parameter("E0_rubisco", value=1.0)
989
+ m = m.add_parameter("kcat_rubisco_carboxylase", value=2.72)
990
+ m = m.add_parameter("km_rubisco_carboxylase_RUBP", value=0.02)
991
+ m = m.add_parameter("km_rubisco_carboxylase_CO2 (dissolved)", value=0.0107)
992
+ m = m.add_parameter("ki_rubisco_carboxylase_3PGA", value=0.04)
993
+ m = m.add_parameter("ki_rubisco_carboxylase_FBP", value=0.04)
994
+ m = m.add_parameter("ki_rubisco_carboxylase_SBP", value=0.075)
995
+ m = m.add_parameter("ki_rubisco_carboxylase_Orthophosphate", value=0.9)
996
+ m = m.add_parameter("ki_rubisco_carboxylase_NADPH", value=0.07)
997
+ m = m.add_parameter("kre_phosphoglycerate_kinase", value=800000000.0)
998
+ m = m.add_parameter("keq_phosphoglycerate_kinase", value=0.00031)
999
+ m = m.add_parameter("kre_gadph", value=800000000.0)
1000
+ m = m.add_parameter("keq_gadph", value=16000000.0)
1001
+ m = m.add_parameter("kre_triose_phosphate_isomerase", value=800000000.0)
1002
+ m = m.add_parameter("keq_triose_phosphate_isomerase", value=22.0)
1003
+ m = m.add_parameter("kre_aldolase_dhap_gap", value=800000000.0)
1004
+ m = m.add_parameter("keq_aldolase_dhap_gap", value=7.1)
1005
+ m = m.add_parameter("kre_aldolase_dhap_e4p", value=800000000.0)
1006
+ m = m.add_parameter("keq_aldolase_dhap_e4p", value=13.0)
1007
+ m = m.add_parameter("E0_fbpase", value=1.0)
1008
+ m = m.add_parameter("kcat_fbpase", value=1.6)
1009
+ m = m.add_parameter("km_fbpase_s", value=0.03)
1010
+ m = m.add_parameter("ki_fbpase_F6P", value=0.7)
1011
+ m = m.add_parameter("ki_fbpase_Orthophosphate", value=12.0)
1012
+ m = m.add_parameter("kre_transketolase_gap_f6p", value=800000000.0)
1013
+ m = m.add_parameter("keq_transketolase_gap_f6p", value=0.084)
1014
+ m = m.add_parameter("kre_transketolase_gap_s7p", value=800000000.0)
1015
+ m = m.add_parameter("keq_transketolase_gap_s7p", value=0.85)
1016
+ m = m.add_parameter("E0_SBPase", value=1.0)
1017
+ m = m.add_parameter("kcat_SBPase", value=0.32)
1018
+ m = m.add_parameter("km_SBPase_s", value=0.013)
1019
+ m = m.add_parameter("ki_SBPase_Orthophosphate", value=12.0)
1020
+ m = m.add_parameter("kre_ribose_phosphate_isomerase", value=800000000.0)
1021
+ m = m.add_parameter("keq_ribose_phosphate_isomerase", value=0.4)
1022
+ m = m.add_parameter("kre_ribulose_phosphate_epimerase", value=800000000.0)
1023
+ m = m.add_parameter("keq_ribulose_phosphate_epimerase", value=0.67)
1024
+ m = m.add_parameter("E0_phosphoribulokinase", value=1.0)
1025
+ m = m.add_parameter("kcat_phosphoribulokinase", value=7.9992)
1026
+ m = m.add_parameter("km_phosphoribulokinase_RU5P", value=0.05)
1027
+ m = m.add_parameter("km_phosphoribulokinase_ATP", value=0.05)
1028
+ m = m.add_parameter("ki_phosphoribulokinase_3PGA", value=2.0)
1029
+ m = m.add_parameter("ki_phosphoribulokinase_RUBP", value=0.7)
1030
+ m = m.add_parameter("ki_phosphoribulokinase_Orthophosphate", value=4.0)
1031
+ m = m.add_parameter("ki_phosphoribulokinase_4", value=2.5)
1032
+ m = m.add_parameter("ki_phosphoribulokinase_5", value=0.4)
1033
+ m = m.add_parameter("kre_g6pi", value=800000000.0)
1034
+ m = m.add_parameter("keq_g6pi", value=2.3)
1035
+ m = m.add_parameter("kre_phosphoglucomutase", value=800000000.0)
1036
+ m = m.add_parameter("keq_phosphoglucomutase", value=0.058)
1037
+ m = m.add_parameter("Orthophosphate (external)", value=0.5)
1038
+ m = m.add_parameter("km_ex_pga", value=0.25)
1039
+ m = m.add_parameter("km_ex_gap", value=0.075)
1040
+ m = m.add_parameter("km_ex_dhap", value=0.077)
1041
+ m = m.add_parameter("km_N_translocator_Orthophosphate (external)", value=0.74)
1042
+ m = m.add_parameter("km_N_translocator_Orthophosphate", value=0.63)
1043
+ m = m.add_parameter("kcat_N_translocator", value=2.0)
1044
+ m = m.add_parameter("E0_N_translocator", value=1.0)
1045
+ m = m.add_parameter("E0_ex_g1p", value=1.0)
1046
+ m = m.add_parameter("km_ex_g1p_G1P", value=0.08)
1047
+ m = m.add_parameter("km_ex_g1p_ATP", value=0.08)
1048
+ m = m.add_parameter("ki_ex_g1p", value=10.0)
1049
+ m = m.add_parameter("ki_ex_g1p_3PGA", value=0.1)
1050
+ m = m.add_parameter("ki_ex_g1p_F6P", value=0.02)
1051
+ m = m.add_parameter("ki_ex_g1p_FBP", value=0.02)
1052
+ m = m.add_parameter("kcat_ex_g1p", value=0.32)
1053
+ m = m.add_parameter("kf_mda_reductase_1", value=500.0)
1054
+ m = m.add_parameter("E0_mda_reductase_2", value=0.002)
1055
+ m = m.add_parameter("kcat_mda_reductase_2", value=300.0)
1056
+ m = m.add_parameter("km_mda_reductase_2_NADPH", value=0.023)
1057
+ m = m.add_parameter("km_mda_reductase_2_MDA", value=0.0014)
1058
+ m = m.add_parameter("kf1", value=10000.0)
1059
+ m = m.add_parameter("kr1", value=220.0)
1060
+ m = m.add_parameter("kf2", value=10000.0)
1061
+ m = m.add_parameter("kr2", value=4000.0)
1062
+ m = m.add_parameter("kf3", value=2510.0)
1063
+ m = m.add_parameter("kf4", value=10000.0)
1064
+ m = m.add_parameter("kr4", value=4000.0)
1065
+ m = m.add_parameter("kf5", value=2510.0)
1066
+ m = m.add_parameter("XT", value=0.07)
1067
+ m = m.add_parameter("E0_glutathion_reductase", value=0.0014)
1068
+ m = m.add_parameter("kcat_glutathion_reductase", value=595)
1069
+ m = m.add_parameter("km_glutathion_reductase_NADPH", value=0.003)
1070
+ m = m.add_parameter("km_glutathion_reductase_GSSG", value=0.2)
1071
+ m = m.add_parameter("km_dehydroascorbate_reductase_DHA", value=0.07)
1072
+ m = m.add_parameter("km_dehydroascorbate_reductase_GSH", value=2.5)
1073
+ m = m.add_parameter("K", value=0.5)
1074
+ m = m.add_parameter("E0_dehydroascorbate_reductase", value=0.0017)
1075
+ m = m.add_parameter("kcat_dehydroascorbate_reductase", value=142)
1076
+ m = m.add_parameter("kf_ex_atp", value=0.2)
1077
+ m = m.add_parameter("kf_ex_nadph", value=0.2)
1078
+ m = m.add_derived(
1079
+ "RT",
1080
+ fn=_mass_action_1s,
1081
+ args=["R", "T"],
1082
+ )
1083
+ m = m.add_derived(
1084
+ "dG_pH",
1085
+ fn=_dg_ph,
1086
+ args=["R", "T"],
1087
+ )
1088
+ m = m.add_derived(
1089
+ "pH_lumen",
1090
+ fn=_ph_lumen,
1091
+ args=["protons_lumen"],
1092
+ )
1093
+ m = m.add_derived(
1094
+ "Zeaxanthin",
1095
+ fn=_moiety_1,
1096
+ args=["Violaxanthin", "Carotenoids_tot"],
1097
+ )
1098
+ m = m.add_derived(
1099
+ "Ferredoxine (reduced)",
1100
+ fn=_moiety_1,
1101
+ args=["Ferredoxine (oxidised)", "Fd*"],
1102
+ )
1103
+ m = m.add_derived(
1104
+ "Plastocyanine (reduced)",
1105
+ fn=_moiety_1,
1106
+ args=["Plastocyanine (oxidised)", "PC_tot"],
1107
+ )
1108
+ m = m.add_derived(
1109
+ "PsbS (protonated)",
1110
+ fn=_moiety_1,
1111
+ args=["PsbS (de-protonated)", "PSBS_tot"],
1112
+ )
1113
+ m = m.add_derived(
1114
+ "Light-harvesting complex (protonated)",
1115
+ fn=_moiety_1,
1116
+ args=["Light-harvesting complex", "LHC_tot"],
1117
+ )
1118
+ m = m.add_derived(
1119
+ "Q",
1120
+ fn=_quencher,
1121
+ args=[
1122
+ "PsbS (de-protonated)",
1123
+ "Violaxanthin",
1124
+ "PsbS (protonated)",
1125
+ "Zeaxanthin",
1126
+ "gamma0",
1127
+ "gamma1",
1128
+ "gamma2",
1129
+ "gamma3",
1130
+ "kZSat",
1131
+ ],
1132
+ )
1133
+ m = m.add_derived(
1134
+ "keq_Plastoquinone (reduced)",
1135
+ fn=_keq_pq_red,
1136
+ args=["E^0_QA", "F", "E^0_PQ", "pH", "dG_pH", "RT"],
1137
+ )
1138
+ m = m.add_derived(
1139
+ "Plastoquinone (reduced)",
1140
+ fn=_moiety_1,
1141
+ args=["Plastoquinone (oxidised)", "PQ_tot"],
1142
+ )
1143
+ m = m.add_derived(
1144
+ "PSII_cross_section",
1145
+ fn=_ps2_crosssection,
1146
+ args=["Light-harvesting complex", "staticAntII", "staticAntI"],
1147
+ )
1148
+ m = m.add_derived(
1149
+ "Thioredoxin (reduced)",
1150
+ fn=_moiety_1,
1151
+ args=["Thioredoxin (oxidised)", "Thioredoxin_tot"],
1152
+ )
1153
+ m = m.add_derived(
1154
+ "E_active",
1155
+ fn=_moiety_1,
1156
+ args=["E_inactive", "E_total"],
1157
+ )
1158
+ m = m.add_derived(
1159
+ "NADP",
1160
+ fn=_moiety_1,
1161
+ args=["NADPH", "NADP*"],
1162
+ )
1163
+ m = m.add_derived(
1164
+ "ADP",
1165
+ fn=_moiety_1,
1166
+ args=["ATP", "A*P"],
1167
+ )
1168
+ m = m.add_derived(
1169
+ "Orthophosphate",
1170
+ fn=_pi_cbb,
1171
+ args=[
1172
+ "Pi_tot",
1173
+ "3PGA",
1174
+ "BPGA",
1175
+ "GAP",
1176
+ "DHAP",
1177
+ "FBP",
1178
+ "F6P",
1179
+ "G6P",
1180
+ "G1P",
1181
+ "SBP",
1182
+ "S7P",
1183
+ "E4P",
1184
+ "X5P",
1185
+ "R5P",
1186
+ "RUBP",
1187
+ "RU5P",
1188
+ "ATP",
1189
+ ],
1190
+ )
1191
+ m = m.add_derived(
1192
+ "ascorbate",
1193
+ fn=_moiety_2,
1194
+ args=["MDA", "DHA", "ASC_tot*"],
1195
+ )
1196
+ m = m.add_derived(
1197
+ "GSH",
1198
+ fn=_glutathion_moiety,
1199
+ args=["GSSG", "Glutathion_tot"],
1200
+ )
1201
+ m = m.add_derived(
1202
+ "keq_atp_synthase",
1203
+ fn=_keq_atp,
1204
+ args=["pH_lumen", "DeltaG0_ATP", "dG_pH", "HPR", "pH", "Pi_mol", "RT"],
1205
+ )
1206
+ m = m.add_derived(
1207
+ "keq_b6f",
1208
+ fn=_keq_cytb6f,
1209
+ args=["pH_lumen", "F", "E^0_PQ", "E^0_PC", "pH", "RT", "dG_pH"],
1210
+ )
1211
+ m = m.add_derived(
1212
+ "keq_fnr",
1213
+ fn=_keq_fnr,
1214
+ args=["E^0_Fd", "F", "E^0_NADP", "pH", "dG_pH", "RT"],
1215
+ )
1216
+ m = m.add_derived(
1217
+ "vmax_fnr",
1218
+ fn=_mass_action_1s,
1219
+ args=["kcat_fnr", "E0_fnr"],
1220
+ )
1221
+ m = m.add_derived(
1222
+ "keq_PCP700",
1223
+ fn=_keq_pcp700,
1224
+ args=["E^0_PC", "F", "E^0_P700", "RT"],
1225
+ )
1226
+ m = m.add_derived(
1227
+ "keq_ferredoxin_reductase",
1228
+ fn=_keq_faf_d,
1229
+ args=["E^0_FA", "F", "E^0_Fd", "RT"],
1230
+ )
1231
+ m = m.add_derived(
1232
+ "vmax_ferredoxin_reductase",
1233
+ fn=_mass_action_1s,
1234
+ args=["kcat_ferredoxin_reductase", "E0_ferredoxin_reductase"],
1235
+ )
1236
+ m = m.add_derived(
1237
+ "E0_rubisco_active",
1238
+ fn=_mul,
1239
+ args=["E0_rubisco", "E_active"],
1240
+ )
1241
+ m = m.add_derived(
1242
+ "vmax_rubisco_carboxylase",
1243
+ fn=_mass_action_1s,
1244
+ args=["kcat_rubisco_carboxylase", "E0_rubisco_active"],
1245
+ )
1246
+ m = m.add_derived(
1247
+ "E0_fbpase_active",
1248
+ fn=_mul,
1249
+ args=["E0_fbpase", "E_active"],
1250
+ )
1251
+ m = m.add_derived(
1252
+ "vmax_fbpase",
1253
+ fn=_mass_action_1s,
1254
+ args=["kcat_fbpase", "E0_fbpase_active"],
1255
+ )
1256
+ m = m.add_derived(
1257
+ "E0_SBPase_active",
1258
+ fn=_mul,
1259
+ args=["E0_SBPase", "E_active"],
1260
+ )
1261
+ m = m.add_derived(
1262
+ "vmax_SBPase",
1263
+ fn=_mass_action_1s,
1264
+ args=["kcat_SBPase", "E0_SBPase_active"],
1265
+ )
1266
+ m = m.add_derived(
1267
+ "E0_phosphoribulokinase_active",
1268
+ fn=_mul,
1269
+ args=["E0_phosphoribulokinase", "E_active"],
1270
+ )
1271
+ m = m.add_derived(
1272
+ "vmax_phosphoribulokinase",
1273
+ fn=_mass_action_1s,
1274
+ args=["kcat_phosphoribulokinase", "E0_phosphoribulokinase_active"],
1275
+ )
1276
+ m = m.add_derived(
1277
+ "vmax_ex_pga",
1278
+ fn=_mass_action_1s,
1279
+ args=["kcat_N_translocator", "E0_N_translocator"],
1280
+ )
1281
+ m = m.add_derived(
1282
+ "N_translocator",
1283
+ fn=_rate_translocator,
1284
+ args=[
1285
+ "Orthophosphate",
1286
+ "3PGA",
1287
+ "GAP",
1288
+ "DHAP",
1289
+ "km_N_translocator_Orthophosphate (external)",
1290
+ "Orthophosphate (external)",
1291
+ "km_N_translocator_Orthophosphate",
1292
+ "km_ex_pga",
1293
+ "km_ex_gap",
1294
+ "km_ex_dhap",
1295
+ ],
1296
+ )
1297
+ m = m.add_derived(
1298
+ "E0_ex_g1p_active",
1299
+ fn=_mul,
1300
+ args=["E0_ex_g1p", "E_active"],
1301
+ )
1302
+ m = m.add_derived(
1303
+ "vmax_ex_g1p",
1304
+ fn=_mass_action_1s,
1305
+ args=["kcat_ex_g1p", "E0_ex_g1p_active"],
1306
+ )
1307
+ m = m.add_derived(
1308
+ "vmax_mda_reductase_2",
1309
+ fn=_mass_action_1s,
1310
+ args=["kcat_mda_reductase_2", "E0_mda_reductase_2"],
1311
+ )
1312
+ m = m.add_derived(
1313
+ "vmax_glutathion_reductase",
1314
+ fn=_mass_action_1s,
1315
+ args=["kcat_glutathion_reductase", "E0_glutathion_reductase"],
1316
+ )
1317
+ m = m.add_derived(
1318
+ "vmax_dehydroascorbate_reductase",
1319
+ fn=_mass_action_1s,
1320
+ args=["kcat_dehydroascorbate_reductase", "E0_dehydroascorbate_reductase"],
1321
+ )
1322
+ m = m.add_reaction(
1323
+ "ferredoxin_thioredoxin_reductase",
1324
+ fn=_mass_action_2s,
1325
+ args=[
1326
+ "Thioredoxin (oxidised)",
1327
+ "Ferredoxine (reduced)",
1328
+ "kf_ferredoxin_thioredoxin_reductase",
1329
+ ],
1330
+ stoichiometry={"Thioredoxin (oxidised)": -1, "Ferredoxine (oxidised)": 1},
1331
+ )
1332
+ m = m.add_reaction(
1333
+ "tr_activation",
1334
+ fn=_mass_action_2s,
1335
+ args=["E_inactive", "Thioredoxin (reduced)", "kf_tr_activation"],
1336
+ stoichiometry={"E_inactive": -5, "Thioredoxin (oxidised)": 5},
1337
+ )
1338
+ m = m.add_reaction(
1339
+ "tr_inactivation",
1340
+ fn=_mass_action_1s,
1341
+ args=["E_active", "kf_tr_inactivation"],
1342
+ stoichiometry={"E_inactive": 5},
1343
+ )
1344
+ m = m.add_reaction(
1345
+ "atp_synthase",
1346
+ fn=_rate_atp_synthase_2019,
1347
+ args=["ATP", "ADP", "keq_atp_synthase", "kf_atp_synthase", "convf"],
1348
+ stoichiometry={
1349
+ "protons_lumen": Derived(fn=_neg_div, args=["HPR", "bH"]),
1350
+ "ATP": Derived(fn=_value, args=["convf"]),
1351
+ },
1352
+ )
1353
+ m = m.add_reaction(
1354
+ "b6f",
1355
+ fn=_b6f,
1356
+ args=[
1357
+ "Plastocyanine (oxidised)",
1358
+ "Plastoquinone (oxidised)",
1359
+ "Plastoquinone (reduced)",
1360
+ "Plastocyanine (reduced)",
1361
+ "keq_b6f",
1362
+ "kcat_b6f",
1363
+ ],
1364
+ stoichiometry={
1365
+ "Plastocyanine (oxidised)": -2,
1366
+ "Plastoquinone (oxidised)": 1,
1367
+ "protons_lumen": Derived(fn=_four_div_by, args=["bH"]),
1368
+ },
1369
+ )
1370
+ m = m.add_reaction(
1371
+ "lhc_protonation",
1372
+ fn=_protonation_hill,
1373
+ args=[
1374
+ "PsbS (de-protonated)",
1375
+ "protons_lumen",
1376
+ "kh_lhc_protonation",
1377
+ "kf_lhc_protonation",
1378
+ "ksat_lhc_protonation",
1379
+ ],
1380
+ stoichiometry={"PsbS (de-protonated)": -1},
1381
+ )
1382
+ m = m.add_reaction(
1383
+ "lhc_deprotonation",
1384
+ fn=_mass_action_1s,
1385
+ args=["PsbS (protonated)", "kf_lhc_deprotonation"],
1386
+ stoichiometry={"PsbS (de-protonated)": 1},
1387
+ )
1388
+ m = m.add_reaction(
1389
+ "cyclic_electron_flow",
1390
+ fn=_rate_cyclic_electron_flow,
1391
+ args=[
1392
+ "Plastoquinone (oxidised)",
1393
+ "Ferredoxine (reduced)",
1394
+ "kf_cyclic_electron_flow",
1395
+ ],
1396
+ stoichiometry={"Plastoquinone (oxidised)": -1, "Ferredoxine (oxidised)": 2},
1397
+ )
1398
+ m = m.add_reaction(
1399
+ "violaxanthin_deepoxidase",
1400
+ fn=_rate_protonation_hill,
1401
+ args=[
1402
+ "Violaxanthin",
1403
+ "protons_lumen",
1404
+ "kf_violaxanthin_deepoxidase",
1405
+ "kh_violaxanthin_deepoxidase",
1406
+ "ksat_violaxanthin_deepoxidase",
1407
+ ],
1408
+ stoichiometry={"Violaxanthin": -1},
1409
+ )
1410
+ m = m.add_reaction(
1411
+ "zeaxanthin_epoxidase",
1412
+ fn=_mass_action_1s,
1413
+ args=["Zeaxanthin", "kf_zeaxanthin_epoxidase"],
1414
+ stoichiometry={"Violaxanthin": 1},
1415
+ )
1416
+ m = m.add_reaction(
1417
+ "fnr",
1418
+ fn=_rate_fnr_2019,
1419
+ args=[
1420
+ "Ferredoxine (oxidised)",
1421
+ "Ferredoxine (reduced)",
1422
+ "NADPH",
1423
+ "NADP",
1424
+ "km_fnr_Ferredoxine (reduced)",
1425
+ "km_fnr_NADP",
1426
+ "vmax_fnr",
1427
+ "keq_fnr",
1428
+ "convf",
1429
+ ],
1430
+ stoichiometry={
1431
+ "Ferredoxine (oxidised)": 2,
1432
+ "NADPH": Derived(fn=_value, args=["convf"]),
1433
+ },
1434
+ )
1435
+ m = m.add_reaction(
1436
+ "ndh",
1437
+ fn=_mass_action_1s,
1438
+ args=["Plastoquinone (oxidised)", "kf_ndh"],
1439
+ stoichiometry={"Plastoquinone (oxidised)": -1},
1440
+ )
1441
+ m = m.add_reaction(
1442
+ "PSII",
1443
+ fn=_rate_ps2,
1444
+ args=["B1", "k2"],
1445
+ stoichiometry={
1446
+ "Plastoquinone (oxidised)": -1,
1447
+ "protons_lumen": Derived(fn=_two_div_by, args=["bH"]),
1448
+ },
1449
+ )
1450
+ m = m.add_reaction(
1451
+ "PSI",
1452
+ fn=_rate_ps1,
1453
+ args=["A0", "PSII_cross_section", "PPFD"],
1454
+ stoichiometry={"Plastocyanine (oxidised)": 1},
1455
+ )
1456
+ m = m.add_reaction(
1457
+ "mehler",
1458
+ fn=_mass_action_2s,
1459
+ args=["A1", "O2 (dissolved)_lumen", "kMehler"],
1460
+ stoichiometry={"H2O2": Derived(fn=_value, args=["convf"])},
1461
+ )
1462
+ m = m.add_reaction(
1463
+ "ferredoxin_reductase",
1464
+ fn=_rate_ferredoxin_reductase,
1465
+ args=[
1466
+ "Ferredoxine (oxidised)",
1467
+ "Ferredoxine (reduced)",
1468
+ "A1",
1469
+ "A2",
1470
+ "vmax_ferredoxin_reductase",
1471
+ "keq_ferredoxin_reductase",
1472
+ ],
1473
+ stoichiometry={"Ferredoxine (oxidised)": -1},
1474
+ )
1475
+ m = m.add_reaction(
1476
+ "proton_leak",
1477
+ fn=_rate_leak,
1478
+ args=["protons_lumen", "pH", "kf_proton_leak"],
1479
+ stoichiometry={"protons_lumen": Derived(fn=_neg_one_div_by, args=["bH"])},
1480
+ )
1481
+ m = m.add_reaction(
1482
+ "PTOX",
1483
+ fn=_mass_action_2s,
1484
+ args=["Plastoquinone (reduced)", "O2 (dissolved)_lumen", "kPTOX"],
1485
+ stoichiometry={"Plastoquinone (oxidised)": 1},
1486
+ )
1487
+ m = m.add_reaction(
1488
+ "lhc_state_transition_12",
1489
+ fn=_rate_state_transition_ps1_ps2,
1490
+ args=[
1491
+ "Light-harvesting complex",
1492
+ "Plastoquinone (oxidised)",
1493
+ "PQ_tot",
1494
+ "kStt7",
1495
+ "km_lhc_state_transition_12",
1496
+ "n_ST",
1497
+ ],
1498
+ stoichiometry={"Light-harvesting complex": -1},
1499
+ )
1500
+ m = m.add_reaction(
1501
+ "lhc_state_transition_21",
1502
+ fn=_mass_action_1s,
1503
+ args=["Light-harvesting complex (protonated)", "kPph1"],
1504
+ stoichiometry={"Light-harvesting complex": 1},
1505
+ )
1506
+ m = m.add_reaction(
1507
+ "rubisco_carboxylase",
1508
+ fn=_rate_poolman_5i,
1509
+ args=[
1510
+ "RUBP",
1511
+ "3PGA",
1512
+ "CO2 (dissolved)",
1513
+ "vmax_rubisco_carboxylase",
1514
+ "km_rubisco_carboxylase_RUBP",
1515
+ "km_rubisco_carboxylase_CO2 (dissolved)",
1516
+ "ki_rubisco_carboxylase_3PGA",
1517
+ "FBP",
1518
+ "ki_rubisco_carboxylase_FBP",
1519
+ "SBP",
1520
+ "ki_rubisco_carboxylase_SBP",
1521
+ "Orthophosphate",
1522
+ "ki_rubisco_carboxylase_Orthophosphate",
1523
+ "NADPH",
1524
+ "ki_rubisco_carboxylase_NADPH",
1525
+ ],
1526
+ stoichiometry={"RUBP": -1.0, "3PGA": 2.0},
1527
+ )
1528
+ m = m.add_reaction(
1529
+ "phosphoglycerate_kinase",
1530
+ fn=_rapid_equilibrium_2s_2p,
1531
+ args=[
1532
+ "3PGA",
1533
+ "ATP",
1534
+ "BPGA",
1535
+ "ADP",
1536
+ "kre_phosphoglycerate_kinase",
1537
+ "keq_phosphoglycerate_kinase",
1538
+ ],
1539
+ stoichiometry={"3PGA": -1.0, "ATP": -1.0, "BPGA": 1.0},
1540
+ )
1541
+ m = m.add_reaction(
1542
+ "gadph",
1543
+ fn=_rapid_equilibrium_3s_3p,
1544
+ args=[
1545
+ "BPGA",
1546
+ "NADPH",
1547
+ "protons",
1548
+ "GAP",
1549
+ "NADP",
1550
+ "Orthophosphate",
1551
+ "kre_gadph",
1552
+ "keq_gadph",
1553
+ ],
1554
+ stoichiometry={"NADPH": -1.0, "BPGA": -1.0, "GAP": 1.0},
1555
+ )
1556
+ m = m.add_reaction(
1557
+ "triose_phosphate_isomerase",
1558
+ fn=_rapid_equilibrium_1s_1p,
1559
+ args=[
1560
+ "GAP",
1561
+ "DHAP",
1562
+ "kre_triose_phosphate_isomerase",
1563
+ "keq_triose_phosphate_isomerase",
1564
+ ],
1565
+ stoichiometry={"GAP": -1, "DHAP": 1},
1566
+ )
1567
+ m = m.add_reaction(
1568
+ "aldolase_dhap_gap",
1569
+ fn=_rapid_equilibrium_2s_1p,
1570
+ args=["GAP", "DHAP", "FBP", "kre_aldolase_dhap_gap", "keq_aldolase_dhap_gap"],
1571
+ stoichiometry={"GAP": -1, "DHAP": -1, "FBP": 1},
1572
+ )
1573
+ m = m.add_reaction(
1574
+ "aldolase_dhap_e4p",
1575
+ fn=_rapid_equilibrium_2s_1p,
1576
+ args=["DHAP", "E4P", "SBP", "kre_aldolase_dhap_e4p", "keq_aldolase_dhap_e4p"],
1577
+ stoichiometry={"DHAP": -1, "E4P": -1, "SBP": 1},
1578
+ )
1579
+ m = m.add_reaction(
1580
+ "fbpase",
1581
+ fn=_michaelis_menten_1s_2i,
1582
+ args=[
1583
+ "FBP",
1584
+ "F6P",
1585
+ "Orthophosphate",
1586
+ "vmax_fbpase",
1587
+ "km_fbpase_s",
1588
+ "ki_fbpase_F6P",
1589
+ "ki_fbpase_Orthophosphate",
1590
+ ],
1591
+ stoichiometry={"FBP": -1, "F6P": 1},
1592
+ )
1593
+ m = m.add_reaction(
1594
+ "transketolase_gap_f6p",
1595
+ fn=_rapid_equilibrium_2s_2p,
1596
+ args=[
1597
+ "GAP",
1598
+ "F6P",
1599
+ "E4P",
1600
+ "X5P",
1601
+ "kre_transketolase_gap_f6p",
1602
+ "keq_transketolase_gap_f6p",
1603
+ ],
1604
+ stoichiometry={"GAP": -1, "F6P": -1, "E4P": 1, "X5P": 1},
1605
+ )
1606
+ m = m.add_reaction(
1607
+ "transketolase_gap_s7p",
1608
+ fn=_rapid_equilibrium_2s_2p,
1609
+ args=[
1610
+ "GAP",
1611
+ "S7P",
1612
+ "R5P",
1613
+ "X5P",
1614
+ "kre_transketolase_gap_s7p",
1615
+ "keq_transketolase_gap_s7p",
1616
+ ],
1617
+ stoichiometry={"GAP": -1, "S7P": -1, "R5P": 1, "X5P": 1},
1618
+ )
1619
+ m = m.add_reaction(
1620
+ "SBPase",
1621
+ fn=_michaelis_menten_1s_1i,
1622
+ args=[
1623
+ "SBP",
1624
+ "Orthophosphate",
1625
+ "vmax_SBPase",
1626
+ "km_SBPase_s",
1627
+ "ki_SBPase_Orthophosphate",
1628
+ ],
1629
+ stoichiometry={"SBP": -1, "S7P": 1},
1630
+ )
1631
+ m = m.add_reaction(
1632
+ "ribose_phosphate_isomerase",
1633
+ fn=_rapid_equilibrium_1s_1p,
1634
+ args=[
1635
+ "R5P",
1636
+ "RU5P",
1637
+ "kre_ribose_phosphate_isomerase",
1638
+ "keq_ribose_phosphate_isomerase",
1639
+ ],
1640
+ stoichiometry={"R5P": -1, "RU5P": 1},
1641
+ )
1642
+ m = m.add_reaction(
1643
+ "ribulose_phosphate_epimerase",
1644
+ fn=_rapid_equilibrium_1s_1p,
1645
+ args=[
1646
+ "X5P",
1647
+ "RU5P",
1648
+ "kre_ribulose_phosphate_epimerase",
1649
+ "keq_ribulose_phosphate_epimerase",
1650
+ ],
1651
+ stoichiometry={"X5P": -1, "RU5P": 1},
1652
+ )
1653
+ m = m.add_reaction(
1654
+ "phosphoribulokinase",
1655
+ fn=_rate_prk,
1656
+ args=[
1657
+ "RU5P",
1658
+ "ATP",
1659
+ "Orthophosphate",
1660
+ "3PGA",
1661
+ "RUBP",
1662
+ "ADP",
1663
+ "vmax_phosphoribulokinase",
1664
+ "km_phosphoribulokinase_RU5P",
1665
+ "km_phosphoribulokinase_ATP",
1666
+ "ki_phosphoribulokinase_3PGA",
1667
+ "ki_phosphoribulokinase_RUBP",
1668
+ "ki_phosphoribulokinase_Orthophosphate",
1669
+ "ki_phosphoribulokinase_4",
1670
+ "ki_phosphoribulokinase_5",
1671
+ ],
1672
+ stoichiometry={"RU5P": -1.0, "ATP": -1.0, "RUBP": 1.0},
1673
+ )
1674
+ m = m.add_reaction(
1675
+ "g6pi",
1676
+ fn=_rapid_equilibrium_1s_1p,
1677
+ args=["F6P", "G6P", "kre_g6pi", "keq_g6pi"],
1678
+ stoichiometry={"F6P": -1, "G6P": 1},
1679
+ )
1680
+ m = m.add_reaction(
1681
+ "phosphoglucomutase",
1682
+ fn=_rapid_equilibrium_1s_1p,
1683
+ args=["G6P", "G1P", "kre_phosphoglucomutase", "keq_phosphoglucomutase"],
1684
+ stoichiometry={"G6P": -1, "G1P": 1},
1685
+ )
1686
+ m = m.add_reaction(
1687
+ "ex_pga",
1688
+ fn=_rate_out,
1689
+ args=["3PGA", "N_translocator", "vmax_ex_pga", "km_ex_pga"],
1690
+ stoichiometry={"3PGA": -1},
1691
+ )
1692
+ m = m.add_reaction(
1693
+ "ex_gap",
1694
+ fn=_rate_out,
1695
+ args=["GAP", "N_translocator", "vmax_ex_pga", "km_ex_gap"],
1696
+ stoichiometry={"GAP": -1},
1697
+ )
1698
+ m = m.add_reaction(
1699
+ "ex_dhap",
1700
+ fn=_rate_out,
1701
+ args=["DHAP", "N_translocator", "vmax_ex_pga", "km_ex_dhap"],
1702
+ stoichiometry={"DHAP": -1},
1703
+ )
1704
+ m = m.add_reaction(
1705
+ "ex_g1p",
1706
+ fn=_rate_starch,
1707
+ args=[
1708
+ "G1P",
1709
+ "ATP",
1710
+ "ADP",
1711
+ "Orthophosphate",
1712
+ "3PGA",
1713
+ "F6P",
1714
+ "FBP",
1715
+ "vmax_ex_g1p",
1716
+ "km_ex_g1p_G1P",
1717
+ "km_ex_g1p_ATP",
1718
+ "ki_ex_g1p",
1719
+ "ki_ex_g1p_3PGA",
1720
+ "ki_ex_g1p_F6P",
1721
+ "ki_ex_g1p_FBP",
1722
+ ],
1723
+ stoichiometry={"G1P": -1.0, "ATP": -1.0},
1724
+ )
1725
+ m = m.add_reaction(
1726
+ "mda_reductase_1",
1727
+ fn=_rate_mda_reductase1,
1728
+ args=["MDA", "kf_mda_reductase_1"],
1729
+ stoichiometry={"MDA": -2, "DHA": 1},
1730
+ )
1731
+ m = m.add_reaction(
1732
+ "mda_reductase_2",
1733
+ fn=_rate_mda_reductase2,
1734
+ args=[
1735
+ "NADPH",
1736
+ "MDA",
1737
+ "vmax_mda_reductase_2",
1738
+ "km_mda_reductase_2_NADPH",
1739
+ "km_mda_reductase_2_MDA",
1740
+ ],
1741
+ stoichiometry={"NADPH": -1, "MDA": -2},
1742
+ )
1743
+ m = m.add_reaction(
1744
+ "ascorbate_peroxidase",
1745
+ fn=_rate_ascorbate_peroxidase,
1746
+ args=[
1747
+ "ascorbate",
1748
+ "H2O2",
1749
+ "kf1",
1750
+ "kr1",
1751
+ "kf2",
1752
+ "kr2",
1753
+ "kf3",
1754
+ "kf4",
1755
+ "kr4",
1756
+ "kf5",
1757
+ "XT",
1758
+ ],
1759
+ stoichiometry={"H2O2": -1, "MDA": 2},
1760
+ )
1761
+ m = m.add_reaction(
1762
+ "glutathion_reductase",
1763
+ fn=_rate_glutathion_reductase,
1764
+ args=[
1765
+ "NADPH",
1766
+ "GSSG",
1767
+ "vmax_glutathion_reductase",
1768
+ "km_glutathion_reductase_NADPH",
1769
+ "km_glutathion_reductase_GSSG",
1770
+ ],
1771
+ stoichiometry={"NADPH": -1, "GSSG": -1},
1772
+ )
1773
+ m = m.add_reaction(
1774
+ "dehydroascorbate_reductase",
1775
+ fn=_rate_dhar,
1776
+ args=[
1777
+ "DHA",
1778
+ "GSH",
1779
+ "vmax_dehydroascorbate_reductase",
1780
+ "km_dehydroascorbate_reductase_DHA",
1781
+ "km_dehydroascorbate_reductase_GSH",
1782
+ "K",
1783
+ ],
1784
+ stoichiometry={"DHA": -1, "GSSG": 1},
1785
+ )
1786
+ m = m.add_reaction(
1787
+ "ex_atp",
1788
+ fn=_mass_action_1s,
1789
+ args=["ATP", "kf_ex_atp"],
1790
+ stoichiometry={"ATP": -1},
1791
+ )
1792
+ m = m.add_reaction(
1793
+ "ex_nadph",
1794
+ fn=_mass_action_1s,
1795
+ args=["NADPH", "kf_ex_nadph"],
1796
+ stoichiometry={"NADPH": -1},
1797
+ )
1798
+ m = m.add_surrogate(
1799
+ "ps2states",
1800
+ qss.Surrogate(
1801
+ model=_ps2states_2016_phd_surrogate,
1802
+ args=[
1803
+ "Plastoquinone (oxidised)",
1804
+ "Plastoquinone (reduced)",
1805
+ "PSII_cross_section",
1806
+ "Q",
1807
+ "PSII_total",
1808
+ "k2",
1809
+ "kF",
1810
+ "kH",
1811
+ "keq_Plastoquinone (reduced)",
1812
+ "kPQred",
1813
+ "PPFD",
1814
+ "kH0",
1815
+ ],
1816
+ outputs=["B0", "B1", "B2", "B3"],
1817
+ ),
1818
+ )
1819
+ m = m.add_surrogate(
1820
+ "ps1states",
1821
+ qss.Surrogate(
1822
+ model=_ps1states_2021_surrogate,
1823
+ args=[
1824
+ "Plastocyanine (oxidised)",
1825
+ "Plastocyanine (reduced)",
1826
+ "Ferredoxine (oxidised)",
1827
+ "Ferredoxine (reduced)",
1828
+ "PSII_cross_section",
1829
+ "PSI_total",
1830
+ "kFdred",
1831
+ "keq_ferredoxin_reductase",
1832
+ "keq_PCP700",
1833
+ "kPCox",
1834
+ "PPFD",
1835
+ "kMehler",
1836
+ "O2 (dissolved)_lumen",
1837
+ ],
1838
+ outputs=["A0", "A1", "A2"],
1839
+ ),
1840
+ )
1841
+ m = m.add_readout(
1842
+ "PQ_ox/tot",
1843
+ fn=_div,
1844
+ args=["Plastoquinone (reduced)", "PQ_tot"],
1845
+ )
1846
+ m = m.add_readout(
1847
+ "Fd_ox/tot",
1848
+ fn=_div,
1849
+ args=["Ferredoxine (reduced)", "Fd*"],
1850
+ )
1851
+ m = m.add_readout(
1852
+ "PC_ox/tot",
1853
+ fn=_div,
1854
+ args=["Plastocyanine (reduced)", "PC_tot"],
1855
+ )
1856
+ m = m.add_readout(
1857
+ "NADPH/tot",
1858
+ fn=_div,
1859
+ args=["NADPH", "NADP*"],
1860
+ )
1861
+ m = m.add_readout(
1862
+ "ATP/tot",
1863
+ fn=_div,
1864
+ args=["ATP", "A*P"],
1865
+ )
1866
+ m = m.add_readout(
1867
+ "Fluo",
1868
+ fn=_rate_fluorescence,
1869
+ args=["Q", "B0", "B2", "PSII_cross_section", "k2", "kF", "kH"],
1870
+ )
1871
+ return m # noqa: RET504