Redox reactions and proton pumps play a fundamental role in Biology. This note illustrates this using a bond graph model of complex I of the mitochondrial electron transport chain.
## Some useful imports
import BondGraphTools as bgt
print('BGT version is',bgt.version)
import numpy as np
import sympy as sp
import matplotlib.pyplot as plt
## Stoichiometric analysis
import stoich as st
## SVG
import svgBondGraph as sbg
## Display (eg disp.SVG(), disp.
import IPython.display as disp
## Potential data
import phiData
quiet = True
TranslateSVG = False
BGT version is 0.3.7
A key energy-generating redox reaction that within the mitochondrial respiratory chain is \begin{equation}\label{eq:NAD} \mathrm{NADH + Q + H^+ \rightleftharpoons NAD+ + QH2 } \end{equation} This reaction can be divided into the half reactions: \begin{align} \mathrm{NADH} &\rightleftharpoons \mathrm{2 e_1^- + H^+ + NAD^+}\label{eq:NAD_1}\\ \mathrm{2 e_2^- + 2 H^+ + Q} &\rightleftharpoons \mathrm{QH_2}\label{eq:NAD_2} \end{align} A bond graph representation of this decomposition is given below.
C:E1 and C:E2 represent the electron potentials and the other The C components represent the species; the two Re components the two half reactions.
## Redox reaction
if TranslateSVG:
sbg.model('Redox_abg.svg',quiet=False)
import Redox_abg
disp.SVG('Redox_abg.svg')
## Stoichiometry
linear = ['E1','E2']
s = st.stoich(Redox_abg.model(),linear=linear,quiet=quiet)
chemostats = ['NADH','NAD','Q','QH2','H']
sc = st.statify(s,chemostats=chemostats)
## Stoichiometric matrix
disp.Latex(st.sprintl(s,'N'))
These are automatically generated from the bond graph
## Reactions
disp.Latex(st.sprintrl(s,chemformula=True,all=True))
The reaction (Faraday Equivalent) potentials are computed from tables gleaned from the literature
## Standard potetials
phi_Std = phiData.phi_Std()
## Typical concentrations
conc = phiData.ParRubXu16_conc()
## From BazBeaVin16
conc['Q'] = conc['QH2'] = 1e-2
## pH 7
conc['H'] = 1e-7
## Table for paper and put values in to phi_NADH etc.
print('%% Table')
ch='\ch'
l='{'
r='}'
eol = r'\\'
phi_std = {}
for spec in ['NAD','NADH','Q','QH2','H']:
phi0 = phi_Std[spec]
con = conc[spec]
phi_std_spec = phi0 + st.V_N()*np.log(con)
phi_std[spec] = phi_std_spec
#print(f'phi_Std_{spec} = {1000*phi0:0.0f}, phi_{spec} = {1000*phi_std[spec]:.0f}, conc_{spec}={conc[spec]}')
print(f'{ch}{l}{spec}{r} & {1000*phi0:.0f} & {con:1.2e} & {1000*phi_std_spec:.0f}{eol}')
exec(f'phi_{spec} = {phi_std_spec}')
## Print the worked example for the paper.
print('\n%% Equations')
E1 = 0.5*(phi_NADH - phi_NAD - phi_H)
E2 = 0.5*(phi_QH2 - phi_Q - 2*phi_H)
print(f'E1 = 0.5({1000*phi_NADH:.0f} - {1000*phi_NAD:.0f} - {1000*phi_H:.0f}) = {1000*E1:.0f} mV')
print(f'E2 = 0.5({1000*phi_QH2:.0f} - {1000*phi_Q:.0f} - 2x{1000*phi_H:.0f}) = {1000*E2:.0f} mV')
print(f'E1-E2 = {1000*(E1-E2):.0f} mV')
print(f'PMF = {1000*(E1-E2)/2:.0f} mV')
%% Table \ch{NAD} & 188 & 5.02e-04 & -15\\ \ch{NADH} & 407 & 7.50e-05 & 154\\ \ch{Q} & 675 & 1.00e-02 & 552\\ \ch{QH2} & -241 & 1.00e-02 & -365\\ \ch{H} & 0 & 1.00e-07 & -431\\ %% Equations E1 = 0.5(154 - -15 - -431) = 300 mV E2 = 0.5(-365 - 552 - 2x-431) = -28 mV E1-E2 = 328 mV PMF = 164 mV
The redox reaction of complex I drives a proton pump.
C:E1 and C:E2 correspond to the redox reaction and provide the potential to drive protons in the interior $H^+_i$ to the exterior $H^+_e$ of the mitochondrial membrane. The protons have both electrical and chemical potential.
## Proton pump
if TranslateSVG:
sbg.model('ProtonPump_abg.svg')
import ProtonPump_abg
disp.SVG('ProtonPump_abg.svg')
## Stoichiometry
linear = ['E1','E2','Ei','Ee']
s = st.stoich(ProtonPump_abg.model(),linear=linear,quiet=quiet)
chemostats = ['E1','E2','Ei','Ee','Hi','He']
sc = st.statify(s,chemostats=chemostats)
These are automatically generated from the bond graph
## Reactions
disp.Latex(st.sprintrl(s,chemformula=True,all=True))
## Flows
disp.Latex(st.sprintvl(s))
The model of mitochondrial complex I comprises two modules: the redox reaction and the proton pump.
## Complex I
if TranslateSVG:
sbg.model('ComplexI_abg.svg')
import ComplexI_abg
disp.SVG('ComplexI_abg.svg')
## Stoichiometry
linear = ['E1','E2','pp_Ei','pp_Ee']
s = st.stoich(ComplexI_abg.model(),linear=linear,quiet=quiet)
print(s['species'])
chemostats = ['pp_Ee', 'pp_Ei', 'pp_He', 'pp_Hi', 'rr_H', 'rr_NAD', 'rr_NADH', 'rr_Q', 'rr_QH2']
sc = st.statify(s,chemostats=chemostats)
#print(s['species'])
#disp.Latex(st.sprint(s0,'K'))
#print(st.sprints(s))
['E1', 'E2', 'pp_Ee', 'pp_Ei', 'pp_He', 'pp_Hi', 'rr_H', 'rr_NAD', 'rr_NADH', 'rr_Q', 'rr_QH2']
These are automatically generated from the bond graph
## Reactions
disp.Latex(st.sprintrl(s,chemformula=True,all=True))
## Flows
disp.Latex(st.sprintvl(s))
## Path
sp = st.path(s,sc)
## Reactions
disp.Latex(st.sprintrl(sp,chemformula=True,all=True))