{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 1. Introduction to Biological Circuit Design\n", "\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Key concepts**\n", "\n", "- Genetic circuits control diverse biological behaviors\n", "- Our goals are twofold:\n", " 1. Understand the principles that explain the organization of natural biological circuits (systems biology) and allow the design of novel synthetic circuits that implement new cellular behaviors (synthetic biology).\n", " 2. Develop tools and techniques for analyzing different circuit designs analytically and computationally. \n", "- To facilitate the second goal, the material is presented in executable Jupyter notebooks (like this one).\n", "- \"Design principles\" provide functional rationales for choosing one circuit design or architecture over another, and are usually of the form *Feature X provides function Y*.\n", "- Ordinary differential equations for protein production and removal allow analysis of simple gene expression processes.\n", "- Separation of time scales allows us to ignore \"faster\" reactions when analyzing \"slower\" processes.\n", "- Gene regulation can be analyzed in terms of binding of activators and repressors to binding sites.\n", "\n", "
" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "tags": [ "hide_input" ] }, "outputs": [ { "data": { "text/html": [ "\n", "
\n", " \n", " Loading BokehJS ...\n", "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "\n", "(function(root) {\n", " function now() {\n", " return new Date();\n", " }\n", "\n", " var force = true;\n", "\n", " if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n", " root._bokeh_onload_callbacks = [];\n", " root._bokeh_is_loading = undefined;\n", " }\n", "\n", " var JS_MIME_TYPE = 'application/javascript';\n", " var HTML_MIME_TYPE = 'text/html';\n", " var EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n", " var CLASS_NAME = 'output_bokeh rendered_html';\n", "\n", " /**\n", " * Render data to the DOM node\n", " */\n", " function render(props, node) {\n", " var script = document.createElement(\"script\");\n", " node.appendChild(script);\n", " }\n", "\n", " /**\n", " * Handle when an output is cleared or removed\n", " */\n", " function handleClearOutput(event, handle) {\n", " var cell = handle.cell;\n", "\n", " var id = cell.output_area._bokeh_element_id;\n", " var server_id = cell.output_area._bokeh_server_id;\n", " // Clean up Bokeh references\n", " if (id != null && id in Bokeh.index) {\n", " Bokeh.index[id].model.document.clear();\n", " delete Bokeh.index[id];\n", " }\n", "\n", " if (server_id !== undefined) {\n", " // Clean up Bokeh references\n", " var cmd = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n", " cell.notebook.kernel.execute(cmd, {\n", " iopub: {\n", " output: function(msg) {\n", " var id = msg.content.text.trim();\n", " if (id in Bokeh.index) {\n", " Bokeh.index[id].model.document.clear();\n", " delete Bokeh.index[id];\n", " }\n", " }\n", " }\n", " });\n", " // Destroy server and session\n", " var cmd = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n", " cell.notebook.kernel.execute(cmd);\n", " }\n", " }\n", "\n", " /**\n", " * Handle when a new output is added\n", " */\n", " function handleAddOutput(event, handle) {\n", " var output_area = handle.output_area;\n", " var output = handle.output;\n", "\n", " // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n", " if ((output.output_type != \"display_data\") || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n", " return\n", " }\n", "\n", " var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n", "\n", " if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n", " toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n", " // store reference to embed id on output_area\n", " output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n", " }\n", " if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n", " var bk_div = document.createElement(\"div\");\n", " bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n", " var script_attrs = bk_div.children[0].attributes;\n", " for (var i = 0; i < script_attrs.length; i++) {\n", " toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n", " 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", " var toinsert = this.create_output_subarea(\n", " metadata,\n", " CLASS_NAME,\n", " EXEC_MIME_TYPE\n", " );\n", " this.keyboard_manager.register_events(toinsert);\n", " // Render to node\n", " var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n", " render(props, toinsert[toinsert.length - 1]);\n", " element.append(toinsert);\n", " return toinsert\n", " }\n", "\n", " /* Handle when an output is cleared or removed */\n", " events.on('clear_output.CodeCell', handleClearOutput);\n", " events.on('delete.Cell', handleClearOutput);\n", "\n", " /* Handle when a new output is added */\n", " events.on('output_added.OutputArea', handleAddOutput);\n", "\n", " /**\n", " * Register the mime type and append_mime function with output_area\n", " */\n", " OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n", " /* Is output safe? */\n", " safe: true,\n", " /* Index of renderer in `output_area.display_order` */\n", " index: 0\n", " });\n", " }\n", "\n", " // register the mime type if in Jupyter Notebook environment and previously unregistered\n", " if (root.Jupyter !== undefined) {\n", " var events = require('base/js/events');\n", " var OutputArea = require('notebook/js/outputarea').OutputArea;\n", "\n", " if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n", " register_renderer(events, OutputArea);\n", " }\n", " }\n", "\n", " \n", " if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n", " root._bokeh_timeout = Date.now() + 5000;\n", " root._bokeh_failed_load = false;\n", " }\n", "\n", " var NB_LOAD_WARNING = {'data': {'text/html':\n", " \"
\\n\"+\n", " \"

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

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

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

\\n\"+\n \"\\n\"+\n \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"
\"}};\n\n function display_loaded() {\n var el = document.getElementById(\"1001\");\n if (el != null) {\n el.textContent = \"BokehJS is loading...\";\n }\n if (root.Bokeh !== undefined) {\n if (el != null) {\n el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(display_loaded, 100)\n }\n }\n\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls == null || js_urls.length === 0) {\n run_callbacks();\n return null;\n }\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = css_urls.length + js_urls.length;\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n\n function on_error() {\n console.error(\"failed to load \" + url);\n }\n\n for (var i = 0; i < css_urls.length; i++) {\n var url = css_urls[i];\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error;\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n }\n\n const hashes = {\"https://cdn.bokeh.org/bokeh/release/bokeh-2.0.1.min.js\": \"JpP8FXbgAZLkfur7LiK3j9AGBhHNIvF742meBJrjO2ShJDhCG2I1uVvW+0DUtrmc\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-2.0.1.min.js\": \"xZlADit0Q04ISQEdKg2k3L4W9AwQBAuDs9nJL9fM/WwzL1tEU9VPNezOFX0nLEAz\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-2.0.1.min.js\": \"4BuPRZkdMKSnj3zoxiNrQ86XgNw0rYmBOxe7nshquXwwcauupgBF2DHLVG1WuZlV\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-2.0.1.min.js\": \"Dv1SQ87hmDqK6S5OhBf0bCuwAEvL5QYL0PuR/F1SPVhCS/r/abjkbpKDYL2zeM19\"};\n\n for (var i = 0; i < js_urls.length; i++) {\n var url = js_urls[i];\n var element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error;\n element.async = false;\n element.src = url;\n if (url in hashes) {\n element.crossOrigin = \"anonymous\";\n element.integrity = \"sha384-\" + hashes[url];\n }\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n };var element = document.getElementById(\"1001\");\n if (element == null) {\n console.error(\"Bokeh: ERROR: autoload.js configured with elementid '1001' but no matching script tag was found. \")\n return false;\n }\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n \n var js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-2.0.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-2.0.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-2.0.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-2.0.1.min.js\"];\n var css_urls = [];\n \n\n var inline_js = [\n function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\n function(Bokeh) {\n \n \n }\n ];\n\n function run_inline_js() {\n \n if (root.Bokeh !== undefined || force === true) {\n \n for (var 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 var cell = $(document.getElementById(\"1001\")).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\n }\n\n }\n\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(css_urls, js_urls, function() {\n console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));" }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import bokeh.io\n", "import bokeh.plotting\n", "\n", "bokeh.io.output_notebook()" ] }, { "cell_type": "markdown", "metadata": { "tags": [ "remove_cell" ] }, "source": [ "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Biological circuit design\n", "\n", "Living cells and the multicellular organisms they comprise represent (arguably) the most amazing systems, or devices, in the universe! Each cell is, in some very simple sense, just a membrane-bound collection of molecules. However, these molecules interact with one another in very specific ways, forming circuits. And those circuits enable the cell to sense its environment, obtain and utilize nutrients, avoid toxins, control its own division and growth, and keep track of time, among many other activities. In fact, the activities of these circuits extend beyond the individual cell in which they operate. Cells use circuits to coordinate with other cells to build multicellular tissues and organs, including brains, develop into multifunctional organisms, and even generate systems that can patrol those organisms to repair damage and destroy pathogens. Over much longer, multi-generational, timescales, these circuits continue to evolve ever more impressive functions. And they do so, for the most part, without complaining. \n", "\n", "In this course, we will study these *biological circuits* from a *design* point of view -- we will try to understand a wide range of different circuit architectures and how they provide specific functions for the cell. \n", "\n", "With that first sentence, we must immediately define what we mean by a **biological circuit**, and what we mean by **biological circuit design**." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "
\n", "\n", "![Hanahan and Weinberg](figs/Hanahan-Weinberg-2000.png)\n", "\n", "
\n", "\n", "This image of the cell as a set of circuits comes from a classic review of cancer by [Hanahan and Weinberg, _Cell_, 2000](https://reader.elsevier.com/reader/sd/pii/S0092867400816839?token=0484E13D03429AA97AEB30B7F31F6FA354F58B5084EC65AAD2F7378F8799578FA1A1D3336D1FB292B5CE9FFA10DF5359).\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## What is a biological circuit?\n", "\n", "For this course, we will think about at least two levels of biological circuitry: \n", "\n", "**Molecular circuits** operating in cells consist of molecular species (genes, proteins, etc.) that interact with one another in specific ways. For example, a given gene can be transcribed to produce a corresponding mRNA, which can in turn be translated to produce a specific protein. Similarly, a kinase may specifically phosphorylate a target protein on specific residues. The specificity of these interactions is the key property that enables molecular circuits. Examples of molecular circuits include those that control the cell cycle and the circadian clock, the signaling pathways that process signals from other cells, and the circuits that control cell death, among countless others.\n", "\n", "One level up, we will also consider **cell circuits**. In this case, we can think of cells in different states, of different types, or even from different species that signal one another to control each other's growth, death, proliferation, and differentiation. The key variables in these circuits are the concentrations and locations of each type of cell. A great example of a cell circuit is the immune system, in which different cell types influence each other's proliferation and differentiation through cytokines and other signals.\n", "\n", "Of course, the two levels are not independent. The behavior of a given cell type within a cell circuit is controlled by its molecular circuits.\n", "\n", "For either level, we can also distinguish between natural circuits that we discover in microbes, plants, and animals, and *synthetic* circuits that we design and build within cells out of well-characterized or re-engineered genes, proteins, and other molecular components. \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## What is biological circuit design?\n", "\n", "The problem of design emerges whenever one can build many different products from arrangements of the same elements. For example, electronic circuits are composed of a handful of different kinds of elements: transistors, resisters, and so on that can be connected in many different ways to produce a gigantic variety of circuits with different properties. Which circuit design will work best? What tradeoffs, for example between power and performance, or between speed and precision, exist for alternative designs that produce similar functions? Design problems are also prevalent outside of science and engineering. For example, to make a movie poster one has to choose and arrange graphical elements in relation to one another. \n", "\n", "The biological sciences have amassed a information about the molecular components of cells (genes, RNAs, proteins, metabolites, and many other molecules) and their interactions. We know where transcription factors bind genome-wide, which proteins chemically modify which others, and which proteins function together in complexes. At the same time, synthetic biology approaches now allow us to construct new genetic circuits within cells that can program totally new behaviors. So, naively, it might seem as if we ought to have a handle on biological circuit design. We ought to be able to understand, predict, and control cellular circuits with great precision. However, in practice, our abilities are still more limited because we are only beginning to uncover the answers to certain fundamental questions about the designs of these circuits. \n", "\n", "Here are examples of the types of problems that biological circuit design can help address:\n", "\n", "* What capabilities does each circuit provide for the cell? (function, design principles)\n", "* How do these capabilities emerge from circuit architecture? (mechanism)\n", "* How can we control cells in predictable ways using these circuits? (biomedical applications)\n", "* How can we use circuit design principles to program predictable new behaviors in living cells? (synthetic biology and bioengineering)\n", "\n", "In this course, we will approach these questions from the point of view of both *natural* and *synthetic* circuits, with the idea that the fundamental principles that allow a circuit to function effectively within or among cells do not necessarily depend on whether that circuit evolved naturally or was constructed in the lab. Having said that, we also recognize that evolution may be able to produce designs that are more complex or different from those we are currently able to construct, or even conceive. In fact, a major goal of the course is to see to what extent we can learn principles from natural circuits that will allow us to design synthetic circuits more effectively.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Biological circuits differ from many other types of circuits or circuit-like systems\n", "\n", "Is biological circuit design a solved problem? Electronics, software, plumbing, construction, and other human designed systems are based on connections between modular components (see Figure). Can we not just apply known principles of those systems biological circuits? The answer is generally no, for many reasons. \n", "\n", "* Natural circuits were not designed by people. They evolved. That means they are not \"well-documented\" and their function(s) are often totally unclear.\n", "* Even synthetic circuits, which are designed by people, often use evolved components (such as transcription factors) for which we do not have a complete understanding.\n", "* Biological circuits use fundamentally different designs than human-engineered counterparts. For example, in cells, molecular components exhibit extensive many-to-many interactions (\"crosstalk\") among their components. This property is typically avoided in electronics but may provide unique capabilities to cells.\n", "* Noise: While electronic circuits can function deterministically, biological circuits function with high levels of stochastic (random) fluctuations in their own components. These fluctuations are often called \"noise.\" And noise is not just a nuisance: some biological circuits take advantage of it to enable behaviors that would not be possible without it.\n", "* Biological circuits can be highly parallel, in the sense that the same circuit can operate in many different genetically identical individual cells, whether in a bacterial population or in a multicellular organism, such as yourself.\n", "* Electrical systems use positive or negative voltages and currents, allowing for positive or negative effects. By contrast, biological circuits are built out of molecules (or cells) whose concentrations cannot be negative. That means they must use other mechanisms for \"inverting\" activities.\n", "* From a more practical point of view, we have a very limited ability to construct, test, and compare designs. Even with recent developments such as CRISPR, our ability to rapidly and precisely produce cells with well-defined genomes remains limited compared to what is possible in more advanced disciplines. (Having said that, the situation is rapidly improving!)\n", "* *What other fundamental differences between biological circuits and human designed systems can you think of?* " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "![electronics and plumbing](figs/Electronics-Software-Plumbing.png)\n", "\n", "
\n", "\n", "*Electronics, software, and plumbing are great examples of human-designed systems that possess many properties analogous to biological circuits. These systems are based on known design principles that sometimes overlap with, and sometimes differ from, those of biological circuits.*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Inspiration from electronics\n", "\n", "In their classic book, [*The Art of Electronics*](https://artofelectronics.net), Horowitz and Hill explain something similar to the excitement many now feel now about biology:\n", "\n", "
\n", "\n", "![Horowitz and Hill](figs/art_of_electronics_quote.jpg)\n", "\n", "
\n", "\n", "[Paul Horowitz and Winfield Hill, *The Art of Electronics, 3rd edition*](https://artofelectronics.net), Cambridge University Press, 2015.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Premise and goals\n", "\n", "Determining the design principles of genetic circuits will ultimately enable us to\n", "\n", "* Understand, predict, and control living systems with greater precision (systems biology) \n", "* Design new genetic circuits that function effectively in cells and organisms (synthetic biology). \n", "\n", "To reach these goals, this course will develop quantitative methods and approaches for analyzing different circuit designs (tools), and also identify circuit design principles that provide insight and intuition into how different designs operate, and why they were selected by evolution or synthetic biolgoists. \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## What is a gene circuit design principle?\n", "\n", "We will define a circuit **design principle** as a statement of the form: *Circuit feature X enables function Y*. Each module of the course will explore a different design principle. Here are some examples:\n", "\n", "* Negative autoregulation of a transcription factor accelerates its response to a change in input.\n", "* Kinases that also act as phosphatases (bifunctional kinases) provide tunable linear amplifiers in two-component signaling systems.\n", "* Pulsing a transcription factor on and off at different frequencies (time-based regulation) can enable coordinated regulation of many target genes.\n", "* Noise-excitable circuits enable cells to control the probability of transiently differentiating into an alternate state\n", "* Mutual inactivation of receptors and ligands in the same cell enable equivalent cells to signal unidirectionally\n", "* Independent tuning of gene expression burst size and frequency enables cells to control cell-cell heterogeneity in gene expression\n", "* Feedback on morphogen mobility allows tissue patterns to scale with the size of a tissue\n", "* And many others..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## First steps: Develop intuition for the simplest gene regulation circuits\n", "\n", "We will start by thinking about a single gene, coding for a single corresponding protein. This minimal example will allow us to develop intuition for the dynamics of the simplest gene regulations systems and lay out a procedure that we can further extend to analyze more complex circuits. \n", "\n", "What protein concentration will be produced by a gene *x*? We assume that the gene will be transcribed to mRNA and those mRNA molecules will in turn be translated to produce proteins, such that new proteins are produced at a total rate $\\beta$ molecules per unit time. The $x$ protein does not simply accumulate over time. It is also removed both through active degradation as well as dilution as cells grow and divide. For simplicity, we will assume that both processes tend to reduce protein concentrations through a simple first-order process, with a rate constant $\\gamma$. \n", "\n", "The approach we are taking can be described as \"phenomenological modeling.\" We do not explicitly represent every underlying molecular step. Instead, we assume those steps give rise to \"coarse grained\" relationships that we can model in a manner that is independent of many underlying molecular details. The test of this approach is whether it allows us to understand and experimentally predict the behavior of real biological systems. See [Wikipedia's article on phenomenological models](https://en.wikipedia.org/wiki/Phenomenological_model) and [this article](https://doi.org/10.1186/1741-7007-12-29) by Jeremy Gunawardena.\n", "\n", "Thus, we can draw a diagram of our simple gene, x, with its protein being produced and removed (dashed circle):\n", "\n", "
\n", "\n", "![simplest_protein](figs/simplest_protein.png)\n", "\n", "
\n", "\n", "Here, protein production occurs at rate $\\beta$ and degradation+dilution at rate $\\gamma x$. We can then write down a simple ordinary differential equation describing these dynamics:\n", "\n", "\\begin{align} \n", "&\\frac{dx}{dt} = \\mathrm{production - (degradation+dilution)} \\\\[1em]\n", "&\\frac{dx}{dt} = \\beta - \\gamma x\n", "\\end{align}\n", "\n", "where \n", "\n", "\\begin{align}\n", "\\gamma = \\gamma_\\mathrm{dilution} + \\gamma_\\mathrm{degradation}\n", "\\end{align}\n", "\n", "*A note on effective degradation rates*: When cells are growing, protein is removed through both degradation and dilution. For stable proteins, dilution dominates. For very unstable proteins, whose half-life is much smaller than the cell cycle period, dilution may be negligible. In bacteria, mRNA half-lives (1-10 min, typically) are much shorter than protein half-lives. In eukaryotic cells this is not necessarily true (mRNA half-lives can be many hours in mammalian cells).\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Solving for the steady state\n", "\n", "Often, one of the first things we would like to know is the concentration of protein under steady state conditions. To obtain this, we set the time derivative to 0, and solve:\n", "\n", "\\begin{align}\n", "&\\frac{dx}{dt} = \\beta - \\gamma x = 0 \\\\[1em]\n", "&\\Rightarrow x_{\\mathrm{st}} = \\beta / \\gamma \n", "\\end{align}\n", "\n", "In other words, the steady-state protein concentration depends on the ratio of production rate to degradation rate." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Including transcription and translation as separate steps \n", "\n", "This description does not distinguish between transcription and translation. However, considering both processes separately can be important in more dynamic and stochastic contexts that we will encounter later in the course. To do so, we can simply add an additional variable to represent the mRNA concentration, which is now transcribed, translated to protein, and degraded (and diluted), as shown schematically here:\n", "\n", "
\n", "\n", "![transcript_and_translation](figs/transcription_and_translation.png)\n", "\n", "
\n", "\n", "These reactions can be described by two coupled differential equations for the mRNA (m) and protein (x):\n", "\n", "\\begin{align}\n", "&\\frac{dm}{dt} = \\beta_m - \\gamma_m m, \\\\[1em]\n", "&\\frac{dx}{dt} = \\beta_p m - \\gamma_p x. \n", "\\end{align}\n", "\n", "Now, we can determine the steady state mRNA and protein concentrations straightforwardly, by setting both time derivatives to 0 and solving. We find:\n", "\n", "\\begin{align}\n", "&m_\\mathrm{st} = \\beta_m / \\gamma_m, \\\\[1em]\n", "&x_\\mathrm{st} = \\frac{\\beta_p m_\\mathrm{st}}{\\gamma_p} = \\frac{\\beta_p \\beta_m}{\\gamma_p \\gamma_m}.\n", "\\end{align}\n", "\n", "From this, we see that the steady state protein concentration is proportional to the product of the two synthesis rates and inversely proportional to the product of the two degradation rates. \n", "\n", "And this gives us our first **design puzzle**: the cell could control protein expression level in at least **four different ways:** It could modulate (1) transcription, (2) translation, (3) mRNA degradation or (4) protein degradation rates (or combinations thereof). Are there tradeoffs between these different options? Are they all used indiscriminately or is one favored in natural contexts? \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## From gene expression to gene regulation - adding a repressor\n", "\n", "Life would be simple—perhaps too simple—if genes were simply left \"on\" all the time. To make things interesting the cell has to regulate them, turning their expression levels lower or higher depending on environmental conditions and other inputs. One of the simplest ways to do this is through repressors. Repressors are proteins that can bind to specific binding sites at or near a promoter to change its activity. Often the strength of their binding is contingent on external inputs. For example, the LacI repressor normally turns off the genes for lactose utilization in *E. coli*. However, in the presence of lactose in the media, a modified form of lactose binds to LacI, inhibiting its ability to repress its target genes. Thus, a nutrient (lactose) can regulate expression of genes that allow the cell to use it. (For the scientific and historical saga of this seemingly simple system, we recommend the fascinating, wonderful book [\"The lac operon\"](https://www.amazon.com/lac-Operon-Benno-Müller-Hill/dp/3110148307) by B. Müller-Hill.)\n", "\n", "In the following diagram, we label the repressor R.\n", "\n", "
\n", "\n", "![repressible_gene_2](figs/repressible_gene2.png)\n", "\n", "
\n", "\n", "\n", "\\begin{align}\n", "D + R \\rightleftharpoons D_{occ}\n", "\\end{align}\n", "\n", "\n", "Within the cell, the repressor binds and unbinds its target site. We assume that the expression level of the gene is lower when the repressor is bound and higher when it is unbound. The mean expression level of the gene is then proportional to the fraction of time that the repressor is unbound. \n", "\n", "We therefore compute the \"concentration\" of DNA sites in occupied or unoccupied states. (Within a single cell an individual site on the DNA is either bound or unbound, but averaged over a population of cells, we can talk about the mean occupancy of the site). Let $D$ be the concentration of unoccupied promoter, $D_\\mathrm{occ}$ be the concentration of occupied promoter, and $D_\\mathrm{tot}$ be the total concentration of promoter, with $D_\\mathrm{tot} = D + D_\\mathrm{occ}$, as required by conservation of mass.\n", "\n", "We can also assume a **separation of timescales** between the rates of binding and unbinding of the repressor to the DNA binding site are both often fast compared to the timescales over which mRNA and protein concentrations vary. (Careful, however, in some contexts, such as mammalian cells, this is not true.) \n", "\n", "All we need to know is the mean concentration of unoccupied binding sites, $D/D_\\mathrm{tot}$.\n", "\n", "\\begin{align}\n", "&k_+ D R = k_- D_\\mathrm{occ} \\\\[1em]\n", "&D_\\mathrm{occ} = D_\\mathrm{tot} - D \\\\[1em]\n", "&\\frac{D}{D_\\mathrm{tot}} = \\frac{1}{1+R/K_\\mathrm{d}},\n", "\\end{align}\n", " \n", "where $K_\\mathrm{d} = k_- / k_+$. From this, we can write the production rate as a function of repressor concentration,\n", "\n", "\\begin{align}\n", "\\beta(R) = \\beta_0 \\frac{D}{D_\\mathrm{tot}} = \\frac{\\beta_0}{1+R/K_\\mathrm{d}}.\n", "\\end{align}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Properties of the simple binding curve\n", "\n", "This is our first encounter with a soon to be familiar function. Note that this function has two parameters: $K_\\mathrm{d}$ specifies the concentration of repressor at which the response is reduced to half its maximum value. The coefficient $\\beta_0$ is simply the maximum expression level, and is a parameter that multiples the rest of the function." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "tags": [ "hide_input" ] }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function embed_document(root) {\n", " \n", " var docs_json = {\"92dd239e-da46-4176-9cad-7d9b764c9d91\":{\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"1011\"}],\"center\":[{\"id\":\"1014\"},{\"id\":\"1018\"},{\"id\":\"1045\"}],\"left\":[{\"id\":\"1015\"}],\"plot_height\":275,\"plot_width\":400,\"renderers\":[{\"id\":\"1036\"},{\"id\":\"1050\"}],\"title\":{\"id\":\"1038\"},\"toolbar\":{\"id\":\"1026\"},\"x_range\":{\"id\":\"1003\"},\"x_scale\":{\"id\":\"1007\"},\"y_range\":{\"id\":\"1005\"},\"y_scale\":{\"id\":\"1009\"}},\"id\":\"1002\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{\"label\":{\"value\":\"\\u03b2(R)\"},\"renderers\":[{\"id\":\"1036\"}]},\"id\":\"1046\",\"type\":\"LegendItem\"},{\"attributes\":{\"bottom_units\":\"screen\",\"fill_alpha\":0.5,\"fill_color\":\"lightgrey\",\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":1.0,\"line_color\":\"black\",\"line_dash\":[4,4],\"line_width\":2,\"render_mode\":\"css\",\"right_units\":\"screen\",\"top_units\":\"screen\"},\"id\":\"1025\",\"type\":\"BoxAnnotation\"},{\"attributes\":{\"active_drag\":\"auto\",\"active_inspect\":\"auto\",\"active_multi\":null,\"active_scroll\":\"auto\",\"active_tap\":\"auto\",\"tools\":[{\"id\":\"1019\"},{\"id\":\"1020\"},{\"id\":\"1021\"},{\"id\":\"1022\"},{\"id\":\"1023\"},{\"id\":\"1024\"}]},\"id\":\"1026\",\"type\":\"Toolbar\"},{\"attributes\":{\"axis\":{\"id\":\"1011\"},\"ticker\":null},\"id\":\"1014\",\"type\":\"Grid\"},{\"attributes\":{\"axis_label\":\"\\u03b2(R)\",\"formatter\":{\"id\":\"1041\"},\"ticker\":{\"id\":\"1016\"}},\"id\":\"1015\",\"type\":\"LinearAxis\"},{\"attributes\":{\"data_source\":{\"id\":\"1033\"},\"glyph\":{\"id\":\"1034\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"1035\"},\"selection_glyph\":null,\"view\":{\"id\":\"1037\"}},\"id\":\"1036\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1007\",\"type\":\"LinearScale\"},{\"attributes\":{\"line_color\":\"orange\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1048\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"1019\",\"type\":\"PanTool\"},{\"attributes\":{\"click_policy\":\"hide\",\"items\":[{\"id\":\"1046\"},{\"id\":\"1061\"}]},\"id\":\"1045\",\"type\":\"Legend\"},{\"attributes\":{},\"id\":\"1020\",\"type\":\"WheelZoomTool\"},{\"attributes\":{\"source\":{\"id\":\"1033\"}},\"id\":\"1037\",\"type\":\"CDSView\"},{\"attributes\":{\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[200]},\"y\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[200]}},\"selected\":{\"id\":\"1059\"},\"selection_policy\":{\"id\":\"1058\"}},\"id\":\"1033\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"overlay\":{\"id\":\"1025\"}},\"id\":\"1021\",\"type\":\"BoxZoomTool\"},{\"attributes\":{\"axis_label\":\"R\",\"formatter\":{\"id\":\"1043\"},\"ticker\":{\"id\":\"1012\"}},\"id\":\"1011\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1009\",\"type\":\"LinearScale\"},{\"attributes\":{\"text\":\"Kd = 1, \\u03b2\\u2080 = 1\"},\"id\":\"1038\",\"type\":\"Title\"},{\"attributes\":{},\"id\":\"1022\",\"type\":\"SaveTool\"},{\"attributes\":{},\"id\":\"1041\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"tomato\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1035\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"1023\",\"type\":\"ResetTool\"},{\"attributes\":{},\"id\":\"1012\",\"type\":\"BasicTicker\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"orange\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1049\",\"type\":\"Line\"},{\"attributes\":{\"axis\":{\"id\":\"1015\"},\"dimension\":1,\"ticker\":null},\"id\":\"1018\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1016\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"1024\",\"type\":\"HelpTool\"},{\"attributes\":{\"label\":{\"value\":\"initial slope\"},\"renderers\":[{\"id\":\"1050\"}]},\"id\":\"1061\",\"type\":\"LegendItem\"},{\"attributes\":{},\"id\":\"1059\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"1072\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"1058\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"1005\",\"type\":\"Range1d\"},{\"attributes\":{\"source\":{\"id\":\"1047\"}},\"id\":\"1051\",\"type\":\"CDSView\"},{\"attributes\":{\"line_color\":\"tomato\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1034\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"1071\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"end\":10.0},\"id\":\"1003\",\"type\":\"Range1d\"},{\"attributes\":{\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[200]},\"y\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[200]}},\"selected\":{\"id\":\"1072\"},\"selection_policy\":{\"id\":\"1071\"}},\"id\":\"1047\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"data_source\":{\"id\":\"1047\"},\"glyph\":{\"id\":\"1048\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"1049\"},\"selection_glyph\":null,\"view\":{\"id\":\"1051\"}},\"id\":\"1050\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1043\",\"type\":\"BasicTickFormatter\"}],\"root_ids\":[\"1002\"]},\"title\":\"Bokeh Application\",\"version\":\"2.0.1\"}};\n", " var render_items = [{\"docid\":\"92dd239e-da46-4176-9cad-7d9b764c9d91\",\"root_ids\":[\"1002\"],\"roots\":{\"1002\":\"be43adab-dd15-4abb-815d-bc02e1ec7734\"}}];\n", " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", "\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " var attempts = 0;\n", " var timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined) {\n", " 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": "1002" } }, "output_type": "display_data" } ], "source": [ "# Build theoretical curves\n", "R = np.linspace(0, 10, 200)\n", "b0 = 1\n", "Kd = 1\n", "beta = b0 / (1 + R / Kd)\n", "init_slope = -R + 1\n", "\n", "# Build plot\n", "p = bokeh.plotting.figure(\n", " height=275,\n", " width=400,\n", " x_axis_label=\"R\",\n", " y_axis_label=\"β(R)\",\n", " x_range=[R[0], R[-1]],\n", " y_range=[0, 1],\n", ")\n", "p.line(R, beta, line_width=2, color=\"tomato\", legend_label=\"β(R)\")\n", "p.line(\n", " R, init_slope, line_width=2, color=\"orange\", legend_label=\"initial slope\"\n", ")\n", "p.legend.click_policy = \"hide\"\n", "p.title.text = \"Kd = 1, β₀ = 1\"\n", "\n", "bokeh.io.show(p)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Gene expression can be \"leaky\"\n", "\n", "As an aside, we note that in real life, many genes never get repressed all the way to zero expression, even when you add a lot of repressor. Instead, there is a baseline, or \"basal\", expression level that still occurs. A simple way to model this is by adding an additional constant term, $\\alpha_0$ to the expression \n", "\n", "\\begin{align}\n", "\\beta(R) = \\alpha_0 + \\beta_0 \\frac{D}{D_\\mathrm{tot}} = \\alpha_0 + \\frac{\\beta_0}{1+R/K_\\mathrm{d}}.\n", "\\end{align}\n", "\n", "Given the ubiquitousness of leakiness, it is important to check that circuit behaviors do not depend on the absence of leaky expression." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "tags": [ "hide_input" ] }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function embed_document(root) {\n", " \n", " var docs_json = {\"0ee939a8-c934-4b85-8474-ae3bee06151f\":{\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"1149\"}],\"center\":[{\"id\":\"1152\"},{\"id\":\"1156\"},{\"id\":\"1183\"}],\"left\":[{\"id\":\"1153\"}],\"plot_height\":275,\"plot_width\":400,\"renderers\":[{\"id\":\"1174\"},{\"id\":\"1188\"}],\"title\":{\"id\":\"1176\"},\"toolbar\":{\"id\":\"1164\"},\"x_range\":{\"id\":\"1141\"},\"x_scale\":{\"id\":\"1145\"},\"y_range\":{\"id\":\"1143\"},\"y_scale\":{\"id\":\"1147\"}},\"id\":\"1140\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{\"label\":{\"value\":\"basal expression\"},\"renderers\":[{\"id\":\"1188\"}]},\"id\":\"1199\",\"type\":\"LegendItem\"},{\"attributes\":{\"data\":{\"x\":[0.0,20.0],\"y\":[0.25,0.25]},\"selected\":{\"id\":\"1221\"},\"selection_policy\":{\"id\":\"1220\"}},\"id\":\"1185\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"data_source\":{\"id\":\"1171\"},\"glyph\":{\"id\":\"1172\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"1173\"},\"selection_glyph\":null,\"view\":{\"id\":\"1175\"}},\"id\":\"1174\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1147\",\"type\":\"LinearScale\"},{\"attributes\":{\"end\":20.0},\"id\":\"1141\",\"type\":\"Range1d\"},{\"attributes\":{},\"id\":\"1154\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"1220\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"1221\",\"type\":\"Selection\"},{\"attributes\":{\"axis\":{\"id\":\"1153\"},\"dimension\":1,\"ticker\":null},\"id\":\"1156\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1197\",\"type\":\"Selection\"},{\"attributes\":{\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[200]},\"y\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[200]}},\"selected\":{\"id\":\"1197\"},\"selection_policy\":{\"id\":\"1196\"}},\"id\":\"1171\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"1196\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"items\":[{\"id\":\"1184\"},{\"id\":\"1199\"}]},\"id\":\"1183\",\"type\":\"Legend\"},{\"attributes\":{},\"id\":\"1181\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"label\":{\"value\":\"\\u03b2(R)\"},\"renderers\":[{\"id\":\"1174\"}]},\"id\":\"1184\",\"type\":\"LegendItem\"},{\"attributes\":{\"bottom_units\":\"screen\",\"fill_alpha\":0.5,\"fill_color\":\"lightgrey\",\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":1.0,\"line_color\":\"black\",\"line_dash\":[4,4],\"line_width\":2,\"render_mode\":\"css\",\"right_units\":\"screen\",\"top_units\":\"screen\"},\"id\":\"1163\",\"type\":\"BoxAnnotation\"},{\"attributes\":{\"active_drag\":\"auto\",\"active_inspect\":\"auto\",\"active_multi\":null,\"active_scroll\":\"auto\",\"active_tap\":\"auto\",\"tools\":[{\"id\":\"1157\"},{\"id\":\"1158\"},{\"id\":\"1159\"},{\"id\":\"1160\"},{\"id\":\"1161\"},{\"id\":\"1162\"}]},\"id\":\"1164\",\"type\":\"Toolbar\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"orange\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1187\",\"type\":\"Line\"},{\"attributes\":{\"axis_label\":\"\\u03b2(R)\",\"formatter\":{\"id\":\"1179\"},\"ticker\":{\"id\":\"1154\"}},\"id\":\"1153\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1157\",\"type\":\"PanTool\"},{\"attributes\":{\"data_source\":{\"id\":\"1185\"},\"glyph\":{\"id\":\"1186\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"1187\"},\"selection_glyph\":null,\"view\":{\"id\":\"1189\"}},\"id\":\"1188\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"source\":{\"id\":\"1185\"}},\"id\":\"1189\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"1158\",\"type\":\"WheelZoomTool\"},{\"attributes\":{\"line_color\":\"tomato\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1172\",\"type\":\"Line\"},{\"attributes\":{\"axis\":{\"id\":\"1149\"},\"ticker\":null},\"id\":\"1152\",\"type\":\"Grid\"},{\"attributes\":{\"overlay\":{\"id\":\"1163\"}},\"id\":\"1159\",\"type\":\"BoxZoomTool\"},{\"attributes\":{},\"id\":\"1179\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1160\",\"type\":\"SaveTool\"},{\"attributes\":{},\"id\":\"1161\",\"type\":\"ResetTool\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"tomato\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1173\",\"type\":\"Line\"},{\"attributes\":{\"end\":1.25},\"id\":\"1143\",\"type\":\"Range1d\"},{\"attributes\":{\"source\":{\"id\":\"1171\"}},\"id\":\"1175\",\"type\":\"CDSView\"},{\"attributes\":{\"text\":\"Kd = 1, \\u03b2\\u2080 = 1, a\\u2080 = 0.25\"},\"id\":\"1176\",\"type\":\"Title\"},{\"attributes\":{},\"id\":\"1162\",\"type\":\"HelpTool\"},{\"attributes\":{\"line_color\":\"orange\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1186\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"1145\",\"type\":\"LinearScale\"},{\"attributes\":{\"axis_label\":\"R\",\"formatter\":{\"id\":\"1181\"},\"ticker\":{\"id\":\"1150\"}},\"id\":\"1149\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1150\",\"type\":\"BasicTicker\"}],\"root_ids\":[\"1140\"]},\"title\":\"Bokeh Application\",\"version\":\"2.0.1\"}};\n", " var render_items = [{\"docid\":\"0ee939a8-c934-4b85-8474-ae3bee06151f\",\"root_ids\":[\"1140\"],\"roots\":{\"1140\":\"93948324-cc02-4d89-917c-dc7303641d7c\"}}];\n", " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", "\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " var attempts = 0;\n", " var timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined) {\n", " 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": "1140" } }, "output_type": "display_data" } ], "source": [ "# Build the theoretical curves\n", "R = np.linspace(0, 20, 200)\n", "b0 = 1\n", "Kd = 1\n", "a0 = 0.25\n", "beta = a0 + b0 / (1 + R / Kd)\n", "\n", "# Build plot\n", "p = bokeh.plotting.figure(\n", " height=275,\n", " width=400,\n", " x_axis_label=\"R\",\n", " y_axis_label=\"β(R)\",\n", " x_range=[R[0], R[-1]],\n", " y_range=[0, beta.max()],\n", ")\n", "p.line(R, beta, line_width=2, color=\"tomato\", legend_label=\"β(R)\")\n", "p.line(\n", " [R[0], R[-1]],\n", " [a0, a0],\n", " line_width=2,\n", " color=\"orange\",\n", " legend_label=\"basal expression\",\n", ")\n", "p.title.text = \"Kd = 1, β₀ = 1, a₀ = 0.25\"\n", "\n", "bokeh.io.show(p)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Activation\n", "\n", "Genes can be regulated by activators as well as repressors. Treating the case of activation just involves switching the state that is actively expressing from the unbound one to the one bound by the protein (now called an Activator). And, just as the binding of a repressor to DNA can be modulated by small molecule inputs, so too can the binding of the activator be modulated by binding to small molecules. In bacteria, one of many examples is the [arabinose regulation system](https://en.wikipedia.org/wiki/L-arabinose_operon).\n", "\n", "
\n", "\n", "![activation](figs/activation.png)\n", "\n", "
\n", "\n", "
\n", "\n", "\\begin{align}\n", "\\beta(A) = \\beta_0 \\frac{D_\\mathrm{occ}}{D_\\mathrm{tot}} = \\frac{\\beta_0 A/K_\\mathrm{d}}{1+A/K_\\mathrm{d}}.\n", "\\end{align}\n", "\n", "This produces the opposite, mirror image response compared to repression, shown below with no leakage." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "tags": [ "hide_input" ] }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", "\n", "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function embed_document(root) {\n", " \n", " var docs_json = {\"1bc97c77-6cd4-466c-86a2-3e0eba72dcf1\":{\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"1298\"}],\"center\":[{\"id\":\"1301\"},{\"id\":\"1305\"},{\"id\":\"1332\"}],\"left\":[{\"id\":\"1302\"}],\"plot_height\":275,\"plot_width\":400,\"renderers\":[{\"id\":\"1323\"},{\"id\":\"1337\"}],\"title\":{\"id\":\"1325\"},\"toolbar\":{\"id\":\"1313\"},\"x_range\":{\"id\":\"1290\"},\"x_scale\":{\"id\":\"1294\"},\"y_range\":{\"id\":\"1292\"},\"y_scale\":{\"id\":\"1296\"}},\"id\":\"1289\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{},\"id\":\"1310\",\"type\":\"ResetTool\"},{\"attributes\":{\"items\":[{\"id\":\"1333\"},{\"id\":\"1348\"}],\"location\":\"center_right\"},\"id\":\"1332\",\"type\":\"Legend\"},{\"attributes\":{},\"id\":\"1292\",\"type\":\"Range1d\"},{\"attributes\":{},\"id\":\"1328\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1311\",\"type\":\"HelpTool\"},{\"attributes\":{},\"id\":\"1294\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1296\",\"type\":\"LinearScale\"},{\"attributes\":{\"text\":\"\"},\"id\":\"1325\",\"type\":\"Title\"},{\"attributes\":{},\"id\":\"1380\",\"type\":\"Selection\"},{\"attributes\":{\"axis_label\":\"A/Kd, R/Kd\",\"formatter\":{\"id\":\"1330\"},\"ticker\":{\"id\":\"1299\"}},\"id\":\"1298\",\"type\":\"LinearAxis\"},{\"attributes\":{\"axis\":{\"id\":\"1302\"},\"dimension\":1,\"ticker\":null},\"id\":\"1305\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1299\",\"type\":\"BasicTicker\"},{\"attributes\":{\"axis\":{\"id\":\"1298\"},\"ticker\":null},\"id\":\"1301\",\"type\":\"Grid\"},{\"attributes\":{\"label\":{\"value\":\"\\u03b2(R)\"},\"renderers\":[{\"id\":\"1337\"}]},\"id\":\"1348\",\"type\":\"LegendItem\"},{\"attributes\":{},\"id\":\"1303\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"1346\",\"type\":\"Selection\"},{\"attributes\":{\"data_source\":{\"id\":\"1320\"},\"glyph\":{\"id\":\"1321\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"1322\"},\"selection_glyph\":null,\"view\":{\"id\":\"1324\"}},\"id\":\"1323\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"axis_label\":\"\\u03b2/\\u03b2\\u2080\",\"formatter\":{\"id\":\"1328\"},\"ticker\":{\"id\":\"1303\"}},\"id\":\"1302\",\"type\":\"LinearAxis\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"tomato\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1336\",\"type\":\"Line\"},{\"attributes\":{\"source\":{\"id\":\"1334\"}},\"id\":\"1338\",\"type\":\"CDSView\"},{\"attributes\":{\"data_source\":{\"id\":\"1334\"},\"glyph\":{\"id\":\"1335\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"1336\"},\"selection_glyph\":null,\"view\":{\"id\":\"1338\"}},\"id\":\"1337\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1345\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[200]},\"y\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[200]}},\"selected\":{\"id\":\"1380\"},\"selection_policy\":{\"id\":\"1379\"}},\"id\":\"1334\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"end\":20.0},\"id\":\"1290\",\"type\":\"Range1d\"},{\"attributes\":{\"bottom_units\":\"screen\",\"fill_alpha\":0.5,\"fill_color\":\"lightgrey\",\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":1.0,\"line_color\":\"black\",\"line_dash\":[4,4],\"line_width\":2,\"render_mode\":\"css\",\"right_units\":\"screen\",\"top_units\":\"screen\"},\"id\":\"1312\",\"type\":\"BoxAnnotation\"},{\"attributes\":{\"active_drag\":\"auto\",\"active_inspect\":\"auto\",\"active_multi\":null,\"active_scroll\":\"auto\",\"active_tap\":\"auto\",\"tools\":[{\"id\":\"1306\"},{\"id\":\"1307\"},{\"id\":\"1308\"},{\"id\":\"1309\"},{\"id\":\"1310\"},{\"id\":\"1311\"}]},\"id\":\"1313\",\"type\":\"Toolbar\"},{\"attributes\":{},\"id\":\"1330\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[200]},\"y\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[200]}},\"selected\":{\"id\":\"1346\"},\"selection_policy\":{\"id\":\"1345\"}},\"id\":\"1320\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"1306\",\"type\":\"PanTool\"},{\"attributes\":{\"source\":{\"id\":\"1320\"}},\"id\":\"1324\",\"type\":\"CDSView\"},{\"attributes\":{\"line_color\":\"#1f77b4\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1321\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"1307\",\"type\":\"WheelZoomTool\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"#1f77b4\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1322\",\"type\":\"Line\"},{\"attributes\":{\"overlay\":{\"id\":\"1312\"}},\"id\":\"1308\",\"type\":\"BoxZoomTool\"},{\"attributes\":{},\"id\":\"1379\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"label\":{\"value\":\"\\u03b2(A)\"},\"renderers\":[{\"id\":\"1323\"}]},\"id\":\"1333\",\"type\":\"LegendItem\"},{\"attributes\":{},\"id\":\"1309\",\"type\":\"SaveTool\"},{\"attributes\":{\"line_color\":\"tomato\",\"line_width\":2,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1335\",\"type\":\"Line\"}],\"root_ids\":[\"1289\"]},\"title\":\"Bokeh Application\",\"version\":\"2.0.1\"}};\n", " var render_items = [{\"docid\":\"1bc97c77-6cd4-466c-86a2-3e0eba72dcf1\",\"root_ids\":[\"1289\"],\"roots\":{\"1289\":\"0597a784-23b5-40ac-889c-8df5b13e1125\"}}];\n", " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", "\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " var attempts = 0;\n", " var timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined) {\n", " 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": "1289" } }, "output_type": "display_data" } ], "source": [ "A = np.linspace(0, 20, 200)\n", "beta_A = A / (1 + A)\n", "beta_R = 1 / (1 + R)\n", "\n", "# Build plot\n", "p = bokeh.plotting.figure(\n", " height=275,\n", " width=400,\n", " x_axis_label=\"A/Kd, R/Kd\",\n", " y_axis_label=\"β/β₀\",\n", " x_range=[R[0], R[-1]],\n", " y_range=[0, 1],\n", ")\n", "\n", "p.line(A, beta_A, line_width=2, legend_label=\"β(A)\")\n", "p.line(R, beta_R, line_width=2, color=\"tomato\", legend_label=\"β(R)\")\n", "p.legend.location = \"center_right\"\n", "bokeh.io.show(p)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Activator vs. Repressor–which to choose?\n", "\n", "*And now at last we have reached our first true 'design' question:* The cell has at least two different ways to regulate a gene: using an activator or using a repressor. Which should it choose? Which would you choose if you were designing a synthetic circuit? Why? Are they completely equivalent ways to regulate a target gene? Is one better in some or all conditions? How could we know? \n", "\n", "These questions were posed in a [study by Michael Savageau (PNAS, 1974)](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC388476/), who tried to explain the naturally observed usage of activation and repression in bacteria. A different explanation was later developed by [Shinar et al (PNAS 2004)](https://doi.org/10.1073/pnas.0506610103). We end the lecture with this question - try to think about when and why you would use each type of regulation! \n" ] }, { "cell_type": "markdown", "metadata": { "tags": [ "remove_cell" ] }, "source": [ "
\n", "\n", "## Computing environment\n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "tags": [ "hide_input" ] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPython 3.7.7\n", "IPython 7.13.0\n", "\n", "numpy 1.18.1\n", "bokeh 2.0.1\n", "jupyterlab 1.2.6\n" ] } ], "source": [ "%load_ext watermark\n", "%watermark -v -p numpy,bokeh,jupyterlab" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" }, "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()) " } }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "window_display": false } }, "nbformat": 4, "nbformat_minor": 4 }