{ "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": [], "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\n", "\n", "TranslateSVG = 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", "if TranslateSVG:\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) != 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", "if TranslateSVG:\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": { "needs_background": "light" }, "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.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 }