{ "cells": [ { "cell_type": "markdown", "id": "2d370b6f-34c7-4238-ba07-3c1e630f9735", "metadata": {}, "source": [ "# efficiency" ] }, { "cell_type": "markdown", "id": "d8f72162-6707-4d66-8d8b-0a571d5332d8", "metadata": { "tags": [] }, "source": [ "In a perfect PCR reaction, the amount of product should double with each additional reaction cycle. In reality, primers often deviate considerably from perfect doubling. This deviation causes problems for qPCR analysis, as an assumption of comparing Ct values between primer sets is that the amplification curves have approximately the same shape during their logarithmic phases. As such, verifying that primers amplify approximately exponentially is an important part of qPCR experimentation. `efficiency()` allows a user to easily convert Ct values associated with a standard curve to efficiency values for tested primers. \n", "\n", "The following section provides a detailed explanation of efficiency testing. To jump directly to the usage of `efficiency()`, jump to \"Using namer to get a dataframe for efficiency\"." ] }, { "cell_type": "markdown", "id": "c89b7cb9-9e0e-4762-b65e-8605c795c811", "metadata": {}, "source": [ "## What is efficiency?" ] }, { "cell_type": "markdown", "id": "bca247cf-3337-4faf-8114-03b2fa1bb391", "metadata": {}, "source": [ "Efficiency is the most common metric used to determine whether primers are properly amplifying exponentially. It is calculated from a standard curve. For each two-fold dilution in the standard curve, the Ct value should increase by 1. In other words, when Ct values are plotted against $log_2(dilution)$, the absolute value of the slope should be 1. Efficiency is calculated by converting the slope to the fraction or percentage of product amplified. \n", "\n", "If E > 1, the amount of PCR product is more than doubling each PCR cycle. This is often due to primer-dimers or other issues with multiple amplicons. If E < 1, the PCR product is doubling more slowly than once per PCR cycle. This could be due to primer secondary structure, non-optimal melting temperature, primer saturation, or difficult templates. In general, E-values between 0.9 and 1.1 are acceptable. \n", "\n", "To test the primers over a large enough concentration range, each dilution should be at least a factor of two, and three to five dilutions should be used. For certain targets, the reverse transcription reaction conditions and dilution factors may need to be adjusted to keep the highest Ct values under 30. Additionally, optimal primer concentrations may vary, but in general a final concentration between 0.5-1.0µM gives good results.\n", "\n", "`efficiency()` uses linear regression to determine the equation of the line of best fit, then uses the following equation to calculate efficiency:\n", "\n", "$$\n", "E = 2^{- 1/slope} - 1\n", "$$\n", "\n", "To explain this, remember that the slope represents the change in $Ct$ over the change in $log_2(dilution)$. Note that dilution in this case represents fraction of stock concentration (e.g. 1 volume of template plus 3 volumes diluent yields a dilution of $\\frac{1}{4}$). We'll label dilution as $d$:\n", "\n", "$$\n", "slope = \\frac{\\Delta Ct}{\\Delta log_2{d}}\n", "$$\n", "\n", "Note that $\\Delta Ct$ in this equation is not the same as the $\\Delta Ct$ in differential gene expression. Substituting this into the efficiency equation yields:\n", "\n", "\\begin{align}\n", "E &= 2^{\\frac{-1}{slope}} - 1 \\\\\n", "&= 2^{\\frac{-1}{\\Delta Ct / \\Delta log_2{d}}} - 1 \\\\\n", "&= 2^{\\frac{- \\Delta log_2{d}}{\\Delta Ct}} - 1 \\\\\n", "&= \\left( 2^{\\Delta log_2{d}} \\right)^{-1/\\Delta Ct} - 1\\\\\n", "&= d^{-1/ \\Delta Ct} - 1\n", "\\end{align}\n", "\n", "Let's examine what happens if we have a perfect PCR reaction:\n", "\n", "\\begin{align}\n", "E &= 0.5^{-1 / 1} - 1 \\\\\n", "&= 2 - 1 \\\\\n", "& = 1 \\\\\n", "\\end{align}\n", "\n", "As expected, this yields 100% efficiency or $E = 1$. We can back-calculate to see how an efficiency value of 1.1 would affect Ct:\n", "\n", "\\begin{align}\n", "1.1 &= 0.5^{-1 / \\Delta Ct} - 1 \\\\\n", "2.1 &= 0.5^{-1 / \\Delta Ct} \\\\\n", "log_0.5{2.1} &= \\frac{-1}{\\Delta Ct} \\\\\n", "\\Delta Ct &= \\frac{-1}{log_0.5{2.1}} \\\\\n", "\\Delta Ct &\\approx 0.93 \\\\\n", "\\end{align}\n", "\n", "We can see that although the template concentration dropped by half, the $Ct$ value only increased by 0.93. This means that the amount of PCR product is more than doubling each cycle.\n", "\n", "The mathematics underlying methods such as $\\Delta \\Delta Ct$ differential gene expression analysis assume that the efficiencies of all primers involved are approximately 1. As such, validating primer efficiency is essential for accurately interpreting qPCR results." ] }, { "cell_type": "markdown", "id": "3d4fa7e0-7af1-4099-bb4b-ac0c88dd3a68", "metadata": {}, "source": [ "## Using namer to get a dataframe for efficiency" ] }, { "cell_type": "markdown", "id": "a4d1b894-4b8c-4ba0-ad7c-2840fe969f22", "metadata": {}, "source": [ "For this example, we will just look at data from a Lightcycler 480 formatted as `namer()` anticipates. The `namer()` documentation has details on how to use the function for other instruments and dilution arrangements. " ] }, { "cell_type": "code", "execution_count": 1, "id": "88c70240-b26e-42e9-b209-56a46ea29912", "metadata": { "tags": [] }, "outputs": [], "source": [ "import equipt" ] }, { "cell_type": "code", "execution_count": 2, "id": "d9e2cdc2-b486-43be-b8c8-594ebb4453e7", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
PosCpPrimerNameNamePrim
0A117.51Fus (112734868c1)mESC total cDNA_20mESC total cDNA_20Fus (112734868c1)
1A217.54Fus (112734868c1)mESC total cDNA_20mESC total cDNA_20Fus (112734868c1)
2A317.55Fus (112734868c1)mESC total cDNA_20mESC total cDNA_20Fus (112734868c1)
3A418.49Fus (112734868c1)mESC total cDNA_40mESC total cDNA_40Fus (112734868c1)
4A518.52Fus (112734868c1)mESC total cDNA_40mESC total cDNA_40Fus (112734868c1)
5A618.54Fus (112734868c1)mESC total cDNA_40mESC total cDNA_40Fus (112734868c1)
\n", "
" ], "text/plain": [ " Pos Cp Primer Name \\\n", "0 A1 17.51 Fus (112734868c1) mESC total cDNA_20 \n", "1 A2 17.54 Fus (112734868c1) mESC total cDNA_20 \n", "2 A3 17.55 Fus (112734868c1) mESC total cDNA_20 \n", "3 A4 18.49 Fus (112734868c1) mESC total cDNA_40 \n", "4 A5 18.52 Fus (112734868c1) mESC total cDNA_40 \n", "5 A6 18.54 Fus (112734868c1) mESC total cDNA_40 \n", "\n", " NamePrim \n", "0 mESC total cDNA_20Fus (112734868c1) \n", "1 mESC total cDNA_20Fus (112734868c1) \n", "2 mESC total cDNA_20Fus (112734868c1) \n", "3 mESC total cDNA_40Fus (112734868c1) \n", "4 mESC total cDNA_40Fus (112734868c1) \n", "5 mESC total cDNA_40Fus (112734868c1) " ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "primers = ['Fus (112734868c1)',\n", " 'Fus (15029724a1)',\n", " 'Ewsr1 (6679715a1)',\n", " 'Ewsr1 (88853580c2)',\n", " 'Taf15 (141803447c1)',\n", " 'Taf15 (141803447c2)',\n", " 'Tsix exon4']\n", "\n", "samples = ['mESC total cDNA']\n", "\n", "reps = 3\n", "\n", "config = 'line'\n", "\n", "kwargs = {'with_dil':samples,\n", " 'dil_series':[20,40,80,160],\n", " 'dil_rest':None} \n", "\n", "df = equipt.namer('data/22.11.22_PrimerCurve_Ct.csv',\n", " primers,\n", " samples,\n", " reps,\n", " config,\n", " **kwargs)\n", "\n", "df.iloc[:6]" ] }, { "cell_type": "markdown", "id": "861e21e0-ce4b-4753-9346-9600f5e709be", "metadata": {}, "source": [ " We can now see that the 'Name' column has the sample name and the dilution factor separated by an underscore. If a user plans to write their own script to label dilutions, it is critical that samples are labeled in this way." ] }, { "cell_type": "markdown", "id": "41b9d2af-cdb0-40dd-8213-a8a165b45698", "metadata": {}, "source": [ "## Using efficiency" ] }, { "cell_type": "code", "execution_count": 3, "id": "728e511a-68d2-42f1-bf37-d237f2adbbc0", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "\n", "
\n", " \n", " Loading BokehJS ...\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function now() {\n", " return new Date();\n", " }\n", "\n", " const force = true;\n", "\n", " if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n", " root._bokeh_onload_callbacks = [];\n", " root._bokeh_is_loading = undefined;\n", " }\n", "\n", "const JS_MIME_TYPE = 'application/javascript';\n", " const HTML_MIME_TYPE = 'text/html';\n", " const EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n", " const CLASS_NAME = 'output_bokeh rendered_html';\n", "\n", " /**\n", " * Render data to the DOM node\n", " */\n", " function render(props, node) {\n", " const script = document.createElement(\"script\");\n", " node.appendChild(script);\n", " }\n", "\n", " /**\n", " * Handle when an output is cleared or removed\n", " */\n", " function handleClearOutput(event, handle) {\n", " const cell = handle.cell;\n", "\n", " const id = cell.output_area._bokeh_element_id;\n", " const server_id = cell.output_area._bokeh_server_id;\n", " // Clean up Bokeh references\n", " if (id != null && id in Bokeh.index) {\n", " Bokeh.index[id].model.document.clear();\n", " delete Bokeh.index[id];\n", " }\n", "\n", " if (server_id !== undefined) {\n", " // Clean up Bokeh references\n", " const cmd_clean = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n", " cell.notebook.kernel.execute(cmd_clean, {\n", " iopub: {\n", " output: function(msg) {\n", " const id = msg.content.text.trim();\n", " if (id in Bokeh.index) {\n", " Bokeh.index[id].model.document.clear();\n", " delete Bokeh.index[id];\n", " }\n", " }\n", " }\n", " });\n", " // Destroy server and session\n", " const cmd_destroy = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n", " cell.notebook.kernel.execute(cmd_destroy);\n", " }\n", " }\n", "\n", " /**\n", " * Handle when a new output is added\n", " */\n", " function handleAddOutput(event, handle) {\n", " const output_area = handle.output_area;\n", " const output = handle.output;\n", "\n", " // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n", " if ((output.output_type != \"display_data\") || (!Object.prototype.hasOwnProperty.call(output.data, EXEC_MIME_TYPE))) {\n", " return\n", " }\n", "\n", " const toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n", "\n", " if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n", " toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n", " // store reference to embed id on output_area\n", " output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n", " }\n", " if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n", " const bk_div = document.createElement(\"div\");\n", " bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n", " const script_attrs = bk_div.children[0].attributes;\n", " for (let i = 0; i < script_attrs.length; i++) {\n", " toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n", " toinsert[toinsert.length - 1].firstChild.textContent = bk_div.children[0].textContent\n", " }\n", " // store reference to server id on output_area\n", " output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n", " }\n", " }\n", "\n", " function register_renderer(events, OutputArea) {\n", "\n", " function append_mime(data, metadata, element) {\n", " // create a DOM node to render to\n", " const toinsert = this.create_output_subarea(\n", " metadata,\n", " CLASS_NAME,\n", " EXEC_MIME_TYPE\n", " );\n", " this.keyboard_manager.register_events(toinsert);\n", " // Render to node\n", " const props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n", " render(props, toinsert[toinsert.length - 1]);\n", " element.append(toinsert);\n", " return toinsert\n", " }\n", "\n", " /* Handle when an output is cleared or removed */\n", " events.on('clear_output.CodeCell', handleClearOutput);\n", " events.on('delete.Cell', handleClearOutput);\n", "\n", " /* Handle when a new output is added */\n", " events.on('output_added.OutputArea', handleAddOutput);\n", "\n", " /**\n", " * Register the mime type and append_mime function with output_area\n", " */\n", " OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n", " /* Is output safe? */\n", " safe: true,\n", " /* Index of renderer in `output_area.display_order` */\n", " index: 0\n", " });\n", " }\n", "\n", " // register the mime type if in Jupyter Notebook environment and previously unregistered\n", " if (root.Jupyter !== undefined) {\n", " const events = require('base/js/events');\n", " const OutputArea = require('notebook/js/outputarea').OutputArea;\n", "\n", " if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n", " register_renderer(events, OutputArea);\n", " }\n", " }\n", " if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n", " root._bokeh_timeout = Date.now() + 5000;\n", " root._bokeh_failed_load = false;\n", " }\n", "\n", " const NB_LOAD_WARNING = {'data': {'text/html':\n", " \"
\\n\"+\n", " \"

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

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

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

\\n\"+\n \"\\n\"+\n \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"
\"}};\n\n function display_loaded() {\n const el = document.getElementById(\"aea5c3ea-075f-4a46-8e9f-de4c2c825a2c\");\n if (el != null) {\n el.textContent = \"BokehJS is loading...\";\n }\n if (root.Bokeh !== undefined) {\n if (el != null) {\n el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(display_loaded, 100)\n }\n }\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls == null || js_urls.length === 0) {\n run_callbacks();\n return null;\n }\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = css_urls.length + js_urls.length;\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n\n function on_error(url) {\n console.error(\"failed to load \" + url);\n }\n\n for (let i = 0; i < css_urls.length; i++) {\n const url = css_urls[i];\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n }\n\n for (let i = 0; i < js_urls.length; i++) {\n const url = js_urls[i];\n const element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n };\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.1.1.min.js\"];\n const css_urls = [];\n\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {\n }\n ];\n\n function run_inline_js() {\n if (root.Bokeh !== undefined || force === true) {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\nif (force === true) {\n display_loaded();\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n } else if (force !== true) {\n const cell = $(document.getElementById(\"aea5c3ea-075f-4a46-8e9f-de4c2c825a2c\")).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\n }\n }\n\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(css_urls, js_urls, function() {\n console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));" }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from bokeh.layouts import gridplot\n", "import bokeh.io\n", "\n", "bokeh.io.output_notebook()" ] }, { "cell_type": "markdown", "id": "55774c94-8ffa-4bac-ae0f-f092f4e87658", "metadata": {}, "source": [ "`efficiency()` takes three parameters and two optional keyword arguments. Their documentation is reproduced here:\n", "\n", " Params\n", " ______\n", " \n", " ct_data : a dataframe\n", " Output of namer().\n", " \n", " with_dil : list of strings\n", " List of samples that have dilution series. Generally has only one value,\n", " but in specific cases multiple samples may have curves.\n", " \n", " returnmodel : Bool\n", " Whether to return a dataframe containing the linear regression model. \n", " Default False\n", " \n", " **kwargs : dictionary\n", " \n", " thresh : float\n", " The acceptable standard deviation of replicate well Ct values. \n", " averager() is used to identify wells to drop.\n", " \n", " reps : int\n", " Number of replicate wells loaded per sample.\n", " \n", "It returns either two or three outputs depending on the value of returnmodel, as specified in the documentation:\n", "\n", " Returns\n", " _______\n", " \n", " plot_dict : a dictionary\n", " A dictionary in which the keys are samples and the value is a list of\n", " Bokeh plots for each primer tested.\n", " \n", " eff_df : a dataframe\n", " A dataframe containing the efficiency values and R^2 statistic\n", " calculated for each sample-primer pair. \n", " \n", " model_df : a dataframe\n", " Only returned if returnmodel == True. A dataframe containing the\n", " intercept and slope of the linear model for each sample-primer pair.\n", "\n", "Using the dataframe generated above, we can easily calculate efficiency values:" ] }, { "cell_type": "code", "execution_count": 4, "id": "02c0cab7-fb1b-47f3-ae38-dadcc71bf6af", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
NamePrimerEfficiencyRsquared
0mESC total cDNAEwsr1 (6679715a1)0.9530.934628
1mESC total cDNAEwsr1 (88853580c2)0.9760.934442
2mESC total cDNAFus (112734868c1)0.9520.921493
3mESC total cDNAFus (15029724a1)0.9970.932829
4mESC total cDNATaf15 (141803447c1)1.0230.925023
5mESC total cDNATaf15 (141803447c2)1.0000.933382
6mESC total cDNATsix exon41.1080.929611
\n", "
" ], "text/plain": [ " Name Primer Efficiency Rsquared\n", "0 mESC total cDNA Ewsr1 (6679715a1) 0.953 0.934628\n", "1 mESC total cDNA Ewsr1 (88853580c2) 0.976 0.934442\n", "2 mESC total cDNA Fus (112734868c1) 0.952 0.921493\n", "3 mESC total cDNA Fus (15029724a1) 0.997 0.932829\n", "4 mESC total cDNA Taf15 (141803447c1) 1.023 0.925023\n", "5 mESC total cDNA Taf15 (141803447c2) 1.000 0.933382\n", "6 mESC total cDNA Tsix exon4 1.108 0.929611" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "eff_kwargs = {'thresh':0.1,\n", " 'reps':3}\n", "\n", "plot_dict, eff_df = equipt.efficiency(df,\n", " samples,\n", " returnmodel=False,\n", " **eff_kwargs)\n", "\n", "eff_df" ] }, { "cell_type": "markdown", "id": "32d631e3-1dda-45f3-96c9-75c93052d2a1", "metadata": {}, "source": [ "Immediately we can see most of the primers have acceptable efficiency values, but Tsix exon4 is a bit high." ] }, { "cell_type": "markdown", "id": "d36d6248-f717-432e-a559-496a06889db2", "metadata": {}, "source": [ "## Standard curve visualization with efficiency" ] }, { "cell_type": "markdown", "id": "a613896f-addf-4361-9bba-92e90e094c82", "metadata": {}, "source": [ "Having calculated the efficiency values, we noticed that two of our primer sets appear to have unacceptable values. Looking at the plots of the standard curve can give insights on what might be going wrong with those primers. `efficiency()` returns a dictionary that uses the sample names as keys and a list of Bokeh plots as values for easy visualization. Here are all the plots laid out in a gridplot:" ] }, { "cell_type": "code", "execution_count": 5, "id": "87f97872-7e62-4c0a-a636-becdb6de5823", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function embed_document(root) {\n", " const docs_json = {\"d15731b3-333a-49ab-8244-72bd6300b466\":{\"version\":\"3.1.1\",\"title\":\"Bokeh Application\",\"defs\":[],\"roots\":[{\"type\":\"object\",\"name\":\"GridPlot\",\"id\":\"p1603\",\"attributes\":{\"rows\":null,\"cols\":null,\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p1602\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"ToolProxy\",\"id\":\"p1596\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p1033\"},{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p1098\"},{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p1163\"},{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p1228\"},{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p1293\"},{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p1358\"},{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p1423\"}]}},{\"type\":\"object\",\"name\":\"ToolProxy\",\"id\":\"p1597\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p1034\"},{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p1099\"},{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p1164\"},{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p1229\"},{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p1294\"},{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p1359\"},{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p1424\"}]}},{\"type\":\"object\",\"name\":\"ToolProxy\",\"id\":\"p1598\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"BoxZoomTool\",\"id\":\"p1035\",\"attributes\":{\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p1036\",\"attributes\":{\"syncable\":false,\"level\":\"overlay\",\"visible\":false,\"left_units\":\"canvas\",\"right_units\":\"canvas\",\"bottom_units\":\"canvas\",\"top_units\":\"canvas\",\"line_color\":\"black\",\"line_alpha\":1.0,\"line_width\":2,\"line_dash\":[4,4],\"fill_color\":\"lightgrey\",\"fill_alpha\":0.5}}}},{\"type\":\"object\",\"name\":\"BoxZoomTool\",\"id\":\"p1100\",\"attributes\":{\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p1101\",\"attributes\":{\"syncable\":false,\"level\":\"overlay\",\"visible\":false,\"left_units\":\"canvas\",\"right_units\":\"canvas\",\"bottom_units\":\"canvas\",\"top_units\":\"canvas\",\"line_color\":\"black\",\"line_alpha\":1.0,\"line_width\":2,\"line_dash\":[4,4],\"fill_color\":\"lightgrey\",\"fill_alpha\":0.5}}}},{\"type\":\"object\",\"name\":\"BoxZoomTool\",\"id\":\"p1165\",\"attributes\":{\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p1166\",\"attributes\":{\"syncable\":false,\"level\":\"overlay\",\"visible\":false,\"left_units\":\"canvas\",\"right_units\":\"canvas\",\"bottom_units\":\"canvas\",\"top_units\":\"canvas\",\"line_color\":\"black\",\"line_alpha\":1.0,\"line_width\":2,\"line_dash\":[4,4],\"fill_color\":\"lightgrey\",\"fill_alpha\":0.5}}}},{\"type\":\"object\",\"name\":\"BoxZoomTool\",\"id\":\"p1230\",\"attributes\":{\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p1231\",\"attributes\":{\"syncable\":false,\"level\":\"overlay\",\"visible\":false,\"left_units\":\"canvas\",\"right_units\":\"canvas\",\"bottom_units\":\"canvas\",\"top_units\":\"canvas\",\"line_color\":\"black\",\"line_alpha\":1.0,\"line_width\":2,\"line_dash\":[4,4],\"fill_color\":\"lightgrey\",\"fill_alpha\":0.5}}}},{\"type\":\"object\",\"name\":\"BoxZoomTool\",\"id\":\"p1295\",\"attributes\":{\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p1296\",\"attributes\":{\"syncable\":false,\"level\":\"overlay\",\"visible\":false,\"left_units\":\"canvas\",\"right_units\":\"canvas\",\"bottom_units\":\"canvas\",\"top_units\":\"canvas\",\"line_color\":\"black\",\"line_alpha\":1.0,\"line_width\":2,\"line_dash\":[4,4],\"fill_color\":\"lightgrey\",\"fill_alpha\":0.5}}}},{\"type\":\"object\",\"name\":\"BoxZoomTool\",\"id\":\"p1360\",\"attributes\":{\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p1361\",\"attributes\":{\"syncable\":false,\"level\":\"overlay\",\"visible\":false,\"left_units\":\"canvas\",\"right_units\":\"canvas\",\"bottom_units\":\"canvas\",\"top_units\":\"canvas\",\"line_color\":\"black\",\"line_alpha\":1.0,\"line_width\":2,\"line_dash\":[4,4],\"fill_color\":\"lightgrey\",\"fill_alpha\":0.5}}}},{\"type\":\"object\",\"name\":\"BoxZoomTool\",\"id\":\"p1425\",\"attributes\":{\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p1426\",\"attributes\":{\"syncable\":false,\"level\":\"overlay\",\"visible\":false,\"left_units\":\"canvas\",\"right_units\":\"canvas\",\"bottom_units\":\"canvas\",\"top_units\":\"canvas\",\"line_color\":\"black\",\"line_alpha\":1.0,\"line_width\":2,\"line_dash\":[4,4],\"fill_color\":\"lightgrey\",\"fill_alpha\":0.5}}}}]}},{\"type\":\"object\",\"name\":\"SaveTool\",\"id\":\"p1599\"},{\"type\":\"object\",\"name\":\"ToolProxy\",\"id\":\"p1600\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"ResetTool\",\"id\":\"p1038\"},{\"type\":\"object\",\"name\":\"ResetTool\",\"id\":\"p1103\"},{\"type\":\"object\",\"name\":\"ResetTool\",\"id\":\"p1168\"},{\"type\":\"object\",\"name\":\"ResetTool\",\"id\":\"p1233\"},{\"type\":\"object\",\"name\":\"ResetTool\",\"id\":\"p1298\"},{\"type\":\"object\",\"name\":\"ResetTool\",\"id\":\"p1363\"},{\"type\":\"object\",\"name\":\"ResetTool\",\"id\":\"p1428\"}]}},{\"type\":\"object\",\"name\":\"ToolProxy\",\"id\":\"p1601\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"HelpTool\",\"id\":\"p1039\"},{\"type\":\"object\",\"name\":\"HelpTool\",\"id\":\"p1104\"},{\"type\":\"object\",\"name\":\"HelpTool\",\"id\":\"p1169\"},{\"type\":\"object\",\"name\":\"HelpTool\",\"id\":\"p1234\"},{\"type\":\"object\",\"name\":\"HelpTool\",\"id\":\"p1299\"},{\"type\":\"object\",\"name\":\"HelpTool\",\"id\":\"p1364\"},{\"type\":\"object\",\"name\":\"HelpTool\",\"id\":\"p1429\"}]}}]}},\"children\":[[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p1001\",\"attributes\":{\"width\":400,\"height\":400,\"x_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1002\"},\"y_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1003\"},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1015\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1017\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p1004\",\"attributes\":{\"text\":\"mESC total cDNA Ewsr1 (6679715a1)\"}},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1054\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1048\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1049\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1050\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"udG8hKdJEcC50byEp0kRwLnRvISnSRHAudG8hKdJFcC50byEp0kVwLnRvISnSRXAudG8hKdJGcC50byEp0kZwLnRvISnSRnAudG8hKdJHcC50byEp0kdwLnRvISnSR3A\"},\"shape\":[12],\"dtype\":\"float64\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"H4XrUbjeMkCuR+F6FO4yQKRwPQrX4zJAmpmZmZnZM0ApXI/C9egzQDMzMzMz8zNAKVyPwvXoNEB7FK5H4fo0QHsUrkfh+jRAexSuR+H6NUA9CtejcP01QIXrUbgeBTZA\"},\"shape\":[12],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1055\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1056\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1051\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1052\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1053\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1063\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1057\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1058\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1059\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"udG8hKdJEcDQLjFW7WASwOiLpSczeBPA/+gZ+XiPFMAWRo7KvqYVwC6jApwEvhbARQB3bUrVF8BcXes+kOwYwHO6XxDWAxrAihfU4RsbG8CidEizYTIcwLnRvISnSR3A\"},\"shape\":[12],\"dtype\":\"float64\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"sLmQNKXiMkCefEgw7iozQI0/ACw3czNAfAK4J4C7M0BqxW8jyQM0QFmIJx8STDRASEvfGluUNEA2DpcWpNw0QCTRThLtJDVAE5QGDjZtNUACV74Jf7U1QPAZdgXI/TVA\"},\"shape\":[12],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1064\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1065\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1060\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b4\"}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1061\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b4\",\"line_alpha\":0.1}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1062\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b4\",\"line_alpha\":0.2}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p1007\",\"attributes\":{\"tools\":[{\"id\":\"p1033\"},{\"id\":\"p1034\"},{\"id\":\"p1035\"},{\"type\":\"object\",\"name\":\"SaveTool\",\"id\":\"p1037\"},{\"id\":\"p1038\"},{\"id\":\"p1039\"}]}},\"toolbar_location\":null,\"left\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1026\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1029\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1028\"},\"axis_label\":\"Ct\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1027\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1019\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1022\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1021\"},\"axis_label\":\"Log2Dil\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1020\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1025\",\"attributes\":{\"axis\":{\"id\":\"p1019\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1032\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p1026\"}}}]}},0,0],[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p1066\",\"attributes\":{\"width\":400,\"height\":400,\"x_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1067\"},\"y_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1068\"},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1080\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1082\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p1069\",\"attributes\":{\"text\":\"mESC total cDNA Ewsr1 (88853580c2)\"}},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1119\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1113\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1114\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1115\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"udG8hKdJEcC50byEp0kRwLnRvISnSRHAudG8hKdJFcC50byEp0kVwLnRvISnSRXAudG8hKdJGcC50byEp0kZwLnRvISnSRnAudG8hKdJHcC50byEp0kdwLnRvISnSR3A\"},\"shape\":[12],\"dtype\":\"float64\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"rkfhehTuMUC4HoXrUfgxQDMzMzMz8zFAZmZmZmbmMkBmZmZmZuYyQDMzMzMz8zJAZmZmZmbmM0D2KFyPwvUzQHsUrkfh+jNAexSuR+H6NED2KFyPwvU0QI/C9ShcDzVA\"},\"shape\":[12],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1120\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1121\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1116\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1117\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1118\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1128\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1122\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1123\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1124\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"udG8hKdJEcDQLjFW7WASwOiLpSczeBPA/+gZ+XiPFMAWRo7KvqYVwC6jApwEvhbARQB3bUrVF8BcXes+kOwYwHO6XxDWAxrAihfU4RsbG8CidEizYTIcwLnRvISnSR3A\"},\"shape\":[12],\"dtype\":\"float64\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"f9xrLiTtMUAg3KlbNzQyQMHb54hKezJAYdsltl3CMkAC22PjcAkzQKPaoRCEUDNAQ9rfPZeXM0Dk2R1rqt4zQITZW5i9JTRAJdmZxdBsNEDG2Nfy47M0QGbYFSD3+jRA\"},\"shape\":[12],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1129\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1130\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1125\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b4\"}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1126\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b4\",\"line_alpha\":0.1}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1127\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b4\",\"line_alpha\":0.2}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p1072\",\"attributes\":{\"tools\":[{\"id\":\"p1098\"},{\"id\":\"p1099\"},{\"id\":\"p1100\"},{\"type\":\"object\",\"name\":\"SaveTool\",\"id\":\"p1102\"},{\"id\":\"p1103\"},{\"id\":\"p1104\"}]}},\"toolbar_location\":null,\"left\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1091\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1094\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1093\"},\"axis_label\":\"Ct\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1092\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1084\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1087\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1086\"},\"axis_label\":\"Log2Dil\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1085\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1090\",\"attributes\":{\"axis\":{\"id\":\"p1084\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1097\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p1091\"}}}]}},0,1],[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p1131\",\"attributes\":{\"width\":400,\"height\":400,\"x_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1132\"},\"y_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1133\"},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1145\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1147\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p1134\",\"attributes\":{\"text\":\"mESC total cDNA Fus (112734868c1)\"}},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1184\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1178\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1179\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1180\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"udG8hKdJEcC50byEp0kRwLnRvISnSRHAudG8hKdJFcC50byEp0kVwLnRvISnSRXAudG8hKdJGcC50byEp0kZwLnRvISnSRnAudG8hKdJHcC50byEp0kdwA==\"},\"shape\":[11],\"dtype\":\"float64\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"w/UoXI+CMUAK16NwPYoxQM3MzMzMjDFAPQrXo3B9MkCF61G4HoUyQArXo3A9ijJASOF6FK6HM0DXo3A9CpczQNejcD0KlzNApHA9CtejNEBmZmZmZqY0QA==\"},\"shape\":[11],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1185\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1186\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1181\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1182\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1183\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1193\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1187\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1188\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1189\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"udG8hKdJEcDsBPC32nwSwCA4I+sNsBPAUmtWHkHjFMCGnolRdBYWwLnRvISnSRfA7ATwt9p8GMAgOCPrDbAZwFNrVh5B4xrAhp6JUXQWHMC50byEp0kdwA==\"},\"shape\":[11],\"dtype\":\"float64\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"2mrwHIGCMUBafg/WFNIxQNqRLo+oITJAWqVNSDxxMkDauGwB0MAyQFrMi7pjEDNA2t+qc/dfM0Bb88ksi68zQNsG6eUe/zNAWxoIn7JONEDbLSdYRp40QA==\"},\"shape\":[11],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1194\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1195\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1190\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b4\"}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1191\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b4\",\"line_alpha\":0.1}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1192\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b4\",\"line_alpha\":0.2}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p1137\",\"attributes\":{\"tools\":[{\"id\":\"p1163\"},{\"id\":\"p1164\"},{\"id\":\"p1165\"},{\"type\":\"object\",\"name\":\"SaveTool\",\"id\":\"p1167\"},{\"id\":\"p1168\"},{\"id\":\"p1169\"}]}},\"toolbar_location\":null,\"left\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1156\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1159\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1158\"},\"axis_label\":\"Ct\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1157\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1149\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1152\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1151\"},\"axis_label\":\"Log2Dil\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1150\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1155\",\"attributes\":{\"axis\":{\"id\":\"p1149\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1162\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p1156\"}}}]}},1,0],[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p1196\",\"attributes\":{\"width\":400,\"height\":400,\"x_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1197\"},\"y_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1198\"},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1210\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1212\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p1199\",\"attributes\":{\"text\":\"mESC total cDNA Fus (15029724a1)\"}},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1249\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1243\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1244\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1245\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"udG8hKdJEcC50byEp0kRwLnRvISnSRHAudG8hKdJFcC50byEp0kVwLnRvISnSRXAudG8hKdJGcC50byEp0kZwLnRvISnSRnAudG8hKdJHcC50byEp0kdwLnRvISnSR3A\"},\"shape\":[12],\"dtype\":\"float64\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"MzMzMzOzMUD2KFyPwrUxQHE9CtejsDFAZmZmZmamMkCkcD0K16MyQPYoXI/CtTJAZmZmZmamM0D2KFyPwrUzQDMzMzMzszNA7FG4HoWrNEBxPQrXo7A0QD0K16NwvTRA\"},\"shape\":[12],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1250\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1251\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1246\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1247\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1248\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1258\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1252\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1253\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1254\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"udG8hKdJEcDQLjFW7WASwOiLpSczeBPA/+gZ+XiPFMAWRo7KvqYVwC6jApwEvhbARQB3bUrVF8BcXes+kOwYwHO6XxDWAxrAihfU4RsbG8CidEizYTIcwLnRvISnSR3A\"},\"shape\":[12],\"dtype\":\"float64\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"fIZdAXKvMUDoDPA0Z/UxQFWTgmhcOzJAwRkVnFGBMkAuoKfPRscyQJomOgM8DTNABq3MNjFTM0ByM19qJpkzQN+58Z0b3zNAS0CE0RAlNEC4xhYFBms0QCRNqTj7sDRA\"},\"shape\":[12],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1259\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1260\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1255\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b4\"}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1256\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b4\",\"line_alpha\":0.1}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1257\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b4\",\"line_alpha\":0.2}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p1202\",\"attributes\":{\"tools\":[{\"id\":\"p1228\"},{\"id\":\"p1229\"},{\"id\":\"p1230\"},{\"type\":\"object\",\"name\":\"SaveTool\",\"id\":\"p1232\"},{\"id\":\"p1233\"},{\"id\":\"p1234\"}]}},\"toolbar_location\":null,\"left\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1221\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1224\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1223\"},\"axis_label\":\"Ct\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1222\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1214\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1217\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1216\"},\"axis_label\":\"Log2Dil\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1215\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1220\",\"attributes\":{\"axis\":{\"id\":\"p1214\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1227\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p1221\"}}}]}},1,1],[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p1261\",\"attributes\":{\"width\":400,\"height\":400,\"x_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1262\"},\"y_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1263\"},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1275\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1277\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p1264\",\"attributes\":{\"text\":\"mESC total cDNA Taf15 (141803447c1)\"}},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1314\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1308\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1309\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1310\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"udG8hKdJEcC50byEp0kRwLnRvISnSRHAudG8hKdJFcC50byEp0kVwLnRvISnSRXAudG8hKdJGcC50byEp0kZwLnRvISnSRnAudG8hKdJHcC50byEp0kdwLnRvISnSR3A\"},\"shape\":[12],\"dtype\":\"float64\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"4XoUrkchM0DXo3A9ChczQM3MzMzMDDNASOF6FK4HNEDD9ShcjwI0QM3MzMzMDDRAzczMzMwMNUCamZmZmRk1QBSuR+F6FDVASOF6FK4HNkDD9ShcjwI2QIXrUbgeBTZA\"},\"shape\":[12],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1315\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1316\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1311\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1312\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1313\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1323\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1317\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1318\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1319\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"udG8hKdJEcDQLjFW7WASwOiLpSczeBPA/+gZ+XiPFMAWRo7KvqYVwC6jApwEvhbARQB3bUrVF8BcXes+kOwYwHO6XxDWAxrAihfU4RsbG8CidEizYTIcwLnRvISnSR3A\"},\"shape\":[12],\"dtype\":\"float64\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"YJ6ofyMUM0DrqSYF0VgzQHa1pIp+nTNAAsEiECziM0CMzKCV2SY0QBjYHhuHazRAo+OcoDSwNEAu7xom4vQ0QLn6mKuPOTVARAYXMT1+NUDPEZW26sI1QFodEzyYBzZA\"},\"shape\":[12],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1324\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1325\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1320\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b4\"}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1321\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b4\",\"line_alpha\":0.1}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1322\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b4\",\"line_alpha\":0.2}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p1267\",\"attributes\":{\"tools\":[{\"id\":\"p1293\"},{\"id\":\"p1294\"},{\"id\":\"p1295\"},{\"type\":\"object\",\"name\":\"SaveTool\",\"id\":\"p1297\"},{\"id\":\"p1298\"},{\"id\":\"p1299\"}]}},\"toolbar_location\":null,\"left\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1286\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1289\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1288\"},\"axis_label\":\"Ct\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1287\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1279\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1282\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1281\"},\"axis_label\":\"Log2Dil\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1280\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1285\",\"attributes\":{\"axis\":{\"id\":\"p1279\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1292\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p1286\"}}}]}},2,0],[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p1326\",\"attributes\":{\"width\":400,\"height\":400,\"x_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1327\"},\"y_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1328\"},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1340\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1342\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p1329\",\"attributes\":{\"text\":\"mESC total cDNA Taf15 (141803447c2)\"}},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1379\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1373\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1374\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1375\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"udG8hKdJEcC50byEp0kRwLnRvISnSRHAudG8hKdJFcC50byEp0kVwLnRvISnSRXAudG8hKdJGcC50byEp0kZwLnRvISnSRnAudG8hKdJHcC50byEp0kdwLnRvISnSR3A\"},\"shape\":[12],\"dtype\":\"float64\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"pHA9CtfjMkCkcD0K1+MyQGZmZmZm5jJA16NwPQrXM0CkcD0K1+MzQJqZmZmZ2TNAmpmZmZnZNEApXI/C9eg0QGZmZmZm5jRAFK5H4XrUNUAfhetRuN41QDMzMzMz8zVA\"},\"shape\":[12],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1380\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1381\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1376\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1377\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1378\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1388\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1382\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1383\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1384\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"udG8hKdJEcDQLjFW7WASwOiLpSczeBPA/+gZ+XiPFMAWRo7KvqYVwC6jApwEvhbARQB3bUrVF8BcXes+kOwYwHO6XxDWAxrAihfU4RsbG8CidEizYTIcwLnRvISnSR3A\"},\"shape\":[12],\"dtype\":\"float64\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"lYqzD5/hMkBUD92OaiczQBSUBg42bTNA0xgwjQGzM0CSnVkMzfgzQFIig4uYPjRAEaesCmSENEDQK9aJL8o0QJCw/wj7DzVATzUpiMZVNUAOulIHkps1QM4+fIZd4TVA\"},\"shape\":[12],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1389\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1390\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1385\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b4\"}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1386\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b4\",\"line_alpha\":0.1}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1387\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b4\",\"line_alpha\":0.2}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p1332\",\"attributes\":{\"tools\":[{\"id\":\"p1358\"},{\"id\":\"p1359\"},{\"id\":\"p1360\"},{\"type\":\"object\",\"name\":\"SaveTool\",\"id\":\"p1362\"},{\"id\":\"p1363\"},{\"id\":\"p1364\"}]}},\"toolbar_location\":null,\"left\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1351\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1354\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1353\"},\"axis_label\":\"Ct\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1352\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1344\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1347\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1346\"},\"axis_label\":\"Log2Dil\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1345\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1350\",\"attributes\":{\"axis\":{\"id\":\"p1344\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1357\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p1351\"}}}]}},2,1],[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p1391\",\"attributes\":{\"width\":400,\"height\":400,\"x_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1392\"},\"y_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1393\"},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1405\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1407\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p1394\",\"attributes\":{\"text\":\"mESC total cDNA Tsix exon4\"}},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1444\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1438\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1439\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1440\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"udG8hKdJEcC50byEp0kRwLnRvISnSRHAudG8hKdJFcC50byEp0kVwLnRvISnSRXAudG8hKdJGcC50byEp0kZwLnRvISnSRnAudG8hKdJHcC50byEp0kdwLnRvISnSR3A\"},\"shape\":[12],\"dtype\":\"float64\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"cT0K16MwOUAfhetRuB45QClcj8L1KDlAFK5H4XoUOkDNzMzMzAw6QOxRuB6FKzpAw/UoXI8CO0DXo3A9Chc7QArXo3A9CjtArkfhehTuO0D2KFyPwvU7QK5H4XoU7jtA\"},\"shape\":[12],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1445\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1446\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1441\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1442\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1443\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1453\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1447\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1448\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1449\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"udG8hKdJEcDQLjFW7WASwOiLpSczeBPA/+gZ+XiPFMAWRo7KvqYVwC6jApwEvhbARQB3bUrVF8BcXes+kOwYwHO6XxDWAxrAihfU4RsbG8CidEizYTIcwLnRvISnSR3A\"},\"shape\":[12],\"dtype\":\"float64\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"veZC0pQqOUA4OR4tfWs5QLKL+YdlrDlALN7U4k3tOUCnMLA9Ni46QCKDi5gebzpAnNVm8wawOkAWKEJO7/A6QJF6HanXMTtAC834A8ByO0CGH9ReqLM7QAByr7mQ9DtA\"},\"shape\":[12],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1454\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1455\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1450\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b4\"}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1451\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b4\",\"line_alpha\":0.1}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1452\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b4\",\"line_alpha\":0.2}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p1397\",\"attributes\":{\"tools\":[{\"id\":\"p1423\"},{\"id\":\"p1424\"},{\"id\":\"p1425\"},{\"type\":\"object\",\"name\":\"SaveTool\",\"id\":\"p1427\"},{\"id\":\"p1428\"},{\"id\":\"p1429\"}]}},\"toolbar_location\":null,\"left\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1416\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1419\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1418\"},\"axis_label\":\"Ct\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1417\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1409\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1412\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1411\"},\"axis_label\":\"Log2Dil\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1410\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1415\",\"attributes\":{\"axis\":{\"id\":\"p1409\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1422\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p1416\"}}}]}},3,0]]}}],\"callbacks\":{\"type\":\"map\"}}};\n", " const render_items = [{\"docid\":\"d15731b3-333a-49ab-8244-72bd6300b466\",\"roots\":{\"p1603\":\"a233e1d1-61a3-4000-ad6e-9f8275570725\"},\"root_ids\":[\"p1603\"]}];\n", " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " let attempts = 0;\n", " const timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined) {\n", " clearInterval(timer);\n", " embed_document(root);\n", " } else {\n", " attempts++;\n", " if (attempts > 100) {\n", " clearInterval(timer);\n", " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", " }\n", " }\n", " }, 10, root)\n", " }\n", "})(window);" ], "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "p1603" } }, "output_type": "display_data" } ], "source": [ "eff_gp = gridplot(plot_dict['mESC total cDNA'], ncols=2)\n", "\n", "bokeh.io.show(eff_gp)" ] }, { "cell_type": "markdown", "id": "bca82b6d-08cd-4da1-b22f-1372cf6b4154", "metadata": {}, "source": [ "Just looking at Tsix exon4, we can see that the Ct values are reasonable, the replicate wells cluster closely together, and the threshold filtering applied during the calculation did not exclude any samples:" ] }, { "cell_type": "code", "execution_count": 6, "id": "c706bd4f-b352-49ce-8f3d-1afa2b034819", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function embed_document(root) {\n", " const docs_json = {\"0f542706-b4ca-4194-9380-581b780b705d\":{\"version\":\"3.1.1\",\"title\":\"Bokeh Application\",\"defs\":[],\"roots\":[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p1391\",\"attributes\":{\"width\":400,\"height\":400,\"x_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1392\"},\"y_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1393\"},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1405\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1407\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p1394\",\"attributes\":{\"text\":\"mESC total cDNA Tsix exon4\"}},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1444\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1438\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1439\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1440\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"udG8hKdJEcC50byEp0kRwLnRvISnSRHAudG8hKdJFcC50byEp0kVwLnRvISnSRXAudG8hKdJGcC50byEp0kZwLnRvISnSRnAudG8hKdJHcC50byEp0kdwLnRvISnSR3A\"},\"shape\":[12],\"dtype\":\"float64\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"cT0K16MwOUAfhetRuB45QClcj8L1KDlAFK5H4XoUOkDNzMzMzAw6QOxRuB6FKzpAw/UoXI8CO0DXo3A9Chc7QArXo3A9CjtArkfhehTuO0D2KFyPwvU7QK5H4XoU7jtA\"},\"shape\":[12],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1445\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1446\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1441\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1442\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1443\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1453\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1447\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1448\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1449\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"udG8hKdJEcDQLjFW7WASwOiLpSczeBPA/+gZ+XiPFMAWRo7KvqYVwC6jApwEvhbARQB3bUrVF8BcXes+kOwYwHO6XxDWAxrAihfU4RsbG8CidEizYTIcwLnRvISnSR3A\"},\"shape\":[12],\"dtype\":\"float64\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"veZC0pQqOUA4OR4tfWs5QLKL+YdlrDlALN7U4k3tOUCnMLA9Ni46QCKDi5gebzpAnNVm8wawOkAWKEJO7/A6QJF6HanXMTtAC834A8ByO0CGH9ReqLM7QAByr7mQ9DtA\"},\"shape\":[12],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1454\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1455\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1450\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b4\"}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1451\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b4\",\"line_alpha\":0.1}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1452\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b4\",\"line_alpha\":0.2}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p1397\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p1423\"},{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p1424\"},{\"type\":\"object\",\"name\":\"BoxZoomTool\",\"id\":\"p1425\",\"attributes\":{\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p1426\",\"attributes\":{\"syncable\":false,\"level\":\"overlay\",\"visible\":false,\"left_units\":\"canvas\",\"right_units\":\"canvas\",\"bottom_units\":\"canvas\",\"top_units\":\"canvas\",\"line_color\":\"black\",\"line_alpha\":1.0,\"line_width\":2,\"line_dash\":[4,4],\"fill_color\":\"lightgrey\",\"fill_alpha\":0.5}}}},{\"type\":\"object\",\"name\":\"SaveTool\",\"id\":\"p1427\"},{\"type\":\"object\",\"name\":\"ResetTool\",\"id\":\"p1428\"},{\"type\":\"object\",\"name\":\"HelpTool\",\"id\":\"p1429\"}]}},\"toolbar_location\":null,\"left\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1416\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1419\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1418\"},\"axis_label\":\"Ct\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1417\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1409\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1412\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1411\"},\"axis_label\":\"Log2Dil\",\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1410\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1415\",\"attributes\":{\"axis\":{\"id\":\"p1409\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1422\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p1416\"}}}]}}],\"callbacks\":{\"type\":\"map\"}}};\n", " const render_items = [{\"docid\":\"0f542706-b4ca-4194-9380-581b780b705d\",\"roots\":{\"p1391\":\"a61461ba-dd7e-4fc8-9cdd-4cb10e439880\"},\"root_ids\":[\"p1391\"]}];\n", " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " let attempts = 0;\n", " const timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined) {\n", " clearInterval(timer);\n", " embed_document(root);\n", " } else {\n", " attempts++;\n", " if (attempts > 100) {\n", " clearInterval(timer);\n", " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", " }\n", " }\n", " }, 10, root)\n", " }\n", "})(window);" ], "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "p1391" } }, "output_type": "display_data" } ], "source": [ "bokeh.io.show(plot_dict['mESC total cDNA'][-1])" ] }, { "cell_type": "markdown", "id": "71a89d04-64bf-4e1c-9b28-f3eff8ee9627", "metadata": {}, "source": [ "Since we applied a standard deviation threshold, `efficiency()` called `averager()` to remove poorly replicating wells. These wells can be found in the droppedWells.txt log file:" ] }, { "cell_type": "code", "execution_count": 7, "id": "088e7b5d-3d70-4076-bd0b-ff31821aaf93", "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Outlier Wells Dropped:\n", "mESC total cDNA_160Fus (112734868c1) - 1\n", "\n", "Samples Removed:\n", "\n" ] } ], "source": [ "with open('droppedWells.txt','r') as f:\n", " print(f.read())" ] }, { "cell_type": "markdown", "id": "cbcd25f8-73f0-4758-a577-38b82957cad7", "metadata": {}, "source": [ "One of the Fus (112734868c1) wells was removed at the highest dilution level. This likely indicates a pipetting error and is not a serious cause for concern. No samples were removed entirely, so the full standard curve was analyzed for each primer set." ] }, { "cell_type": "markdown", "id": "417365ed-f97c-4576-9256-5817b1db036b", "metadata": {}, "source": [ "## Returning the linear model" ] }, { "cell_type": "markdown", "id": "de0a6ffc-70b4-4f64-9903-e15652233070", "metadata": {}, "source": [ "Occasionally, we may want to know the exact function that `efficiency()` fit for a given standard curve. This is possible by setting returnmodel to True." ] }, { "cell_type": "code", "execution_count": 8, "id": "59ea7179-6e37-424f-a71f-213241e926b9", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
NamePrimerCoefficientIntercept
0mESC total cDNAEwsr1 (6679715a1)-1.03514.411
1mESC total cDNAEwsr1 (88853580c2)-1.01813.527
2mESC total cDNAFus (112734868c1)-1.03613.032
3mESC total cDNAFus (15029724a1)-1.00213.355
4mESC total cDNATaf15 (141803447c1)-0.98414.827
5mESC total cDNATaf15 (141803447c2)-1.00014.561
6mESC total cDNATsix exon4-0.93021.148
\n", "
" ], "text/plain": [ " Name Primer Coefficient Intercept\n", "0 mESC total cDNA Ewsr1 (6679715a1) -1.035 14.411\n", "1 mESC total cDNA Ewsr1 (88853580c2) -1.018 13.527\n", "2 mESC total cDNA Fus (112734868c1) -1.036 13.032\n", "3 mESC total cDNA Fus (15029724a1) -1.002 13.355\n", "4 mESC total cDNA Taf15 (141803447c1) -0.984 14.827\n", "5 mESC total cDNA Taf15 (141803447c2) -1.000 14.561\n", "6 mESC total cDNA Tsix exon4 -0.930 21.148" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "plot_dict, eff_df, model = equipt.efficiency(df,\n", " samples,\n", " returnmodel=True,\n", " **eff_kwargs)\n", "\n", "model" ] }, { "cell_type": "markdown", "id": "bb7ee7bc-d14d-4950-8043-8bedbf61adc6", "metadata": {}, "source": [ "The model dataframe contains the sample-primer pair as well as the slope and y-intercept of the linear function." ] }, { "cell_type": "code", "execution_count": 9, "id": "a37b0196-45fb-4817-8afc-35a020505d34", "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Python implementation: CPython\n", "Python version : 3.9.17\n", "IPython version : 8.12.0\n", "\n", "bokeh : 3.1.1\n", "equipt : 1.0.0\n", "jupyterlab: 3.6.3\n", "\n" ] } ], "source": [ "%load_ext watermark\n", "%watermark -v -p bokeh,equipt,jupyterlab" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.5" } }, "nbformat": 4, "nbformat_minor": 5 }