{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"***Note: this is the Complexes.ipynb notebook. The\n",
"PDF version \"Bond Graph Representation of Complexes: Bringing Graph Theory\n",
"to Bond Graphs\"\n",
"is available [here](Complexes.pdf).***"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Introduction\n",
"\n",
"Chemical Reaction Network theory uses the formal concept of *complexes*. \n",
"Complexes are the combination of chemical\n",
"species forming the substrate and products of the network reactions. In particular, the stoichiometric matrix $N$ can be decomposed as:\n",
"\\begin{equation}\n",
" \\label{eq:ZD}\n",
" N = ZD\n",
"\\end{equation}\n",
"where $Z$ relates complexes to species and $D$ is the *incidence matrix* of the directed graph formed by taking the\n",
"complexes to be vertices and the reactions to be edges.\n",
"This digraph can then be analysed using standard graph theory. \n",
"\n",
"This notion can be given a bond graph interpretation\n",
"(Gawthrop and Crampin, 2018). \n",
"This notebook illustrates complexes using examples from this paper; please see the paper for further explanation.\n",
"\n",
"As noted by (Gawthrop and Crampin, 2018) the digraphs for systems with and without chemostats are very different and so both are shown in the following examples.\n",
"The digraphs associated with chemostats are related to bond graph pathway analysis (Gawthrop and Crampin, 2017); for each of the three examples the corresponding pathways are given."
]
},
{
"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": [
"## 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",
"import IPython.display as disp\n",
"\n",
"## Stoichiometric analysis\n",
"import stoich as st\n",
"\n",
"## SVG bg representation conversion\n",
"import svgBondGraph as sbg\n",
"\n",
"## Set quiet=False for verbose output\n",
"quiet = True\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Example 1: enzyme-catalysed reaction \n",
"The bond graph representation of the (reversible) enzyme-catalysed reaction is\n",
"(Gawthrop and Crampin, 2018):"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
""
],
"text/plain": [
""
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"disp.SVG('RE_abg.svg')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This graphical representation may be converted to [bond-graph tools](https://pypi.org/project/BondGraphTools/) format using "
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"sbg.model('RE_abg.svg')\n",
"import RE_abg"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Reactions\n",
"The reactions corresponding to this system are:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/latex": [
"\\begin{align}\n",
"\\ch{A + E &<>[ r1 ] C }\\\\\n",
"\\ch{C &<>[ r2 ] B + E }\n",
"\\end{align}\n"
],
"text/plain": [
""
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"s = st.stoich(RE_abg.model(),quiet=quiet)\n",
"disp.Latex(st.sprintrl(s,chemformula=True))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Stoichiometric matrix and its decomposition"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/latex": [
"\\begin{align}\n",
"X&= \\begin{pmatrix}\n",
" X_{A}\\\\\n",
" X_{B}\\\\\n",
" X_{C}\\\\\n",
" X_{E}\\\\\n",
"\\end{pmatrix}\n",
"\\end{align}\n"
],
"text/plain": [
""
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"disp.Latex(st.sprintl(s,'species'))"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/latex": [
"\\begin{align}\n",
"V&= \\begin{pmatrix}\n",
" V_{r1}\\\\\n",
" V_{r2}\\\\\n",
"\\end{pmatrix}\n",
"\\end{align}\n"
],
"text/plain": [
""
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"disp.Latex(st.sprintl(s,'reaction'))"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/latex": [
"\\begin{align}\n",
"N &=\n",
"\\left(\\begin{matrix}-1 & 0\\\\0 & 1\\\\1 & -1\\\\-1 & 1\\end{matrix}\\right)\n",
"\\end{align}\n"
],
"text/plain": [
""
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"disp.Latex(st.sprintl(s,'N'))"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/latex": [
"\\begin{align}\n",
"Z &=\n",
"\\left(\\begin{matrix}1 & 0 & 0\\\\0 & 0 & 1\\\\0 & 1 & 0\\\\1 & 0 & 1\\end{matrix}\\right)\n",
"\\end{align}\n"
],
"text/plain": [
""
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"disp.Latex(st.sprintl(s,'Z'))"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/latex": [
"\\begin{align}\n",
"D &=\n",
"\\left(\\begin{matrix}-1 & 0\\\\1 & -1\\\\0 & 1\\end{matrix}\\right)\n",
"\\end{align}\n"
],
"text/plain": [
""
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"disp.Latex(st.sprintl(s,'D'))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## System digraph"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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ANAp3377rebOnatNmzbpv/7rv/Tzn/+8w8c2NzdrzZo1am5ujqjPHG4N4AkTJighISFs16UTBgB0iMfj0cKFC3XqqacqPz9fxcXFnQpgSUpISNDEiROVlJQUMQ9rGYahpKQkTZw4MawBLNEJAwA6YM2aNZo5c6b69eunxx9/XEOHDu3W+bxer0pKSix/WKv1Iaz8/HxLPnSCEAYAtKumpkbz58/XBx98oIcffliXXHJJUO/p1tTUaOPGjfJ4PGENY8MwFBcXp9GjR4flKeh267DsygCAiOX3+/Xcc88pPz9fvXr10rZt23TppZcG/aGqjIwMnXPOOcrOzpbdbg/qudtjt9uVnZ2tc845x9IAluiEAQBH2LJli2bOnCmfz6cnn3xSo0ePDst1GxoaVFpaqurqakkKamfcev85MzNTeXl5IR1F2RmEMABAkrR//37dc889euWVV/SnP/1J119/vSUPT7ndblVUVKi8vFxer1emaXYpkA3DkM1mk8PhUG5urnJyckL2aUhdxcQsAOjhTNPUG2+8oXnz5um8887T1q1b1bdvX8vqcTqdGjJkiHJzc1VXV6e6ujrV1taqoaFBbrc7sGx9eA/Zukzu8/nkdDqVkpKi9PR0paWlKS0tLXL3JtMJA0DPVVpaqjlz5qiiokJPPvmkJk6caHVJP8rj8cjlcsntdsvv98vv98swDBmGIafTqeTkZMXFxVldZocRwgDQAzU3N+vBBx/UY489pvnz52vu3LlRFV6xguVoAOhhli9frtmzZys/P18bNmzQT37yE6tL6rEIYQDoIaqqqnTrrbfqiy++0OLFi3XhhRdaXVKPxz5hAIhxXq9XixYt0siRIzVkyBCVlJQQwBGCThgAYtjnn3+umTNnKi0tTatXr9awYcOsLgmHIYQBIAbt27dPd9xxh9555x399a9/1RVXXBGx23R6MpajASCGmKapF198UcOHD1dcXJy2bdum//iP/yCAIxSdMADEiJKSEs2cOVMHDhzQu+++qzPOOMPqknAcdMIAEOWampo0f/58nX322br88sv1xRdfEMBRghAGgChlmqbeeustDR8+XJWVlSouLtasWbPC9mlE6D6WowEgCu3atUtz5sxRWVmZ/va3v+mcc86xuiR0AZ0wAEQRt9utv/zlLzrzzDM1fvx4bd68mQCOYnTCABAlPvnkE82ePVtDhgzRunXrNHjwYKtLQjcRwgAQ4b7//nvdfvvtWr16tRYtWqSLLrqILUcxguVoAIhQPp9Pjz/+uEaMGKHs7GyVlJToV7/6FQEcQ+iEASACffnll5oxY4ZOPPFErVixQgUFBVaXhBCgEwaACFJfX6/Zs2frwgsv1Jw5c7Rq1SoCOIYRwgAQAUzT1CuvvKJhw4bJ6/Vq27Ztuuaaa1h6jnEsRwOAxbZv365Zs2aprq5O//M//6Nx48ZZXRLChE4YACxy4MAB3XnnnTrrrLN00UUXad26dQRwD0MnDAAWePfddzVnzhyNHTtWW7ZsUVZWltUlwQKEMACE0Z49e3TLLbdo69atWrJkiSZPnmx1SbAQy9EAEAYej0cPPvigTjvtNI0ePVrFxcUEMOiEASDUPv30U82cOVM5OTn6/PPPlZeXZ3VJiBCEMACEyA8//KDf/e53+uijj/Too49q6tSpbDlCGyxHA0CQ+f1+LVmyRPn5+UpPT9dXX32liy++mADGUeiEASCINm7cqJkzZ8owDC1fvlyjRo2yuiREMDphAAgCl8ulW265Reeff76uv/56/etf/yKAcVyEMAB0g2maev311zVs2DA1NjZq27Ztuv7662UY/OcVx8dyNAB00ddff63Zs2fru+++0+uvv66zzjrL6pIQZfhVDQA66eDBg7rnnntUWFio888/Xxs2bCCA0SV0wgDQCcuWLdPNN9+sUaNGaePGjcrJybG6JEQxQhgAOqCyslJz587Vhg0btHjxYl1wwQVWl4QYwHI0APwIr9erhx9+WKNGjdKwYcO0detWAhhBQycMAO347LPPNHPmTPXp00dr1qzRySefbHVJiDGEMAAcoba2VvPnz9d7772nhQsX6vLLL2faFUKC5WgA+P/8fr+ef/55DR8+XCeeeKK++uor/eY3vyGAETJ0wgAgacuWLZo1a5bcbrfee+89nX766VaXhB6AThhAj7Z//37ddtttOvfcc3XllVeqqKiIAEbYEMIAeiTTNPXGG29o+PDh+uGHH7R161bNmDFDdrvd6tLQg7AcDaDHKS8v180336zdu3frlVde0aRJk6wuCT0UnTCAHqOlpUX33XefxowZo0mTJmnTpk0EMCxFJwygR/joo480a9YsDRs2TOvXr9fAgQOtLgkghAHEtu+++0633nqrioqK9Nhjj2nKlClWlwQEsBwNICb5fD4tXrxYI0eO1KBBg1RSUkIAI+LQCQOIOWvXrtWMGTOUnJysVatWafjw4VaXBBwTnTCAmFFXV6cZM2booosu0rx587RixQoCGBGNEAZgmc2bN2vSpElqbm7u1nlM09RLL72kYcOGyWazadu2bbrqqqsYN4mIZzNN07S6CAA9j8/n08iRI7Vz5079/ve/15///OcunaekpESzZs1SY2OjnnzySY0ZMybIlQKhQycMwBJPPPGEdu/eLa/Xq0ceeURff/11p45vamrSH/7wB5199tm65JJLtHbtWgIYUYcQBhB2VVVVuuOOO3TgwAFJh4ZoXHvtterowtw///lPDR8+XHv27NGWLVt08803M24SUYmnowGE3Y033qiWlpbA136/X5s2bdLSpUt16aWXtnvc7t279dvf/lY7duzQc889p/POOy8c5QIhQycMIKz+93//VytWrJDX623z/aamJs2YMUMul+uoY9xutx544AGdccYZGjNmjLZs2UIAIybwYBYQ4zwej1wul9xut3w+n0zTlM1mk91ul9PpVHJysuLi4sJSS1NTk3Jzc7V3795jvp6QkKBrr71WTzzxROB7K1eu1KxZszR48GAtXrxYubm5YakVCAdCGIghpmlq3759qq+vV21trRoaGuR2uwP3Sw//5966fcfn88npdColJUXp6elKTU1V7969Q7K9Z+7cuXr66ad18ODBdn/mhBNO0Geffab+/fvr9ttv16pVq/Too4/q3//939lyhJhDCAMxwO12q6KiQuXl5fJ6vTJNU36/v9PnMQxDNptNDodDubm5ysnJkdPpDEqNW7Zs0bhx4340gFtlZWUFHta65557lJSUFJQagEhDCANRrL6+XmVlZaqurpakLgVvewzj0CMjmZmZysvLU0pKSpfP5ff7NWrUKG3durXD1/7jH/+oe++9t8vXBKIBIQxEIa/Xq5KSElVWVgY1eNtjt9uVlZWl/Px8ORyd31Tx+OOPa/78+WpqaurwMUlJSSovL1efPn06fT0gWhDCQJSpqanRhg0b5PV6wxLArQzDUFxcnEaPHq2MjIwOH/fdd99p6NChnQpgSXI6nfr1r3+tv//9750tFYgahDAQJcLd/bbHMAxlZ2d3uCueMmWKli1bJo/H0+lrnXDCCfrwww911llndaVUIOIRwkAUcLvdKioqUlNTk6UB3Mow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\n",
"text/plain": [
"