{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 2. Design principles governing the rate of gene expression\n", "\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Concept**\n", "\n", "- Protein degradation rates determine response times for simple gene expression systems.\n", "\n", "\n", "**Design principle**\n", "\n", "- Negative autoregulation accelerates turn-on times, but not turn-off times.\n", "\n", "\n", "**Techniques**\n", "\n", "- Steady state normalization allows analysis of response times. \n", "- Numerical solution of ODEs using Python.\n", "- Interactive plotting using Bokeh.\n", "\n", "
\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "data": { "text/html": [ "\n", "
\n", " \n", " Loading BokehJS ...\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function now() {\n", " return new Date();\n", " }\n", "\n", " const 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", "const JS_MIME_TYPE = 'application/javascript';\n", " const HTML_MIME_TYPE = 'text/html';\n", " const EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n", " const CLASS_NAME = 'output_bokeh rendered_html';\n", "\n", " /**\n", " * Render data to the DOM node\n", " */\n", " function render(props, node) {\n", " const 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", " const cell = handle.cell;\n", "\n", " const id = cell.output_area._bokeh_element_id;\n", " const 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", " const cmd_clean = \"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_clean, {\n", " iopub: {\n", " output: function(msg) {\n", " const 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", " const cmd_destroy = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n", " cell.notebook.kernel.execute(cmd_destroy);\n", " }\n", " }\n", "\n", " /**\n", " * Handle when a new output is added\n", " */\n", " function handleAddOutput(event, handle) {\n", " const output_area = handle.output_area;\n", " const output = handle.output;\n", "\n", " // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n", " if ((output.output_type != \"display_data\") || (!Object.prototype.hasOwnProperty.call(output.data, EXEC_MIME_TYPE))) {\n", " return\n", " }\n", "\n", " const 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", " const bk_div = document.createElement(\"div\");\n", " bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n", " const script_attrs = bk_div.children[0].attributes;\n", " for (let i = 0; i < script_attrs.length; i++) {\n", " toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n", " toinsert[toinsert.length - 1].firstChild.textContent = bk_div.children[0].textContent\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", " const 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", " const 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", " const events = require('base/js/events');\n", " const 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", " if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n", " root._bokeh_timeout = Date.now() + 5000;\n", " root._bokeh_failed_load = false;\n", " }\n", "\n", " const 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", " const el = document.getElementById(\"p1001\");\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", " 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(url) {\n", " console.error(\"failed to load \" + url);\n", " }\n", "\n", " for (let i = 0; i < css_urls.length; i++) {\n", " const url = css_urls[i];\n", " const element = document.createElement(\"link\");\n", " element.onload = on_load;\n", " element.onerror = on_error.bind(null, url);\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 (let i = 0; i < js_urls.length; i++) {\n", " const url = js_urls[i];\n", " const element = document.createElement('script');\n", " element.onload = on_load;\n", " element.onerror = on_error.bind(null, url);\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", " };\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", " const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.1.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.1.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.1.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.1.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.1.0.min.js\"];\n", " const css_urls = [];\n", "\n", " const inline_js = [ function(Bokeh) {\n", " Bokeh.set_log_level(\"info\");\n", " },\n", "function(Bokeh) {\n", " }\n", " ];\n", "\n", " function run_inline_js() {\n", " if (root.Bokeh !== undefined || force === true) {\n", " for (let i = 0; i < inline_js.length; i++) {\n", " inline_js[i].call(root, root.Bokeh);\n", " }\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", " const cell = $(document.getElementById(\"p1001\")).parents('.cell').data().cell;\n", " cell.output_area.append_execute_result(NB_LOAD_WARNING)\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": "(function(root) {\n function now() {\n return new Date();\n }\n\n const 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 if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n const 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 const el = document.getElementById(\"p1001\");\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 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(url) {\n console.error(\"failed to load \" + url);\n }\n\n for (let i = 0; i < css_urls.length; i++) {\n const url = css_urls[i];\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\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 (let i = 0; i < js_urls.length; i++) {\n const url = js_urls[i];\n const element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\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 };\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 const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.1.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.1.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.1.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.1.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.1.0.min.js\"];\n const css_urls = [];\n\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {\n }\n ];\n\n function run_inline_js() {\n if (root.Bokeh !== undefined || force === true) {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\nif (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 const cell = $(document.getElementById(\"p1001\")).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\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": [ "# Colab setup ------------------\n", "import os, sys, subprocess\n", "if \"google.colab\" in sys.modules:\n", " cmd = \"pip install --upgrade biocircuits watermark\"\n", " process = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE)\n", " stdout, stderr = process.communicate()\n", " data_path = \"https://biocircuits.github.io/chapters/data/\"\n", "else:\n", " data_path = \"data/\"\n", "# ------------------------------\n", "\n", "import numpy as np\n", "import pandas as pd\n", "import scipy.integrate\n", "\n", "import colorcet\n", "\n", "import biocircuits.jsplots\n", "\n", "import bokeh.io\n", "import bokeh.plotting\n", "\n", "bokeh.io.output_notebook()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "## Protein stability determines the response time to a change in gene expression\n", "\n", "So far, we have focused on what happens to a system at steady state. However, biological circuits change dynamically, even in constant environmental conditions. \n", "\n", "Imagine a cell suddenly finds itself in a new environment, requiring it to turn up or down the expression of specific genes. How rapidly can it switch proteins to their new desired levels? \n", "\n", "Starting with our basic equation for gene expression, and neglecting the mRNA level for the moment, we write:\n", "\n", "\\begin{align}\n", "\\frac{\\mathrm{d}x}{\\mathrm{d}t} = \\beta - \\gamma x\n", "\\end{align}\n", "\n", "Let's assume the gene has been off for a long time, so that $x(0)=0$ and suddenly turns on at $t=0$. Solving the above differential equation yields the general solution, \n", "\n", "\\begin{align}\n", "x(t) = \\frac{\\beta }{\\gamma} (1-e^{-\\gamma t}).\n", "\\end{align}\n", "\n", "Thus, the parameter that determines the response time is $\\gamma$, the degradation + dilution rate of the protein. In the above expression, we see that the characteristic response time scale is $\\gamma^{-1}$. A plot of the concentration of gene product over time is shown below for $\\beta = 100$ and $\\gamma = 1$. Note that $\\beta$ has dimension of concentration per time and $\\gamma$ has dimension of inverse time. We take their respective units as arbitrary in the plots that follow." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "ExecuteTime": { "end_time": "2019-04-05T17:20:07.356315Z", "start_time": "2019-04-05T17:20:07.055723Z" }, "tags": [ "hide-input" ] }, "outputs": [ { "data": { "text/html": [ "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function embed_document(root) {\n", " const docs_json = {\"954f3b12-6e4f-4e92-8aa7-a2927c5471f2\":{\"version\":\"3.1.0\",\"title\":\"Bokeh Application\",\"defs\":[],\"roots\":[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p1002\",\"attributes\":{\"x_range\":{\"type\":\"object\",\"name\":\"Range1d\",\"id\":\"p1011\",\"attributes\":{\"end\":6}},\"y_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1004\"},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1015\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1017\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p1006\"},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1054\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1048\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1049\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1050\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[400],\"dtype\":\"float64\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[400],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1055\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1056\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1051\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b4\",\"line_width\":2}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1052\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b4\",\"line_alpha\":0.1,\"line_width\":2}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1053\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b4\",\"line_alpha\":0.2,\"line_width\":2}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1066\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1057\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1058\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1059\"},\"data\":{\"type\":\"map\",\"entries\":[[\"t0\",[1.0]],[\"x0\",[63.212055882855765]],[\"text\",[\"response time = 1/\\u03b3\"]]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1067\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1068\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1063\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"t0\"},\"y\":{\"type\":\"field\",\"field\":\"x0\"},\"size\":{\"type\":\"value\",\"value\":10},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1064\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"t0\"},\"y\":{\"type\":\"field\",\"field\":\"x0\"},\"size\":{\"type\":\"value\",\"value\":10},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1065\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"t0\"},\"y\":{\"type\":\"field\",\"field\":\"x0\"},\"size\":{\"type\":\"value\",\"value\":10},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p1008\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p1033\"},{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p1034\"},{\"type\":\"object\",\"name\":\"BoxZoomTool\",\"id\":\"p1035\",\"attributes\":{\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p1036\",\"attributes\":{\"syncable\":false,\"level\":\"overlay\",\"visible\":false,\"left_units\":\"canvas\",\"right_units\":\"canvas\",\"bottom_units\":\"canvas\",\"top_units\":\"canvas\",\"line_color\":\"black\",\"line_alpha\":1.0,\"line_width\":2,\"line_dash\":[4,4],\"fill_color\":\"lightgrey\",\"fill_alpha\":0.5}}}},{\"type\":\"object\",\"name\":\"SaveTool\",\"id\":\"p1037\"},{\"type\":\"object\",\"name\":\"ResetTool\",\"id\":\"p1038\"},{\"type\":\"object\",\"name\":\"HelpTool\",\"id\":\"p1039\"}]}},\"left\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1026\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1028\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1029\"},\"axis_label\":\"x(t)\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1027\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1019\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1021\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1022\"},\"axis_label\":\"time\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1020\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1025\",\"attributes\":{\"axis\":{\"id\":\"p1019\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1032\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p1026\"}}},{\"type\":\"object\",\"name\":\"LabelSet\",\"id\":\"p1069\",\"attributes\":{\"source\":{\"id\":\"p1057\"},\"x\":{\"type\":\"field\",\"field\":\"t0\"},\"y\":{\"type\":\"field\",\"field\":\"x0\"},\"text\":{\"type\":\"field\",\"field\":\"text\"},\"x_offset\":{\"type\":\"value\",\"value\":10},\"y_offset\":{\"type\":\"value\",\"value\":-10}}},{\"type\":\"object\",\"name\":\"Span\",\"id\":\"p1073\",\"attributes\":{\"level\":\"underlay\",\"location\":1.0,\"dimension\":\"height\",\"line_dash\":[6]}}],\"frame_width\":375,\"frame_height\":275}}],\"callbacks\":{\"type\":\"map\"}}};\n", " const render_items = [{\"docid\":\"954f3b12-6e4f-4e92-8aa7-a2927c5471f2\",\"roots\":{\"p1002\":\"769bf1dd-8f19-41a3-81d0-eec4c7b29b7b\"},\"root_ids\":[\"p1002\"]}];\n", " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " let attempts = 0;\n", " const timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined) {\n", " clearInterval(timer);\n", " embed_document(root);\n", " } else {\n", " attempts++;\n", " if (attempts > 100) {\n", " clearInterval(timer);\n", " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", " }\n", " }\n", " }, 10, root)\n", " }\n", "})(window);" ], "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "p1002" } }, "output_type": "display_data" } ], "source": [ "# Parameters\n", "beta = 100\n", "gamma = 1\n", "\n", "# Dynamics\n", "t = np.linspace(0, 6, 400)\n", "x = beta / gamma * (1 - np.exp(-gamma * t))\n", "\n", "# Plot response\n", "p = bokeh.plotting.figure(\n", " frame_height=275,\n", " frame_width=375,\n", " x_axis_label=\"time\",\n", " y_axis_label=\"x(t)\",\n", " x_range=[0, 6],\n", ")\n", "p.line(t, x, line_width=2)\n", "\n", "# Mark the response time (when we get to level 1-1/e)\n", "t0 = 1 / gamma\n", "x0 = beta / gamma * (1 - np.exp(-1))\n", "\n", "# Add the glyph with label\n", "source = bokeh.models.ColumnDataSource(\n", " data=dict(t0=[t0], x0=[x0], text=[\"response time = 1/γ\"])\n", ")\n", "p.circle(x=\"t0\", y=\"x0\", source=source, size=10)\n", "p.add_layout(\n", " bokeh.models.LabelSet(\n", " x=\"t0\", y=\"x0\", text=\"text\", source=source, x_offset=10, y_offset=-10\n", " )\n", ")\n", "p.add_layout(\n", " bokeh.models.Span(\n", " location=t0,\n", " level=\"underlay\",\n", " dimension=\"height\",\n", " line_color=\"black\",\n", " line_dash=\"dashed\",\n", " )\n", ")\n", "\n", "bokeh.io.show(p)" ] }, { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "## How can we speed up responses?\n", "\n", "So far, it seems as if the cell's ability to modulate the concentration of a stable protein is quite limited, apparently requiring timescales on the order of the cell cycle for both increases and decreases. This seems rather pathetic for such successful, billion year old creatures. You might think you could beat this timescale and up-regulate the protein level faster by cranking up the promoter strength (increasing $\\beta$). Indeed, this would allow the cell to hit a specific threshold earlier. However, it would also increase the final steady state concentration ($\\beta/\\gamma$), and therefore leave the timescale over which the system reaches its new steady-state unaffected.\n", "\n", "One simple way to speed up the response time of the protein is to destabilize it, by increasing $\\gamma$, while also increasing $\\beta$ by the same factor, and thereby preserving the steady state protein concentration. This strategy pays the cost of a **futile cycle** of protein synthesis and degradation to provide a benefit in terms of the speed with which the regulatory system can reach a new steady state. \n", "\n", "To see this, it is useful to normalize these plots by their steady states, as in the bottom plot below, which disentangles amplitude and timescale. Comparing normalized response curves in this way is reasonable, because mutations can alter the expression level of a gene allowing evolution to optimize expression level independently of the regulatory system." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "data": { "text/html": [ "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function embed_document(root) {\n", " const docs_json = {\"4a921173-3574-46dc-a838-b5e75ea9c3be\":{\"version\":\"3.1.0\",\"title\":\"Bokeh Application\",\"defs\":[],\"roots\":[{\"type\":\"object\",\"name\":\"Column\",\"id\":\"p1421\",\"attributes\":{\"children\":[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p1193\",\"attributes\":{\"x_range\":{\"type\":\"object\",\"name\":\"Range1d\",\"id\":\"p1202\",\"attributes\":{\"end\":6}},\"y_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1195\"},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1206\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1208\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p1197\"},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1291\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1285\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1286\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1287\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[400],\"dtype\":\"float64\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[400],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1292\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1293\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1288\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#08519c\",\"line_width\":2}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1289\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#08519c\",\"line_alpha\":0.1,\"line_width\":2}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1290\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#08519c\",\"line_alpha\":0.2,\"line_width\":2}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1300\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1294\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1295\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1296\"},\"data\":{\"type\":\"map\"}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1301\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1302\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1297\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":1.0},\"y\":{\"type\":\"value\",\"value\":63.212055882855765},\"size\":{\"type\":\"value\",\"value\":10},\"line_color\":{\"type\":\"value\",\"value\":\"#08519c\"},\"fill_color\":{\"type\":\"value\",\"value\":\"#08519c\"},\"hatch_color\":{\"type\":\"value\",\"value\":\"#08519c\"}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1298\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":1.0},\"y\":{\"type\":\"value\",\"value\":63.212055882855765},\"size\":{\"type\":\"value\",\"value\":10},\"line_color\":{\"type\":\"value\",\"value\":\"#08519c\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"fill_color\":{\"type\":\"value\",\"value\":\"#08519c\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_color\":{\"type\":\"value\",\"value\":\"#08519c\"},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1299\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":1.0},\"y\":{\"type\":\"value\",\"value\":63.212055882855765},\"size\":{\"type\":\"value\",\"value\":10},\"line_color\":{\"type\":\"value\",\"value\":\"#08519c\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"fill_color\":{\"type\":\"value\",\"value\":\"#08519c\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_color\":{\"type\":\"value\",\"value\":\"#08519c\"},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1327\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1321\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1322\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1323\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[400],\"dtype\":\"float64\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[400],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1328\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1329\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1324\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#3182bd\",\"line_width\":2}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1325\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#3182bd\",\"line_alpha\":0.1,\"line_width\":2}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1326\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#3182bd\",\"line_alpha\":0.2,\"line_width\":2}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1336\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1330\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1331\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1332\"},\"data\":{\"type\":\"map\"}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1337\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1338\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1333\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":0.5},\"y\":{\"type\":\"value\",\"value\":31.606027941427882},\"size\":{\"type\":\"value\",\"value\":10},\"line_color\":{\"type\":\"value\",\"value\":\"#3182bd\"},\"fill_color\":{\"type\":\"value\",\"value\":\"#3182bd\"},\"hatch_color\":{\"type\":\"value\",\"value\":\"#3182bd\"}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1334\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":0.5},\"y\":{\"type\":\"value\",\"value\":31.606027941427882},\"size\":{\"type\":\"value\",\"value\":10},\"line_color\":{\"type\":\"value\",\"value\":\"#3182bd\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"fill_color\":{\"type\":\"value\",\"value\":\"#3182bd\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_color\":{\"type\":\"value\",\"value\":\"#3182bd\"},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1335\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":0.5},\"y\":{\"type\":\"value\",\"value\":31.606027941427882},\"size\":{\"type\":\"value\",\"value\":10},\"line_color\":{\"type\":\"value\",\"value\":\"#3182bd\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"fill_color\":{\"type\":\"value\",\"value\":\"#3182bd\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_color\":{\"type\":\"value\",\"value\":\"#3182bd\"},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1363\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1357\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1358\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1359\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[400],\"dtype\":\"float64\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[400],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1364\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1365\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1360\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#6baed6\",\"line_width\":2}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1361\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#6baed6\",\"line_alpha\":0.1,\"line_width\":2}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1362\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#6baed6\",\"line_alpha\":0.2,\"line_width\":2}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1372\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1366\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1367\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1368\"},\"data\":{\"type\":\"map\"}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1373\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1374\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1369\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":0.3333333333333333},\"y\":{\"type\":\"value\",\"value\":21.07068529428526},\"size\":{\"type\":\"value\",\"value\":10},\"line_color\":{\"type\":\"value\",\"value\":\"#6baed6\"},\"fill_color\":{\"type\":\"value\",\"value\":\"#6baed6\"},\"hatch_color\":{\"type\":\"value\",\"value\":\"#6baed6\"}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1370\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":0.3333333333333333},\"y\":{\"type\":\"value\",\"value\":21.07068529428526},\"size\":{\"type\":\"value\",\"value\":10},\"line_color\":{\"type\":\"value\",\"value\":\"#6baed6\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"fill_color\":{\"type\":\"value\",\"value\":\"#6baed6\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_color\":{\"type\":\"value\",\"value\":\"#6baed6\"},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1371\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":0.3333333333333333},\"y\":{\"type\":\"value\",\"value\":21.07068529428526},\"size\":{\"type\":\"value\",\"value\":10},\"line_color\":{\"type\":\"value\",\"value\":\"#6baed6\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"fill_color\":{\"type\":\"value\",\"value\":\"#6baed6\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_color\":{\"type\":\"value\",\"value\":\"#6baed6\"},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1399\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1393\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1394\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1395\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",[4]],[\"y\",[95]],[\"text\",[\"\\u03b3 = 1\"]]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1400\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1401\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Text\",\"id\":\"p1396\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"text\":{\"type\":\"field\",\"field\":\"text\"},\"text_color\":{\"type\":\"value\",\"value\":\"#08519c\"},\"text_font_size\":{\"type\":\"value\",\"value\":\"10pt\"},\"text_baseline\":{\"type\":\"value\",\"value\":\"top\"}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Text\",\"id\":\"p1397\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"text\":{\"type\":\"field\",\"field\":\"text\"},\"text_color\":{\"type\":\"value\",\"value\":\"#08519c\"},\"text_alpha\":{\"type\":\"value\",\"value\":0.1},\"text_font_size\":{\"type\":\"value\",\"value\":\"10pt\"},\"text_baseline\":{\"type\":\"value\",\"value\":\"top\"}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Text\",\"id\":\"p1398\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"text\":{\"type\":\"field\",\"field\":\"text\"},\"text_color\":{\"type\":\"value\",\"value\":\"#08519c\"},\"text_alpha\":{\"type\":\"value\",\"value\":0.2},\"text_font_size\":{\"type\":\"value\",\"value\":\"10pt\"},\"text_baseline\":{\"type\":\"value\",\"value\":\"top\"}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1408\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1402\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1403\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1404\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",[4]],[\"y\",[53]],[\"text\",[\"\\u03b3 = 2\"]]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1409\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1410\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Text\",\"id\":\"p1405\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"text\":{\"type\":\"field\",\"field\":\"text\"},\"text_color\":{\"type\":\"value\",\"value\":\"#3182bd\"},\"text_font_size\":{\"type\":\"value\",\"value\":\"10pt\"}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Text\",\"id\":\"p1406\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"text\":{\"type\":\"field\",\"field\":\"text\"},\"text_color\":{\"type\":\"value\",\"value\":\"#3182bd\"},\"text_alpha\":{\"type\":\"value\",\"value\":0.1},\"text_font_size\":{\"type\":\"value\",\"value\":\"10pt\"}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Text\",\"id\":\"p1407\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"text\":{\"type\":\"field\",\"field\":\"text\"},\"text_color\":{\"type\":\"value\",\"value\":\"#3182bd\"},\"text_alpha\":{\"type\":\"value\",\"value\":0.2},\"text_font_size\":{\"type\":\"value\",\"value\":\"10pt\"}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1417\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1411\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1412\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1413\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",[4]],[\"y\",[30]],[\"text\",[\"\\u03b3 = 3\"]]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1418\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1419\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Text\",\"id\":\"p1414\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"text\":{\"type\":\"field\",\"field\":\"text\"},\"text_color\":{\"type\":\"value\",\"value\":\"#6baed6\"},\"text_font_size\":{\"type\":\"value\",\"value\":\"10pt\"},\"text_baseline\":{\"type\":\"value\",\"value\":\"top\"}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Text\",\"id\":\"p1415\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"text\":{\"type\":\"field\",\"field\":\"text\"},\"text_color\":{\"type\":\"value\",\"value\":\"#6baed6\"},\"text_alpha\":{\"type\":\"value\",\"value\":0.1},\"text_font_size\":{\"type\":\"value\",\"value\":\"10pt\"},\"text_baseline\":{\"type\":\"value\",\"value\":\"top\"}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Text\",\"id\":\"p1416\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"text\":{\"type\":\"field\",\"field\":\"text\"},\"text_color\":{\"type\":\"value\",\"value\":\"#6baed6\"},\"text_alpha\":{\"type\":\"value\",\"value\":0.2},\"text_font_size\":{\"type\":\"value\",\"value\":\"10pt\"},\"text_baseline\":{\"type\":\"value\",\"value\":\"top\"}}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p1199\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p1224\"},{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p1225\"},{\"type\":\"object\",\"name\":\"BoxZoomTool\",\"id\":\"p1226\",\"attributes\":{\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p1227\",\"attributes\":{\"syncable\":false,\"level\":\"overlay\",\"visible\":false,\"left_units\":\"canvas\",\"right_units\":\"canvas\",\"bottom_units\":\"canvas\",\"top_units\":\"canvas\",\"line_color\":\"black\",\"line_alpha\":1.0,\"line_width\":2,\"line_dash\":[4,4],\"fill_color\":\"lightgrey\",\"fill_alpha\":0.5}}}},{\"type\":\"object\",\"name\":\"SaveTool\",\"id\":\"p1228\"},{\"type\":\"object\",\"name\":\"ResetTool\",\"id\":\"p1229\"},{\"type\":\"object\",\"name\":\"HelpTool\",\"id\":\"p1230\"}]}},\"left\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1217\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1219\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1220\"},\"axis_label\":\"x(t)\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1218\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1210\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1212\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1213\"},\"axis_label\":\"time\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1211\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1216\",\"attributes\":{\"axis\":{\"id\":\"p1210\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1223\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p1217\"}}}],\"frame_width\":300,\"frame_height\":175}},{\"type\":\"object\",\"name\":\"Spacer\",\"id\":\"p1420\",\"attributes\":{\"height\":20}},{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p1239\",\"attributes\":{\"x_range\":{\"id\":\"p1202\"},\"y_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1241\"},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1252\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1254\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p1243\"},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1309\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1303\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1304\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1305\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[400],\"dtype\":\"float64\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[400],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1310\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1311\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1306\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#08519c\",\"line_width\":2}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1307\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#08519c\",\"line_alpha\":0.1,\"line_width\":2}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1308\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#08519c\",\"line_alpha\":0.2,\"line_width\":2}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1318\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1312\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1313\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1314\"},\"data\":{\"type\":\"map\"}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1319\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1320\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1315\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":1.0},\"y\":{\"type\":\"value\",\"value\":0.6321205588285577},\"size\":{\"type\":\"value\",\"value\":10},\"line_color\":{\"type\":\"value\",\"value\":\"#08519c\"},\"fill_color\":{\"type\":\"value\",\"value\":\"#08519c\"},\"hatch_color\":{\"type\":\"value\",\"value\":\"#08519c\"}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1316\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":1.0},\"y\":{\"type\":\"value\",\"value\":0.6321205588285577},\"size\":{\"type\":\"value\",\"value\":10},\"line_color\":{\"type\":\"value\",\"value\":\"#08519c\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"fill_color\":{\"type\":\"value\",\"value\":\"#08519c\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_color\":{\"type\":\"value\",\"value\":\"#08519c\"},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1317\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":1.0},\"y\":{\"type\":\"value\",\"value\":0.6321205588285577},\"size\":{\"type\":\"value\",\"value\":10},\"line_color\":{\"type\":\"value\",\"value\":\"#08519c\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"fill_color\":{\"type\":\"value\",\"value\":\"#08519c\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_color\":{\"type\":\"value\",\"value\":\"#08519c\"},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1345\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1339\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1340\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1341\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[400],\"dtype\":\"float64\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[400],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1346\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1347\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1342\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#3182bd\",\"line_width\":2}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1343\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#3182bd\",\"line_alpha\":0.1,\"line_width\":2}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1344\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#3182bd\",\"line_alpha\":0.2,\"line_width\":2}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1354\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1348\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1349\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1350\"},\"data\":{\"type\":\"map\"}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1355\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1356\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1351\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":0.5},\"y\":{\"type\":\"value\",\"value\":0.6321205588285577},\"size\":{\"type\":\"value\",\"value\":10},\"line_color\":{\"type\":\"value\",\"value\":\"#3182bd\"},\"fill_color\":{\"type\":\"value\",\"value\":\"#3182bd\"},\"hatch_color\":{\"type\":\"value\",\"value\":\"#3182bd\"}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1352\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":0.5},\"y\":{\"type\":\"value\",\"value\":0.6321205588285577},\"size\":{\"type\":\"value\",\"value\":10},\"line_color\":{\"type\":\"value\",\"value\":\"#3182bd\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"fill_color\":{\"type\":\"value\",\"value\":\"#3182bd\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_color\":{\"type\":\"value\",\"value\":\"#3182bd\"},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1353\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":0.5},\"y\":{\"type\":\"value\",\"value\":0.6321205588285577},\"size\":{\"type\":\"value\",\"value\":10},\"line_color\":{\"type\":\"value\",\"value\":\"#3182bd\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"fill_color\":{\"type\":\"value\",\"value\":\"#3182bd\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_color\":{\"type\":\"value\",\"value\":\"#3182bd\"},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1381\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1375\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1376\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1377\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[400],\"dtype\":\"float64\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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///vPzOMCIj//+8/R5Kvjf//7z84xBaT///vP8XyQJj//+8/7s4wnf//7z9E6+ih///vP1O9a6b//+8/3Z67qv//7z8dz9qu///vP+pzy7L//+8/3ZqPtv//7z9eOim6///vP64ymr3//+8/3U7kwP//7z+8RQnE///vP8C6Csf//+8/4D7qyf//7z9cUanM///vP5dgSc///+8/wcrL0f//7z+e3jHU///vPyrcfNb//+8/R/Wt2P//7z9UTsba///vP8/+xtz//+8/3xGx3v//7z/lhoXg///vP/5RReL//+8/f1zx4///7z9yhYrl///vPxKiEef//+8/Kn6H6P//7z+K3Ozp///vP213Quv//+8/0ACJ7P//7z/hIsHt///vP0OA6+7//+8/bbQI8P//7z8DVBnx///vPw7tHfL//+8/XwcX8///7z/BJAX0///vP0vB6PT//+8/llPC9f//7z8BTZL2///vP/AZWff//+8/9CEX+P//7z8XyMz4///vPwJrevn//+8/LmUg+v//7z8YDb/6///vP261Vvv//+8/Na3n+///7z/5P3L8///vP/G19vz//+8/HlR1/f//7z+AXO79///vPykOYv7//+8/XKXQ/v//7z/BWzr////vP2lon////+8/AAAAAAAA8D8=\"},\"shape\":[400],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1382\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1383\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1378\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#6baed6\",\"line_width\":2}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1379\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#6baed6\",\"line_alpha\":0.1,\"line_width\":2}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1380\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#6baed6\",\"line_alpha\":0.2,\"line_width\":2}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1390\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1384\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1385\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1386\"},\"data\":{\"type\":\"map\"}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1391\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1392\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1387\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":0.3333333333333333},\"y\":{\"type\":\"value\",\"value\":0.6321205588285577},\"size\":{\"type\":\"value\",\"value\":10},\"line_color\":{\"type\":\"value\",\"value\":\"#6baed6\"},\"fill_color\":{\"type\":\"value\",\"value\":\"#6baed6\"},\"hatch_color\":{\"type\":\"value\",\"value\":\"#6baed6\"}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1388\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":0.3333333333333333},\"y\":{\"type\":\"value\",\"value\":0.6321205588285577},\"size\":{\"type\":\"value\",\"value\":10},\"line_color\":{\"type\":\"value\",\"value\":\"#6baed6\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"fill_color\":{\"type\":\"value\",\"value\":\"#6baed6\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_color\":{\"type\":\"value\",\"value\":\"#6baed6\"},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1389\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":0.3333333333333333},\"y\":{\"type\":\"value\",\"value\":0.6321205588285577},\"size\":{\"type\":\"value\",\"value\":10},\"line_color\":{\"type\":\"value\",\"value\":\"#6baed6\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"fill_color\":{\"type\":\"value\",\"value\":\"#6baed6\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_color\":{\"type\":\"value\",\"value\":\"#6baed6\"},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p1245\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p1270\"},{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p1271\"},{\"type\":\"object\",\"name\":\"BoxZoomTool\",\"id\":\"p1272\",\"attributes\":{\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p1273\",\"attributes\":{\"syncable\":false,\"level\":\"overlay\",\"visible\":false,\"left_units\":\"canvas\",\"right_units\":\"canvas\",\"bottom_units\":\"canvas\",\"top_units\":\"canvas\",\"line_color\":\"black\",\"line_alpha\":1.0,\"line_width\":2,\"line_dash\":[4,4],\"fill_color\":\"lightgrey\",\"fill_alpha\":0.5}}}},{\"type\":\"object\",\"name\":\"SaveTool\",\"id\":\"p1274\"},{\"type\":\"object\",\"name\":\"ResetTool\",\"id\":\"p1275\"},{\"type\":\"object\",\"name\":\"HelpTool\",\"id\":\"p1276\"}]}},\"left\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1263\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1265\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1266\"},\"axis_label\":\"x(t)/x\\u209b\\u209b\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1264\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1256\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1258\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1259\"},\"axis_label\":\"time\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1257\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1262\",\"attributes\":{\"axis\":{\"id\":\"p1256\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1269\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p1263\"}}}],\"frame_width\":300,\"frame_height\":175}}]}}],\"callbacks\":{\"type\":\"map\"}}};\n", " const render_items = [{\"docid\":\"4a921173-3574-46dc-a838-b5e75ea9c3be\",\"roots\":{\"p1421\":\"34adc9b6-f7c7-4443-9803-3369c77c7a42\"},\"root_ids\":[\"p1421\"]}];\n", " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " let attempts = 0;\n", " const timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined) {\n", " clearInterval(timer);\n", " embed_document(root);\n", " } else {\n", " attempts++;\n", " if (attempts > 100) {\n", " clearInterval(timer);\n", " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", " }\n", " }\n", " }, 10, root)\n", " }\n", "})(window);" ], "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "p1421" } }, "output_type": "display_data" } ], "source": [ "# Parameters\n", "beta_1 = 100\n", "gamma = np.array([1, 2, 3])\n", "\n", "# Compute dynamics\n", "t = np.linspace(0, 6, 400)\n", "x = [beta_1 / g * (1 - np.exp(-g * t)) for g in gamma]\n", "\n", "# Set up plots\n", "colors = bokeh.palettes.Blues5\n", "p1 = bokeh.plotting.figure(\n", " frame_height=175,\n", " frame_width=300,\n", " x_axis_label=\"time\",\n", " y_axis_label=\"x(t)\",\n", " x_range=[0, 6],\n", ")\n", "p2 = bokeh.plotting.figure(\n", " frame_height=175,\n", " frame_width=300,\n", " x_axis_label=\"time\",\n", " y_axis_label=\"x(t)/xₛₛ\",\n", " x_range=[0, 6],\n", ")\n", "p2.x_range = p1.x_range\n", "\n", "# Populate graphs\n", "for x_vals, g, color in zip(x, gamma, colors):\n", " p1.line(t, x_vals, color=color, line_width=2)\n", " p1.circle(1 / g, beta_1 / g * (1 - np.exp(-1)), color=color, size=10)\n", " p2.line(t, x_vals / x_vals.max(), color=color, line_width=2)\n", " p2.circle(1 / g, 1 - np.exp(-1), color=color, size=10)\n", " \n", "\n", "# Label lines\n", "p1.text(\n", " x=[4],\n", " y=[95],\n", " text=[f\"γ = {gamma[0]}\"],\n", " text_color=colors[0],\n", " text_font_size=\"10pt\",\n", " text_align=\"left\",\n", " text_baseline=\"top\",\n", ")\n", "p1.text(\n", " x=[4],\n", " y=[53],\n", " text=[f\"γ = {gamma[1]}\"],\n", " text_color=colors[1],\n", " text_font_size=\"10pt\",\n", " text_align=\"left\",\n", " text_baseline=\"bottom\",\n", ")\n", "p1.text(\n", " x=[4],\n", " y=[30],\n", " text=[f\"γ = {gamma[2]}\"],\n", " text_color=colors[2],\n", " text_font_size=\"10pt\",\n", " text_align=\"left\",\n", " text_baseline=\"top\",\n", ")\n", "\n", "bokeh.io.show(bokeh.layouts.column([p1, bokeh.models.Spacer(height=20), p2]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "This analysis reveals an important **design principle**: _Increased protein degradation can speed up the response time of a gene expression system, at the cost of additional protein production, to reach the same steady state concentration._" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Network motifs identify functionally important circuits\n", "\n", "We have just seen that destabilizing a protein can speed its response time. However, most bacterial proteins, transcription factors in particular, are stable. Do they use other mechanisms to accelerate response times? \n", "\n", "The answer to this question will turn out to be yes, there is a circuit that can accelerate responses. But before we get there, let's step back for a moment to ask how one can go about discovering such functionally important circuits in the first place. Do you have to guess them? It would be nice if there were some kind of catalog of important circuits and their functions that we could browse.\n", "\n", "The concept of **network motifs** is one way to obtain such a catalog. We define a network motif as a regulatory pattern, or sub-circuit, that is statistically over-represented in natural networks (circuits), compared to what one might expect from random networks with similar numbers of genes and regulatory interactions. In 2002, Alon and colleagues showed that network motif analysis could reveal recurring circuit modules with specific functions ([Shen-Orr et al, Nat. Gen. 2002](https://doi.org/10.1038/ng881)). \n", "\n", "More specifically, imagine the transcriptional regulatory network of an organism as a **graph** consisting of **nodes** and **directed edges** (arrows). In bacteria, each node represents an operon, while each arrow represents regulation of the target operon (tip of the arrow) by a transcription factor in the originating operon (base of the arrow), as shown schematically here.\n", "\n", "
\n", "\n", "![simple graph](figs/simple_graph_2.png)\n", "\n", "
\n", "\n", "The transcriptional regulatory network of _E. coli_ has been mapped (see [RegulonDB](http://regulondb.ccg.unam.mx)). It contains ≈424 operons (nodes), ≈519 transcriptional regulatory interactions (arrows), involving ≈116 transcription factors. If the target of each arrow was chosen randomly, the probability of any given arrow being autoregulatory is low (≈1/424). One might expect only about one such event in the entire network. However, ≈40 such autoregulatory arrows are observed. (If we further consider whether the arrows are activating (+) or repressing (-), then we find 32 negative autoregulatory operons and 8 positive autoregulatory ones. Later on, we will discuss both types.) Autoregulation thus appears to be statistically over-represented compared to the null hypothesis of random regulatory interactions. It is a motif.\n", "\n", "The **motif principle** states that statistically over-represented patterns in networks have been selected repeatedly because they provide key cellular functions. A similar concept is useful in other aspects of biology. For example, sequence motifs are statistically over-represented sequences within the genome that are enriched for functionally important features, such as protein binding sites. Motifs of various kinds represent a cross-cutting concept in bioinformatics. " ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2019-04-03T17:45:04.997303Z", "start_time": "2019-04-03T17:45:04.994341Z" } }, "source": [ "## Negative autoregulation accelerates response times\n", "\n", "Identifying motifs in regulatory networks is one way to discover functionally important circuits, and one of the strongest motifs of them all is autoregulation. Here, we will analyze autorepression (we will explore autoactivation in the next chapter). You can guess that since we are discussing speeding up circuit response that autorepression does just that. So, how does it work?\n", "\n", "We start by writing down a differential equation describing the dynamics of the concentration $x$ of the repressor. We represent the regulation of production using a repressive Hill function.\n", "\n", "\\begin{align}\n", "\\frac{\\mathrm{d}x}{\\mathrm{d}t} = \\frac{\\beta}{1+(x/k)^n} - \\gamma x.\n", "\\end{align}\n", "\n", "For arbitrary $n$, this differential equation has no analytical solution. As is often the case when reasoning about circuits, it is worthwhile to consider extreme cases. We can obtain approximate expressions for the dynamics in the regime of, $\\beta/\\gamma k \\gg 1$. This is a mathematical statement of strong repression; the concentration of repressor necessary to invoke repression, $k$, is less than the steady state level for unregulated expression, $\\beta/\\gamma$. Here, we summarize the results derived in [Technical Appendix 2a](02a_approximate_autorepression_dynamics.ipynb)." ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2019-04-03T17:45:04.997303Z", "start_time": "2019-04-03T17:45:04.994341Z" } }, "source": [ "### Highly ultrasensitive, strong repression\n", "\n", "For the case where repression is highly ultrasensitive ($\\beta/\\gamma k \\gg 1$ and $n \\gg 1$), we have\n", "\n", "\\begin{align}\n", "x(t) \\approx \\left\\{\\begin{array}{lll}\n", "\\beta t & & t < k/\\beta,\\\\[1em]\n", "k & & t \\ge k/\\beta\n", "\\end{array}\n", "\\right.\n", "\\end{align}\n", "\n", "A plot of the this approximate $x(t)$ is shown below." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "data": { "text/html": [ "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function embed_document(root) {\n", " const docs_json = {\"85039b9f-b0ca-4bfc-907a-d876759c6155\":{\"version\":\"3.1.0\",\"title\":\"Bokeh Application\",\"defs\":[],\"roots\":[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p2029\",\"attributes\":{\"x_range\":{\"type\":\"object\",\"name\":\"Range1d\",\"id\":\"p2038\",\"attributes\":{\"end\":2}},\"y_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p2031\"},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p2042\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p2044\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p2033\"},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p2085\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p2079\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p2080\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p2081\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",[0,1,2]],[\"y\",[0,1,1]]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p2086\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p2087\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p2082\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b4\",\"line_width\":2}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p2083\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b4\",\"line_alpha\":0.1,\"line_width\":2}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p2084\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b4\",\"line_alpha\":0.2,\"line_width\":2}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p2094\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p2088\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p2089\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p2090\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",[0.2,0.2,0.3]],[\"y\",[0.2,0.3,0.3]]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p2095\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p2096\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p2091\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p2092\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_alpha\":0.1}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p2093\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_alpha\":0.2}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p2103\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p2097\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p2098\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p2099\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",[0.125]],[\"y\",[0.25]],[\"text\",[\"\\u03b2\"]]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p2104\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p2105\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Text\",\"id\":\"p2100\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"text\":{\"type\":\"field\",\"field\":\"text\"},\"text_color\":{\"type\":\"value\",\"value\":\"black\"},\"text_font_size\":{\"type\":\"value\",\"value\":\"12pt\"}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Text\",\"id\":\"p2101\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"text\":{\"type\":\"field\",\"field\":\"text\"},\"text_color\":{\"type\":\"value\",\"value\":\"black\"},\"text_alpha\":{\"type\":\"value\",\"value\":0.1},\"text_font_size\":{\"type\":\"value\",\"value\":\"12pt\"}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Text\",\"id\":\"p2102\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"text\":{\"type\":\"field\",\"field\":\"text\"},\"text_color\":{\"type\":\"value\",\"value\":\"black\"},\"text_alpha\":{\"type\":\"value\",\"value\":0.2},\"text_font_size\":{\"type\":\"value\",\"value\":\"12pt\"}}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p2035\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p2060\"},{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p2061\"},{\"type\":\"object\",\"name\":\"BoxZoomTool\",\"id\":\"p2062\",\"attributes\":{\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p2063\",\"attributes\":{\"syncable\":false,\"level\":\"overlay\",\"visible\":false,\"left_units\":\"canvas\",\"right_units\":\"canvas\",\"bottom_units\":\"canvas\",\"top_units\":\"canvas\",\"line_color\":\"black\",\"line_alpha\":1.0,\"line_width\":2,\"line_dash\":[4,4],\"fill_color\":\"lightgrey\",\"fill_alpha\":0.5}}}},{\"type\":\"object\",\"name\":\"SaveTool\",\"id\":\"p2064\"},{\"type\":\"object\",\"name\":\"ResetTool\",\"id\":\"p2065\"},{\"type\":\"object\",\"name\":\"HelpTool\",\"id\":\"p2066\"}]}},\"left\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p2053\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"FixedTicker\",\"id\":\"p2077\",\"attributes\":{\"ticks\":[0,1],\"minor_ticks\":[]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p2056\"},\"axis_label\":\"x(t)\",\"major_label_overrides\":{\"type\":\"map\",\"entries\":[[1,\"$$k$$\"]]},\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p2054\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p2046\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"FixedTicker\",\"id\":\"p2075\",\"attributes\":{\"ticks\":[0,1],\"minor_ticks\":[]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p2049\"},\"axis_label\":\"time\",\"major_label_overrides\":{\"type\":\"map\",\"entries\":[[1,\"$$k/\\\\beta$$\"]]},\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p2047\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p2052\",\"attributes\":{\"axis\":{\"id\":\"p2046\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p2059\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p2053\"}}}],\"frame_width\":300,\"frame_height\":175}}],\"callbacks\":{\"type\":\"map\"}}};\n", " const render_items = [{\"docid\":\"85039b9f-b0ca-4bfc-907a-d876759c6155\",\"roots\":{\"p2029\":\"0ae44106-c259-427b-a8eb-2a3f49a66431\"},\"root_ids\":[\"p2029\"]}];\n", " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " let attempts = 0;\n", " const timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined) {\n", " clearInterval(timer);\n", " embed_document(root);\n", " } else {\n", " attempts++;\n", " if (attempts > 100) {\n", " clearInterval(timer);\n", " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", " }\n", " }\n", " }, 10, root)\n", " }\n", "})(window);" ], "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "p2029" } }, "output_type": "display_data" } ], "source": [ "# Curve\n", "t = [0, 1, 2]\n", "x = [0, 1, 1]\n", "\n", "# Set up plot\n", "p = bokeh.plotting.figure(\n", " frame_height=175,\n", " frame_width=300,\n", " x_axis_label=\"time\",\n", " y_axis_label=\"x(t)\",\n", " x_range=[0, 2],\n", ")\n", "\n", "# Custom axis labels\n", "p.xaxis.ticker = bokeh.models.tickers.FixedTicker(ticks=[0, 1])\n", "p.yaxis.ticker = bokeh.models.tickers.FixedTicker(ticks=[0, 1])\n", "p.xaxis.major_label_overrides = {1: \"$$k/\\\\beta$$\"}\n", "p.yaxis.major_label_overrides = {1: \"$$k$$\"}\n", "\n", "# Populate plot\n", "p.line(t, x, line_width=2)\n", "\n", "# Label slope\n", "p.line([0.2, 0.2, 0.3], [0.2, 0.3, 0.3], color='black')\n", "p.text(\n", " x=[0.125],\n", " y=[0.25],\n", " text=[\"β\"],\n", " text_color=\"black\",\n", " text_font_size=\"12pt\",\n", ")\n", "\n", "bokeh.io.show(p)" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2019-04-03T17:45:04.997303Z", "start_time": "2019-04-03T17:45:04.994341Z" } }, "source": [ "Initially, $x$ builds up approximately linearly, at rate $\\beta$, since the repression is step-like and no repression is occurring for small $x$. Eventually, its concentration is high enough to shut its own production off when $x \\approx k$, after which the steady state is maintained at $x \\approx k$.\n", "\n", "The half-time to the steady state of $k$ is $t_{1/2} \\approx k/2\\beta$. \n", "\n", "In the unregulated case,\n", "\n", "\\begin{align}\n", "x(t) = \\frac{\\beta}{\\gamma}\\left(1 - \\mathrm{e}^{-\\gamma t}\\right),\n", "\\end{align}\n", "\n", "giving a half time of $t_\\mathrm{1/2} = \\ln 2 / \\gamma$. Comparing the half times,\n", "\n", "\\begin{align}\n", "\\frac{\\text{autorepressed }t_{1/2}}{\\text{unregulated }t_{1/2}} \\approx \\frac{k/2\\beta}{\\ln 2/\\gamma} = \\frac{1}{2\\ln 2}\\,\\frac{\\gamma k}{\\beta} \\ll 1,\n", "\\end{align}\n", "\n", "since $\\beta/\\gamma k \\gg 1$ for strong repression. Thus, the time to reach steady state is much shorter for the autorepressed circuit in the highly ultrasensitive, strong repression regime." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Less ultrasensitive strong autorepression\n", "\n", "If we relax the condition that $n \\gg 1$, we can derive an approximate expression for the dynamics for approach to steady state, assuming that $x_\\mathrm{ss} \\gg k$, which is typically only valid for $n$ not too large. The result, again derived in [Technical Appendix 2a](02a_approximate_autorepression_dynamics.ipynb), is\n", "\n", "\\begin{align}\n", "x(t) \\approx k\\left(\\frac{\\beta}{\\gamma k}\\right)^{\\frac{1}{n+1}}\\left(1 - \\mathrm{e}^{-(n+1)\\gamma t}\\right)^{\\frac{1}{n+1}},\n", "\\end{align}\n", "\n", "with the approximate steady state being\n", "\n", "\\begin{align}\n", "x_\\mathrm{ss}(t) \\approx k\\left(\\frac{\\beta}{\\gamma k}\\right)^{\\frac{1}{n+1}}.\n", "\\end{align}\n", "\n", "We then have\n", "\n", "\\begin{align}\n", "t_{1/2} \\approx \\frac{1}{(n+1)\\gamma}\\,\\ln\\left(\\frac{2^{n+1}}{2^{n+1}-1}\\right).\n", "\\end{align}\n", "\n", "Comparing to the unregulated case,\n", "\n", "\\begin{align}\n", "\\frac{\\text{autorepressed }t_{1/2}}{\\text{unregulated }t_{1/2}} \\approx \\frac{\\ln\\left(\\frac{2^{n+1}}{2^{n+1}-1}\\right)}{(n+1)\\ln 2} < 1,\n", "\\end{align}\n", "\n", "meaning that the autorepressed circuit still have faster response. If we consider the non-ultrasensitive case with $n = 1$, the ratio of half times is\n", "\n", "\\begin{align}\n", "\\frac{\\text{autorepressed }t_{1/2}}{\\text{unregulated }t_{1/2}} \\approx \\frac{\\ln (4/3)}{2 \\ln 2} \\approx 0.2,\n", "\\end{align}\n", "\n", "with the autorepressed circuit being five times faster.\n", "\n", "These approximate solutions for the dynamics are quite useful for reasoning about the speed boosts given by autorepression, but we need to resort to numerical solutions of the ODE to get the complete dynamics. We do this in the following sections, pausing first to consider how we might explicitly model inducers in the dynamics." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Incorporating explicit input dependence into a model of regulation\n", "\n", "Throughout this chapter we have been invoking a situation where the gene has been off for some time before it is suddenly turned on. We previously saw that it is possible for an inducer molecule to inhibit the action of a repressor, but it is also possible for there to be molecules that can activate the action of a repressor, or inhibit the action of an activator, or many other types of interactions. For now, we will ignore specific biomolecular details and simply write out a generic dependence of the autorepressive gene's expression on the presence of some external signal, $s$.\n", "\n", "\\begin{align}\n", "\\frac{\\mathrm{d}x}{\\mathrm{d}t} = \\frac{\\beta(s)}{1 + (x/k)^n} - \\gamma x.\n", "\\end{align}\n", "\n", "What is the functional form of $\\beta(s)$? We expect $\\beta$ should increase with $s$ and have a value close to $0$ when $s$ is close to $0$. Furthermore, there should be a limit to how rapidly the gene product can be produced, so $\\beta(s)$ must be finite, even for large $s$. As we saw in the previous chapter, the Hill function satisfies all of these properties, and therefore provides a simple phenomenological model of activation by $s$. Additionally, the two parameters of the Hill function, $k$ and $n$, allow flexibility in the $s$ concentration required for activation as well as the degree of ultrasensitivity. We will therefore represent $\\beta(s)$ as an activating Hill function of $s$:\n", "\n", "\\begin{align}\n", "\\beta (s) = \\beta_0\\, \\frac{(s/k_s)^{n_s}}{1 + (s/k_s)^{n_s}}.\n", "\\end{align}\n", "\n", "Choosing $n_s = 1$ leads to a linear relationship between $\\beta$ and $s$ in the regime where $s \\ll k_s$. Alternatively, the same versatile function can produce a step-like response in $\\beta$ at $s = k_s$ if we choose $n_s \\gg 1$. It is important to keep in mind that the $\\beta(s)$ Hill function does not represent a process of transcriptional regulation like the Hill term in our original $\\mathrm{d}x/\\mathrm{d}t$ expression, but rather phenomenologically represents a complex process of enzymatic inactivation of the repressor $x$ by the external signal $s$.\n", "\n", "Having chosen to represent $\\beta(s)$ as an activating Hill function, our ODE model for our autoregulated gene now contains a product of activating and repressing Hill functions:\n", "\n", "\\begin{align}\n", "\\frac{\\mathrm{d}x}{\\mathrm{d}t} = \\beta_0\\,\\frac{(s/k_s)^{n_s}}{1 + (s/k_s)^{n_s}}\\, \\frac{1}{(1 + (x/k)^n)} - \\gamma x.\n", "\\end{align}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Numerically solving for the dynamics\n", "\n", "As our dynamical equations become more complex, as they are starting to here, numerical solutions become essential. Indeed, numerical solution of ordinary differential equations is a ubiquitous technique in the study and design of biological circuits. We introduce this technique in [Technical Appendix 2b](../technical_appendices/02b_numerical_odes.ipynb) of this chapter.\n", "\n", "In our following analysis, we will consider the non-ultrasensitive case of $n = 1$." ] }, { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "### Solving for a constant input\n", "\n", "We will first consider the case where we initially have no $s$ present, but a step increase in $s$ at time $t=0$ causes a corresponding step-like increase in the value of $\\beta$, which we represent by having $n_s \\gg 1$ and $s \\gg k_s$. After solving for $x(t)$ numerically, we will plot it along with the unregulated case,\n", "\n", "\\begin{align}\n", "x(t) = \\frac{\\beta_0}{\\gamma}\\,\\frac{(s/k_s)^{n_s}}{1 + (s/k_s)^{n_s}}\\left(1 - \\mathrm{e}^{-\\gamma t}\\right)\n", "\\end{align}\n", "\n", "for comparison. The result, detailed in [Technical Appendix 2b](../technical_appendices/02a_numerical_odes.ipynb), is shown below." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "data": { "text/html": [ "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function embed_document(root) {\n", " const docs_json = {\"df84a545-a3df-403b-8943-29fd5ae18d4d\":{\"version\":\"3.1.0\",\"title\":\"Bokeh Application\",\"defs\":[],\"roots\":[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p2356\",\"attributes\":{\"x_range\":{\"type\":\"object\",\"name\":\"Range1d\",\"id\":\"p2365\",\"attributes\":{\"end\":10.0}},\"y_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p2358\"},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p2369\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p2371\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p2360\",\"attributes\":{\"text\":\"Constant-input dynamics\"}},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p2411\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p2402\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p2403\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p2404\"},\"data\":{\"type\":\"map\",\"entries\":[[\"t\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[200],\"dtype\":\"float64\",\"order\":\"little\"}],[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[200],\"dtype\":\"float64\",\"order\":\"little\"}],[\"x_unreg\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[200],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p2412\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p2413\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p2408\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"t\"},\"y\":{\"type\":\"field\",\"field\":\"x\"},\"line_color\":\"#1f77b3\",\"line_width\":2}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p2409\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"t\"},\"y\":{\"type\":\"field\",\"field\":\"x\"},\"line_color\":\"#1f77b3\",\"line_alpha\":0.1,\"line_width\":2}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p2410\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"t\"},\"y\":{\"type\":\"field\",\"field\":\"x\"},\"line_color\":\"#1f77b3\",\"line_alpha\":0.2,\"line_width\":2}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p2422\",\"attributes\":{\"data_source\":{\"id\":\"p2402\"},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p2423\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p2424\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p2419\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"t\"},\"y\":{\"type\":\"field\",\"field\":\"x_unreg\"},\"line_color\":\"#ff7e0e\",\"line_width\":2}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p2420\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"t\"},\"y\":{\"type\":\"field\",\"field\":\"x_unreg\"},\"line_color\":\"#ff7e0e\",\"line_alpha\":0.1,\"line_width\":2}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p2421\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"t\"},\"y\":{\"type\":\"field\",\"field\":\"x_unreg\"},\"line_color\":\"#ff7e0e\",\"line_alpha\":0.2,\"line_width\":2}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p2362\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p2387\"},{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p2388\"},{\"type\":\"object\",\"name\":\"BoxZoomTool\",\"id\":\"p2389\",\"attributes\":{\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p2390\",\"attributes\":{\"syncable\":false,\"level\":\"overlay\",\"visible\":false,\"left_units\":\"canvas\",\"right_units\":\"canvas\",\"bottom_units\":\"canvas\",\"top_units\":\"canvas\",\"line_color\":\"black\",\"line_alpha\":1.0,\"line_width\":2,\"line_dash\":[4,4],\"fill_color\":\"lightgrey\",\"fill_alpha\":0.5}}}},{\"type\":\"object\",\"name\":\"SaveTool\",\"id\":\"p2391\"},{\"type\":\"object\",\"name\":\"ResetTool\",\"id\":\"p2392\"},{\"type\":\"object\",\"name\":\"HelpTool\",\"id\":\"p2393\"}]}},\"left\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p2380\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p2382\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p2383\"},\"axis_label\":\"x\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p2381\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p2373\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p2375\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p2376\"},\"axis_label\":\"time\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p2374\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p2379\",\"attributes\":{\"axis\":{\"id\":\"p2373\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p2386\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p2380\"}}},{\"type\":\"object\",\"name\":\"Legend\",\"id\":\"p2414\",\"attributes\":{\"location\":\"center_right\",\"click_policy\":\"hide\",\"items\":[{\"type\":\"object\",\"name\":\"LegendItem\",\"id\":\"p2415\",\"attributes\":{\"label\":{\"type\":\"value\",\"value\":\"autorepressive\"},\"renderers\":[{\"id\":\"p2411\"}]}},{\"type\":\"object\",\"name\":\"LegendItem\",\"id\":\"p2425\",\"attributes\":{\"label\":{\"type\":\"value\",\"value\":\"unregulated\"},\"renderers\":[{\"id\":\"p2422\"}]}}]}}],\"frame_width\":325,\"frame_height\":250}}],\"callbacks\":{\"type\":\"map\"}}};\n", " const render_items = [{\"docid\":\"df84a545-a3df-403b-8943-29fd5ae18d4d\",\"roots\":{\"p2356\":\"fbf49629-c392-4135-bc87-4a36d2b6e508\"},\"root_ids\":[\"p2356\"]}];\n", " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " let attempts = 0;\n", " const timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined) {\n", " clearInterval(timer);\n", " embed_document(root);\n", " } else {\n", " attempts++;\n", " if (attempts > 100) {\n", " clearInterval(timer);\n", " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", " }\n", " }\n", " }, 10, root)\n", " }\n", "})(window);" ], "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "p2356" } }, "output_type": "display_data" } ], "source": [ "def neg_auto_rhs(x, t, beta0, gamma, k, n, ks, ns, s):\n", " \"\"\"\n", " Right hand side for negative autoregulation motif with s dependence.\n", " Return dx/dt.\n", " \"\"\"\n", " # Compute dx/dt\n", " return (\n", " beta0 * (s / ks) ** ns / (1 + (s / ks) ** ns) / (1 + (x / k) ** n) - gamma * x\n", " )\n", "\n", "\n", "# Time points we want for the solution\n", "t = np.linspace(0, 10, 200)\n", "\n", "# Initial condition\n", "x0 = 0.0\n", "\n", "# Parameters\n", "beta0 = 100\n", "gamma = 1.0\n", "k = 1.0\n", "n = 1.0\n", "s = 100.0\n", "ns = 10.0\n", "ks = 0.1\n", "\n", "# Package parameters into a tuple\n", "args = (beta0, gamma, k, n, ks, ns, s)\n", "\n", "# Integrate ODES\n", "x = scipy.integrate.odeint(neg_auto_rhs, x0, t, args=args)\n", "\n", "# Extract time course for first (in this case only) species\n", "x = x.transpose()[0]\n", "\n", "# Unregulated solution\n", "x_unreg = (\n", " beta0 * (s / ks) ** ns / (1 + (s / ks) ** ns) / gamma * (1 - np.exp(-gamma * t))\n", ")\n", "\n", "# Set up color palette for this notebook\n", "colors = colorcet.b_glasbey_category10\n", "\n", "# Set up figure\n", "p = bokeh.plotting.figure(\n", " frame_width=325,\n", " frame_height=250,\n", " x_axis_label=\"time\",\n", " y_axis_label=\"x\",\n", " x_range=[np.min(t), np.max(t)],\n", ")\n", "\n", "cds = bokeh.models.ColumnDataSource(\n", " dict(t=t, x=x, x_unreg=x_unreg)\n", ")\n", "\n", "# Populate glyphs\n", "p.line(\n", " source=cds,\n", " x=\"t\",\n", " y=\"x\",\n", " line_width=2,\n", " color=colors[0],\n", " legend_label=\"autorepressive\",\n", ")\n", "p.line(\n", " source=cds,\n", " x=\"t\",\n", " y=\"x_unreg\",\n", " line_width=2,\n", " color=colors[1],\n", " legend_label=\"unregulated\",\n", ")\n", "\n", "# Place the legend\n", "p.legend.location = \"center_right\"\n", "\n", "# Allow hiding some plots\n", "p.legend.click_policy = \"hide\"\n", "\n", "# Write the title\n", "p.title.text = \"Constant-input dynamics\"\n", "\n", "bokeh.io.show(p)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Since we want to compare the speed with which the system approaches steady state, we should instead plot the normalized expression level." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "data": { "text/html": [ "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function embed_document(root) {\n", " const docs_json = {\"1bb37e52-0669-41b1-a7a3-50df2cd8f9d5\":{\"version\":\"3.1.0\",\"title\":\"Bokeh Application\",\"defs\":[],\"roots\":[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p2356\",\"attributes\":{\"x_range\":{\"type\":\"object\",\"name\":\"Range1d\",\"id\":\"p2365\",\"attributes\":{\"end\":10.0}},\"y_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p2358\"},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p2369\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p2371\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p2360\",\"attributes\":{\"text\":\"Constant-input dynamics\"}},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p2411\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p2402\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p2403\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p2404\"},\"data\":{\"type\":\"map\",\"entries\":[[\"t\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAAAAAACBhJ9ciLqpP4GEn1yIurk/YaN3ReZLwz+BhJ9ciLrJP9Gy4zmVFNA/YaN3ReZL0z/xkwtRN4PWP4GEn1yIutk/EXUzaNnx3D/RsuM5lRTgPxmrrb89sOE/YaN3ReZL4z+pm0HLjufkP/GTC1E3g+Y/OYzV1t8e6D+BhJ9ciLrpP8l8aeIwVus/EXUzaNnx7D9Zbf3tgY3uP9Gy4zmVFPA/9a7IfGni8D8Zq62/PbDxPz2nkgISfvI/YaN3ReZL8z+Fn1yIuhn0P6mbQcuO5/Q/zZcmDmO19T/xkwtRN4P2PxWQ8JMLUfc/OYzV1t8e+D9diLoZtOz4P4GEn1yIuvk/pYCEn1yI+j/JfGniMFb7P+14TiUFJPw/EXUzaNnx/D81cRirrb/9P1lt/e2Bjf4/fWniMFZb/z/RsuM5lRQAQOMwVlt/ewBA9a7IfGniAEAHLTueU0kBQBmrrb89sAFAKykg4ScXAkA9p5ICEn4CQE8lBST85AJAYaN3ReZLA0BzIepm0LIDQIWfXIi6GQRAlx3PqaSABECpm0HLjucEQLsZtOx4TgVAzZcmDmO1BUDfFZkvTRwGQPGTC1E3gwZAAxJ+ciHqBkAVkPCTC1EHQCcOY7X1twdAOYzV1t8eCEBLCkj4yYUIQF2Iuhm07AhAbwYtO55TCUCBhJ9ciLoJQJMCEn5yIQpApYCEn1yICkC3/vbARu8KQMl8aeIwVgtA2/rbAxu9C0DteE4lBSQMQP/2wEbvigxAEXUzaNnxDEAj86WJw1gNQDVxGKutvw1AR++KzJcmDkBZbf3tgY0OQGvrbw9s9A5AfWniMFZbD0CP51RSQMIPQNGy4zmVFBBA2vGcSgpIEEDjMFZbf3sQQOxvD2z0rhBA9a7IfGniEED+7YGN3hURQActO55TSRFAEGz0rsh8EUAZq62/PbARQCLqZtCy4xFAKykg4ScXEkA0aNnxnEoSQD2nkgISfhJARuZLE4exEkBPJQUk/OQSQFhkvjRxGBNAYaN3ReZLE0Bq4jBWW38TQHMh6mbQshNAfGCjd0XmE0CFn1yIuhkUQI7eFZkvTRRAlx3PqaSAFECgXIi6GbQUQKmbQcuO5xRAstr62wMbFUC7GbTseE4VQMRYbf3tgRVAzZcmDmO1FUDW1t8e2OgVQN8VmS9NHBZA6FRSQMJPFkDxkwtRN4MWQPrSxGGsthZAAxJ+ciHqFkAMUTeDlh0XQBWQ8JMLURdAHs+ppICEF0AnDmO19bcXQDBNHMZq6xdAOYzV1t8eGEBCy47nVFIYQEsKSPjJhRhAVEkBCT+5GEBdiLoZtOwYQGbHcyopIBlAbwYtO55TGUB4ReZLE4cZQIGEn1yIuhlAisNYbf3tGUCTAhJ+ciEaQJxBy47nVBpApYCEn1yIGkCuvz2w0bsaQLf+9sBG7xpAwD2w0bsiG0DJfGniMFYbQNK7IvOliRtA2/rbAxu9G0DkOZUUkPAbQO14TiUFJBxA9rcHNnpXHED/9sBG74ocQAg2eldkvhxAEXUzaNnxHEAatOx4TiUdQCPzpYnDWB1ALDJfmjiMHUA1cRirrb8dQD6w0bsi8x1AR++KzJcmHkBQLkTdDFoeQFlt/e2BjR5AYqy2/vbAHkBr628PbPQeQHQqKSDhJx9AfWniMFZbH0CGqJtBy44fQI/nVFJAwh9AmCYOY7X1H0DRsuM5lRQgQFVSQMJPLiBA2vGcSgpIIEBekfnSxGEgQOMwVlt/eyBAZ9Cy4zmVIEDsbw9s9K4gQHAPbPSuyCBA9a7IfGniIEB5TiUFJPwgQP7tgY3eFSFAgo3eFZkvIUAHLTueU0khQIvMlyYOYyFAEGz0rsh8IUCUC1E3g5YhQBmrrb89sCFAnUoKSPjJIUAi6mbQsuMhQKaJw1ht/SFAKykg4ScXIkCvyHxp4jAiQDRo2fGcSiJAuAc2eldkIkA9p5ICEn4iQMFG74rMlyJARuZLE4exIkDKhaibQcsiQE8lBST85CJA08RhrLb+IkBYZL40cRgjQNwDG70rMiNAYaN3ReZLI0DlQtTNoGUjQGriMFZbfyNA7oGN3hWZI0BzIepm0LIjQPfARu+KzCNAfGCjd0XmI0AAAAAAAAAkQA==\"},\"shape\":[200],\"dtype\":\"float64\",\"order\":\"little\"}],[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAAAAAABCF4v6VYvOP0L8vX+4D9c/hKtOKv+33D/zggw1WpjgP1d5Fcxxb+I/HQsWuJD84z/EOz6Yo1DlP2JMApAdd+Y/OI5qyTd45z9iJv1WHVroP4mdjiOWIek/IP6wQG/S6T9Tu1oevm/qP7tWzrgN/Oo/j431GH556z8772v22unrP9nNamysTuw/pMNTi0Op7D8ogtEFxPrsP1gd5r4rRO0/hdUlx1iG7T/eRKQyDsLtP5yf3AL49+0/apeoYK4o7j+0OU1JuFTuP27rg8yNfO4/twoP75mg7j8jatFFPMHuP33RSFbK3u4/8GhEw5D57j/efU1S1BHvPxZ7cM3SJ+8/ZOKnyMM77z+8K1NO2U3vPzH3b3dAXu8/Z9iJ8CFt7z+cYYRtonrvP5dXdBbjhu8/pMhN4QGS7z+xrBjkGZzvPwZmTKBDpe8/ZTgKQpWt7z9ssOncIrXvP99mOZ/+u+8/j8ciATnC7z/qWsbv4MfvP0JUj/IDze8/f2rITa7R7z/SfBYf69XvP9udf37E2e8/kf/WkUPd7z8RD7GncODvP0vdNEhT4+8/+4dwSvLl7z9APtviU+jvP5On67N96u8/5M8T23Ts7z+9Sx/9Pe7vP9ORpFHd7+8/aNmVrFbx7z9FU2aIrfLvPwaQUw3l8+8/IE4ZGgD17z9STcRIAfbvPxHWL/fq9u8/+GH5S7/37z+uU3M6gPjvP2whMIkv+e8/J+1y1M757z8LEs2SX/rvP8J2/Bjj+u8/wK7am1r77z/Gz5w0x/vvP8RkmOIp/O8/A56WjYP87z9rL5AI1fzvP9g0yxIf/e8/BEpKWmL97z/zsTV9n/3vP1tpBAvX/e8/QkBehgn+7z+hSMxlN/7vP0W6BhVh/u8/jgAL9ob+7z9akbZhqf7vP2/55KjI/u8/WKcWFeX+7z9gywPp/v7vPxKhc2EW/+8/BmRetSv/7z8r1Z8WP//vP5TC1LJQ/+8/rcRts2D/7z8ZtS0+b//vP/ax93R8/+8/kBHldoj/7z9Isnxgk//vP0B0Ekud/+8/GG3YTab/7z8xEid+rv/vP/u3Ee+1/+8/UPb8sbz/7z/T6PjWwv/vPw0cZWzI/+8/wLBBf83/7z9puJcb0v/vPx0bMkzW/+8/47DCGtr/7z/Ic1SQ3f/vP0vjPrXg/+8/FHG1kOP/7z/8+Vgp5v/vPy+HVIXo/+8/j5lEqur/7z+jlAqd7P/vP/tqO2Lu/+8/SKwU/u//7z/Loll08f/vPzSZZsjy/+8/Cptk/fP/7z+yzj0W9f/vP29QdBX2/+8/XfhY/fb/7z9r4BLQ9//vP9X2oI/4/+8/lk+aPfn/7z+pWrTb+f/vP0HKY2v6/+8/Ufnx7fr/7z+Nhotk+//vP3aKT9D7/+8/EktFMvz/7z8NjluL/P/vP+FJYtz8/+8/v5ESJv3/7z9bxQ1p/f/vPwNy3KX9/+8/I3kB3f3/7z8/XSAP/v/vP1Rvrjz+/+8/SIAOZv7/7z/5dpOL/v/vP/KBnK3+/+8/XF2OzP7/7z+JQLLo/v/vP1aZRwL//+8/M3b0Gf//7z+9aNAu///vP6f18EH//+8/1Y9qU///7z8xqlFj///vP1OuvnH//+8/AvHYfv//7z+lXL2K///vP19hh5X//+8/Um9Sn///7z+e9jmo///vP1MxUrD//+8/xPmmt///7z9Fb02+///vP87bWsT//+8/Wonkyf//7z+njP/O///vP59GrNP//+8/q5jq1///7z9QI8Xb///vPxGHRt///+8/bmR54v//7z8qywbm///vP1MFZuj//+8/mo6e6v//7z/+ZrDs///vP4COm+7//+8/HwVg8P//7z+16f7x///vP+F1fPP//+8/mxHZ9P//7z/hvBT2///vP7h3L/f//+8/G0Ip+P//7z+3FgX5///vPyx5zvn//+8/vI6G+v//7z9oVy37///vPzHTwvv//+8/FwJH/P//7z+Umrv8///vP/llJ/3//+8/ExeL/f//7z/hreb9///vP2EqOv7//+8/l4yF/v//7z/Iecn+///vP2GRCP///+8/0BpD////7z8WFnn////vPzODqv///+8/J2LX////7z8AAAAAAADwPw==\"},\"shape\":[200],\"dtype\":\"float64\",\"order\":\"little\"}],[\"x_unreg\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[200],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p2412\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p2413\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p2408\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"t\"},\"y\":{\"type\":\"field\",\"field\":\"x\"},\"line_color\":\"#1f77b3\",\"line_width\":2}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p2409\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"t\"},\"y\":{\"type\":\"field\",\"field\":\"x\"},\"line_color\":\"#1f77b3\",\"line_alpha\":0.1,\"line_width\":2}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p2410\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"t\"},\"y\":{\"type\":\"field\",\"field\":\"x\"},\"line_color\":\"#1f77b3\",\"line_alpha\":0.2,\"line_width\":2}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p2422\",\"attributes\":{\"data_source\":{\"id\":\"p2402\"},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p2423\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p2424\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p2419\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"t\"},\"y\":{\"type\":\"field\",\"field\":\"x_unreg\"},\"line_color\":\"#ff7e0e\",\"line_width\":2}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p2420\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"t\"},\"y\":{\"type\":\"field\",\"field\":\"x_unreg\"},\"line_color\":\"#ff7e0e\",\"line_alpha\":0.1,\"line_width\":2}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p2421\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"t\"},\"y\":{\"type\":\"field\",\"field\":\"x_unreg\"},\"line_color\":\"#ff7e0e\",\"line_alpha\":0.2,\"line_width\":2}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p2362\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p2387\"},{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p2388\"},{\"type\":\"object\",\"name\":\"BoxZoomTool\",\"id\":\"p2389\",\"attributes\":{\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p2390\",\"attributes\":{\"syncable\":false,\"level\":\"overlay\",\"visible\":false,\"left_units\":\"canvas\",\"right_units\":\"canvas\",\"bottom_units\":\"canvas\",\"top_units\":\"canvas\",\"line_color\":\"black\",\"line_alpha\":1.0,\"line_width\":2,\"line_dash\":[4,4],\"fill_color\":\"lightgrey\",\"fill_alpha\":0.5}}}},{\"type\":\"object\",\"name\":\"SaveTool\",\"id\":\"p2391\"},{\"type\":\"object\",\"name\":\"ResetTool\",\"id\":\"p2392\"},{\"type\":\"object\",\"name\":\"HelpTool\",\"id\":\"p2393\"}]}},\"left\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p2380\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p2382\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p2383\"},\"axis_label\":\"x(t)/x\\u209b\\u209b\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p2381\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p2373\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p2375\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p2376\"},\"axis_label\":\"time\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p2374\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p2379\",\"attributes\":{\"axis\":{\"id\":\"p2373\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p2386\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p2380\"}}},{\"type\":\"object\",\"name\":\"Legend\",\"id\":\"p2414\",\"attributes\":{\"location\":\"center_right\",\"click_policy\":\"hide\",\"items\":[{\"type\":\"object\",\"name\":\"LegendItem\",\"id\":\"p2415\",\"attributes\":{\"label\":{\"type\":\"value\",\"value\":\"autorepressive\"},\"renderers\":[{\"id\":\"p2411\"}]}},{\"type\":\"object\",\"name\":\"LegendItem\",\"id\":\"p2425\",\"attributes\":{\"label\":{\"type\":\"value\",\"value\":\"unregulated\"},\"renderers\":[{\"id\":\"p2422\"}]}}]}}],\"frame_width\":325,\"frame_height\":250}}],\"callbacks\":{\"type\":\"map\"}}};\n", " const render_items = [{\"docid\":\"1bb37e52-0669-41b1-a7a3-50df2cd8f9d5\",\"roots\":{\"p2356\":\"3957ab16-c4c7-4d03-9bc4-20fc695fc644\"},\"root_ids\":[\"p2356\"]}];\n", " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " let attempts = 0;\n", " const timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined) {\n", " clearInterval(timer);\n", " embed_document(root);\n", " } else {\n", " attempts++;\n", " if (attempts > 100) {\n", " clearInterval(timer);\n", " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", " }\n", " }\n", " }, 10, root)\n", " }\n", "})(window);" ], "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "p2356" } }, "output_type": "display_data" } ], "source": [ "cds.data[\"x\"] /= cds.data[\"x\"].max()\n", "cds.data[\"x_unreg\"] /= cds.data[\"x_unreg\"].max()\n", "\n", "# Update axis label\n", "p.yaxis.axis_label = \"x(t)/xₛₛ\"\n", "\n", "# Show plot\n", "bokeh.io.show(p)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can use these numerical solutions to compare the ratios of the half times of the autorepressed and unregulated case." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "half time ratio = 0.23\n" ] } ], "source": [ "# Find half time by finding time where reaches half maximum value\n", "half_time_ratio = t[x <= x[-1] / 2][-1] / t[x_unreg <= x_unreg[-1] / 2][-1]\n", "\n", "print(\"half time ratio = %.2f\" % half_time_ratio)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is close to the ratio of 0.2 that we derived from the approximate analytical solution above." ] }, { "cell_type": "markdown", "metadata": { "jp-MarkdownHeadingCollapsed": true, "tags": [] }, "source": [ "### Design principle: Negative autoregulation of a transcription factor accelerates its response to a change in input\n", "\n", "Comparing the unnormalized and normalized plots exposes two related effects of autoregulation. First, adding negative autoregulation reduces the steady-state expression level. Second, as a consequence, the approach to steady state is accelerated. This can be seen in the second plot where all the concentrations are normalized to their steady state. All told, in this example, negative autoregulation accelerated the dynamics by about 5-fold compared to the unregulated system. We have thus arrived at another **design principle**: _Negative autoregulation of a transcription factor accelerates its response to a change in input_." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Experimental demonstration of negative autoregulation speeding response time\n", "\n", "Can this acceleration be observed experimentally? To find out, Rosenfeld and coworkers engineered a simple synthetic system based on a bacterial repressor called TetR, fused to a fluorescent protein for readout, and studied its turn-on dynamics in bacterial populations. The plot below show the response to sudden induction of gene expression of GFP-fused TetR, using data digitized from Fig. 3 of the [Rosenfeld, et al. paper](https://doi.org/10.1016/S0022-2836(02)00994-4)." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "data": { "text/html": [ "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function embed_document(root) {\n", " const docs_json = {\"c27b0757-3552-4d36-b749-af7301e369a2\":{\"version\":\"3.1.0\",\"title\":\"Bokeh Application\",\"defs\":[],\"roots\":[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p2766\",\"attributes\":{\"x_range\":{\"type\":\"object\",\"name\":\"Range1d\",\"id\":\"p2775\"},\"y_range\":{\"type\":\"object\",\"name\":\"Range1d\",\"id\":\"p2777\",\"attributes\":{\"end\":1.1}},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p2779\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p2781\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p2770\"},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p2818\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p2812\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p2813\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p2814\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"+n5qvHSTaD9MN4lBYOWgP3sUrkfheqQ/GQRWDi2yrT+DwMqhRbazP1pkO99Pjbc/4XoUrkfhuj9U46WbxCDAP+xRuB6F68E/L90kBoGVwz8fhetRuB7FP7bz/dR46cY/TmIQWDm0yD9CYOXQItvJPzVeukkMAss/hetRuB6Fyz8lBoGVQ4vMP23n+6nx0s0/aJHtfD81zj+wcmiR7XzPP1g5tMh2vs8/+n5qvHST0D9KDAIrhxbRP/LSTWIQWNE/lkOLbOf70T/jpZvEILDSP+F6FK5H4dI/2/l+arx00z/Xo3A9CtfTP9V46SYxCNQ/\"},\"shape\":[30],\"dtype\":\"float64\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"CKwcWmQ7rz91kxgEVg7NPzvfT42XbtI/Rrbz/dR42T93vp8aL93cP+XQItv5fuI/qMZLN4lB5D9g5dAi2/nmP6jGSzeJQeg/aJHtfD816j+DwMqhRbbrP0jhehSuR+0/F9nO91Pj7T9g5dAi2/nuP4ts5/up8e4/N4lBYOXQ7j+F61G4HoXvPy/dJAaBle8/iUFg5dAi7z+JQWDl0CLvPwRWDi2yne8/3SQGgZVD7z/Xo3A9CtfvPwRWDi2yne8/PzVeukkM8D8EVg4tsp3vP1YOLbKd7+8/CtejcD0K7z9mZmZmZmbwP90kBoGVQ+8/\"},\"shape\":[30],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p2819\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p2820\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p2815\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#bdd7e7\",\"line_width\":2}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p2816\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#bdd7e7\",\"line_alpha\":0.1,\"line_width\":2}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p2817\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#bdd7e7\",\"line_alpha\":0.2,\"line_width\":2}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p2827\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p2821\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p2822\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p2823\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"exSuR+F6dD8730+Nl26SP7gehetRuJ4/nMQgsHJosT+6SQwCK4e2PxBYObTIdr4/TDeJQWDlwD9/arx0kxjEP7Kd76fGS8c/MQisHFpkyz/Jdr6fGi/NP6wcWmQ7388/ppvEILBy0D+WQ4ts5/vRPzEIrBxaZNM/eekmMQis1D8X2c73U+PVP7TIdr6fGtc/TDeJQWDl2D9GtvP91HjZP+f7qfHSTdo/2c73U+Ol2z8j2/l+arzcP8l2vp8aL90/ZDvfT42X3j+0yHa+nxrfP/7UeOkmMeA/pHA9Ctej4D956SYxCKzgP0jhehSuR+E/nMQgsHJo4T+cxCCwcmjhP5qZmZmZmeE/\"},\"shape\":[33],\"dtype\":\"float64\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"001iEFg5tD9iEFg5tMjGP3npJjEIrNQ/CtejcD0K3z+LbOf7qfHiP2Dl0CLb+eY/+FPjpZvE6D/ByqFFtvPpPylcj8L1KOw/8tJNYhBY7T89CtejcD3uPzm0yHa+n+4/sp3vp8ZL7z+F61G4HoXvPy/dJAaBle8/PzVeukkM8D9WDi2yne/vP4XrUbgehe8/CtejcD0K7z+6SQwCK4fuP7pJDAIrh+4/7nw/NV667T+amZmZmZntP/LSTWIQWO0/7nw/NV667T/FILByaJHtPzeJQWDl0O4/WDm0yHa+7z/VeOkmMQjwPz81XrpJDPA/ZmZmZmZm8D9YObTIdr7vP1CNl24Sg/A/\"},\"shape\":[33],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p2828\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p2829\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p2824\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#6baed6\",\"line_width\":2}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p2825\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#6baed6\",\"line_alpha\":0.1,\"line_width\":2}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p2826\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#6baed6\",\"line_alpha\":0.2,\"line_width\":2}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p2836\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p2830\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p2831\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p2832\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"/Knx0k1iYD97FK5H4XqEP7gehetRuI4/uB6F61G4nj97FK5H4XqkP5qZmZmZmak/kxgEVg4tsj/LoUW28/20P+kmMQisHLo/aJHtfD81vj/sUbgehevBP8uhRbbz/cQ/sp3vp8ZLxz9CYOXQItvJP4XrUbgehcs/HVpkO99PzT+mm8QgsHLQP5zEILByaNE/2c73U+Ol0z8fhetRuB7VP2ZmZmZmZtY/WmQ730+N1z9SuB6F61HYP/YoXI/C9dg/ke18PzVe2j8pXI/C9SjcP23n+6nx0t0/ZDvfT42X3j9cj8L1KFzfP6rx0k1iEOA/0SLb+X5q4D/NzMzMzMzgP6AaL90kBuE/GQRWDi2y4T/l0CLb+X7iP2IQWDm0yOI/CKwcWmQ74z8EVg4tsp3jP4GVQ4ts5+M/qMZLN4lB5D+mm8QgsHLkP3e+nxov3eQ/nu+nxks35T9Ei2zn+6nlPxkEVg4tsuU/FK5H4XoU5j/pJjEIrBzmPxBYObTIduY/ukkMAiuH5j+4HoXrUbjmPzeJQWDl0OY/tMh2vp8a5z/dJAaBlUPnP1yPwvUoXOc/L90kBoGV5z8v3SQGgZXnPwIrhxbZzuc/K4cW2c735z8=\"},\"shape\":[58],\"dtype\":\"float64\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"qvHSTWIQuD/Xo3A9CtfDP0Jg5dAi28k/9ihcj8L10D/Xo3A9CtfTP/T91HjpJtk/bef7qfHS3T9OYhBYObTgPw4tsp3vp+I/qMZLN4lB5D/pJjEIrBzmP3Noke18P+k/DAIrhxbZ6j+DwMqhRbbrP0oMAiuHFu0/w/UoXI/C7T/jpZvEILDuP4lBYOXQIu8/WDm0yHa+7z/Xo3A9CtfvP9V46SYxCPA/1XjpJjEI8D8AAAAAAADwPwRWDi2yne8/L90kBoGV7z/dJAaBlUPvP2Dl0CLb+e4/46WbxCCw7j+6SQwCK4fuP2iR7Xw/Ne4/FK5H4XoU7j/sUbgehevtP3E9CtejcO0/oBov3SQG7T8fhetRuB7tPyGwcmiR7ew/c2iR7Xw/7T9KDAIrhxbtP/LSTWIQWO0/H4XrUbge7T9xPQrXo3DtP3E9CtejcO0/7FG4HoXr7T9oke18PzXuP7pJDAIrh+4/ObTIdr6f7j/dJAaBlUPvP90kBoGVQ+8/WDm0yHa+7z8tsp3vp8bvPz81XrpJDPA/aJHtfD818D99PzVeuknwP3sUrkfhevA//tR46SYx8D+PwvUoXI/wPw4tsp3vp/A/CtejcD0K8T8=\"},\"shape\":[58],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p2837\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p2838\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p2833\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#2171b5\",\"line_width\":2}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p2834\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#2171b5\",\"line_alpha\":0.1,\"line_width\":2}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p2835\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#2171b5\",\"line_alpha\":0.2,\"line_width\":2}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p2845\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p2839\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p2840\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p2841\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"+n5qvHSTaD/6fmq8dJOIP6RwPQrXo7A/gZVDi2znuz+wcmiR7Xy/P+f7qfHSTcI/H4XrUbgexT9aZDvfT43HP+58PzVeusk/KVyPwvUozD+sHFpkO9/PP+58PzVeutE/1XjpJjEI1D9qvHSTGATWP65H4XoUrtc/SOF6FK5H2T+Nl24Sg8DaP9NNYhBYOdw/HVpkO99P3T9mZmZmZmbeP9V46SYxCOA/okW28/3U4D+amZmZmZnhP42XbhKDwOI/AAAAAAAA5D9KDAIrhxblP2q8dJMYBOY/30+Nl24S5z9/arx0kxjoP0oMAiuHFuk/QmDl0CLb6T+Nl24Sg8DqP9ejcD0K1+s/9ihcj8L17D9CYOXQItvtPzeJQWDl0O4/16NwPQrX7z8=\"},\"shape\":[37],\"dtype\":\"float64\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"001iEFg5tD+q8dJNYhC4P0jhehSuR8E/Vg4tsp3vxz+WQ4ts5/vJPxkEVg4tss0/pHA9Ctej0D8730+Nl27SPylcj8L1KNQ/x0s3iUFg1T+q8dJNYhDYP5HtfD81Xto/z/dT46Wb3D8K16NwPQrfP1K4HoXrUeA/c2iR7Xw/4T+TGARWDi3iPwrXo3A9CuM/WDm0yHa+4z/6fmq8dJPkP8dLN4lBYOU/arx0kxgE5j9kO99PjZfmP9v5fmq8dOc/1XjpJjEI6D+iRbbz/dToPx1aZDvfT+k/bef7qfHS6T9oke18PzXqP2Q730+Nl+o/jZduEoPA6j/fT42XbhLrP4cW2c73U+s/L90kBoGV6z+BlUOLbOfrP30/NV66Sew/ppvEILBy7D8=\"},\"shape\":[37],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p2846\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p2847\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p2842\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"gray\",\"line_width\":2}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p2843\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"gray\",\"line_alpha\":0.1,\"line_width\":2}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p2844\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"gray\",\"line_alpha\":0.2,\"line_width\":2}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p2854\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p2848\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p2849\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p2850\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"+n5qvHSTaD+JQWDl0CKrPzm0yHa+n7o/9P3UeOkmwT8fhetRuB7FP+kmMQisHMo/zczMzMzMzD9MN4lBYOXQP4lBYOXQItM/HVpkO99P1T9SuB6F61HYP+Olm8QgsNo/WDm0yHa+3z+WQ4ts5/vhPzMzMzMzM+M/UI2XbhKD5D/l0CLb+X7mP4GVQ4ts5+c/HVpkO99P6T/jpZvEILDqP4PAyqFFtus/dZMYBFYO7T8QWDm0yHbuPzEIrBxaZO8/\"},\"shape\":[24],\"dtype\":\"float64\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"kxgEVg4tsj/hehSuR+G6Px+F61G4HsU/JQaBlUOLzD+WQ4ts5/vRP8l2vp8aL9U/YhBYObTI1j/8qfHSTWLYPzeJQWDl0No/Gy/dJAaB3T8lBoGVQ4vgPxfZzvdT4+E/KVyPwvUo5D+4HoXrUbjmPy2yne+nxuc/0SLb+X5q6D8dWmQ730/pP23n+6nx0uk/vp8aL90k6j+6SQwCK4fqP2Q730+Nl+o/NV66SQwC6z9YObTIdr7rP6rx0k1iEOw/\"},\"shape\":[24],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p2855\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p2856\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p2851\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_width\":2}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p2852\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_alpha\":0.1,\"line_width\":2}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p2853\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_alpha\":0.2,\"line_width\":2}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p2772\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p2797\"},{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p2798\"},{\"type\":\"object\",\"name\":\"BoxZoomTool\",\"id\":\"p2799\",\"attributes\":{\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p2800\",\"attributes\":{\"syncable\":false,\"level\":\"overlay\",\"visible\":false,\"left_units\":\"canvas\",\"right_units\":\"canvas\",\"bottom_units\":\"canvas\",\"top_units\":\"canvas\",\"line_color\":\"black\",\"line_alpha\":1.0,\"line_width\":2,\"line_dash\":[4,4],\"fill_color\":\"lightgrey\",\"fill_alpha\":0.5}}}},{\"type\":\"object\",\"name\":\"SaveTool\",\"id\":\"p2801\"},{\"type\":\"object\",\"name\":\"ResetTool\",\"id\":\"p2802\"},{\"type\":\"object\",\"name\":\"HelpTool\",\"id\":\"p2803\"}]}},\"left\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p2790\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p2792\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p2793\"},\"axis_label\":\"norm. free repressor conc.\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p2791\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p2783\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p2785\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p2786\"},\"axis_label\":\"cell cycles\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p2784\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p2789\",\"attributes\":{\"axis\":{\"id\":\"p2783\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p2796\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p2790\"}}}],\"frame_width\":350,\"frame_height\":200}}],\"callbacks\":{\"type\":\"map\"}}};\n", " const render_items = [{\"docid\":\"c27b0757-3552-4d36-b749-af7301e369a2\",\"roots\":{\"p2766\":\"7d15383a-8c8a-4c2e-a612-ce0e1364194f\"},\"root_ids\":[\"p2766\"]}];\n", " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " let attempts = 0;\n", " const timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined) {\n", " clearInterval(timer);\n", " embed_document(root);\n", " } else {\n", " attempts++;\n", " if (attempts > 100) {\n", " clearInterval(timer);\n", " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", " }\n", " }\n", " }, 10, root)\n", " }\n", "})(window);" ], "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "p2766" } }, "output_type": "display_data" } ], "source": [ "# Load in data from Rosenfeld paper, Fig 3\n", "df = pd.read_csv(os.path.join(data_path, \"rosenfeld_autorepression_data.csv\"))\n", "\n", "# Build plot\n", "p = bokeh.plotting.figure(\n", " frame_width=350,\n", " frame_height=200,\n", " x_axis_label=\"cell cycles\",\n", " y_axis_label=\"norm. free repressor conc.\",\n", " x_range=[0, 1],\n", " y_range=[0, 1.1],\n", ")\n", "\n", "# Populated glyphs\n", "for curve_label, g in df.groupby(\"curve\"):\n", " p.line(g[\"x\"], g[\"y\"], color=g[\"color\"].iloc[0], line_width=2)\n", "\n", "bokeh.io.show(p)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The curves in blue are three trials with the autorepressive circuit. The gray line shows the response in the presence of aTc, a small molecule that inactivates TetR. The black line shows the response of an \"open loop\" circuit (simple repression) that lacks feedback.\n", "\n", "Interestingly, these dynamics show the expected acceleration, as well as some oscillations around steady-state, which may be explained by time delays in the regulatory system (which we will discuss more in an upcoming chapter)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Solving for a time-varying input\n", "\n", "This acceleration in response occurs when we turn the gene on. What happens when we turn the gene off, for example by suddenly stopping the gene's expression at some later time point? We can address this question by including $s$ as a time-varying signal.\n", "\n", "Let's imagine that the input signal $s$, rather than turning on instantaneously at $t=0$ and remaining constant for the rest of the simulation, instead occurs as a pulse of duration $\\tau$ that peaks at time $t_0$. Then $s$ would be present roughly within the time window $(t_0-\\tau/2, t_0+\\tau/2)$, but absent outside of this time window. We will model the peak as a Gaussian function of unit height,\n", "\n", "\\begin{align}\n", "s(t) = \\exp\\left[-\\frac{4(t-t_0)^2}{\\tau^2}\\right].\n", "\\end{align}\n", "\n", "Let's take a look at what the pulse looks like for visualization purposes." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "data": { "text/html": [ "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function embed_document(root) {\n", " const docs_json = {\"4662dda4-c10b-4996-86ae-d4b22ff623e4\":{\"version\":\"3.1.0\",\"title\":\"Bokeh Application\",\"defs\":[],\"roots\":[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p3237\",\"attributes\":{\"x_range\":{\"type\":\"object\",\"name\":\"Range1d\",\"id\":\"p3246\",\"attributes\":{\"end\":10}},\"y_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p3239\"},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p3250\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p3252\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p3241\"},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p3289\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p3283\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p3284\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p3285\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[200],\"dtype\":\"float64\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[200],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p3290\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p3291\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p3286\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b4\",\"line_width\":2}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p3287\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b4\",\"line_alpha\":0.1,\"line_width\":2}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p3288\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b4\",\"line_alpha\":0.2,\"line_width\":2}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p3243\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p3268\"},{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p3269\"},{\"type\":\"object\",\"name\":\"BoxZoomTool\",\"id\":\"p3270\",\"attributes\":{\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p3271\",\"attributes\":{\"syncable\":false,\"level\":\"overlay\",\"visible\":false,\"left_units\":\"canvas\",\"right_units\":\"canvas\",\"bottom_units\":\"canvas\",\"top_units\":\"canvas\",\"line_color\":\"black\",\"line_alpha\":1.0,\"line_width\":2,\"line_dash\":[4,4],\"fill_color\":\"lightgrey\",\"fill_alpha\":0.5}}}},{\"type\":\"object\",\"name\":\"SaveTool\",\"id\":\"p3272\"},{\"type\":\"object\",\"name\":\"ResetTool\",\"id\":\"p3273\"},{\"type\":\"object\",\"name\":\"HelpTool\",\"id\":\"p3274\"}]}},\"left\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p3261\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p3263\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p3264\"},\"axis_label\":\"s\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p3262\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p3254\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p3256\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p3257\"},\"axis_label\":\"time\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p3255\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p3260\",\"attributes\":{\"axis\":{\"id\":\"p3254\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p3267\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p3261\"}}}],\"frame_width\":350,\"frame_height\":150}}],\"callbacks\":{\"type\":\"map\"}}};\n", " const render_items = [{\"docid\":\"4662dda4-c10b-4996-86ae-d4b22ff623e4\",\"roots\":{\"p3237\":\"f9d91658-2b26-4248-a6b7-2da0d7693882\"},\"root_ids\":[\"p3237\"]}];\n", " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " let attempts = 0;\n", " const timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined) {\n", " clearInterval(timer);\n", " embed_document(root);\n", " } else {\n", " attempts++;\n", " if (attempts > 100) {\n", " clearInterval(timer);\n", " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", " }\n", " }\n", " }, 10, root)\n", " }\n", "})(window);" ], "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "p3237" } }, "output_type": "display_data" } ], "source": [ "def s_pulse(t, t_0, tau):\n", " \"\"\"\n", " Returns s value for a pulse centered at t_0 with duration tau.\n", " \"\"\"\n", " # Return 0 is tau is zero, otherwise Gaussian\n", " return 0 if tau == 0 else np.exp(-4 * (t - t_0) ** 2 / tau ** 2)\n", "\n", "\n", "# Plot the pulse\n", "p = bokeh.plotting.figure(\n", " frame_width=350,\n", " frame_height=150,\n", " x_axis_label=\"time\",\n", " y_axis_label=\"s\",\n", " x_range=[0, 10],\n", ")\n", "\n", "# Populate glyph\n", "p.line(t, s_pulse(t, 4.0, 2.0), line_width=2)\n", "\n", "# Show plot\n", "bokeh.io.show(p)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The input time course has the desired pulsatile shape. We proceed to numerically solve for the dynamics," ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "data": { "text/html": [ "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function embed_document(root) {\n", " const docs_json = {\"1e060a3c-1746-468f-9756-92e34bb39536\":{\"version\":\"3.1.0\",\"title\":\"Bokeh Application\",\"defs\":[],\"roots\":[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p3566\",\"attributes\":{\"x_range\":{\"type\":\"object\",\"name\":\"Range1d\",\"id\":\"p3575\",\"attributes\":{\"end\":10}},\"y_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p3568\"},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p3579\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p3581\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p3570\"},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p3618\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p3612\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p3613\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p3614\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[200],\"dtype\":\"float64\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[200],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p3619\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p3620\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p3615\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b3\",\"line_width\":2}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p3616\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b3\",\"line_alpha\":0.1,\"line_width\":2}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p3617\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b3\",\"line_alpha\":0.2,\"line_width\":2}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p3629\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p3623\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p3624\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p3625\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[200],\"dtype\":\"float64\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[200],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p3630\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p3631\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p3626\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#ff7e0e\",\"line_width\":2}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p3627\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#ff7e0e\",\"line_alpha\":0.1,\"line_width\":2}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p3628\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#ff7e0e\",\"line_alpha\":0.2,\"line_width\":2}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p3572\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p3597\"},{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p3598\"},{\"type\":\"object\",\"name\":\"BoxZoomTool\",\"id\":\"p3599\",\"attributes\":{\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p3600\",\"attributes\":{\"syncable\":false,\"level\":\"overlay\",\"visible\":false,\"left_units\":\"canvas\",\"right_units\":\"canvas\",\"bottom_units\":\"canvas\",\"top_units\":\"canvas\",\"line_color\":\"black\",\"line_alpha\":1.0,\"line_width\":2,\"line_dash\":[4,4],\"fill_color\":\"lightgrey\",\"fill_alpha\":0.5}}}},{\"type\":\"object\",\"name\":\"SaveTool\",\"id\":\"p3601\"},{\"type\":\"object\",\"name\":\"ResetTool\",\"id\":\"p3602\"},{\"type\":\"object\",\"name\":\"HelpTool\",\"id\":\"p3603\"}]}},\"left\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p3590\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p3592\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p3593\"},\"axis_label\":\"normalized concentration\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p3591\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p3583\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p3585\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p3586\"},\"axis_label\":\"time\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p3584\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p3589\",\"attributes\":{\"axis\":{\"id\":\"p3583\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p3596\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p3590\"}}},{\"type\":\"object\",\"name\":\"Legend\",\"id\":\"p3621\",\"attributes\":{\"click_policy\":\"hide\",\"items\":[{\"type\":\"object\",\"name\":\"LegendItem\",\"id\":\"p3622\",\"attributes\":{\"label\":{\"type\":\"value\",\"value\":\"s\"},\"renderers\":[{\"id\":\"p3618\"}]}},{\"type\":\"object\",\"name\":\"LegendItem\",\"id\":\"p3632\",\"attributes\":{\"label\":{\"type\":\"value\",\"value\":\"x\"},\"renderers\":[{\"id\":\"p3629\"}]}}]}}],\"frame_width\":400,\"frame_height\":150}}],\"callbacks\":{\"type\":\"map\"}}};\n", " const render_items = [{\"docid\":\"1e060a3c-1746-468f-9756-92e34bb39536\",\"roots\":{\"p3566\":\"c7ad9b50-844d-49be-87a7-71d1ef5f9d66\"},\"root_ids\":[\"p3566\"]}];\n", " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " let attempts = 0;\n", " const timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined) {\n", " clearInterval(timer);\n", " embed_document(root);\n", " } else {\n", " attempts++;\n", " if (attempts > 100) {\n", " clearInterval(timer);\n", " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", " }\n", " }\n", " }, 10, root)\n", " }\n", "})(window);" ], "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "p3566" } }, "output_type": "display_data" } ], "source": [ "def neg_auto_rhs_s_fun(x, t, beta0, gamma, k, n, ks, ns, s_fun, s_args):\n", " \"\"\"\n", " Right hand side for negative autoregulation function, with s variable.\n", " Returns dx/dt.\n", " \n", " s_fun is a function of the form s_fun(t, *s_args), so s_args is a tuple\n", " containing the arguments to pass to s_fun.\n", " \"\"\"\n", " # Compute s\n", " s = s_fun(t, *s_args)\n", " \n", " # Correct for x possibly being numerically negative as odeint() adjusts step size\n", " x = np.maximum(0, x)\n", " \n", " # Plug in this value of s to the RHS of the negative autoregulation model\n", " return neg_auto_rhs(x, t, beta0, gamma, k, n, ks, ns, s)\n", "\n", "# Set up parameters for the pulse\n", "s_args = (4.0, 2.0)\n", "\n", "# Package parameters into a tuple\n", "args = (beta0, gamma, k, n, ks, ns, s_pulse, s_args)\n", "\n", "# Integrate ODEs\n", "x = scipy.integrate.odeint(neg_auto_rhs_s_fun, x0, t, args=args).transpose()[0]\n", "\n", "# Plot the normalized values\n", "x /= x.max()\n", "\n", "# Also calculate the pulse for plotting purposes\n", "s = s_pulse(t, *s_args)\n", "\n", "# Plot the results\n", "p = bokeh.plotting.figure(\n", " frame_width=400,\n", " frame_height=150,\n", " x_axis_label=\"time\",\n", " y_axis_label=\"normalized concentration\",\n", " x_range=[0, 10],\n", ")\n", "\n", "# Populate glyphs\n", "p.line(t, s, line_width=2, color=colors[0], legend_label=\"s\")\n", "p.line(t, x, line_width=2, color=colors[1], legend_label=\"x\")\n", "\n", "# Place the legend\n", "p.legend.location = \"top_right\"\n", "\n", "# Allow hiding curves\n", "p.legend.click_policy = \"hide\"\n", "\n", "# Show plot\n", "bokeh.io.show(p)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As expected, we see the qualitative result that $x$ does not turn on until the pulse of $s$ begins, and once $s$ stops, $x$ begins an exponential decay back down to zero. The specific quantitative details of the relationship between the $x$ trajectory and the $s$ pulse, such as the threshold value of $s$ where $x$ begins to turn on, are dependent on the specific parametrization of the system, such as the value of $k_s$.\n", "\n", "We now want to ask how the dynamics of $x$'s rise and fall compare to the unregulated case. In order to do this, we simply need to write another function that plots out the unregulated time course as an explicit function of $s$.\n", "\n", "The attentive reader might, at this point, raise an objection: How can we claim that the *unregulated* gene $x$ is nonetheless still governed by the presence or absence of this input signal $s$? Indeed, although an unregulated gene does not have any transcriptional activators or repressors that modulate its expression, all genes in an organism can always have their expression level be affected by higher-level factors such as the concentration of RNA polymerase or ribosomes, the global metabolic rate, or in the case of eukaryotic organisms, chromatin accessibility. So in this case we could imagine that our $s$ pulse represents a very simplified model of a scenario where a bacterium containing our gene is persisting in a nutrient-starved environment, where most of its genes have globally been turned off, and suddenly comes across a pulse of nutrients that allow it to transiently ramp up its metabolism and gene expression before returning to a starvation state when the nutrients disappear.\n", "\n", "Let's now put together a function that takes our unregulated ODE and converts it to a form that includes an explicit Hill-like $s$-dependence for the activation term, as in\n", "\n", "\\begin{align}\n", "\\frac{\\mathrm{d}x}{\\mathrm{d}t} = \\beta(s) - \\gamma x = \\beta_0\\, \\frac{(s/k_s)^{n_s}}{1 + (s/k_s)^{n_s}} - \\gamma x.\n", "\\end{align}\n", "\n", "We can again numerically solve and add the unregulated case to our plot." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "data": { "text/html": [ "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function embed_document(root) {\n", " const docs_json = {\"0438441a-d2cd-4806-8b63-69fd9d3afd2d\":{\"version\":\"3.1.0\",\"title\":\"Bokeh Application\",\"defs\":[],\"roots\":[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p3566\",\"attributes\":{\"x_range\":{\"type\":\"object\",\"name\":\"Range1d\",\"id\":\"p3575\",\"attributes\":{\"end\":10}},\"y_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p3568\"},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p3579\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p3581\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p3570\"},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p3618\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p3612\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p3613\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p3614\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[200],\"dtype\":\"float64\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[200],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p3619\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p3620\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p3615\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b3\",\"line_width\":2}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p3616\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b3\",\"line_alpha\":0.1,\"line_width\":2}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p3617\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b3\",\"line_alpha\":0.2,\"line_width\":2}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p3629\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p3623\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p3624\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p3625\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[200],\"dtype\":\"float64\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[200],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p3630\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p3631\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p3626\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#ff7e0e\",\"line_width\":2}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p3627\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#ff7e0e\",\"line_alpha\":0.1,\"line_width\":2}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p3628\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#ff7e0e\",\"line_alpha\":0.2,\"line_width\":2}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p3962\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p3956\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p3957\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p3958\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[200],\"dtype\":\"float64\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[200],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p3963\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p3964\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p3959\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#2ba02b\",\"line_width\":2}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p3960\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#2ba02b\",\"line_alpha\":0.1,\"line_width\":2}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p3961\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#2ba02b\",\"line_alpha\":0.2,\"line_width\":2}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p3572\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p3597\"},{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p3598\"},{\"type\":\"object\",\"name\":\"BoxZoomTool\",\"id\":\"p3599\",\"attributes\":{\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p3600\",\"attributes\":{\"syncable\":false,\"level\":\"overlay\",\"visible\":false,\"left_units\":\"canvas\",\"right_units\":\"canvas\",\"bottom_units\":\"canvas\",\"top_units\":\"canvas\",\"line_color\":\"black\",\"line_alpha\":1.0,\"line_width\":2,\"line_dash\":[4,4],\"fill_color\":\"lightgrey\",\"fill_alpha\":0.5}}}},{\"type\":\"object\",\"name\":\"SaveTool\",\"id\":\"p3601\"},{\"type\":\"object\",\"name\":\"ResetTool\",\"id\":\"p3602\"},{\"type\":\"object\",\"name\":\"HelpTool\",\"id\":\"p3603\"}]}},\"left\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p3590\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p3592\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p3593\"},\"axis_label\":\"normalized concentration\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p3591\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p3583\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p3585\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p3586\"},\"axis_label\":\"time\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p3584\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p3589\",\"attributes\":{\"axis\":{\"id\":\"p3583\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p3596\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p3590\"}}},{\"type\":\"object\",\"name\":\"Legend\",\"id\":\"p3621\",\"attributes\":{\"click_policy\":\"hide\",\"items\":[{\"type\":\"object\",\"name\":\"LegendItem\",\"id\":\"p3622\",\"attributes\":{\"label\":{\"type\":\"value\",\"value\":\"s\"},\"renderers\":[{\"id\":\"p3618\"}]}},{\"type\":\"object\",\"name\":\"LegendItem\",\"id\":\"p3632\",\"attributes\":{\"label\":{\"type\":\"value\",\"value\":\"x\"},\"renderers\":[{\"id\":\"p3629\"}]}},{\"type\":\"object\",\"name\":\"LegendItem\",\"id\":\"p4188\",\"attributes\":{\"label\":{\"type\":\"value\",\"value\":\"unregulated x\"},\"renderers\":[{\"id\":\"p3962\"}]}}]}}],\"frame_width\":400,\"frame_height\":150}}],\"callbacks\":{\"type\":\"map\"}}};\n", " const render_items = [{\"docid\":\"0438441a-d2cd-4806-8b63-69fd9d3afd2d\",\"roots\":{\"p3566\":\"73e84b48-6588-4c85-bf5f-341a2e12f26a\"},\"root_ids\":[\"p3566\"]}];\n", " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " let attempts = 0;\n", " const timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined) {\n", " clearInterval(timer);\n", " embed_document(root);\n", " } else {\n", " attempts++;\n", " if (attempts > 100) {\n", " clearInterval(timer);\n", " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", " }\n", " }\n", " }, 10, root)\n", " }\n", "})(window);" ], "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "p3566" } }, "output_type": "display_data" } ], "source": [ "def unreg_rhs(x, t, beta0, gamma, ks, ns, s):\n", " \"\"\"\n", " Right hand side for constitutive gene expression\n", " modulated to only be active in the presence of s.\n", " Returns dx/dt.\n", " \"\"\"\n", " return beta0 * (s / ks) ** ns / (1 + (s / ks) ** ns) - gamma * x\n", "\n", "\n", "def unreg_rhs_s_fun(x, t, beta0, gamma, ks, ns, s_fun, s_args):\n", " \"\"\"\n", " Right hand side for unregulated function, with s variable.\n", " Returns dx/dt.\n", "\n", " s_fun is a function of the form s_fun(t, *s_args), so s_args is a tuple\n", " containing the arguments to pass to s_fun.\n", " \"\"\"\n", " # Compute s\n", " s = s_fun(t, *s_args)\n", "\n", " # Plug in this value of s to the RHS of the negative autoregulation model\n", " return unreg_rhs(x, t, beta0, gamma, ks, ns, s)\n", "\n", "\n", "# Package parameters into a tuple\n", "args_unreg = (beta0, gamma, ks, ns, s_pulse, s_args)\n", "\n", "# Integrate ODEs\n", "x_unreg = scipy.integrate.odeint(unreg_rhs_s_fun, x0, t, args=args_unreg).transpose()[0]\n", "\n", "# Normalize\n", "x_unreg /= x_unreg.max()\n", "\n", "# Add to the plot\n", "p.line(t, x_unreg, line_width=2, color=colors[2], legend_label=\"unregulated x\")\n", "\n", "# Show plot\n", "bokeh.io.show(p)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can see from the above plot that although negative autoregulation speeds up the rise time of the gene's expression in response to the appearance of stimulus, it has no impact on the speed of the fall time in response to the disappearance of the stimulus. We actually could have known this result would occur just from looking at the equations governing the gene's dynamics: recall that in the regulated case, $x$ is governed by\n", "\n", "\\begin{align}\n", "\\frac{\\mathrm{d}x}{\\mathrm{d}t}=\\frac{\\beta(s)}{(1+x/k)^n} - \\gamma x,\n", "\\end{align}\n", "\n", "while in the unregulated case, $x$ is governed by\n", "\n", "\\begin{align}\n", "\\frac{\\mathrm{d}x}{\\mathrm{d}t}=\\beta(s) - \\gamma x.\n", "\\end{align}\n", "\n", "If we set $\\beta(s)=0$, then both ODEs become the same expression,\n", "\n", "\\begin{align}\n", "\\left.\\frac{\\mathrm{d}x}{\\mathrm{d}t}\\right\\vert_{\\beta(s)=0}=- \\gamma x,\n", "\\end{align}\n", "\n", "meaning that the dynamics of the fall in gene expression will become identical between the two systems as $\\beta(s)$ approaches $0$.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Interactive plotting and varying parameters\n", "\n", "Although we have now convincingly demonstrated that it is possible for negative autoregulation to speed the response time of a gene's expression, we do not yet have a clear understanding of how the values of the parameters themselves, particularly $k$ and $n$, affect the magnitude of this speed-up. To gain insight into these effects, we turn to interactive plotting.\n", "\n", "Plotting with Bokeh in Jupyter notebooks allows for interactivity with plots that can help to rapidly gain insights about how parameter values might affect the dynamics. We have found that this is a useful tool to rapidly explore parameter dependence on circuit behavior. We detail how to build an interactive plot in [Technical Appendix 2c](../technical_appendices/02c_interactive_plotting.ipynb). The result is shown below." ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "data": { "text/html": [ "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function embed_document(root) {\n", " const docs_json = {\"22b76506-e9ce-410d-b95f-e8c38e741590\":{\"version\":\"3.1.0\",\"title\":\"Bokeh Application\",\"defs\":[],\"roots\":[{\"type\":\"object\",\"name\":\"Row\",\"id\":\"p4641\",\"attributes\":{\"children\":[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p4550\",\"attributes\":{\"x_range\":{\"type\":\"object\",\"name\":\"Range1d\",\"id\":\"p4559\",\"attributes\":{\"js_property_callbacks\":{\"type\":\"map\",\"entries\":[[\"change:end\",[{\"type\":\"object\",\"name\":\"CustomJS\",\"id\":\"p4637\",\"attributes\":{\"args\":{\"type\":\"map\",\"entries\":[[\"cds\",{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p4547\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p4548\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p4549\"},\"data\":{\"type\":\"map\",\"entries\":[[\"t\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[200],\"dtype\":\"float64\",\"order\":\"little\"}],[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[200],\"dtype\":\"float64\",\"order\":\"little\"}],[\"s\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[200],\"dtype\":\"float64\",\"order\":\"little\"}],[\"x_unreg\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[200],\"dtype\":\"float64\",\"order\":\"little\"}]]}}}],[\"p\",{\"id\":\"p4550\"}],[\"t0Slider\",{\"type\":\"object\",\"name\":\"Slider\",\"id\":\"p4633\",\"attributes\":{\"js_property_callbacks\":{\"type\":\"map\",\"entries\":[[\"change:value\",[{\"id\":\"p4637\"}]]]},\"width\":150,\"title\":\"t\\u2080\",\"start\":0.01,\"end\":10,\"value\":4.0,\"step\":0.01}}],[\"tauSlider\",{\"type\":\"object\",\"name\":\"Slider\",\"id\":\"p4634\",\"attributes\":{\"js_property_callbacks\":{\"type\":\"map\",\"entries\":[[\"change:value\",[{\"id\":\"p4637\"}]]]},\"width\":150,\"title\":\"\\u03c4\",\"start\":0.01,\"end\":10,\"value\":2.0,\"step\":0.01}}],[\"logBeta0Slider\",{\"type\":\"object\",\"name\":\"Slider\",\"id\":\"p4627\",\"attributes\":{\"js_property_callbacks\":{\"type\":\"map\",\"entries\":[[\"change:value\",[{\"id\":\"p4637\"}]]]},\"width\":150,\"title\":\"log\\u2081\\u2080 \\u03b2\\u2080\",\"start\":-1,\"end\":2,\"value\":2.0,\"step\":0.1}}],[\"logGammaSlider\",{\"type\":\"object\",\"name\":\"Slider\",\"id\":\"p4628\",\"attributes\":{\"js_property_callbacks\":{\"type\":\"map\",\"entries\":[[\"change:value\",[{\"id\":\"p4637\"}]]]},\"width\":150,\"title\":\"log\\u2081\\u2080 \\u03b3\",\"start\":-1,\"end\":2,\"value\":0.0,\"step\":0.1}}],[\"logkSlider\",{\"type\":\"object\",\"name\":\"Slider\",\"id\":\"p4629\",\"attributes\":{\"js_property_callbacks\":{\"type\":\"map\",\"entries\":[[\"change:value\",[{\"id\":\"p4637\"}]]]},\"width\":150,\"title\":\"log\\u2081\\u2080 k\",\"start\":-1,\"end\":2,\"value\":0.0,\"step\":0.1}}],[\"nSlider\",{\"type\":\"object\",\"name\":\"Slider\",\"id\":\"p4630\",\"attributes\":{\"js_property_callbacks\":{\"type\":\"map\",\"entries\":[[\"change:value\",[{\"id\":\"p4637\"}]]]},\"width\":150,\"title\":\"n\",\"start\":0.1,\"end\":10,\"value\":1.0,\"step\":0.1}}],[\"logksSlider\",{\"type\":\"object\",\"name\":\"Slider\",\"id\":\"p4631\",\"attributes\":{\"js_property_callbacks\":{\"type\":\"map\",\"entries\":[[\"change:value\",[{\"id\":\"p4637\"}]]]},\"width\":150,\"title\":\"log\\u2081\\u2080 k\\u209b\",\"start\":-2,\"end\":2,\"value\":-1.0,\"step\":0.1}}],[\"nsSlider\",{\"type\":\"object\",\"name\":\"Slider\",\"id\":\"p4632\",\"attributes\":{\"js_property_callbacks\":{\"type\":\"map\",\"entries\":[[\"change:value\",[{\"id\":\"p4637\"}]]]},\"width\":150,\"title\":\"n\\u209b\",\"start\":0.1,\"end\":10,\"value\":10.0,\"step\":0.1}}],[\"normalizeToggle\",{\"type\":\"object\",\"name\":\"Toggle\",\"id\":\"p4635\",\"attributes\":{\"js_property_callbacks\":{\"type\":\"map\",\"entries\":[[\"change:active\",[{\"id\":\"p4637\"}]]]},\"width\":50,\"label\":\"Normalize\",\"active\":true}}],[\"legendToggle\",{\"type\":\"object\",\"name\":\"Toggle\",\"id\":\"p4636\",\"attributes\":{\"js_property_callbacks\":{\"type\":\"map\",\"entries\":[[\"change:active\",[{\"id\":\"p4637\"}]]]},\"width\":50,\"label\":\"Legend\",\"active\":true}}],[\"xRange\",{\"id\":\"p4559\"}],[\"yaxis\",{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p4574\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p4576\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p4577\"},\"axis_label\":\"normalized concentration\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p4575\"}}}],[\"legend\",{\"type\":\"object\",\"name\":\"Legend\",\"id\":\"p4605\",\"attributes\":{\"location\":\"top_left\",\"items\":[{\"type\":\"object\",\"name\":\"LegendItem\",\"id\":\"p4606\",\"attributes\":{\"label\":{\"type\":\"value\",\"value\":\"x neg. auto.\"},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p4602\",\"attributes\":{\"data_source\":{\"id\":\"p4547\"},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p4603\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p4604\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p4599\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"t\"},\"y\":{\"type\":\"field\",\"field\":\"x\"},\"line_color\":\"#ff7e0e\",\"line_width\":2}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p4600\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"t\"},\"y\":{\"type\":\"field\",\"field\":\"x\"},\"line_color\":\"#ff7e0e\",\"line_alpha\":0.1,\"line_width\":2}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p4601\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"t\"},\"y\":{\"type\":\"field\",\"field\":\"x\"},\"line_color\":\"#ff7e0e\",\"line_alpha\":0.2,\"line_width\":2}}}}]}},{\"type\":\"object\",\"name\":\"LegendItem\",\"id\":\"p4616\",\"attributes\":{\"label\":{\"type\":\"value\",\"value\":\"x unreg.\"},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p4613\",\"attributes\":{\"data_source\":{\"id\":\"p4547\"},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p4614\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p4615\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p4610\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"t\"},\"y\":{\"type\":\"field\",\"field\":\"x_unreg\"},\"line_color\":\"#2ba02b\",\"line_width\":2}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p4611\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"t\"},\"y\":{\"type\":\"field\",\"field\":\"x_unreg\"},\"line_color\":\"#2ba02b\",\"line_alpha\":0.1,\"line_width\":2}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p4612\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"t\"},\"y\":{\"type\":\"field\",\"field\":\"x_unreg\"},\"line_color\":\"#2ba02b\",\"line_alpha\":0.2,\"line_width\":2}}}}]}},{\"type\":\"object\",\"name\":\"LegendItem\",\"id\":\"p4626\",\"attributes\":{\"label\":{\"type\":\"value\",\"value\":\"s\"},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p4623\",\"attributes\":{\"data_source\":{\"id\":\"p4547\"},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p4624\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p4625\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p4620\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"t\"},\"y\":{\"type\":\"field\",\"field\":\"s\"},\"line_color\":\"#1f77b3\",\"line_width\":2}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p4621\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"t\"},\"y\":{\"type\":\"field\",\"field\":\"s\"},\"line_color\":\"#1f77b3\",\"line_alpha\":0.1,\"line_width\":2}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p4622\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"t\"},\"y\":{\"type\":\"field\",\"field\":\"s\"},\"line_color\":\"#1f77b3\",\"line_alpha\":0.2,\"line_width\":2}}}}]}}]}}]]},\"code\":\"\\nfunction transpose(A) {\\n var m = A.length;\\n var n = A[0].length;\\n var AT = [];\\n\\n for (var j = 0; j < n; j++) {\\n var ATj = [];\\n for (var i = 0; i < m; i++) {\\n ATj.push(A[i][j]);\\n }\\n AT.push(ATj);\\n }\\n\\n return AT;\\n}\\n\\n\\nfunction dot(v1, v2) {\\n /*\\n * Compute dot product v1 . v2.\\n */\\n\\n var n = v1.length;\\n var result = 0.0;\\n for (var i = 0; i < n; i++) result += v1[i] * v2[i];\\n\\n return result;\\n}\\n\\n\\nfunction norm(v) {\\n /*\\n * 2-norm of a vector\\n */\\n\\n return Math.sqrt(dot(v, v));\\n}\\n\\n\\nfunction mvMult(A, v, diagonalA) {\\n /*\\n * Compute dot product A . v, where A is a matrix.\\n * If diagonalA is true, then A must be a 1-D array.\\n */\\n\\n if (diagonalA) return elementwiseVectorMult(A, v);\\n else {\\n return A.map(function (Arow) {\\n return dot(Arow, v);\\n });\\n }\\n}\\n\\n\\nfunction svMult(a, v) {\\n /*\\n * Multiply vector v by scalar a.\\n */\\n\\n return v.map(function (x) {\\n return a * x;\\n });\\n}\\n\\n\\nfunction smMult(a, A) {\\n /*\\n * Multiply matrix A by scalar a.\\n */\\n\\n return A.map(function (Arow) {\\n return svMult(a, Arow);\\n });\\n}\\n\\n\\nfunction svAdd(a, v) {\\n /*\\n * Add a scalar a to every element of vector v.\\n */\\n\\n return v.map(function (x) {\\n return a + x;\\n });\\n}\\n\\n\\nfunction vectorAdd() {\\n var m = arguments[0].length;\\n var n = arguments.length;\\n\\n var result = [];\\n for (var i = 0; i < m; i++) {\\n var element = 0.0;\\n for (var j = 0; j < n; j++) {\\n element += arguments[j][i];\\n }\\n result.push(element);\\n }\\n\\n return result;\\n}\\n\\n\\nfunction elementwiseVectorDivide(v1, v2) {\\n /*\\n * Compute v1 / v2 elementwise.\\n */\\n\\n var result = [];\\n n = v1.length;\\n\\n for (var i = 0; i < n; i++) {\\n result.push(v1[i] / v2[i]);\\n }\\n\\n return result;\\n}\\n\\n\\nfunction elementwiseVectorMult(v1, v2) {\\n /*\\n * Compute v1 * v2 elementwise.\\n */\\n\\n var result = [];\\n n = v1.length;\\n\\n for (var i = 0; i < n; i++) {\\n result.push(v1[i] * v2[i]);\\n }\\n\\n return result;\\n}\\n\\n\\nfunction svMultAdd(scalars, vectors) {\\n /*\\n * Add a set of vectors together, each multiplied by a scalar.\\n */\\n\\n var m = vectors[0].length;\\n var n = scalars.length;\\n\\n if (vectors.length != n) {\\n console.warn(\\\"svMultAdd: Difference number of scalars and vectors.\\\");\\n return null;\\n }\\n\\n var result = [];\\n for (var i = 0; i < m; i++) {\\n var element = 0.0;\\n for (var j = 0; j < n; j++) {\\n element += scalars[j] * vectors[j][i];\\n }\\n result.push(element);\\n }\\n\\n return result;\\n}\\n\\n\\nfunction absVector(v) {\\n var result = [];\\n for (var i = 0; i < v.length; i++) {\\n result[i] = Math.abs(v[i]);\\n }\\n\\n return result;\\n}\\n\\n\\nfunction LUPDecompose(A, eps) {\\n /*\\n * LUP decomposition.\\n */\\n\\n var i, j, k, imax;\\n var maxA, absA;\\n var Arow;\\n var p = [];\\n var n = A.length;\\n var LU = shallowCopyMatrix(A);\\n\\n // Permutation matrix\\n for (i = 0; i <= n; i++) p.push(i);\\n\\n for (i = 0; i < n; i++) {\\n maxA = 0.0;\\n imax = i;\\n\\n for (k = i; k < n; k++) {\\n absA = Math.abs(LU[k][i]);\\n if (absA > maxA) {\\n maxA = absA;\\n imax = k;\\n }\\n }\\n\\n // Failure; singular matrix\\n if (maxA < eps) return [null, null];\\n\\n if (imax != i) {\\n // Pivot\\n j = p[i];\\n p[i] = p[imax];\\n p[imax] = j;\\n\\n // Pivot rows of A\\n Arow = LU[i];\\n LU[i] = LU[imax];\\n LU[imax] = Arow;\\n\\n // Count pivots\\n p[n]++;\\n }\\n\\n for (j = i + 1; j < n; j++) {\\n LU[j][i] /= LU[i][i];\\n\\n for (k = i + 1; k < n; k++) LU[j][k] -= LU[j][i] * LU[i][k];\\n }\\n }\\n\\n return [LU, p];\\n}\\n\\nfunction LUPSolve(LU, p, b) {\\n /*\\n * Solve a linear system where LU and p are stored as the\\n * output of LUPDecompose().\\n */\\n\\n var n = b.length;\\n var x = [];\\n\\n for (var i = 0; i < n; i++) {\\n x.push(b[p[i]]);\\n for (var k = 0; k < i; k++) x[i] -= LU[i][k] * x[k];\\n }\\n\\n for (i = n - 1; i >= 0; i--) {\\n for (k = i + 1; k < n; k++) x[i] -= LU[i][k] * x[k];\\n\\n x[i] /= LU[i][i];\\n }\\n\\n return x;\\n}\\n\\nfunction solve(A, b) {\\n /*\\n * Solve a linear system using LUP decomposition.\\n *\\n * Returns null if singular.\\n */\\n\\n var eps = 1.0e-14;\\n var LU, p;\\n\\n [LU, p] = LUPDecompose(A, eps);\\n\\n // Return null if singular\\n if (LU === null) return null;\\n\\n return LUPSolve(LU, p, b);\\n}\\n\\n\\nfunction rkf45(\\n f,\\n initialCondition,\\n timePoints,\\n args,\\n dt,\\n tol,\\n relStepTol,\\n maxDeadSteps,\\n sBounds,\\n hMin,\\n enforceNonnegative,\\n debugMode,\\n) {\\n // Set up return variables\\n let tSol = [timePoints[0]];\\n let t = timePoints[0];\\n let iMax = timePoints.length;\\n let y = [initialCondition];\\n let y0 = initialCondition;\\n let i = 1;\\n let nDeadSteps = 0;\\n let deadStep = false;\\n\\n // DEBUG\\n let nSteps = 0;\\n // END EDEBUG\\n\\n // Default parameters\\n let h;\\n if (dt === undefined) h = timePoints[1] - timePoints[0];\\n else h = dt;\\n\\n if (tol === undefined) tol = 1e-7;\\n if (relStepTol === undefined) relStepTol = 0.0;\\n if (sBounds === undefined) sBounds = [0.1, 10.0];\\n if (hMin === undefined) hMin = 0.0;\\n if (enforceNonnegative === undefined) enforceNonnegative = true;\\n if (maxDeadSteps === undefined) maxDeadSteps = 10;\\n if (debugMode === undefined) debugMode = false;\\n\\n while (i < iMax && nDeadSteps < maxDeadSteps) {\\n nDeadSteps = 0;\\n while (t < timePoints[i] && nDeadSteps < maxDeadSteps) {\\n [y0, t, h, deadStep] = rkf45Step(\\n f,\\n y0,\\n t,\\n args,\\n h,\\n tol,\\n relStepTol,\\n sBounds,\\n hMin\\n );\\n nDeadSteps = deadStep ? nDeadSteps + 1 : 0;\\n if (enforceNonnegative) {\\n y0 = y0.map(function (x) {\\n if (x < 0.0) return 0.0;\\n else return x;\\n });\\n }\\n // DEBUG\\n nSteps += 1;\\n // END DEBUG\\n }\\n if (t > tSol[tSol.length - 1]) {\\n y.push(y0);\\n tSol.push(t);\\n }\\n i += 1;\\n }\\n\\n // DEBUG\\n if (debugMode) console.log(nSteps);\\n // END DEBUG\\n\\n let yInterp;\\n if (nDeadSteps == maxDeadSteps) {\\n \\tyInterp = nanArray(initialCondition.length, iMax);\\n }\\n else yInterp = interpolateSolution(timePoints, tSol, transpose(y));\\n\\n return yInterp;\\n}\\n\\n\\nfunction rkf45Step(f, y, t, args, h, tol, relStepTol, sBounds, hMin) {\\n let k1 = svMult(h, f(y, t, ...args));\\n\\n let y2 = svMultAdd([0.25, 1.0], [k1, y]);\\n let k2 = svMult(h, f(y2, t + 0.25 * h, ...args));\\n\\n let y3 = svMultAdd([0.09375, 0.28125, 1.0], [k1, k2, y]);\\n let k3 = svMult(h, f(y3, t + 0.375 * h, ...args));\\n\\n let y4 = svMultAdd(\\n [1932.0 / 2197.0, -7200.0 / 2197.0, 7296.0 / 2197.0, 1.0],\\n [k1, k2, k3, y]\\n );\\n let k4 = svMult(h, f(y4, t + (12.0 * h) / 13.0, ...args));\\n\\n let y5 = svMultAdd(\\n [\\n 8341.0 / 4104.0,\\n -32832.0 / 4104.0,\\n 29440.0 / 4104.0,\\n -845.0 / 4104.0,\\n 1.0,\\n ],\\n [k1, k2, k3, k4, y]\\n );\\n let k5 = svMult(h, f(y5, t + h, ...args));\\n\\n let y6 = svMultAdd(\\n [\\n -6080.0 / 20520.0,\\n 41040.0 / 20520.0,\\n -28352.0 / 20520.0,\\n 9295.0 / 20520.0,\\n -5643.0 / 20520.0,\\n 1.0,\\n ],\\n [k1, k2, k3, k4, k5, y]\\n );\\n let k6 = svMult(h, f(y6, t + h / 2.0, ...args));\\n\\n // Calculate new step\\n let yNew = svMultAdd(\\n [\\n 2375.0 / 20520.0,\\n 11264.0 / 20520.0,\\n 10985.0 / 20520.0,\\n -4104.0 / 20520.0,\\n 1.0,\\n ],\\n [k1, k3, k4, k5, y]\\n );\\n\\n // Relative difference between steps\\n\\tlet relChangeStep = norm(vectorAdd(yNew, svMult(-1.0, y))) / norm(yNew);\\n\\n // Calculate error (note that k2's contribution to the error is zero)\\n let errorVector = svMultAdd(\\n [\\n 209.0 / 75240.0,\\n -2252.8 / 75240.0,\\n -2197.0 / 75240.0,\\n 1504.8 / 75240.0,\\n 2736.0 / 75240.0,\\n ],\\n [k1, k3, k4, k5, k6]\\n );\\n let error = Math.max(...absVector(errorVector));\\n\\n // Either don't take a step or use the RK4 step\\n let deadStep;\\n if (error < tol || relChangeStep < relStepTol || h <= hMin) {\\n t += h;\\n deadStep = false;\\n } else {\\n yNew = y;\\n deadStep = true;\\n }\\n\\n // Compute scaling for new step size\\n let s;\\n if (error === 0.0) {\\n s = sBounds[1];\\n } else {\\n s = Math.pow((tol * h) / 2.0 / error, 0.25);\\n }\\n if (s < sBounds[0]) {\\n s = sBounds[0];\\n } else if (s > sBounds[1]) {\\n s = sBounds[1];\\n }\\n\\n // Return new y-values, new time, and updated step size h\\n return [yNew, t, Math.max(s * h, hMin), deadStep];\\n}\\n\\n\\nfunction dydtIMEX(y, t, f, cfun, Afun, fArgs, cfunArgs, AfunArgs, diagonalA) {\\n /*\\n * Right hand side of ODEs for initializing IMEX method with RKF.\\n */\\n\\n n = y.length;\\n let rhs = zeros(n);\\n\\n let A = Afun(t, ...AfunArgs);\\n let c = cfun(t, ...cfunArgs);\\n\\n // Linear part\\n let nonConstantLinear = diagonalA\\n ? elementwiseVectorMult(A, y)\\n : mvMult(A, y, diagonalA);\\n let linearPart = vectorAdd(nonConstantLinear, c);\\n\\n // Nonlinear part\\n let nonlinearPart = f(y, t, ...fArgs);\\n\\n return vectorAdd(nonlinearPart, linearPart);\\n}\\n\\n\\nfunction cnab2Step(u, c, A, f1, f0, g1, omega, k, diagonalA) {\\n /*\\n * Take a CNAB2 step.\\n *\\n * - u is the current value of the solution.\\n * - c is the constant term.\\n * - A is the matrix for the linear function.\\n * - f1 is the nonlinear function evaluated at the current value of y.\\n * - f0 is the nonlinear function evaluated at the previous value of y.\\n * - g1 is the linear function evaluated at the current value of y.\\n * - omega is the ratio of the most recent step size to the one before that.\\n * - k is the current step size.\\n * - diagonalA is true if A is diagonal. This leads to a *much* faster time step.\\n * If diagonalA is true, then A is provided only as the diagonal.\\n */\\n\\n let invk = 1.0 / k;\\n let b = vectorAdd(\\n svMult(0.5, c),\\n svMult(invk, u),\\n svMult(1.0 + omega / 2.0, f1),\\n svMult(-omega / 2.0, f0),\\n svMult(0.5, g1)\\n );\\n\\n if (diagonalA) {\\n let Aaug = svAdd(invk, svMult(-0.5, A));\\n let result = elementwiseVectorDivide(b, Aaug);\\n } else {\\n let n = A.length;\\n let Aaug = smMult(-0.5, A);\\n for (i = 0; i < n; i++) {\\n Aaug[i][i] += invk;\\n }\\n let result = solve(Aaug, b);\\n }\\n\\n return result;\\n}\\n\\n\\nfunction vsimexAdjustStepSizePID(\\n k,\\n relChange,\\n relChangeStep,\\n tol,\\n kP,\\n kI,\\n kD,\\n kBounds,\\n sBounds\\n) {\\n /*\\n * Adjust step size using a PID controller.\\n */\\n let mult =\\n Math.pow(relChange[1] / relChangeStep, kP) *\\n Math.pow(tol / relChangeStep, kI) *\\n Math.pow(Math.pow(relChange[0], 2) / relChange[1] / relChangeStep, kD);\\n if (mult > sBounds[1]) mult = sBounds[1];\\n else if (mult < sBounds[0]) mult = sBounds[0];\\n\\n let newk = mult * k;\\n\\n if (newk > kBounds[1]) newk = kBounds[1];\\n else if (newk < kBounds[0]) newk = kBounds[0];\\n\\n return newk;\\n}\\n\\n\\nfunction vsimexAdjustStepSizeRejectedStep(\\n k,\\n relChangeStep,\\n tol,\\n kBounds,\\n sBounds\\n) {\\n /*\\n * Adjust step for rejected step\\n */\\n\\n let mult = tol / relChangeStep;\\n if (mult < sBounds[0]) mult = sBounds[0];\\n\\n let newk = mult * k;\\n if (newk < kBounds[0]) newk = kBounds[0];\\n\\n return newk;\\n}\\n\\n\\nfunction vsimexAdjustStepSizeFailedSolve(k, failedSolveS) {\\n /*\\n * Adjust step for failed solve. Bringing step size down will\\n * eventually make matrix for linear solve positive definite.\\n */\\n\\n return k * failedSolveS;\\n}\\n\\n\\nfunction vsimex(\\n f,\\n cfun,\\n Afun,\\n initialCondition,\\n timePoints,\\n fArgs,\\n cfunArgs,\\n AfunArgs,\\n diagonalA,\\n k0,\\n kBounds,\\n tol,\\n tolBuffer,\\n kP,\\n kI,\\n kD,\\n sBounds,\\n failedSolveS,\\n enforceNonnegative,\\n maxDeadSteps\\n) {\\n /*\\n *\\n */\\n\\n // Defaults\\n if (k0 === undefined) k0 = 1.0e-5;\\n if (kBounds === undefined) kBounds = [1.0e-6, 100.0];\\n if (tol === undefined) tol = 0.001;\\n if (tolBuffer === undefined) tolBuffer = 0.01;\\n if (kP === undefined) kP = 0.075;\\n if (kI === undefined) kI = 0.175;\\n if (kD === undefined) kD = 0.01;\\n if (sBounds === undefined) sBounds = [0.1, 10.0];\\n if (failedSolveS === undefined) failedSolveS = 0.1;\\n if (enforceNonnegative == undefined) enforceNonnegative = true;\\n if (maxDeadSteps === undefined) maxDeadSteps = 10;\\n\\n // Do RKF to get the first few time points\\n let rkf45TimePoints = [\\n timePoints[0],\\n timePoints[0] + k0,\\n timePoints[0] + 2.0 * k0,\\n ];\\n\\n let args = [f, cfun, Afun, fArgs, cfunArgs, AfunArgs, diagonalA];\\n let yRKF = rkf45(\\n dydtIMEX,\\n initialCondition,\\n rkf45TimePoints,\\n args,\\n k0 / 10.0,\\n tol,\\n sBounds,\\n 0.0,\\n enforceNonnegative,\\n maxDeadSteps\\n );\\n\\n yRKF = transpose(yRKF);\\n\\n // Set up variables for running CNAB2 VSIMEX\\n let tSol = [timePoints[0]];\\n let iMax = timePoints.length;\\n let y = [initialCondition];\\n let k = 2.0 * k0;\\n let newk;\\n let t = rkf45TimePoints[2];\\n let y0 = yRKF[2];\\n let i = 1;\\n let nDeadSteps = 0;\\n let deadStep = false;\\n let c = cfun(t, ...cfunArgs);\\n let A = Afun(t, ...AfunArgs);\\n let f0 = f(initialCondition, timePoints[0], ...fArgs);\\n let f1 = f(y0, t, ...fArgs);\\n let g1 = vectorAdd(c, mvMult(A, y0, diagonalA));\\n let omega = 1.0;\\n let yStep;\\n let relChangeStep;\\n let relTol = tol * (1.0 + tolBuffer);\\n let relChange = [\\n norm(vectorAdd(y0, svMult(-1.0, yRKF[1]))) / norm(y0),\\n norm(vectorAdd(yRKF[1], svMult(-1.0, initialCondition))) /\\n norm(yRKF[1]),\\n ];\\n\\n // DEBUG\\n let nSteps = 3;\\n // END EDEBUG\\n\\n while (i < iMax && nDeadSteps < maxDeadSteps) {\\n nDeadSteps = 0;\\n while (t < timePoints[i] && nDeadSteps < maxDeadSteps) {\\n // Take CNAB2 step\\n yStep = cnab2Step(y0, c, A, f1, f0, g1, omega, k, diagonalA);\\n\\n // Reject the step if failed to solve\\n if (yStep === null) {\\n newk = vsimexAdjustStepSizeFailedSolve(k, failedSolveS);\\n omega *= newk / k;\\n k = newk;\\n nDeadSteps += 1;\\n console.log(\\\"null yStep\\\");\\n } else {\\n // Relative change\\n relChangeStep =\\n norm(vectorAdd(yStep, svMult(-1.0, y0))) / norm(yStep);\\n\\n // Take step if below tolerance\\n if (relChangeStep <= relTol) {\\n f0 = f(y0, t, ...fArgs);\\n t += k;\\n y0 = yStep;\\n f1 = f(y0, t, ...fArgs);\\n c = cfun(t, ...cfunArgs);\\n A = Afun(t, ...AfunArgs);\\n g1 = vectorAdd(c, mvMult(A, y0, diagonalA));\\n newk = vsimexAdjustStepSizePID(\\n k,\\n relChange,\\n relChangeStep,\\n tol,\\n kP,\\n kI,\\n kD,\\n kBounds,\\n sBounds\\n );\\n relChange = [relChange[1], relChangeStep];\\n omega = newk / k;\\n k = newk;\\n nDeadSteps = 0;\\n }\\n // Reject the step is not within tolerance\\n else {\\n newk = vsimexAdjustStepSizeRejectedStep(\\n k,\\n relChangeStep,\\n tol,\\n kBounds,\\n sBounds\\n );\\n omega *= newk / k;\\n k = newk;\\n nDeadSteps += 1;\\n }\\n }\\n if (enforceNonnegative) {\\n y0 = y0.map(function (x) {\\n if (x < 0.0) return 0.0;\\n else return x;\\n });\\n }\\n\\n // DEBUG\\n\\t\\t nSteps += 1;\\n\\t\\t // END EDEBUG\\n }\\n if (t > tSol[tSol.length - 1]) {\\n y.push(y0);\\n tSol.push(t);\\n }\\n i += 1;\\n }\\n\\n // DEBUG\\n console.log(nSteps);\\n // END DEBUG\\n\\n if (nDeadSteps == maxDeadSteps) {\\n return nanArray(initialCondition, iMax);\\n }\\n let yInterp = interpolateSolution(timePoints, tSol, transpose(y));\\n\\n return yInterp;\\n}\\n\\n\\nfunction interpolate1d(x, xs, ys) {\\n let y2s = naturalSplineSecondDerivs(xs, ys);\\n\\n let yInterp = x.map(function (xVal) {\\n return splineEvaluate(xVal, xs, ys, y2s);\\n });\\n\\n return yInterp;\\n}\\n\\n\\nfunction interpolateSolution(timePoints, t, y) {\\n // Interpolate each row of y\\n let yInterp = y.map(function (yi) {\\n return interpolate1d(timePoints, t, yi);\\n });\\n\\n return yInterp;\\n}\\n\\n\\nfunction naturalSplineSecondDerivs(xs, ys) {\\n /*\\n * Compute the second derivatives for a cubic spline data\\n * measured at positions xs, ys.\\n *\\n * The second derivatives are then used to evaluate the spline.\\n */\\n\\n let n = xs.length;\\n\\n // Storage used in tridiagonal solve\\n let u = zeros(n);\\n\\n // Return value\\n let y2s = zeros(n);\\n\\n // Solve trigiadonal matrix by decomposition\\n for (let i = 1; i < n - 1; i++) {\\n let fracInterval = (xs[i] - xs[i - 1]) / (xs[i + 1] - xs[i - 1]);\\n let p = fracInterval * y2s[i - 1] + 2.0;\\n y2s[i] = (fracInterval - 1.0) / p;\\n u[i] =\\n (ys[i + 1] - ys[i]) / (xs[i + 1] - xs[i]) -\\n (ys[i] - ys[i - 1]) / (xs[i] - xs[i - 1]);\\n u[i] =\\n ((6.0 * u[i]) / (xs[i + 1] - xs[i - 1]) - fracInterval * u[i - 1]) /\\n p;\\n }\\n\\n // Tridiagonal solve back substitution\\n for (let k = n - 2; k >= 0; k--) {\\n y2s[k] = y2s[k] * y2s[k + 1] + u[k];\\n }\\n\\n return y2s;\\n}\\n\\n\\nfunction splineEvaluate(x, xs, ys, y2s) {\\n /*\\n * Evaluate a spline computed from points xs, ys, with second derivatives\\n * y2s, as compute by naturalSplineSecondDerivs().\\n *\\n * Assumes that x and xs are sorted.\\n */\\n let n = xs.length;\\n\\n // Indices bracketing where x is\\n let lowInd = 0;\\n let highInd = n - 1;\\n\\n // Perform bisection search to find index of x\\n while (highInd - lowInd > 1) {\\n let i = (highInd + lowInd) >> 1;\\n if (xs[i] > x) {\\n highInd = i;\\n } else {\\n lowInd = i;\\n }\\n }\\n let h = xs[highInd] - xs[lowInd];\\n let a = (xs[highInd] - x) / h;\\n let b = (x - xs[lowInd]) / h;\\n\\n let y = a * ys[lowInd] + b * ys[highInd];\\n y +=\\n (((Math.pow(a, 3) - a) * y2s[lowInd] + (Math.pow(b, 3) - b) * y2s[highInd]) * Math.pow(h, 2)) /\\n 6.0;\\n\\n return y;\\n}\\n\\n\\n// module.exports = {\\n// vsimex,\\n// rkf45,\\n// zeros, \\n// linspace\\n// };\\n\\n// vsimex(lotkaVolterra, [1.0, 3.0], linspace(0.0, 20.0, 200), [1.0, 2.0, 3.0, 4.0], 0.01, 1e-7, [0.1, 10.0], 0.0)\\n// let lv = lotkaVolterraIMEX(1.0, 2.0, 3.0, 4.0);\\n// let sol = vsimex(lv.f, lv.cfun, lv.Afun, [1.0, 3.0], linspace(0.0, 20.0, 200), [], [], [], lv.diagonalA)\\n\\n\\nfunction ij(i, j, n) {\\n /*\\n * Lexicographic indexing of 2D array represented as 1D.\\n */\\n\\n return i * n + j;\\n}\\n\\n\\nfunction twoDto1D(A) {\\n /*\\n * Convert a 2D matrix to a 1D representation with row-based (C)\\n * lexicographic ordering.\\n */\\n\\n var m = A.length;\\n var n = A[0].length;\\n\\n var A1d = [];\\n for (var i = 0; i < m; i++) {\\n for (var j = 0; j < n; j++) {\\n A1d.push(A[i][j]);\\n }\\n }\\n\\n return A1d;\\n}\\n\\n\\nfunction linspace(start, stop, n) {\\n var x = [];\\n var currValue = start;\\n var step = (stop - start) / (n - 1);\\n for (var i = 0; i < n; i++) {\\n x.push(currValue);\\n currValue += step;\\n }\\n return x;\\n}\\n\\n\\nfunction zeros(n) {\\n var x = [];\\n for (var i = 0; i < n; i++) x.push(0.0);\\n return x;\\n}\\n\\n\\nfunction shallowCopyMatrix(A) {\\n /*\\n * Make a shallow copy of a matrix.\\n */\\n\\n var Ac = [];\\n var n = A.length;\\n for (i = 0; i < n; i++) {\\n Ac.push([...A[i]]);\\n }\\n\\n return Ac;\\n}\\n\\n\\nfunction nanArray() {\\n /*\\n * Return a NaN array of shape given by arguments.\\n */\\n if (arguments.length == 1) {\\n var x = [];\\n for (var i = 0; i < arguments[0]; i++) x.push(NaN);\\n }\\n else if (arguments.length == 2) {\\n var x = [];\\n for (var i = 0; i < arguments[0]; i++) {\\n var xRow = [];\\n for (var j = 0; j < arguments[1]; j++) xRow.push(NaN);\\n x.push(xRow);\\n }\\n }\\n else {\\n throw 'Must only have one or two arguments to nanArray().'\\n }\\n\\n return x;\\n}\\n\\nfunction negAutoRHS(x, t, beta0, gamma, k, n, ks, ns, sFun, sArgs=[]) {\\n\\tlet xScalar = x[0]\\n\\n\\tlet s = sFun(t, ...sArgs);\\n\\n\\t// Correct for x being numerically negative\\n\\tlet xCorr = (xScalar > 0.0) ? xScalar : 0.0;\\n\\n\\tlet beta = beta0 * Math.pow(s / ks, ns) / (1 + Math.pow(s / ks, ns));\\n\\n\\treturn [beta / (1 + Math.pow(xCorr / k, n)) - gamma * xCorr];\\n} \\n\\n\\nfunction unregRHS(x, t, beta0, gamma, ks, ns, sFun, sArgs=[]) {\\n\\tlet xScalar = x[0]\\n\\tlet s = sFun(t, ...sArgs);\\n\\n\\tlet beta = beta0 * Math.pow(s / ks, ns) / (1 + Math.pow(s / ks, ns));\\n\\n\\treturn [beta - gamma * xScalar];\\n}\\n\\n\\nfunction sPulse(t, t0, tau) {\\n\\treturn Math.exp(-4.0 * Math.pow((t - t0) / tau, 2));\\n}\\n\\n\\nfunction callback() {\\n\\tlet xRangeMax = xRange.end;\\n\\tlet dt = 0.01;\\n\\tlet x0 = [0.0];\\n\\tlet t0 = t0Slider.value;\\n\\tlet tau = tauSlider.value;\\n\\tlet s = cds.data['s'];\\n\\n\\tlet t = linspace(0.0, xRangeMax, cds.data['t'].length);\\n\\tlet sArgs = [t0, tau];\\n\\tlet args = [\\n\\t\\tMath.pow(10, logBeta0Slider.value),\\n\\t\\tMath.pow(10, logGammaSlider.value),\\n\\t\\tMath.pow(10, logkSlider.value),\\n\\t\\tnSlider.value,\\n\\t\\tMath.pow(10, logksSlider.value),\\n\\t\\tnsSlider.value,\\n\\t\\tsPulse,\\n\\t\\tsArgs\\n\\t];\\n\\tlet argsUnreg = [args[0], args[1], args[4], args[5], args[6], args[7]];\\n\\n\\t// Integrate ODES\\n\\tlet xSolve = rkf45(negAutoRHS, x0, t, args, dt)[0];\\n\\tlet xUnregSolve = rkf45(unregRHS, x0, t, argsUnreg)[0];\\n\\n\\t// Pulse for plotting\\n\\tfor (let i = 0; i < t.length; i++) {\\n\\t\\ts[i] = sPulse(t[i], t0, tau);\\n\\t}\\n\\n\\t// Normalize if necessary\\n\\tif (normalizeToggle.active) {\\n\\t\\tlet xMax = Math.max(...xSolve);\\n\\t\\tif (xMax > 0.0) xSolve = svMult(1.0 / xMax, xSolve);\\n\\n\\t\\tlet xUnregMax = Math.max(...xUnregSolve);\\n\\t\\tif (xUnregMax > 0.0) xUnregSolve = svMult(1.0 / xUnregMax, xUnregSolve);\\n\\n\\t\\tlet sMax = Math.max(...s);\\n\\t\\tif (sMax > 0.0) s = svMult(1.0 / sMax, s);\\n\\n\\t\\tyaxis.axis_label = 'normalized concentration';\\n\\t}\\n\\telse yaxis.axis_label = 'concentration';\\n\\n\\t// Toggle legend visibility\\n\\tlegend.visible = (legendToggle.active) ? true : false;\\n\\n\\tcds.data['t'] = t;\\n\\tcds.data['x'] = xSolve;\\n\\tcds.data['x_unreg'] = xUnregSolve;\\n\\n\\tcds.change.emit();\\n}\\n\\ncallback()\"}}]]]},\"end\":10.0}},\"y_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p4552\"},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p4563\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p4565\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p4554\"},\"renderers\":[{\"id\":\"p4602\"},{\"id\":\"p4613\"},{\"id\":\"p4623\"}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p4556\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p4581\"},{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p4582\"},{\"type\":\"object\",\"name\":\"BoxZoomTool\",\"id\":\"p4583\",\"attributes\":{\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p4584\",\"attributes\":{\"syncable\":false,\"level\":\"overlay\",\"visible\":false,\"left_units\":\"canvas\",\"right_units\":\"canvas\",\"bottom_units\":\"canvas\",\"top_units\":\"canvas\",\"line_color\":\"black\",\"line_alpha\":1.0,\"line_width\":2,\"line_dash\":[4,4],\"fill_color\":\"lightgrey\",\"fill_alpha\":0.5}}}},{\"type\":\"object\",\"name\":\"SaveTool\",\"id\":\"p4585\"},{\"type\":\"object\",\"name\":\"ResetTool\",\"id\":\"p4586\"},{\"type\":\"object\",\"name\":\"HelpTool\",\"id\":\"p4587\"}]}},\"left\":[{\"id\":\"p4574\"}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p4567\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p4569\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p4570\"},\"axis_label\":\"time\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p4568\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p4573\",\"attributes\":{\"axis\":{\"id\":\"p4567\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p4580\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p4574\"}}},{\"id\":\"p4605\"}],\"frame_width\":375,\"frame_height\":250}},{\"type\":\"object\",\"name\":\"Spacer\",\"id\":\"p4638\",\"attributes\":{\"width\":30}},{\"type\":\"object\",\"name\":\"Column\",\"id\":\"p4639\",\"attributes\":{\"children\":[{\"id\":\"p4627\"},{\"id\":\"p4628\"},{\"id\":\"p4629\"},{\"id\":\"p4630\"},{\"id\":\"p4636\"}]}},{\"type\":\"object\",\"name\":\"Column\",\"id\":\"p4640\",\"attributes\":{\"children\":[{\"id\":\"p4631\"},{\"id\":\"p4632\"},{\"id\":\"p4633\"},{\"id\":\"p4634\"},{\"id\":\"p4635\"}]}}]}}],\"callbacks\":{\"type\":\"map\"}}};\n", " const render_items = [{\"docid\":\"22b76506-e9ce-410d-b95f-e8c38e741590\",\"roots\":{\"p4641\":\"2d7642f3-780d-4e2c-aaab-216c4e226b3d\"},\"root_ids\":[\"p4641\"]}];\n", " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " let attempts = 0;\n", " const timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined) {\n", " clearInterval(timer);\n", " embed_document(root);\n", " } else {\n", " attempts++;\n", " if (attempts > 100) {\n", " clearInterval(timer);\n", " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", " }\n", " }\n", " }, 10, root)\n", " }\n", "})(window);" ], "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "p4641" } }, "output_type": "display_data" } ], "source": [ "bokeh.io.show(biocircuits.jsplots.autorepressor_response_to_pulse())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "By moving around the sliders, we can see that increasing the strength of the repression (by decreasing $k$) accentuates the speed-up provided by negative autoregulation. Furthermore, we see that increasing the cooperativitity of the repressor (by increasing $n$) makes the initial rise in $x$ \"sharper\". What other properties can you find through interacting with this plot?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "## References\n", "\n", "- Rosenfeld, et al., Negative autoregulation speeds the response times of transcription networks, _J. Molec. Biol._, 323, 785–793, 2002. ([link](https://doi.org/10.1016/S0022-2836(02)00994-4))\n", "- Shen-Orr S. S., et al., Network motifs in the transcriptional regulation network of _Escherichia coli_, _Nature Genetics_, 31, 64–68, 2002. ([link](https://doi.org/10.1038/ng881))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "## Technical appendices" ] }, { "cell_type": "markdown", "metadata": { "nbsphinx-toctree": { "maxdepth": 1 }, "tags": [] }, "source": [ "- [2a. Approximate solution of autorepressor dynamics](../technical_appendices/02a_approximate_autorepression_dynamics.ipynb)\n", "- [2b. Numerical solutions to ODEs](../technical_appendices/02b_numerical_odes.ipynb)\n", "- [2c. Interactive plotting with Bokeh](../technical_appendices/02c_interactive_plotting.ipynb)" ] }, { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "
\n", "\n", "## Problems" ] }, { "cell_type": "markdown", "metadata": { "nbsphinx-toctree": { "maxdepth": 1 }, "tags": [] }, "source": [ "- [2.1: The cost of a steady state](../problems/02/problem_2.1.ipynb)\n", "- [2.2: Event handling for discontinuous derivatives](../problems/02/problem_2.2.ipynb)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "## Computing environment" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Python implementation: CPython\n", "Python version : 3.10.10\n", "IPython version : 8.10.0\n", "\n", "numpy : 1.23.5\n", "pandas : 1.5.3\n", "scipy : 1.10.0\n", "bokeh : 3.1.0\n", "colorcet : 3.0.1\n", "biocircuits: 0.1.9\n", "jupyterlab : 3.5.3\n", "\n" ] } ], "source": [ "%load_ext watermark\n", "%watermark -v -p numpy,pandas,scipy,bokeh,colorcet,biocircuits,jupyterlab" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.10.9" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": false }, "varInspector": { "cols": { "lenName": 16, "lenType": 16, "lenVar": 40 }, "kernels_config": { "python": { "delete_cmd_postfix": "", "delete_cmd_prefix": "del ", "library": "var_list.py", "varRefreshCmd": "print(var_dic_list())" }, "r": { "delete_cmd_postfix": ") ", "delete_cmd_prefix": "rm(", "library": "var_list.r", "varRefreshCmd": "cat(var_dic_list()) " } }, "position": { "height": "730.4000244140625px", "left": "486.6000061035156px", "right": "20px", "top": "120px", "width": "517.4000244140625px" }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "window_display": false } }, "nbformat": 4, "nbformat_minor": 4 }