{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "***Note: This example is discussed in detail by \n", " (Gawthrop and Pan, 2020) \n", " available [here](https://arxiv.org/abs/2009.02217).***\n", "\n", "***Note: this is the SGLT.ipynb notebook. The\n", "PDF version \"Sodium Glucose Symporter\"\n", "is available [here](SGLT.pdf).***\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Introduction\n", "The Sodium-Glucose Transport Protein 1 (SGLT1) (also known as the\n", "\\ch{Na+}-glucose symporter \\citep[\\S~2.4.2]{KeeSne09}) was studied experimentally by\n", "\\citet{ParSupLoo92} and explained by a biophysical model\n", "\\citep{ParSupLoo92a}; further experiments and modelling were conducted\n", "by \\citet{CheCoaJac95}. \\citet{EskWriLoo05} examined the kinetics of\n", "the reverse mode using similar experiments and analysis to\n", "\\citet{ParSupLoo92,ParSupLoo92a} but with reverse transport and\n", "currents.\n", "\n", "This note looks at a bond graph based model\n", "of SGLT1 based on the model of \\citet{EskWriLoo05}.\n", "\n", "The model of Figure 6B of\n", " \\citet{EskWriLoo05} is based on the six-state\n", "biomolecular cycle of Figure 2 of \\citet{ParSupLoo92a}. When operating\n", "normally, sugar is transported from the outside to the inside of the\n", "membrane driven against a possibly adverse gradient by the\n", "concentration gradient of \\ch{Na+}. \n", "\n", "A similar situation is analysed in \\S~1.1 of the book by \\citet{Hil89}\n", "and the corresponding bond graph of the biomolecular cycle is\n", "described by \\citet{GawCra17}." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "In /home/peterg/.local/lib/python3.6/site-packages/matplotlib/mpl-data/stylelib/_classic_test.mplstyle: \n", "The text.latex.unicode rcparam was deprecated in Matplotlib 3.0 and will be removed in 3.2.\n", "In /home/peterg/.local/lib/python3.6/site-packages/matplotlib/mpl-data/stylelib/_classic_test.mplstyle: \n", "The savefig.frameon rcparam was deprecated in Matplotlib 3.1 and will be removed in 3.3.\n", "In /home/peterg/.local/lib/python3.6/site-packages/matplotlib/mpl-data/stylelib/_classic_test.mplstyle: \n", "The pgf.debug rcparam was deprecated in Matplotlib 3.0 and will be removed in 3.2.\n", "In /home/peterg/.local/lib/python3.6/site-packages/matplotlib/mpl-data/stylelib/_classic_test.mplstyle: \n", "The verbose.level rcparam was deprecated in Matplotlib 3.1 and will be removed in 3.3.\n", "In /home/peterg/.local/lib/python3.6/site-packages/matplotlib/mpl-data/stylelib/_classic_test.mplstyle: \n", "The verbose.fileo rcparam was deprecated in Matplotlib 3.1 and will be removed in 3.3.\n" ] } ], "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\n", "import svgBondGraph as sbg\n", "\n", "## Display (eg disp.SVG(), disp.\n", "import IPython.display as disp\n", "\n", "quiet = True\n", "\n", "## Data file\n", "import json\n", "\n", "## Save the figure\n", "SaveFig = False" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "([-149.08132530120483, -128.50492880613362, -108.26396495071195, -88.92935377875138, -68.92045454545456, -49.776150054764514, -29.841182913472096, -9.930859802847777, 11.341730558597988, 30.71741511500545], [1.3909090909090907, 1.8090909090909086, 3.409090909090909, 3.6636363636363636, 4.236363636363636, 4.9818181818181815, 5.2272727272727275, 5.363636363636363, 4.863636363636363, 5.3])\n" ] } ], "source": [ "## Load data from Eskandari et. al. Fig 3A\n", "## Digitised using https://apps.automeris.io/wpd/\n", "\n", "def loadData():\n", " \n", " with open('SGLT_data.json') as f:\n", " Dict = json.load(f)\n", " \n", " List = Dict['datasetColl'][0]['data']\n", "\n", " X = []\n", " Y = []\n", " for item in List:\n", " xy = item['value']\n", " X.append(xy[0])\n", " Y.append(xy[1])\n", "\n", " return X,Y\n", "\n", "print(loadData())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Sodium-Glucose Symporter - zero membrane potential.\n", "This non-electrogenic version is used to compute species and reaction parameters from the \n", "published model values." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Bond graph" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "OUT\n", "\n", "IN\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "Re:r61\n", "\n", "1\n", "\n", "0\n", "\n", "Re:r56\n", "\n", "1\n", "\n", "C:Ci\n", "\n", "1\n", "\n", "0\n", "\n", "Re:r12\n", "\n", "1\n", "\n", "1\n", "\n", "\n", "Re:r34\n", "\n", "0\n", "\n", "0\n", "\n", "Re:r45\n", "\n", "1\n", "\n", "C:SCNai\n", "\n", "C:CNai\n", "\n", "1\n", "\n", "1\n", "\n", "1\n", "\n", "1\n", "\n", "0\n", "\n", "1\n", "\n", "Re:r23\n", "\n", "0\n", "\n", "C:SCNao\n", "\n", "C:CNao\n", "\n", "\n", "Re:r25\n", "\n", "0\n", "\n", "C:Nao\n", "\n", "0\n", "\n", "C:So\n", "\n", "0\n", "\n", "C:Si\n", "\n", "0\n", "\n", "C:Nai\n", "\n", "1\n", "\n", "C:Co\n", "\n", "" ], "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "## Sodium-Glucose tranporter - no E\n", "sbg.model('SGLT_abg.svg')\n", "import SGLT_abg\n", "disp.SVG('SGLT_abg.svg')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Stoichiometry" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "## Stoichiometry\n", "s0 = st.stoich(SGLT_abg.model(),quiet=quiet)\n", "chemostats = ['Nai','Nao','Si','So']\n", "sc0 = st.statify(s0,chemostats=chemostats)\n", "#print(s['species'])\n", "#disp.Latex(st.sprint(s0,'K'))\n", "#print(st.sprints(s))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Convert parameters\n", "The model of \\citet{EskWriLoo05} is based on rate constants. The following code converts this into the parameters required for the bond graph model." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "def Keq2K(K_eq,N,K,tol=1e-6):\n", " ## Compute BG C parameters K_c from equilibrium constants K_eq.\n", " ## NB K_eq must be thremodynamically consistent.\n", " \n", " logK_eq = np.log(K_eq)\n", " #print(K_eq)\n", " #print(logK_eq)\n", " \n", " if len(K) is not 0:\n", " ##First check that Keq is thermodynamically consistent.\n", " check = np.linalg.norm(K.T*logK_eq)/np.linalg.norm(logK_eq)\n", " print(check)\n", " \n", " ## Transformation of mu to affinities\n", " NN = -N.T\n", " \n", " ## Pseudo inverse\n", " pNN = np.linalg.pinv(NN)\n", " \n", " ## BG C constants\n", " K_c = np.exp(pNN@logK_eq)\n", " \n", " return K_c" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Error in kappa: 1.2e-05\n", "K_CNai = 0.149\n", "K_CNao = 49.12\n", "K_Ci = 0.3457\n", "K_Co = 40.33\n", "K_Nai = 13.93\n", "K_Nao = 13.96\n", "K_SCNai = 0.099\n", "K_SCNao = 0.099\n", "K_Si = 10.12\n", "K_So = 10.08\n", "r12 K_eq = 160.0000; kappa = 982183.7246\n", "r23 K_eq = 5000.0000; kappa = 19492291.8173\n", "r25 K_eq = 329.6703; kappa = 589.3102\n", "r34 K_eq = 1.0000; kappa = 48730729.5432\n", "r45 K_eq = 0.0656; kappa = 779691672.6910\n", "r56 K_eq = 0.0022; kappa = 6475936.6454\n", "r61 K_eq = 0.0086; kappa = 837303.6199\n" ] } ], "source": [ "## Set non-unit parameters using data from EskWriLoo05\n", "def setPar(s,tol=1e-6):\n", " \n", " ## Extract stoichiometry\n", " N = s['N']\n", " Nf = s['Nf']\n", " Nr = s['Nr']\n", " K = s['K']\n", " \n", " n_V = s['n_V']\n", " \n", " \n", " ## Rate constants from Fig 6.\n", " kf = {}\n", " kr = {}\n", " \n", " ## Rate constants from Fig 6.\n", " kf['r12'] = 8e4;\n", " kr['r12'] = 500;\n", "\n", " kf['r23'] = 1e5;\n", " kr['r23'] = 20;\n", "\n", " kf['r34'] = 50;\n", " kr['r34'] = 50;\n", "\n", " kf['r45'] = 800;\n", " kr['r45'] = 12190;\n", "\n", " kf['r56'] = 10;\n", " kr['r56'] = 4500;\n", "\n", " kf['r61'] = 3;\n", " kr['r61'] = 350;\n", "\n", " kf['r25'] = 0.3;\n", " kr['r25'] = 9.1e-4;\n", "\n", " ## Equilibrium constants.\n", " K_eq = np.zeros(n_V)\n", " k_f = np.zeros(n_V)\n", " k_r = np.zeros(n_V)\n", " for i,reac in enumerate(s['reaction']):\n", " K_eq[i] = kf[reac]/kr[reac]\n", " k_f[i] = kf[reac]\n", " k_r[i] = kr[reac]\n", " \n", " ## Compute Ce constants from equilibrium constants\n", " K_c = Keq2K(K_eq,N,K)\n", " \n", "# print(K_eq)\n", "# print(s['n_X'], K_c.shape)\n", " \n", " # Forward rates induced by Cs\n", " k_f0 = np.exp(Nf.T@np.log(K_c))\n", " \n", " ## Rate constants kappa (Amps)\n", " kappa = (k_f/k_f0)*st.F()\n", " \n", " ## Sanity check\n", " k_r0 = np.exp(Nr.T@np.log(K_c))\n", " kappa_r = (k_r/k_r0)*st.F()\n", " check = np.linalg.norm(kappa-kappa_r)\n", " \n", " if check>tol:\n", " print(f'Error in kappa: {check:.2}')\n", " \n", " \n", " ## Parameters\n", " parameter = {}\n", " \n", " ## Ce constants\n", " for i,spec in enumerate(s['species']):\n", " print(f'K_{spec} = {K_c[i]:.4}')\n", " parameter['K_'+spec] = K_c[i]\n", " \n", " ## Re constants\n", " for i,reac in enumerate(s['reaction']):\n", " print(f'{reac} K_eq = {K_eq[i]:.4f}; kappa = {kappa[i]:.4f}')\n", " parameter['kappa_'+reac] = kappa[i]\n", " \n", " return parameter\n", "\n", "par = setPar(s0)\n", "#print(par)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Electrogenic Sodium-Glucose Symporter\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Bond graph\n", "The component C:E is added to express the effect of the charged \\ch{Na+} ion crossing the membrane." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "scrolled": false }, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "OUT\n", "\n", "IN\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "Re:r61\n", "\n", "1\n", "\n", "0\n", "\n", "Re:r56\n", "\n", "1\n", "\n", "C:Ci\n", "\n", "1\n", "\n", "0\n", "\n", "Re:r12\n", "\n", "0\n", "\n", "1\n", "\n", "1\n", "\n", "\n", "Re:r34\n", "\n", "0\n", "\n", "0\n", "\n", "Re:r45\n", "\n", "1\n", "\n", "C:SCNai\n", "\n", "C:CNai\n", "\n", "1\n", "\n", "1\n", "\n", "1\n", "\n", "1\n", "\n", "0\n", "\n", "1\n", "\n", "Re:r23\n", "\n", "0\n", "\n", "C:SCNao\n", "\n", "C:CNao\n", "\n", "\n", "Re:r25\n", "\n", "0\n", "\n", "C:Nao\n", "\n", "0\n", "\n", "C:So\n", "\n", "0\n", "\n", "C:Si\n", "\n", "0\n", "\n", "C:Nai\n", "\n", "C:E\n", "\n", "1\n", "\n", "C:Co\n", "\n", "\n", "\n", "\n", "\n", "" ], "text/plain": [ "" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "## Sodium-Glucose tranporter - electrogenic\n", "sbg.model('ESGLT_abg.svg')\n", "import ESGLT_abg\n", "disp.SVG('ESGLT_abg.svg')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Stoichiometry" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "K:\n", " [[ 0 1]\n", " [ 1 0]\n", " [-1 1]\n", " [ 1 0]\n", " [ 1 0]\n", " [ 0 1]\n", " [ 0 1]]\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "## Stoichiometry\n", "s = st.stoich(ESGLT_abg.model(),linear=['E'], quiet=quiet)\n", "chemostats = ['Nai','Nao','Si','So','E']\n", "sc = st.statify(s,chemostats=chemostats)\n", "\n", "disp.Latex(st.sprint(sc,'K'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Reactions and flows" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/latex": [ "\\begin{align}\n", "\\ch{Co + 2 Nao &<>[ r12 ] CNao + E }\\\\\n", "\\ch{CNao + So &<>[ r23 ] SCNao }\\\\\n", "\\ch{CNao &<>[ r25 ] CNai }\\\\\n", "\\ch{SCNao &<>[ r34 ] SCNai }\\\\\n", "\\ch{SCNai &<>[ r45 ] CNai + Si }\\\\\n", "\\ch{CNai &<>[ r56 ] Ci + 2 Nai }\\\\\n", "\\ch{Ci &<>[ r61 ] Co }\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_{r12} &= \\kappa_{r12} \\left(- K_{CNao} x_{CNao} e^{\\frac{K_{E} x_{E}}{V_{N}}} + K_{Co} K_{Nao}^{2} x_{Co} x_{Nao}^{2}\\right)\\\\\n", "v_{r23} &= \\kappa_{r23} \\left(K_{CNao} K_{So} x_{CNao} x_{So} - K_{SCNao} x_{SCNao}\\right)\\\\\n", "v_{r25} &= \\kappa_{r25} \\left(- K_{CNai} x_{CNai} + K_{CNao} x_{CNao}\\right)\\\\\n", "v_{r34} &= \\kappa_{r34} \\left(- K_{SCNai} x_{SCNai} + K_{SCNao} x_{SCNao}\\right)\\\\\n", "v_{r45} &= \\kappa_{r45} \\left(- K_{CNai} K_{Si} x_{CNai} x_{Si} + K_{SCNai} x_{SCNai}\\right)\\\\\n", "v_{r56} &= \\kappa_{r56} \\left(K_{CNai} x_{CNai} - K_{Ci} K_{Nai}^{2} x_{Ci} x_{Nai}^{2}\\right)\\\\\n", "v_{r61} &= \\kappa_{r61} \\left(K_{Ci} x_{Ci} e^{- \\frac{K_{E} x_{E}}{V_{N}}} - K_{Co} x_{Co}\\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": [ "## Sdet up initial conditions for simulation" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "def setX(s):\n", " \n", " sp = s['species']\n", " X0 = np.zeros(s['n_X'])\n", " X0[sp.index('So')] = 1e-6\n", " X0[sp.index('Si')] = 1e-3\n", " X0[sp.index('Nao')] = 1e-2\n", " X0[sp.index('Nai')] = 0.5\n", " \n", "# X0 *= st.F()\n", " \n", " ## Normalised value\n", " C_T = 1\n", " others = ['Co','CNao','SCNao','Ci','CNai','SCNai']\n", " for spec in others:\n", " X0[sp.index(spec)] = C_T/len(others)\n", " \n", " #N_C = 3e6\n", " N_C = 7.5e7\n", " N_avo = 6.022e23\n", " C_T_0 = N_C/N_avo\n", " \n", " I_0_pA = 1e12*C_T_0/C_T\n", " \n", " print(f'N_C = {N_C}; i_0 = {I_0_pA}pA')\n", " \n", " #X0 *= st.F()\n", " \n", " return X0,I_0_pA\n", "\n", "#print(setX(s))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Comparison with experimental data" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Error in kappa: 1.2e-05\n", "K_CNai = 0.149\n", "K_CNao = 49.12\n", "K_Ci = 0.3457\n", "K_Co = 40.33\n", "K_Nai = 13.93\n", "K_Nao = 13.96\n", "K_SCNai = 0.099\n", "K_SCNao = 0.099\n", "K_Si = 10.12\n", "K_So = 10.08\n", "r12 K_eq = 160.0000; kappa = 982183.7246\n", "r23 K_eq = 5000.0000; kappa = 19492291.8173\n", "r25 K_eq = 329.6703; kappa = 589.3102\n", "r34 K_eq = 1.0000; kappa = 48730729.5432\n", "r45 K_eq = 0.0656; kappa = 779691672.6910\n", "r56 K_eq = 0.0022; kappa = 6475936.6454\n", "r61 K_eq = 0.0086; kappa = 837303.6199\n", "N_C = 75000000.0; i_0 = 0.00012454334108269677pA\n", "-0.17\n", "-0.17 + 0.00022000000000000003*t\n", "-0.17 0.05000000000000002\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "## Vary E\n", "E0 = -170/1000\n", "E1 = 50/1000\n", "#E1 = 200/1000\n", "X_chemo = {'E':str(E0)}\n", "\n", "## Simulation\n", "t = np.linspace(0,1e3,100)\n", "parameter = setPar(s0)\n", "X0,I_0_pA = setX(s)\n", "dat = st.sim(s,sc=sc,t=t,parameter=parameter,X_chemo=X_chemo,X0=X0)\n", "\n", "## Extract data\n", "spec = s['species']\n", "reac = s['reaction']\n", "X_ss = dat['X'][-1,:]\n", "print(X_ss[spec.index('E')])\n", "\n", "\n", "x_E = f'{E0} + {(E1-E0)/max(t)}*t'\n", "print(x_E)\n", "X_chemo = {'E':x_E}\n", "\n", "dat = st.sim(s,sc=sc,t=t,parameter=parameter,X0=X_ss,X_chemo=X_chemo)\n", "f_E = dat['dX'][:,spec.index('E')]\n", "E = dat['X'][:,spec.index('E')]\n", "\n", "print(E[0],E[-1])\n", "\n", "X,Y = loadData()\n", "plt.plot(1000*E,-f_E*I_0_pA, label='Model')\n", "plt.scatter(X,Y,label='Experimental')\n", "plt.legend()\n", "plt.grid()\n", "plt.xlabel('$E$ mV')\n", "plt.ylabel('$-f$ pA')\n", "if SaveFig:\n", " plt.savefig('Figs/sglt.pdf')\n", "plt.show()" ] }, { "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.9" }, "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 }