{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Introduction\n", "\n", "The Network Thermodynamics/Bond Graph approach of \n", "Oster, Perlson and Katchalsky (1971,1973), extended by Gawthrop and Crampin (2014,2016,2017),\n", "to modelling biomolecular systems developed independently from the stoichiometric approach \n", ".\n", "\n", "However, the conceptual point of intersection of the two approaches is the fact that the stoichiometric matrix is the modulus of the conceptual multiport transformer linking reactions to species.\n", "This was pointed out by Cellier and Greifeneder (2009). This means that the two approaches are complementary and each can build on the strengths of the other.\n", "\n", "In particular, as discussed here, the Bond Graph approach adds energy to stoichiometry.\n", "\n", "This notebook focuses on building modular models of metabolism and consequent pathway analysis based on the Escherichia coli Core Model (Orth, Fleming and Palsson,2010); in particular, the Glycolysis and Pentose Phosphate portion is extracted and analysed. Following the discussion in the textbook of \n", "Garrett and Grisham (2017), section 22.6d, various possible pathways are examined by choosing appropriate chemostats and flowstats.\n", "(Gawthrop and Crampin, 2018)\n", "\n", "Assuming steady-state conditions, the corresponding pathway potentials (Gawthrop 2017) are derived.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Import some python code\n", "The bond graph analysis uses a number of Python modules:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "## Paths\n", "NeedPath=False\n", "if NeedPath:\n", " import sys\n", " sys.path += ['/usr/lib/python3/dist-packages']" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "## Maths library\n", "import numpy as np\n", "import scipy\n", "## BG tools\n", "import BondGraphTools as bgt\n", "\n", "## BG stoichiometric utilities\n", "import stoich as st\n", "\n", "## Stoichiometric conversion\n", "import CobraExtract as Extract\n", "import stoichBondGraph as stbg\n", "\n", "## Potentials\n", "import phiData\n", "\n", "## Faraday constant\n", "import scipy.constants as con\n", "F = con.physical_constants['Faraday constant'][0]\n", "\n", "## Display\n", "import IPython.display as disp\n", "\n", "import copy\n", "\n", "## Allow output from within functions\n", "from IPython.core.interactiveshell import InteractiveShell\n", "InteractiveShell.ast_node_interactivity = \"all\"\n", "\n", "import importlib as imp\n", "\n", "## Units etc\n", "factor = 1\n", "units = ['mV','kJ']\n", "\n", "## Control output\n", "quiet = True\n", "computePhi = True\n", "showMu = True" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Quadratic programming QP.\n", "\\begin{align}\n", "\\text{minimise } & \\frac{1}{2}x^TPx + q^Tx\\\\\n", "\\text{subject to } & Gx \\le h\\\\\n", "\\text{and } & Ax = b\n", "\\end{align}\n", "\n", "In the case considered here, there is no equality constraint and\n", "\\begin{align}\n", "x &= \\hat{\\phi}\\\\\n", "P & = N N^T + \\mu I_{n_X \\times n_X}\\\\\n", "q &= (N \\Phi)^T \\\\\n", "G &= N^T\\\\\n", "h &= -\\Phi_{min}\n", "\\end{align}\n", "\n", "$\\mu > 0$ is required to give a convex QP: in essence it turns a non-unique solution for $\\phi$ into a minimum norm solution." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "## Quadratic programming stuff.\n", "import quadprog\n", "\n", "## Function from https://scaron.info/blog/quadratic-programming-in-python.html\n", "def quadprog_solve_qp(P, q, G=None, h=None, A=None, b=None):\n", " qp_G = .5 * (P + P.T) # make sure P is symmetric\n", " qp_a = -q\n", " if A is not None:\n", " qp_C = -numpy.vstack([A, G]).T\n", " qp_b = -numpy.hstack([b, h])\n", " meq = A.shape[0]\n", " else: # no equality constraint\n", " qp_C = -G.T\n", " qp_b = -h\n", " meq = 0\n", " return quadprog.solve_qp(qp_G, qp_a, qp_C, qp_b, meq)[0]\n", "\n", "## Function to compute phi from Phi subject to Phi>positive number\n", "## NN Reduced N corresponding to known Phi\n", "def quadsolve_phi(N0,N1,Phi0,Phi_min=0.0,mu=1e-10):\n", " \n", " (n_X,n_V) = N1.shape\n", " print(N1.shape)\n", " P = 1.0*N0@(N0.T) + mu*np.eye(n_X)\n", " q = (N0@Phi0).T\n", " G = 1.0*N1.T\n", " h = -Phi_min*np.ones((n_V))\n", " phi = quadprog_solve_qp(P, q, G=G, h=h)\n", " #Phi = -N.T@phi\n", " \n", " return phi\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Deriving species potentials\n", "To perform energetic analysis it is necessary to have values of the chemical potential of the species involved. One way of this is to use experimentally derived value of species potentials at standard conditions and then derive potentials corresponding to the concentrations of the species. Another approach used here, is to take experimental values of reaction potentials $\\Phi$\n", "(Park et al., 2016) and derive a consistent set of species potentials $\\phi$ using $\\phi = -N^\\dagger \\Phi$ where $N$ is the stoichiometric matrix of the reaction system and $\\dagger$ denotes pseudo inverse.\n", "\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "def setphi(s,S,phiS):\n", " ## Load up phi\n", " Species = S['species']\n", " species = s['species']\n", " phi = []\n", " for spec in species:\n", "# if spec in ['H_E']:\n", "# sp = 'H'\n", "# elif spec in ['O2']:\n", "# sp = 'H'\n", "# else:\n", " sp = spec\n", " ph = phiS[Species.index(sp)]\n", " #print(f'phi_{spec} = {ph}')\n", " phi.append(ph)\n", "\n", " phi = np.array(phi)\n", " \n", " ## Compute Phi\n", " NN = s['N']\n", " Phi = -NN.T@phi\n", " \n", " return Phi,phi" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "def getPhi(s,Phi_hyd=0.5,phi_6PGL=None,quadprog=True):\n", " \"\"\"Extract phi for given system using\n", " Reaction potentials from ParRubXu16\"\"\"\n", " \n", " ## Reaction potentials from ParRubXu16\n", " PHI = phiData.Phi_ParRubXu16_Measured()\n", " \n", "# Phenotype = 'Mammalian'\n", "# Phenotype = 'Yeast'\n", " Phenotype = 'Ecoli'\n", " Phi_reac = PHI[Phenotype]\n", " \n", " Phi = np.zeros((len(s['reaction']),1))\n", " N = copy.copy(s['N'])\n", " N_0 = None\n", " N_1 = None\n", " Phi_0 = []\n", " for j,reac in enumerate(s['reaction']):\n", " if (reac in Phi_reac.keys()) and not np.isnan(Phi_reac[reac]):\n", " Phi_0.append(Phi_reac[reac])\n", " if N_0 is None:\n", " N_0 = N[:,j]\n", " else:\n", " N_0 = np.vstack((N_0,N[:,j]))\n", " else:\n", " if N_1 is None:\n", " N_1 = N[:,j]\n", " else:\n", " N_1 = np.vstack((N_1,N[:,j]))\n", "\n", " Phi_0 = np.array(Phi_0)\n", " ##print(N_1)\n", " \n", " ## Compute Phi\n", " N_0 = N_0.T\n", " N_1 = N_1.T\n", " \n", " n_X,n_V = N_0.shape\n", " print(f'Extracting {n_X} values of phi from {n_V} values of Phi')\n", " \n", " if quadprog:\n", " phi = quadsolve_phi(N_0,N_1,Phi_0,Phi_min=1e-3,mu=1e-10)\n", " else:\n", " ## Compute Phi using pseudo inverse\n", " pinvNT = scipy.linalg.pinv(N_0.T)\n", " phi = -pinvNT@Phi_0\n", " \n", " if phi_6PGL is not None:\n", " ## Reset 6PGL\n", " i_6PGL = s['species'].index('6PGL')\n", " phi[i_6PGL] = phi_6PGL\n", " print (f'Resetting phi_6GPL to {int(1e3*phi[i_6PGL])} mV' )\n", "\n", " ## Sanity check\n", " Phi_new = -N_0.T@phi\n", " err = np.linalg.norm(Phi_new-Phi_0)\n", " print(f'Phi error = {int(err*1000)}mV\\n')\n", " \n", " Phi = -N.T@phi\n", " \n", " return Phi,phi,Phi_0,Phi_reac\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Extract the model" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Extract full ecoli core model from the CobraPy representation" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Extracting stoichiometric matrix from: textbook\n", "Cobra Model name: e_coli_core BondGraphTools name: e_coli_core_abg\n", "Extract.Integer only handles one non-integer per reaction\n", "Multiplying reaction BIOMASS_ECOLIORE ( 12 ) by 0.6684491978609626 to avoid non-integer species 3PG ( 2 )\n", "Multiplying reaction CYTBD ( 15 ) by 2.0 to avoid non-integer species O2 ( 55 )\n", "Multiplying reaction PGK ( 54 ) by -1\n", "Multiplying reaction PGM ( 56 ) by -1\n", "Multiplying reaction RPI ( 65 ) by -1\n", "Multiplying reaction SUCOAS ( 69 ) by -1\n", "['ACALD', 'ACALDT', 'ACKR', 'ACONTA', 'ACONTB', 'ACT2R', 'ADK1', 'AKGDH', 'AKGT2R', 'ALCD2X', 'ATPM', 'ATPS4R', 'BIOMASS_ECOLIORE', 'CO2T', 'CS', 'CYTBD', 'D_LACT2', 'ENO', 'ETOHT2R', 'FBA', 'FBP', 'FORT2', 'FORTI', 'FRD7', 'FRUPTS2', 'FUM', 'FUMT2_2', 'G6PDH2R', 'GAPD', 'GLCPTS', 'GLNS', 'GLNABC', 'GLUDY', 'GLUN', 'GLUSY', 'GLUT2R', 'GND', 'H2OT', 'ICDHYR', 'ICL', 'LDH_D', 'MALS', 'MALT2_2', 'MDH', 'ME1', 'ME2', 'NADH16', 'NADTRHD', 'NH4T', 'O2T', 'PDH', 'PFK', 'PFL', 'PGI', 'PGK', 'PGL', 'PGM', 'PIT2R', 'PPC', 'PPCK', 'PPS', 'PTAR', 'PYK', 'PYRT2', 'RPE', 'RPI', 'SUCCT2_2', 'SUCCT3', 'SUCDI', 'SUCOAS', 'TALA', 'THD2', 'TKT1', 'TKT2', 'TPI']\n" ] } ], "source": [ "sm = Extract.extract(cobraname='textbook',Remove=['_C','__' ], \n", " negReaction=['RPI','PGK','PGM','SUCOAS'], quiet=quiet)\n", "print(sm['reaction'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Extract Glycolysis, Pentose Phosphate Pathways and TCA (using PDH and PDH)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Extracting 19 values of phi from 10 values of Phi\n", "(19, 2)\n", "Phi error = 0mV\n", "\n", "phi_6PGC = 29 mV\n", "phi_6PGL = 1 mV\n", "phi_ADP = -27 mV\n", "phi_ATP = 27 mV\n", "phi_CO2 = -30 mV\n", "phi_DHAP = -10 mV\n", "phi_E4P = -27 mV\n", "phi_F6P = -21 mV\n", "phi_FDP = -8 mV\n", "phi_G3P = -18 mV\n", "phi_G6P = -5 mV\n", "phi_H = -28 mV\n", "phi_H2O = 1 mV\n", "phi_NADP = 30 mV\n", "phi_NADPH = -30 mV\n", "phi_R5P = 5 mV\n", "phi_RU5PD = 5 mV\n", "phi_S7P = 24 mV\n", "phi_XU5PD = 5 mV\n", "Phi_PGI = 16 mV\n", "Phi_PFK = 69 mV\n", "Phi_FBA = 20 mV\n", "Phi_TPI = 8 mV\n", "Phi_G6PDH2R = 83 mV\n", "Phi_PGL = 1 mV\n", "Phi_GND = 115 mV\n", "Phi_RPI = 0 mV\n", "Phi_TKT2 = 16 mV\n", "Phi_TALA = 54 mV\n", "Phi_TKT1 = 4 mV\n", "Phi_RPE = 1 mV\n" ] } ], "source": [ "name = 'GlyPPP_abg'\n", "reaction = []\n", "\n", "## Glycolysis\n", "reaction += ['PGI','PFK','FBA','TPI']\n", "\n", "## Pentose Phosphate\n", "reaction += ['G6PDH2R','PGL','GND','RPI','TKT2','TALA','TKT1','RPE']\n", "\n", "## Create submodel\n", "sGlyPPP = Extract.choose(sm,reaction=reaction)\n", "#Phi,phi,Phi_0,Phi_reac = getPhi(sGlyPPP,phi_6PGL=0.04)\n", "Phi,phi,Phi_0,Phi_reac = getPhi(sGlyPPP)\n", "sGlyPPP['name'] = name\n", "stbg.model(sGlyPPP)\n", "\n", "\n", "## Print all the phis\n", "#print(phi)\n", "species = sGlyPPP['species']\n", "for i,ph in enumerate(phi):\n", " #print(species[i],ph)\n", " print(f'phi_{species[i]} = {int(round(ph*1000))} mV')\n", "\n", "# Print all the phis\n", "reac = sGlyPPP['reaction']\n", "for i,ph in enumerate(Phi):\n", " print(f'Phi_{reac[i]} = {int(round(ph*1000))} mV')" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "## Create stoichiometry\n", "import GlyPPP_abg\n", "S = st.stoich(GlyPPP_abg.model(),quiet=quiet)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Display the extracted reactions\n", "\n", "- () indicates reaction potential in Volts (J/coulomb)\n", "- [] indicates reaction free energy in J/mol\n", "\n", "See Gawthrop (2017) for a discussion of these two quantities." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/latex": [ "\\begin{xalignat*}{2}\n", "\\ch{G6P &<>[ PGI ] F6P }&&(16~\\text{mV})\\;[-1.59~\\text{kJ mol}^{-1}]\\\\\n", "\\ch{ATP + F6P &<>[ PFK ] ADP + FDP + H }&&(68~\\text{mV})\\;[-6.64~\\text{kJ mol}^{-1}]\\\\\n", "\\ch{FDP &<>[ FBA ] DHAP + G3P }&&(20~\\text{mV})\\;[-1.93~\\text{kJ mol}^{-1}]\\\\\n", "\\ch{DHAP &<>[ TPI ] G3P }&&(7~\\text{mV})\\;[-0.77~\\text{kJ mol}^{-1}]\\\\\n", "\\ch{G6P + NADP &<>[ G6PDH2R ] 6PGL + H + NADPH }&&(82~\\text{mV})\\;[-7.99~\\text{kJ mol}^{-1}]\\\\\n", "\\ch{6PGL + H2O &<>[ PGL ] 6PGC + H }&&(1~\\text{mV})\\;[-0.10~\\text{kJ mol}^{-1}]\\\\\n", "\\ch{6PGC + NADP &<>[ GND ] CO2 + NADPH + RU5PD }&&(114~\\text{mV})\\;[-11.05~\\text{kJ mol}^{-1}]\\\\\n", "\\ch{RU5PD &<>[ RPI ] R5P }&&(0~\\text{mV})\\;[-0.00~\\text{kJ mol}^{-1}]\\\\\n", "\\ch{E4P + XU5PD &<>[ TKT2 ] F6P + G3P }&&(16~\\text{mV})\\;[-1.58~\\text{kJ mol}^{-1}]\\\\\n", "\\ch{G3P + S7P &<>[ TALA ] E4P + F6P }&&(54~\\text{mV})\\;[-5.25~\\text{kJ mol}^{-1}]\n", "\\end{xalignat*}\n", "\n", "\\begin{xalignat*}{2}\n", "\\ch{R5P + XU5PD &<>[ TKT1 ] G3P + S7P }&&(4~\\text{mV})\\;[-0.39~\\text{kJ mol}^{-1}]\\\\\n", "\\ch{RU5PD &<>[ RPE ] XU5PD }&&(0~\\text{mV})\\;[-0.08~\\text{kJ mol}^{-1}]\n", "\\end{xalignat*}\n" ], "text/plain": [ "" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "disp.Latex(st.sprintrl(sGlyPPP,chemformula=True,\n", " Phi=Phi,showMu=showMu,units=['mV','kJ']))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Code to analyse pathways defined by chemostats and flowstats" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "## Analyse pathways defined by chemostats and flowstats\n", "def ch(name):\n", " return '\\\\ch{'+name+'}'\n", "\n", "def energetics(s,sp,phi):\n", " \"\"\"Reaction energetics.\n", " \"\"\"\n", "\n", " ## Phi for all reactions\n", " Phi = -s['N'].T@phi\n", " \n", " ##Phi for pathway\n", " ## I is the relevant indices of phi\n", " I = []\n", " for spec in sp['species']:\n", " i = s['species'].index(spec)\n", " I.append(i)\n", "\n", " Phip = -sp['N'].T@phi[I]\n", "\n", " return Phi,Phip\n", "\n", "def pathway(bg,phi,chemostats,flowstats=[],computePhi=False,verbose=False):\n", " \"\"\" Analyse pathways\n", " \"\"\"\n", " \n", " print('Chemostats:',sorted(chemostats))\n", " print('Flowstats:', sorted(flowstats))\n", " ## Stoichiometry\n", " ## Create stoichiometry from bond graph.\n", " s = st.stoich(bg,quiet=True)\n", "\n", " ## Stoichiometry with chemostats\n", " sc = st.statify(s,chemostats=chemostats,flowstats=flowstats)\n", "\n", " ## Pathway stoichiometry\n", " sp = st.path(s,sc)\n", " \n", " ## Print info\n", " if verbose:\n", " for stat in sorted(chemostats):\n", " print(ch(stat)+',')\n", "\n", " ## Energetics\n", " if computePhi:\n", " Phi,Phip = energetics(s,sp,phi)\n", " #print('Phi units: kJ/mol')\n", "# fac = -F/1000\n", "# units='~\\si{\\kilo\\joule\\per\\mol}'\n", " units = '~\\si{\\volt}'\n", " print(st.sprintp(sc))\n", " disp.Latex(st.sprintrl(sp,chemformula=True,Phi=Phip,showMu=showMu))\n", " #return s,sc,sp,Phi*fac,Phip*fac,units\n", " return s,sc,sp,Phip\n", " else:\n", " print(st.sprintrl(sp,chemformula=True))\n", " Phip = 0\n", " return s,sc,sp,Phip\n", " \n", "def Pathway(S,phi,chemostats,flowstats=[],computePhi=False,verbose=False):\n", " \"\"\" Analyse pathways\n", " \"\"\"\n", " \n", " print('Chemostats:',sorted(chemostats))\n", " print('Flowstats:', sorted(flowstats))\n", " ## Stoichiometry\n", " ## Create stoichiometry from bond graph.\n", " #s = st.stoich(bg,quiet=True)\n", " s = copy.copy(S)\n", " ## Stoichiometry with chemostats\n", " sc = st.statify(s,chemostats=chemostats,flowstats=flowstats)\n", "\n", " ## Pathway stoichiometry\n", " sp = st.path(s,sc)\n", " \n", " ## Print info\n", " if verbose:\n", " for stat in sorted(chemostats):\n", " print(ch(stat)+',')\n", "\n", " ## Energetics\n", " if computePhi:\n", " Phi,Phip = energetics(s,sp,phi)\n", " #print('Phi units: kJ/mol')\n", "# fac = -F/1000\n", "# units='~\\si{\\kilo\\joule\\per\\mol}'\n", " units = '~\\si{\\volt}'\n", " print(st.sprintp(sc))\n", " disp.Latex(st.sprintrl(sp,chemformula=True,Phi=Phip,showMu=showMu))\n", " #return s,sc,sp,Phi*fac,Phip*fac,units\n", " return s,sc,sp,Phip\n", " else:\n", " print(st.sprintrl(sp,chemformula=True))\n", " Phip = 0\n", " return s,sc,sp,Phip\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Analyse Pentose Phosphate Pathway with Glycolysis \n", "The pathways are isolated by using appropriate (zero-flow) flowstats. For compatibility with \\citet[\\S~18.2]{GarGri17} the pathways start from G6P (Glucose 6-phosphate)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Common chemostats" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "def Chemostats(start='G6P',end=None):\n", " chemostats = ['ADP','ATP','CO2','H','H2O','NADP','NADPH']\n", " chemostats += [start]\n", " if end is not None:\n", " chemostats += end\n", " return chemostats " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## \\ch{R5P} and \\ch{NADPH} generation\n", "- This pathway is isolated by setting PGI and TKT2 as flowstats and the\n", "product \\ch{R5P} is added to the chemostat list.\n", "\n", "- It is isolated from the TCA cycle by replacing the connecting reactions (PDH and PFL) by flowstats. " ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" }, { "name": "stdout", "output_type": "stream", "text": [ "R5P and NADPH generation\n", "Chemostats: ['ADP', 'ATP', 'CO2', 'G6P', 'H', 'H2O', 'NADP', 'NADPH', 'R5P']\n", "Flowstats: ['PGI', 'TKT2']\n", "3 pathways\n", "0: + PGI\n", "1: + G6PDH2R + PGL + GND + RPI\n", "2: + TKT2\n", "\n" ] }, { "data": { "text/latex": [ "\\begin{xalignat*}{2}\n", "\\ch{G6P + H2O + 2 NADP &<>[ pr1 ] CO2 + 2 H + 2 NADPH + R5P }&&(198~\\text{mV})\\;[-19.14~\\text{kJ mol}^{-1}]\n", "\\end{xalignat*}\n" ], "text/plain": [ "" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "imp.reload(st)\n", "print('R5P and NADPH generation')\n", "chemostats = Chemostats(start='G6P',end=['R5P'])\n", "flowstats = ['PGI','TKT2']\n", "#s,sc,sp,Phip,Phi,Phip,units = Pathway(S,phi,chemostats,flowstats=flowstats,computePhi=computePhi)\n", "s,sc,sp,Phip = Pathway(S,phi,chemostats,flowstats=flowstats,computePhi=computePhi)\n", "disp.Latex(st.sprintrl(sp,chemformula=True,Phi=Phip,units=units,showMu=showMu))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- The pathway reaction \\ch{P_1} corresponds to the \\ch{R5P} and\n", "\\ch{NADPH} synthesis discussed in comment 1 of \n", "Garrett and Grisham (2017), p787.\n", "\n", "- The positive reaction potential (negative reaction free energy) indicates\n", "that the reaction proceeds in the forward direction.\n", "\n", "- It is isolated from the TCA cycle by replacing the connecting reactions (PDH and PFL) by flowstats. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## \\ch{R5P} generation\n", "- This pathway is isolated by setting GAPD and G6PDH2R as flowstats and the\n", "product \\ch{R5P} is added to the chemostat list." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "R5P generation\n", "Chemostats: ['ADP', 'ATP', 'CO2', 'G6P', 'H', 'H2O', 'NADP', 'NADPH', 'R5P']\n", "Flowstats: ['G6PDH2R']\n", "2 pathways\n", "0: + G6PDH2R\n", "1: - 5 PGI - PFK - FBA - TPI - 4 RPI + 2 TKT2 + 2 TALA + 2 TKT1 + 4 RPE\n", "\n" ] }, { "data": { "text/latex": [ "\\begin{xalignat*}{2}\n", "\\ch{ADP + H + 6 R5P &<>[ pr1 ] ATP + 5 G6P }&&(-26~\\text{mV})\\;[2.55~\\text{kJ mol}^{-1}]\n", "\\end{xalignat*}\n" ], "text/plain": [ "" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "print('R5P generation')\n", "chemostats = Chemostats(start='G6P',end=['R5P'])\n", "flowstats = ['G6PDH2R']\n", "s,sc,sp,Phip = Pathway(S,phi,chemostats,flowstats=flowstats,computePhi=computePhi)\n", "disp.Latex(st.sprintrl(sp,chemformula=True,Phi=Phip,units=['mV','kJ'],showMu=showMu))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- The pathway reaction \\ch{pr1} corresponds to the \\ch{R5P} synthesis discussed in comment 2 of\n", "Garrett and Grisham (2017), p787.\n", "- The *negative* reaction potential (*positive* reaction free energy) indicates\n", "that the reaction proceeds in the *reverse* direction.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## \\ch{NADPH} generation\n", "\n", "- This pathway is isolated by setting GAPD as a flowstat.\n", "\n", "- It is isolated from the TCA cycle by replacing the connecting reactions (PDH and PFL) by flowstats. " ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "NADPH generation\n", "Chemostats: ['ADP', 'ATP', 'CO2', 'G6P', 'H', 'H2O', 'NADP', 'NADPH']\n", "Flowstats: []\n", "1 pathways\n", "0: - 5 PGI - PFK - FBA - TPI + 6 G6PDH2R + 6 PGL + 6 GND + 2 RPI + 2 TKT2 + 2 TALA + 2 TKT1 + 4 RPE\n", "\n" ] }, { "data": { "text/latex": [ "\\begin{xalignat*}{2}\n", "\\ch{ADP + G6P + 6 H2O + 12 NADP &<>[ pr1 ] ATP + 6 CO2 + 11 H + 12 NADPH }&&(1164~\\text{mV})\\;[-112.31~\\text{kJ mol}^{-1}]\n", "\\end{xalignat*}\n" ], "text/plain": [ "" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "print('NADPH generation')\n", "chemostats = Chemostats(start='G6P')\n", "flowstats = []\n", "s,sc,sp,Phip = Pathway(S,phi,chemostats,flowstats=flowstats,computePhi=computePhi)\n", "disp.Latex(st.sprintrl(sp,chemformula=True,Phi=Phip,units=['mV','kJ'],showMu=showMu))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- The pathway reaction \\ch{pr1} corresponds to the \n", "\\ch{NADPH} synthesis discussed in comment 3 of\n", "Garrett and Grisham (2017), p787.\n", "- The positive reaction potential (negative reaction free energy) indicates\n", "that the reaction proceeds in the forward direction.\n" ] } ], "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.8.5" }, "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 }