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

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

\\n\"+\n", " \"\\n\"+\n", " \"\\n\"+\n", " \"from bokeh.resources import INLINE\\n\"+\n", " \"output_notebook(resources=INLINE)\\n\"+\n", " \"\\n\"+\n", " \"
\"}};\n", "\n", " function display_loaded() {\n", " var el = document.getElementById(\"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) { callback() });\n", " }\n", " finally {\n", " delete root._bokeh_onload_callbacks\n", " }\n", " console.info(\"Bokeh: all callbacks have finished\");\n", " }\n", "\n", " function load_libs(js_urls, callback) {\n", " root._bokeh_onload_callbacks.push(callback);\n", " if (root._bokeh_is_loading > 0) {\n", " console.log(\"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.log(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n", " root._bokeh_is_loading = js_urls.length;\n", " for (var i = 0; i < js_urls.length; i++) {\n", " var url = js_urls[i];\n", " var s = document.createElement('script');\n", " s.src = url;\n", " s.async = false;\n", " s.onreadystatechange = s.onload = function() {\n", " root._bokeh_is_loading--;\n", " if (root._bokeh_is_loading === 0) {\n", " console.log(\"Bokeh: all BokehJS libraries loaded\");\n", " run_callbacks()\n", " }\n", " };\n", " s.onerror = function() {\n", " console.warn(\"failed to load library \" + url);\n", " };\n", " console.log(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", " document.getElementsByTagName(\"head\")[0].appendChild(s);\n", " }\n", " };var element = document.getElementById(\"1001\");\n", " if (element == null) {\n", " console.log(\"Bokeh: ERROR: autoload.js configured with elementid '1001' but no matching script tag was found. \")\n", " return false;\n", " }\n", "\n", " var js_urls = [\"https://cdn.pydata.org/bokeh/release/bokeh-1.0.1.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.0.1.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-tables-1.0.1.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-gl-1.0.1.min.js\"];\n", "\n", " var inline_js = [\n", " function(Bokeh) {\n", " Bokeh.set_log_level(\"info\");\n", " },\n", " \n", " function(Bokeh) {\n", " \n", " },\n", " function(Bokeh) {\n", " console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-1.0.1.min.css\");\n", " Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-1.0.1.min.css\");\n", " console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.0.1.min.css\");\n", " Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.0.1.min.css\");\n", " console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-tables-1.0.1.min.css\");\n", " Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-tables-1.0.1.min.css\");\n", " }\n", " ];\n", "\n", " function run_inline_js() {\n", " \n", " if ((root.Bokeh !== undefined) || (force === true)) {\n", " for (var i = 0; i < inline_js.length; i++) {\n", " inline_js[i].call(root, root.Bokeh);\n", " }if (force === true) {\n", " display_loaded();\n", " }} else if (Date.now() < root._bokeh_timeout) {\n", " setTimeout(run_inline_js, 100);\n", " } else if (!root._bokeh_failed_load) {\n", " console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n", " root._bokeh_failed_load = true;\n", " } else if (force !== true) {\n", " var cell = $(document.getElementById(\"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.log(\"Bokeh: BokehJS loaded, going straight to plotting\");\n", " run_inline_js();\n", " } else {\n", " load_libs(js_urls, function() {\n", " console.log(\"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) { callback() });\n }\n finally {\n delete root._bokeh_onload_callbacks\n }\n console.info(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(js_urls, callback) {\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.log(\"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.log(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = js_urls.length;\n for (var i = 0; i < js_urls.length; i++) {\n var url = js_urls[i];\n var s = document.createElement('script');\n s.src = url;\n s.async = false;\n s.onreadystatechange = s.onload = function() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.log(\"Bokeh: all BokehJS libraries loaded\");\n run_callbacks()\n }\n };\n s.onerror = function() {\n console.warn(\"failed to load library \" + url);\n };\n console.log(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.getElementsByTagName(\"head\")[0].appendChild(s);\n }\n };var element = document.getElementById(\"1001\");\n if (element == null) {\n console.log(\"Bokeh: ERROR: autoload.js configured with elementid '1001' but no matching script tag was found. \")\n return false;\n }\n\n var js_urls = [\"https://cdn.pydata.org/bokeh/release/bokeh-1.0.1.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.0.1.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-tables-1.0.1.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-gl-1.0.1.min.js\"];\n\n var inline_js = [\n function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\n \n function(Bokeh) {\n \n },\n function(Bokeh) {\n console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-1.0.1.min.css\");\n Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-1.0.1.min.css\");\n console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.0.1.min.css\");\n Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.0.1.min.css\");\n console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-tables-1.0.1.min.css\");\n Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-tables-1.0.1.min.css\");\n }\n ];\n\n function run_inline_js() {\n \n if ((root.Bokeh !== undefined) || (force === true)) {\n for (var i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }if (force === true) {\n display_loaded();\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n } else if (force !== true) {\n var cell = $(document.getElementById(\"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.log(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(js_urls, function() {\n console.log(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));" }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Our numerical workhorses\n", "import numpy as np\n", "import scipy.integrate\n", "import scipy.optimize\n", "\n", "# Import plotting tools\n", "import bokeh.plotting\n", "import bokeh.io\n", "bokeh.io.output_notebook()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The balance point model\n", "\n", "The balance point model gives the rate of growth of a flagellum (in dimensionless form) as\n", "\n", "\\begin{align}\n", "\\frac{\\mathrm{d}\\ell}{\\mathrm{d}t} = \\frac{1}{\\ell} - 1.\n", "\\end{align}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Numerical integration of the balance point model\n", "We can solve this numerically using the `scipy.integrate.odeint()` function. It uses the Hindmarsh algorithm, intelligently dealing with potential stiffness in the equations.\n", "\n", "You can look at the documentation for `scipy.integrate.odeint()` [here](https://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.odeint.html). The typical function call to `scipy.integrate.odeint()` is of the form\n", "\n", " scipy.integrate.odeint(f, y0, t, args=()).\n", "\n", "`scipy.integrate.odeint()` solves the system of ODEs\n", "\n", "\\begin{align}\n", "\\frac{\\mathrm{d}\\mathbf{y}}{\\mathrm{d}t} =f(\\mathbf{y}, t),\n", "\\end{align}\n", " \n", "where $\\mathbf{y}$ is a vector and $f(\\mathbf{y},t)$ is vector-valued. Thus, `scipy.integrate.odeint()` takes as its first argument a function that returns an array containing the right hand side of the system of ODEs you are computing. When you define this function, it must be of the form\n", "\n", " f(y, t, *args)\n", "\n", "where the `*args` indicates the parameters on which the function depends. The second argument to `scipy.integrate.odeint()` is the initial condition, again stored as an array. The third argument is an array of time points for which you want the solution to the ODEs. Finally, `args` is a tuple containing the other parameters to be passed into the function `f`.\n", "\n", "In the present case, we have only a single ODE. We just have to code up the right hand side and solve!" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "def balance_point_rhs(ell, t):\n", " \"\"\"\n", " Right hand side of balance equation. I use `ell` for length because\n", " `l` looks like a one.\n", " \"\"\"\n", " return 1 / ell - 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now that we have defined that function, we specify the initial condition. In our case, we will watch how the flagellum grows from a small nub of length 0.1. (Remember, $\\ell = 0$ is unphysical under this model.)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "ell0 = np.array([0.1])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finally, we specify the dimensionless time points we want for our solution." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "t = np.linspace(0, 4, 200)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, we call `scipy.integrate.odeint()` to do the solution." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "ell = scipy.integrate.odeint(balance_point_rhs, ell0, t).flatten()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Done! That's it. Now, we just have to plot the solution." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "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 = {\"3c38ba3f-ab9f-461a-9b07-c9a4963b9eb6\":{\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"1011\",\"type\":\"LinearAxis\"}],\"left\":[{\"id\":\"1016\",\"type\":\"LinearAxis\"}],\"plot_height\":350,\"plot_width\":650,\"renderers\":[{\"id\":\"1011\",\"type\":\"LinearAxis\"},{\"id\":\"1015\",\"type\":\"Grid\"},{\"id\":\"1016\",\"type\":\"LinearAxis\"},{\"id\":\"1020\",\"type\":\"Grid\"},{\"id\":\"1029\",\"type\":\"BoxAnnotation\"},{\"id\":\"1039\",\"type\":\"GlyphRenderer\"}],\"title\":{\"id\":\"1041\",\"type\":\"Title\"},\"toolbar\":{\"id\":\"1027\",\"type\":\"Toolbar\"},\"x_range\":{\"id\":\"1003\",\"type\":\"DataRange1d\"},\"x_scale\":{\"id\":\"1007\",\"type\":\"LinearScale\"},\"y_range\":{\"id\":\"1005\",\"type\":\"Range1d\"},\"y_scale\":{\"id\":\"1009\",\"type\":\"LinearScale\"}},\"id\":\"1002\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[200]},\"y\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[200]}},\"selected\":{\"id\":\"1048\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"1047\",\"type\":\"UnionRenderers\"}},\"id\":\"1036\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"1024\",\"type\":\"SaveTool\"},{\"attributes\":{},\"id\":\"1025\",\"type\":\"ResetTool\"},{\"attributes\":{\"callback\":null},\"id\":\"1003\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"1026\",\"type\":\"HelpTool\"},{\"attributes\":{\"callback\":null},\"id\":\"1005\",\"type\":\"Range1d\"},{\"attributes\":{\"active_drag\":\"auto\",\"active_inspect\":\"auto\",\"active_multi\":null,\"active_scroll\":\"auto\",\"active_tap\":\"auto\",\"tools\":[{\"id\":\"1021\",\"type\":\"PanTool\"},{\"id\":\"1022\",\"type\":\"WheelZoomTool\"},{\"id\":\"1023\",\"type\":\"BoxZoomTool\"},{\"id\":\"1024\",\"type\":\"SaveTool\"},{\"id\":\"1025\",\"type\":\"ResetTool\"},{\"id\":\"1026\",\"type\":\"HelpTool\"}]},\"id\":\"1027\",\"type\":\"Toolbar\"},{\"attributes\":{},\"id\":\"1007\",\"type\":\"LinearScale\"},{\"attributes\":{\"line_color\":\"#1f77b4\",\"line_width\":3,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1037\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"1009\",\"type\":\"LinearScale\"},{\"attributes\":{\"bottom_units\":\"screen\",\"fill_alpha\":{\"value\":0.5},\"fill_color\":{\"value\":\"lightgrey\"},\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":{\"value\":1.0},\"line_color\":{\"value\":\"black\"},\"line_dash\":[4,4],\"line_width\":{\"value\":2},\"plot\":null,\"render_mode\":\"css\",\"right_units\":\"screen\",\"top_units\":\"screen\"},\"id\":\"1029\",\"type\":\"BoxAnnotation\"},{\"attributes\":{\"axis_label\":\"dimensionless time\",\"formatter\":{\"id\":\"1043\",\"type\":\"BasicTickFormatter\"},\"plot\":{\"id\":\"1002\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"1012\",\"type\":\"BasicTicker\"}},\"id\":\"1011\",\"type\":\"LinearAxis\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"#1f77b4\",\"line_width\":3,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1038\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"1012\",\"type\":\"BasicTicker\"},{\"attributes\":{\"data_source\":{\"id\":\"1036\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"1037\",\"type\":\"Line\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"1038\",\"type\":\"Line\"},\"selection_glyph\":null,\"view\":{\"id\":\"1040\",\"type\":\"CDSView\"}},\"id\":\"1039\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"plot\":{\"id\":\"1002\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"1012\",\"type\":\"BasicTicker\"}},\"id\":\"1015\",\"type\":\"Grid\"},{\"attributes\":{\"source\":{\"id\":\"1036\",\"type\":\"ColumnDataSource\"}},\"id\":\"1040\",\"type\":\"CDSView\"},{\"attributes\":{\"axis_label\":\"dimensionless flag. length\",\"formatter\":{\"id\":\"1045\",\"type\":\"BasicTickFormatter\"},\"plot\":{\"id\":\"1002\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"1017\",\"type\":\"BasicTicker\"}},\"id\":\"1016\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1017\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"1043\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"dimension\":1,\"plot\":{\"id\":\"1002\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"1017\",\"type\":\"BasicTicker\"}},\"id\":\"1020\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1045\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1047\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"1048\",\"type\":\"Selection\"},{\"attributes\":{\"plot\":null,\"text\":\"\"},\"id\":\"1041\",\"type\":\"Title\"},{\"attributes\":{},\"id\":\"1021\",\"type\":\"PanTool\"},{\"attributes\":{},\"id\":\"1022\",\"type\":\"WheelZoomTool\"},{\"attributes\":{\"overlay\":{\"id\":\"1029\",\"type\":\"BoxAnnotation\"}},\"id\":\"1023\",\"type\":\"BoxZoomTool\"}],\"root_ids\":[\"1002\"]},\"title\":\"Bokeh Application\",\"version\":\"1.0.1\"}};\n", " var render_items = [{\"docid\":\"3c38ba3f-ab9f-461a-9b07-c9a4963b9eb6\",\"roots\":{\"1002\":\"4c5063d9-4623-47b5-8792-0a8a171d294f\"}}];\n", " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", "\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " var attempts = 0;\n", " var timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " clearInterval(timer);\n", " }\n", " attempts++;\n", " if (attempts > 100) {\n", " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", " clearInterval(timer);\n", " }\n", " }, 10, root)\n", " }\n", "})(window);" ], "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "1002" } }, "output_type": "display_data" } ], "source": [ "# Set up the figure\n", "p = bokeh.plotting.figure(plot_width=650,\n", " plot_height=350,\n", " y_range=[0,1],\n", " x_axis_label='dimensionless time',\n", " y_axis_label='dimensionless flag. length')\n", "\n", "# Specify the glyphs\n", "p.line(t, ell, line_width=3)\n", "\n", "# Render\n", "bokeh.io.show(p);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Shrinkage dynamics\n", "\n", "Interestingly, we can also watch a flagellum shrink. Let's start it at length $\\tilde{\\ell} = 2$." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "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 = {\"d60afea9-e9c6-45f1-a82f-f4ce955e1a35\":{\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"1113\",\"type\":\"LinearAxis\"}],\"left\":[{\"id\":\"1118\",\"type\":\"LinearAxis\"}],\"plot_height\":350,\"plot_width\":650,\"renderers\":[{\"id\":\"1113\",\"type\":\"LinearAxis\"},{\"id\":\"1117\",\"type\":\"Grid\"},{\"id\":\"1118\",\"type\":\"LinearAxis\"},{\"id\":\"1122\",\"type\":\"Grid\"},{\"id\":\"1131\",\"type\":\"BoxAnnotation\"},{\"id\":\"1141\",\"type\":\"GlyphRenderer\"},{\"id\":\"1146\",\"type\":\"GlyphRenderer\"}],\"title\":{\"id\":\"1157\",\"type\":\"Title\"},\"toolbar\":{\"id\":\"1129\",\"type\":\"Toolbar\"},\"x_range\":{\"id\":\"1105\",\"type\":\"DataRange1d\"},\"x_scale\":{\"id\":\"1109\",\"type\":\"LinearScale\"},\"y_range\":{\"id\":\"1107\",\"type\":\"Range1d\"},\"y_scale\":{\"id\":\"1111\",\"type\":\"LinearScale\"}},\"id\":\"1104\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{\"source\":{\"id\":\"1143\",\"type\":\"ColumnDataSource\"}},\"id\":\"1147\",\"type\":\"CDSView\"},{\"attributes\":{\"callback\":null},\"id\":\"1105\",\"type\":\"DataRange1d\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"#1f77b4\",\"line_width\":3,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1145\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"1123\",\"type\":\"PanTool\"},{\"attributes\":{\"line_color\":\"#1f77b4\",\"line_width\":3,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1139\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"1124\",\"type\":\"WheelZoomTool\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[200]},\"y\":{\"__ndarray__\":\"mpmZmZmZuT//aP16+MDKPzwkvQ4mbdE/Saur/tx61D8rCYi+7frWP3lh4eCzHdk/RJBSmSf92j+K5t6dI6ncPyKnTa4sLN4/m6NeJ6mN3z8RhvKyhGngPxLwoAA4AOE/VwVJAIyM4T9Y0hj5yg/iP4YS26ABi+I/9UJwBw7/4j/cSr4xqmzjPzPBsrxz1OM/pMG+k/E25D9Hk4xBmJTkP67F3ULN7eQ/NEMJj+lC5T+KG9avO5TlPzx3W18J4uU/6y+h15As5j9oFrjmCXTmP49YvtKmuOY/9swsEZX65j8i+zDq/TnnP6jgCfgGd+c/o1K0mtKx5z8IXMNVgOrnP3ayRiEtIeg/etbpsfNV6D/UGAO17IjoPye3LQUvuug/Mb+N2c/p6D+pSJnu4hfpP4IfiaV6ROk/wXcmKqhv6T+My0mKe5npP9ntyNADwuk//FEBGk/p6T8FgoWoag/qP14Ub/ZiNOo/Qa0mxUNY6j8gqAYsGHvqP6ElwKTqnOo/xzKnF8W96j/COpflsN3qP2/4VPK2/Oo/fNXrrN8a6z+eZxUYMzjrPwjoHs+4VOs/4cICEHhw6z/coSfBd4vrP1O683O+pes/C6ttbVK/6z9LsaCpOdjrP0XQvt558Os/ejLEgxgI7D+ta4vSGh/sP4V19cqFNew/5eDhN15L7D/ycqmwqGDsP4/5E5xpdew/A6QFNKWJ7D8Fma+GX53sP9ZIN3mcsOw/ci1vyl/D7D+uwuITrdXsP56AW8yH5+w/+h61SfP47D9+YXrB8gntP5z3eEqJGu0/QQKr37kq7T8Sm4VhhzrtP9b5bpX0Se0/wKSCJwRZ7T82rM+suGftPzwWDKQUdu0/6qibdRqE7T+ImtJ0zJHtPweIyuEsn+0/0S296T2s7T85s0GnAbntP49fRSN6xe0/iAx5VqnR7T+1zYIpkd3tPwW/WnUz6e0/7+kJBJL07T/h6sWRrv/tP11lD82KCu4/318XVygV7j86M1XEiB/uP//KaZ2tKe4/69IwX5gz7j+VRSN7Sj3uPwbd1lfFRu4/aUvSUQpQ7j9NOlW7GlnuP1iIvNz3Ye4/Q5Lb9KJq7j9Ywz45HXPuP2WMZddne+4/5iim9IOD7j8ROLitcovuP6oEXxc1k+4/zDOhPsya7j+Njj8pOaLuP0vafdZ8qe4/e41YPpiw7j/NHw9SjLfuP2bGWvxZvu4/IQmkIQLF7j86+MaghcvuP2UPq1Ll0e4/kL9oCiLY7j9mR4+VPN7uPx5aSbw15O4/MfXGQQ7q7j/6P2vkxu/uP+qsjV1g9e4/bE7LYdv67j/3XCahOADvPyzONMd4Be8/lYyBe5wK7z9bmkphpA/vPzFAtxeRFO8/bsf4OWMZ7z/5TWVfGx7vPyzPxxu6Iu8/3x5Q/z8n7z9lUJuWrSvvP+RD2moDMO8//E/nAUI07z8+03reaTjvP818UoB7PO8/wy74Y3dA7z8O//cCXkTvPx478tMvSO8/rHOrSu1L7z9YVRvYlk/vP0AomuosU+8/AOp57q9W7z9SxDdNIFrvPyXuyG1+Xe8/D/S5tMpg7z/XKTyEBWTvP9w8MjwvZ+8/YghAOkhq7z/nUznaUG3vP6B+ynVJcO8/eKx1ZDJz7z84tbv7C3bvP3syJ4/WeO8/PeVWcJJ77z8TcwfvP37vPysnT1nfgO8/KPum+3CD7z/0l6cg9YXvP4QlPBFsiO8/NaOrFNaK7z8FqaFwM43vP2yqNmmEj+8/aTYIQcmR7z9LHmw5ApTvP6AgJ5Ivlu8/c2iRiVGY7z8TLaJcaJrvP0Mg90Z0nO8/0XzbgnWe7z+kv1FJbKDvP/45QNJYou8/AKRKVDuk7z9TfdsEFKbvP1DvMhjjp+8/QQNtwaip7z90jYcyZavvP8HaZ5wYre8/NZn4LsOu7z/m6SMZZbDvPzzUw4j+se8/VH21qo+z7z+8bN6qGLXvP6iWMbSZtu8/jSu08BK47z+xg4+JhLnvP6KDJafuuu8/6gHlcFG87z9SamMNrb3vP/olYqIBv+8/3o/SVE/A7z+EtNlIlsHvP+Pc06HWwu8/duRXghDE7z+PWjoMRMXvPyTjwGBxxu8/c/inoJjH7z8U8cjrucjvPw==\",\"dtype\":\"float64\",\"shape\":[200]}},\"selected\":{\"id\":\"1164\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"1163\",\"type\":\"UnionRenderers\"}},\"id\":\"1138\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"1127\",\"type\":\"ResetTool\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[200]},\"y\":{\"__ndarray__\":\"AAAAAAAAAEAa+WZqtMz/P1+a3Bi8mf8/jMGDghdn/z+5zWYuxzT/P3s6gbDLAv8/GoyJgCXR/j8VGGMc1Z/+PwVuiAHbbv4/fwn5rDc+/j9PcBya6w3+P4oulUL33f0/vMVYH1uu/T+5xhqmF3/9P61U70stUP0/1/b/g5wh/T/k3VO/ZfP8P3rDwWyJxfw/PtsH+QeY/D/RisTO4Wr8PyCDUFYXPvw/WwFm9agR/D9NxLwPl+X7Pyba2Abiufs/6wdxOYqO+z+gxi0CkGP7P/+z87nzOPs/qywkt7UO+z8uUzNN1uT6P2B1HcpVu/o/7NU9ezSS+j+KFDOqcmn6P+s2AZ0QQfo/a3vZlA4Z+j9Xn7TQbPH5P4ZgGowryvk/K0/v/kqj+T8kZ1Rdy3z5P5eKgdesVvk/1aE+me8w+T/IwS7Kkwv5P/Cpt42Z5vg/ppnDAgHC+D90FZ9Dyp34P16s1mX1efg/A9cze4JW+D+TKOuScTP4P2yhY7bCEPg/8Vdu6nXu9z9gyUQvi8z3PxYLZ4ACq/c/5x4Y1NuJ9z82qOYbF2n3P2Tfe0S0SPc/lE16NbMo9z/HA3HREwn3P8WEq/bV6fY/x/Z6fvnK9j8t2to8fqz2P27jrgBkjvY/NAq4k6pw9j+z4ea6UVP2P9PLhDZZNvY/ObNuwcAZ9j8I4GQRiP31PzhdBteu4fU/RXH4vTTG9T+mUZttGav1PyTJ9YdckPU/g5P/qf119T9kRLRr/Fv1Px6TOmBYQvU/2N05FhEp9T8Xcw4YJhD1P4Xz1uqW9/Q/LksDD2Pf9D81tVgAisf0P4xxnTYLsPQ/++WWJeaY9D+rejA8GoL0P+7DC+Wma/Q/6puUhotV9D+58xaDxz/0Pw991jhaKvQ/XgZ9AkMV9D+C7mc3gQD0PySmCCsU7PM/+9ZjLfvX8z8HRTqLNcTzP0IuMo7CsPM/buMCfaGd8z8rnPma0YrzP5qOMSdSePM/w2z8XiJm8z+/EB19QVTzP9OW37muQvM/C+JAS2kx8z/AWhdlcCDzP7iJ+TjDD/M/QJWx9WD/8j9yQrHISO/yPxbAxN153/I/Dr4oX/PP8j9GArF1tMDyPzWr70i8sfI/Hc88/wmj8j/IdUi9nJTyP+kQJqdzhvI/OuEy4I148j//+ieL6mryP3r+PsqIXfI/9RtXv2dQ8j+6FgWMhkPyP8sSEFHkNvI/bKtxL4Aq8j9V01BIWR7yP4R9Bb1uEvI/bZg4r78G8j8i7wNBS/vxP7DTCJUQ8PE/N6ANzg7l8T9o26wPRdrxP8OlbX6yz/E/12jAP1bF8T/p+hh6L7vxP4xbCFU9sfE/pslS+X6n8T8staaQ853xP51fDUaalPE/lbYVRnKL8T+oksm+eoLxP1QMwd+yefE/rS012hlx8T8afxHhrmjxP/DA0yhxYPE/DbO8519Y8T8wU/pVelDxP6+Nn62/SPE/EeSwKi9B8T+fTjALyDnxP3ZYKI+JMvE/Rl2s+HIr8T/q1+SLgyTxP6G1Io+6HfE/wG/gShcX8T9jx8gJmRDxP/uzvBg/CvE/tYTYxggE8T8qgYpl9f3wPz4xl0gE+PA/BKn5xTTy8D9r+fg1huzwPznsKfP35vA/Ys9vWonh8D9xePzKOdzwP/h/T6YI1/A/HLU0UPXR8D9xy8Eu/8zwPxAnx6olyPA/GkyVL2jD8D8Dc3oqxr7wP86VEws/uvA/gYBIQ9K18D8cNEdHf7HwP/qbfo1FrfA/ppWYjiSp8D8hS3PFG6XwP+RiG68qofA/VIFyy1Cd8D9VxqqcjZnwP+EQ26bglfA/N2VNcEmS8D+3aXmBx47wP118/mRai/A/7WCdpwGI8D+yhzHYvITwPzJ7toeLgfA/C0NBSW1+8D/L/OKxYXvwPwiprFhoePA/pwSn1oB18D8B8cnGqnLwP8x788Xlb/A/z4becjFt8D9ZRVJujWrwPyuja1v5Z/A/KbHD3nRl8D/Seb+e/2LwP8BPjkOZYPA/lDIid0Fe8D/RByjl91vwP6qn/zq8WfA/rNK+J45X8D+MglZcbVXwP7kfPotZU/A/TxGDaFJR8D9v/capV0/wP3AxOAZpTfA/YPCJNoZL8D++p+z0rknwPw==\",\"dtype\":\"float64\",\"shape\":[200]}},\"selected\":{\"id\":\"1166\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"1165\",\"type\":\"UnionRenderers\"}},\"id\":\"1143\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"1111\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1159\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1109\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1161\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"#1f77b4\",\"line_width\":3,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1140\",\"type\":\"Line\"},{\"attributes\":{\"overlay\":{\"id\":\"1131\",\"type\":\"BoxAnnotation\"}},\"id\":\"1125\",\"type\":\"BoxZoomTool\"},{\"attributes\":{},\"id\":\"1163\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"callback\":null,\"end\":2},\"id\":\"1107\",\"type\":\"Range1d\"},{\"attributes\":{\"axis_label\":\"dimensionless time\",\"formatter\":{\"id\":\"1159\",\"type\":\"BasicTickFormatter\"},\"plot\":{\"id\":\"1104\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"1114\",\"type\":\"BasicTicker\"}},\"id\":\"1113\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1164\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"1165\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"1114\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"1126\",\"type\":\"SaveTool\"},{\"attributes\":{\"axis_label\":\"dimensionless flag. length\",\"formatter\":{\"id\":\"1161\",\"type\":\"BasicTickFormatter\"},\"plot\":{\"id\":\"1104\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"1119\",\"type\":\"BasicTicker\"}},\"id\":\"1118\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1166\",\"type\":\"Selection\"},{\"attributes\":{\"plot\":{\"id\":\"1104\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"1114\",\"type\":\"BasicTicker\"}},\"id\":\"1117\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1119\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"1128\",\"type\":\"HelpTool\"},{\"attributes\":{\"active_drag\":\"auto\",\"active_inspect\":\"auto\",\"active_multi\":null,\"active_scroll\":\"auto\",\"active_tap\":\"auto\",\"tools\":[{\"id\":\"1123\",\"type\":\"PanTool\"},{\"id\":\"1124\",\"type\":\"WheelZoomTool\"},{\"id\":\"1125\",\"type\":\"BoxZoomTool\"},{\"id\":\"1126\",\"type\":\"SaveTool\"},{\"id\":\"1127\",\"type\":\"ResetTool\"},{\"id\":\"1128\",\"type\":\"HelpTool\"}]},\"id\":\"1129\",\"type\":\"Toolbar\"},{\"attributes\":{\"dimension\":1,\"plot\":{\"id\":\"1104\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"1119\",\"type\":\"BasicTicker\"}},\"id\":\"1122\",\"type\":\"Grid\"},{\"attributes\":{\"bottom_units\":\"screen\",\"fill_alpha\":{\"value\":0.5},\"fill_color\":{\"value\":\"lightgrey\"},\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":{\"value\":1.0},\"line_color\":{\"value\":\"black\"},\"line_dash\":[4,4],\"line_width\":{\"value\":2},\"plot\":null,\"render_mode\":\"css\",\"right_units\":\"screen\",\"top_units\":\"screen\"},\"id\":\"1131\",\"type\":\"BoxAnnotation\"},{\"attributes\":{\"source\":{\"id\":\"1138\",\"type\":\"ColumnDataSource\"}},\"id\":\"1142\",\"type\":\"CDSView\"},{\"attributes\":{\"data_source\":{\"id\":\"1138\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"1139\",\"type\":\"Line\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"1140\",\"type\":\"Line\"},\"selection_glyph\":null,\"view\":{\"id\":\"1142\",\"type\":\"CDSView\"}},\"id\":\"1141\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"data_source\":{\"id\":\"1143\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"1144\",\"type\":\"Line\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"1145\",\"type\":\"Line\"},\"selection_glyph\":null,\"view\":{\"id\":\"1147\",\"type\":\"CDSView\"}},\"id\":\"1146\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"plot\":null,\"text\":\"\"},\"id\":\"1157\",\"type\":\"Title\"},{\"attributes\":{\"line_color\":\"orange\",\"line_width\":3,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1144\",\"type\":\"Line\"}],\"root_ids\":[\"1104\"]},\"title\":\"Bokeh Application\",\"version\":\"1.0.1\"}};\n", " var render_items = [{\"docid\":\"d60afea9-e9c6-45f1-a82f-f4ce955e1a35\",\"roots\":{\"1104\":\"f8df58fa-94a8-4cc6-9bdd-73ea62116d88\"}}];\n", " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", "\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " var attempts = 0;\n", " var timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " clearInterval(timer);\n", " }\n", " attempts++;\n", " if (attempts > 100) {\n", " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", " clearInterval(timer);\n", " }\n", " }, 10, root)\n", " }\n", "})(window);" ], "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "1104" } }, "output_type": "display_data" } ], "source": [ "# Initial condition for shrinkage\n", "ell0 = np.array([2])\n", "\n", "# Solve ODE\n", "t = np.linspace(0, 5, 200)\n", "ell_shrink = scipy.integrate.odeint(balance_point_rhs, ell0, t).flatten()\n", "\n", "# Plot both together\n", "p = bokeh.plotting.figure(plot_width=650,\n", " plot_height=350,\n", " y_range=[0,2],\n", " x_axis_label='dimensionless time',\n", " y_axis_label='dimensionless flag. length')\n", "\n", "# Populate glyphs\n", "p.line(t, ell, line_width=3)\n", "p.line(t, ell_shrink, line_width=3, color='orange')\n", "bokeh.io.show(p);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The model predicts that a flagellum will reach its steady state more rapidly by growth than by shrinkage." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Comparing the balance point model to experiment\n", "\n", "Wallace Marshall's lab has investigated flagellar growth extensively. In [Engel, Ludington, and Marshall, *J. Cell Biol.*, **187**, 81-89, 2009](https://doi.org/10.1083/jcb.200812084), they measured the growth of a flagellum after a pH shock (which eliminates the flagella). They did the repeatedly (2026 times) and averaged the length of the flagella as a function of time after pH shock. I digitized mean data from their paper." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "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 = {\"a005fb43-b92f-485a-a740-2d76c1def910\":{\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"1243\",\"type\":\"LinearAxis\"}],\"left\":[{\"id\":\"1248\",\"type\":\"LinearAxis\"}],\"plot_height\":350,\"plot_width\":650,\"renderers\":[{\"id\":\"1243\",\"type\":\"LinearAxis\"},{\"id\":\"1247\",\"type\":\"Grid\"},{\"id\":\"1248\",\"type\":\"LinearAxis\"},{\"id\":\"1252\",\"type\":\"Grid\"},{\"id\":\"1261\",\"type\":\"BoxAnnotation\"},{\"id\":\"1271\",\"type\":\"GlyphRenderer\"}],\"title\":{\"id\":\"1293\",\"type\":\"Title\"},\"toolbar\":{\"id\":\"1259\",\"type\":\"Toolbar\"},\"x_range\":{\"id\":\"1235\",\"type\":\"DataRange1d\"},\"x_scale\":{\"id\":\"1239\",\"type\":\"LinearScale\"},\"y_range\":{\"id\":\"1237\",\"type\":\"DataRange1d\"},\"y_scale\":{\"id\":\"1241\",\"type\":\"LinearScale\"}},\"id\":\"1234\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{\"dimension\":1,\"plot\":{\"id\":\"1234\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"1249\",\"type\":\"BasicTicker\"}},\"id\":\"1252\",\"type\":\"Grid\"},{\"attributes\":{\"plot\":{\"id\":\"1234\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"1244\",\"type\":\"BasicTicker\"}},\"id\":\"1247\",\"type\":\"Grid\"},{\"attributes\":{\"overlay\":{\"id\":\"1261\",\"type\":\"BoxAnnotation\"}},\"id\":\"1255\",\"type\":\"BoxZoomTool\"},{\"attributes\":{\"axis_label\":\"flag. length (\\u00b5m)\",\"formatter\":{\"id\":\"1297\",\"type\":\"BasicTickFormatter\"},\"plot\":{\"id\":\"1234\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"1249\",\"type\":\"BasicTicker\"}},\"id\":\"1248\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1254\",\"type\":\"WheelZoomTool\"},{\"attributes\":{\"plot\":null,\"text\":\"\"},\"id\":\"1293\",\"type\":\"Title\"},{\"attributes\":{},\"id\":\"1253\",\"type\":\"PanTool\"},{\"attributes\":{\"axis_label\":\"time (min)\",\"formatter\":{\"id\":\"1295\",\"type\":\"BasicTickFormatter\"},\"plot\":{\"id\":\"1234\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"1244\",\"type\":\"BasicTicker\"}},\"id\":\"1243\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1244\",\"type\":\"BasicTicker\"},{\"attributes\":{\"fill_color\":{\"value\":\"#1f77b4\"},\"line_color\":{\"value\":\"#1f77b4\"},\"size\":{\"units\":\"screen\",\"value\":7},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1269\",\"type\":\"Circle\"},{\"attributes\":{\"callback\":null},\"id\":\"1235\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"1241\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1257\",\"type\":\"ResetTool\"},{\"attributes\":{},\"id\":\"1295\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1256\",\"type\":\"SaveTool\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"#1f77b4\"},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"#1f77b4\"},\"size\":{\"units\":\"screen\",\"value\":7},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1270\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"1300\",\"type\":\"Selection\"},{\"attributes\":{\"bottom_units\":\"screen\",\"fill_alpha\":{\"value\":0.5},\"fill_color\":{\"value\":\"lightgrey\"},\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":{\"value\":1.0},\"line_color\":{\"value\":\"black\"},\"line_dash\":[4,4],\"line_width\":{\"value\":2},\"plot\":null,\"render_mode\":\"css\",\"right_units\":\"screen\",\"top_units\":\"screen\"},\"id\":\"1261\",\"type\":\"BoxAnnotation\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":{\"__ndarray__\":\"zpvU4TLgA0Cv+7dg49EcQMLCSZo/2ChA00wYSZIkMUDGc40Bnxw2QLqaArqrFDtASvkgNh7NP0AfEEt3lWJCQAoqcNOb3kRAUVl/EdU6R0C+LiaqdfZJQDjCYAZ8ckxAsVWbYoLuTkC1hUrQXaVQQFI+iI1H81FALxmFLGQhU0DsYqJaZ19UQKmsv4hqnVVAhYe8J4fLVkD/GveDjUdZQHmuMeCTw1tA+SA2Hs0fXkC2alNM0F1gQAN94DLgk2FAs+1yGfDJYkB9EBuP5g9kQA==\",\"dtype\":\"float64\",\"shape\":[26]},\"y\":{\"__ndarray__\":\"m3JDW+dCwD+bckNb50LAP5tyQ1vnQsA/VNahYOdCAEBnpYPUcX0OQNSLsX75QRZAANNYsa44GkD+dgIvbWMeQKywU4sMEyFAEHOL8UhlIkB4RjqHW80iQAwHQrKAnSNAEKAyQJosJECocbGalRIkQNpSzc2zuyRAdxgPxrriJEB2vTy2yDAlQHa9PLbIMCVA1kFWnt2lJUDcNRk86eYlQAgjctH7TiZAB8ifwQmdJkAGbc2xF+smQKSN4bkQxCZAOam79CdGJ0A6BI4EGvgmQA==\",\"dtype\":\"float64\",\"shape\":[26]}},\"selected\":{\"id\":\"1300\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"1299\",\"type\":\"UnionRenderers\"}},\"id\":\"1268\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"source\":{\"id\":\"1268\",\"type\":\"ColumnDataSource\"}},\"id\":\"1272\",\"type\":\"CDSView\"},{\"attributes\":{\"active_drag\":\"auto\",\"active_inspect\":\"auto\",\"active_multi\":null,\"active_scroll\":\"auto\",\"active_tap\":\"auto\",\"tools\":[{\"id\":\"1253\",\"type\":\"PanTool\"},{\"id\":\"1254\",\"type\":\"WheelZoomTool\"},{\"id\":\"1255\",\"type\":\"BoxZoomTool\"},{\"id\":\"1256\",\"type\":\"SaveTool\"},{\"id\":\"1257\",\"type\":\"ResetTool\"},{\"id\":\"1258\",\"type\":\"HelpTool\"}]},\"id\":\"1259\",\"type\":\"Toolbar\"},{\"attributes\":{},\"id\":\"1258\",\"type\":\"HelpTool\"},{\"attributes\":{},\"id\":\"1299\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"1297\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"callback\":null},\"id\":\"1237\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"1249\",\"type\":\"BasicTicker\"},{\"attributes\":{\"data_source\":{\"id\":\"1268\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"1269\",\"type\":\"Circle\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"1270\",\"type\":\"Circle\"},\"selection_glyph\":null,\"view\":{\"id\":\"1272\",\"type\":\"CDSView\"}},\"id\":\"1271\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1239\",\"type\":\"LinearScale\"}],\"root_ids\":[\"1234\"]},\"title\":\"Bokeh Application\",\"version\":\"1.0.1\"}};\n", " var render_items = [{\"docid\":\"a005fb43-b92f-485a-a740-2d76c1def910\",\"roots\":{\"1234\":\"43d930af-b6e5-4175-83e5-f2735b9af35f\"}}];\n", " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", "\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " var attempts = 0;\n", " var timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " clearInterval(timer);\n", " }\n", " attempts++;\n", " if (attempts > 100) {\n", " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", " clearInterval(timer);\n", " }\n", " }, 10, root)\n", " }\n", "})(window);" ], "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "1234" } }, "output_type": "display_data" } ], "source": [ "t_exp = np.array([ 2.48447205, 7.20496894, 12.42236025, 17.14285714,\n", " 22.11180124, 27.08074534, 31.80124224, 36.77018634,\n", " 41.73913043, 46.45962733, 51.92546584, 56.89440994,\n", " 61.86335404, 66.58385093, 71.80124224, 76.52173913,\n", " 81.49068323, 86.45962733, 91.18012422, 101.11801242,\n", " 111.05590062, 120.49689441, 130.93167702, 140.62111801,\n", " 150.31055901, 160.49689441])\n", "\n", "flag_len_exp = np.array([ 0.12704174, 0.12704174, 0.12704174, 2.03266788,\n", " 3.81125227, 5.56442831, 6.5553539 , 7.59709619,\n", " 8.53720508, 9.19782214, 9.40108893, 9.8076225 ,\n", " 10.08711434, 10.03629764, 10.36660617, 10.44283122,\n", " 10.59528131, 10.59528131, 10.82395644, 10.95099819,\n", " 11.15426497, 11.30671506, 11.45916515, 11.38294011,\n", " 11.63702359, 11.4845735 ])\n", "\n", "# Make plot of data and curve fit\n", "p = bokeh.plotting.figure(plot_width=650,\n", " plot_height=350,\n", " x_axis_label='time (min)',\n", " y_axis_label='flag. length (µm)')\n", "p.circle(t_exp, flag_len_exp, size=7)\n", "bokeh.io.show(p);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There is a lag after the pH shock, presumably for the cell to recover, and then growth begins. We will fit these data with the balance point model. We will take time zero to be the fourth data point, the first where we see a significant flagellum. The fit parameters are $\\alpha$, $\\beta$, and also $\\ell_0$, the initial length of the flagellum when the growth kicks in (since we do not know this exactly). To perform the curve fit, we need to first write a function that will return the theoretical flagellar length as a function of time for the given parameters." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "def flag_len_theor(t, alpha, beta, ell0):\n", " \"\"\"\n", " Compute theoretical flagellar length given parameters\n", " \"\"\"\n", " # Dimensionless ell0\n", " ell0_dimless = ell0 * alpha / beta\n", " \n", " # Dimenesionless time\n", " t_dimless = t * alpha**2 / beta\n", " \n", " # Solve dimensionless equations\n", " ell = scipy.integrate.odeint(balance_point_rhs, ell0_dimless, t_dimless)\n", " \n", " # Return with dimensional units\n", " return ell.flatten() * beta / alpha" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now that we have this function, we just provide an initial guess for the parameter values and use `scipy.optimize.curve_fit()` to get the optimal parameters. We will guess, based on eyeballing the curve, that $\\alpha = 0.5$ µm/s, $\\beta = 4.5$ µm$^2$/s, and $\\ell_0 = 2$ µm." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Best fit parameter values\n", " α: 0.23 µm/min\n", " β: 2.74 µm^2/min\n", "l_0: 1.74 µm\n", "\n" ] } ], "source": [ "# Perform the curve fit with initial guess p0\n", "p0 = (0.5, 4.5, 2)\n", "popt, _ = scipy.optimize.curve_fit(flag_len_theor,\n", " t_exp[3:] - t_exp[3], \n", " flag_len_exp[3:],\n", " p0=p0)\n", "\n", "# Print best-fit parameter values\n", "print(\"\"\"\n", "Best fit parameter values\n", " α: {0:.2f} µm/min\n", " β: {1:.2f} µm^2/min\n", "l_0: {2:.2f} µm\n", "\"\"\".format(*popt))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can qualitatively look at how well the model fits the data by plotting." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "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 = {\"01df7e39-3c8e-405f-9a79-5adf12fbe855\":{\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"1243\",\"type\":\"LinearAxis\"}],\"left\":[{\"id\":\"1248\",\"type\":\"LinearAxis\"}],\"plot_height\":350,\"plot_width\":650,\"renderers\":[{\"id\":\"1243\",\"type\":\"LinearAxis\"},{\"id\":\"1247\",\"type\":\"Grid\"},{\"id\":\"1248\",\"type\":\"LinearAxis\"},{\"id\":\"1252\",\"type\":\"Grid\"},{\"id\":\"1261\",\"type\":\"BoxAnnotation\"},{\"id\":\"1271\",\"type\":\"GlyphRenderer\"},{\"id\":\"1359\",\"type\":\"GlyphRenderer\"}],\"title\":{\"id\":\"1293\",\"type\":\"Title\"},\"toolbar\":{\"id\":\"1259\",\"type\":\"Toolbar\"},\"x_range\":{\"id\":\"1235\",\"type\":\"DataRange1d\"},\"x_scale\":{\"id\":\"1239\",\"type\":\"LinearScale\"},\"y_range\":{\"id\":\"1237\",\"type\":\"DataRange1d\"},\"y_scale\":{\"id\":\"1241\",\"type\":\"LinearScale\"}},\"id\":\"1234\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{\"dimension\":1,\"plot\":{\"id\":\"1234\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"1249\",\"type\":\"BasicTicker\"}},\"id\":\"1252\",\"type\":\"Grid\"},{\"attributes\":{\"plot\":{\"id\":\"1234\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"1244\",\"type\":\"BasicTicker\"}},\"id\":\"1247\",\"type\":\"Grid\"},{\"attributes\":{\"overlay\":{\"id\":\"1261\",\"type\":\"BoxAnnotation\"}},\"id\":\"1255\",\"type\":\"BoxZoomTool\"},{\"attributes\":{\"source\":{\"id\":\"1356\",\"type\":\"ColumnDataSource\"}},\"id\":\"1360\",\"type\":\"CDSView\"},{\"attributes\":{\"axis_label\":\"flag. length (\\u00b5m)\",\"formatter\":{\"id\":\"1297\",\"type\":\"BasicTickFormatter\"},\"plot\":{\"id\":\"1234\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"1249\",\"type\":\"BasicTicker\"}},\"id\":\"1248\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1254\",\"type\":\"WheelZoomTool\"},{\"attributes\":{\"plot\":null,\"text\":\"\"},\"id\":\"1293\",\"type\":\"Title\"},{\"attributes\":{},\"id\":\"1253\",\"type\":\"PanTool\"},{\"attributes\":{\"axis_label\":\"time (min)\",\"formatter\":{\"id\":\"1295\",\"type\":\"BasicTickFormatter\"},\"plot\":{\"id\":\"1234\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"1244\",\"type\":\"BasicTicker\"}},\"id\":\"1243\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1389\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"1244\",\"type\":\"BasicTicker\"},{\"attributes\":{\"fill_color\":{\"value\":\"#1f77b4\"},\"line_color\":{\"value\":\"#1f77b4\"},\"size\":{\"units\":\"screen\",\"value\":7},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1269\",\"type\":\"Circle\"},{\"attributes\":{\"callback\":null},\"id\":\"1235\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"1390\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"1241\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1257\",\"type\":\"ResetTool\"},{\"attributes\":{},\"id\":\"1295\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"data_source\":{\"id\":\"1356\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"1357\",\"type\":\"Line\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"1358\",\"type\":\"Line\"},\"selection_glyph\":null,\"view\":{\"id\":\"1360\",\"type\":\"CDSView\"}},\"id\":\"1359\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1256\",\"type\":\"SaveTool\"},{\"attributes\":{\"line_color\":\"dimgray\",\"line_width\":3,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1357\",\"type\":\"Line\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"#1f77b4\"},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"#1f77b4\"},\"size\":{\"units\":\"screen\",\"value\":7},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1270\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"1300\",\"type\":\"Selection\"},{\"attributes\":{\"bottom_units\":\"screen\",\"fill_alpha\":{\"value\":0.5},\"fill_color\":{\"value\":\"lightgrey\"},\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":{\"value\":1.0},\"line_color\":{\"value\":\"black\"},\"line_dash\":[4,4],\"line_width\":{\"value\":2},\"plot\":null,\"render_mode\":\"css\",\"right_units\":\"screen\",\"top_units\":\"screen\"},\"id\":\"1261\",\"type\":\"BoxAnnotation\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":{\"__ndarray__\":\"zpvU4TLgA0Cv+7dg49EcQMLCSZo/2ChA00wYSZIkMUDGc40Bnxw2QLqaArqrFDtASvkgNh7NP0AfEEt3lWJCQAoqcNOb3kRAUVl/EdU6R0C+LiaqdfZJQDjCYAZ8ckxAsVWbYoLuTkC1hUrQXaVQQFI+iI1H81FALxmFLGQhU0DsYqJaZ19UQKmsv4hqnVVAhYe8J4fLVkD/GveDjUdZQHmuMeCTw1tA+SA2Hs0fXkC2alNM0F1gQAN94DLgk2FAs+1yGfDJYkB9EBuP5g9kQA==\",\"dtype\":\"float64\",\"shape\":[26]},\"y\":{\"__ndarray__\":\"m3JDW+dCwD+bckNb50LAP5tyQ1vnQsA/VNahYOdCAEBnpYPUcX0OQNSLsX75QRZAANNYsa44GkD+dgIvbWMeQKywU4sMEyFAEHOL8UhlIkB4RjqHW80iQAwHQrKAnSNAEKAyQJosJECocbGalRIkQNpSzc2zuyRAdxgPxrriJEB2vTy2yDAlQHa9PLbIMCVA1kFWnt2lJUDcNRk86eYlQAgjctH7TiZAB8ifwQmdJkAGbc2xF+smQKSN4bkQxCZAOam79CdGJ0A6BI4EGvgmQA==\",\"dtype\":\"float64\",\"shape\":[26]}},\"selected\":{\"id\":\"1300\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"1299\",\"type\":\"UnionRenderers\"}},\"id\":\"1268\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"source\":{\"id\":\"1268\",\"type\":\"ColumnDataSource\"}},\"id\":\"1272\",\"type\":\"CDSView\"},{\"attributes\":{\"active_drag\":\"auto\",\"active_inspect\":\"auto\",\"active_multi\":null,\"active_scroll\":\"auto\",\"active_tap\":\"auto\",\"tools\":[{\"id\":\"1253\",\"type\":\"PanTool\"},{\"id\":\"1254\",\"type\":\"WheelZoomTool\"},{\"id\":\"1255\",\"type\":\"BoxZoomTool\"},{\"id\":\"1256\",\"type\":\"SaveTool\"},{\"id\":\"1257\",\"type\":\"ResetTool\"},{\"id\":\"1258\",\"type\":\"HelpTool\"}]},\"id\":\"1259\",\"type\":\"Toolbar\"},{\"attributes\":{},\"id\":\"1258\",\"type\":\"HelpTool\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"#1f77b4\",\"line_width\":3,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1358\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"1299\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[200]},\"y\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[200]}},\"selected\":{\"id\":\"1390\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"1389\",\"type\":\"UnionRenderers\"}},\"id\":\"1356\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"1297\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"callback\":null},\"id\":\"1237\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"1249\",\"type\":\"BasicTicker\"},{\"attributes\":{\"data_source\":{\"id\":\"1268\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"1269\",\"type\":\"Circle\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"1270\",\"type\":\"Circle\"},\"selection_glyph\":null,\"view\":{\"id\":\"1272\",\"type\":\"CDSView\"}},\"id\":\"1271\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1239\",\"type\":\"LinearScale\"}],\"root_ids\":[\"1234\"]},\"title\":\"Bokeh Application\",\"version\":\"1.0.1\"}};\n", " var render_items = [{\"docid\":\"01df7e39-3c8e-405f-9a79-5adf12fbe855\",\"roots\":{\"1234\":\"80eb4972-f019-49f3-9138-f523ae609c79\"}}];\n", " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", "\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " var attempts = 0;\n", " var timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " clearInterval(timer);\n", " }\n", " attempts++;\n", " if (attempts > 100) {\n", " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", " clearInterval(timer);\n", " }\n", " }, 10, root)\n", " }\n", "})(window);" ], "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "1234" } }, "output_type": "display_data" } ], "source": [ "# Compute theoretical curve\n", "t = np.linspace(0, 160, 200)\n", "flag_len_model = flag_len_theor(t, *popt)\n", "\n", "# Add curve fit to the plot\n", "p.line(t + t_exp[3], flag_len_model, line_width=3, color='dimgray')\n", "bokeh.io.show(p);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "By eye, this is convincing support for the balance point model. However, as described in the lecture notes, this model does not capture the interdependencies of the growth of the two flagella." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Caveat (a major caveat)\n", "\n", "The procedure we have just done amounts to a **maximumum likelihood estimate** of the parameters of the theoretical model based on the data. Implicit in this estimate is the generative statistical model. It assumed that every data point is Normally distributed about the theoretical curve, and further that these Normal distributions are independent and have the same variance. There is a whole world of hurt you could be opening yourself up to in taking this naive approach. I encourage you to take my [course on data analysis](http://bebi103.caltech.edu/) to learn more about better ways to perform this kind of analysis." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The adjusted balance point model\n", "\n", "The adjusted balance point model takes into account cytoplasmic concentrations of precursor for flagellum building. The dynamical equations are\n", "\n", "\\begin{align}\n", "\\frac{\\mathrm{d}\\ell_1}{\\mathrm{d}t} &= \\beta\\, \\frac{n(t-\\ell_1/v_a)}{\\ell_1} - \\alpha,\\\\[1em]\n", "\\frac{\\mathrm{d}\\ell_2}{\\mathrm{d}t} &= \\beta \\, \\frac{n(t-\\ell_2/v_a)}{\\ell_2} - \\alpha,\\\\[1em]\n", "\\frac{\\mathrm{d}n}{\\mathrm{d}t} &= -\\beta n\\left(\\frac{1}{\\ell_1} + \\frac{1}{\\ell_2}\\right) + 2\\alpha.\n", "\\end{align}\n", "\n", "Here, $v_a$ is the speed of anterograde motion of IFT trains and $n$ is the number of precursor units available in the nearby cytoplasm. We nondimensionalize using the definitions\n", "\n", "\\begin{align}\n", "\\gamma &= \\frac{\\beta}{\\alpha}, \\;\\;\n", "u = \\frac{v_a}{\\alpha}, \\;\\;\n", "\\ell_1 = \\gamma n_\\mathrm{tot}\\,\\tilde{\\ell_1}, \\\\[1em]\n", "\\ell_2 &= \\gamma n_\\mathrm{tot}\\,\\tilde{\\ell_2},\\;\\;\n", "t = \\frac{\\beta n_\\mathrm{tot}}{\\alpha^2}\\,\\tilde{t},\\;\\;\n", "n = n_\\mathrm{tot}\\tilde{n},\n", "\\end{align}\n", "\n", "giving dimensionless dynamical equations\n", "\n", "\\begin{align}\n", "\\frac{\\mathrm{d}\\ell_1}{\\mathrm{d}t} &= \\frac{n(t-\\ell_1/u)}{\\ell_1} - 1,\\\\[1em]\n", "\\frac{\\mathrm{d}\\ell_2}{\\mathrm{d}t} &= \\frac{n(t-\\ell_2/u)}{\\ell_2} - 1,\\\\[1em]\n", "\\gamma^{-1}\\,\\frac{\\mathrm{d}n}{\\mathrm{d}t} &= - n(t)\\left(\\frac{1}{\\ell_1} + \\frac{1}{\\ell_2}\\right) + 2,\n", "\\end{align}\n", "\n", "where we have dropped the tildes for notational convenience. This is the set of delay differential equations we have to solve. We will solve them using Euler stepping. We first write a function for the time derivatives of $\\ell_1$, $\\ell_2$, and $n$." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "def dx_dt(x, n_1, n_2, gamma, u):\n", " \"\"\"\n", " Right hand side of DDE for shared pool balance point model.\n", " \n", " x = ell_1, ell_2, n\n", " n_1 = n(t - ell_1/u)\n", " n_2 = n(t - ell_2/u)\n", " \"\"\"\n", " return np.array([n_1 / x[0] - 1,\n", " n_2 / x[1] - 1,\n", " gamma * (2 - x[2] * (1/x[0] + 1/x[1]))])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next, we write a function to solve the adjusted balance point DDE using Euler stepping. We have to specify some points in the \"past\" because of the delay/." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "def solve_balance_point_dde(x0, gamma, u, dt=0.001, t_stop=5):\n", " \"\"\"\n", " Use Euler integration to solve ODEs\n", " \"\"\"\n", " # Make sure initial lengths are physical\n", " if gamma * (x0[0] + x0[1]) + x0[2] > 1:\n", " raise RuntimeError('gamma * (ell_1 + ell_2) + n must be <= 1')\n", " \n", " # Starting time point (in the past)\n", " t0 = -max(x0[0] / u, x0[1] / u)\n", " \n", " # Time points to consider\n", " t_points = np.concatenate(((t0,), np.arange(0, t_stop, dt)))\n", " \n", " # Initialize output array\n", " x = np.empty((len(t_points), 3))\n", " x[0:2,:] = np.array([x0, x0])\n", "\n", " # Do Euler stepping\n", " for i, t in enumerate(t_points[2:]):\n", " # Do linear interpolation of past points to find past n\n", " n_1 = np.interp(t - x[i+1,0]/u, t_points[:i+2], x[:i+2,2])\n", " n_2 = np.interp(t - x[i+1,1]/u, t_points[:i+2], x[:i+2,2])\n", " \n", " # Take Euler step\n", " x[i+2] = x[i+1] + dt * dx_dt(x[i+1], n_1, n_2, gamma, u)\n", " \n", " return t_points, x" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, let's see if the adjusted balance point model can fit growth of a single microtubule (assuming, by symmetry, that the two microtubules grow identially in the pH shock experiment). We will take $v_a = 120$ µm/min, as measured by Kaminsky, et al., *PNAS*, **90**, 5519–5523, 1993. \n", "\n", "First, we write a function to generate theoretical values of the growth of the pair of microtubules in the pH shock experiment for specified time points." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "v_a = 120 # µm/min\n", "\n", "def flag_len_adj_theor(t, alpha, beta, n_tot, ell_0):\n", " \"\"\"\n", " Theoretical flagellar length.\n", " \"\"\"\n", " # Parameters\n", " gamma = beta / alpha\n", " u = v_a / alpha\n", " \n", " # Dimensionless ell_0\n", " ell_0_dimless = ell_0 / gamma / n_tot\n", " \n", " # Dimensionless time\n", " t_dimless = t * alpha**2 / beta / n_tot\n", " \n", " # Solve dimensionless equations\n", " t_solve, x = solve_balance_point_dde(\n", " np.array([ell_0_dimless, ell_0_dimless, 1 - 2*gamma*ell_0_dimless]),\n", " gamma,\n", " u,\n", " dt=0.0001, \n", " t_stop=t_dimless.max())\n", " \n", " # Interpolate to values we want\n", " ell_dimless = np.interp(t_dimless, t_solve, x[:,0])\n", " \n", " # Convert to real lengths\n", " return ell_dimless * gamma * n_tot" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now that we have a theoretical function, we can perform the curve fit." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Best fit parameter values\n", " α: 0.083 µm/min\n", " β: 0.073 µm/min\n", "n_tot: 37.63 µm\n", " l_0: 1.74 µm\n", "\n" ] } ], "source": [ "# Curve fit\n", "p0 = (0.1, 0.1, 30, 2)\n", "popt, _ = scipy.optimize.curve_fit(flag_len_adj_theor, t_exp[3:] - t_exp[3], \n", " flag_len_exp[3:], p0=p0)\n", "\n", "# Compute useful quantities from results\n", "alpha, beta, n_tot, _ = popt\n", "gamma = beta / alpha\n", "u = v_a / alpha\n", "\n", "# Steady states\n", "n_ss = alpha * n_tot / (alpha + 2 * beta)\n", "ell_ss = gamma * n_ss\n", "\n", "# Show results\n", "print(\"\"\"\n", "Best fit parameter values\n", " α: {0:.3f} µm/min\n", " β: {1:.3f} µm/min\n", "n_tot: {2:.2f} µm\n", " l_0: {3:.2f} µm\n", "\"\"\".format(*popt))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's plot the result and see how we did." ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "scrolled": true }, "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 = {\"5d9e9f0b-a4af-4fdd-bbf8-1877af9c4f91\":{\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"1243\",\"type\":\"LinearAxis\"}],\"left\":[{\"id\":\"1248\",\"type\":\"LinearAxis\"}],\"plot_height\":350,\"plot_width\":650,\"renderers\":[{\"id\":\"1243\",\"type\":\"LinearAxis\"},{\"id\":\"1247\",\"type\":\"Grid\"},{\"id\":\"1248\",\"type\":\"LinearAxis\"},{\"id\":\"1252\",\"type\":\"Grid\"},{\"id\":\"1261\",\"type\":\"BoxAnnotation\"},{\"id\":\"1271\",\"type\":\"GlyphRenderer\"},{\"id\":\"1359\",\"type\":\"GlyphRenderer\"},{\"id\":\"1461\",\"type\":\"GlyphRenderer\"}],\"title\":{\"id\":\"1293\",\"type\":\"Title\"},\"toolbar\":{\"id\":\"1259\",\"type\":\"Toolbar\"},\"x_range\":{\"id\":\"1235\",\"type\":\"DataRange1d\"},\"x_scale\":{\"id\":\"1239\",\"type\":\"LinearScale\"},\"y_range\":{\"id\":\"1237\",\"type\":\"DataRange1d\"},\"y_scale\":{\"id\":\"1241\",\"type\":\"LinearScale\"}},\"id\":\"1234\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{\"dimension\":1,\"plot\":{\"id\":\"1234\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"1249\",\"type\":\"BasicTicker\"}},\"id\":\"1252\",\"type\":\"Grid\"},{\"attributes\":{\"plot\":{\"id\":\"1234\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"1244\",\"type\":\"BasicTicker\"}},\"id\":\"1247\",\"type\":\"Grid\"},{\"attributes\":{\"overlay\":{\"id\":\"1261\",\"type\":\"BoxAnnotation\"}},\"id\":\"1255\",\"type\":\"BoxZoomTool\"},{\"attributes\":{\"source\":{\"id\":\"1356\",\"type\":\"ColumnDataSource\"}},\"id\":\"1360\",\"type\":\"CDSView\"},{\"attributes\":{\"axis_label\":\"flag. length (\\u00b5m)\",\"formatter\":{\"id\":\"1297\",\"type\":\"BasicTickFormatter\"},\"plot\":{\"id\":\"1234\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"1249\",\"type\":\"BasicTicker\"}},\"id\":\"1248\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1254\",\"type\":\"WheelZoomTool\"},{\"attributes\":{\"plot\":null,\"text\":\"\"},\"id\":\"1293\",\"type\":\"Title\"},{\"attributes\":{},\"id\":\"1253\",\"type\":\"PanTool\"},{\"attributes\":{\"axis_label\":\"time (min)\",\"formatter\":{\"id\":\"1295\",\"type\":\"BasicTickFormatter\"},\"plot\":{\"id\":\"1234\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"1244\",\"type\":\"BasicTicker\"}},\"id\":\"1243\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1389\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"1244\",\"type\":\"BasicTicker\"},{\"attributes\":{\"fill_color\":{\"value\":\"#1f77b4\"},\"line_color\":{\"value\":\"#1f77b4\"},\"size\":{\"units\":\"screen\",\"value\":7},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1269\",\"type\":\"Circle\"},{\"attributes\":{\"callback\":null},\"id\":\"1235\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"1390\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"1241\",\"type\":\"LinearScale\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[200]},\"y\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[200]}},\"selected\":{\"id\":\"1494\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"1493\",\"type\":\"UnionRenderers\"}},\"id\":\"1458\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"1257\",\"type\":\"ResetTool\"},{\"attributes\":{},\"id\":\"1295\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"data_source\":{\"id\":\"1356\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"1357\",\"type\":\"Line\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"1358\",\"type\":\"Line\"},\"selection_glyph\":null,\"view\":{\"id\":\"1360\",\"type\":\"CDSView\"}},\"id\":\"1359\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1494\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"1256\",\"type\":\"SaveTool\"},{\"attributes\":{\"line_color\":\"dimgray\",\"line_width\":3,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1357\",\"type\":\"Line\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"#1f77b4\"},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"#1f77b4\"},\"size\":{\"units\":\"screen\",\"value\":7},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1270\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"1300\",\"type\":\"Selection\"},{\"attributes\":{\"bottom_units\":\"screen\",\"fill_alpha\":{\"value\":0.5},\"fill_color\":{\"value\":\"lightgrey\"},\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":{\"value\":1.0},\"line_color\":{\"value\":\"black\"},\"line_dash\":[4,4],\"line_width\":{\"value\":2},\"plot\":null,\"render_mode\":\"css\",\"right_units\":\"screen\",\"top_units\":\"screen\"},\"id\":\"1261\",\"type\":\"BoxAnnotation\"},{\"attributes\":{\"data_source\":{\"id\":\"1458\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"1459\",\"type\":\"Line\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"1460\",\"type\":\"Line\"},\"selection_glyph\":null,\"view\":{\"id\":\"1462\",\"type\":\"CDSView\"}},\"id\":\"1461\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":{\"__ndarray__\":\"zpvU4TLgA0Cv+7dg49EcQMLCSZo/2ChA00wYSZIkMUDGc40Bnxw2QLqaArqrFDtASvkgNh7NP0AfEEt3lWJCQAoqcNOb3kRAUVl/EdU6R0C+LiaqdfZJQDjCYAZ8ckxAsVWbYoLuTkC1hUrQXaVQQFI+iI1H81FALxmFLGQhU0DsYqJaZ19UQKmsv4hqnVVAhYe8J4fLVkD/GveDjUdZQHmuMeCTw1tA+SA2Hs0fXkC2alNM0F1gQAN94DLgk2FAs+1yGfDJYkB9EBuP5g9kQA==\",\"dtype\":\"float64\",\"shape\":[26]},\"y\":{\"__ndarray__\":\"m3JDW+dCwD+bckNb50LAP5tyQ1vnQsA/VNahYOdCAEBnpYPUcX0OQNSLsX75QRZAANNYsa44GkD+dgIvbWMeQKywU4sMEyFAEHOL8UhlIkB4RjqHW80iQAwHQrKAnSNAEKAyQJosJECocbGalRIkQNpSzc2zuyRAdxgPxrriJEB2vTy2yDAlQHa9PLbIMCVA1kFWnt2lJUDcNRk86eYlQAgjctH7TiZAB8ifwQmdJkAGbc2xF+smQKSN4bkQxCZAOam79CdGJ0A6BI4EGvgmQA==\",\"dtype\":\"float64\",\"shape\":[26]}},\"selected\":{\"id\":\"1300\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"1299\",\"type\":\"UnionRenderers\"}},\"id\":\"1268\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"source\":{\"id\":\"1268\",\"type\":\"ColumnDataSource\"}},\"id\":\"1272\",\"type\":\"CDSView\"},{\"attributes\":{\"active_drag\":\"auto\",\"active_inspect\":\"auto\",\"active_multi\":null,\"active_scroll\":\"auto\",\"active_tap\":\"auto\",\"tools\":[{\"id\":\"1253\",\"type\":\"PanTool\"},{\"id\":\"1254\",\"type\":\"WheelZoomTool\"},{\"id\":\"1255\",\"type\":\"BoxZoomTool\"},{\"id\":\"1256\",\"type\":\"SaveTool\"},{\"id\":\"1257\",\"type\":\"ResetTool\"},{\"id\":\"1258\",\"type\":\"HelpTool\"}]},\"id\":\"1259\",\"type\":\"Toolbar\"},{\"attributes\":{},\"id\":\"1258\",\"type\":\"HelpTool\"},{\"attributes\":{\"source\":{\"id\":\"1458\",\"type\":\"ColumnDataSource\"}},\"id\":\"1462\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"1493\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"#1f77b4\",\"line_width\":3,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1358\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"1299\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[200]},\"y\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[200]}},\"selected\":{\"id\":\"1390\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"1389\",\"type\":\"UnionRenderers\"}},\"id\":\"1356\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"1297\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"callback\":null},\"id\":\"1237\",\"type\":\"DataRange1d\"},{\"attributes\":{\"line_color\":\"tomato\",\"line_width\":3,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1459\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"1249\",\"type\":\"BasicTicker\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"#1f77b4\",\"line_width\":3,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1460\",\"type\":\"Line\"},{\"attributes\":{\"data_source\":{\"id\":\"1268\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"1269\",\"type\":\"Circle\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"1270\",\"type\":\"Circle\"},\"selection_glyph\":null,\"view\":{\"id\":\"1272\",\"type\":\"CDSView\"}},\"id\":\"1271\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1239\",\"type\":\"LinearScale\"}],\"root_ids\":[\"1234\"]},\"title\":\"Bokeh Application\",\"version\":\"1.0.1\"}};\n", " var render_items = [{\"docid\":\"5d9e9f0b-a4af-4fdd-bbf8-1877af9c4f91\",\"roots\":{\"1234\":\"0c1eae8c-c03a-49db-9069-d1878dde8892\"}}];\n", " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", "\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " var attempts = 0;\n", " var timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " clearInterval(timer);\n", " }\n", " attempts++;\n", " if (attempts > 100) {\n", " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", " clearInterval(timer);\n", " }\n", " }, 10, root)\n", " }\n", "})(window);" ], "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "1234" } }, "output_type": "display_data" } ], "source": [ "# Compute theoretical curve\n", "t = np.linspace(0, 160, 200)\n", "flag_len_model = flag_len_adj_theor(t, *popt)\n", "\n", "# Make plot of solution\n", "p.line(t + t_exp[3], flag_len_model, line_width=3, color='tomato')\n", "bokeh.io.show(p);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Not surprisingly, the more complicated model also fits the data well. In fact, the models are almost exactly coincident, as seem by the overlap of the two theoretical lines.\n", "\n", "Now, let's see how the system will respond to a severing experiment. We will take as an initial condition one flagellum being at the steady state length and the other being close to zero. The total amount of tubulin is as in before, minus what was in the severed flagellum." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "new_n_tot = n_tot - ell_ss\n", "\n", "t, x = solve_balance_point_dde(np.array([ell_ss / new_n_tot, 0.01, n_ss/new_n_tot]),\n", " gamma,\n", " u,\n", " dt=0.001,\n", " t_stop=1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now that we have the solution, we can plot the result. The severed filament is in red and the unsevered filament is in blue." ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "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 = {\"7de4c320-bf05-47e6-af93-3794138635d9\":{\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"1583\",\"type\":\"LinearAxis\"}],\"left\":[{\"id\":\"1588\",\"type\":\"LinearAxis\"}],\"plot_height\":350,\"plot_width\":650,\"renderers\":[{\"id\":\"1583\",\"type\":\"LinearAxis\"},{\"id\":\"1587\",\"type\":\"Grid\"},{\"id\":\"1588\",\"type\":\"LinearAxis\"},{\"id\":\"1592\",\"type\":\"Grid\"},{\"id\":\"1601\",\"type\":\"BoxAnnotation\"},{\"id\":\"1611\",\"type\":\"GlyphRenderer\"},{\"id\":\"1616\",\"type\":\"GlyphRenderer\"}],\"title\":{\"id\":\"1651\",\"type\":\"Title\"},\"toolbar\":{\"id\":\"1599\",\"type\":\"Toolbar\"},\"x_range\":{\"id\":\"1575\",\"type\":\"DataRange1d\"},\"x_scale\":{\"id\":\"1579\",\"type\":\"LinearScale\"},\"y_range\":{\"id\":\"1577\",\"type\":\"DataRange1d\"},\"y_scale\":{\"id\":\"1581\",\"type\":\"LinearScale\"}},\"id\":\"1574\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":{\"__ndarray__\":\"5HFw10Fftr8AAAAAAAAAAIYjrVcKQdE/hiOtVwpB4T9KtYODj+HpP4YjrVcKQfE/aGyY7UyR9T9KtYODj+H5Pyv+bhnSMf4/hiOtVwpBAUD4x6KiK2kDQGhsmO1MkQVA2BCOOG65B0BKtYODj+EJQLtZec6wCQxAK/5uGdIxDkBNUTKy+SwQQIYjrVcKQRFAv/Un/RpVEkD4x6KiK2kTQC+aHUg8fRRAaGyY7UyRFUCgPhOTXaUWQNgQjjhuuRdAEeMI3n7NGEBKtYODj+EZQIKH/iig9RpAu1l5zrAJHED0K/RzwR0dQCv+bhnSMR5AZNDpvuJFH0BNUTKy+SwgQGq67wQCtyBAhiOtVwpBIUCjjGqqEsshQL/1J/0aVSJA217lTyPfIkD4x6KiK2kjQBIxYPUz8yNAL5odSDx9JEBMA9uaRAclQGhsmO1MkSVAhdVVQFUbJkCgPhOTXaUmQL2n0OVlLydA2BCOOG65J0D1eUuLdkMoQBHjCN5+zShALUzGMIdXKUBKtYODj+EpQGYeQdaXaypAgof+KKD1KkCf8Lt7qH8rQLtZec6wCSxA1sI2IbmTLED0K/RzwR0tQA+VscbJpy1AK/5uGdIxLkBHZyxs2rsuQGTQ6b7iRS9AgDmnEevPL0BNUTKy+SwwQNwFkdv9cTBAarrvBAK3MED4bk4uBvwwQIYjrVcKQTFAFdgLgQ6GMUCjjGqqEssxQDFBydMWEDJAv/Un/RpVMkBNqoYmH5oyQNte5U8j3zJAaRNEeSckM0D4x6KiK2kzQIV8AcwvrjNAEjFg9TPzM0Ch5b4eODg0QC+aHUg8fTRAvU58cUDCNEBMA9uaRAc1QNq3OcRITDVAaGyY7UyRNUD3IPcWUdY1QIXVVUBVGzZAEoq0aVlgNkCgPhOTXaU2QC7zcbxh6jZAvafQ5WUvN0BLXC8PanQ3QNgQjjhuuTdAZ8XsYXL+N0D1eUuLdkM4QIMuqrR6iDhAEeMI3n7NOECfl2cHgxI5QC1MxjCHVzlAuwAlWoucOUBKtYODj+E5QNlp4qyTJjpAZh5B1pdrOkDz0p//m7A6QIKH/iig9TpAEDxdUqQ6O0Cf8Lt7qH87QCylGqWsxDtAu1l5zrAJPEBJDtj3tE48QNbCNiG5kzxAY3eVSr3YPED0K/RzwR09QIHgUp3FYj1AD5WxxsmnPUCcSRDwzew9QCv+bhnSMT5AuLLNQtZ2PkBHZyxs2rs+QNUbi5XeAD9AZNDpvuJFP0DxhEjo5oo/QIA5pxHrzz9ACPeCnXcKQEBNUTKy+SxAQJWr4cZ7T0BA3AWR2/1xQEAjYEDwf5RAQGq67wQCt0BAsRSfGYTZQED4bk4uBvxAQD/J/UKIHkFAhiOtVwpBQUDOfVxsjGNBQBXYC4EOhkFAXDK7lZCoQUCjjGqqEstBQOrmGb+U7UFAMUHJ0xYQQkB3m3jomDJCQL/1J/0aVUJABlDXEZ13QkBNqoYmH5pCQJQENjuhvEJA217lTyPfQkAjuZRkpQFDQGkTRHknJENAsW3zjalGQ0D4x6KiK2lDQD4iUreti0NAhXwBzC+uQ0DN1rDgsdBDQBIxYPUz80NAWosPCrYVRECh5b4eODhEQOg/bjO6WkRAL5odSDx9REB29Mxcvp9EQL1OfHFAwkRABKkrhsLkREBMA9uaRAdFQJNdiq/GKUVA2rc5xEhMRUAhEunYym5FQGhsmO1MkUVAr8ZHAs+zRUD3IPcWUdZFQD17pivT+EVAhdVVQFUbRkDLLwVV1z1GQBKKtGlZYEZAWuRjftuCRkCgPhOTXaVGQOiYwqffx0ZALvNxvGHqRkB2TSHR4wxHQL2n0OVlL0dABAKA+udRR0BLXC8PanRHQJK23iPslkdA2BCOOG65R0Agaz1N8NtHQGfF7GFy/kdArR+cdvQgSED1eUuLdkNIQDvU+p/4ZUhAgy6qtHqISEDJiFnJ/KpIQBHjCN5+zUhAWD248gDwSECfl2cHgxJJQObxFhwFNUlALUzGMIdXSUB0pnVFCXpJQLsAJVqLnElAA1vUbg2/SUBKtYODj+FJQJAPM5gRBEpA2WnirJMmSkAfxJHBFUlKQGYeQdaXa0pArXjw6hmOSkDz0p//m7BKQDotTxQe00pAgof+KKD1SkDJ4a09IhhLQBA8XVKkOktAWJYMZyZdS0Cf8Lt7qH9LQOVKa5AqoktALKUapazES0B0/8m5LudLQLtZec6wCUxAArQo4zIsTEBJDtj3tE5MQI9ohww3cUxA1sI2IbmTTEAdHeY1O7ZMQGN3lUq92ExArNFEXz/7TED0K/RzwR1NQDuGo4hDQE1AgeBSncViTUDGOgKyR4VNQA+VscbJp01AVe9g20vKTUCcSRDwzexNQOOjvwRQD05AK/5uGdIxTkByWB4uVFROQLiyzULWdk5AAQ19V1iZTkBHZyxs2rtOQI7B24Bc3k5A1RuLld4AT0AddjqqYCNPQGTQ6b7iRU9AqiqZ02RoT0DxhEjo5opPQDnf9/xorU9AgDmnEevPT0DHk1YmbfJPQAj3gp13ClBAK6Tap7gbUEBNUTKy+SxQQHH+ibw6PlBAlavhxntPUEC4WDnRvGBQQNwFkdv9cVBA/7Lo5T6DUEAjYEDwf5RQQEYNmPrApVBAarrvBAK3UECNZ0cPQ8hQQLEUnxmE2VBA1cH2I8XqUED4bk4uBvxQQBwcpjhHDVFAP8n9QogeUUBjdlVNyS9RQIYjrVcKQVFAqtAEYktSUUDOfVxsjGNRQPEqtHbNdFFAFdgLgQ6GUUA5hWOLT5dRQFwyu5WQqFFAf98SoNG5UUCjjGqqEstRQMc5wrRT3FFA6uYZv5TtUUANlHHJ1f5RQDFBydMWEFJAVO4g3lchUkB3m3jomDJSQJtI0PLZQ1JAv/Un/RpVUkDion8HXGZSQAZQ1xGdd1JAKv0uHN6IUkBNqoYmH5pSQHBX3jBgq1JAlAQ2O6G8UkC4sY1F4s1SQNte5U8j31JA/ws9WmTwUkAjuZRkpQFTQEZm7G7mElNAaRNEeSckU0CNwJuDaDVTQLFt842pRlNA1BpLmOpXU0D4x6KiK2lTQBp1+qxselNAPiJSt62LU0Biz6nB7pxTQIV8AcwvrlNAqClZ1nC/U0DN1rDgsdBTQPCDCOvy4VNAEjFg9TPzU0A23rf/dARUQFqLDwq2FVRAfThnFPcmVECh5b4eODhUQMWSFil5SVRA6D9uM7paVEAL7cU9+2tUQC+aHUg8fVRAU0d1Un2OVEB29Mxcvp9UQJqhJGf/sFRAvU58cUDCVEDh+9N7gdNUQASpK4bC5FRAKFaDkAP2VEBMA9uaRAdVQG+wMqWFGFVAk12Kr8YpVUC2CuK5BztVQNq3OcRITFVA/WSRzoldVUAhEunYym5VQEW/QOMLgFVAaGyY7UyRVUCMGfD3jaJVQK/GRwLPs1VA03OfDBDFVUD3IPcWUdZVQBrOTiGS51VAPXumK9P4VUBhKP41FApWQIXVVUBVG1ZAqIKtSpYsVkDLLwVV1z1WQO/cXF8YT1ZAEoq0aVlgVkA1Nwx0mnFWQFrkY37bglZAfZG7iByUVkCgPhOTXaVWQMTrap2etlZA6JjCp9/HVkALRhqyINlWQC7zcbxh6lZAUqDJxqL7VkB2TSHR4wxXQJn6eNskHldAvafQ5WUvV0DhVCjwpkBXQAQCgPrnUVdAJ6/XBCljV0BLXC8PanRXQG8JhxmrhVdAkrbeI+yWV0C2YzYuLahXQNgQjjhuuVdA/L3lQq/KV0Agaz1N8NtXQEMYlVcx7VdAZ8XsYXL+V0CLckRssw9YQK0fnHb0IFhA0MzzgDUyWED1eUuLdkNYQBgno5W3VFhAO9T6n/hlWEBfgVKqOXdYQIMuqrR6iFhAptsBv7uZWEDJiFnJ/KpYQO01sdM9vFhAEeMI3n7NWEA0kGDov95YQFg9uPIA8FhAfOoP/UEBWUCfl2cHgxJZQMJEvxHEI1lA5vEWHAU1WUAKn24mRkZZQC1MxjCHV1lAUfkdO8hoWUB0pnVFCXpZQJhTzU9Ki1lAuwAlWoucWUDgrXxkzK1ZQANb1G4Nv1lAJggseU7QWUBKtYODj+FZQG1i243Q8llAkA8zmBEEWkC0vIqiUhVaQNlp4qyTJlpA/BY6t9Q3WkAfxJHBFUlaQENx6ctWWlpAZh5B1pdrWkCJy5jg2HxaQK148OoZjlpA0CVI9VqfWkDz0p//m7BaQBeA9wndwVpAOi1PFB7TWkBf2qYeX+RaQIKH/iig9VpApjRWM+EGW0DJ4a09IhhbQOyOBUhjKVtAEDxdUqQ6W0Az6bRc5UtbQFiWDGcmXVtAe0NkcWduW0Cf8Lt7qH9bQMKdE4bpkFtA5UprkCqiW0AJ+MKaa7NbQCylGqWsxFtAUVJyr+3VW0B0/8m5LudbQJisIcRv+FtAu1l5zrAJXEDeBtHY8RpcQAK0KOMyLFxAJWGA7XM9XEBJDtj3tE5cQGy7LwL2X1xAj2iHDDdxXECzFd8WeIJcQNbCNiG5k1xA+W+OK/qkXEAdHeY1O7ZcQEDKPUB8x1xAY3eVSr3YXECIJO1U/ulcQKzRRF8/+1xAz36caYAMXUD0K/RzwR1dQBbZS34CL11AO4ajiENAXUBcM/uShFFdQIHgUp3FYl1ApY2qpwZ0XUDGOgKyR4VdQOvnWbyIll1AD5WxxsmnXUAyQgnRCrldQFXvYNtLyl1Aepy45YzbXUCcSRDwzexdQMH2Z/oO/l1A46O/BFAPXkAIURcPkSBeQCv+bhnSMV5ATqvGIxNDXkByWB4uVFReQJcFdjiVZV5AuLLNQtZ2XkDdXyVNF4heQAENfVdYmV5AJLrUYZmqXkBHZyxs2rteQGwUhHYbzV5AjsHbgFzeXkCzbjOLne9eQNUbi5XeAF9A+sjinx8SX0AddjqqYCNfQEAjkrShNF9AZNDpvuJFX0CJfUHJI1dfQKoqmdNkaF9Az9fw3aV5X0DxhEjo5opfQBYyoPInnF9AOd/3/GitX0BdjE8Hqr5fQIA5pxHrz19Ao+b+GyzhX0DHk1YmbfJfQHUgVxjXAWBACPeCnXcKYECYza4iGBNgQCuk2qe4G2BAvHoGLVkkYEBNUTKy+SxgQOAnXjeaNWBAcf6JvDo+YEAD1bVB20ZgQJWr4cZ7T2BAJ4INTBxYYEC4WDnRvGBgQEsvZVZdaWBA3AWR2/1xYEBu3LxgnnpgQP+y6OU+g2BAkYkUa9+LYEAjYEDwf5RgQLU2bHUgnWBARg2Y+sClYEDZ48N/Ya5gQGq67wQCt2BA/JAbiqK/YECNZ0cPQ8hgQCA+c5Tj0GBAsRSfGYTZYEBC68qeJOJgQNXB9iPF6mBAZpgiqWXzYED4bk4uBvxgQIpFerOmBGFAHBymOEcNYUCt8tG95xVhQD/J/UKIHmFA0J8pyCgnYUBjdlVNyS9hQPVMgdJpOGFAhiOtVwpBYUAY+tjcqklhQKrQBGJLUmFAO6cw5+taYUDOfVxsjGNhQF9UiPEsbGFA8Sq0ds10YUCDAeD7bX1hQBXYC4EOhmFApq43Bq+OYUA5hWOLT5dhQMlbjxDwn2FAXDK7lZCoYUDuCOcaMbFhQH/fEqDRuWFAEbY+JXLCYUCjjGqqEsthQDRjli+z02FAxznCtFPcYUBYEO459ORhQOrmGb+U7WFAfL1FRDX2YUANlHHJ1f5hQJ9qnU52B2JAMUHJ0xYQYkDCF/VYtxhiQFTuIN5XIWJA58RMY/gpYkB3m3jomDJiQApypG05O2JAm0jQ8tlDYkAtH/x3ekxiQL/1J/0aVWJAUcxTgrtdYkDion8HXGZiQHV5q4z8bmJABlDXEZ13YkCYJgOXPYBiQCr9LhzeiGJAu9NaoX6RYkBNqoYmH5piQOCAsqu/omJAcFfeMGCrYkADLgq2ALRiQJQENjuhvGJAJtthwEHFYkC4sY1F4s1iQEqIucqC1mJA217lTyPfYkBuNRHVw+diQP8LPVpk8GJAkeJo3wT5YkAjuZRkpQFjQLSPwOlFCmNARmbsbuYSY0DYPBj0hhtjQGkTRHknJGNA++lv/scsY0CNwJuDaDVjQB6XxwgJPmNAsW3zjalGY0BCRB8TSk9jQNQaS5jqV2NAZfF2HYtgY0D4x6KiK2ljQImezifMcWNAGnX6rGx6Y0CsSyYyDYNjQD4iUreti2NAz/h9PE6UY0Biz6nB7pxjQPOl1UaPpWNAhXwBzC+uY0AXUy1R0LZjQKgpWdZwv2NAOgCFWxHIY0DN1rDgsdBjQF2t3GVS2WNA8IMI6/LhY0CCWjRwk+pjQBIxYPUz82NApQeMetT7Y0A23rf/dARkQMi044QVDWRAWosPCrYVZEDsYTuPVh5kQH04ZxT3JmRAEA+TmZcvZECh5b4eODhkQDO86qPYQGRAxZIWKXlJZEBWaUKuGVJkQOg/bjO6WmRAexaauFpjZEAL7cU9+2tkQJ7D8cKbdGRAL5odSDx9ZEDBcEnN3IVkQFNHdVJ9jmRA5R2h1x2XZEB29Mxcvp9kQAnL+OFeqGRAmqEkZ/+wZEAseFDsn7lkQL1OfHFAwmRATyWo9uDKZEDh+9N7gdNkQHPS/wAi3GRABKkrhsLkZECXf1cLY+1kQChWg5AD9mRAuiyvFaT+ZEBMA9uaRAdlQN7ZBiDlD2VAb7AypYUYZUAAh14qJiFlQJNdiq/GKWVAJDS2NGcyZUC2CuK5BztlQEjhDT+oQ2VA2rc5xEhMZUBrjmVJ6VRlQP1kkc6JXWVAjzu9UypmZUAhEunYym5lQLPoFF5rd2VARb9A4wuAZUDWlWxorIhlQGhsmO1MkWVA+ULEcu2ZZUCMGfD3jaJlQB3wG30uq2VAr8ZHAs+zZUBBnXOHb7xlQNNznwwQxWVAZErLkbDNZUD3IPcWUdZlQIf3Ipzx3mVAGs5OIZLnZUCspHqmMvBlQD17pivT+GVAz1HSsHMBZkBhKP41FApmQPL+Kbu0EmZAhdVVQFUbZkAWrIHF9SNmQKiCrUqWLGZAOlnZzzY1ZkDLLwVV1z1mQF0GMdp3RmZA79xcXxhPZkCAs4jkuFdmQBKKtGlZYGZApWDg7vloZkA1Nwx0mnFmQMgNOPk6emZAWuRjftuCZkDruo8DfItmQH2Ru4gclGZAD2jnDb2cZkCgPhOTXaVmQDMVPxj+rWZAxOtqnZ62ZkBWwpYiP79mQOiYwqffx2ZAeW/uLIDQZkALRhqyINlmQJ4cRjfB4WZALvNxvGHqZkDByZ1BAvNmQFKgycai+2ZA5Hb1S0MEZ0B2TSHR4wxnQAgkTVaEFWdAmfp42yQeZ0As0aRgxSZnQL2n0OVlL2dAT378agY4Z0DhVCjwpkBnQHIrVHVHSWdABAKA+udRZ0CX2Kt/iFpnQCev1wQpY2dAuYUDislrZ0BLXC8PanRnQNwyW5QKfWdAbwmHGauFZ0AA4LKeS45nQJK23iPslmdAJI0KqYyfZ0C2YzYuLahnQEc6YrPNsGdA2BCOOG65Z0Bq57m9DsJnQPy95UKvymdAjZQRyE/TZ0Agaz1N8NtnQLFBadKQ5GdAQxiVVzHtZ0DV7sDc0fVnQGfF7GFy/mdA+JsY5xIHaECLckRssw9oQBtJcPFTGGhArR+cdvQgaEBA9sf7lCloQNDM84A1MmhAY6MfBtY6aED1eUuLdkNoQIZQdxAXTGhAGCejlbdUaECq/c4aWF1oQDvU+p/4ZWhAzqomJZluaEBfgVKqOXdoQPFXfi/af2hAgy6qtHqIaEAUBdY5G5FoQKbbAb+7mWhAObItRFyiaEDJiFnJ/KpoQFxfhU6ds2hA7TWx0z28aEB/DN1Y3sRoQBHjCN5+zWhAo7k0Yx/WaEA0kGDov95oQMdmjG1g52hAWD248gDwaEDqE+R3ofhoQHzqD/1BAWlADcE7guIJaUCfl2cHgxJpQDJuk4wjG2lAwkS/EcQjaUBVG+uWZCxpQObxFhwFNWlAeMhCoaU9aUAKn24mRkZpQJt1mqvmTmlALUzGMIdXaUC/IvK1J2BpQFH5HTvIaGlA4s9JwGhxaUB0pnVFCXppQAZ9ocqpgmlAmFPNT0qLaUApKvnU6pNpQLsAJVqLnGlATddQ3yulaUDgrXxkzK1pQHCEqOlstmlAA1vUbg2/aUCVMQD0rcdpQCYILHlO0GlAuN5X/u7YaUBKtYODj+FpQNuLrwgw6mlAbWLbjdDyaUD/OAcTcftpQJAPM5gRBGpAIuZeHbIMakC0vIqiUhVqQEWTtifzHWpA2WnirJMmakBpQA4yNC9qQPwWOrfUN2pAju1lPHVAakAfxJHBFUlqQLGavUa2UWpAQ3Hpy1ZaakDURxVR92JqQGYeQdaXa2pA+PRsWzh0akCJy5jg2HxqQBuixGV5hWpArXjw6hmOakA+TxxwupZqQNAlSPVan2pAYvxzevunakDz0p//m7BqQIepy4Q8uWpAF4D3Cd3BakCqViOPfcpqQDotTxQe02pAzQN7mb7bakBf2qYeX+RqQPGw0qP/7GpAgof+KKD1akAUXiquQP5qQKY0VjPhBmtANwuCuIEPa0DJ4a09IhhrQFu42cLCIGtA7I4FSGMpa0B+ZTHNAzJrQBA8XVKkOmtAoxKJ10RDa0Az6bRc5UtrQMa/4OGFVGtAWJYMZyZda0DqbDjsxmVrQHtDZHFnbmtADRqQ9gd3a0Cf8Lt7qH9rQDDH5wBJiGtAwp0ThumQa0BUdD8LiplrQOVKa5AqomtAdyGXFcuqa0AJ+MKaa7NrQJrO7h8MvGtALKUapazEa0C+e0YqTc1rQFFScq/t1WtA4SieNI7ea0B0/8m5LudrQAXW9T7P72tAmKwhxG/4a0Apg01JEAFsQLtZec6wCWxASzClU1ESbEDeBtHY8RpsQG/d/F2SI2xAArQo4zIsbECSilRo0zRsQCVhgO1zPWxAtzeschRGbEBJDtj3tE5sQNrkA31VV2xAbLsvAvZfbED+kVuHlmhsQI9ohww3cWxAIT+zkdd5bECzFd8WeIJsQETsCpwYi2xA1sI2IbmTbEBomWKmWZxsQPlvjiv6pGxAi0a6sJqtbEAdHeY1O7ZsQLDzEbvbvmxAQMo9QHzHbEDToGnFHNBsQGN3lUq92GxA903Bz13hbECIJO1U/ulsQBj7GNqe8mxArNFEXz/7bEA9qHDk3wNtQM9+nGmADG1AYVXI7iAVbUD0K/RzwR1tQIQCIPlhJm1AFtlLfgIvbUCnr3cDozdtQDuGo4hDQG1AzFzPDeRIbUBcM/uShFFtQO4JJxglWm1AgeBSncVibUATt34iZmttQKWNqqcGdG1ANmTWLKd8bUDGOgKyR4VtQFoRLjfojW1A6+dZvIiWbUB9voVBKZ9tQA+VscbJp21AomvdS2qwbUAyQgnRCrltQMQYNVarwW1AVe9g20vKbUDpxYxg7NJtQHqcuOWM221ACnPkai3kbUCcSRDwzextQC8gPHVu9W1AwfZn+g7+bUBTzZN/rwZuQOOjvwRQD25AdnrrifAXbkAIURcPkSBuQJknQ5QxKW5AK/5uGdIxbkC+1JqecjpuQE6rxiMTQ25A4IHyqLNLbkByWB4uVFRuQAUvSrP0XG5AlwV2OJVlbkAn3KG9NW5uQLiyzULWdm5ATIn5x3Z/bkDdXyVNF4huQG82UdK3kG5AAQ19V1iZbkCS46jc+KFuQCS61GGZqm5AtpAA5zmzbkBHZyxs2rtuQNk9WPF6xG5AbBSEdhvNbkD86q/7u9VuQI7B24Bc3m5AIJgHBv3mbkCzbjOLne9uQEVFXxA++G5A1RuLld4Ab0Bm8rYafwlvQPrI4p8fEm9Ai58OJcAab0AddjqqYCNvQK1MZi8BLG9AQCOStKE0b0DS+b05Qj1vQGTQ6b7iRW9A9aYVRINOb0CJfUHJI1dvQBlUbU7EX29AqiqZ02Rob0A8AcVYBXFvQM/X8N2leW9AYa4cY0aCb0DxhEjo5opvQINbdG2Hk29AFjKg8iecb0CoCMx3yKRvQDnf9/xorW9Ay7Ujggm2b0BdjE8Hqr5vQO5ie4xKx29AgDmnEevPb0ASENOWi9hvQKPm/hss4W9AN70qoczpb0DHk1YmbfJvQFhqgqsN+29AdSBXGNcBcEC/C+1aJwZwQAj3gp13CnBAUOIY4McOcECYza4iGBNwQOK4RGVoF3BAK6Tap7gbcEB0j3DqCCBwQLx6Bi1ZJHBABWacb6kocEBNUTKy+SxwQJc8yPRJMXBA4CdeN5o1cEAoE/R56jlwQHH+ibw6PnBAuukf/4pCcEAD1bVB20ZwQEzAS4QrS3BAlavhxntPcEDdlncJzFNwQCeCDUwcWHBAb22jjmxccEC4WDnRvGBwQAFEzxMNZXBASy9lVl1pcECTGvuYrW1wQNwFkdv9cXBAJPEmHk52cEBu3LxgnnpwQLfHUqPufnBA/7Lo5T6DcEBInn4oj4dwQJGJFGvfi3BA2nSqrS+QcEAjYEDwf5RwQGtL1jLQmHBAtTZsdSCdcED+IQK4cKFwQEYNmPrApXBAj/gtPRGqcEDZ48N/Ya5wQCHPWcKxsnBAarrvBAK3cECzpYVHUrtwQPyQG4qiv3BARXyxzPLDcECNZ0cPQ8hwQNZS3VGTzHBAID5zlOPQcEBoKQnXM9VwQA==\",\"dtype\":\"float64\",\"shape\":[1001]},\"y\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[1001]}},\"selected\":{\"id\":\"1658\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"1657\",\"type\":\"UnionRenderers\"}},\"id\":\"1608\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"overlay\":{\"id\":\"1601\",\"type\":\"BoxAnnotation\"}},\"id\":\"1595\",\"type\":\"BoxZoomTool\"},{\"attributes\":{\"plot\":null,\"text\":\"\"},\"id\":\"1651\",\"type\":\"Title\"},{\"attributes\":{},\"id\":\"1594\",\"type\":\"WheelZoomTool\"},{\"attributes\":{},\"id\":\"1657\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"1658\",\"type\":\"Selection\"},{\"attributes\":{\"line_color\":\"crimson\",\"line_width\":3,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1614\",\"type\":\"Line\"},{\"attributes\":{\"callback\":null,\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[1001]},\"y\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"shape\":[1001]}},\"selected\":{\"id\":\"1660\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"1659\",\"type\":\"UnionRenderers\"}},\"id\":\"1613\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"1660\",\"type\":\"Selection\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"#1f77b4\",\"line_width\":3,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1610\",\"type\":\"Line\"},{\"attributes\":{\"data_source\":{\"id\":\"1608\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"1609\",\"type\":\"Line\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"1610\",\"type\":\"Line\"},\"selection_glyph\":null,\"view\":{\"id\":\"1612\",\"type\":\"CDSView\"}},\"id\":\"1611\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"callback\":null},\"id\":\"1577\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"1581\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1596\",\"type\":\"SaveTool\"},{\"attributes\":{\"bottom_units\":\"screen\",\"fill_alpha\":{\"value\":0.5},\"fill_color\":{\"value\":\"lightgrey\"},\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":{\"value\":1.0},\"line_color\":{\"value\":\"black\"},\"line_dash\":[4,4],\"line_width\":{\"value\":2},\"plot\":null,\"render_mode\":\"css\",\"right_units\":\"screen\",\"top_units\":\"screen\"},\"id\":\"1601\",\"type\":\"BoxAnnotation\"},{\"attributes\":{},\"id\":\"1589\",\"type\":\"BasicTicker\"},{\"attributes\":{\"source\":{\"id\":\"1608\",\"type\":\"ColumnDataSource\"}},\"id\":\"1612\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"1579\",\"type\":\"LinearScale\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"#1f77b4\",\"line_width\":3,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1615\",\"type\":\"Line\"},{\"attributes\":{\"data_source\":{\"id\":\"1613\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"1614\",\"type\":\"Line\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"1615\",\"type\":\"Line\"},\"selection_glyph\":null,\"view\":{\"id\":\"1617\",\"type\":\"CDSView\"}},\"id\":\"1616\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1593\",\"type\":\"PanTool\"},{\"attributes\":{\"plot\":{\"id\":\"1574\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"1584\",\"type\":\"BasicTicker\"}},\"id\":\"1587\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1584\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"1598\",\"type\":\"HelpTool\"},{\"attributes\":{\"axis_label\":\"time (min)\",\"formatter\":{\"id\":\"1653\",\"type\":\"BasicTickFormatter\"},\"plot\":{\"id\":\"1574\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"1584\",\"type\":\"BasicTicker\"}},\"id\":\"1583\",\"type\":\"LinearAxis\"},{\"attributes\":{\"source\":{\"id\":\"1613\",\"type\":\"ColumnDataSource\"}},\"id\":\"1617\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"1659\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"1597\",\"type\":\"ResetTool\"},{\"attributes\":{\"axis_label\":\"flag. length (\\u00b5m)\",\"formatter\":{\"id\":\"1655\",\"type\":\"BasicTickFormatter\"},\"plot\":{\"id\":\"1574\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"1589\",\"type\":\"BasicTicker\"}},\"id\":\"1588\",\"type\":\"LinearAxis\"},{\"attributes\":{\"dimension\":1,\"plot\":{\"id\":\"1574\",\"subtype\":\"Figure\",\"type\":\"Plot\"},\"ticker\":{\"id\":\"1589\",\"type\":\"BasicTicker\"}},\"id\":\"1592\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1655\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"active_drag\":\"auto\",\"active_inspect\":\"auto\",\"active_multi\":null,\"active_scroll\":\"auto\",\"active_tap\":\"auto\",\"tools\":[{\"id\":\"1593\",\"type\":\"PanTool\"},{\"id\":\"1594\",\"type\":\"WheelZoomTool\"},{\"id\":\"1595\",\"type\":\"BoxZoomTool\"},{\"id\":\"1596\",\"type\":\"SaveTool\"},{\"id\":\"1597\",\"type\":\"ResetTool\"},{\"id\":\"1598\",\"type\":\"HelpTool\"}]},\"id\":\"1599\",\"type\":\"Toolbar\"},{\"attributes\":{\"line_color\":\"#1f77b4\",\"line_width\":3,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1609\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"1653\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"callback\":null},\"id\":\"1575\",\"type\":\"DataRange1d\"}],\"root_ids\":[\"1574\"]},\"title\":\"Bokeh Application\",\"version\":\"1.0.1\"}};\n", " var render_items = [{\"docid\":\"7de4c320-bf05-47e6-af93-3794138635d9\",\"roots\":{\"1574\":\"dfd68acb-1a34-45e7-a1f6-c3d264567f91\"}}];\n", " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", "\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " var attempts = 0;\n", " var timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " clearInterval(timer);\n", " }\n", " attempts++;\n", " if (attempts > 100) {\n", " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", " clearInterval(timer);\n", " }\n", " }, 10, root)\n", " }\n", "})(window);" ], "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "1574" } }, "output_type": "display_data" } ], "source": [ "# Make plot of solution\n", "p = bokeh.plotting.figure(plot_width=650,\n", " plot_height=350,\n", " x_axis_label='time (min)',\n", " y_axis_label='flag. length (µm)')\n", "\n", "t_plot = t * beta / alpha**2 * new_n_tot\n", "p.line(t_plot, x[:,0] * gamma * new_n_tot, line_width=3)\n", "p.line(t_plot, x[:,1] * gamma * new_n_tot, line_width=3, color='crimson')\n", "bokeh.io.show(p);" ] } ], "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.0" } }, "nbformat": 4, "nbformat_minor": 2 }