/
redoxData.py
278 lines (238 loc) · 6.55 KB
/
redoxData.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
import numpy as np
import stoich as st
import scipy.constants as const
def mV(E):
return(str(int(round(1000*E))))
def data():
"""Redox midpoint (pH 7) data
"""
redoxData = {}
## Data from Bla14
## NADP/NADPH
dat= {}
dat['oxidised'] = 'NADP'
dat['reduced'] = 'NADPH'
dat['E7'] = -0.324
dat['electrons'] = 2
dat['protons'] = 1
dat['source'] = 'Bla14:TableA1.2'
redoxData['NADP/NADPH'] = dat
## NAD/NADH
dat= {}
dat['oxidised'] = 'NAD'
dat['reduced'] = 'NADH'
dat['E7'] = -0.320
dat['electrons'] = 2
dat['protons'] = 1
dat['source'] = 'FalRav07:Table4.1'
redoxData['NAD/NADH'] = dat
## O2/2H2O
dat = {}
dat['oxidised'] = 'O2'
dat['reduced'] = 'H2O'
dat['E7'] = 0.816
dat['electrons'] = 4
dat['protons'] = 4
dat['source'] = 'Bla14:TableA1.2'
redoxData['O2/2H2O'] = dat
## P700/P700+
dat = {}
dat['photon'] = True
dat['oxidised'] = 'P700'
dat['reduced'] = 'P700+'
dat['E7'] = 0.49
dat['electrons'] = 1
dat['protons'] = 0
dat['source'] = 'Bla14:TableA1.2'
redoxData['P700/P700+'] = dat
## P870/P870+
dat = {}
dat['photon'] = True
dat['oxidised'] = 'P870'
dat['reduced'] = 'P870+'
dat['E7'] = 0.45
dat['electrons'] = 1
dat['protons'] = 0
dat['source'] = 'Bla14:TableA1.2'
redoxData['P870/P870+'] = dat
## P680/P680+
dat = {}
dat['photon'] = True
dat['oxidised'] = 'P680'
dat['reduced'] = 'P680+'
dat['E7'] = 1.1
dat['electrons'] = 1
dat['protons'] = 0
dat['source'] = 'Bla14:TableA1.2'
redoxData['P680/P680+'] = dat
## P700+/P700*
dat = {}
dat['photon'] = True
dat['oxidised'] = 'P700+'
dat['reduced'] = 'P700*'
dat['E7'] = 1.26
dat['electrons'] = 1
dat['protons'] = 0
dat['source'] = 'Bla14:TableA1.3'
redoxData['P700+/P700*'] = dat
## P870+/P870*
dat = {}
dat['photon'] = True
dat['oxidised'] = 'P870+'
dat['reduced'] = 'P870*'
dat['E7'] = 0.94
dat['electrons'] = 1
dat['protons'] = 0
dat['source'] = 'Bla14:TableA1.3'
redoxData['P870+/P870*'] = dat
## P680+/P680*
dat = {}
dat['photon'] = True
dat['oxidised'] = 'P680+'
dat['reduced'] = 'P680*'
dat['E7'] = 0.8
dat['electrons'] = 1
dat['protons'] = 0
dat['source'] = 'Bla14:TableA1.3'
redoxData['P680+/P680*'] = dat
## PQ/PQH2 (AKA Plastoquinone/Plastoquinol, AKA UQ/UQH2)
dat = {}
dat['oxidised'] = 'PQ'
dat['reduced'] = 'PQH2'
dat['E7'] = 0
dat['electrons'] = 2
dat['protons'] = 2
dat['source'] = 'Bla14:TableA1.2'
redoxData['PQ/PQH2'] = dat
## Plastocyanin (ox/red), PcOx/PcRed)
dat = {}
dat['oxidised'] = 'PcOx'
dat['reduced'] = 'PcRed'
dat['E7'] = 0.380
dat['electrons'] = 1
dat['protons'] = 0
dat['source'] = 'FalRav07:Table4.1'
redoxData['PcOx/PcRed'] = dat
## Feredoxin (ox/red), FdOx/FdRed)
dat = {}
dat['oxidised'] = 'FdOx'
dat['reduced'] = 'FdRed'
dat['E7'] = -0.430
dat['electrons'] = 1
dat['protons'] = 0
dat['source'] = 'FalRav07:Table4.1'
redoxData['FdOx/FdRed'] = dat
return redoxData
def Phi(couple):
""" Net potential for couple without protons.
"""
dat = data()[couple]
phi_ph7 = st.V_N()*np.log(1e-7) # phi of protons at pH 7
Phi7 = dat['electrons']*dat['E7'] # Phi with protons
Phi = Phi7 - dat['protons']*phi_ph7 # Phi without protons
#E = Phi/dat['electrons']
return Phi
def phi():
"""
Returns dict of phi deduced from redox poentials
phis are relative to the couple
"""
phi = {}
for couple,dat in data().items():
## Extract names of oxidised and reduced species
ox = dat["oxidised"]
re = dat["reduced"]
# print(ox,re)
## Extract stoichiometry
oxre = couple.split('/')
# print(oxre[0],oxre[1])
if ox in [oxre[0]]:
n_ox = 1
else:
n_ox = int(oxre[0][0])
if re in [oxre[1]]:
n_re = 1
else:
n_re = int(oxre[1][0])
# print(n_ox,n_re)
Phi_oxre = Phi(couple)
if "photon" in dat.keys():
phi_ox = Phi_oxre
phi_re = 0
else:
phi_ox = (Phi_oxre/2)/n_ox
phi_re = -(Phi_oxre/2)/n_re
## Put phi into dict
phi[ox] = phi_ox
phi[re] = phi_re
## Put in zero potential for the E components
phi['E1'] = 0
phi['E2'] = 0
return phi
def E(couple):
""" Redox potential for couple without protons.
"""
dat = data()[couple]
E = Phi(couple)/dat['electrons']
return E
def E7(couple):
""" Redox potential for couple with protons at pH 7
"""
dat = data()[couple]
E7 = dat['E7']
return E7
def VpH(pH=7):
"""
Voltage corresponding to pH
"""
conc = np.exp(-pH*np.log(10)) # Concentration
return st.V_N()*np.log(conc)
def EpH(couple,pH=7):
""" Redox potential for couple with protons at given pH
"""
E0 = E(couple)
dat = data()[couple]
EpH = E0 + VpH(pH)*(dat['protons']/dat['electrons'])
return EpH
def V_photon(wavelength=680):
"""Voltage corresponding to the energy of a coulomb of photons
wavelength in nm
"""
F = const.physical_constants['Faraday constant'][0]
N = const.physical_constants['Avogadro constant'][0]
h = const.physical_constants['Planck constant'][0]
c = const.physical_constants['speed of light in vacuum'][0]
v = c/(wavelength*1e-9)
return (N*h*v)/F
def print_raw():
""" Print raw redox potential data
"""
for couple, dat in data().items():
print("\nRedox couple:",couple)
print("Phi = ", int(1000*Phi(couple)),"mV")
print("Phi/n = ", int(1000*Phi(couple)/dat["electrons"]),"mV")
for key, val in dat.items():
if key is "E7":
print("\t",key+":",int(1000*val),"mV")
else:
print("\t",key+":",val)
def table():
""" LaTeX table of redox potentials
"""
sep = " & "
head = ["E_7", "n", "m", "source"]
header = "Couple"
for h in head:
header = header + sep + h
print("\\begin{array}{|l|l|l|l|l|}")
print("\\hline")
print(header,"\\\\")
print("\\hline")
print_keys = ["electrons","protons","source"]
for couple, dat in data().items():
row = couple+sep+mV(dat['E7'])
for key in print_keys:
row = row+sep+str(dat[key])
print(row,"\\\\")
print("\\hline")
print("\\end{array}")