{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 6. Robustness in biological circuits\n", "\n", "(c) 2019 Justin Bois and Michael Elowitz. With the exception of pasted graphics, where the source is noted, this work is licensed under a [Creative Commons Attribution License CC-BY 4.0](https://creativecommons.org/licenses/by/4.0/). All code contained herein is licensed under an [MIT license](https://opensource.org/licenses/MIT).\n", "\n", "This document was prepared at [Caltech](http://www.caltech.edu) with financial support from the [Donna and Benjamin M. Rosen Bioengineering Center](http://rosen.caltech.edu).\n", "\n", "\n", "\n", "
\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Design principles\n", "- The on-delay of the C1-FFL is robust to changes in the ratio of the Hill activation constants, $\\kappa$, in the regime when $\\kappa$ is order unity or greater.\n", "- Exact adaptation, such as that displayed by the chemotaxis circuit in _E. coli_, can be achieved through integral feedback.\n", "\n", "#### Techniques\n", "- Michaelis-Menten kinetics to model enzyme dynamics.\n", "\n", "#### Concepts\n", "- Robustness.\n", "- Exact adaptation.\n", "\n", "
\n", "\n", "
" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "tags": [ "remove_input" ] }, "outputs": [ { "data": { "text/html": [ "\n", "
\n", " \n", " Loading BokehJS ...\n", "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "\n", "(function(root) {\n", " function now() {\n", " return new Date();\n", " }\n", "\n", " var force = true;\n", "\n", " if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n", " root._bokeh_onload_callbacks = [];\n", " root._bokeh_is_loading = undefined;\n", " }\n", "\n", " var JS_MIME_TYPE = 'application/javascript';\n", " var HTML_MIME_TYPE = 'text/html';\n", " var EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n", " var CLASS_NAME = 'output_bokeh rendered_html';\n", "\n", " /**\n", " * Render data to the DOM node\n", " */\n", " function render(props, node) {\n", " var script = document.createElement(\"script\");\n", " node.appendChild(script);\n", " }\n", "\n", " /**\n", " * Handle when an output is cleared or removed\n", " */\n", " function handleClearOutput(event, handle) {\n", " var cell = handle.cell;\n", "\n", " var id = cell.output_area._bokeh_element_id;\n", " var server_id = cell.output_area._bokeh_server_id;\n", " // Clean up Bokeh references\n", " if (id != null && id in Bokeh.index) {\n", " Bokeh.index[id].model.document.clear();\n", " delete Bokeh.index[id];\n", " }\n", "\n", " if (server_id !== undefined) {\n", " // Clean up Bokeh references\n", " var cmd = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n", " cell.notebook.kernel.execute(cmd, {\n", " iopub: {\n", " output: function(msg) {\n", " var id = msg.content.text.trim();\n", " if (id in Bokeh.index) {\n", " Bokeh.index[id].model.document.clear();\n", " delete Bokeh.index[id];\n", " }\n", " }\n", " }\n", " });\n", " // Destroy server and session\n", " var cmd = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n", " cell.notebook.kernel.execute(cmd);\n", " }\n", " }\n", "\n", " /**\n", " * Handle when a new output is added\n", " */\n", " function handleAddOutput(event, handle) {\n", " var output_area = handle.output_area;\n", " var output = handle.output;\n", "\n", " // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n", " if ((output.output_type != \"display_data\") || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n", " return\n", " }\n", "\n", " var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n", "\n", " if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n", " toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n", " // store reference to embed id on output_area\n", " output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n", " }\n", " if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n", " var bk_div = document.createElement(\"div\");\n", " bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n", " var script_attrs = bk_div.children[0].attributes;\n", " for (var i = 0; i < script_attrs.length; i++) {\n", " toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n", " }\n", " // store reference to server id on output_area\n", " output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n", " }\n", " }\n", "\n", " function register_renderer(events, OutputArea) {\n", "\n", " function append_mime(data, metadata, element) {\n", " // create a DOM node to render to\n", " var toinsert = this.create_output_subarea(\n", " metadata,\n", " CLASS_NAME,\n", " EXEC_MIME_TYPE\n", " );\n", " this.keyboard_manager.register_events(toinsert);\n", " // Render to node\n", " var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n", " render(props, toinsert[toinsert.length - 1]);\n", " element.append(toinsert);\n", " return toinsert\n", " }\n", "\n", " /* Handle when an output is cleared or removed */\n", " events.on('clear_output.CodeCell', handleClearOutput);\n", " events.on('delete.Cell', handleClearOutput);\n", "\n", " /* Handle when a new output is added */\n", " events.on('output_added.OutputArea', handleAddOutput);\n", "\n", " /**\n", " * Register the mime type and append_mime function with output_area\n", " */\n", " OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n", " /* Is output safe? */\n", " safe: true,\n", " /* Index of renderer in `output_area.display_order` */\n", " index: 0\n", " });\n", " }\n", "\n", " // register the mime type if in Jupyter Notebook environment and previously unregistered\n", " if (root.Jupyter !== undefined) {\n", " var events = require('base/js/events');\n", " var OutputArea = require('notebook/js/outputarea').OutputArea;\n", "\n", " if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n", " register_renderer(events, OutputArea);\n", " }\n", " }\n", "\n", " \n", " if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n", " root._bokeh_timeout = Date.now() + 5000;\n", " root._bokeh_failed_load = false;\n", " }\n", "\n", " var NB_LOAD_WARNING = {'data': {'text/html':\n", " \"
\\n\"+\n", " \"

\\n\"+\n", " \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n", " \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n", " \"

\\n\"+\n", " \"\\n\"+\n", " \"\\n\"+\n", " \"from bokeh.resources import INLINE\\n\"+\n", " \"output_notebook(resources=INLINE)\\n\"+\n", " \"\\n\"+\n", " \"
\"}};\n", "\n", " function display_loaded() {\n", " var el = document.getElementById(\"1002\");\n", " if (el != null) {\n", " el.textContent = \"BokehJS is loading...\";\n", " }\n", " if (root.Bokeh !== undefined) {\n", " if (el != null) {\n", " el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n", " }\n", " } else if (Date.now() < root._bokeh_timeout) {\n", " setTimeout(display_loaded, 100)\n", " }\n", " }\n", "\n", "\n", " function run_callbacks() {\n", " try {\n", " root._bokeh_onload_callbacks.forEach(function(callback) {\n", " if (callback != null)\n", " callback();\n", " });\n", " } finally {\n", " delete root._bokeh_onload_callbacks\n", " }\n", " console.debug(\"Bokeh: all callbacks have finished\");\n", " }\n", "\n", " function load_libs(css_urls, js_urls, callback) {\n", " if (css_urls == null) css_urls = [];\n", " if (js_urls == null) js_urls = [];\n", "\n", " root._bokeh_onload_callbacks.push(callback);\n", " if (root._bokeh_is_loading > 0) {\n", " console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n", " return null;\n", " }\n", " if (js_urls == null || js_urls.length === 0) {\n", " run_callbacks();\n", " return null;\n", " }\n", " console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n", " root._bokeh_is_loading = css_urls.length + js_urls.length;\n", "\n", " function on_load() {\n", " root._bokeh_is_loading--;\n", " if (root._bokeh_is_loading === 0) {\n", " console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n", " run_callbacks()\n", " }\n", " }\n", "\n", " function on_error() {\n", " console.error(\"failed to load \" + url);\n", " }\n", "\n", " for (var i = 0; i < css_urls.length; i++) {\n", " var url = css_urls[i];\n", " const element = document.createElement(\"link\");\n", " element.onload = on_load;\n", " element.onerror = on_error;\n", " element.rel = \"stylesheet\";\n", " element.type = \"text/css\";\n", " element.href = url;\n", " console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n", " document.body.appendChild(element);\n", " }\n", "\n", " for (var i = 0; i < js_urls.length; i++) {\n", " var url = js_urls[i];\n", " var element = document.createElement('script');\n", " element.onload = on_load;\n", " element.onerror = on_error;\n", " element.async = false;\n", " element.src = url;\n", " console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", " document.head.appendChild(element);\n", " }\n", " };var element = document.getElementById(\"1002\");\n", " if (element == null) {\n", " console.error(\"Bokeh: ERROR: autoload.js configured with elementid '1002' but no matching script tag was found. \")\n", " return false;\n", " }\n", "\n", " function inject_raw_css(css) {\n", " const element = document.createElement(\"style\");\n", " element.appendChild(document.createTextNode(css));\n", " document.body.appendChild(element);\n", " }\n", "\n", " var js_urls = [\"https://cdn.pydata.org/bokeh/release/bokeh-1.1.0.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.1.0.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-tables-1.1.0.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-gl-1.1.0.min.js\"];\n", " var css_urls = [\"https://cdn.pydata.org/bokeh/release/bokeh-1.1.0.min.css\", \"https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.1.0.min.css\", \"https://cdn.pydata.org/bokeh/release/bokeh-tables-1.1.0.min.css\"];\n", "\n", " var inline_js = [\n", " function(Bokeh) {\n", " Bokeh.set_log_level(\"info\");\n", " },\n", " \n", " function(Bokeh) {\n", " \n", " },\n", " function(Bokeh) {} // ensure no trailing comma for IE\n", " ];\n", "\n", " function run_inline_js() {\n", " \n", " if ((root.Bokeh !== undefined) || (force === true)) {\n", " for (var i = 0; i < inline_js.length; i++) {\n", " inline_js[i].call(root, root.Bokeh);\n", " }if (force === true) {\n", " display_loaded();\n", " }} else if (Date.now() < root._bokeh_timeout) {\n", " setTimeout(run_inline_js, 100);\n", " } else if (!root._bokeh_failed_load) {\n", " console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n", " root._bokeh_failed_load = true;\n", " } else if (force !== true) {\n", " var cell = $(document.getElementById(\"1002\")).parents('.cell').data().cell;\n", " cell.output_area.append_execute_result(NB_LOAD_WARNING)\n", " }\n", "\n", " }\n", "\n", " if (root._bokeh_is_loading === 0) {\n", " console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n", " run_inline_js();\n", " } else {\n", " load_libs(css_urls, js_urls, function() {\n", " console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n", " run_inline_js();\n", " });\n", " }\n", "}(window));" ], "application/vnd.bokehjs_load.v0+json": "\n(function(root) {\n function now() {\n return new Date();\n }\n\n var force = true;\n\n if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n root._bokeh_onload_callbacks = [];\n root._bokeh_is_loading = undefined;\n }\n\n \n\n \n if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n var NB_LOAD_WARNING = {'data': {'text/html':\n \"
\\n\"+\n \"

\\n\"+\n \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n \"

\\n\"+\n \"\\n\"+\n \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"
\"}};\n\n function display_loaded() {\n var el = document.getElementById(\"1002\");\n if (el != null) {\n el.textContent = \"BokehJS is loading...\";\n }\n if (root.Bokeh !== undefined) {\n if (el != null) {\n el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(display_loaded, 100)\n }\n }\n\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls == null || js_urls.length === 0) {\n run_callbacks();\n return null;\n }\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = css_urls.length + js_urls.length;\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n\n function on_error() {\n console.error(\"failed to load \" + url);\n }\n\n for (var i = 0; i < css_urls.length; i++) {\n var url = css_urls[i];\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error;\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n }\n\n for (var i = 0; i < js_urls.length; i++) {\n var url = js_urls[i];\n var element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error;\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n };var element = document.getElementById(\"1002\");\n if (element == null) {\n console.error(\"Bokeh: ERROR: autoload.js configured with elementid '1002' but no matching script tag was found. \")\n return false;\n }\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n var js_urls = [\"https://cdn.pydata.org/bokeh/release/bokeh-1.1.0.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.1.0.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-tables-1.1.0.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-gl-1.1.0.min.js\"];\n var css_urls = [\"https://cdn.pydata.org/bokeh/release/bokeh-1.1.0.min.css\", \"https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.1.0.min.css\", \"https://cdn.pydata.org/bokeh/release/bokeh-tables-1.1.0.min.css\"];\n\n var inline_js = [\n function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\n \n function(Bokeh) {\n \n },\n function(Bokeh) {} // ensure no trailing comma for IE\n ];\n\n function run_inline_js() {\n \n if ((root.Bokeh !== undefined) || (force === true)) {\n for (var i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }if (force === true) {\n display_loaded();\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n } else if (force !== true) {\n var cell = $(document.getElementById(\"1002\")).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\n }\n\n }\n\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(css_urls, js_urls, function() {\n console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));" }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import scipy.integrate\n", "\n", "import biocircuits\n", "\n", "import bokeh.application\n", "import bokeh.application.handlers\n", "import bokeh.io\n", "import bokeh.models\n", "import bokeh.plotting\n", "\n", "bokeh.io.output_notebook()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The principle of robustness (demonstrated with the C1-FFL)\n", "\n", "You have likely heard the word robustness used in biological contexts, possibly even in the context of biological circuits. You may have a feeling for what is meant when we talk about robustness, but it is important to have a precise definition. We will begin with the following operational definition.\n", "\n", ">A property of a biological circuit is **robust** if it is nearly independent of the biochemical parameters that vary unavoidably from cell to cell or system to system." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Robustness and the C1-FFL\n", "\n", "Let us think about how we could apply this definition to a circuit we have already considered. In the previous lesson, we studied properties of feedforward loops (FFLs). We saw several properties of the C1-FFL, shown below, including its sign-sensitive delay and ability to filter out short input pulses.\n", "\n", "\n", "\n", "Stated as a design principle, **the C1-FFL with AND logic displays an on-delay.** We saw that this property of the C1-FFL holds even when the Hill coefficient for the regulation is unity. We might also ask how the Hill activation constants might affect the delay.\n", "\n", "As a reminder, the dimensionless dynamical equations for the concentrations of Y and Z from a stimulus X are\n", "\n", "\\begin{align}\n", "\\frac{\\mathrm{d}y}{\\mathrm{d}t} &= \\beta_y\\,\\frac{(\\kappa x)^{n_{xy}}}{1 + (\\kappa x)^{n_{xy}}} - y, \\\\[1em]\n", "\\gamma^{-1}\\frac{\\mathrm{d}z}{\\mathrm{d}t} &= \\frac{x^{n_{xz}} y^{n_{yz}}}{1 + x^{n_{xz}} y^{n_{yz}}} - z.\n", "\\end{align}\n", "\n", "To investigate the effect of the Hill activation constants, we need only to vary the dimensionless parameter $\\kappa$, which is the ratio of the Hill activation constant for activation of Z by X to the Hill activation constant for activation of Z by Y; $\\kappa = k_{xz}/k_{yz}$. Note that the dimensionless $\\beta_y$ was defined by $\\beta_y \\leftarrow \\beta_y/\\gamma_y k_{xy}$, so neither of the Hill activation constants in $\\kappa$ appear in other parameters. However, the dimensionless concentration of Y includes $k_{yz}$. Nonetheless, neither Hill activation constant appears in the nondimensionalziation of Z.\n", "\n", "We can use the functions we developed last time to investigate. " ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "tags": [ "remove_input" ] }, "outputs": [], "source": [ "def x_pulse(t, t_0, tau, x_0):\n", " \"\"\"\n", " Returns x value for a pulse beginning at t = 0 \n", " and ending at t = t_0 + tau.\n", " \"\"\"\n", " return np.logical_and(t >= t_0, t <= (t_0 + tau)) * x_0\n", "\n", "\n", "def c1ffl(yz, t, beta_y, kappa, gamma, n_xy, n_xz, n_yz, logic, x_fun, x_args):\n", " \"\"\"Right hand side of dynamics of C1-FFL\"\"\"\n", " # Unpack\n", " y, z = yz\n", " \n", " # Evaluate x\n", " x = x_fun(t, *x_args)\n", " \n", " # y-derivative\n", " dy_dt = beta_y * (kappa*x)**n_xy / (1 + (kappa*x)**n_xy) - y\n", "\n", " # z-derivative\n", " prod = biocircuits.aa_and if logic == 'and' else biocircuits.aa_or\n", " dz_dt = gamma * (prod(x, y, n_xz, n_yz) - z)\n", "\n", " return np.array([dy_dt, dz_dt])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We will use the same parameter values as in the last lesson, but we will vary $\\kappa$. We can then plot the time it takes the level of Z to reach half its steady state value versus $\\kappa$ to investigate how the robust the delay time is to variations in $\\kappa$. For reasons that will become clear in a moment, we will also plot the maximal Z-concentration." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "tags": [ "remove_input" ] }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function embed_document(root) {\n", " \n", " var docs_json = {\"511e36f8-8e72-4cae-b367-8187e05d92f3\":{\"roots\":{\"references\":[{\"attributes\":{\"children\":[{\"id\":\"1132\",\"type\":\"ToolbarBox\"},{\"id\":\"1130\",\"type\":\"GridBox\"}]},\"id\":\"1133\",\"type\":\"Column\"},{\"attributes\":{\"data_source\":{\"id\":\"1096\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"1097\",\"type\":\"Circle\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"1098\",\"type\":\"Circle\"},\"selection_glyph\":null,\"view\":{\"id\":\"1100\",\"type\":\"CDSView\"}},\"id\":\"1099\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"source\":{\"id\":\"1096\",\"type\":\"ColumnDataSource\"}},\"id\":\"1100\",\"type\":\"CDSView\"},{\"attributes\":{\"children\":[[{\"id\":\"1003\",\"subtype\":\"Figure\",\"type\":\"Plot\"},0,0],[{\"id\":\"1064\",\"subtype\":\"Figure\",\"type\":\"Plot\"},0,1]]},\"id\":\"1130\",\"type\":\"GridBox\"},{\"attributes\":{\"fill_color\":{\"value\":\"#1f77b4\"},\"line_color\":{\"value\":\"#1f77b4\"},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1102\",\"type\":\"Circle\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"#1f77b4\"},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"#1f77b4\"},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1103\",\"type\":\"Circle\"},{\"attributes\":{\"data_source\":{\"id\":\"1101\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"1102\",\"type\":\"Circle\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"1103\",\"type\":\"Circle\"},\"selection_glyph\":null,\"view\":{\"id\":\"1105\",\"type\":\"CDSView\"}},\"id\":\"1104\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"source\":{\"id\":\"1101\",\"type\":\"ColumnDataSource\"}},\"id\":\"1105\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"1115\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"1116\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"text\":\"\"},\"id\":\"1119\",\"type\":\"Title\"},{\"attributes\":{\"ticker\":null},\"id\":\"1121\",\"type\":\"LogTickFormatter\"},{\"attributes\":{\"ticker\":null},\"id\":\"1123\",\"type\":\"LogTickFormatter\"},{\"attributes\":{\"bottom_units\":\"screen\",\"fill_alpha\":{\"value\":0.5},\"fill_color\":{\"value\":\"lightgrey\"},\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":{\"value\":1.0},\"line_color\":{\"value\":\"black\"},\"line_dash\":[4,4],\"line_width\":{\"value\":2},\"render_mode\":\"css\",\"right_units\":\"screen\",\"top_units\":\"screen\"},\"id\":\"1124\",\"type\":\"BoxAnnotation\"},{\"attributes\":{},\"id\":\"1125\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"1126\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"callback\":null},\"id\":\"1004\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"1127\",\"type\":\"Selection\"},{\"attributes\":{\"callback\":null},\"id\":\"1006\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"1128\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"tools\":[{\"id\":\"1022\",\"type\":\"PanTool\"},{\"id\":\"1023\",\"type\":\"WheelZoomTool\"},{\"id\":\"1024\",\"type\":\"BoxZoomTool\"},{\"id\":\"1025\",\"type\":\"SaveTool\"},{\"id\":\"1026\",\"type\":\"ResetTool\"},{\"id\":\"1027\",\"type\":\"HelpTool\"},{\"id\":\"1083\",\"type\":\"PanTool\"},{\"id\":\"1084\",\"type\":\"WheelZoomTool\"},{\"id\":\"1085\",\"type\":\"BoxZoomTool\"},{\"id\":\"1086\",\"type\":\"SaveTool\"},{\"id\":\"1087\",\"type\":\"ResetTool\"},{\"id\":\"1088\",\"type\":\"HelpTool\"}]},\"id\":\"1131\",\"type\":\"ProxyToolbar\"},{\"attributes\":{},\"id\":\"1008\",\"type\":\"LogScale\"},{\"attributes\":{\"toolbar\":{\"id\":\"1131\",\"type\":\"ProxyToolbar\"},\"toolbar_location\":\"above\"},\"id\":\"1132\",\"type\":\"ToolbarBox\"},{\"attributes\":{},\"id\":\"1010\",\"type\":\"LinearScale\"},{\"attributes\":{\"axis_label\":\"\\u03ba\",\"formatter\":{\"id\":\"1045\",\"type\":\"LogTickFormatter\"},\"ticker\":{\"id\":\"1013\",\"type\":\"LogTicker\"}},\"id\":\"1012\",\"type\":\"LogAxis\"},{\"attributes\":{\"num_minor_ticks\":10},\"id\":\"1013\",\"type\":\"LogTicker\"},{\"attributes\":{\"ticker\":{\"id\":\"1013\",\"type\":\"LogTicker\"}},\"id\":\"1016\",\"type\":\"Grid\"},{\"attributes\":{\"axis_label\":\"time to half max\",\"formatter\":{\"id\":\"1043\",\"type\":\"BasicTickFormatter\"},\"ticker\":{\"id\":\"1018\",\"type\":\"BasicTicker\"}},\"id\":\"1017\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1018\",\"type\":\"BasicTicker\"},{\"attributes\":{\"dimension\":1,\"ticker\":{\"id\":\"1018\",\"type\":\"BasicTicker\"}},\"id\":\"1021\",\"type\":\"Grid\"},{\"attributes\":{\"below\":[{\"id\":\"1012\",\"type\":\"LogAxis\"}],\"center\":[{\"id\":\"1016\",\"type\":\"Grid\"},{\"id\":\"1021\",\"type\":\"Grid\"},{\"id\":\"1047\",\"type\":\"Legend\"}],\"left\":[{\"id\":\"1017\",\"type\":\"LinearAxis\"}],\"plot_height\":200,\"plot_width\":300,\"renderers\":[{\"id\":\"1038\",\"type\":\"GlyphRenderer\"},{\"id\":\"1052\",\"type\":\"GlyphRenderer\"}],\"title\":{\"id\":\"1041\",\"type\":\"Title\"},\"toolbar\":{\"id\":\"1028\",\"type\":\"Toolbar\"},\"toolbar_location\":null,\"x_range\":{\"id\":\"1004\",\"type\":\"DataRange1d\"},\"x_scale\":{\"id\":\"1008\",\"type\":\"LogScale\"},\"y_range\":{\"id\":\"1006\",\"type\":\"DataRange1d\"},\"y_scale\":{\"id\":\"1010\",\"type\":\"LinearScale\"}},\"id\":\"1003\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[200]},\"y\":[2.546273136568284,2.546273136568284,2.546273136568284,2.546273136568284,2.546273136568284,2.546273136568284,2.546273136568284,2.546273136568284,2.546273136568284,2.546273136568284,2.546273136568284,2.546273136568284,2.546273136568284,2.546273136568284,2.546273136568284,2.546273136568284,2.546273136568284,2.546273136568284,2.546273136568284,2.546273136568284,2.546273136568284,2.546273136568284,2.546273136568284,2.546273136568284,2.546273136568284,2.546273136568284,2.541270635317659,2.541270635317659,2.541270635317659,2.541270635317659,2.541270635317659,2.541270635317659,2.541270635317659,2.541270635317659,2.541270635317659,2.541270635317659,2.5362681340670337,2.5362681340670337,2.5362681340670337,2.531265632816408,2.526263131565783,2.5212606303151577,2.511255627813907,2.501250625312656,2.4912456228114057,2.4762381190595297,2.451225612806403,2.4262131065532766,2.3961980990495246,2.3561780890445223,2.3111555777888944,2.2611305652826412,2.2011005502751373,2.141070535267634,2.0710355177588795,2.001000500250125,1.9309654827413707,1.855927963981991,1.7858929464732365,1.7208604302151076,1.6558279139569785,1.5957978989494748,1.5407703851925962,1.485742871435718,1.44072036018009,1.3956978489244622,1.3556778389194597,1.3206603301650826,1.2856428214107054,1.2606303151575788,1.2306153076538269,1.2106053026513257,1.1855927963981991,1.1655827913956978,1.1505752876438218,1.135567783891946,1.12056028014007,1.105552776388194,1.0955477738869435,1.0855427713856929,1.075537768884442,1.070535267633817,1.0605302651325663,1.055527763881941,1.0505252626313157,1.0455227613806903,1.040520260130065,1.0355177588794398,1.0305152576288144,1.0255127563781892,1.0255127563781892,1.0205102551275638,1.0155077538769384,1.0155077538769384,1.0155077538769384,1.0105052526263132,1.0105052526263132,1.0105052526263132,1.0055027513756878,1.0055027513756878,1.0055027513756878,1.0055027513756878,1.0005002501250626,1.0005002501250626,1.0005002501250626,1.0005002501250626,1.0005002501250626,1.0005002501250626,1.0005002501250626,1.0005002501250626,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372,0.9954977488744372]},\"selected\":{\"id\":\"1115\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"1116\",\"type\":\"UnionRenderers\"}},\"id\":\"1049\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"fill_color\":{\"value\":\"orange\"},\"line_color\":{\"value\":\"orange\"},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1036\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"1022\",\"type\":\"PanTool\"},{\"attributes\":{},\"id\":\"1023\",\"type\":\"WheelZoomTool\"},{\"attributes\":{\"overlay\":{\"id\":\"1046\",\"type\":\"BoxAnnotation\"}},\"id\":\"1024\",\"type\":\"BoxZoomTool\"},{\"attributes\":{},\"id\":\"1025\",\"type\":\"SaveTool\"},{\"attributes\":{},\"id\":\"1026\",\"type\":\"ResetTool\"},{\"attributes\":{},\"id\":\"1027\",\"type\":\"HelpTool\"},{\"attributes\":{\"active_drag\":\"auto\",\"active_inspect\":\"auto\",\"active_multi\":null,\"active_scroll\":\"auto\",\"active_tap\":\"auto\",\"tools\":[{\"id\":\"1022\",\"type\":\"PanTool\"},{\"id\":\"1023\",\"type\":\"WheelZoomTool\"},{\"id\":\"1024\",\"type\":\"BoxZoomTool\"},{\"id\":\"1025\",\"type\":\"SaveTool\"},{\"id\":\"1026\",\"type\":\"ResetTool\"},{\"id\":\"1027\",\"type\":\"HelpTool\"}]},\"id\":\"1028\",\"type\":\"Toolbar\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"#1f77b4\"},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"#1f77b4\"},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1037\",\"type\":\"Circle\"},{\"attributes\":{\"data_source\":{\"id\":\"1035\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"1036\",\"type\":\"Circle\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"1037\",\"type\":\"Circle\"},\"selection_glyph\":null,\"view\":{\"id\":\"1039\",\"type\":\"CDSView\"}},\"id\":\"1038\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"source\":{\"id\":\"1035\",\"type\":\"ColumnDataSource\"}},\"id\":\"1039\",\"type\":\"CDSView\"},{\"attributes\":{\"text\":\"\"},\"id\":\"1041\",\"type\":\"Title\"},{\"attributes\":{},\"id\":\"1043\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"ticker\":null},\"id\":\"1045\",\"type\":\"LogTickFormatter\"},{\"attributes\":{\"bottom_units\":\"screen\",\"fill_alpha\":{\"value\":0.5},\"fill_color\":{\"value\":\"lightgrey\"},\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":{\"value\":1.0},\"line_color\":{\"value\":\"black\"},\"line_dash\":[4,4],\"line_width\":{\"value\":2},\"render_mode\":\"css\",\"right_units\":\"screen\",\"top_units\":\"screen\"},\"id\":\"1046\",\"type\":\"BoxAnnotation\"},{\"attributes\":{\"items\":[{\"id\":\"1048\",\"type\":\"LegendItem\"},{\"id\":\"1063\",\"type\":\"LegendItem\"}]},\"id\":\"1047\",\"type\":\"Legend\"},{\"attributes\":{\"below\":[{\"id\":\"1073\",\"type\":\"LogAxis\"}],\"center\":[{\"id\":\"1077\",\"type\":\"Grid\"},{\"id\":\"1082\",\"type\":\"Grid\"}],\"left\":[{\"id\":\"1078\",\"type\":\"LogAxis\"}],\"plot_height\":200,\"plot_width\":300,\"renderers\":[{\"id\":\"1099\",\"type\":\"GlyphRenderer\"},{\"id\":\"1104\",\"type\":\"GlyphRenderer\"}],\"title\":{\"id\":\"1119\",\"type\":\"Title\"},\"toolbar\":{\"id\":\"1089\",\"type\":\"Toolbar\"},\"toolbar_location\":null,\"x_range\":{\"id\":\"1065\",\"type\":\"DataRange1d\"},\"x_scale\":{\"id\":\"1069\",\"type\":\"LogScale\"},\"y_range\":{\"id\":\"1067\",\"type\":\"DataRange1d\"},\"y_scale\":{\"id\":\"1071\",\"type\":\"LogScale\"}},\"id\":\"1064\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{\"fill_color\":{\"value\":\"#1f77b4\"},\"line_color\":{\"value\":\"#1f77b4\"},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1050\",\"type\":\"Circle\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"#1f77b4\"},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"#1f77b4\"},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1051\",\"type\":\"Circle\"},{\"attributes\":{\"data_source\":{\"id\":\"1049\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"1050\",\"type\":\"Circle\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"1051\",\"type\":\"Circle\"},\"selection_glyph\":null,\"view\":{\"id\":\"1053\",\"type\":\"CDSView\"}},\"id\":\"1052\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"label\":{\"value\":\"y\"},\"renderers\":[{\"id\":\"1038\",\"type\":\"GlyphRenderer\"}]},\"id\":\"1048\",\"type\":\"LegendItem\"},{\"attributes\":{\"source\":{\"id\":\"1049\",\"type\":\"ColumnDataSource\"}},\"id\":\"1053\",\"type\":\"CDSView\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[200]},\"y\":[0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184,0.6953476738369184]},\"selected\":{\"id\":\"1061\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"1062\",\"type\":\"UnionRenderers\"}},\"id\":\"1035\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"1061\",\"type\":\"Selection\"},{\"attributes\":{\"label\":{\"value\":\"z\"},\"renderers\":[{\"id\":\"1052\",\"type\":\"GlyphRenderer\"}]},\"id\":\"1063\",\"type\":\"LegendItem\"},{\"attributes\":{},\"id\":\"1062\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[200]},\"y\":[0.004994776784489828,0.0055423597329103,0.006149897991159051,0.006823943414373099,0.007571753898268371,0.008401377858456464,0.00932172851715438,0.010342695462481885,0.011475227642405316,0.012731457087008428,0.014124820357300852,0.01567019310768499,0.017384059882541828,0.01928464402343899,0.021392121873651422,0.023728817973157703,0.026319409904097143,0.029191166401508525,0.032374224825789125,0.03590185612978712,0.03981080354132459,0.044141556731638866,0.04893878701388302,0.05425165438229499,0.06013429517230722,0.06664620820552106,0.07385276698566874,0.08182562011420207,0.09064338982651696,0.10039197610354732,0.11116525953438729,0.12306559718122188,0.13620442359923465,0.15070261839971963,0.16669116536532852,0.18431148028621822,0.20371592633290078,0.22506781420842292,0.24854157419187795,0.274323011751325,0.3026084158006108,0.33360439997302105,0.3675268829037501,0.4045996597066539,0.44505269832486727,0.48911986326841955,0.5370358926235316,0.5890329370555595,0.6453364335311959,0.7061602442140928,0.7717007542380914,0.8421311581421802,0.9175944605737507,0.9981965084063077,1.0839985861355,1.1750102816069827,1.2711826763735081,1.3724021712364782,1.4784853528497852,1.5891762734065842,1.7041436095977374,1.8229826222200283,1.9452173403437936,2.070306792258797,2.197652910069953,2.326610977041572,2.4565023508774955,2.586628564682261,2.716285680451549,2.844780451093854,2.9714439862493873,3.095645694201859,3.2168055808455525,3.334403282642371,3.447986638620126,3.5571747069640103,3.6616615254620624,3.7612155095199475,3.855676764122774,3.944954571523688,4.029019582575322,4.1078994546378205,4.181671471784375,4.250454228936349,4.314402073756811,4.373696253116759,4.4285399172077975,4.47915108976135,4.52575822722045,4.5685945294447174,4.607895019047635,4.643892405528151,4.676814825965975,4.706883815447226,4.734312034093274,4.759302942404197,4.782049348806293,4.802733245288258,4.821525359145341,4.838585393503362,4.854061990548185,4.868093018509126,4.880806072143615,4.892318795922727,4.902739558996645,4.912167866418324,4.920694778204312,4.9284037229887545,4.935371182025026,4.941666431298026,4.9473527807481545,4.952487987693681,4.957124500088676,4.9613099330854835,4.965087234953396,4.968496325361753,4.971572079880338,4.97434691269299,4.976849968981162,4.979107620520193,4.981143725170244,4.9829800298546605,4.984635775902277,4.986128749019662,4.987474817764825,4.988688367754339,4.989782386404852,4.990768568607966,4.991657746262767,4.9924591840238906,4.993181531479608,4.993832635847075,4.994419501852477,4.994948440235534,4.995425118179843,4.995854813477375,4.996241917251443,4.996591006901731,4.996905413769118,4.997188904471693,4.997444328725373,4.997674621496791,4.997881943607031,4.9980689931138125,4.998237475926698,4.99838930124237,4.998526083617899,4.998649382609404,4.9987604302217905,4.998860579279935,4.998950822012219,4.99903212993808,4.999105389881776,4.999171402644389,4.999230588205841,4.999284499497861,4.999332752541352,4.999376335435356,4.999415539477456,4.99945089742036,4.999482722390968,4.999511374921657,4.999537293265017,4.999560495022489,4.9995816006707,4.9996005592332375,4.9996175760539225,4.999632962214303,4.999646821052085,4.999659271248923,4.9996705302506355,4.999680624586099,4.999689776392345,4.999698036856808,4.999705418917188,4.999712060739053,4.9997181443692575,4.999723500046333,4.999728184584365,4.9997328342229475,4.999736819686331,4.999740235648216,4.999743549061353,4.999746482445902,4.999749125050604,4.999751181475574,4.999753635114697,4.999755551171934,4.999757276624317,4.99975876616671,4.999760201454185,4.9997614886688195,4.999762629936566,4.999763423939415,4.999764551139432,4.9997653267747815,4.999766073050601,4.99976683334416,4.999767421806154,4.999767918388249]},\"selected\":{\"id\":\"1125\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"1126\",\"type\":\"UnionRenderers\"}},\"id\":\"1096\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"callback\":null},\"id\":\"1065\",\"type\":\"DataRange1d\"},{\"attributes\":{\"callback\":null},\"id\":\"1067\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"1069\",\"type\":\"LogScale\"},{\"attributes\":{},\"id\":\"1071\",\"type\":\"LogScale\"},{\"attributes\":{\"axis_label\":\"\\u03ba\",\"formatter\":{\"id\":\"1123\",\"type\":\"LogTickFormatter\"},\"ticker\":{\"id\":\"1074\",\"type\":\"LogTicker\"}},\"id\":\"1073\",\"type\":\"LogAxis\"},{\"attributes\":{\"num_minor_ticks\":10},\"id\":\"1074\",\"type\":\"LogTicker\"},{\"attributes\":{\"ticker\":{\"id\":\"1074\",\"type\":\"LogTicker\"}},\"id\":\"1077\",\"type\":\"Grid\"},{\"attributes\":{\"axis_label\":\"steady state level\",\"formatter\":{\"id\":\"1121\",\"type\":\"LogTickFormatter\"},\"ticker\":{\"id\":\"1079\",\"type\":\"LogTicker\"}},\"id\":\"1078\",\"type\":\"LogAxis\"},{\"attributes\":{\"num_minor_ticks\":10},\"id\":\"1079\",\"type\":\"LogTicker\"},{\"attributes\":{\"dimension\":1,\"ticker\":{\"id\":\"1079\",\"type\":\"LogTicker\"}},\"id\":\"1082\",\"type\":\"Grid\"},{\"attributes\":{\"fill_color\":{\"value\":\"orange\"},\"line_color\":{\"value\":\"orange\"},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1097\",\"type\":\"Circle\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[200]},\"y\":[1.244643044645759e-07,1.7005174285975333e-07,2.3232750472381008e-07,3.173957963198765e-07,4.3359683841681696e-07,5.923090267424153e-07,8.090683845604425e-07,1.1050890515457772e-06,1.5093126347001384e-06,2.061249397378436e-06,2.8147796794373924e-06,3.843423274597633e-06,5.2474486023443314e-06,7.1635565529678125e-06,9.778090154452504e-06,1.3345032836282493e-05,1.8210316575304244e-05,2.4845086615513935e-05,3.3890687461985087e-05,4.6219765473113456e-05,6.301911750152235e-05,8.590185766071055e-05,0.00011705922569897835,0.00015946546133177646,0.0002171547450687719,0.0002955935182970756,0.000402181764329393,0.0005469243524428366,0.000743330993770672,0.0010096134102084288,0.0013702776553298087,0.0018582281530987242,0.0025175349814960052,0.0034070359134016413,0.0046049999203095745,0.006215069980111753,0.008373733617027708,0.01125947894003643,0.015103696544006898,0.020203089324943323,0.02693271795924587,0.035758127994590154,0.04724345066182295,0.06205071223862541,0.08092355118133102,0.10464696918928079,0.13397495407470184,0.1695219928645959,0.21162441094172038,0.2601930562916793,0.31459585907715376,0.37361823112953574,0.435537439591685,0.49831458434289083,0.5598628446457836,0.6183196216331187,0.6722508581666398,0.7207467717765703,0.7634102912538606,0.8002703662624612,0.8316602304179771,0.8580974226923513,0.8801834160095134,0.8985318869383715,0.9137230303747513,0.926279006549312,0.9366542818867258,0.9452352120162377,0.9523446416344249,0.9582495413529833,0.963168607381793,0.9672801551450292,0.9707292323523046,0.9736334525086932,0.9760884863931001,0.9781717691647519,0.9799464182521531,0.9814638908996831,0.9827661354403574,0.9838877997441703,0.9848570644466509,0.985697334942629,0.9864280692227845,0.9870652822214372,0.9876225449737722,0.9881110339550163,0.9885402858503313,0.9889182629220062,0.9892518158385287,0.9895466600647282,0.9898077741638313,0.9900393594955558,0.9902450473223873,0.990428012620346,0.9905909149305095,0.990736143880756,0.9908657368927627,0.9909814923937004,0.9910849603628831,0.991177527053247,0.9912604010589671,0.9913346363805381,0.9914011750469306,0.9914608354728415,0.9915143628096209,0.9915624147928447,0.9916055470005726,0.9916442751879267,0.9916791114157149,0.9917104131434931,0.9917385360205154,0.9917638248851043,0.9917865745774564,0.991807043028138,0.9918254068556708,0.9918420162876351,0.9918569251411982,0.9918703444066335,0.9918824229816342,0.9918932937308469,0.9919030762980888,0.9919119125713822,0.9919198473774324,0.9919269998830629,0.9919334378184363,0.9919392326484541,0.9919444481205034,0.9919491357197643,0.9919533966278533,0.9919572202693822,0.9919606547965262,0.9919637521417934,0.9919665443184011,0.9919690586642159,0.9919713148817495,0.9919733638753807,0.9919751784181735,0.9919768566079147,0.9919783288900639,0.9919796840338665,0.9919808936585772,0.9919820048173394,0.991982963665188,0.9919838705721864,0.9919846718892659,0.9919853930022138,0.9919860357144716,0.9919866223071749,0.9919871384510061,0.9919876193307445,0.9919880516040525,0.991988438582313,0.9919887854843886,0.9919890973195018,0.9919893187539282,0.9919896329504286,0.9919898510811921,0.9919900677143764,0.9919902491822211,0.9919904187690303,0.9919905643267676,0.9919906904563542,0.9919908237968244,0.9919909134834805,0.991991033649778,0.9919911300403973,0.9919912036238812,0.9919912802816431,0.9919913482187185,0.9919914018783568,0.9919914581781584,0.9919914987479534,0.9919915463664055,0.9919915919989002,0.9919916209192611,0.9919916449585156,0.9919916861949079,0.991991698292502,0.9919916811215199,0.9919917506462675,0.9919917727509358,0.9919917578772475,0.9919917911571694,0.9919918107604438,0.9919918282907736,0.991991779636117,0.991991854958148,0.9919918643143093,0.9919918725246107,0.9919918669731183,0.9919918804344321,0.9919918913489217,0.9919918974847225,0.9919918565065179,0.9919919012719624,0.9919918939738563,0.9919918967921973,0.9919919167569824,0.9919919155726641,0.9919919078224949]},\"selected\":{\"id\":\"1127\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"1128\",\"type\":\"UnionRenderers\"}},\"id\":\"1101\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"1083\",\"type\":\"PanTool\"},{\"attributes\":{},\"id\":\"1084\",\"type\":\"WheelZoomTool\"},{\"attributes\":{\"overlay\":{\"id\":\"1124\",\"type\":\"BoxAnnotation\"}},\"id\":\"1085\",\"type\":\"BoxZoomTool\"},{\"attributes\":{},\"id\":\"1086\",\"type\":\"SaveTool\"},{\"attributes\":{},\"id\":\"1087\",\"type\":\"ResetTool\"},{\"attributes\":{},\"id\":\"1088\",\"type\":\"HelpTool\"},{\"attributes\":{\"active_drag\":\"auto\",\"active_inspect\":\"auto\",\"active_multi\":null,\"active_scroll\":\"auto\",\"active_tap\":\"auto\",\"tools\":[{\"id\":\"1083\",\"type\":\"PanTool\"},{\"id\":\"1084\",\"type\":\"WheelZoomTool\"},{\"id\":\"1085\",\"type\":\"BoxZoomTool\"},{\"id\":\"1086\",\"type\":\"SaveTool\"},{\"id\":\"1087\",\"type\":\"ResetTool\"},{\"id\":\"1088\",\"type\":\"HelpTool\"}]},\"id\":\"1089\",\"type\":\"Toolbar\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"#1f77b4\"},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"#1f77b4\"},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1098\",\"type\":\"Circle\"}],\"root_ids\":[\"1133\"]},\"title\":\"Bokeh Application\",\"version\":\"1.1.0\"}};\n", " var render_items = [{\"docid\":\"511e36f8-8e72-4cae-b367-8187e05d92f3\",\"roots\":{\"1133\":\"0e307044-020d-4473-84e0-b317785a163a\"}}];\n", " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", "\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " var attempts = 0;\n", " var timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " clearInterval(timer);\n", " }\n", " attempts++;\n", " if (attempts > 100) {\n", " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", " clearInterval(timer);\n", " }\n", " }, 10, root)\n", " }\n", "})(window);" ], "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "1133" } }, "output_type": "display_data" } ], "source": [ "# Parameter values\n", "beta_y = 5\n", "gamma = 1\n", "n_xy, n_yz = 3, 3\n", "n_xz = 5\n", "logic = 'and'\n", "x_args = (0, 10, 1)\n", "t = np.linspace(0, 10, 2000)\n", "\n", "# Initial condition\n", "yz0 = np.array([0, 0])\n", "\n", "# Solve for delays\n", "y_delay = []\n", "y_max = []\n", "z_delay = []\n", "z_max = []\n", "kappa = np.logspace(-1, 2, 200)\n", "for kap in kappa:\n", " args = (beta_y, kap, gamma, n_xy, n_xz, n_yz, logic, x_pulse, x_args)\n", " y, z = scipy.integrate.odeint(c1ffl, yz0, t, args).transpose()\n", "\n", " # Store the delays and max's\n", " y_max.append(y.max())\n", " y_delay.append(t[np.nonzero(y > 0.5*y.max())[0][0]])\n", " z_max.append(z.max())\n", " z_delay.append(t[np.nonzero(z > 0.5*z.max())[0][0]])\n", "\n", "# Plot the results\n", "p1 = bokeh.plotting.figure(width=300, height=200, \n", " x_axis_label='κ',\n", " y_axis_label='time to half max',\n", " x_axis_type='log')\n", "p1.circle(kappa, y_delay, color='orange', legend='y')\n", "p1.circle(kappa, z_delay, legend='z')\n", "\n", "p2 = bokeh.plotting.figure(width=300, height=200, \n", " x_axis_label='κ',\n", " y_axis_label='steady state level',\n", " x_axis_type='log',\n", " y_axis_type='log')\n", "p2.circle(kappa, y_max, color='orange')\n", "p2.circle(kappa, z_max)\n", "\n", "bokeh.io.show(bokeh.layouts.gridplot([p1, p2], ncols=2))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Apparently for small $\\kappa$, the delay time is longer. However, for small $\\kappa$, we also see that the response of $z$ very rapidly drops to zero. With $\\kappa = 0.1$, the response is seven orders of magnitude smaller than for $\\kappa = 1$. This falls off far more rapidly than the steady state level of $y$. So, we really do not have any response of Z below $\\kappa \\approx 0.5$. As $\\kappa$ gets large, the delay time is nonzero and invariant to $\\kappa$, as is the steady state. In this regime of large $\\kappa$, regardless the magnitude of $\\kappa$, it takes Z about 50% longer to reach its steady state than Y. So, we can say **The on-delay of the C1-FFL is robust to changes in the ratio of the Hill activation constants, $\\kappa$, in the regime when $\\kappa$ is order unity or greater.**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### How to make statements about robustness\n", "\n", "The structure of the above statement about a robustness property of the C1-FFL has the following form.\n", "\n", ">Property X of the system is robust \n", ">to variations in Y \n", ">in operating regime Z.\n", "\n", "To fully specify what we mean by robustness in a given context, we must specify\n", "\n", "1. The property (X);\n", "2. What is variations the property is robust to (Y);\n", "3. In what regime Z the robustness holds.\n", "\n", "Any other statement about robustness is incomplete. Never say, \"The C1-FFL is robust.\" That means nothing." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Anti-robustness: Fine-tuned\n", "\n", "A system that is _not_ robust is said to be **fine-tuned**. A fine-tuned property of a circuit requires precise adjustment of biochemical parameters to maintain its function. Just like robustness, we need to define X, Y, and Z as above: what property we are talking about, what parameter variations with destroy its function, and in what regime these variations have that effect." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Why it is good to be robust\n", "\n", "For a living organism robustness if important to ensure that component work reliably in the face of the inevitable variations it will face. We will talk more about stochastic noise in future lessons, but it is also important to note that circuits may be robust to parameter variations that occur due to random mutation over generations.\n", "\n", "For a bioengineer, robustness is a key concept in identifying effective circuit architectures. If the properties we are trying to design in a circuit are robust, there is more \"slop\" in the design." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## A case study in robustness: _E. coli_ chemostaxis\n", "\n", "To demonstrate how we assess robustness of biological circuits, we will now perform a case study on the Che system of _E. coli_, largely based on Chapter 7 of Alon's book.\n", "\n", "When flagellated, _E. coli_ can swim toward attractants and away from repellents. Ideally, they swim up (in the case of attractants) the _gradient_ in attractant concentration. This means that the bacteria perform a differentiation calculation, measuring the _change_ in attractant concentrations as they move through space as opposed to the absolute level of attractant concentration.\n", "\n", "To understand how this is accomplished, we must first understand how _E. coli_ swim. Their flagellar motors spin in an anticlockwise direction when they are being propelled forward in a so-called \"run.\" Occasionally, a few of the motors switch to a clockwise rotation, which causes the bacterium to stall and spin in a so-called \"tumble.\" When the motors switch to spinning anticlockwise, the bacterium runs again in a new, random direction.\n", "\n", "If a bacterium is swimming up a gradient of attractant, its switching frequency decreases and it continues up the gradient. If however, there is no _gradient_, but perhaps a more uniform concentration of attractant, the switching frequency should return back to the level it was before detecting the gradient. This leads to a statement about robustness: **The steady state tumbling frequency of the Che system is robust to variations in _total_ attractant concentration.** It turns out that the operating regime over five orders of magnitude of total attractant concentration!\n", "\n", "The switching frequency is controlled by the Che system, shown in the image below.\n", "\n", "
\n", "\n", "
\n", "\n", "The CheA receptor is complex, which we shall call X, is autophosporylated. Attractant serves to inhibit autophosphorylation of CheA, which in turn inhibits the phosphorylation of CheY. This then leads to a decrease in tumbling rate.\n", "\n", "We will focus on the mechanism of CheA phosphorylation in response to attractants, shown in the orange box in the above figure. To enable the steady state tumbling frequency to be invariant to total attractant concentration, we always want the level of phosphorylated CheA to return to the same steady state _regardless of the attractant concentration_. This feature of a circuit, wherein it returns to the same steady state after an adjustment of its input (in this case, the attractant concentration) is called **exact adaptation**.\n", "\n", "We will be focusing on the exact adaptation aspects of this circuit. For a beautiful description of how swimming bacteria compute gradients for foraging, you should read the classic paper by Berg and Purcell." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### The CheA circuit\n", "\n", "\n", "The CheA receptor can exist in methylated and demethylated states. The methylation state is controlled by the methylating enzyme CheR and the demthylating enzyme CheB. Furthermore, the CheA receptor can have an active conformation and an inative conformation. The presence of attractant pushes the CheE receptor toward the inactive state. A schematic for a possible mechanism for this is shown in the image below.\n", "\n", "
\n", "\n", "
\n", "\n", "\n", "The combination of being in the active and methylated state results in a much more active receptor, so we will be most interested in the concentration of $X_m^*$. We will model all of the enzyme kinetics using Michaelis-Menten kinetics, and we pause for a moment to work out the mathematical expressions." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Aside: Michaelis-Menten kinetics\n", "\n", "At the heart of a Michaelis-Menten description of enzyme kinetics is the following set of chemical reactions between the enzyme E and substrate S to give product P.\n", "\n", "\\begin{align}\n", "E + S \\stackrel{k}{\\rightleftharpoons} ES \\stackrel{v}\\rightarrow P + E.\n", "\\end{align}\n", "\n", "The idea is that the enzyme reversibly binds the substrate with binding rate constant $k_+$ and unbinding rate constant $k_-$. When bound, the enzyme can serve to convert the substrate to product with rate constant $v$ Applying mass action kinetics, we can write the dynamics as a system of ordinary differential equations.\n", "\n", "\\begin{align}\n", "\\frac{\\mathrm{d}c_e}{\\mathrm{d}t} &= -\\frac{\\mathrm{d}c_{es}}{\\mathrm{d}t} = -k_+c_e c_s + (k_- + v)c_{es},\\\\[1em]\n", "\\frac{\\mathrm{d}c_s}{\\mathrm{d}t} &= -k_+c_sc_e + k_-c_{es},\\\\[1em]\n", "\\frac{\\mathrm{d}c_p}{\\mathrm{d}t} &= v c_{es}.\n", "\\end{align}\n", "\n", "Note that\n", "\n", "\\begin{align}\n", "\\frac{\\mathrm{d}c_e}{\\mathrm{d}t} + \\frac{\\mathrm{d}c_{es}}{\\mathrm{d}t} = 0,\n", "\\end{align}\n", "\n", "which is a statement of conservation of enzyme. This means that we need to specify a total enzyme amount to fully specify the problem. We define this to be $c_e^0$ such that $c_e^0 = c_e + c_{es}$. With this conservation law, we can write the ODEs as\n", "\n", "\\begin{align}\n", "\\frac{\\mathrm{d}c_{es}}{\\mathrm{d}t} &= k_+(c_e^0-c_{es}) c_s - (k_- + v)c_{es},\\\\[1em]\n", "\\frac{\\mathrm{d}c_s}{\\mathrm{d}t} &= -k_+(c_e^0-c_{es})c_s + k_-c_{es},\\\\[1em]\n", "\\frac{\\mathrm{d}c_p}{\\mathrm{d}t} &= v c_{es}.\n", "\\end{align}\n", "\n", "These equations describe the full dynamics of the enzyme catalyzed system. To simplify the analysis, we oftem make the **quasi-steady state approximation** that the bound substrate intermediate ES does not see appreciable change in its concentration on the time scale of the production of the product P. That is,\n", "\n", "\\begin{align}\n", "\\frac{\\mathrm{d}c_{es}}{\\mathrm{d}t} = k_+(c_e^0-c_{es}) c_s - (k_- + v)c_{es} \\approx 0.\n", "\\end{align}\n", "\n", "This enables us to solve for the quasi-steady state fraction of enzyme that is bound to substrate.\n", "\n", "\\begin{align}\n", "\\frac{c_{es}}{c_e^0} \\approx \\frac{c_s/K}{1 + c_s/K},\n", "\\end{align}\n", "\n", "where we have defined the **Michaelis constant**\n", "\n", "\\begin{align}\n", "K = \\frac{v + k_-}{k_+}.\n", "\\end{align}\n", "\n", "It has dimension of concentration and is analogous to a dissociation constant in that it is the ratio of the total rate constant for dissociation of the enzyme from the catalyst to that of binding the enzyme to the catalyst.\n", "\n", "Substitution of this expression gives\n", "\n", "\\begin{align}\n", "\\frac{\\mathrm{d}c_p}{\\mathrm{d}t} \\approx vc_e^0\\, \\frac{c_s/K}{1 + c_s/K}.\n", "\\end{align}\n", "\n", "By conservation of mass, if $\\mathrm{d}c_{es}/\\mathrm{d}t \\approx 0$, then \n", "\n", "\\begin{align}\n", "\\frac{\\mathrm{d}c_s}{\\mathrm{d}t} \\approx -\\frac{\\mathrm{d}c_p}{\\mathrm{d}t} \\approx -vc_e^0\\, \\frac{c_s/K}{1 + c_s/K}.\n", "\\end{align}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Testing the accuracy of the quasi-steady state approximation\n", "\n", "To test the accuracy of the pseudo-steady state approximation, it helps, as usual, to nondimensionalize the variables. We perform the nondimensionalization as follows. \n", "\n", "\\begin{align}\n", "t &\\leftarrow k_- t,\\\\[1em]\n", "c_{es} &\\leftarrow \\frac{c_{es}}{c_e^0},\\\\[1em]\n", "c_s &\\leftarrow \\frac{c_s}{K},\\\\[1em]\n", "c_p &\\leftarrow \\frac{c_p}{K}.\n", "\\end{align}\n", "\n", "The dimensionless dynamical equations are then\n", "\n", "\\begin{align}\n", "\\kappa\\, \\frac{\\mathrm{d}c_{es}}{\\mathrm{d}t} &= (1-c_{es}) c_s - c_{es},\\\\[1em]\n", "\\zeta^{-1} \\frac{\\mathrm{d}c_s}{\\mathrm{d}t} &= -(1-c_{es})c_s + \\kappa \\,c_{es},\\\\[1em]\n", "\\frac{\\mathrm{d}c_p}{\\mathrm{d}t} &= \\zeta(1-\\kappa)c_{es}.\n", "\\end{align}\n", "\n", "We have defined two dimensionless parameters. First, we have\n", "\n", "\\begin{align}\n", "\\kappa = \\frac{k_-}{v + k_-}.\n", "\\end{align}\n", "\n", "which is the probability that a given enzyme-substrate complex will end up dissociating back to separated enzyme and substrate versus being converted to product. Second, noting that the dissociation constant for enzyme-substrate is $K_d = k_-/k_+$, we have \n", "\n", "\\begin{align}\n", "\\zeta = \\frac{k_+ c_e^0}{k_-} = \\frac{c_e^0}{K_d}. \n", "\\end{align}\n", "\n", "This is how much enzyme we have in units of $K_d$.\n", "\n", "It is apparent in looking at the dimensionless equations that the quasi-steady state approximation is valid when $\\zeta$ is small (we do not have too much enzyme). To investigate this, we can make plots and compare the solution to the full dynamical equations and those using the quasi-steady state approximation. In the plot below, we show the approximate dynamics of the substrate and the product as fainter colored lines.\n", "\n", "_You must be running an active Jupyter notebook to see the below plots._" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "tags": [ "remove_input" ] }, "outputs": [ { "data": { "application/vnd.bokehjs_exec.v0+json": "", "text/html": [ "\n", "" ] }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "server_id": "1160b9e2fa8e461096fd1b181c7f2be2" } }, "output_type": "display_data" } ], "source": [ "slider_params = (biocircuits.AttributeContainer(title='κ', start=0.01, \n", " end=1, value=0.5, step=0.01),\n", " biocircuits.AttributeContainer(title='log₁₀ ζ', start=-2, \n", " end=2, value=0, step=0.05))\n", "\n", "# Initial condition\n", "c0 = np.array([0.01, 10, 0.01])\n", "\n", "# Number of points in the plot\n", "n_points = 400\n", "\n", "def michaelis_menton_rhs(c, t, kappa, zeta):\n", " ces, cs, cp = c\n", " return np.array([((1 - ces)*cs - ces) / kappa,\n", " zeta * (-(1 - ces) * cs + kappa * ces),\n", " zeta * (1 - kappa) * ces])\n", "\n", "\n", "def approx_michaelis_menton_rhs(c, t, kappa, zeta):\n", " cs, cp = c\n", " deriv = zeta * (1 - kappa) * cs / (1 + cs)\n", " return np.array([-deriv, deriv])\n", "\n", "\n", "def callback(source, x_range, y_range, sliders, toggles):\n", " # Set up t values, keeping minimum at zero\n", " t = np.linspace(0, x_range.end, n_points)\n", " \n", " # Pull out slider values\n", " kappa = sliders[0].value\n", " zeta = 10**sliders[1].value\n", " \n", " # Solve the full system\n", " c = scipy.integrate.odeint(michaelis_menton_rhs, c0, t, args=(kappa, zeta))\n", " \n", " # Solve the approximate system\n", " c_approx = scipy.integrate.odeint(approx_michaelis_menton_rhs, c0[1:], \n", " t, args=(kappa, zeta))\n", "\n", " # Update the data source\n", " source.data['t'] = t\n", " source.data['ces'] = c[:,0]\n", " source.data['cs'] = c[:,1]\n", " source.data['cp'] = c[:,2]\n", " source.data['cs_approx'] = c_approx[:,0]\n", " source.data['cp_approx'] = c_approx[:,1]\n", "\n", "\n", "def mm_plot(callback, sliders, toggles, extra_args):\n", " # Set up plot\n", " p = bokeh.plotting.figure(plot_width=500,\n", " plot_height=250,\n", " x_axis_label='t',\n", " y_axis_label='dimensionless concentration',\n", " y_axis_type='linear')\n", "\n", " colors = bokeh.palettes.d3['Category10'][3]\n", " \n", " # Set up empty data source\n", " source = bokeh.models.ColumnDataSource()\n", "\n", " # Populate glyphs\n", " p.line('t', 'ces', source=source, line_width=2, color=colors[0], legend='ES')\n", " p.line('t', 'cs', source=source, line_width=2, color=colors[1], legend='S')\n", " p.line('t', 'cp', source=source, line_width=2, color=colors[2], legend='P')\n", " p.line('t', 'cs_approx', source=source, line_width=4, color=colors[1], alpha=0.3)\n", " p.line('t', 'cp_approx', source=source, line_width=4, color=colors[2], alpha=0.3)\n", " \n", " # Position legend\n", " p.legend.location = 'center_left'\n", "\n", " # Update data according to callback\n", " callback(source, bokeh.models.Range1d(0, 10), None, \n", " sliders, toggles)\n", "\n", " return p, source\n", "\n", "mm_app = biocircuits.interactive_xy_plot(mm_plot, callback, \n", " slider_params, ())\n", "\n", "notebook_url = 'localhost:8888'\n", "bokeh.io.show(mm_app, notebook_url=notebook_url)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In manipulating the sliders, we see that, indeed, if $\\zeta$ is small (that is we do not have too much enzyme), then the concentration of ES quickly goes to a steady level while the concentration of product grows. The approximate solution to the Michaelis-Menten dynamics, at least for production of product, very closely follows that obtained for the full dynamics." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Approximate dynamics of the Che signaling system\n", "\n", "Because of the more verbose names of the species in the Che system (e.g., \"$X_m^*$\" instead of \"S\"), we will denote concentrations of respective species with lower case letter, e.g. $x_m^*$.\n", "\n", "We will assume that the quasi-steady state approximation holds for all enzyme-catalyzed reactions. We assume further that CheR operates at saturation. This means that there is so much substrate (in this case unmethlyated CheA receptor complex) such that the rate of methylation by CheR is directly proportional to the CheR concentration, or\n", "\n", "\\begin{align}\n", "\\frac{r/K_R}{1+r/K_R} \\approx 1.\n", "\\end{align}\n", "\n", "When this is the case, it is said that CheR **operates at saturation**.\n", "\n", "We can write an ODE for the rate of change of _total_ methylated CheA. At steady state, this derivative vanishes.\n", "\n", "\\begin{align}\n", "\\frac{\\mathrm{d}(x^*_m + x_m)}{\\mathrm{d}t} = \\frac{\\mathrm{d}x_m^\\mathrm{tot}}{\\mathrm{d}t} = 2v_R r - v_B b\\left(\\frac{x_m^*/K_m}{1 + x_M^*/K_m} + \\frac{x_m/\\kappa_m}{1 + x_m/\\kappa_m}\\right) = 0,\n", "\\end{align}\n", "\n", "where $K_m$ and $\\kappa_m$ are Michaelis constants for demethylation by CheB. This equation is readily solved for $x_m^*$.\n", "\n", "\\begin{align}\n", "x_m^* = K_m\\,\\frac{2 v_R r - v_B b\\,\\frac{x_m/\\kappa_m}{1 + x_m/\\kappa_m}}{v_B b - 2v_R r + v_B b\\,\\frac{x_m/\\kappa_m}{1 + x_m/\\kappa_m}}\n", "\\end{align}\n", "\n", "Note that as $x_m$ grows, the numerator decreases, while the denominator increases. So, for increasing $x_m$, $x_m^*$ decreases. Because the amount of $x_m$ is dependent on the amount of attractant present (more attractant means the equilibrium shifts toward the inactive conformations, $x$ and $x_m$), the concentration of active CheA receptor complex is dependent on the attractant concentration in this model." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Fine-tuned exact adaptation\n", "\n", "\n", "We an imagine a scenario where we could get exact adaptation in tumbling frequency from this circuit. If the attractant affects the phosphotransfer and the CheY response, we can write\n", "\n", "\\begin{align}\n", "\\text{tumbling frequency} \\equiv A = a(L)\\,x_m^*,\n", "\\end{align}\n", "\n", "where $L$ is the concentration of attractant ligand and $a(L)$ is some function. Before the attract was present, we have a tumbling frequency of $A_0 = a_0 x_{m,0}^*$, and after we have $A_1 = a_1 x_{m,1}^*$, where $a_0 = a(L_0)$ and $a_1 = a(L_1)$. Note that addition of attractant also shifts the balance between methylated and unmethylated CheA receptor complex, so $x_m$ is affected. We define \n", "\n", "\\begin{align}\n", "\\theta = 2v_r r - v_b b\\,\\frac{x_m/\\kappa_m}{1 + x_m/\\kappa_m}.\n", "\\end{align}\n", "\n", "Then, the concentration of active methylated CheA complex is\n", "\n", "\\begin{align}\n", "x_m^* = K_m\\,\\frac{\\theta}{v_B b - \\theta}.\n", "\\end{align}\n", "\n", "With this expression, we can write down the two tumbling frequencies.\n", "\n", "\\begin{align}\n", "A_0 = a_0 x_{m,0}* = a_0 K_m \\,\\frac{\\theta_0}{v_B v \\theta_0}, \\\\[1em]\n", "A_1 = a_1 x_{m,1}* = a_1 K_m \\,\\frac{\\theta_1}{v_B v \\theta_1}.\n", "\\end{align}\n", "\n", "For exact adaptation, for this particular concentration of attractant, $A_0 = A_1$, or\n", "\n", "\\begin{align}\n", "\\frac{a_1}{a_0} = \\frac{\\theta_1(v_B b - \\theta_0)}{\\theta_0(v_B b - \\theta_1)}.\n", "\\end{align}\n", "\n", "The problem is that this ratio must hold for _any_ $a_0$ and $a_1$ within an operating regime if exact adaptation is to be robust. This results in a delicate balancing act, since $\\theta$ changes with varying attractant concentration. This is an example of **fine-tuning**. Exact adaptation is only possible by precisely setting parameters for a given pair of attractant concentrations, and the exact adaptation is lost of those attractant concentrations change at all." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Robust exact adaptation\n", "\n", "Let us now assume a different architecture to the Che circuit. We will assume that CheB only demethylates _active_ receptors, rendering them inactive. The circuit diagram in this case is\n", "\n", "\n", " \n", "Take the same approach as before, we can again write down the dynamics for the total amount of methylated CheA complex. We will again assume that CheR is operating at saturation.\n", "\n", "\\begin{align}\n", "\\frac{\\mathrm{d}(x_m +x_m^*)}{\\mathrm{d}t} = v_R r - v_B b\\,\\frac{x_m^*/K_m}{1+x_m^*/K_m}.\n", "\\end{align}\n", "\n", "At steady state, the time derivative vanishes, and we have\n", "\n", "\\begin{align}\n", "x_m^* = K_m\\,\\frac{v_R r}{v_B b - v_R r}.\n", "\\end{align}\n", "\n", "This is independent of $x_m$, and is dependent only on the parameters and concentrations pertaining to the CheB and CheR enzymes. If we have the simplest model where $a(L) = \\text{constant}$, then exact adaptation is achieved over all attractant concentrations. Furthermore, exact adaptation is robust to variations in parameter values (like CheR concentration, $v_B$, etc.), provided the Michaelis-Menten kinetics are valid and CheR operates at saturation.\n", "\n", "Note, however, that the steady state tumbling frequency is _not_ robust to changes in parameter values. The exact adaptation is robust to changes in parameter values, but the level of the steady state has explicit dependence on them and is therefore not robust to fluctuations in parameter values." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Integral feedback\n", "\n", "The chemotaxis system we have studied in this lesson achieves exact adaptation robustly via a mechanism called **integral feedback control**, as first noticed by [Yi and coworkers](https://doi.org/10.1073/pnas.97.9.4649). The key features of integral feedback control are:\n", "\n", "- The steady state is independent of external perturbation.\n", "- The system tends toward steady state as time tends toward infinity; i.e., it is asymptotically stable.\n", "- The time integral of error is fed back into the system.\n", "\n", "A block diagram for integral control is shown below. The desired output is $y_0$ and the actual output is $y$, so the error is $e = y_0 - y$. This error is integrated over time, multiplied by a gain $k$, and then added to the a perturbation $u$. In the context of the chemotaxis system, the perturbation is the change in attractant concentration.\n", "\n", "\n", "
Image from Del Vecchio and Murray, Biomolecular Feedback Systems, Princeton University Press, 2015.
\n", "
\n", "\n", "If we write ODEs for this diagram, we have that\n", "\n", "\\begin{align}\n", "\\frac{\\mathrm{d}z}{\\mathrm{d}t} = e(t) = y_0 - y,\n", "\\end{align}\n", "\n", "with $y = kz + u$, giving\n", "\n", "\\begin{align}\n", "\\frac{\\mathrm{d}z}{\\mathrm{d}t} = e(t) = y_0 - kz - u.\n", "\\end{align}\n", "\n", "The steady state is then $y = y_0$, which is asymptotically stable if the gain $k$ is positive and the perturbation is constant (such as a change in attractant concentration). In the present case, the term $kz$ represents the linearized balance between methylated and unmethylated CheA receptor complex. Importantly, the integral feedback ensures that the steady state is independent of the perturbation $u$.\n", "\n", "You can read more about integral feedback in [section 3.2 of Del Vecchio and Murray's book] and in [this very nice primer on control theory in synthetic biology](https://doi.org/10.1109/MCS.2018.2810459) by Swaminathan, Hsiao, and Murray." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Computing environment" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "tags": [ "remove_input" ] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPython 3.7.3\n", "IPython 7.1.1\n", "\n", "numpy 1.16.2\n", "scipy 1.2.1\n", "bokeh 1.1.0\n", "jupyterlab 0.35.4\n", "biocircuits 0.0.6\n" ] } ], "source": [ "%load_ext watermark\n", "%watermark -v -p numpy,scipy,bokeh,jupyterlab,biocircuits" ] } ], "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.7.3" } }, "nbformat": 4, "nbformat_minor": 2 }