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,2375 @@
1
+ """Ebeling 2026 extended chloroplast model with ion transport, ROS, and Calvin cycle.
2
+
3
+ Reference: tbd
4
+ """
5
+
6
+ import math
7
+
8
+ import numpy as np
9
+ from mxlpy import Derived, InitialAssignment, Model
10
+
11
+
12
+ def _initial_delta_psi(
13
+ p_h: float,
14
+ p_h_lumen: float,
15
+ r: float,
16
+ f: float,
17
+ t: float,
18
+ ) -> float:
19
+ """Estimate delta psi in the dark, assuming delta_pH and delta_psi contribute equally to pmf."""
20
+ return np.log(10) * ((r * t) / f) * (p_h - p_h_lumen)
21
+
22
+
23
+ def _half(
24
+ x: float,
25
+ ) -> float:
26
+ """Return x/2; used for halving a stoichiometric coefficient."""
27
+ return x / 2
28
+
29
+
30
+ def _mass_action_1s(
31
+ s1: float,
32
+ k_fwd: float,
33
+ ) -> float:
34
+ """Mass-action rate for one substrate."""
35
+ return k_fwd * s1
36
+
37
+
38
+ def _dg_ph(
39
+ r: float,
40
+ t: float,
41
+ ) -> float:
42
+ """Thermodynamic coefficient dG/dpH = RT*ln(10) in kJ/mol."""
43
+ return np.log(10) * r * t
44
+
45
+
46
+ def _moiety_1(
47
+ concentration: float,
48
+ total: float,
49
+ ) -> float:
50
+ """Conservation moiety: total - concentration."""
51
+ return total - concentration
52
+
53
+
54
+ def _quencher(
55
+ psbs: float,
56
+ vx: float,
57
+ psbsp: float,
58
+ zx: float,
59
+ y0: float,
60
+ y1: float,
61
+ y2: float,
62
+ y3: float,
63
+ k_z_sat: float,
64
+ ) -> float:
65
+ """co-operative 4-state quenching mechanism.
66
+
67
+ gamma0: slow quenching of (Vx - protonation)
68
+ gamma1: fast quenching (Vx + protonation)
69
+ gamma2: fastest possible quenching (Zx + protonation)
70
+ gamma3: slow quenching of Zx present (Zx - protonation).
71
+ """
72
+ ZAnt = zx / (zx + k_z_sat)
73
+ return y0 * vx * psbs + y1 * vx * psbsp + y2 * ZAnt * psbsp + y3 * ZAnt * psbs
74
+
75
+
76
+ def _keq_pq_red(
77
+ e0_qa: float,
78
+ f: float,
79
+ e0_pq: float,
80
+ p_hstroma: float,
81
+ d_g_p_h: float,
82
+ rt: float,
83
+ ) -> float:
84
+ """Equilibrium constant for PQ reduction by QA, pH-corrected via stroma proton contribution."""
85
+ dg1 = -e0_qa * f
86
+ dg2 = -2 * e0_pq * f
87
+ dg = -2 * dg1 + dg2 + 2 * p_hstroma * d_g_p_h
88
+ return np.exp(-dg / rt)
89
+
90
+
91
+ def _ps2_crosssection(
92
+ lhc: float,
93
+ static_ant_ii: float,
94
+ static_ant_i: float,
95
+ ) -> float:
96
+ """Equilibrium constant for PQ reduction by QA, pH-corrected via stroma proton contribution."""
97
+ return static_ant_ii + (1 - static_ant_ii - static_ant_i) * lhc
98
+
99
+
100
+ def _pi_cbb(
101
+ phosphate_total: float,
102
+ pga: float,
103
+ bpga: float,
104
+ gap: float,
105
+ dhap: float,
106
+ fbp: float,
107
+ f6p: float,
108
+ g6p: float,
109
+ g1p: float,
110
+ sbp: float,
111
+ s7p: float,
112
+ e4p: float,
113
+ x5p: float,
114
+ r5p: float,
115
+ rubp: float,
116
+ ru5p: float,
117
+ atp: float,
118
+ ) -> float:
119
+ """Free orthophosphate from total minus all phosphorylated CBB intermediates (bisphosphates count twice)."""
120
+ return phosphate_total - (
121
+ pga
122
+ + 2 * bpga
123
+ + gap
124
+ + dhap
125
+ + 2 * fbp
126
+ + f6p
127
+ + g6p
128
+ + g1p
129
+ + 2 * sbp
130
+ + s7p
131
+ + e4p
132
+ + x5p
133
+ + r5p
134
+ + 2 * rubp
135
+ + ru5p
136
+ + atp
137
+ )
138
+
139
+
140
+ def _moiety_2(
141
+ x1: float,
142
+ x2: float,
143
+ total: float,
144
+ ) -> float:
145
+ """Conservation moiety: total - x1 - x2."""
146
+ return total - x1 - x2
147
+
148
+
149
+ def _glutathion_moiety(
150
+ gssg: float,
151
+ gs_total: float,
152
+ ) -> float:
153
+ """Conservation moiety: GSH = total - 2*GSSG (one GSSG releases two GSH)."""
154
+ return gs_total - 2 * gssg
155
+
156
+
157
+ def _keq_atp(
158
+ p_h: float,
159
+ delta_g0_atp: float,
160
+ d_g_p_h: float,
161
+ hpr: float,
162
+ p_hstroma: float,
163
+ pi_mol: float,
164
+ rt: float,
165
+ ) -> float:
166
+ """Equilibrium constant for ATP synthase, driven by the transmembrane proton gradient."""
167
+ delta_g = delta_g0_atp - d_g_p_h * hpr * (p_hstroma - p_h)
168
+ return pi_mol * math.exp(-delta_g / rt)
169
+
170
+
171
+ def _keq_fnr(
172
+ e0_fd: float,
173
+ f: float,
174
+ e0_nadp: float,
175
+ p_hstroma: float,
176
+ d_g_p_h: float,
177
+ rt: float,
178
+ ) -> float:
179
+ """Equilibrium constant for FNR: Fd-mediated NADP+ reduction, pH-corrected."""
180
+ dg1 = -e0_fd * f
181
+ dg2 = -2 * e0_nadp * f
182
+ dg = -2 * dg1 + dg2 + d_g_p_h * p_hstroma
183
+ return math.exp(-dg / rt)
184
+
185
+
186
+ def _mul(
187
+ x: float,
188
+ y: float,
189
+ ) -> float:
190
+ """Calculate the product of two values.
191
+
192
+ Parameters
193
+ ----------
194
+ x
195
+ First factor
196
+ y
197
+ Second factor
198
+
199
+ Returns
200
+ -------
201
+ Float
202
+ Product of x and y (x * y)
203
+
204
+ Examples
205
+ --------
206
+ >>> mul(2.0, 3.0)
207
+ 6.0
208
+ >>> mul(0.5, 4.0)
209
+ 2.0
210
+
211
+ """
212
+ return x * y
213
+
214
+
215
+ def _rate_translocator(
216
+ pi: float,
217
+ pga: float,
218
+ gap: float,
219
+ dhap: float,
220
+ k_pxt: float,
221
+ p_ext: float,
222
+ k_pi: float,
223
+ k_pga: float,
224
+ k_gap: float,
225
+ k_dhap: float,
226
+ ) -> float:
227
+ """Denominator term N for the phosphate translocator shared by all triose-P export reactions."""
228
+ return 1 + (1 + k_pxt / p_ext) * (
229
+ pi / k_pi + pga / k_pga + gap / k_gap + dhap / k_dhap
230
+ )
231
+
232
+
233
+ def _keq_pcp700(
234
+ e0_pc: float,
235
+ f: float,
236
+ e0_p700: float,
237
+ rt: float,
238
+ ) -> float:
239
+ """Equilibrium constant for PC -> P700 electron transfer from standard redox potentials."""
240
+ DG = -(-e0_pc * f) + (-e0_p700 * f)
241
+ return np.exp(-DG / rt)
242
+
243
+
244
+ def _keq_faf_d(
245
+ e0_fa: float,
246
+ f: float,
247
+ e0_fd: float,
248
+ rt: float,
249
+ ) -> float:
250
+ """Equilibrium constant for FA -> Fd electron transfer from standard redox potentials."""
251
+ DG = -(-e0_fa * f) + (-e0_fd * f)
252
+ return np.exp(-DG / rt)
253
+
254
+
255
+ def _moiety_3(
256
+ c1: float,
257
+ c2: float,
258
+ c3: float,
259
+ total: float,
260
+ ) -> float:
261
+ """Conservation moiety: fourth species = total - c1 - c2 - c3."""
262
+ return total - c1 - c2 - c3
263
+
264
+
265
+ def _normalize_concentration(
266
+ concentration: float,
267
+ total: float,
268
+ ) -> float:
269
+ """Return concentration/total as a dimensionless fraction."""
270
+ return concentration / total
271
+
272
+
273
+ def _normalize_2_concentrations(
274
+ c1: float,
275
+ c2: float,
276
+ total: float,
277
+ ) -> float:
278
+ """Return (c1+c2)/total as a combined dimensionless fraction."""
279
+ return (c1 + c2) / total
280
+
281
+
282
+ def _fluo(
283
+ q: float,
284
+ b0: float,
285
+ b2: float,
286
+ ps2cs: float,
287
+ k2: float,
288
+ k_f: float,
289
+ k_h_qslope: float,
290
+ k_h0: float,
291
+ ) -> float:
292
+ """Chlorophyll fluorescence yield from open (B0) and closed (B2) PSII centres with quencher-dependent kH."""
293
+ kH = k_h0 + k_h_qslope * q
294
+ return (ps2cs * k_f * b0) / (k_f + k2 + kH) + (ps2cs * k_f * b2) / (k_f + kH)
295
+
296
+
297
+ def _k_b6f(
298
+ p_h: float,
299
+ p_kreg: float,
300
+ b6f_content: float,
301
+ max_b6f: float,
302
+ ) -> float:
303
+ """Effective b6f rate constant modulated by lumenal pH via a sigmoid around pKreg."""
304
+ pHmod = 1 - (1 / (10 ** (p_h - p_kreg) + 1))
305
+ return pHmod * b6f_content * max_b6f
306
+
307
+
308
+ def _protons_lumen(
309
+ p_h_lumen: float,
310
+ ) -> float:
311
+ """Convert lumenal pH to proton concentration in mmol/mmol_Chl (conversion factor 2.5e-4)."""
312
+ return (10 ** (-p_h_lumen)) / 2.5e-4
313
+
314
+
315
+ def _protons_stroma_ebeling(
316
+ p_h_stroma: float,
317
+ ) -> float:
318
+ """Convert stromal pH to proton concentration in mmol/mmol_Chl (Ebeling model, factor 3.2e-5)."""
319
+ return (10 ** (-p_h_stroma)) / 3.2e-5
320
+
321
+
322
+ def _pmf(
323
+ _deltap_h: float,
324
+ delta_psi: float,
325
+ f: float,
326
+ ) -> float:
327
+ """Total proton motive force: electrical (F*delta_psi) + chemical (delta_pH) contributions."""
328
+ return f * delta_psi + _deltap_h
329
+
330
+
331
+ def _deltap_h(
332
+ p_h: float,
333
+ p_h_lumen: float,
334
+ d_g: float,
335
+ ) -> float:
336
+ """Proton motive force component from transmembrane pH difference (in energy units)."""
337
+ return d_g * (p_h - p_h_lumen)
338
+
339
+
340
+ def _atp_pmf_activity2(
341
+ p_k0_e: float,
342
+ b: float,
343
+ p_h_lumen: float,
344
+ p_h: float,
345
+ f: float,
346
+ rt: float,
347
+ delta_psi: float,
348
+ ) -> float:
349
+ """Variant of _atp_pmf_activity used in a second ATP synthase module instance."""
350
+ _pmf = delta_psi - np.log(10) * ((rt) / f) * (p_h_lumen - p_h)
351
+ x = np.log(10 ** (-p_k0_e)) + b * (_pmf * f) / (rt)
352
+ return (np.e**x) / (1 + np.e**x)
353
+
354
+
355
+ def _pmf_in_v(
356
+ delta_psi: float,
357
+ p_h_lumen: float,
358
+ p_h: float,
359
+ rt: float,
360
+ f: float,
361
+ ) -> float:
362
+ """Total PMF expressed in volts: delta_psi - (RT/F)*ln(10)*delta_pH."""
363
+ return delta_psi - np.log(10) * ((rt) / f) * (p_h_lumen - p_h)
364
+
365
+
366
+ def _keq_cytb6f(
367
+ p_h: float,
368
+ _pmf: float,
369
+ f: float,
370
+ e0_pq: float,
371
+ e0_pc: float,
372
+ rt: float,
373
+ d_g_p_h: float,
374
+ ) -> float:
375
+ """Equilibrium constant of cytochrome b6f including PMF contribution to free energy."""
376
+ DG1 = -2 * f * e0_pq
377
+ DG2 = -f * e0_pc
378
+ DG = -(DG1 + 2 * d_g_p_h * p_h) + 2 * DG2 + 2 * _pmf
379
+ return np.exp(-DG / rt)
380
+
381
+
382
+ def _squared(
383
+ x: float,
384
+ ) -> float:
385
+ """Return x^2; used for second-order stoichiometry terms."""
386
+ return x**2
387
+
388
+
389
+ def _reg_kea(
390
+ p_h: float,
391
+ atp: float,
392
+ kea3_p_h_reg: float,
393
+ kea3_atp_treshold: float,
394
+ ) -> float:
395
+ """KEA3 K+/H+ antiporter regulation: product of pH and ATP inhibition sigmoids."""
396
+ pH_inhib = (1 - 0.1) / (1 + np.exp((p_h - kea3_p_h_reg) / 0.001))
397
+ ATP_inhib = (1 - 0.1) / (1 + np.exp((kea3_atp_treshold - atp) / 0.01))
398
+ return pH_inhib * ATP_inhib
399
+
400
+
401
+ def _dg_k(
402
+ klumen: float,
403
+ kstroma: float,
404
+ delta_psi: float,
405
+ rt: float,
406
+ f: float,
407
+ ) -> float:
408
+ """Electrochemical driving force for K+ transport across the thylakoid membrane."""
409
+ return (-(rt / f) * np.log10(kstroma / klumen) + delta_psi) * f
410
+
411
+
412
+ def _cl_driving_force(
413
+ delta_psi: float,
414
+ cl_lumen: float,
415
+ cl_stroma: float,
416
+ rt: float,
417
+ f: float,
418
+ ) -> float:
419
+ """Electrochemical driving force for Cl- transport across the thylakoid membrane."""
420
+ return ((rt / f) * np.log10(cl_stroma / cl_lumen) + delta_psi) * f
421
+
422
+
423
+ def _keq_ndh1(
424
+ _pmf: float,
425
+ e0_fd: float,
426
+ f: float,
427
+ e0_pq: float,
428
+ p_hstroma: float,
429
+ d_g_p_h: float,
430
+ rt: float,
431
+ ) -> float:
432
+ """Equilibrium constant for NDH-1 (Fd-dependent PQ reduction) including PMF and stromal pH."""
433
+ DG1 = -e0_fd * f
434
+ DG2 = -2 * e0_pq * f
435
+ DG = -2 * DG1 + DG2 + 2 * d_g_p_h * p_hstroma + 4 * _pmf
436
+ return np.exp(-DG / rt)
437
+
438
+
439
+ def _cl_ce_activation(
440
+ atp: float,
441
+ cl_ce_atp_threshold: float,
442
+ ) -> float:
443
+ """CLCe activation factor: sigmoid inhibited by high ATP (low-energy stress signal)."""
444
+ return (1 - 0.1) / (1 + np.exp((atp - cl_ce_atp_threshold) / 0.01))
445
+
446
+
447
+ def _mass_action_2s(
448
+ s1: float,
449
+ s2: float,
450
+ k_fwd: float,
451
+ ) -> float:
452
+ """Mass-action rate for two substrates."""
453
+ return k_fwd * s1 * s2
454
+
455
+
456
+ def _atp_pmf_activity(
457
+ p_k0_e: float,
458
+ b: float,
459
+ p_h_lumen: float,
460
+ p_h: float,
461
+ f: float,
462
+ rt: float,
463
+ delta_psi: float,
464
+ ) -> float:
465
+ """Sigmoidal ATP synthase activity as function of PMF (delta_psi and delta_pH combined)."""
466
+ _pmf = delta_psi - np.log(10) * ((rt) / f) * (p_h_lumen - p_h)
467
+ x = np.log(10 ** (-p_k0_e)) + b * (_pmf * f) / (rt)
468
+ return (np.e**x) / (1 + np.e**x)
469
+
470
+
471
+ def _v_at_psynthase_mod(
472
+ atp: float,
473
+ atp_activity: float,
474
+ _atp_pmf_activity: float,
475
+ k_at_psynthase: float,
476
+ adp: float,
477
+ _keq_atp: float,
478
+ convf: float,
479
+ ) -> float:
480
+ """ATP synthase flux modulated by light-activation state and PMF-dependent activity sigmoid."""
481
+ return (
482
+ atp_activity
483
+ * _atp_pmf_activity
484
+ * k_at_psynthase
485
+ * (adp / convf - atp / convf / _keq_atp)
486
+ )
487
+
488
+
489
+ def _value(
490
+ x: float,
491
+ ) -> float:
492
+ """Return x unchanged."""
493
+ return x
494
+
495
+
496
+ def _atp_div(
497
+ hpr: float,
498
+ x: float,
499
+ ) -> float:
500
+ """Return -hpr*x for the HPR-scaled proton stoichiometry of ATP synthase (negative = lumen consumption)."""
501
+ return -hpr * x
502
+
503
+
504
+ def _protons_stroma_2016(
505
+ ph: float,
506
+ ) -> float:
507
+ """Convert stromal pH to proton concentration (µmol/L).
508
+
509
+ Introduced by the Matuszynska 2016 PhD model.
510
+ """
511
+ return 4000.0 * 10 ** (-ph)
512
+
513
+
514
+ def _protonation_hill(
515
+ vx: float,
516
+ h: float,
517
+ nh: float,
518
+ k_fwd: float,
519
+ k_ph_sat: float,
520
+ ) -> float:
521
+ """Hill-type protonation rate scaled by lumenal proton concentration."""
522
+ return k_fwd * (h**nh / (h**nh + _protons_stroma_2016(k_ph_sat) ** nh)) * vx # type: ignore
523
+
524
+
525
+ def _rate_cyclic_electron_flow(
526
+ pox: float,
527
+ fdred: float,
528
+ kcyc: float,
529
+ ) -> float:
530
+ """Cyclic electron flow rate: mass action on Fd_red^2 and PQ_ox."""
531
+ return kcyc * fdred**2 * pox
532
+
533
+
534
+ def _rate_protonation_hill(
535
+ vx: float,
536
+ h: float,
537
+ k_fwd: float,
538
+ n_h: float,
539
+ kph_sat: float,
540
+ ) -> float:
541
+ """Hill-type deepoxidase rate activated by lumenal proton concentration."""
542
+ return k_fwd * (h**n_h / (h**n_h + _protons_stroma_2016(kph_sat) ** n_h)) * vx # type: ignore
543
+
544
+
545
+ def _rate_fnr_2019(
546
+ fd_ox: float,
547
+ fd_red: float,
548
+ nadph: float,
549
+ nadp: float,
550
+ km_fnr_f: float,
551
+ km_fnr_n: float,
552
+ vmax: float,
553
+ keq_fnr: float,
554
+ convf: float,
555
+ ) -> float:
556
+ """FNR rate (2019 formulation): same as 2016 but NADP/H concentrations scaled by convf."""
557
+ fdred = fd_red / km_fnr_f
558
+ fdox = fd_ox / km_fnr_f
559
+ nadph = nadph / convf / km_fnr_n
560
+ nadp = nadp / convf / km_fnr_n
561
+ return (
562
+ vmax
563
+ * (fdred**2 * nadp - fdox**2 * nadph / keq_fnr)
564
+ / ((1 + fdred + fdred**2) * (1 + nadp) + (1 + fdox + fdox**2) * (1 + nadph) - 1)
565
+ )
566
+
567
+
568
+ def _rate_leak(
569
+ protons_lumen: float,
570
+ ph_stroma: float,
571
+ k_leak: float,
572
+ ) -> float:
573
+ """Passive proton leak across the thylakoid membrane, proportional to the proton gradient."""
574
+ return k_leak * (protons_lumen - _protons_stroma_2016(ph_stroma))
575
+
576
+
577
+ def _neg_one_div(
578
+ x: float,
579
+ ) -> float:
580
+ """Negate x; used as a sign-flipping stoichiometry wrapper."""
581
+ return -1 * x
582
+
583
+
584
+ def _rate_state_transition_ps1_ps2(
585
+ ant: float,
586
+ pox: float,
587
+ p_tot: float,
588
+ k_stt7: float,
589
+ km_st: float,
590
+ n_st: float,
591
+ ) -> float:
592
+ """STT7-kinase phosphorylation of LHC; inhibited by oxidised PQ (state 1 → 2 transition)."""
593
+ return k_stt7 * (1 / (1 + (pox / p_tot / km_st) ** n_st)) * ant
594
+
595
+
596
+ def _rate_poolman_5i(
597
+ rubp: float,
598
+ pga: float,
599
+ co2: float,
600
+ vmax: float,
601
+ kms_rubp: float,
602
+ kms_co2: float,
603
+ # inhibitors
604
+ ki_pga: float,
605
+ fbp: float,
606
+ ki_fbp: float,
607
+ sbp: float,
608
+ ki_sbp: float,
609
+ pi: float,
610
+ ki_p: float,
611
+ nadph: float,
612
+ ki_nadph: float,
613
+ ) -> float:
614
+ """Rubisco carboxylation rate (Poolman 2000): bi-substrate with 5 competitive inhibitors."""
615
+ top = vmax * rubp * co2
616
+ btm = (
617
+ rubp
618
+ + kms_rubp
619
+ * (
620
+ 1
621
+ + pga / ki_pga
622
+ + fbp / ki_fbp
623
+ + sbp / ki_sbp
624
+ + pi / ki_p
625
+ + nadph / ki_nadph
626
+ )
627
+ ) * (co2 + kms_co2)
628
+ return top / btm
629
+
630
+
631
+ def _rapid_equilibrium_2s_2p(
632
+ s1: float,
633
+ s2: float,
634
+ p1: float,
635
+ p2: float,
636
+ k_re: float,
637
+ q: float,
638
+ ) -> float:
639
+ """Rapid-equilibrium rate for two substrates, two products."""
640
+ return k_re * (s1 * s2 - p1 * p2 / q)
641
+
642
+
643
+ def _rapid_equilibrium_3s_3p(
644
+ s1: float,
645
+ s2: float,
646
+ s3: float,
647
+ p1: float,
648
+ p2: float,
649
+ p3: float,
650
+ k_re: float,
651
+ q: float,
652
+ ) -> float:
653
+ """Rapid-equilibrium rate for three substrates, three products."""
654
+ return k_re * (s1 * s2 * s3 - p1 * p2 * p3 / q)
655
+
656
+
657
+ def _rapid_equilibrium_1s_1p(
658
+ s1: float,
659
+ p1: float,
660
+ k_re: float,
661
+ q: float,
662
+ ) -> float:
663
+ """Rapid-equilibrium rate for one substrate, one product."""
664
+ return k_re * (s1 - p1 / q)
665
+
666
+
667
+ def _rapid_equilibrium_2s_1p(
668
+ s1: float,
669
+ s2: float,
670
+ p1: float,
671
+ k_re: float,
672
+ q: float,
673
+ ) -> float:
674
+ """Rapid-equilibrium rate for two substrates, one product."""
675
+ return k_re * (s1 * s2 - p1 / q)
676
+
677
+
678
+ def _michaelis_menten_1s_2i(
679
+ s: float,
680
+ i1: float,
681
+ i2: float,
682
+ vmax: float,
683
+ km: float,
684
+ ki1: float,
685
+ ki2: float,
686
+ ) -> float:
687
+ """Irreversible Michaelis-Menten rate for one substrate with two inhibitors."""
688
+ return vmax * s / (s + km * (1 + i1 / ki1 + i2 / ki2))
689
+
690
+
691
+ def _michaelis_menten_1s_1i(
692
+ s: float,
693
+ i: float,
694
+ vmax: float,
695
+ km: float,
696
+ ki: float,
697
+ ) -> float:
698
+ """Irreversible Michaelis-Menten rate for one substrate with one inhibitor."""
699
+ return vmax * s / (s + km * (1 + i / ki))
700
+
701
+
702
+ def _rate_prk(
703
+ ru5p: float,
704
+ atp: float,
705
+ pi: float,
706
+ pga: float,
707
+ rubp: float,
708
+ adp: float,
709
+ v13: float,
710
+ km131: float,
711
+ km132: float,
712
+ ki131: float,
713
+ ki132: float,
714
+ ki133: float,
715
+ ki134: float,
716
+ ki135: float,
717
+ ) -> float:
718
+ """Phosphoribulokinase rate: ordered bi-substrate kinetics with PGA, RuBP, Pi and ADP inhibition."""
719
+ return (
720
+ v13
721
+ * ru5p
722
+ * atp
723
+ / (
724
+ (ru5p + km131 * (1 + pga / ki131 + rubp / ki132 + pi / ki133))
725
+ * (atp * (1 + adp / ki134) + km132 * (1 + adp / ki135))
726
+ )
727
+ )
728
+
729
+
730
+ def _rate_out(
731
+ s1: float,
732
+ n_total: float,
733
+ vmax_efflux: float,
734
+ k_efflux: float,
735
+ ) -> float:
736
+ """Individual substrate export rate normalised by the translocator occupancy N."""
737
+ return vmax_efflux * s1 / (n_total * k_efflux)
738
+
739
+
740
+ def _rate_starch(
741
+ g1p: float,
742
+ atp: float,
743
+ adp: float,
744
+ pi: float,
745
+ pga: float,
746
+ f6p: float,
747
+ fbp: float,
748
+ v_st: float,
749
+ kmst1: float,
750
+ kmst2: float,
751
+ ki_st: float,
752
+ kast1: float,
753
+ kast2: float,
754
+ kast3: float,
755
+ ) -> float:
756
+ """Starch synthesis rate via G1P+ATP with ADP inhibition and allosteric activation by PGA/F6P/FBP."""
757
+ return (
758
+ v_st
759
+ * g1p
760
+ * atp
761
+ / (
762
+ (g1p + kmst1)
763
+ * (
764
+ (1 + adp / ki_st) * (atp + kmst2)
765
+ + kmst2 * pi / (kast1 * pga + kast2 * f6p + kast3 * fbp)
766
+ )
767
+ )
768
+ )
769
+
770
+
771
+ def _rate_mda_reductase1(
772
+ mda: float,
773
+ k3: float,
774
+ ) -> float:
775
+ """MDA reductase rate: second-order disproportionation of monodehydroascorbate."""
776
+ return k3 * mda**2
777
+
778
+
779
+ def _rate_mda_reductase2(
780
+ nadph: float,
781
+ mda: float,
782
+ vmax: float,
783
+ km_nadph: float,
784
+ km_mda: float,
785
+ ) -> float:
786
+ """Compare Valero et al. 2016."""
787
+ nom = vmax * nadph * mda
788
+ denom = km_nadph * mda + km_mda * nadph + nadph * mda + km_nadph * km_mda
789
+ return nom / denom
790
+
791
+
792
+ def _rate_ascorbate_peroxidase(
793
+ a: float,
794
+ h: float,
795
+ kf1: float,
796
+ kr1: float,
797
+ kf2: float,
798
+ kr2: float,
799
+ kf3: float,
800
+ kf4: float,
801
+ kr4: float,
802
+ kf5: float,
803
+ xt: float,
804
+ ) -> float:
805
+ """Lumped reaction of ascorbate peroxidase.
806
+
807
+ the cycle stretched to a linear chain with
808
+ two steps producing the MDA
809
+ two steps releasing ASC
810
+ and one step producing hydrogen peroxide.
811
+ """
812
+ nom = a * h * xt
813
+ denom = (
814
+ a * h * (1 / kf3 + 1 / kf5)
815
+ + a / kf1
816
+ + h / kf4
817
+ + h * kr4 / (kf4 * kf5)
818
+ + h / kf2
819
+ + h * kr2 / (kf2 * kf3)
820
+ + kr1 / (kf1 * kf2)
821
+ + kr1 * kr2 / (kf1 * kf2 * kf3)
822
+ )
823
+ return nom / denom
824
+
825
+
826
+ def _rate_glutathion_reductase(
827
+ nadph: float,
828
+ gssg: float,
829
+ vmax: float,
830
+ km_nadph: float,
831
+ km_gssg: float,
832
+ ) -> float:
833
+ """Glutathione reductase rate: bi-substrate Michaelis-Menten for NADPH + GSSG."""
834
+ nom = vmax * nadph * gssg
835
+ denom = km_nadph * gssg + km_gssg * nadph + nadph * gssg + km_nadph * km_gssg
836
+ return nom / denom
837
+
838
+
839
+ def _rate_dhar(
840
+ dha: float,
841
+ gsh: float,
842
+ vmax: float,
843
+ km_dha: float,
844
+ km_gsh: float,
845
+ k: float,
846
+ ) -> float:
847
+ """Dehydroascorbate reductase rate: bi-substrate random-order Michaelis-Menten."""
848
+ nom = vmax * dha * gsh
849
+ denom = k + km_dha * gsh + km_gsh * dha + dha * gsh
850
+ return nom / denom
851
+
852
+
853
+ def _mass_action_22_rev(
854
+ s1: float,
855
+ s2: float,
856
+ p1: float,
857
+ p2: float,
858
+ kf: float,
859
+ keq: float,
860
+ ) -> float:
861
+ """Reversible bimolecular mass-action rate: kf*(s1*s2) - (kf/keq)*(p1*p2)."""
862
+ return kf * s1 * s2 - (kf / keq) * p1 * p2
863
+
864
+
865
+ def _v_ps1(
866
+ p700_fa: float,
867
+ ps2cs: float,
868
+ pfd: float,
869
+ ) -> float:
870
+ """PSI electron transfer rate: open PSI fraction * light absorbed by PSI antenna."""
871
+ return (1 - ps2cs) * pfd * p700_fa
872
+
873
+
874
+ def _v_mehler(
875
+ psi_red_acceptor: float,
876
+ o2ext: float,
877
+ k_mehler: float,
878
+ ) -> float:
879
+ """Mehler reaction rate: O2 reduction by PSI-reduced acceptor (pseudo-Mehler/flavodiiron)."""
880
+ return k_mehler * o2ext * psi_red_acceptor
881
+
882
+
883
+ def _kquencher(
884
+ s: float,
885
+ q: float,
886
+ k_h_qslope: float,
887
+ k_h0: float,
888
+ ) -> float:
889
+ """Effective quenching rate on state s: linear quencher dependence with baseline k_h0."""
890
+ return (k_h0 + k_h_qslope * q) * s
891
+
892
+
893
+ def _one_div(
894
+ x: float,
895
+ ) -> float:
896
+ """Identity passthrough; used as a no-op stoichiometry wrapper."""
897
+ return x
898
+
899
+
900
+ def _vb6f_2024(
901
+ pc: float,
902
+ p_cred: float,
903
+ pq: float,
904
+ p_qred: float,
905
+ _k_b6f: float,
906
+ keq: float,
907
+ ) -> float:
908
+ """2024 b6f rate using PQH2/PQ fractions instead of absolute concentrations."""
909
+ f = p_qred / (p_qred + pq)
910
+ return f * pc * _k_b6f - (1 - f) * p_cred * (_k_b6f / keq)
911
+
912
+
913
+ def _four_div(
914
+ x: float,
915
+ ) -> float:
916
+ """Return 4*x; used for the 4-proton lumenal stoichiometry of the b6f complex."""
917
+ return 4 * x
918
+
919
+
920
+ def _v_at_pactivity(
921
+ at_pactivity: float,
922
+ light: float,
923
+ k_act_at_pase: float,
924
+ k_deact_at_pase: float,
925
+ ) -> float:
926
+ """Activation of ATPsynthase by light."""
927
+ if light > 0.0:
928
+ return k_act_at_pase * (1 - at_pactivity)
929
+ return -k_deact_at_pase * at_pactivity
930
+
931
+
932
+ def _reversible_mass_action_1s_1p(
933
+ s: float,
934
+ p: float,
935
+ kf: float,
936
+ kb: float,
937
+ ) -> float:
938
+ """Reversible unimolecular mass-action rate: kf*s - kb*p."""
939
+ return kf * s - kb * p
940
+
941
+
942
+ def _v_kea(
943
+ klumen: float,
944
+ h: float,
945
+ kstroma: float,
946
+ k_kea: float,
947
+ hstroma: float,
948
+ _reg_kea: float,
949
+ ) -> float:
950
+ """KEA3 antiporter rate: regulated K+/H+ exchange clamped to zero for back-flux."""
951
+ v_KEA = k_kea * (h * kstroma - hstroma * klumen) * _reg_kea
952
+ return max(
953
+ v_KEA,
954
+ 0,
955
+ )
956
+
957
+
958
+ def _v_voltage_k_channel(
959
+ delta_psi_ions: float,
960
+ klumen: float,
961
+ kstroma: float,
962
+ _dg_k: float,
963
+ perm_k: float,
964
+ k_delta_psi_treshold: float,
965
+ ) -> float:
966
+ """Voltage-gated K+ channel flux: sigmoid voltage activation times electrochemical driving force."""
967
+ voltage_dependence = (1 - 0.1) / (
968
+ 1 + np.exp(-(delta_psi_ions - k_delta_psi_treshold) / 0.001)
969
+ )
970
+ return (
971
+ perm_k * _dg_k * voltage_dependence * (klumen / kstroma)
972
+ ) # why divided K_total/2
973
+
974
+
975
+ def _v_vccn1(
976
+ cl_stroma: float,
977
+ cl_lumen: float,
978
+ _cl_driving_force: float,
979
+ delta_psi_ions: float,
980
+ k_vccn1: float,
981
+ vccn_delta_psi_treshold: float,
982
+ ) -> float:
983
+ """VCCN1 anion channel flux: voltage-gated Cl- transport driven by electrochemical force."""
984
+ voltage_gate = (1 - 0.1) / (
985
+ 1 + np.exp(-(delta_psi_ions - vccn_delta_psi_treshold) / 0.001)
986
+ )
987
+ return voltage_gate * k_vccn1 * _cl_driving_force * (cl_stroma / cl_lumen)
988
+
989
+
990
+ def _v_cl_leak(
991
+ k_cl_leak: float,
992
+ cl_lumen: float,
993
+ cl_stroma: float,
994
+ pq: float,
995
+ cl_leak_pq: float,
996
+ total_div: float,
997
+ ) -> float:
998
+ """Passive Cl- leak flux: PQ-activated quadratic concentration-difference driving force."""
999
+ activation = (1 - 0.1) / (1 + np.exp(-(pq - cl_leak_pq) / 0.1))
1000
+ return k_cl_leak * ((cl_lumen - cl_stroma) ** 2) / (total_div) * activation
1001
+
1002
+
1003
+ def _v_ndh1(
1004
+ a1: float,
1005
+ fdred: float,
1006
+ pq: float,
1007
+ p_hlumen: float,
1008
+ k_ndh1: float,
1009
+ ) -> float:
1010
+ """NDH-1 flux: Fd-dependent PQ reduction activated by open PSI fraction and lumenal pH."""
1011
+ return (
1012
+ k_ndh1
1013
+ * ((fdred**2) * pq)
1014
+ * ((1 - 0.1) / (1 + np.exp(-((a1 - 0.02) / 0.01))))
1015
+ * (10 ** (p_hlumen - 6.5) / (10 ** (p_hlumen - 6.5) + 0.5))
1016
+ )
1017
+
1018
+
1019
+ def _cl_ce_bi(
1020
+ cl_lumen: float,
1021
+ cl_stroma: float,
1022
+ k_cl_ce: float,
1023
+ activation: float,
1024
+ ) -> float: # correct
1025
+ """CLCe bidirectional flux: simple concentration-gradient driven Cl- transport."""
1026
+ return k_cl_ce * (cl_stroma - cl_lumen) * activation
1027
+
1028
+
1029
+ def _div(
1030
+ x: float,
1031
+ y: float,
1032
+ ) -> float:
1033
+ """Return x / y."""
1034
+ return x / y
1035
+
1036
+
1037
+ def create_model() -> Model:
1038
+ """Ebeling 2026 extended chloroplast model with ion transport, ROS, and Calvin cycle.
1039
+
1040
+ Reference: tbd
1041
+ """
1042
+ m: Model = Model()
1043
+ m = m.add_variable("3PGA", initial_value=0.9167729479368978)
1044
+ m = m.add_variable("BPGA", initial_value=0.0003814495319659031)
1045
+ m = m.add_variable("GAP", initial_value=0.00580821050261484)
1046
+ m = m.add_variable("DHAP", initial_value=0.1277806166216142)
1047
+ m = m.add_variable("FBP", initial_value=0.005269452472931973)
1048
+ m = m.add_variable("F6P", initial_value=0.2874944558066638)
1049
+ m = m.add_variable("G6P", initial_value=0.6612372482712676)
1050
+ m = m.add_variable("G1P", initial_value=0.03835176039761378)
1051
+ m = m.add_variable("SBP", initial_value=0.011101373736607443)
1052
+ m = m.add_variable("S7P", initial_value=0.1494578301900007)
1053
+ m = m.add_variable("E4P", initial_value=0.00668295494870102)
1054
+ m = m.add_variable("X5P", initial_value=0.020988553174809618)
1055
+ m = m.add_variable("R5P", initial_value=0.035155825913785584)
1056
+ m = m.add_variable("RUBP", initial_value=0.11293260727162346)
1057
+ m = m.add_variable("RU5P", initial_value=0.014062330254191594)
1058
+ m = m.add_variable("ATP", initial_value=1.4612747767895344)
1059
+ m = m.add_variable("Ferredoxine (oxidised)", initial_value=3.715702384326767)
1060
+ m = m.add_variable("Light-harvesting complex", initial_value=0.7805901436176024)
1061
+ m = m.add_variable("NADPH", initial_value=0.5578718406315588)
1062
+ m = m.add_variable("Plastocyanine (oxidised)", initial_value=1.8083642974980014)
1063
+ m = m.add_variable("Plastoquinone (oxidised)", initial_value=10.251099271612473)
1064
+ m = m.add_variable("PsbS (de-protonated)", initial_value=0.9667381262477079)
1065
+ m = m.add_variable("Violaxanthin", initial_value=0.9629870646993118)
1066
+ m = m.add_variable("MDA", initial_value=2.0353396709300447e-07)
1067
+ m = m.add_variable("H2O2", initial_value=1.2034405327140102e-07)
1068
+ m = m.add_variable("DHA", initial_value=1.0296456279861962e-11)
1069
+ m = m.add_variable("GSSG", initial_value=4.99986167652437e-12)
1070
+ m = m.add_variable("Thioredoxin (oxidised)", initial_value=0.9334426859846461)
1071
+ m = m.add_variable("E_inactive", initial_value=3.6023635680406634)
1072
+ m = m.add_variable("P700FA", initial_value=1.506615384275408)
1073
+ m = m.add_variable("P700+FA-", initial_value=0.019197449388051676)
1074
+ m = m.add_variable("P700FA-", initial_value=0.028144516332212766)
1075
+ m = m.add_variable("B0", initial_value=1.9379789566530539)
1076
+ m = m.add_variable("B1", initial_value=9.786232812526368e-08)
1077
+ m = m.add_variable("B2", initial_value=0.5620208537555176)
1078
+ m = m.add_variable("pH_lumen", initial_value=6.8)
1079
+ m = m.add_variable("pH", initial_value=7.5)
1080
+ m = m.add_variable("ATPactivity", initial_value=0)
1081
+ m = m.add_variable(
1082
+ "delta_psi",
1083
+ initial_value=InitialAssignment(
1084
+ fn=_initial_delta_psi, args=["pH", "pH_lumen", "R", "F", "T"]
1085
+ ),
1086
+ )
1087
+ m = m.add_variable(
1088
+ "K_stroma",
1089
+ initial_value=InitialAssignment(fn=_half, args=["K_total"]),
1090
+ )
1091
+ m = m.add_variable(
1092
+ "Cl_stroma",
1093
+ initial_value=InitialAssignment(fn=_half, args=["Cl_total"]),
1094
+ )
1095
+ m = m.add_parameter("PPFD", value=100.0)
1096
+ m = m.add_parameter("CO2 (dissolved)", value=0.013226)
1097
+ m = m.add_parameter("O2 (dissolved)_lumen", value=8.0)
1098
+ m = m.add_parameter("bH", value=100.0)
1099
+ m = m.add_parameter("F", value=96.485)
1100
+ m = m.add_parameter("E^0_PC", value=0.38)
1101
+ m = m.add_parameter("E^0_P700", value=0.48)
1102
+ m = m.add_parameter("E^0_FA", value=-0.55)
1103
+ m = m.add_parameter("E^0_Fd", value=-0.43)
1104
+ m = m.add_parameter("E^0_NADP", value=-0.113)
1105
+ m = m.add_parameter("convf", value=0.032)
1106
+ m = m.add_parameter("R", value=0.0083)
1107
+ m = m.add_parameter("T", value=298.0)
1108
+ m = m.add_parameter("Carotenoids_tot", value=1.0)
1109
+ m = m.add_parameter("Fd*", value=5.0)
1110
+ m = m.add_parameter("PC_tot", value=4.0)
1111
+ m = m.add_parameter("PSBS_tot", value=1.0)
1112
+ m = m.add_parameter("LHC_tot", value=1.0)
1113
+ m = m.add_parameter("gamma0", value=0.06260060801266355)
1114
+ m = m.add_parameter("gamma1", value=0.4053583123566203)
1115
+ m = m.add_parameter("gamma2", value=0.7040758738825375)
1116
+ m = m.add_parameter("gamma3", value=0.07834807781016208)
1117
+ m = m.add_parameter("kZSat", value=0.12)
1118
+ m = m.add_parameter("E^0_QA", value=-0.14)
1119
+ m = m.add_parameter("E^0_PQ", value=0.354)
1120
+ m = m.add_parameter("PQ_tot", value=17.5)
1121
+ m = m.add_parameter("staticAntII", value=0.1)
1122
+ m = m.add_parameter("staticAntI", value=0.37)
1123
+ m = m.add_parameter("Thioredoxin_tot", value=1.0)
1124
+ m = m.add_parameter("E_total", value=6.0)
1125
+ m = m.add_parameter("NADP*", value=0.8)
1126
+ m = m.add_parameter("A*P", value=2.55)
1127
+ m = m.add_parameter("Pi_tot", value=17.05)
1128
+ m = m.add_parameter("kf_ferredoxin_thioredoxin_reductase", value=0.8)
1129
+ m = m.add_parameter("kf_tr_activation", value=1.0)
1130
+ m = m.add_parameter("kf_tr_inactivation", value=0.1)
1131
+ m = m.add_parameter("ASC_tot*", value=10)
1132
+ m = m.add_parameter("Glutathion_tot", value=10.0)
1133
+ m = m.add_parameter("kf_atp_synthase", value=20.0)
1134
+ m = m.add_parameter("HPR", value=4.666666666666667)
1135
+ m = m.add_parameter("Pi_mol", value=0.01)
1136
+ m = m.add_parameter("DeltaG0_ATP", value=30.6)
1137
+ m = m.add_parameter("kh_lhc_protonation", value=10)
1138
+ m = m.add_parameter("kf_lhc_protonation", value=0.15837051384170664)
1139
+ m = m.add_parameter("ksat_lhc_protonation", value=6.2539066418842255)
1140
+ m = m.add_parameter("kf_lhc_deprotonation", value=0.015892570403695704)
1141
+ m = m.add_parameter("kf_cyclic_electron_flow", value=1.0)
1142
+ m = m.add_parameter("kf_violaxanthin_deepoxidase", value=0.0006091912188339879)
1143
+ m = m.add_parameter("kh_violaxanthin_deepoxidase", value=4)
1144
+ m = m.add_parameter("ksat_violaxanthin_deepoxidase", value=6.193595407850397)
1145
+ m = m.add_parameter("kf_zeaxanthin_epoxidase", value=0.000106261953934132)
1146
+ m = m.add_parameter("km_fnr_Ferredoxine (reduced)", value=1.56)
1147
+ m = m.add_parameter("km_fnr_NADP", value=0.22)
1148
+ m = m.add_parameter("E0_fnr", value=3.0)
1149
+ m = m.add_parameter("kcat_fnr", value=500.0)
1150
+ m = m.add_parameter("kf_ndh", value=0.002)
1151
+ m = m.add_parameter("PSII_total", value=2.5)
1152
+ m = m.add_parameter("PSI_total", value=2.5)
1153
+ m = m.add_parameter("kH0", value=500000000.0)
1154
+ m = m.add_parameter("kPQred", value=250.0)
1155
+ m = m.add_parameter("kPCox", value=2500.0)
1156
+ m = m.add_parameter("kFdred", value=250000.0)
1157
+ m = m.add_parameter("k2", value=5000000000.0)
1158
+ m = m.add_parameter("kH", value=5000000000.0)
1159
+ m = m.add_parameter("kF", value=625000000.0)
1160
+ m = m.add_parameter("kMehler", value=1.0)
1161
+ m = m.add_parameter("kf_proton_leak", value=10.0)
1162
+ m = m.add_parameter("kPTOX", value=0.01)
1163
+ m = m.add_parameter("kStt7", value=0.0035)
1164
+ m = m.add_parameter("km_lhc_state_transition_12", value=0.2)
1165
+ m = m.add_parameter("n_ST", value=2.0)
1166
+ m = m.add_parameter("kPph1", value=0.0013)
1167
+ m = m.add_parameter("E0_rubisco", value=1.0)
1168
+ m = m.add_parameter("kcat_rubisco_carboxylase", value=2.72)
1169
+ m = m.add_parameter("km_rubisco_carboxylase_RUBP", value=0.02)
1170
+ m = m.add_parameter("km_rubisco_carboxylase_CO2 (dissolved)", value=0.0107)
1171
+ m = m.add_parameter("ki_rubisco_carboxylase_3PGA", value=0.04)
1172
+ m = m.add_parameter("ki_rubisco_carboxylase_FBP", value=0.04)
1173
+ m = m.add_parameter("ki_rubisco_carboxylase_SBP", value=0.075)
1174
+ m = m.add_parameter("ki_rubisco_carboxylase_Orthophosphate", value=0.9)
1175
+ m = m.add_parameter("ki_rubisco_carboxylase_NADPH", value=0.07)
1176
+ m = m.add_parameter("kre_phosphoglycerate_kinase", value=800000000.0)
1177
+ m = m.add_parameter("keq_phosphoglycerate_kinase", value=0.00031)
1178
+ m = m.add_parameter("kre_gadph", value=800000000.0)
1179
+ m = m.add_parameter("keq_gadph", value=16000000.0)
1180
+ m = m.add_parameter("kre_triose_phosphate_isomerase", value=800000000.0)
1181
+ m = m.add_parameter("keq_triose_phosphate_isomerase", value=22.0)
1182
+ m = m.add_parameter("kre_aldolase_dhap_gap", value=800000000.0)
1183
+ m = m.add_parameter("keq_aldolase_dhap_gap", value=7.1)
1184
+ m = m.add_parameter("kre_aldolase_dhap_e4p", value=800000000.0)
1185
+ m = m.add_parameter("keq_aldolase_dhap_e4p", value=13.0)
1186
+ m = m.add_parameter("E0_fbpase", value=1.0)
1187
+ m = m.add_parameter("kcat_fbpase", value=1.6)
1188
+ m = m.add_parameter("km_fbpase_s", value=0.03)
1189
+ m = m.add_parameter("ki_fbpase_F6P", value=0.7)
1190
+ m = m.add_parameter("ki_fbpase_Orthophosphate", value=12.0)
1191
+ m = m.add_parameter("kre_transketolase_gap_f6p", value=800000000.0)
1192
+ m = m.add_parameter("keq_transketolase_gap_f6p", value=0.084)
1193
+ m = m.add_parameter("kre_transketolase_gap_s7p", value=800000000.0)
1194
+ m = m.add_parameter("keq_transketolase_gap_s7p", value=0.85)
1195
+ m = m.add_parameter("E0_SBPase", value=1.0)
1196
+ m = m.add_parameter("kcat_SBPase", value=0.32)
1197
+ m = m.add_parameter("km_SBPase_s", value=0.013)
1198
+ m = m.add_parameter("ki_SBPase_Orthophosphate", value=12.0)
1199
+ m = m.add_parameter("kre_ribose_phosphate_isomerase", value=800000000.0)
1200
+ m = m.add_parameter("keq_ribose_phosphate_isomerase", value=0.4)
1201
+ m = m.add_parameter("kre_ribulose_phosphate_epimerase", value=800000000.0)
1202
+ m = m.add_parameter("keq_ribulose_phosphate_epimerase", value=0.67)
1203
+ m = m.add_parameter("E0_phosphoribulokinase", value=1.0)
1204
+ m = m.add_parameter("kcat_phosphoribulokinase", value=7.9992)
1205
+ m = m.add_parameter("km_phosphoribulokinase_RU5P", value=0.05)
1206
+ m = m.add_parameter("km_phosphoribulokinase_ATP", value=0.05)
1207
+ m = m.add_parameter("ki_phosphoribulokinase_3PGA", value=2.0)
1208
+ m = m.add_parameter("ki_phosphoribulokinase_RUBP", value=0.7)
1209
+ m = m.add_parameter("ki_phosphoribulokinase_Orthophosphate", value=4.0)
1210
+ m = m.add_parameter("ki_phosphoribulokinase_4", value=2.5)
1211
+ m = m.add_parameter("ki_phosphoribulokinase_5", value=0.4)
1212
+ m = m.add_parameter("kre_g6pi", value=800000000.0)
1213
+ m = m.add_parameter("keq_g6pi", value=2.3)
1214
+ m = m.add_parameter("kre_phosphoglucomutase", value=800000000.0)
1215
+ m = m.add_parameter("keq_phosphoglucomutase", value=0.058)
1216
+ m = m.add_parameter("Orthophosphate (external)", value=0.5)
1217
+ m = m.add_parameter("km_ex_pga", value=0.25)
1218
+ m = m.add_parameter("km_ex_gap", value=0.075)
1219
+ m = m.add_parameter("km_ex_dhap", value=0.077)
1220
+ m = m.add_parameter("km_N_translocator_Orthophosphate (external)", value=0.74)
1221
+ m = m.add_parameter("km_N_translocator_Orthophosphate", value=0.63)
1222
+ m = m.add_parameter("kcat_N_translocator", value=2.0)
1223
+ m = m.add_parameter("E0_N_translocator", value=1.0)
1224
+ m = m.add_parameter("E0_ex_g1p", value=1.0)
1225
+ m = m.add_parameter("km_ex_g1p_G1P", value=0.08)
1226
+ m = m.add_parameter("km_ex_g1p_ATP", value=0.08)
1227
+ m = m.add_parameter("ki_ex_g1p", value=10.0)
1228
+ m = m.add_parameter("ki_ex_g1p_3PGA", value=0.1)
1229
+ m = m.add_parameter("ki_ex_g1p_F6P", value=0.02)
1230
+ m = m.add_parameter("ki_ex_g1p_FBP", value=0.02)
1231
+ m = m.add_parameter("kcat_ex_g1p", value=0.32)
1232
+ m = m.add_parameter("kf_mda_reductase_1", value=500.0)
1233
+ m = m.add_parameter("E0_mda_reductase_2", value=0.002)
1234
+ m = m.add_parameter("kcat_mda_reductase_2", value=300.0)
1235
+ m = m.add_parameter("km_mda_reductase_2_NADPH", value=0.023)
1236
+ m = m.add_parameter("km_mda_reductase_2_MDA", value=0.0014)
1237
+ m = m.add_parameter("kf1", value=10000.0)
1238
+ m = m.add_parameter("kr1", value=220.0)
1239
+ m = m.add_parameter("kf2", value=10000.0)
1240
+ m = m.add_parameter("kr2", value=4000.0)
1241
+ m = m.add_parameter("kf3", value=2510.0)
1242
+ m = m.add_parameter("kf4", value=10000.0)
1243
+ m = m.add_parameter("kr4", value=4000.0)
1244
+ m = m.add_parameter("kf5", value=2510.0)
1245
+ m = m.add_parameter("XT", value=0.07)
1246
+ m = m.add_parameter("E0_glutathion_reductase", value=0.0014)
1247
+ m = m.add_parameter("kcat_glutathion_reductase", value=595)
1248
+ m = m.add_parameter("km_glutathion_reductase_NADPH", value=0.003)
1249
+ m = m.add_parameter("km_glutathion_reductase_GSSG", value=0.2)
1250
+ m = m.add_parameter("km_dehydroascorbate_reductase_DHA", value=0.07)
1251
+ m = m.add_parameter("km_dehydroascorbate_reductase_GSH", value=2.5)
1252
+ m = m.add_parameter("K", value=0.5)
1253
+ m = m.add_parameter("E0_dehydroascorbate_reductase", value=0.0017)
1254
+ m = m.add_parameter("kcat_dehydroascorbate_reductase", value=142)
1255
+ m = m.add_parameter("kf_ex_atp", value=0.5)
1256
+ m = m.add_parameter("kf_ex_nadph", value=0.5)
1257
+ m = m.add_parameter("kH_Qslope", value=30000000000.0)
1258
+ m = m.add_parameter("b6f_content", value=1)
1259
+ m = m.add_parameter("max_b6f", value=500)
1260
+ m = m.add_parameter("pKreg", value=7)
1261
+ m = m.add_parameter("stroma_buffering", value=400)
1262
+ m = m.add_parameter("kActATPase", value=0.001)
1263
+ m = m.add_parameter("kDeactATPase", value=0.002)
1264
+ m = m.add_parameter("k_ATPsynthase", value=20)
1265
+ m = m.add_parameter("b", value=1.8688304401249531)
1266
+ m = m.add_parameter("pK0E", value=5.960025833706074)
1267
+ m = m.add_parameter("k_import_ATP", value=0.5)
1268
+ m = m.add_parameter("k_import_NADPH", value=0.5)
1269
+ m = m.add_parameter("volts_per_charge", value=0.000769481926574965)
1270
+ m = m.add_parameter("ClCe_PQ", value=15.87880046767565)
1271
+ m = m.add_parameter("Cl_leak_PQ", value=14.92901445507139)
1272
+ m = m.add_parameter("KEA3_ATP_treshold", value=0.26274793681796166)
1273
+ m = m.add_parameter("KEA3_pH_reg", value=7.69)
1274
+ m = m.add_parameter("K_delta_psi_treshold", value=0.08146807307624158)
1275
+ m = m.add_parameter("VCCN_delta_psi_treshold", value=0.08000900979332677)
1276
+ m = m.add_parameter("k_Cl_leak", value=25)
1277
+ m = m.add_parameter("k_NDH1", value=7.447430768265866)
1278
+ m = m.add_parameter("k_KEA", value=90)
1279
+ m = m.add_parameter("perm_K", value=1.6113135416150155)
1280
+ m = m.add_parameter("k_VCCN1", value=0.5)
1281
+ m = m.add_parameter("k_ClCe", value=0.5)
1282
+ m = m.add_parameter("K_total", value=60)
1283
+ m = m.add_parameter("Cl_total", value=50)
1284
+ m = m.add_parameter("ClCe_ATP_threshold", value=0.2)
1285
+ m = m.add_derived(
1286
+ "RT",
1287
+ fn=_mass_action_1s,
1288
+ args=["R", "T"],
1289
+ )
1290
+ m = m.add_derived(
1291
+ "dG_pH",
1292
+ fn=_dg_ph,
1293
+ args=["R", "T"],
1294
+ )
1295
+ m = m.add_derived(
1296
+ "Zeaxanthin",
1297
+ fn=_moiety_1,
1298
+ args=["Violaxanthin", "Carotenoids_tot"],
1299
+ )
1300
+ m = m.add_derived(
1301
+ "Ferredoxine (reduced)",
1302
+ fn=_moiety_1,
1303
+ args=["Ferredoxine (oxidised)", "Fd*"],
1304
+ )
1305
+ m = m.add_derived(
1306
+ "Plastocyanine (reduced)",
1307
+ fn=_moiety_1,
1308
+ args=["Plastocyanine (oxidised)", "PC_tot"],
1309
+ )
1310
+ m = m.add_derived(
1311
+ "PsbS (protonated)",
1312
+ fn=_moiety_1,
1313
+ args=["PsbS (de-protonated)", "PSBS_tot"],
1314
+ )
1315
+ m = m.add_derived(
1316
+ "Light-harvesting complex (protonated)",
1317
+ fn=_moiety_1,
1318
+ args=["Light-harvesting complex", "LHC_tot"],
1319
+ )
1320
+ m = m.add_derived(
1321
+ "Q",
1322
+ fn=_quencher,
1323
+ args=[
1324
+ "PsbS (de-protonated)",
1325
+ "Violaxanthin",
1326
+ "PsbS (protonated)",
1327
+ "Zeaxanthin",
1328
+ "gamma0",
1329
+ "gamma1",
1330
+ "gamma2",
1331
+ "gamma3",
1332
+ "kZSat",
1333
+ ],
1334
+ )
1335
+ m = m.add_derived(
1336
+ "keq_Plastoquinone (reduced)",
1337
+ fn=_keq_pq_red,
1338
+ args=["E^0_QA", "F", "E^0_PQ", "pH", "dG_pH", "RT"],
1339
+ )
1340
+ m = m.add_derived(
1341
+ "Plastoquinone (reduced)",
1342
+ fn=_moiety_1,
1343
+ args=["Plastoquinone (oxidised)", "PQ_tot"],
1344
+ )
1345
+ m = m.add_derived(
1346
+ "PSII_cross_section",
1347
+ fn=_ps2_crosssection,
1348
+ args=["Light-harvesting complex", "staticAntII", "staticAntI"],
1349
+ )
1350
+ m = m.add_derived(
1351
+ "Thioredoxin (reduced)",
1352
+ fn=_moiety_1,
1353
+ args=["Thioredoxin (oxidised)", "Thioredoxin_tot"],
1354
+ )
1355
+ m = m.add_derived(
1356
+ "E_active",
1357
+ fn=_moiety_1,
1358
+ args=["E_inactive", "E_total"],
1359
+ )
1360
+ m = m.add_derived(
1361
+ "NADP",
1362
+ fn=_moiety_1,
1363
+ args=["NADPH", "NADP*"],
1364
+ )
1365
+ m = m.add_derived(
1366
+ "ADP",
1367
+ fn=_moiety_1,
1368
+ args=["ATP", "A*P"],
1369
+ )
1370
+ m = m.add_derived(
1371
+ "Orthophosphate",
1372
+ fn=_pi_cbb,
1373
+ args=[
1374
+ "Pi_tot",
1375
+ "3PGA",
1376
+ "BPGA",
1377
+ "GAP",
1378
+ "DHAP",
1379
+ "FBP",
1380
+ "F6P",
1381
+ "G6P",
1382
+ "G1P",
1383
+ "SBP",
1384
+ "S7P",
1385
+ "E4P",
1386
+ "X5P",
1387
+ "R5P",
1388
+ "RUBP",
1389
+ "RU5P",
1390
+ "ATP",
1391
+ ],
1392
+ )
1393
+ m = m.add_derived(
1394
+ "ascorbate",
1395
+ fn=_moiety_2,
1396
+ args=["MDA", "DHA", "ASC_tot*"],
1397
+ )
1398
+ m = m.add_derived(
1399
+ "GSH",
1400
+ fn=_glutathion_moiety,
1401
+ args=["GSSG", "Glutathion_tot"],
1402
+ )
1403
+ m = m.add_derived(
1404
+ "keq_atp_synthase",
1405
+ fn=_keq_atp,
1406
+ args=["pH_lumen", "DeltaG0_ATP", "dG_pH", "HPR", "pH", "Pi_mol", "RT"],
1407
+ )
1408
+ m = m.add_derived(
1409
+ "keq_fnr",
1410
+ fn=_keq_fnr,
1411
+ args=["E^0_Fd", "F", "E^0_NADP", "pH", "dG_pH", "RT"],
1412
+ )
1413
+ m = m.add_derived(
1414
+ "vmax_fnr",
1415
+ fn=_mass_action_1s,
1416
+ args=["kcat_fnr", "E0_fnr"],
1417
+ )
1418
+ m = m.add_derived(
1419
+ "E0_rubisco_active",
1420
+ fn=_mul,
1421
+ args=["E0_rubisco", "E_active"],
1422
+ )
1423
+ m = m.add_derived(
1424
+ "vmax_rubisco_carboxylase",
1425
+ fn=_mass_action_1s,
1426
+ args=["kcat_rubisco_carboxylase", "E0_rubisco_active"],
1427
+ )
1428
+ m = m.add_derived(
1429
+ "E0_fbpase_active",
1430
+ fn=_mul,
1431
+ args=["E0_fbpase", "E_active"],
1432
+ )
1433
+ m = m.add_derived(
1434
+ "vmax_fbpase",
1435
+ fn=_mass_action_1s,
1436
+ args=["kcat_fbpase", "E0_fbpase_active"],
1437
+ )
1438
+ m = m.add_derived(
1439
+ "E0_SBPase_active",
1440
+ fn=_mul,
1441
+ args=["E0_SBPase", "E_active"],
1442
+ )
1443
+ m = m.add_derived(
1444
+ "vmax_SBPase",
1445
+ fn=_mass_action_1s,
1446
+ args=["kcat_SBPase", "E0_SBPase_active"],
1447
+ )
1448
+ m = m.add_derived(
1449
+ "E0_phosphoribulokinase_active",
1450
+ fn=_mul,
1451
+ args=["E0_phosphoribulokinase", "E_active"],
1452
+ )
1453
+ m = m.add_derived(
1454
+ "vmax_phosphoribulokinase",
1455
+ fn=_mass_action_1s,
1456
+ args=["kcat_phosphoribulokinase", "E0_phosphoribulokinase_active"],
1457
+ )
1458
+ m = m.add_derived(
1459
+ "vmax_ex_pga",
1460
+ fn=_mass_action_1s,
1461
+ args=["kcat_N_translocator", "E0_N_translocator"],
1462
+ )
1463
+ m = m.add_derived(
1464
+ "N_translocator",
1465
+ fn=_rate_translocator,
1466
+ args=[
1467
+ "Orthophosphate",
1468
+ "3PGA",
1469
+ "GAP",
1470
+ "DHAP",
1471
+ "km_N_translocator_Orthophosphate (external)",
1472
+ "Orthophosphate (external)",
1473
+ "km_N_translocator_Orthophosphate",
1474
+ "km_ex_pga",
1475
+ "km_ex_gap",
1476
+ "km_ex_dhap",
1477
+ ],
1478
+ )
1479
+ m = m.add_derived(
1480
+ "E0_ex_g1p_active",
1481
+ fn=_mul,
1482
+ args=["E0_ex_g1p", "E_active"],
1483
+ )
1484
+ m = m.add_derived(
1485
+ "vmax_ex_g1p",
1486
+ fn=_mass_action_1s,
1487
+ args=["kcat_ex_g1p", "E0_ex_g1p_active"],
1488
+ )
1489
+ m = m.add_derived(
1490
+ "vmax_mda_reductase_2",
1491
+ fn=_mass_action_1s,
1492
+ args=["kcat_mda_reductase_2", "E0_mda_reductase_2"],
1493
+ )
1494
+ m = m.add_derived(
1495
+ "vmax_glutathion_reductase",
1496
+ fn=_mass_action_1s,
1497
+ args=["kcat_glutathion_reductase", "E0_glutathion_reductase"],
1498
+ )
1499
+ m = m.add_derived(
1500
+ "vmax_dehydroascorbate_reductase",
1501
+ fn=_mass_action_1s,
1502
+ args=["kcat_dehydroascorbate_reductase", "E0_dehydroascorbate_reductase"],
1503
+ )
1504
+ m = m.add_derived(
1505
+ "keq_PCP700",
1506
+ fn=_keq_pcp700,
1507
+ args=["E^0_PC", "F", "E^0_P700", "RT"],
1508
+ )
1509
+ m = m.add_derived(
1510
+ "keq_FAFd",
1511
+ fn=_keq_faf_d,
1512
+ args=["E^0_FA", "F", "E^0_Fd", "RT"],
1513
+ )
1514
+ m = m.add_derived(
1515
+ "B3",
1516
+ fn=_moiety_3,
1517
+ args=["B0", "B1", "B2", "PSII_total"],
1518
+ )
1519
+ m = m.add_derived(
1520
+ "P700+FA",
1521
+ fn=_moiety_3,
1522
+ args=["P700FA-", "P700FA", "P700+FA-", "PSI_total"],
1523
+ )
1524
+ m = m.add_derived(
1525
+ "rel_P700+FA",
1526
+ fn=_normalize_concentration,
1527
+ args=["P700+FA", "PSI_total"],
1528
+ )
1529
+ m = m.add_derived(
1530
+ "rel_P700FA",
1531
+ fn=_normalize_concentration,
1532
+ args=["P700FA", "PSI_total"],
1533
+ )
1534
+ m = m.add_derived(
1535
+ "rel_P700FA-",
1536
+ fn=_normalize_concentration,
1537
+ args=["P700FA-", "PSI_total"],
1538
+ )
1539
+ m = m.add_derived(
1540
+ "rel_P700+FA-",
1541
+ fn=_normalize_concentration,
1542
+ args=["P700+FA-", "PSI_total"],
1543
+ )
1544
+ m = m.add_derived(
1545
+ "rel_P700",
1546
+ fn=_normalize_2_concentrations,
1547
+ args=["P700+FA-", "P700+FA", "PSI_total"],
1548
+ )
1549
+ m = m.add_derived(
1550
+ "rel_P700+",
1551
+ fn=_normalize_2_concentrations,
1552
+ args=["P700+FA-", "P700+FA", "PSI_total"],
1553
+ )
1554
+ m = m.add_derived(
1555
+ "rel_B0",
1556
+ fn=_normalize_concentration,
1557
+ args=["B0", "PSII_total"],
1558
+ )
1559
+ m = m.add_derived(
1560
+ "rel_B1",
1561
+ fn=_normalize_concentration,
1562
+ args=["B1", "PSII_total"],
1563
+ )
1564
+ m = m.add_derived(
1565
+ "rel_B2",
1566
+ fn=_normalize_concentration,
1567
+ args=["B2", "PSII_total"],
1568
+ )
1569
+ m = m.add_derived(
1570
+ "rel_B3",
1571
+ fn=_normalize_concentration,
1572
+ args=["B3", "PSII_total"],
1573
+ )
1574
+ m = m.add_derived(
1575
+ "Fluo",
1576
+ fn=_fluo,
1577
+ args=["Q", "B0", "B2", "PSII_cross_section", "k2", "kF", "kH_Qslope", "kH0"],
1578
+ )
1579
+ m = m.add_derived(
1580
+ "keq_b6f_dyn",
1581
+ fn=_k_b6f,
1582
+ args=["pH_lumen", "pKreg", "b6f_content", "max_b6f"],
1583
+ )
1584
+ m = m.add_derived(
1585
+ "protons_lumen",
1586
+ fn=_protons_lumen,
1587
+ args=["pH_lumen"],
1588
+ )
1589
+ m = m.add_derived(
1590
+ "protons",
1591
+ fn=_protons_stroma_ebeling,
1592
+ args=["pH"],
1593
+ )
1594
+ m = m.add_derived(
1595
+ "ATP_pmf_activity",
1596
+ fn=_atp_pmf_activity2,
1597
+ args=["pK0E", "b", "pH_lumen", "pH", "F", "RT", "delta_psi"],
1598
+ )
1599
+ m = m.add_derived(
1600
+ "deltapH",
1601
+ fn=_deltap_h,
1602
+ args=["pH", "pH_lumen", "dG_pH"],
1603
+ )
1604
+ m = m.add_derived(
1605
+ "deltapH_in_volts",
1606
+ fn=_initial_delta_psi,
1607
+ args=["pH", "pH_lumen", "R", "F", "T"],
1608
+ )
1609
+ m = m.add_derived(
1610
+ "pmf",
1611
+ fn=_pmf,
1612
+ args=["deltapH", "delta_psi", "F"],
1613
+ )
1614
+ m = m.add_derived(
1615
+ "pmf_in_V",
1616
+ fn=_pmf_in_v,
1617
+ args=["delta_psi", "pH_lumen", "pH", "RT", "F"],
1618
+ )
1619
+ m = m.add_derived(
1620
+ "keq_b6f",
1621
+ fn=_keq_cytb6f,
1622
+ args=["pH_lumen", "pmf_in_V", "F", "E^0_PQ", "E^0_PC", "RT", "dG_pH"],
1623
+ )
1624
+ m = m.add_derived(
1625
+ "K_lumen",
1626
+ fn=_moiety_1,
1627
+ args=["K_stroma", "K_total"],
1628
+ )
1629
+ m = m.add_derived(
1630
+ "Cl_lumen",
1631
+ fn=_moiety_1,
1632
+ args=["Cl_stroma", "Cl_total"],
1633
+ )
1634
+ m = m.add_derived(
1635
+ "total_Cl_2",
1636
+ fn=_squared,
1637
+ args=["Cl_total"],
1638
+ )
1639
+ m = m.add_derived(
1640
+ "total_K_2",
1641
+ fn=_squared,
1642
+ args=["K_total"],
1643
+ )
1644
+ m = m.add_derived(
1645
+ "KEA3_reg",
1646
+ fn=_reg_kea,
1647
+ args=["pH", "ATP", "KEA3_pH_reg", "KEA3_ATP_treshold"],
1648
+ )
1649
+ m = m.add_derived(
1650
+ "dG_K_ions",
1651
+ fn=_dg_k,
1652
+ args=["K_lumen", "K_stroma", "delta_psi", "RT", "F"],
1653
+ )
1654
+ m = m.add_derived(
1655
+ "Cl_driving_force",
1656
+ fn=_cl_driving_force,
1657
+ args=["delta_psi", "Cl_lumen", "Cl_stroma", "RT", "F"],
1658
+ )
1659
+ m = m.add_derived(
1660
+ "Keq_NDH1",
1661
+ fn=_keq_ndh1,
1662
+ args=["pmf", "E^0_Fd", "F", "E^0_PQ", "pH", "dG_pH", "RT"],
1663
+ )
1664
+ m = m.add_derived(
1665
+ "ClCe_activation",
1666
+ fn=_cl_ce_activation,
1667
+ args=["ATP", "ClCe_ATP_threshold"],
1668
+ )
1669
+ m = m.add_reaction(
1670
+ "ferredoxin_thioredoxin_reductase",
1671
+ fn=_mass_action_2s,
1672
+ args=[
1673
+ "Thioredoxin (oxidised)",
1674
+ "Ferredoxine (reduced)",
1675
+ "kf_ferredoxin_thioredoxin_reductase",
1676
+ ],
1677
+ stoichiometry={"Thioredoxin (oxidised)": -1, "Ferredoxine (oxidised)": 1},
1678
+ )
1679
+ m = m.add_reaction(
1680
+ "tr_activation",
1681
+ fn=_mass_action_2s,
1682
+ args=["E_inactive", "Thioredoxin (reduced)", "kf_tr_activation"],
1683
+ stoichiometry={"E_inactive": -5, "Thioredoxin (oxidised)": 5},
1684
+ )
1685
+ m = m.add_reaction(
1686
+ "tr_inactivation",
1687
+ fn=_mass_action_1s,
1688
+ args=["E_active", "kf_tr_inactivation"],
1689
+ stoichiometry={"E_inactive": 5},
1690
+ )
1691
+ m = m.add_reaction(
1692
+ "atp_synthase",
1693
+ fn=_v_at_psynthase_mod,
1694
+ args=[
1695
+ "ATP",
1696
+ "ATPactivity",
1697
+ "ATP_pmf_activity",
1698
+ "k_ATPsynthase",
1699
+ "ADP",
1700
+ "kf_atp_synthase",
1701
+ "convf",
1702
+ ],
1703
+ stoichiometry={
1704
+ "ATP": Derived(fn=_value, args=["convf"]),
1705
+ "pH_lumen": 0.04666666666666667,
1706
+ "pH": -0.011666666666666667,
1707
+ "delta_psi": Derived(fn=_atp_div, args=["HPR", "volts_per_charge"]),
1708
+ },
1709
+ )
1710
+ m = m.add_reaction(
1711
+ "lhc_protonation",
1712
+ fn=_protonation_hill,
1713
+ args=[
1714
+ "PsbS (de-protonated)",
1715
+ "protons_lumen",
1716
+ "kh_lhc_protonation",
1717
+ "kf_lhc_protonation",
1718
+ "ksat_lhc_protonation",
1719
+ ],
1720
+ stoichiometry={"PsbS (de-protonated)": -1},
1721
+ )
1722
+ m = m.add_reaction(
1723
+ "lhc_deprotonation",
1724
+ fn=_mass_action_1s,
1725
+ args=["PsbS (protonated)", "kf_lhc_deprotonation"],
1726
+ stoichiometry={"PsbS (de-protonated)": 1},
1727
+ )
1728
+ m = m.add_reaction(
1729
+ "cyclic_electron_flow",
1730
+ fn=_rate_cyclic_electron_flow,
1731
+ args=[
1732
+ "Plastoquinone (oxidised)",
1733
+ "Ferredoxine (reduced)",
1734
+ "kf_cyclic_electron_flow",
1735
+ ],
1736
+ stoichiometry={"Plastoquinone (oxidised)": -1, "Ferredoxine (oxidised)": 2},
1737
+ )
1738
+ m = m.add_reaction(
1739
+ "violaxanthin_deepoxidase",
1740
+ fn=_rate_protonation_hill,
1741
+ args=[
1742
+ "Violaxanthin",
1743
+ "protons_lumen",
1744
+ "kf_violaxanthin_deepoxidase",
1745
+ "kh_violaxanthin_deepoxidase",
1746
+ "ksat_violaxanthin_deepoxidase",
1747
+ ],
1748
+ stoichiometry={"Violaxanthin": -1},
1749
+ )
1750
+ m = m.add_reaction(
1751
+ "zeaxanthin_epoxidase",
1752
+ fn=_mass_action_1s,
1753
+ args=["Zeaxanthin", "kf_zeaxanthin_epoxidase"],
1754
+ stoichiometry={"Violaxanthin": 1},
1755
+ )
1756
+ m = m.add_reaction(
1757
+ "fnr",
1758
+ fn=_rate_fnr_2019,
1759
+ args=[
1760
+ "Ferredoxine (oxidised)",
1761
+ "Ferredoxine (reduced)",
1762
+ "NADPH",
1763
+ "NADP",
1764
+ "km_fnr_Ferredoxine (reduced)",
1765
+ "km_fnr_NADP",
1766
+ "vmax_fnr",
1767
+ "keq_fnr",
1768
+ "convf",
1769
+ ],
1770
+ stoichiometry={
1771
+ "Ferredoxine (oxidised)": 2,
1772
+ "NADPH": Derived(fn=_value, args=["convf"]),
1773
+ },
1774
+ )
1775
+ m = m.add_reaction(
1776
+ "ndh",
1777
+ fn=_mass_action_1s,
1778
+ args=["Plastoquinone (oxidised)", "kf_ndh"],
1779
+ stoichiometry={"Plastoquinone (oxidised)": -1},
1780
+ )
1781
+ m = m.add_reaction(
1782
+ "proton_leak",
1783
+ fn=_rate_leak,
1784
+ args=["protons_lumen", "pH", "kf_proton_leak"],
1785
+ stoichiometry={
1786
+ "pH_lumen": 0.01,
1787
+ "pH": -0.0025,
1788
+ "delta_psi": Derived(fn=_neg_one_div, args=["volts_per_charge"]),
1789
+ },
1790
+ )
1791
+ m = m.add_reaction(
1792
+ "PTOX",
1793
+ fn=_mass_action_2s,
1794
+ args=["Plastoquinone (reduced)", "O2 (dissolved)_lumen", "kPTOX"],
1795
+ stoichiometry={"Plastoquinone (oxidised)": 1},
1796
+ )
1797
+ m = m.add_reaction(
1798
+ "lhc_state_transition_12",
1799
+ fn=_rate_state_transition_ps1_ps2,
1800
+ args=[
1801
+ "Light-harvesting complex",
1802
+ "Plastoquinone (oxidised)",
1803
+ "PQ_tot",
1804
+ "kStt7",
1805
+ "km_lhc_state_transition_12",
1806
+ "n_ST",
1807
+ ],
1808
+ stoichiometry={"Light-harvesting complex": -1},
1809
+ )
1810
+ m = m.add_reaction(
1811
+ "lhc_state_transition_21",
1812
+ fn=_mass_action_1s,
1813
+ args=["Light-harvesting complex (protonated)", "kPph1"],
1814
+ stoichiometry={"Light-harvesting complex": 1},
1815
+ )
1816
+ m = m.add_reaction(
1817
+ "rubisco_carboxylase",
1818
+ fn=_rate_poolman_5i,
1819
+ args=[
1820
+ "RUBP",
1821
+ "3PGA",
1822
+ "CO2 (dissolved)",
1823
+ "vmax_rubisco_carboxylase",
1824
+ "km_rubisco_carboxylase_RUBP",
1825
+ "km_rubisco_carboxylase_CO2 (dissolved)",
1826
+ "ki_rubisco_carboxylase_3PGA",
1827
+ "FBP",
1828
+ "ki_rubisco_carboxylase_FBP",
1829
+ "SBP",
1830
+ "ki_rubisco_carboxylase_SBP",
1831
+ "Orthophosphate",
1832
+ "ki_rubisco_carboxylase_Orthophosphate",
1833
+ "NADPH",
1834
+ "ki_rubisco_carboxylase_NADPH",
1835
+ ],
1836
+ stoichiometry={"RUBP": -1.0, "3PGA": 2.0},
1837
+ )
1838
+ m = m.add_reaction(
1839
+ "phosphoglycerate_kinase",
1840
+ fn=_rapid_equilibrium_2s_2p,
1841
+ args=[
1842
+ "3PGA",
1843
+ "ATP",
1844
+ "BPGA",
1845
+ "ADP",
1846
+ "kre_phosphoglycerate_kinase",
1847
+ "keq_phosphoglycerate_kinase",
1848
+ ],
1849
+ stoichiometry={"3PGA": -1.0, "ATP": -1.0, "BPGA": 1.0},
1850
+ )
1851
+ m = m.add_reaction(
1852
+ "gadph",
1853
+ fn=_rapid_equilibrium_3s_3p,
1854
+ args=[
1855
+ "BPGA",
1856
+ "NADPH",
1857
+ "protons",
1858
+ "GAP",
1859
+ "NADP",
1860
+ "Orthophosphate",
1861
+ "kre_gadph",
1862
+ "keq_gadph",
1863
+ ],
1864
+ stoichiometry={"NADPH": -1.0, "BPGA": -1.0, "GAP": 1.0},
1865
+ )
1866
+ m = m.add_reaction(
1867
+ "triose_phosphate_isomerase",
1868
+ fn=_rapid_equilibrium_1s_1p,
1869
+ args=[
1870
+ "GAP",
1871
+ "DHAP",
1872
+ "kre_triose_phosphate_isomerase",
1873
+ "keq_triose_phosphate_isomerase",
1874
+ ],
1875
+ stoichiometry={"GAP": -1, "DHAP": 1},
1876
+ )
1877
+ m = m.add_reaction(
1878
+ "aldolase_dhap_gap",
1879
+ fn=_rapid_equilibrium_2s_1p,
1880
+ args=["GAP", "DHAP", "FBP", "kre_aldolase_dhap_gap", "keq_aldolase_dhap_gap"],
1881
+ stoichiometry={"GAP": -1, "DHAP": -1, "FBP": 1},
1882
+ )
1883
+ m = m.add_reaction(
1884
+ "aldolase_dhap_e4p",
1885
+ fn=_rapid_equilibrium_2s_1p,
1886
+ args=["DHAP", "E4P", "SBP", "kre_aldolase_dhap_e4p", "keq_aldolase_dhap_e4p"],
1887
+ stoichiometry={"DHAP": -1, "E4P": -1, "SBP": 1},
1888
+ )
1889
+ m = m.add_reaction(
1890
+ "fbpase",
1891
+ fn=_michaelis_menten_1s_2i,
1892
+ args=[
1893
+ "FBP",
1894
+ "F6P",
1895
+ "Orthophosphate",
1896
+ "vmax_fbpase",
1897
+ "km_fbpase_s",
1898
+ "ki_fbpase_F6P",
1899
+ "ki_fbpase_Orthophosphate",
1900
+ ],
1901
+ stoichiometry={"FBP": -1, "F6P": 1},
1902
+ )
1903
+ m = m.add_reaction(
1904
+ "transketolase_gap_f6p",
1905
+ fn=_rapid_equilibrium_2s_2p,
1906
+ args=[
1907
+ "GAP",
1908
+ "F6P",
1909
+ "E4P",
1910
+ "X5P",
1911
+ "kre_transketolase_gap_f6p",
1912
+ "keq_transketolase_gap_f6p",
1913
+ ],
1914
+ stoichiometry={"GAP": -1, "F6P": -1, "E4P": 1, "X5P": 1},
1915
+ )
1916
+ m = m.add_reaction(
1917
+ "transketolase_gap_s7p",
1918
+ fn=_rapid_equilibrium_2s_2p,
1919
+ args=[
1920
+ "GAP",
1921
+ "S7P",
1922
+ "R5P",
1923
+ "X5P",
1924
+ "kre_transketolase_gap_s7p",
1925
+ "keq_transketolase_gap_s7p",
1926
+ ],
1927
+ stoichiometry={"GAP": -1, "S7P": -1, "R5P": 1, "X5P": 1},
1928
+ )
1929
+ m = m.add_reaction(
1930
+ "SBPase",
1931
+ fn=_michaelis_menten_1s_1i,
1932
+ args=[
1933
+ "SBP",
1934
+ "Orthophosphate",
1935
+ "vmax_SBPase",
1936
+ "km_SBPase_s",
1937
+ "ki_SBPase_Orthophosphate",
1938
+ ],
1939
+ stoichiometry={"SBP": -1, "S7P": 1},
1940
+ )
1941
+ m = m.add_reaction(
1942
+ "ribose_phosphate_isomerase",
1943
+ fn=_rapid_equilibrium_1s_1p,
1944
+ args=[
1945
+ "R5P",
1946
+ "RU5P",
1947
+ "kre_ribose_phosphate_isomerase",
1948
+ "keq_ribose_phosphate_isomerase",
1949
+ ],
1950
+ stoichiometry={"R5P": -1, "RU5P": 1},
1951
+ )
1952
+ m = m.add_reaction(
1953
+ "ribulose_phosphate_epimerase",
1954
+ fn=_rapid_equilibrium_1s_1p,
1955
+ args=[
1956
+ "X5P",
1957
+ "RU5P",
1958
+ "kre_ribulose_phosphate_epimerase",
1959
+ "keq_ribulose_phosphate_epimerase",
1960
+ ],
1961
+ stoichiometry={"X5P": -1, "RU5P": 1},
1962
+ )
1963
+ m = m.add_reaction(
1964
+ "phosphoribulokinase",
1965
+ fn=_rate_prk,
1966
+ args=[
1967
+ "RU5P",
1968
+ "ATP",
1969
+ "Orthophosphate",
1970
+ "3PGA",
1971
+ "RUBP",
1972
+ "ADP",
1973
+ "vmax_phosphoribulokinase",
1974
+ "km_phosphoribulokinase_RU5P",
1975
+ "km_phosphoribulokinase_ATP",
1976
+ "ki_phosphoribulokinase_3PGA",
1977
+ "ki_phosphoribulokinase_RUBP",
1978
+ "ki_phosphoribulokinase_Orthophosphate",
1979
+ "ki_phosphoribulokinase_4",
1980
+ "ki_phosphoribulokinase_5",
1981
+ ],
1982
+ stoichiometry={"RU5P": -1.0, "ATP": -1.0, "RUBP": 1.0},
1983
+ )
1984
+ m = m.add_reaction(
1985
+ "g6pi",
1986
+ fn=_rapid_equilibrium_1s_1p,
1987
+ args=["F6P", "G6P", "kre_g6pi", "keq_g6pi"],
1988
+ stoichiometry={"F6P": -1, "G6P": 1},
1989
+ )
1990
+ m = m.add_reaction(
1991
+ "phosphoglucomutase",
1992
+ fn=_rapid_equilibrium_1s_1p,
1993
+ args=["G6P", "G1P", "kre_phosphoglucomutase", "keq_phosphoglucomutase"],
1994
+ stoichiometry={"G6P": -1, "G1P": 1},
1995
+ )
1996
+ m = m.add_reaction(
1997
+ "ex_pga",
1998
+ fn=_rate_out,
1999
+ args=["3PGA", "N_translocator", "vmax_ex_pga", "km_ex_pga"],
2000
+ stoichiometry={"3PGA": -1},
2001
+ )
2002
+ m = m.add_reaction(
2003
+ "ex_gap",
2004
+ fn=_rate_out,
2005
+ args=["GAP", "N_translocator", "vmax_ex_pga", "km_ex_gap"],
2006
+ stoichiometry={"GAP": -1},
2007
+ )
2008
+ m = m.add_reaction(
2009
+ "ex_dhap",
2010
+ fn=_rate_out,
2011
+ args=["DHAP", "N_translocator", "vmax_ex_pga", "km_ex_dhap"],
2012
+ stoichiometry={"DHAP": -1},
2013
+ )
2014
+ m = m.add_reaction(
2015
+ "ex_g1p",
2016
+ fn=_rate_starch,
2017
+ args=[
2018
+ "G1P",
2019
+ "ATP",
2020
+ "ADP",
2021
+ "Orthophosphate",
2022
+ "3PGA",
2023
+ "F6P",
2024
+ "FBP",
2025
+ "vmax_ex_g1p",
2026
+ "km_ex_g1p_G1P",
2027
+ "km_ex_g1p_ATP",
2028
+ "ki_ex_g1p",
2029
+ "ki_ex_g1p_3PGA",
2030
+ "ki_ex_g1p_F6P",
2031
+ "ki_ex_g1p_FBP",
2032
+ ],
2033
+ stoichiometry={"G1P": -1.0, "ATP": -1.0},
2034
+ )
2035
+ m = m.add_reaction(
2036
+ "mda_reductase_1",
2037
+ fn=_rate_mda_reductase1,
2038
+ args=["MDA", "kf_mda_reductase_1"],
2039
+ stoichiometry={"MDA": -2, "DHA": 1},
2040
+ )
2041
+ m = m.add_reaction(
2042
+ "mda_reductase_2",
2043
+ fn=_rate_mda_reductase2,
2044
+ args=[
2045
+ "NADPH",
2046
+ "MDA",
2047
+ "vmax_mda_reductase_2",
2048
+ "km_mda_reductase_2_NADPH",
2049
+ "km_mda_reductase_2_MDA",
2050
+ ],
2051
+ stoichiometry={"NADPH": -1, "MDA": -2},
2052
+ )
2053
+ m = m.add_reaction(
2054
+ "ascorbate_peroxidase",
2055
+ fn=_rate_ascorbate_peroxidase,
2056
+ args=[
2057
+ "ascorbate",
2058
+ "H2O2",
2059
+ "kf1",
2060
+ "kr1",
2061
+ "kf2",
2062
+ "kr2",
2063
+ "kf3",
2064
+ "kf4",
2065
+ "kr4",
2066
+ "kf5",
2067
+ "XT",
2068
+ ],
2069
+ stoichiometry={"H2O2": -1, "MDA": 2},
2070
+ )
2071
+ m = m.add_reaction(
2072
+ "glutathion_reductase",
2073
+ fn=_rate_glutathion_reductase,
2074
+ args=[
2075
+ "NADPH",
2076
+ "GSSG",
2077
+ "vmax_glutathion_reductase",
2078
+ "km_glutathion_reductase_NADPH",
2079
+ "km_glutathion_reductase_GSSG",
2080
+ ],
2081
+ stoichiometry={"NADPH": -1, "GSSG": -1},
2082
+ )
2083
+ m = m.add_reaction(
2084
+ "dehydroascorbate_reductase",
2085
+ fn=_rate_dhar,
2086
+ args=[
2087
+ "DHA",
2088
+ "GSH",
2089
+ "vmax_dehydroascorbate_reductase",
2090
+ "km_dehydroascorbate_reductase_DHA",
2091
+ "km_dehydroascorbate_reductase_GSH",
2092
+ "K",
2093
+ ],
2094
+ stoichiometry={"DHA": -1, "GSSG": 1},
2095
+ )
2096
+ m = m.add_reaction(
2097
+ "toP700FA-",
2098
+ fn=_mass_action_22_rev,
2099
+ args=[
2100
+ "P700+FA-",
2101
+ "Plastocyanine (reduced)",
2102
+ "Plastocyanine (oxidised)",
2103
+ "P700FA-",
2104
+ "kPCox",
2105
+ "keq_PCP700",
2106
+ ],
2107
+ stoichiometry={"P700+FA-": -1, "P700FA-": 1, "Plastocyanine (oxidised)": 1},
2108
+ )
2109
+ m = m.add_reaction(
2110
+ "toP700FA_v3",
2111
+ fn=_mass_action_22_rev,
2112
+ args=[
2113
+ "P700FA-",
2114
+ "Ferredoxine (oxidised)",
2115
+ "P700FA",
2116
+ "Ferredoxine (reduced)",
2117
+ "kFdred",
2118
+ "keq_FAFd",
2119
+ ],
2120
+ stoichiometry={"P700FA-": -1, "Ferredoxine (oxidised)": -1, "P700FA": 1},
2121
+ )
2122
+ m = m.add_reaction(
2123
+ "toP700+FA",
2124
+ fn=_mass_action_22_rev,
2125
+ args=[
2126
+ "P700+FA-",
2127
+ "Ferredoxine (oxidised)",
2128
+ "P700+FA",
2129
+ "Ferredoxine (reduced)",
2130
+ "kFdred",
2131
+ "keq_FAFd",
2132
+ ],
2133
+ stoichiometry={"P700+FA-": -1, "Ferredoxine (oxidised)": -1},
2134
+ )
2135
+ m = m.add_reaction(
2136
+ "toP700FA_v5",
2137
+ fn=_mass_action_22_rev,
2138
+ args=[
2139
+ "P700+FA",
2140
+ "Plastocyanine (reduced)",
2141
+ "P700FA",
2142
+ "Plastocyanine (oxidised)",
2143
+ "kPCox",
2144
+ "keq_PCP700",
2145
+ ],
2146
+ stoichiometry={"P700FA": 1, "Plastocyanine (oxidised)": 1},
2147
+ )
2148
+ m = m.add_reaction(
2149
+ "PSI",
2150
+ fn=_v_ps1,
2151
+ args=["P700FA", "PSII_cross_section", "PPFD"],
2152
+ stoichiometry={"P700FA": -1, "P700+FA-": 1},
2153
+ )
2154
+ m = m.add_reaction(
2155
+ "mehler1",
2156
+ fn=_v_mehler,
2157
+ args=["P700FA-", "O2 (dissolved)_lumen", "kMehler"],
2158
+ stoichiometry={
2159
+ "H2O2": Derived(fn=_value, args=["convf"]),
2160
+ "P700FA": 2,
2161
+ "P700FA-": -2,
2162
+ },
2163
+ )
2164
+ m = m.add_reaction(
2165
+ "mehler2",
2166
+ fn=_v_mehler,
2167
+ args=["P700+FA-", "O2 (dissolved)_lumen", "kMehler"],
2168
+ stoichiometry={"H2O2": Derived(fn=_value, args=["convf"]), "P700+FA-": -2},
2169
+ )
2170
+ m = m.add_reaction(
2171
+ "B01",
2172
+ fn=_mass_action_2s,
2173
+ args=["B0", "PSII_cross_section", "PPFD"],
2174
+ stoichiometry={"B0": -1, "B1": 1},
2175
+ )
2176
+ m = m.add_reaction(
2177
+ "B10Q",
2178
+ fn=_kquencher,
2179
+ args=["B1", "Q", "kH_Qslope", "kH0"],
2180
+ stoichiometry={"B1": -1, "B0": 1},
2181
+ )
2182
+ m = m.add_reaction(
2183
+ "B10F",
2184
+ fn=_mass_action_1s,
2185
+ args=["B1", "kF"],
2186
+ stoichiometry={"B1": -1, "B0": 1},
2187
+ )
2188
+ m = m.add_reaction(
2189
+ "B12",
2190
+ fn=_mass_action_1s,
2191
+ args=["B1", "k2"],
2192
+ stoichiometry={
2193
+ "B1": -1,
2194
+ "B2": 1,
2195
+ "pH_lumen": -0.01,
2196
+ "delta_psi": Derived(fn=_one_div, args=["volts_per_charge"]),
2197
+ },
2198
+ )
2199
+ m = m.add_reaction(
2200
+ "B20",
2201
+ fn=_mass_action_22_rev,
2202
+ args=[
2203
+ "B2",
2204
+ "Plastoquinone (oxidised)",
2205
+ "Plastoquinone (reduced)",
2206
+ "B0",
2207
+ "kPQred",
2208
+ "keq_Plastoquinone (reduced)",
2209
+ ],
2210
+ stoichiometry={
2211
+ "B2": -1,
2212
+ "Plastoquinone (oxidised)": -0.5,
2213
+ "B0": 1,
2214
+ "pH": 0.0025,
2215
+ },
2216
+ )
2217
+ m = m.add_reaction(
2218
+ "B23",
2219
+ fn=_mass_action_2s,
2220
+ args=["B2", "PSII_cross_section", "PPFD"],
2221
+ stoichiometry={"B2": -1},
2222
+ )
2223
+ m = m.add_reaction(
2224
+ "B32F",
2225
+ fn=_mass_action_1s,
2226
+ args=["B3", "kF"],
2227
+ stoichiometry={"B2": 1},
2228
+ )
2229
+ m = m.add_reaction(
2230
+ "B32Q",
2231
+ fn=_kquencher,
2232
+ args=["B3", "Q", "kH_Qslope", "kH0"],
2233
+ stoichiometry={"B2": 1},
2234
+ )
2235
+ m = m.add_reaction(
2236
+ "b6f",
2237
+ fn=_vb6f_2024,
2238
+ args=[
2239
+ "Plastocyanine (oxidised)",
2240
+ "Plastocyanine (reduced)",
2241
+ "Plastoquinone (oxidised)",
2242
+ "Plastoquinone (reduced)",
2243
+ "keq_b6f_dyn",
2244
+ "keq_b6f",
2245
+ ],
2246
+ stoichiometry={
2247
+ "Plastocyanine (oxidised)": -2,
2248
+ "Plastoquinone (oxidised)": 1,
2249
+ "pH_lumen": -0.04,
2250
+ "pH": 0.01,
2251
+ "delta_psi": Derived(fn=_four_div, args=["volts_per_charge"]),
2252
+ },
2253
+ )
2254
+ m = m.add_reaction(
2255
+ "vATPactivity",
2256
+ fn=_v_at_pactivity,
2257
+ args=["ATPactivity", "PPFD", "kActATPase", "kDeactATPase"],
2258
+ stoichiometry={"ATPactivity": 1},
2259
+ )
2260
+ m = m.add_reaction(
2261
+ "vATP_shuttle",
2262
+ fn=_reversible_mass_action_1s_1p,
2263
+ args=["ADP", "ATP", "k_import_ATP", "kf_ex_atp"],
2264
+ stoichiometry={"ATP": 1},
2265
+ )
2266
+ m = m.add_reaction(
2267
+ "vNADPH_shuttle",
2268
+ fn=_reversible_mass_action_1s_1p,
2269
+ args=["NADP", "NADPH", "k_import_NADPH", "kf_ex_nadph"],
2270
+ stoichiometry={"NADPH": 1},
2271
+ )
2272
+ m = m.add_reaction(
2273
+ "KEA3",
2274
+ fn=_v_kea,
2275
+ args=["K_lumen", "protons_lumen", "K_stroma", "k_KEA", "protons", "KEA3_reg"],
2276
+ stoichiometry={"K_stroma": -1, "pH_lumen": 0.01, "pH": -0.0025},
2277
+ )
2278
+ m = m.add_reaction(
2279
+ "voltage_K_channel",
2280
+ fn=_v_voltage_k_channel,
2281
+ args=[
2282
+ "delta_psi",
2283
+ "K_lumen",
2284
+ "K_stroma",
2285
+ "dG_K_ions",
2286
+ "perm_K",
2287
+ "K_delta_psi_treshold",
2288
+ ],
2289
+ stoichiometry={
2290
+ "K_stroma": 1,
2291
+ "delta_psi": Derived(fn=_neg_one_div, args=["volts_per_charge"]),
2292
+ },
2293
+ )
2294
+ m = m.add_reaction(
2295
+ "VCCN1",
2296
+ fn=_v_vccn1,
2297
+ args=[
2298
+ "Cl_stroma",
2299
+ "Cl_lumen",
2300
+ "Cl_driving_force",
2301
+ "delta_psi",
2302
+ "k_VCCN1",
2303
+ "VCCN_delta_psi_treshold",
2304
+ ],
2305
+ stoichiometry={
2306
+ "Cl_stroma": -1,
2307
+ "delta_psi": Derived(fn=_neg_one_div, args=["volts_per_charge"]),
2308
+ },
2309
+ )
2310
+ m = m.add_reaction(
2311
+ "Cl_leak",
2312
+ fn=_v_cl_leak,
2313
+ args=[
2314
+ "k_Cl_leak",
2315
+ "Cl_lumen",
2316
+ "Cl_stroma",
2317
+ "Plastoquinone (oxidised)",
2318
+ "Cl_leak_PQ",
2319
+ "total_Cl_2",
2320
+ ],
2321
+ stoichiometry={
2322
+ "Cl_stroma": 1,
2323
+ "delta_psi": Derived(fn=_one_div, args=["volts_per_charge"]),
2324
+ },
2325
+ )
2326
+ m = m.add_reaction(
2327
+ "NDH1",
2328
+ fn=_v_ndh1,
2329
+ args=[
2330
+ "P700+FA-",
2331
+ "Ferredoxine (reduced)",
2332
+ "Plastoquinone (oxidised)",
2333
+ "pH_lumen",
2334
+ "k_NDH1",
2335
+ ],
2336
+ stoichiometry={
2337
+ "Ferredoxine (oxidised)": 2,
2338
+ "Plastoquinone (oxidised)": -1,
2339
+ "pH_lumen": -0.04,
2340
+ "pH": 0.01,
2341
+ "delta_psi": Derived(fn=_four_div, args=["volts_per_charge"]),
2342
+ },
2343
+ )
2344
+ m = m.add_reaction(
2345
+ "ClCe_bi",
2346
+ fn=_cl_ce_bi,
2347
+ args=["Cl_lumen", "Cl_stroma", "k_ClCe", "ClCe_activation"],
2348
+ stoichiometry={"Cl_stroma": -1},
2349
+ )
2350
+ m = m.add_readout(
2351
+ "PQ_ox/tot",
2352
+ fn=_div,
2353
+ args=["Plastoquinone (reduced)", "PQ_tot"],
2354
+ )
2355
+ m = m.add_readout(
2356
+ "Fd_ox/tot",
2357
+ fn=_div,
2358
+ args=["Ferredoxine (reduced)", "Fd*"],
2359
+ )
2360
+ m = m.add_readout(
2361
+ "PC_ox/tot",
2362
+ fn=_div,
2363
+ args=["Plastocyanine (reduced)", "PC_tot"],
2364
+ )
2365
+ m = m.add_readout(
2366
+ "NADPH/tot",
2367
+ fn=_div,
2368
+ args=["NADPH", "NADP*"],
2369
+ )
2370
+ m = m.add_readout(
2371
+ "ATP/tot",
2372
+ fn=_div,
2373
+ args=["ATP", "A*P"],
2374
+ )
2375
+ return m # noqa: RET504