Note:

  • This example is discussed in detail by Gawthrop and Pan (2020) available here.

  • This is the Redox.ipynb notebook. The PDF version is available here.

Introduction

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.

In [1]:
## 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

Redox reaction

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.

Bond graph

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.

In [2]:
## Redox reaction
if TranslateSVG:
    sbg.model('Redox_abg.svg',quiet=False)
import Redox_abg
disp.SVG('Redox_abg.svg')
Out[2]:
Re:r1 1 1 0 0 C:H 0 1 Re:r2 1 0 C:NADH C:NAD C:E1 C:E2 C:Q C:QH2

Stoichiometry

In [3]:
## 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)
In [4]:
## Stoichiometric matrix
disp.Latex(st.sprintl(s,'N'))
Out[4]:
\begin{align} N &= \left(\begin{matrix}2 & 0\\0 & -2\\1 & -2\\1 & 0\\-1 & 0\\0 & -1\\0 & 1\end{matrix}\right) \end{align}

Reactions

These are automatically generated from the bond graph

In [5]:
## Reactions
disp.Latex(st.sprintrl(s,chemformula=True,all=True))
Out[5]:
\begin{align} \ch{NADH &<>[ r1 ] 2 E1 + H + NAD }\\ \ch{2 E2 + 2 H + Q &<>[ r2 ] QH2 } \end{align}

Potentials

The reaction (Faraday Equivalent) potentials are computed from tables gleaned from the literature

In [6]:
## 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

Proton pump

The redox reaction of complex I drives a proton pump.

Bond graph

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.

In [7]:
## Proton pump
if TranslateSVG:
    sbg.model('ProtonPump_abg.svg')
import ProtonPump_abg
disp.SVG('ProtonPump_abg.svg')
Out[7]:
Chemical Electrical External Internal Re:rp 1 0 0 1 0 0 0 C:E1 0 C:E2 C:He C:Hi C:Ei C:Ee

Stoichiometry

In [8]:
## 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)

Reactions

These are automatically generated from the bond graph

In [9]:
## Reactions
disp.Latex(st.sprintrl(s,chemformula=True,all=True))
Out[9]:
\begin{align} \ch{E1 + 2 Ei + 2 Hi &<>[ rp ] E2 + 2 Ee + 2 He } \end{align}
In [10]:
## Flows
disp.Latex(st.sprintvl(s))
Out[10]:
\begin{align} v_{rp} &= \kappa_{rp} \left(- K_{He}^{2} x_{He}^{2} e^{\frac{K_{E2} x_{E2} + 2 K_{Ee} x_{Ee}}{V_{N}}} + K_{Hi}^{2} x_{Hi}^{2} e^{\frac{K_{E1} x_{E1} + 2 K_{Ei} x_{Ei}}{V_{N}}}\right) \end{align}

Complex I

The model of mitochondrial complex I comprises two modules: the redox reaction and the proton pump.

In [11]:
## Complex I
if TranslateSVG:
    sbg.model('ComplexI_abg.svg')
import ComplexI_abg
disp.SVG('ComplexI_abg.svg')
Out[11]:
C:E2 0 0 C:E1 [E1] [E2] Redox:rr ProtonPump:pp [E2] [E1]

Stoichiometry

In [12]:
## 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']

Reactions

These are automatically generated from the bond graph

In [13]:
## Reactions
disp.Latex(st.sprintrl(s,chemformula=True,all=True))
Out[13]:
\begin{align} \ch{E1 + 2 pp_Ei + 2 pp_Hi &<>[ pp_rp ] E2 + 2 pp_Ee + 2 pp_He }\\ \ch{rr_NADH &<>[ rr ] 2 E1 + rr_H + rr_NAD }\\ \ch{2 E2 + 2 rr_H + rr_Q &<>[ rr ] rr_QH2 } \end{align}
In [14]:
## Flows
disp.Latex(st.sprintvl(s))
Out[14]:
\begin{align} v_{pp rp} &= \kappa_{pp rp} \left(- K_{pp He}^{2} x_{pp He}^{2} e^{\frac{K_{E2} x_{E2} + 2 K_{pp Ee} x_{pp Ee}}{V_{N}}} + K_{pp Hi}^{2} x_{pp Hi}^{2} e^{\frac{K_{E1} x_{E1} + 2 K_{pp Ei} x_{pp Ei}}{V_{N}}}\right)\\ v_{rr} &= \kappa_{rr} \left(- K_{rr H} K_{rr NAD} x_{rr H} x_{rr NAD} e^{\frac{2 K_{E1} x_{E1}}{V_{N}}} + K_{rr NADH} x_{rr NADH}\right)\\ v_{rr} &= \kappa_{rr} \left(K_{rr H}^{2} K_{rr Q} x_{rr H}^{2} x_{rr Q} e^{\frac{2 K_{E2} x_{E2}}{V_{N}}} - K_{rr QH2} x_{rr QH2}\right) \end{align}
In [15]:
## Path
sp = st.path(s,sc)
## Reactions
disp.Latex(st.sprintrl(sp,chemformula=True,all=True))
Out[15]:
\begin{align} \ch{4 pp_Ei + 4 pp_Hi + rr_H + rr_NADH + rr_Q &<>[ pr1 ] 4 pp_Ee + 4 pp_He + rr_NAD + rr_QH2 } \end{align}