{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"***Note:*** \n",
"\n",
"- This example is discussed in detail by Gawthrop and Pan (2020) available [here](https://arxiv.org/abs/2009.02217).\n",
"\n",
"- This is the Redox.ipynb notebook. The PDF version is available [here](https://github.com/gawthrop/GawPan20/blob/main/Redox.pdf).\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Introduction\n",
"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.\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"BGT version is 0.3.7\n"
]
}
],
"source": [
"## Some useful imports\n",
"import BondGraphTools as bgt\n",
"print('BGT version is',bgt.version)\n",
"import numpy as np\n",
"import sympy as sp\n",
"import matplotlib.pyplot as plt\n",
"\n",
"## Stoichiometric analysis\n",
"import stoich as st\n",
"\n",
"## SVG\n",
"import svgBondGraph as sbg\n",
"\n",
"## Display (eg disp.SVG(), disp.\n",
"import IPython.display as disp\n",
"\n",
"## Potential data\n",
"import phiData\n",
"\n",
"quiet = True\n",
"TranslateSVG = False\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Redox reaction\n",
"A key energy-generating redox reaction that within the mitochondrial respiratory chain is\n",
"\\begin{equation}\\label{eq:NAD}\n",
"\\mathrm{NADH + Q + H^+ \\rightleftharpoons NAD+ + QH2 }\n",
"\\end{equation}\n",
"This reaction can be divided into the half reactions:\n",
"\\begin{align}\n",
"\\mathrm{NADH} &\\rightleftharpoons \\mathrm{2 e_1^- + H^+ + NAD^+}\\label{eq:NAD_1}\\\\\n",
"\\mathrm{2 e_2^- + 2 H^+ + Q} &\\rightleftharpoons \\mathrm{QH_2}\\label{eq:NAD_2}\n",
"\\end{align}\n",
"A bond graph representation of this decomposition is given below."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Bond graph\n",
"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. "
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"image/svg+xml": [
""
],
"text/plain": [
""
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"## Redox reaction\n",
"if TranslateSVG:\n",
" sbg.model('Redox_abg.svg',quiet=False)\n",
"import Redox_abg\n",
"disp.SVG('Redox_abg.svg')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Stoichiometry"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"## Stoichiometry\n",
"linear = ['E1','E2']\n",
"s = st.stoich(Redox_abg.model(),linear=linear,quiet=quiet)\n",
"chemostats = ['NADH','NAD','Q','QH2','H']\n",
"sc = st.statify(s,chemostats=chemostats)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/latex": [
"\\begin{align}\n",
"N &=\n",
"\\left(\\begin{matrix}2 & 0\\\\0 & -2\\\\1 & -2\\\\1 & 0\\\\-1 & 0\\\\0 & -1\\\\0 & 1\\end{matrix}\\right)\n",
"\\end{align}\n"
],
"text/plain": [
""
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"## Stoichiometric matrix\n",
"disp.Latex(st.sprintl(s,'N'))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Reactions\n",
"These are automatically generated from the bond graph"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"text/latex": [
"\\begin{align}\n",
"\\ch{NADH &<>[ r1 ] 2 E1 + H + NAD }\\\\\n",
"\\ch{2 E2 + 2 H + Q &<>[ r2 ] QH2 }\n",
"\\end{align}\n"
],
"text/plain": [
""
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"## Reactions\n",
"disp.Latex(st.sprintrl(s,chemformula=True,all=True))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Potentials\n",
"The reaction (Faraday Equivalent) potentials are computed from tables gleaned from the literature"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"%% Table\n",
"\\ch{NAD} & 188 & 5.02e-04 & -15\\\\\n",
"\\ch{NADH} & 407 & 7.50e-05 & 154\\\\\n",
"\\ch{Q} & 675 & 1.00e-02 & 552\\\\\n",
"\\ch{QH2} & -241 & 1.00e-02 & -365\\\\\n",
"\\ch{H} & 0 & 1.00e-07 & -431\\\\\n",
"\n",
"%% Equations\n",
"E1 = 0.5(154 - -15 - -431) = 300 mV\n",
"E2 = 0.5(-365 - 552 - 2x-431) = -28 mV\n",
"E1-E2 = 328 mV\n",
"PMF = 164 mV\n"
]
}
],
"source": [
"## Standard potetials\n",
"phi_Std = phiData.phi_Std()\n",
"\n",
"## Typical concentrations\n",
"conc = phiData.ParRubXu16_conc()\n",
"\n",
"## From BazBeaVin16\n",
"conc['Q'] = conc['QH2'] = 1e-2\n",
"\n",
"## pH 7\n",
"conc['H'] = 1e-7\n",
"\n",
"## Table for paper and put values in to phi_NADH etc.\n",
"print('%% Table')\n",
"ch='\\ch'\n",
"l='{'\n",
"r='}'\n",
"eol = r'\\\\'\n",
"phi_std = {}\n",
"for spec in ['NAD','NADH','Q','QH2','H']:\n",
" phi0 = phi_Std[spec]\n",
" con = conc[spec]\n",
" phi_std_spec = phi0 + st.V_N()*np.log(con)\n",
" phi_std[spec] = phi_std_spec\n",
" #print(f'phi_Std_{spec} = {1000*phi0:0.0f}, phi_{spec} = {1000*phi_std[spec]:.0f}, conc_{spec}={conc[spec]}')\n",
" print(f'{ch}{l}{spec}{r} & {1000*phi0:.0f} & {con:1.2e} & {1000*phi_std_spec:.0f}{eol}')\n",
" exec(f'phi_{spec} = {phi_std_spec}')\n",
" \n",
"\n",
"## Print the worked example for the paper.\n",
"print('\\n%% Equations')\n",
"E1 = 0.5*(phi_NADH - phi_NAD - phi_H)\n",
"E2 = 0.5*(phi_QH2 - phi_Q - 2*phi_H)\n",
"print(f'E1 = 0.5({1000*phi_NADH:.0f} - {1000*phi_NAD:.0f} - {1000*phi_H:.0f}) = {1000*E1:.0f} mV')\n",
"print(f'E2 = 0.5({1000*phi_QH2:.0f} - {1000*phi_Q:.0f} - 2x{1000*phi_H:.0f}) = {1000*E2:.0f} mV')\n",
"print(f'E1-E2 = {1000*(E1-E2):.0f} mV')\n",
"print(f'PMF = {1000*(E1-E2)/2:.0f} mV')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"# Proton pump\n",
"The redox reaction of complex I drives a proton pump."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Bond graph\n",
"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."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"image/svg+xml": [
""
],
"text/plain": [
""
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"## Proton pump\n",
"if TranslateSVG:\n",
" sbg.model('ProtonPump_abg.svg')\n",
"import ProtonPump_abg\n",
"disp.SVG('ProtonPump_abg.svg')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Stoichiometry"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"## Stoichiometry\n",
"linear = ['E1','E2','Ei','Ee']\n",
"s = st.stoich(ProtonPump_abg.model(),linear=linear,quiet=quiet)\n",
"chemostats = ['E1','E2','Ei','Ee','Hi','He']\n",
"sc = st.statify(s,chemostats=chemostats)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Reactions\n",
"These are automatically generated from the bond graph"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"text/latex": [
"\\begin{align}\n",
"\\ch{E1 + 2 Ei + 2 Hi &<>[ rp ] E2 + 2 Ee + 2 He }\n",
"\\end{align}\n"
],
"text/plain": [
""
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"## Reactions\n",
"disp.Latex(st.sprintrl(s,chemformula=True,all=True))"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/latex": [
"\\begin{align}\n",
"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)\n",
"\\end{align}\n"
],
"text/plain": [
""
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"## Flows\n",
"disp.Latex(st.sprintvl(s))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Complex I\n",
"The model of mitochondrial complex I comprises two modules: the redox reaction and the proton pump. "
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"image/svg+xml": [
""
],
"text/plain": [
""
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"## Complex I\n",
"if TranslateSVG:\n",
" sbg.model('ComplexI_abg.svg')\n",
"import ComplexI_abg\n",
"disp.SVG('ComplexI_abg.svg')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Stoichiometry"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['E1', 'E2', 'pp_Ee', 'pp_Ei', 'pp_He', 'pp_Hi', 'rr_H', 'rr_NAD', 'rr_NADH', 'rr_Q', 'rr_QH2']\n"
]
}
],
"source": [
"## Stoichiometry\n",
"linear = ['E1','E2','pp_Ei','pp_Ee']\n",
"s = st.stoich(ComplexI_abg.model(),linear=linear,quiet=quiet)\n",
"print(s['species'])\n",
"chemostats = ['pp_Ee', 'pp_Ei', 'pp_He', 'pp_Hi', 'rr_H', 'rr_NAD', 'rr_NADH', 'rr_Q', 'rr_QH2']\n",
"sc = st.statify(s,chemostats=chemostats)\n",
"#print(s['species'])\n",
"#disp.Latex(st.sprint(s0,'K'))\n",
"#print(st.sprints(s))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Reactions\n",
"These are automatically generated from the bond graph"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/latex": [
"\\begin{align}\n",
"\\ch{E1 + 2 pp_Ei + 2 pp_Hi &<>[ pp_rp ] E2 + 2 pp_Ee + 2 pp_He }\\\\\n",
"\\ch{rr_NADH &<>[ rr ] 2 E1 + rr_H + rr_NAD }\\\\\n",
"\\ch{2 E2 + 2 rr_H + rr_Q &<>[ rr ] rr_QH2 }\n",
"\\end{align}\n"
],
"text/plain": [
""
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"## Reactions\n",
"disp.Latex(st.sprintrl(s,chemformula=True,all=True))"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/latex": [
"\\begin{align}\n",
"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)\\\\\n",
"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)\\\\\n",
"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)\n",
"\\end{align}\n"
],
"text/plain": [
""
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"## Flows\n",
"disp.Latex(st.sprintvl(s))"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/latex": [
"\\begin{align}\n",
"\\ch{4 pp_Ei + 4 pp_Hi + rr_H + rr_NADH + rr_Q &<>[ pr1 ] 4 pp_Ee + 4 pp_He + rr_NAD + rr_QH2 }\n",
"\\end{align}\n"
],
"text/plain": [
""
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"## Path\n",
"sp = st.path(s,sc)\n",
"## Reactions\n",
"disp.Latex(st.sprintrl(sp,chemformula=True,all=True))"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.6"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 2
}