{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "***Note: this is the Chloroplast.ipynb notebook. The\n", "PDF version \"The Chloroplast Electron Transport Chain\"\n", "is available [here](Chloroplast.pdf).***\n", "\n", "*This is a work in progress and needs more explanatory notes.*" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "## Some useful imports\n", "import BondGraphTools as bgt\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 bg representation conversion\n", "import svgBondGraph as sbg\n", "\n", "## Modular bond graphs\n", "import modularBondGraph as mbg\n", "\n", "## Display (eg disp.SVG(), disp.\n", "import IPython.display as disp\n", "\n", "## Data\n", "import phiData\n", "import redoxData\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Introduction\n", "Photosynthesis within plant chloroplasts is the basis of life on earth (Blankenship 2014), (Nichols and Ferguson, 2013).\n", "\n", "Like the mitochondrion, the chloroplast has a membrane seperating an inner space (lumen) from an outer space (stroma). In the chloroplast, the lumen gains protons and is called the p-space, the stroma looses protons and is called the n-space.\n", "Thus geometrically, the lumen corresponds to the mitochondrial matrix and the stroma to the mitochondrial intermembrane space; but electrically the p-space is inside and the n-space outside - the reverse of the mitochondrial situation.\n", "\n", "The chloroplast electron transport chain has 4 complexes.\n", "\n", "1. Photosystem II (PII) which absorbs photons at 680nm and splits water releasing protons into the p-space and passing electrons to the plastoquinone(PQ)/plastoquine(PQH2) couple which absorbs protons from the n-space.\n", "\n", "2. Cytochrome bf (Cyt) which passes electrons to the plastoquine/plastoquinone couple which releases two protons into the p-space. Electrons are passed to the plastocyanine couple (PcOx/PcRed). Two protons are pumped across the membrane.\n", "\n", "3. Photosystem I (PI) which absorbs photons at 700nm and transports electrons from the plastocyanine (PcRed/PcOx) couple to the ferredoxin (FdOx/FdRed) couple.\n", "\n", "4. Feredoxin-NADP reductase which transfers electrons from the ferredoxin (FdRed/FdOx) couple to convert NADP to NADPH absorbing a proton from the n-space.\n", "\n", "The following figure is: https://commons.wikimedia.org/wiki/File:Thylakoid_membrane_3.svg\n", "\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\t\n", "\t\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\n", "\t\t\n", "\t\n", "\t\n", "\t\t\n", "\t\n", "\n", "\n", "\n", "" ], "text/plain": [ "" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# https://commons.wikimedia.org/wiki/File:Thylakoid_membrane_3.svg\n", "disp.SVG(\"Thylakoid_membrane_3.svg\") " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Photon Energetics" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\\begin{align}\n", " \\phi_{photon} &= \\frac{N_{av}hc}{F\\lambda}\\\\\n", " \\text{where } N_{av} &= \\text{Avogadro's number}\\\\\n", " h &= \\text{Planck's constant}\\\\\n", " c &= \\text{velocity of light}\\\\\n", " F &= \\text{Faraday's constant}\\\\\n", " \\text{and } \\lambda &= \\text{wavelength}\n", "\\end{align}\n", "For example:\n", "\\begin{equation}\n", "\\phi_{photon} = \n", "\\begin{cases}\n", " 1.82 V & \\lambda = 680 nm\\\\\n", " 1.77 V & \\lambda = 700 nm\n", " \\end{cases}\n", "\\end{equation}" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "" ], "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "disp.SVG('V_photon.svg')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Redox reactions" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "Re:r1\n", "\n", "A_ox\n", "\n", "Ce:B_ox\n", "\n", "Ce:B_red\n", "\n", "Re:r2\n", "\n", "R:r\n", "\n", "Ce:H\n", "\n", "C:E2\n", "\n", "C:E1\n", "\n", "Ce:A_red\n", "\n", "Ce:H\n", "\n", "1\n", "\n", "0\n", "\n", "1\n", "\n", "0\n", "\n", "1\n", "\n", "1\n", "\n", "1\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "" ], "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "disp.SVG('Redox_abg.svg')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Redox reactions can be written as two half-reactions:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\\begin{align}\n", "\\ch{A_{red} &<>[ r1 ] n_1 e_1^- + m_1 H_1^+ + A_{ox}}\\\\\n", "\\ch{B_{ox} + n_2 e_2^- + m_2 H_2^+ &<>[ r2 ] B_{red}}\n", "\\end{align}\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Redox potentials\n", "\n", "Note that photon energies have been used for V_700 and V_680; this value is too large as the energy conversion is not direct. A model of this needs to be built. See, for example:\n", "(Blankenship and Prince, 1985)\n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.18462115653058278\n", "V_pH = 184 mV\n", "V_680 = 1823 mV\n", "V_700 = 1771 mV\n" ] } ], "source": [ "import redoxData\n", "## pH from BerTymStr 19.3\n", "pH_p = 4 # pH of p-space\n", "pH_n = pH_p + 3\n", "VpH = redoxData.VpH(pH_p - pH_n)\n", "V680 = redoxData.V_photon(wavelength=680)\n", "V700 = redoxData.V_photon(wavelength=700)\n", "print(VpH)\n", "print('V_pH =',int(1000*VpH),'mV')\n", "print('V_680 =',int(1000*V680),'mV')\n", "print('V_700 =',int(1000*V700),'mV')\n", "\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "## Convert redox potentials to species phi\n", "phi_redox = redoxData.phi()\n", "phi_redox['Hn'] = redoxData.VpH(pH_n)\n", "phi_redox['Hp'] = redoxData.VpH(pH_p)\n", "\n", "## The correct photon potentials need sorting out\n", "## The raw valyes used here are an overestimate. See BlaPri85\n", "phi_redox['P680'] = V680\n", "phi_redox['P700'] = V700\n", "#phi_redox['P680'] = phi_redox['P680+']\n", "#phi_redox['P700'] = phi_redox['P700+']\n", "\n", "## The membrane potential is said by some to be zero. (check this)\n", "phi_redox['dV'] = VpH" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Bond graph description\n", "The four complexes are represented by svg graphics which are automatically converted into BondGraphTools format.\n", "\n", "The stoichiometric toolbox is then used to generate the pathway-reduced equation for the complex.\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Complex PII -- Photosystem II " ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "Re:r1\n", "\n", "Ce:O2\n", "\n", "Ce:PQ\n", "\n", "Ce:PQH2\n", "\n", "Re:r2\n", "\n", "Ce:Hn\n", "\n", "C:E2\n", "\n", "C:E1\n", "\n", "Ce:H2O\n", "\n", "Ce:Hp\n", "\n", "1\n", "\n", "0\n", "\n", "1\n", "\n", "0\n", "\n", "1\n", "\n", "1\n", "\n", "R:r\n", "\n", "1\n", "\n", "C:P680\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "" ], "text/plain": [ "" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "disp.SVG('PII_abg.svg')" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "sbg.model('PII_abg.svg',convertR=True,convertCe=True,quiet=True)\n", "import PII_abg" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "\\begin{align}\n", "\\ch{E1 + P680 &<>[ r ] E2 }\\\\\n", "\\ch{2 H2O &<>[ r1 ] 4 E1 + 4 Hp + O2 }\\\\\n", "\\ch{2 E2 + 2 Hn + PQ &<>[ r2 ] PQH2 }\n", "\\end{align}\n" ], "text/plain": [ "" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "## Stoichiometry\n", "sPII = st.stoich(PII_abg.model(),quiet=True)\n", "chemostats = ['H2O','O2','PQ','PQH2','Hn','Hp','P680']\n", "scPII = st.statify(sPII,chemostats=chemostats)\n", "spPII = st.path(sPII,scPII)\n", "## All reactions\n", "disp.Latex(st.sprintrl(sPII,chemformula=True))" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "\\begin{align}\n", "\\ch{4 P680 + 2 H2O + 4 Hn + 2 PQ &<>[ pr1 ] 4 Hp + O2 + 2 PQH2 }\n", "\\end{align}\n" ], "text/plain": [ "" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "## Pathway reaction\n", "disp.Latex(st.sprintrl(spPII,chemformula=True))" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1.0006211565305827\n", "0.8\n", "0\n", "0.0\n", "RP_PII = 822 mV\n" ] } ], "source": [ "## Compute net redox potential\n", "RP_PII = (\n", " - redoxData.EpH('O2/2H2O',pH=pH_p)\n", " + V680\n", " + redoxData.EpH('PQ/PQH2',pH=pH_n)\n", " )\n", "\n", "print(redoxData.EpH('O2/2H2O',pH=pH_p))\n", "print(redoxData.E('P680+/P680*'))\n", "print(redoxData.E7('PQ/PQH2'))\n", "print(redoxData.EpH('PQ/PQH2',pH=pH_n))\n", "#print(RP_PII)\n", "print('RP_PII =',int(1000*RP_PII), 'mV')" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Phi_PII = 3290 mV\n", "Ratio = 4.0\n" ] } ], "source": [ "## Compute the reaction potential Phi\n", "phi = phiData.phi_species(phi_redox,spPII['species'])\n", "Phi_PII_ = -spPII['N'].T@phi\n", "Phi_PII = Phi_PII_[0][0]\n", "print('Phi_PII =',int(1000*Phi_PII), 'mV')\n", "print('Ratio =',(Phi_PII/RP_PII))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Complex Cyt -- Cytochrome bf" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "Re:r1\n", "\n", "Ce:PQ\n", "\n", "Ce:PcOx\n", "\n", "Ce:PcRed\n", "\n", "Re:r2\n", "\n", "Ce:Hp\n", "\n", "C:dV\n", "\n", "C:E2\n", "\n", "C:E1\n", "\n", "Ce:PQH2\n", "\n", "1\n", "\n", "0\n", "\n", "1\n", "\n", "0\n", "\n", "1\n", "\n", "1\n", "\n", "R:r\n", "\n", "1\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "" ], "text/plain": [ "" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "disp.SVG('Cyt_abg.svg')" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "sbg.model('Cyt_abg.svg',convertR=True,convertCe=True,quiet=True)\n", "import Cyt_abg" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "\\begin{align}\n", "\\ch{E1 &<>[ r ] E2 + dV }\\\\\n", "\\ch{PQH2 &<>[ r1 ] 2 E1 + 2 Hp + PQ }\\\\\n", "\\ch{E2 + PcOx &<>[ r2 ] PcRed }\n", "\\end{align}\n" ], "text/plain": [ "" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "## Stoichiometry\n", "sCyt = st.stoich(Cyt_abg.model(),quiet=True)\n", "chemostats = ['PQ','PQH2','PcOx','PcRed','Hp','dV']\n", "scCyt = st.statify(sCyt,chemostats=chemostats)\n", "spCyt = st.path(sCyt,scCyt)\n", "disp.Latex(st.sprintrl(sCyt,chemformula=True))" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "\\begin{align}\n", "\\ch{PQH2 + 2 PcOx &<>[ pr1 ] 2 dV + 2 Hp + PQ + 2 PcRed }\n", "\\end{align}\n" ], "text/plain": [ "" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "disp.Latex(st.sprintrl(spCyt,chemformula=True))" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.010757686938834443\n", "RP_Cyt = 11 mV\n" ] } ], "source": [ "## Compute net redox potential\n", "RP_Cyt = (- redoxData.EpH('PQ/PQH2',pH=pH_p)\n", " - redoxData.VpH(pH_p - pH_n)\n", " + redoxData.E('PcOx/PcRed')\n", " )\n", "\n", "print(RP_Cyt)\n", "print('RP_Cyt =',redoxData.mV(RP_Cyt), 'mV')" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Phi_Cyt = 22 mV\n", "Ratio = 2\n" ] } ], "source": [ "## Compute the reaction potential Phi\n", "phi = phiData.phi_species(phi_redox,spCyt['species'])\n", "Phi_Cyt_ = -spCyt['N'].T@phi\n", "Phi_Cyt = Phi_Cyt_[0][0]\n", "print('Phi_Cyt =',redoxData.mV(Phi_Cyt), 'mV')\n", "print('Ratio =', int(Phi_Cyt/RP_Cyt))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Complex PI -- Photosystem I" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "Re:r1\n", "\n", "Ce:PcOx\n", "\n", "Ce:FdOx\n", "\n", "Ce:FdRed\n", "\n", "Re:r2\n", "\n", "C:E2\n", "\n", "C:P700\n", "\n", "C:E1\n", "\n", "Ce:PcRed\n", "\n", "1\n", "\n", "0\n", "\n", "1\n", "\n", "0\n", "\n", "1\n", "\n", "1\n", "\n", "R:r\n", "\n", "1\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "" ], "text/plain": [ "" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "disp.SVG('PI_abg.svg')" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "sbg.model('PI_abg.svg',convertR=True,convertCe=True,quiet=True)\n", "import PI_abg" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/latex": [ "\\begin{align}\n", "\\ch{E1 + P700 &<>[ r ] E2 }\\\\\n", "\\ch{PcRed &<>[ r1 ] E1 + PcOx }\\\\\n", "\\ch{E2 + FdOx &<>[ r2 ] FdRed }\n", "\\end{align}\n" ], "text/plain": [ "" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "## Stoichiometry\n", "sPI = st.stoich(PI_abg.model(),quiet=True)\n", "chemostats = ['PcOx','PcRed','FdOx','FdRed','P700']\n", "scPI = st.statify(sPI,chemostats=chemostats)\n", "spPI = st.path(sPI,scPI)\n", "disp.Latex(st.sprintrl(sPI,chemformula=True))" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "\\begin{align}\n", "\\ch{P700 + FdOx + PcRed &<>[ pr1 ] FdRed + PcOx }\n", "\\end{align}\n" ], "text/plain": [ "" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "disp.Latex(st.sprintrl(spPI,chemformula=True))" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "RP_PI = 961 mV\n" ] } ], "source": [ "## Compute net redox potential\n", "RP_PI = (\n", " - redoxData.E('PcOx/PcRed')\n", " + V700\n", " + redoxData.E('FdOx/FdRed')\n", " )\n", "\n", "#print(RP_PI)\n", "print('RP_PI =',redoxData.mV(RP_PI), 'mV')" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Phi_PI = 961 mV\n", "Ratio = 1\n" ] } ], "source": [ "## Compute the reaction potential Phi\n", "phi = phiData.phi_species(phi_redox,spPI['species'])\n", "Phi_PI_ = -spPI['N'].T@phi\n", "Phi_PI = Phi_PI_[0][0]\n", "print('Phi_PI =',redoxData.mV(Phi_PI), 'mV')\n", "print('Ratio =', int(round(Phi_PI/RP_PI)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Complex Fer -- Feredoxin-NADP reductase" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "Re:r1\n", "\n", "Ce:FdOx\n", "\n", "Ce:NADP\n", "\n", "Ce:NADPH\n", "\n", "Re:r2\n", "\n", "Ce:Hn\n", "\n", "C:E2\n", "\n", "C:E1\n", "\n", "Ce:FdRed\n", "\n", "1\n", "\n", "0\n", "\n", "1\n", "\n", "0\n", "\n", "1\n", "\n", "1\n", "\n", "R:r\n", "\n", "1\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "" ], "text/plain": [ "" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "disp.SVG('Fer_abg.svg')" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "sbg.model('Fer_abg.svg',convertR=True,convertCe=True,quiet=True)\n", "import Fer_abg" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Swapping Re:r for two Sf in Fer\n", "Swapping Re:r1 for two Sf in Fer\n", "Swapping Re:r2 for two Sf in Fer\n", "Swapping Re:r for two Sf in Fer\n", "Swapping Re:r1 for two Sf in Fer\n", "Swapping Re:r2 for two Sf in Fer\n" ] }, { "data": { "text/latex": [ "\\begin{align}\n", "\\ch{E1 &<>[ r ] E2 }\\\\\n", "\\ch{FdRed &<>[ r1 ] E1 + FdOx }\\\\\n", "\\ch{2 E2 + Hn + NADP &<>[ r2 ] NADPH }\n", "\\end{align}\n" ], "text/plain": [ "" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "## Stoichiometry\n", "sFer = st.stoich(Fer_abg.model())\n", "chemostats = ['FdRed','FdOx','NADP','NADPH','Hn']\n", "scFer = st.stoich(Fer_abg.model(),chemostats=chemostats)\n", "spFer = st.path(sFer,scFer)\n", "disp.Latex(st.sprintrl(sFer,chemformula=True))" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "\\begin{align}\n", "\\ch{2 FdRed + Hn + NADP &<>[ pr1 ] 2 FdOx + NADPH }\n", "\\end{align}\n" ], "text/plain": [ "" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "disp.Latex(st.sprintrl(spFer,chemformula=True))" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "RP_Fer = 105 mV\n" ] } ], "source": [ "## Compute net redox potential\n", "RP_Fer = (\n", " - redoxData.E('FdOx/FdRed')\n", " + redoxData.EpH('NADP/NADPH',pH_n)\n", " )\n", "\n", "#print(RP_Fer)\n", "print('RP_Fer =',int(1000*RP_Fer), 'mV')" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Phi_Fer = 212 mV\n", "Ratio = 2\n" ] } ], "source": [ "## Compute the reaction potential Phi\n", "phi = phiData.phi_species(phi_redox,spFer['species'])\n", "Phi_Fer_ = -spFer['N'].T@phi\n", "Phi_Fer = Phi_Fer_[0][0]\n", "print('Phi_Fer =',int(1000*Phi_Fer), 'mV')\n", "print('Ratio =', int(Phi_Fer/RP_Fer))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# The Electron Transport Chain\n", "The overall model is described a bond graph tools file:" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "## File ETC_abg.py\n", "\n", "import BondGraphTools as bgt\n", "import PII_abg\n", "import Cyt_abg\n", "import PI_abg\n", "import Fer_abg\n", "\n", "def model():\n", " \"\"\" \n", " Model of chloroplast electron transport chain\n", " \"\"\"\n", "\n", " ETC = bgt.new(name='ETC') # Create system\n", " PII = PII_abg.model()\n", " Cyt = Cyt_abg.model()\n", " PI = PI_abg.model()\n", " Fer = Fer_abg.model()\n", " bgt.add(ETC,PII,Cyt,PI,Fer)\n", " \n", " return ETC\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Unify species in model using mbg.unify()" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [], "source": [ "import ETC_abg\n", "model = ETC_abg.model()\n", "common = ['PQ','PQH2','PcOx','PcRed','FdOx', 'FdRed','Hn','Hp']\n", "mbg.unify(model,common,quiet=True)\n", "s = st.stoich(model,quiet=True)" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "\\begin{align}\n", "\\ch{4 P680 + 2 H2O + 4 P700 + 2 NADP + 6 Hn &<>[ pr1 ] O2 + 4 dV + 2 NADPH + 8 Hp }\n", "\\end{align}\n" ], "text/plain": [ "" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "chemostats = ['H2O','O2','NADP','NADPH','Hp','Hn','P680','P700','dV']\n", "sc = st.statify(s,chemostats=chemostats)\n", "sp = st.path(s,sc)\n", "disp.Latex(st.sprintrl(sp,chemformula=True))" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Phi = 7603 mV\n" ] } ], "source": [ "## Compute the reaction potential Phi\n", "phi = phiData.phi_species(phi_redox,sp['species'])\n", "Phi_ = -sp['N'].T@phi\n", "Phi= Phi_[0][0]\n", "print('Phi =',redoxData.mV(Phi), 'mV')\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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.6.8" }, "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 }