From f7275c3c64b2d36039a1c4a05109587b61f58007 Mon Sep 17 00:00:00 2001 From: ahernank Date: Wed, 12 Jun 2024 08:26:37 +0100 Subject: [PATCH 1/5] update install --- docs/ag3/ag3.0.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/ag3/ag3.0.ipynb b/docs/ag3/ag3.0.ipynb index d588184..a4e7ac9 100644 --- a/docs/ag3/ag3.0.ipynb +++ b/docs/ag3/ag3.0.ipynb @@ -110,7 +110,7 @@ }, "outputs": [], "source": [ - "!pip install -q malariagen_data" + "%pip install -q malariagen_data" ] }, { From 633834707a9038a2dfa5e1cdb6d3a0d7814d071b Mon Sep 17 00:00:00 2001 From: ahernank Date: Wed, 12 Jun 2024 08:34:39 +0100 Subject: [PATCH 2/5] wip-af pages --- docs/_toc.yml | 9 + docs/af1/af1.0.ipynb | 637 +++ docs/af1/af1.1.ipynb | 962 ++++ docs/af1/api.md | 3 + docs/af1/cloud.ipynb | 9618 +++++++++++++++++++++++++++++++++++++++ docs/af1/download.ipynb | 829 ++++ 6 files changed, 12058 insertions(+) create mode 100644 docs/af1/af1.0.ipynb create mode 100644 docs/af1/af1.1.ipynb create mode 100644 docs/af1/api.md create mode 100644 docs/af1/cloud.ipynb create mode 100644 docs/af1/download.ipynb diff --git a/docs/_toc.yml b/docs/_toc.yml index d38c317..4782584 100644 --- a/docs/_toc.yml +++ b/docs/_toc.yml @@ -17,6 +17,14 @@ parts: - file: ag3/methods - file: ag3/api - file: ag3/analysis + - caption: Anopheles funestus + chapters: + - file: af1/af1.0 + # - file: af1/af1.1 + - file: af1/cloud + - file: af1/download + - file: af1/methods + - file: af1/api - caption: Anopheles minimus chapters: - file: amin1/intro @@ -27,6 +35,7 @@ parts: - caption: Partners and community chapters: - file: studies-ag1000g + - file: studies-af1.0-consortium - caption: Release notes chapters: - file: release-notes diff --git a/docs/af1/af1.0.ipynb b/docs/af1/af1.0.ipynb new file mode 100644 index 0000000..3779972 --- /dev/null +++ b/docs/af1/af1.0.ipynb @@ -0,0 +1,637 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "LBNBl2exUYWu" + }, + "source": [ + "# Af1.0 (_Anopheles funestus_ Project Phase 1 Data Release)\n", + "\n", + "The [MalariaGEN Vector Observatory Anopheles funestus Genomic Surveillance Project](https://www.malariagen.net/projects/anopheles-funestus-genomic-surveillance-project) is a collaborative project using whole-genome sequencing to enhance the monitoring and surveillance natural populations of mosquitoes in the major African malaria vector *Anopheles funestus* \n", + "\n", + "The `Af1.0` release provides a first baseline understanding of Anopheles funestus genetic diversity and population structure across Africa using 656 whole genome sequenced individuals. Over the coming years, the [MalariaGEN Vector Observatory Anopheles funestus Genomic Surveillance Project](https://www.malariagen.net/projects/anopheles-funestus-genomic-surveillance-project) will continue to carry out further spatiotemporal sampling of _Anopheles funestus_ that builds upon Phase 1.\n", + "\n", + "\n", + "This page provides an introduction to open data resources released as part of the first phase of the Anopheles funestus Genomic Surveillance Project project, known as `Af1.0` for short. We hope the data from `Af1.0` will be a valuable resource for research and surveillance of malaria vectors. If you have any questions about this guide or how to use the data, please [start a new discussion](https://github.com/malariagen/vector-public-data/discussions/new) on the malariagen/vector-open-data repo on GitHub. If you find any bugs, please [raise an issue](https://github.com/malariagen/vector-public-data/issues/new/choose)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "kJqs4cXppk8j" + }, + "source": [ + "## Terms of use\n", + "\n", + "Data from `Af1.0` have been released prior to publication by the Phase 1 Data Release Consortium with the expectation that they will be valuable for many researchers. These data are subject to a publication embargo.\n", + "\n", + "The Af1.0 data release is led by the MalariaGEN Vector Observatory Anopheles funestus Consortium. The Consortium includes researchers who have contributed samples, know-how, analyses, and expertise to the project. The Consortium has released the project data prior to publication with the expectation that they will be valuable for many researchers. In keeping with Fort Lauderdale principles, researchers outside the Consortium may use the data for their own studies, but are expected to allow the Consortium to make the first presentations and to publish the first paper(s) that include global analyses of the data. Researchers inside the Consortium are permitted to evaluate the specific samples they contributed to the project separate from the Global analyses, but are expected to submit publications on these samples at the same time as or after the Global publications are submitted.\n", + "\n", + "If you have any questions about the terms of use, please email support@malariagen.net." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "iNSicUCtpk8j" + }, + "source": [ + "## Partner studies\n", + "\n", + "- [1229-VO-GH-DADZIE](https://www.malariagen.net/network/where-we-work/1229-VO-GH-DADZIE) - _Anopheles funestus_ vector surveillance in Ghana\n", + "- [1230-VO-MULTI-AYALA](https://www.malariagen.net/network/where-we-work/1230-VO-MULTI-AYALA) - ANOSPP screening of _Anopheles_ species and _Plasmodium_ presence in malaria vectors in West-Central Africa\n", + "- [1231-VO-MULTI-WONDJI](https://www.malariagen.net/network/where-we-work/1231-VO-MULTI-WONDJI) - ANOSPP screening of _Anopheles_ species and _Plasmodium_ presence in malaria vectors\n", + "- [1232-VO-KE-OCHOMO](https://www.malariagen.net/network/where-we-work/1232-VO-KE-OCHOMO) - _Anopheles funestus_ vector surveillance in Kenya\n", + "- [1235-VO-MZ-PAAIJMANS](https://www.malariagen.net/network/where-we-work/1235-VO-MZ-PAAIJMANS) - _Anopheles funestus_ vector surveillance in Mozambique\n", + "- [1236-VO-TZ-OKUMU](https://www.malariagen.net/network/where-we-work/1236-VO-TZ-OKUMU) - _Anopheles funestus_ vector surveillance in Tanzania \n", + "- [1240-VO-MULTI-KOEKEMOER](https://www.malariagen.net/network/where-we-work/1240-VO-MULTI-KOEKEMOER) - _Anopheles funestus_ vector surveillance in Mozambique and the Democratic Republic of Congo " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Population sampling\n", + "\n", + "`Af1.0` includes data from 656 individual mosquitoes in 13 countries. The map below provides an overview of the numbers of samples and collection locations." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%pip install -q malariagen_data" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "id": "AnmzLmEgpk8n", + "tags": [ + "remove-input" + ] + }, + "outputs": [ + { + "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\nconst 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 function drop(id) {\n const view = Bokeh.index.get_by_id(id)\n if (view != null) {\n view.model.document.clear()\n Bokeh.index.delete(view)\n }\n }\n\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\n // Clean up Bokeh references\n if (id != null) {\n drop(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 drop(id)\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 \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n \"
  • use INLINE resources instead, as so:
  • \\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(null);\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.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.3.0.min.js\"];\n const css_urls = [];\n\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {\n }\n ];\n\n function run_inline_js() {\n if (root.Bokeh !== undefined || force === true) {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\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(null)).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": "" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": "(function(root) {\n function embed_document(root) {\n const docs_json = {\"296c3457-1718-4a37-9272-57ee31251c76\":{\"version\":\"3.3.0\",\"title\":\"Bokeh Application\",\"roots\":[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p1496\",\"attributes\":{\"width\":800,\"height\":550,\"x_range\":{\"type\":\"object\",\"name\":\"Range1d\",\"id\":\"p1506\",\"attributes\":{\"start\":-3000000.0,\"end\":6000000.0}},\"y_range\":{\"type\":\"object\",\"name\":\"Range1d\",\"id\":\"p1507\",\"attributes\":{\"start\":-3500000.0,\"end\":2000000.0}},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1508\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1509\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p1499\",\"attributes\":{\"text\":\"Af1.0 Sampling Locations\"}},\"renderers\":[{\"type\":\"object\",\"name\":\"TileRenderer\",\"id\":\"p1529\",\"attributes\":{\"tile_source\":{\"type\":\"object\",\"name\":\"WMTSTileSource\",\"id\":\"p1528\",\"attributes\":{\"url\":\"https://a.basemaps.cartocdn.com/light_all/{z}/{x}/{y}@2x.png\",\"max_zoom\":20,\"attribution\":\"© OpenStreetMap contributors © CARTO\"}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1542\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1533\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1534\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1535\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"HwAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Obuasi\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Ghana\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1543\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1544\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1539\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":-180003.61661272336},\"y\":{\"type\":\"value\",\"value\":661642.0272950786},\"radius\":{\"type\":\"value\",\"value\":156335.20609917105},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1531\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1532\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1540\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":-180003.61661272336},\"y\":{\"type\":\"value\",\"value\":661642.0272950786},\"radius\":{\"type\":\"value\",\"value\":156335.20609917105},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1531\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1532\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1541\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":-180003.61661272336},\"y\":{\"type\":\"value\",\"value\":661642.0272950786},\"radius\":{\"type\":\"value\",\"value\":156335.20609917105},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1531\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1532\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1556\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1547\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1548\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1549\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"BgAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Dimabi\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Ghana\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1557\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1558\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1553\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":-120559.00852911526},\"y\":{\"type\":\"value\",\"value\":1053385.9711061884},\"radius\":{\"type\":\"value\",\"value\":99532.8},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1545\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1546\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1554\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":-120559.00852911526},\"y\":{\"type\":\"value\",\"value\":1053385.9711061884},\"radius\":{\"type\":\"value\",\"value\":99532.8},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1545\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1546\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1555\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":-120559.00852911526},\"y\":{\"type\":\"value\",\"value\":1053385.9711061884},\"radius\":{\"type\":\"value\",\"value\":99532.8},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1545\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1546\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1570\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1561\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1562\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1563\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"EwAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Gbullung\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Ghana\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1571\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1572\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1567\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":-112321.366210413},\"y\":{\"type\":\"value\",\"value\":1061059.9262004786},\"radius\":{\"type\":\"value\",\"value\":132796.74381095578},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1559\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1560\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1568\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":-112321.366210413},\"y\":{\"type\":\"value\",\"value\":1061059.9262004786},\"radius\":{\"type\":\"value\",\"value\":132796.74381095578},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1559\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1560\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1569\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":-112321.366210413},\"y\":{\"type\":\"value\",\"value\":1061059.9262004786},\"radius\":{\"type\":\"value\",\"value\":132796.74381095578},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1559\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1560\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1584\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1575\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1576\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1577\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"CgAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Gupanarigu\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Ghana\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1585\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1586\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1581\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":-105976.15523519642},\"y\":{\"type\":\"value\",\"value\":1062075.7105529539},\"radius\":{\"type\":\"value\",\"value\":107218.45855800275},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1573\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1574\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1582\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":-105976.15523519642},\"y\":{\"type\":\"value\",\"value\":1062075.7105529539},\"radius\":{\"type\":\"value\",\"value\":107218.45855800275},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1573\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1574\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1583\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":-105976.15523519642},\"y\":{\"type\":\"value\",\"value\":1062075.7105529539},\"radius\":{\"type\":\"value\",\"value\":107218.45855800275},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1573\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1574\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1598\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1589\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1590\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1591\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AQAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Woribogu\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Ghana\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1599\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1600\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1595\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":35733.556544640815},\"y\":{\"type\":\"value\",\"value\":991259.0921946851},\"radius\":{\"type\":\"value\",\"value\":99532.8},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1587\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1588\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1596\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":35733.556544640815},\"y\":{\"type\":\"value\",\"value\":991259.0921946851},\"radius\":{\"type\":\"value\",\"value\":99532.8},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1587\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1588\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1597\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":35733.556544640815},\"y\":{\"type\":\"value\",\"value\":991259.0921946851},\"radius\":{\"type\":\"value\",\"value\":99532.8},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1587\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1588\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1612\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1603\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1604\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1605\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"JQAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Kpome\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Benin\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1613\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1614\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1609\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":244902.87974520188},\"y\":{\"type\":\"value\",\"value\":712026.6560352404},\"radius\":{\"type\":\"value\",\"value\":165832.68555775317},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1601\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1602\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1610\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":244902.87974520188},\"y\":{\"type\":\"value\",\"value\":712026.6560352404},\"radius\":{\"type\":\"value\",\"value\":165832.68555775317},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1601\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1602\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1611\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":244902.87974520188},\"y\":{\"type\":\"value\",\"value\":712026.6560352404},\"radius\":{\"type\":\"value\",\"value\":165832.68555775317},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1601\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1602\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1626\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1617\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1618\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1619\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"KQAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Akaka Remo\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Nigeria\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1627\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1628\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1623\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":413774.54727859783},\"y\":{\"type\":\"value\",\"value\":775574.7398539328},\"radius\":{\"type\":\"value\",\"value\":171605.3584717831},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1615\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1616\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1624\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":413774.54727859783},\"y\":{\"type\":\"value\",\"value\":775574.7398539328},\"radius\":{\"type\":\"value\",\"value\":171605.3584717831},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1615\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1616\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1625\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":413774.54727859783},\"y\":{\"type\":\"value\",\"value\":775574.7398539328},\"radius\":{\"type\":\"value\",\"value\":171605.3584717831},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1615\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1616\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1640\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1631\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1632\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1633\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"LQAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Mibellon\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Cameroon\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1641\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1642\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1637\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":1280174.1441226462},\"y\":{\"type\":\"value\",\"value\":678432.1792110694},\"radius\":{\"type\":\"value\",\"value\":177013.77494857428},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1629\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1630\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1638\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":1280174.1441226462},\"y\":{\"type\":\"value\",\"value\":678432.1792110694},\"radius\":{\"type\":\"value\",\"value\":177013.77494857428},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1629\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1630\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1639\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":1280174.1441226462},\"y\":{\"type\":\"value\",\"value\":678432.1792110694},\"radius\":{\"type\":\"value\",\"value\":177013.77494857428},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1629\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1630\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1654\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1645\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1646\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1647\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"KAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Benguia\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Gabon\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1655\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1656\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1651\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":1501922.569782847},\"y\":{\"type\":\"value\",\"value\":-181809.3446907341},\"radius\":{\"type\":\"value\",\"value\":170198.6939053824},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1643\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1644\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1652\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":1501922.569782847},\"y\":{\"type\":\"value\",\"value\":-181809.3446907341},\"radius\":{\"type\":\"value\",\"value\":170198.6939053824},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1643\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1644\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1653\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":1501922.569782847},\"y\":{\"type\":\"value\",\"value\":-181809.3446907341},\"radius\":{\"type\":\"value\",\"value\":170198.6939053824},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1643\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1644\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1668\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1659\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1660\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1661\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"IgAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Kinshasa\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Democratic Republic of the Congo\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1669\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1670\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1665\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":1704635.3625173983},\"y\":{\"type\":\"value\",\"value\":-482137.9534045483},\"radius\":{\"type\":\"value\",\"value\":161223.81674709579},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1657\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1658\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1666\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":1704635.3625173983},\"y\":{\"type\":\"value\",\"value\":-482137.9534045483},\"radius\":{\"type\":\"value\",\"value\":161223.81674709579},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1657\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1658\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1667\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":1704635.3625173983},\"y\":{\"type\":\"value\",\"value\":-482137.9534045483},\"radius\":{\"type\":\"value\",\"value\":161223.81674709579},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1657\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1658\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1682\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1673\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1674\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1675\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"CgAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Bangui\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Central African Republic\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1683\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1684\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1679\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":2071433.0846812348},\"y\":{\"type\":\"value\",\"value\":487720.02304763725},\"radius\":{\"type\":\"value\",\"value\":107218.45855800275},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1671\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1672\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1680\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":2071433.0846812348},\"y\":{\"type\":\"value\",\"value\":487720.02304763725},\"radius\":{\"type\":\"value\",\"value\":107218.45855800275},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1671\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1672\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1681\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":2071433.0846812348},\"y\":{\"type\":\"value\",\"value\":487720.02304763725},\"radius\":{\"type\":\"value\",\"value\":107218.45855800275},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1671\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1672\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1696\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1687\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1688\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1689\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"KwAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Watsa Moke\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Democratic Republic of the Congo\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1697\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1698\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1693\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3289268.3139596474},\"y\":{\"type\":\"value\",\"value\":344590.0190058456},\"radius\":{\"type\":\"value\",\"value\":174351.50923242987},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1685\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1686\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1694\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3289268.3139596474},\"y\":{\"type\":\"value\",\"value\":344590.0190058456},\"radius\":{\"type\":\"value\",\"value\":174351.50923242987},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1685\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1686\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1695\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3289268.3139596474},\"y\":{\"type\":\"value\",\"value\":344590.0190058456},\"radius\":{\"type\":\"value\",\"value\":174351.50923242987},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1685\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1686\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1710\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1701\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1702\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1703\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"KwAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Katete\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Zambia\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1711\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1712\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1707\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3547418.2131092492},\"y\":{\"type\":\"value\",\"value\":-1595220.0593262194},\"radius\":{\"type\":\"value\",\"value\":174351.50923242987},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1699\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1700\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1708\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3547418.2131092492},\"y\":{\"type\":\"value\",\"value\":-1595220.0593262194},\"radius\":{\"type\":\"value\",\"value\":174351.50923242987},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1699\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1700\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1709\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3547418.2131092492},\"y\":{\"type\":\"value\",\"value\":-1595220.0593262194},\"radius\":{\"type\":\"value\",\"value\":174351.50923242987},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1699\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1700\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1724\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1715\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1716\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1717\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"FgAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Palmeira\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Mozambique\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1725\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1726\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1721\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3659405.6208472815},\"y\":{\"type\":\"value\",\"value\":-2907098.27835128},\"radius\":{\"type\":\"value\",\"value\":139447.4101451283},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1713\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1714\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1722\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3659405.6208472815},\"y\":{\"type\":\"value\",\"value\":-2907098.27835128},\"radius\":{\"type\":\"value\",\"value\":139447.4101451283},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1713\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1714\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1723\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3659405.6208472815},\"y\":{\"type\":\"value\",\"value\":-2907098.27835128},\"radius\":{\"type\":\"value\",\"value\":139447.4101451283},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1713\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1714\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1738\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1729\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1730\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1731\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"TAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Palmeiras\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Mozambique\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1739\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1740\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1735\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3659850.8988104556},\"y\":{\"type\":\"value\",\"value\":-2908329.170311803},\"radius\":{\"type\":\"value\",\"value\":210801.69082346273},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1727\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1728\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1736\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3659850.8988104556},\"y\":{\"type\":\"value\",\"value\":-2908329.170311803},\"radius\":{\"type\":\"value\",\"value\":210801.69082346273},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1727\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1728\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1737\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3659850.8988104556},\"y\":{\"type\":\"value\",\"value\":-2908329.170311803},\"radius\":{\"type\":\"value\",\"value\":210801.69082346273},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1727\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1728\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1752\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1743\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1744\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1745\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"MQAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Tororo\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Uganda\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1753\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1754\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1749\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3794102.204707143},\"y\":{\"type\":\"value\",\"value\":83492.00248384959},\"radius\":{\"type\":\"value\",\"value\":182110.4716872872},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1741\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1742\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1750\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3794102.204707143},\"y\":{\"type\":\"value\",\"value\":83492.00248384959},\"radius\":{\"type\":\"value\",\"value\":182110.4716872872},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1741\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1742\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1751\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3794102.204707143},\"y\":{\"type\":\"value\",\"value\":83492.00248384959},\"radius\":{\"type\":\"value\",\"value\":182110.4716872872},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1741\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1742\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1766\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1757\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1758\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1759\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AQAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Nyamilu\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Kenya\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1767\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1768\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1763\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3828388.6078714714},\"y\":{\"type\":\"value\",\"value\":-119564.1351697784},\"radius\":{\"type\":\"value\",\"value\":99532.8},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1755\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1756\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1764\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3828388.6078714714},\"y\":{\"type\":\"value\",\"value\":-119564.1351697784},\"radius\":{\"type\":\"value\",\"value\":99532.8},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1755\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1756\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1765\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3828388.6078714714},\"y\":{\"type\":\"value\",\"value\":-119564.1351697784},\"radius\":{\"type\":\"value\",\"value\":99532.8},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1755\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1756\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1780\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1771\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1772\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1773\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"BQAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Uriri\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Kenya\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1781\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1782\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1777\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3841969.58574825},\"y\":{\"type\":\"value\",\"value\":-105981.03181703556},\"radius\":{\"type\":\"value\",\"value\":99532.8},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1769\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1770\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1778\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3841969.58574825},\"y\":{\"type\":\"value\",\"value\":-105981.03181703556},\"radius\":{\"type\":\"value\",\"value\":99532.8},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1769\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1770\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1779\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3841969.58574825},\"y\":{\"type\":\"value\",\"value\":-105981.03181703556},\"radius\":{\"type\":\"value\",\"value\":99532.8},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1769\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1770\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1794\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1785\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1786\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1787\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"CAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Awendo\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Kenya\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1795\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1796\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1791\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3844195.975564116},\"y\":{\"type\":\"value\",\"value\":-100302.99525658593},\"radius\":{\"type\":\"value\",\"value\":99532.8},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1783\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1784\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1792\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3844195.975564116},\"y\":{\"type\":\"value\",\"value\":-100302.99525658593},\"radius\":{\"type\":\"value\",\"value\":99532.8},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1783\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1784\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1793\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3844195.975564116},\"y\":{\"type\":\"value\",\"value\":-100302.99525658593},\"radius\":{\"type\":\"value\",\"value\":99532.8},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1783\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1784\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1808\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1799\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1800\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1801\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"FQAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Uradi\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Kenya\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1809\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1810\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1805\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3845309.1704720487},\"y\":{\"type\":\"value\",\"value\":109098.42064735989},\"radius\":{\"type\":\"value\",\"value\":137301.7241314534},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1797\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1798\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1806\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3845309.1704720487},\"y\":{\"type\":\"value\",\"value\":109098.42064735989},\"radius\":{\"type\":\"value\",\"value\":137301.7241314534},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1797\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1798\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1807\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3845309.1704720487},\"y\":{\"type\":\"value\",\"value\":109098.42064735989},\"radius\":{\"type\":\"value\",\"value\":137301.7241314534},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1797\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1798\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1822\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1813\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1814\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1815\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"CQAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Sumba\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Kenya\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1823\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1824\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1819\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3851209.103484092},\"y\":{\"type\":\"value\",\"value\":-76366.99526291488},\"radius\":{\"type\":\"value\",\"value\":103518.28357153028},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1811\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1812\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1820\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3851209.103484092},\"y\":{\"type\":\"value\",\"value\":-76366.99526291488},\"radius\":{\"type\":\"value\",\"value\":103518.28357153028},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1811\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1812\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1821\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3851209.103484092},\"y\":{\"type\":\"value\",\"value\":-76366.99526291488},\"radius\":{\"type\":\"value\",\"value\":103518.28357153028},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1811\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1812\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1836\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1827\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1828\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1829\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"EgAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Chikwawa\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Malawi\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1837\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1838\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1833\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3872693.7652071943},\"y\":{\"type\":\"value\",\"value\":-1806691.5452973465},\"radius\":{\"type\":\"value\",\"value\":130424.86452075762},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1825\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1826\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1834\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3872693.7652071943},\"y\":{\"type\":\"value\",\"value\":-1806691.5452973465},\"radius\":{\"type\":\"value\",\"value\":130424.86452075762},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1825\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1826\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1835\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3872693.7652071943},\"y\":{\"type\":\"value\",\"value\":-1806691.5452973465},\"radius\":{\"type\":\"value\",\"value\":130424.86452075762},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1825\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1826\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1850\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1841\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1842\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1843\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"JQAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Ahero\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Kenya\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1851\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1852\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1847\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3887276.6185011133},\"y\":{\"type\":\"value\",\"value\":-19369.621171087503},\"radius\":{\"type\":\"value\",\"value\":165832.68555775317},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1839\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1840\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1848\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3887276.6185011133},\"y\":{\"type\":\"value\",\"value\":-19369.621171087503},\"radius\":{\"type\":\"value\",\"value\":165832.68555775317},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1839\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1840\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1849\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3887276.6185011133},\"y\":{\"type\":\"value\",\"value\":-19369.621171087503},\"radius\":{\"type\":\"value\",\"value\":165832.68555775317},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1839\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1840\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1864\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1855\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1856\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1857\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"CgAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Minepa Village\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Tanzania\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1865\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1866\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1861\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":4083310.241788068},\"y\":{\"type\":\"value\",\"value\":-924163.0301871514},\"radius\":{\"type\":\"value\",\"value\":107218.45855800275},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1853\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1854\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1862\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":4083310.241788068},\"y\":{\"type\":\"value\",\"value\":-924163.0301871514},\"radius\":{\"type\":\"value\",\"value\":107218.45855800275},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1853\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1854\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1863\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":4083310.241788068},\"y\":{\"type\":\"value\",\"value\":-924163.0301871514},\"radius\":{\"type\":\"value\",\"value\":107218.45855800275},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1853\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1854\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1878\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1869\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1870\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1871\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"KAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Motinho\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Mozambique\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1879\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1880\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1875\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":4518903.409262148},\"y\":{\"type\":\"value\",\"value\":-1215214.0015646738},\"radius\":{\"type\":\"value\",\"value\":170198.6939053824},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1867\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1868\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1876\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":4518903.409262148},\"y\":{\"type\":\"value\",\"value\":-1215214.0015646738},\"radius\":{\"type\":\"value\",\"value\":170198.6939053824},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1867\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1868\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1877\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":4518903.409262148},\"y\":{\"type\":\"value\",\"value\":-1215214.0015646738},\"radius\":{\"type\":\"value\",\"value\":170198.6939053824},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1867\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1868\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p1505\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p1520\"},{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p1521\",\"attributes\":{\"renderers\":\"auto\"}},{\"type\":\"object\",\"name\":\"BoxZoomTool\",\"id\":\"p1522\",\"attributes\":{\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p1523\",\"attributes\":{\"syncable\":false,\"level\":\"overlay\",\"visible\":false,\"left_units\":\"canvas\",\"right_units\":\"canvas\",\"top_units\":\"canvas\",\"bottom_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\":\"p1524\"},{\"type\":\"object\",\"name\":\"ResetTool\",\"id\":\"p1525\"},{\"type\":\"object\",\"name\":\"HelpTool\",\"id\":\"p1526\"},{\"type\":\"object\",\"name\":\"HoverTool\",\"id\":\"p1527\",\"attributes\":{\"renderers\":\"auto\",\"tooltips\":\"@location, @country
@n_samples @taxon\"}}]}},\"left\":[{\"type\":\"object\",\"name\":\"MercatorAxis\",\"id\":\"p1515\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"MercatorTicker\",\"id\":\"p1516\",\"attributes\":{\"mantissas\":[1,2,5],\"dimension\":\"lat\"}},\"formatter\":{\"type\":\"object\",\"name\":\"MercatorTickFormatter\",\"id\":\"p1517\",\"attributes\":{\"dimension\":\"lat\"}},\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1518\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"MercatorAxis\",\"id\":\"p1510\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"MercatorTicker\",\"id\":\"p1511\",\"attributes\":{\"mantissas\":[1,2,5],\"dimension\":\"lon\"}},\"formatter\":{\"type\":\"object\",\"name\":\"MercatorTickFormatter\",\"id\":\"p1512\",\"attributes\":{\"dimension\":\"lon\"}},\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1513\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1514\",\"attributes\":{\"axis\":{\"id\":\"p1510\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1519\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p1515\"}}}]}}]}};\n const render_items = [{\"docid\":\"296c3457-1718-4a37-9272-57ee31251c76\",\"roots\":{\"p1496\":\"f43abaaa-1e50-4764-8ab6-757ccc771ad8\"},\"root_ids\":[\"p1496\"]}];\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": "p1496" + } + }, + "output_type": "display_data" + } + ], + "source": [ + "import malariagen_data\n", + "import pandas as pd\n", + "import numpy as np\n", + "import plotly.express as px\n", + "import bokeh.plotting as bkplt\n", + "import bokeh.models as bkmod\n", + "import bokeh.palettes as bkpal\n", + "from datetime import datetime\n", + "\n", + "af1 = malariagen_data.Af1(pre=True)\n", + "taxa = [\n", + " \"gambiae\",\n", + " \"melas\",\n", + " \"coluzzii\",\n", + " \"merus\",\n", + " \"arabiensis\",\n", + " \"quadriannulatus\",\n", + " \"funestus\", \n", + " \"fontenillei\",\n", + " \"gcx1\",\n", + " \"gcx2\",\n", + " \"gcx3\",\n", + " \"gcx4\",\n", + " \"vaneedeni\",\n", + " \"longipalpis\",\n", + " \"parensis\",\n", + " \"minimus\",\n", + " \"unassigned\",\n", + "]\n", + "\n", + "taxon_color = pd.Series(bkpal.Category20[len(taxa)], index=taxa)\n", + "\n", + "def plot_map():\n", + " \n", + " import xyzservices.providers as xyz\n", + " from pyproj import Transformer\n", + " from math import pi\n", + " import bokeh.transform as bktrans\n", + "\n", + " dfs = pd.concat([\n", + " # ag3.sample_metadata()[[\"country\", \"location\", \"longitude\", \"latitude\", \"taxon\"]],\n", + " af1.sample_metadata(sample_query=\"release=='1.0'\")[[\"country\", \"location\", \"longitude\", \"latitude\", \"taxon\"]],\n", + " ])\n", + " \n", + " dfs[\"lon_02d\"] = dfs[\"longitude\"].round(2)\n", + " dfs[\"lat_02d\"] = dfs[\"latitude\"].round(2)\n", + " dfs[\"lon_01d\"] = dfs[\"longitude\"].round(1)\n", + " dfs[\"lat_01d\"] = dfs[\"latitude\"].round(1)\n", + " \n", + " \n", + " transformer = Transformer.from_crs(\"EPSG:4326\", \"EPSG:3857\")\n", + " \n", + " fig = bkplt.figure(\n", + " height=550, \n", + " width=800,\n", + " title=\"Af1.0 Sampling Locations\", \n", + " x_axis_type=\"mercator\",\n", + " y_axis_type=\"mercator\",\n", + " x_range=(-30.0 * 10**5, 60.0 * 10**5),\n", + " y_range=(-35.0 * 10**5, 20.0 * 10**5),\n", + " tooltips=\"@location, @country
@n_samples @taxon\",\n", + " )\n", + " \n", + " #fig.add_tile(xyz.OpenStreetMap.Mapnik, retina=True)\n", + " #fig.add_tile(xyz.Esri.WorldImagery, retina=True)\n", + " fig.add_tile(\"CARTODBPOSITRON_RETINA\", retina=True)\n", + " \n", + " for ((lon, lat, location, country), grp) in dfs.groupby([\"longitude\", \"latitude\", \"location\", \"country\"]):\n", + " x, y = transformer.transform(lat, lon)\n", + " n_samples = len(grp)\n", + " by_taxon = grp.groupby(\"taxon\").size()\n", + " # print(by_taxon)\n", + " data = by_taxon.to_frame().reset_index().rename(columns={0: \"n_samples\"})\n", + " data[\"location\"] = location\n", + " data[\"country\"] = country\n", + " data[\"angle\"] = (data[\"n_samples\"] / n_samples) * 2 * pi\n", + " data[\"color\"] = taxon_color.loc[data[\"taxon\"].tolist()].values\n", + " fig.wedge(\n", + " x=x, \n", + " y=y, \n", + " radius=np.clip(np.cbrt(n_samples) * 0.2*12**5, a_min=0.4*12**5, a_max=None),\n", + " start_angle=bktrans.cumsum(\"angle\", include_zero=True),\n", + " end_angle=bktrans.cumsum(\"angle\"),\n", + " line_color=\"color\",\n", + " line_width=0.5,\n", + " alpha=.9,\n", + " fill_color=\"color\", \n", + " source=data,\n", + " )\n", + " \n", + " bkplt.show(fig)\n", + "\n", + "\n", + "plot_map()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "5RHbe7N6pk8k" + }, + "source": [ + "## Whole-genome sequencing and variant calling\n", + "\n", + "All samples in `Af1.0` have been sequenced individually to high coverage using Illumina technology at the Wellcome Sanger Institute. These sequence data have then been analysed to identify genetic variants such as single nucleotide polymorphisms (SNPs). After variant calling, both the samples and the variants have been through a range of quality control analyses, to ensure the data are of high quality. Both the raw sequence data and the curated variant calls are openly available for download and analysis. \n", + "\n", + "\n", + "For further information about the sequencing and variant calling methods used, please see the [methods page](methods)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "9Hfchko2pk8l" + }, + "source": [ + "## Data hosting\n", + "\n", + "Data from `Af1.0` are hosted by several different services. \n", + "\n", + "Raw sequence reads, sequence read alignments and SNP calls are available for download from the European Nucleotide Archive (ENA). Further information on how to find and download these data is provided in the [data download guide](download).\n", + "\n", + "The SNP data have also been uploaded to Google Cloud, and can be analysed directly within the cloud without having to download or copy any data, including via free interactive computing services such as [MyBinder](https://gke.mybinder.org/) and [Google Colab](https://colab.research.google.com/). Further information about analysing these data in the cloud is provided in the [cloud data access guide](cloud)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "lTJ_EnvOpk8l" + }, + "source": [ + "## Sample sets\n", + "\n", + "The samples included in `Af1.0` have been organised into 8 sample sets. Each of these sample sets corresponds to a set of mosquito specimens from a contributing study. Depending on your objectives, you may want to access data from only specific sample sets, or all sample sets. Here is a list of the sample sets included:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "id": "AnmzLmEgpk8n", + "tags": [ + "remove-input" + ] + }, + "outputs": [ + { + "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\nconst 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 function drop(id) {\n const view = Bokeh.index.get_by_id(id)\n if (view != null) {\n view.model.document.clear()\n Bokeh.index.delete(view)\n }\n }\n\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\n // Clean up Bokeh references\n if (id != null) {\n drop(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 drop(id)\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 \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n \"
  • use INLINE resources instead, as so:
  • \\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(null);\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.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.3.0.min.js\"];\n const css_urls = [];\n\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {\n }\n ];\n\n function run_inline_js() {\n if (root.Bokeh !== undefined || force === true) {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\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(null)).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": "" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import malariagen_data\n", + "af1 = malariagen_data.Af1()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 927 + }, + "id": "qsElasBepk8n", + "outputId": "4bf80a06-c2e8-4d2d-b4a6-99c8c66da7db", + "tags": [ + "remove-input" + ] + }, + "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", + "
study_idsample_count
sample_set
1229-VO-GH-DADZIE-VMF000951229-VO-GH-DADZIE36
1230-VO-GA-CF-AYALA-VMF000451230-VO-MULTI-AYALA50
1231-VO-MULTI-WONDJI-VMF000431231-VO-MULTI-WONDJI320
1232-VO-KE-OCHOMO-VMF000441232-VO-KE-OCHOMO81
1235-VO-MZ-PAAIJMANS-VMF000941235-VO-MZ-PAAIJMANS76
1236-VO-TZ-OKUMU-VMF000901236-VO-TZ-OKUMU10
1240-VO-CD-KOEKEMOER-VMF000991240-VO-MULTI-KOEKEMOER43
1240-VO-MZ-KOEKEMOER-VMF001011240-VO-MULTI-KOEKEMOER40
\n", + "
" + ], + "text/plain": [ + " study_id sample_count\n", + "sample_set \n", + "1229-VO-GH-DADZIE-VMF00095 1229-VO-GH-DADZIE 36\n", + "1230-VO-GA-CF-AYALA-VMF00045 1230-VO-MULTI-AYALA 50\n", + "1231-VO-MULTI-WONDJI-VMF00043 1231-VO-MULTI-WONDJI 320\n", + "1232-VO-KE-OCHOMO-VMF00044 1232-VO-KE-OCHOMO 81\n", + "1235-VO-MZ-PAAIJMANS-VMF00094 1235-VO-MZ-PAAIJMANS 76\n", + "1236-VO-TZ-OKUMU-VMF00090 1236-VO-TZ-OKUMU 10\n", + "1240-VO-CD-KOEKEMOER-VMF00099 1240-VO-MULTI-KOEKEMOER 43\n", + "1240-VO-MZ-KOEKEMOER-VMF00101 1240-VO-MULTI-KOEKEMOER 40" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_sample_sets = af1.sample_sets(release=\"1.0\")\n", + "df_sample_sets[['study_id','sample_set', 'sample_count']].set_index('sample_set')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "yJ16OQ0Hpk8o" + }, + "source": [ + "Here is a more detailed breakdown of the samples contained within each sample set, summarised by country, year of collection, and species:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "a1OMvuTxUWpJ", + "outputId": "9f872334-fd50-4649-990a-df60ea71c12c", + "tags": [ + "remove-input" + ] + }, + "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", + " \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", + "
taxonfunestus
sample_setcountryyear
1229-VO-GH-DADZIE-VMF00095Ghana201736
1230-VO-GA-CF-AYALA-VMF00045Central African Republic201610
Gabon201740
1231-VO-MULTI-WONDJI-VMF00043Benin201437
Cameroon201445
Democratic Republic of the Congo201534
Ghana201431
Malawi201418
Mozambique201622
Nigeria201541
Uganda201449
Zambia201643
1232-VO-KE-OCHOMO-VMF00044Kenya201437
201644
1235-VO-MZ-PAAIJMANS-VMF00094Mozambique201876
1236-VO-TZ-OKUMU-VMF00090Tanzania201710
1240-VO-CD-KOEKEMOER-VMF00099Democratic Republic of the Congo201743
1240-VO-MZ-KOEKEMOER-VMF00101Mozambique201540
\n", + "
" + ], + "text/plain": [ + "taxon funestus\n", + "sample_set country year \n", + "1229-VO-GH-DADZIE-VMF00095 Ghana 2017 36\n", + "1230-VO-GA-CF-AYALA-VMF00045 Central African Republic 2016 10\n", + " Gabon 2017 40\n", + "1231-VO-MULTI-WONDJI-VMF00043 Benin 2014 37\n", + " Cameroon 2014 45\n", + " Democratic Republic of the Congo 2015 34\n", + " Ghana 2014 31\n", + " Malawi 2014 18\n", + " Mozambique 2016 22\n", + " Nigeria 2015 41\n", + " Uganda 2014 49\n", + " Zambia 2016 43\n", + "1232-VO-KE-OCHOMO-VMF00044 Kenya 2014 37\n", + " 2016 44\n", + "1235-VO-MZ-PAAIJMANS-VMF00094 Mozambique 2018 76\n", + "1236-VO-TZ-OKUMU-VMF00090 Tanzania 2017 10\n", + "1240-VO-CD-KOEKEMOER-VMF00099 Democratic Republic of the Congo 2017 43\n", + "1240-VO-MZ-KOEKEMOER-VMF00101 Mozambique 2015 40" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_samples = af1.sample_metadata(sample_sets=\"1.0\")\n", + "df_summary = df_samples.pivot_table(\n", + " index=[\"sample_set\", \"country\", \"year\"], \n", + " columns=[\"taxon\"],\n", + " values=\"sample_id\", \n", + " aggfunc=len,\n", + " fill_value=0)\n", + "df_summary" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "dLiU0ulIpk8p" + }, + "source": [ + "Note that there are also multiple sampling sites represented within some sample sets." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "OToX5vhfpk8p" + }, + "source": [ + "## Further reading\n", + "\n", + "Hopefully this page has provided a useful introduction to the `Af1.0` data resource. If you would like to start working with these data, please visit the [cloud data access guide](cloud) or the [data download guide](download) or continue browsing the other documentation on this site.\n", + "\n", + "If you have any questions about the data and how to use them, please do get in touch by [starting a new discussion](https://github.com/malariagen/vector-data/discussions/new) on the malariagen/vector-data repo on GitHub." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "celltoolbar": "Tags", + "colab": { + "name": "Ag3.0-intro.ipynb", + "provenance": [] + }, + "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.9.10" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/docs/af1/af1.1.ipynb b/docs/af1/af1.1.ipynb new file mode 100644 index 0000000..068e91a --- /dev/null +++ b/docs/af1/af1.1.ipynb @@ -0,0 +1,962 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "LBNBl2exUYWu" + }, + "source": [ + "# Af1.1\n", + "\n", + "The **[Af1.1](af1.1): _Anopheles gambiae_ data resource** contains single nucleotide polymorphism (SNP) calls, copy number variant (CNV) calls and SNP haplotypes from whole-genome sequencing of 1138 mosquitoes.\n", + "\n", + "More information about this release can be found in the [data resource website](https://www.malariagen.net/data/af31-anopheles-funestus-data-resource). \n", + "\n", + "This page provides an introduction to open data resources released as part of `Af1.1`. \n", + "\n", + "If you have any questions about this guide or how to use the data, please [start a new discussion](https://github.com/malariagen/vector-public-data/discussions/new) on the malariagen/vector-open-data repo on GitHub. If you find any bugs, please [raise an issue](https://github.com/malariagen/vector-public-data/issues/new/choose)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "kJqs4cXppk8j" + }, + "source": [ + "## Terms of use\n", + "\n", + "Data from this project will be made publicly available before journal publication. Unless otherwise stated, analyses of project data are ongoing and publications are in preparation by project partners, and it is not permitted to use project data for publication (including any type of communication with the general public) without prior permission from the originating partner studies. \n", + "\n", + "Although malaria is generally an endemic rather than an epidemic disease, and the focus of this project is on surveillance of disease vectors rather than pathogens, our data terms of use build on MalariaGEN's approach to data sharing, and adopt norms which have been established for rapid sharing of pathogen genomic data during disease outbreaks. The primary rationale for this approach is that malaria remains a public health emergency, where ethically appropriate and rapid sharing of genomic surveillance data can help to detect and respond to biological threats such as new forms of insecticide resistance, and to adapt malaria vector control strategies to different settings and changing circumstances.\n", + "\n", + "The publication embargo for all data on this release will expire on the **8th of December 2025**. \n", + "\n", + "If you have any questions about the terms of use, please email [data@malariagen.net](mailto:data@malariagen.net)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "iNSicUCtpk8j" + }, + "source": [ + "## Partner studies\n", + "\n", + "- [1178-VO-UG-LAWNICZAK](https://www.malariagen.net/network/where-we-work/1178-VO-UG-LAWNICZAK) - _Anopheles_ infectivity study\n", + "- [1190-VO-GH-AMENGA-ETEGO](https://www.malariagen.net/network/where-we-work/1190-VO-GH-AMENGA-ETEGO) - Population genetics, parasite diversity and ecology of the major malaria vectors in the Kassena-Nankana Districts of Ghana\n", + "- [1191-VO-MULTI-OLOUGHLIN](https://www.malariagen.net/network/where-we-work/1191-VO-MULTI-OLOUGHLIN) - Target Malaria\n", + "- [1230-VO-MULTI-AYALA](https://www.malariagen.net/network/where-we-work/1230-VO-MULTI-AYALA) - ANOSPP screening of _Anopheles_ species and Plasmodium presence in malaria vectors in West-Central Africa\n", + "- [1236-VO-TZ-OKUMU](https://www.malariagen.net/network/where-we-work/1236-VO-TZ-OKUMU) - _Anopheles funestus_ vector surveillance in Tanzania\n", + "- [1237-VO-BJ-DJOGBENOU](https://www.malariagen.net/network/where-we-work/1237-VO-BJ-DJOGBENOU) - Genomics for African Anopheles Resistance Diagnostics/GAARDian (Benin) \n", + "- [1244-VO-GH-YAWSON](https://www.malariagen.net/network/where-we-work/1244-VO-GH-YAWSON) - Genomics for African Anopheles Resistance Diagnostics/GAARDian (Ghana) \n", + "- [1264-VO-CD-WATSENGAN](https://www.malariagen.net/network/where-we-work/1264-VO-CD-WATSENGA) - PAMCA _Anopheles_ genomics programme - First investigation of genetic diversity in malaria vectors in the Democratic Republic of Congo and the implications for the spread of insecticide resistance\n", + "- [1273-VO-ZM-MULEBA](https://www.malariagen.net/network/where-we-work/1273-VO-ZM-MULEBA) - PAMCA _Anopheles_ genomics programme - Seasonality and impact of vector control interventions on population genetics of _Anopheles funestus_ and _Anopheles gambiae_ malaria vectors in Zambia\n", + "- [1315-VO-NG-OMITOLA](https://www.malariagen.net/network/where-we-work/1315-VO-NG-OMITOLA) - ANOSPP screening of _Anopheles_ species and _Plasmodium_ presence in malaria vectors in Nigeria\n", + "- [1326-VO-UG-KAYONDO](https://www.malariagen.net/network/where-we-work/1326-VO-UG-KAYONDO) - ANOSPP screening of _Anopheles_ species and _Plasmodium_ presence in malaria vectors in Uganda\n", + "\n", + "This release also includes data from one study openly available in the literature: [small-2020-af](https://doi.org/10.1073/pnas.2018142117), and samples from studies ([AG1000G-KE](https://www.malariagen.net/network/where-we-work/ag1000g-ke), [AG1000G-MW](https://www.malariagen.net/network/where-we-work/ag1000g-mw), [AG1000G-TZ](https://www.malariagen.net/network/where-we-work/ag1000g-tz)) part of the [Ag3.0 (Ag1000G phase 3)](https://malariagen.github.io/vector-data/ag3/ag3.0.html) project, which were identified as _Anopheles_ funestus.\n", + "\n", + "\n", + "For full details on the studies in Ag1000G please visit the [Ag1000G partner studies guide](https://malariagen.github.io/vector-data/studies-ag1000g.html)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "5RHbe7N6pk8k" + }, + "source": [ + "## Whole-genome sequencing and variant calling\n", + "\n", + "All samples in `Af1.1` have been sequenced individually to high coverage using Illumina technology at the Wellcome Sanger Institute. These sequence data have then been analysed to identify genetic variants such as single nucleotide polymorphisms (SNPs). After variant calling, both the samples and the variants have been through a range of quality control analyses, to ensure the data are of high quality. Both the raw sequence data and the curated variant calls are openly available for download and analysis. \n", + "\n", + "\n", + "For further information about the sequencing and variant calling methods used, please see the [methods page](methods)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "9Hfchko2pk8l" + }, + "source": [ + "## Data hosting\n", + "\n", + "Data from `Af1.1` are hosted by several different services. \n", + "\n", + "The SNP data have also been uploaded to Google Cloud, and can be analysed directly within the cloud without having to download or copy any data, including via free interactive computing services such as [MyBinder](https://gke.mybinder.org/) and [Google Colab](https://colab.research.google.com/). Further information about analysing these data in the cloud is provided in the [cloud data access guide](cloud)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "lTJ_EnvOpk8l" + }, + "source": [ + "## Sample sets\n", + "\n", + "The samples included in `Af1.1` have been organised into 18 sample sets. \n", + "\n", + "Each sample set corresponds to a set of mosquito specimens from a contributing study. Study details can be found in the partner studies webpages listed above." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "hGA4d7Yrpk8m", + "outputId": "c29827c1-0361-4926-c227-8f6e76c2a497", + "tags": [ + "remove-input" + ] + }, + "outputs": [], + "source": [ + "%pip install -qq malariagen_data" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "id": "AnmzLmEgpk8n", + "tags": [ + "remove-input" + ] + }, + "outputs": [ + { + "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\nconst 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 function drop(id) {\n const view = Bokeh.index.get_by_id(id)\n if (view != null) {\n view.model.document.clear()\n Bokeh.index.delete(view)\n }\n }\n\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\n // Clean up Bokeh references\n if (id != null) {\n drop(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 drop(id)\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 \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n \"
  • use INLINE resources instead, as so:
  • \\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(null);\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.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.3.0.min.js\"];\n const css_urls = [];\n\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {\n }\n ];\n\n function run_inline_js() {\n if (root.Bokeh !== undefined || force === true) {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\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(null)).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": "" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import malariagen_data\n", + "af1 = malariagen_data.Af1()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 927 + }, + "id": "qsElasBepk8n", + "outputId": "4bf80a06-c2e8-4d2d-b4a6-99c8c66da7db", + "tags": [ + "remove-input" + ] + }, + "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", + " \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", + "
sample_setsample_count
study_id
1178-VO-UG-LAWNICZAK1178-VO-UG-LAWNICZAK-VMF000257
1190-VO-GH-AMENGA-ETEGO1190-VO-GH-AMENGA-ETEGO-VMF000131
1190-VO-GH-AMENGA-ETEGO1190-VO-GH-AMENGA-ETEGO-VMF000471
1191-VO-MULTI-OLOUGHLIN1191-VO-MULTI-OLOUGHLIN-VMF001061
1230-VO-MULTI-AYALA1230-VO-MULTI-AYALA-AYDI-GA-210450
1236-VO-TZ-OKUMU1236-VO-TZ-OKUMU-OKFR-TZ-200843
1236-VO-TZ-OKUMU1236-VO-TZ-OKUMU-VMF0024829
1237-VO-BJ-DJOGBENOU1237-VO-BJ-DJOGBENOU-VMF000671
1244-VO-GH-YAWSON1244-VO-GH-YAWSON-VMF001498
1264-VO-CD-WATSENGA1264-VO-CD-WATSENGA-VMF0016455
1273-VO-ZM-MULEBA1273-VO-ZM-MULEBA-VMF00176344
1288-VO-UG-DONNELLY1288-VO-UG-DONNELLY-VMF002191150
1315-VO-NG-OMITOLA1315-VO-NG-OMITOLA-OMOL-NG-2008263
1326-VO-UG-KAYONDO1326-VO-UG-KAYONDO-KAJO-UG-22034
AG1000G-KEAG1000G-KE28
AG1000G-MWAG1000G-MW27
AG1000G-TZAG1000G-TZ3
small-2020-afsmall-2020-af50
\n", + "
" + ], + "text/plain": [ + " sample_set sample_count\n", + "study_id \n", + "1178-VO-UG-LAWNICZAK 1178-VO-UG-LAWNICZAK-VMF00025 7\n", + "1190-VO-GH-AMENGA-ETEGO 1190-VO-GH-AMENGA-ETEGO-VMF00013 1\n", + "1190-VO-GH-AMENGA-ETEGO 1190-VO-GH-AMENGA-ETEGO-VMF00047 1\n", + "1191-VO-MULTI-OLOUGHLIN 1191-VO-MULTI-OLOUGHLIN-VMF00106 1\n", + "1230-VO-MULTI-AYALA 1230-VO-MULTI-AYALA-AYDI-GA-2104 50\n", + "1236-VO-TZ-OKUMU 1236-VO-TZ-OKUMU-OKFR-TZ-2008 43\n", + "1236-VO-TZ-OKUMU 1236-VO-TZ-OKUMU-VMF00248 29\n", + "1237-VO-BJ-DJOGBENOU 1237-VO-BJ-DJOGBENOU-VMF00067 1\n", + "1244-VO-GH-YAWSON 1244-VO-GH-YAWSON-VMF00149 8\n", + "1264-VO-CD-WATSENGA 1264-VO-CD-WATSENGA-VMF00164 55\n", + "1273-VO-ZM-MULEBA 1273-VO-ZM-MULEBA-VMF00176 344\n", + "1288-VO-UG-DONNELLY 1288-VO-UG-DONNELLY-VMF00219 1150\n", + "1315-VO-NG-OMITOLA 1315-VO-NG-OMITOLA-OMOL-NG-2008 263\n", + "1326-VO-UG-KAYONDO 1326-VO-UG-KAYONDO-KAJO-UG-2203 4\n", + "AG1000G-KE AG1000G-KE 28\n", + "AG1000G-MW AG1000G-MW 27\n", + "AG1000G-TZ AG1000G-TZ 3\n", + "small-2020-af small-2020-af 50" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_sample_sets = af1.sample_sets(release=\"1.1\")\n", + "df_sample_sets[['study_id','sample_set', 'sample_count']].set_index('study_id')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "yJ16OQ0Hpk8o" + }, + "source": [ + "Here is a more detailed breakdown of the samples contained within this sample set, summarised by country, year of collection, and species:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "a1OMvuTxUWpJ", + "outputId": "9f872334-fd50-4649-990a-df60ea71c12c", + "tags": [ + "remove-input" + ] + }, + "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", + " \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", + " \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", + " \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", + " \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", + " \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", + "
taxonfunestuslongipalpisparensisvaneedeni
study_idsample_setcountryyear
1178-VO-UG-LAWNICZAK1178-VO-UG-LAWNICZAK-VMF00025Kenya20171000
Uganda20162000
20174000
1190-VO-GH-AMENGA-ETEGO1190-VO-GH-AMENGA-ETEGO-VMF00013Ghana20161000
1190-VO-GH-AMENGA-ETEGO-VMF00047Ghana20171000
1191-VO-MULTI-OLOUGHLIN1191-VO-MULTI-OLOUGHLIN-VMF00106Mali20141000
1230-VO-MULTI-AYALA1230-VO-MULTI-AYALA-AYDI-GA-2104Gabon201929000
202021000
1236-VO-TZ-OKUMU1236-VO-TZ-OKUMU-OKFR-TZ-2008Tanzania201939400
1236-VO-TZ-OKUMU-VMF00248Tanzania20219000
202219010
1237-VO-BJ-DJOGBENOU1237-VO-BJ-DJOGBENOU-VMF00067Benin20171000
1244-VO-GH-YAWSON1244-VO-GH-YAWSON-VMF00149Ghana20188000
1264-VO-CD-WATSENGA1264-VO-CD-WATSENGA-VMF00164Democratic Republic of the Congo202055000
1273-VO-ZM-MULEBA1273-VO-ZM-MULEBA-VMF00176Zambia201836000
202094000
2021214000
1288-VO-UG-DONNELLY1288-VO-UG-DONNELLY-VMF00219Uganda201795000
2018602000
2019453000
1315-VO-NG-OMITOLA1315-VO-NG-OMITOLA-OMOL-NG-2008Nigeria2018263000
1326-VO-UG-KAYONDO1326-VO-UG-KAYONDO-KAJO-UG-2203Uganda20131000
20173000
AG1000G-KEAG1000G-KEKenya20102000
201222040
AG1000G-MWAG1000G-MWMalawi201527000
AG1000G-TZAG1000G-TZTanzania20152100
small-2020-afsmall-2020-afGhana20042000
Kenya20101000
Malawi20074000
Mozambique20076000
20141000
South Africa20100001
20130079
20140030
Tanzania20052000
Uganda20013000
Zambia20060600
20111400
\n", + "
" + ], + "text/plain": [ + "taxon funestus \\\n", + "study_id sample_set country year \n", + "1178-VO-UG-LAWNICZAK 1178-VO-UG-LAWNICZAK-VMF00025 Kenya 2017 1 \n", + " Uganda 2016 2 \n", + " 2017 4 \n", + "1190-VO-GH-AMENGA-ETEGO 1190-VO-GH-AMENGA-ETEGO-VMF00013 Ghana 2016 1 \n", + " 1190-VO-GH-AMENGA-ETEGO-VMF00047 Ghana 2017 1 \n", + "1191-VO-MULTI-OLOUGHLIN 1191-VO-MULTI-OLOUGHLIN-VMF00106 Mali 2014 1 \n", + "1230-VO-MULTI-AYALA 1230-VO-MULTI-AYALA-AYDI-GA-2104 Gabon 2019 29 \n", + " 2020 21 \n", + "1236-VO-TZ-OKUMU 1236-VO-TZ-OKUMU-OKFR-TZ-2008 Tanzania 2019 39 \n", + " 1236-VO-TZ-OKUMU-VMF00248 Tanzania 2021 9 \n", + " 2022 19 \n", + "1237-VO-BJ-DJOGBENOU 1237-VO-BJ-DJOGBENOU-VMF00067 Benin 2017 1 \n", + "1244-VO-GH-YAWSON 1244-VO-GH-YAWSON-VMF00149 Ghana 2018 8 \n", + "1264-VO-CD-WATSENGA 1264-VO-CD-WATSENGA-VMF00164 Democratic Republic of the Congo 2020 55 \n", + "1273-VO-ZM-MULEBA 1273-VO-ZM-MULEBA-VMF00176 Zambia 2018 36 \n", + " 2020 94 \n", + " 2021 214 \n", + "1288-VO-UG-DONNELLY 1288-VO-UG-DONNELLY-VMF00219 Uganda 2017 95 \n", + " 2018 602 \n", + " 2019 453 \n", + "1315-VO-NG-OMITOLA 1315-VO-NG-OMITOLA-OMOL-NG-2008 Nigeria 2018 263 \n", + "1326-VO-UG-KAYONDO 1326-VO-UG-KAYONDO-KAJO-UG-2203 Uganda 2013 1 \n", + " 2017 3 \n", + "AG1000G-KE AG1000G-KE Kenya 2010 2 \n", + " 2012 22 \n", + "AG1000G-MW AG1000G-MW Malawi 2015 27 \n", + "AG1000G-TZ AG1000G-TZ Tanzania 2015 2 \n", + "small-2020-af small-2020-af Ghana 2004 2 \n", + " Kenya 2010 1 \n", + " Malawi 2007 4 \n", + " Mozambique 2007 6 \n", + " 2014 1 \n", + " South Africa 2010 0 \n", + " 2013 0 \n", + " 2014 0 \n", + " Tanzania 2005 2 \n", + " Uganda 2001 3 \n", + " Zambia 2006 0 \n", + " 2011 1 \n", + "\n", + "taxon longipalpis \\\n", + "study_id sample_set country year \n", + "1178-VO-UG-LAWNICZAK 1178-VO-UG-LAWNICZAK-VMF00025 Kenya 2017 0 \n", + " Uganda 2016 0 \n", + " 2017 0 \n", + "1190-VO-GH-AMENGA-ETEGO 1190-VO-GH-AMENGA-ETEGO-VMF00013 Ghana 2016 0 \n", + " 1190-VO-GH-AMENGA-ETEGO-VMF00047 Ghana 2017 0 \n", + "1191-VO-MULTI-OLOUGHLIN 1191-VO-MULTI-OLOUGHLIN-VMF00106 Mali 2014 0 \n", + "1230-VO-MULTI-AYALA 1230-VO-MULTI-AYALA-AYDI-GA-2104 Gabon 2019 0 \n", + " 2020 0 \n", + "1236-VO-TZ-OKUMU 1236-VO-TZ-OKUMU-OKFR-TZ-2008 Tanzania 2019 4 \n", + " 1236-VO-TZ-OKUMU-VMF00248 Tanzania 2021 0 \n", + " 2022 0 \n", + "1237-VO-BJ-DJOGBENOU 1237-VO-BJ-DJOGBENOU-VMF00067 Benin 2017 0 \n", + "1244-VO-GH-YAWSON 1244-VO-GH-YAWSON-VMF00149 Ghana 2018 0 \n", + "1264-VO-CD-WATSENGA 1264-VO-CD-WATSENGA-VMF00164 Democratic Republic of the Congo 2020 0 \n", + "1273-VO-ZM-MULEBA 1273-VO-ZM-MULEBA-VMF00176 Zambia 2018 0 \n", + " 2020 0 \n", + " 2021 0 \n", + "1288-VO-UG-DONNELLY 1288-VO-UG-DONNELLY-VMF00219 Uganda 2017 0 \n", + " 2018 0 \n", + " 2019 0 \n", + "1315-VO-NG-OMITOLA 1315-VO-NG-OMITOLA-OMOL-NG-2008 Nigeria 2018 0 \n", + "1326-VO-UG-KAYONDO 1326-VO-UG-KAYONDO-KAJO-UG-2203 Uganda 2013 0 \n", + " 2017 0 \n", + "AG1000G-KE AG1000G-KE Kenya 2010 0 \n", + " 2012 0 \n", + "AG1000G-MW AG1000G-MW Malawi 2015 0 \n", + "AG1000G-TZ AG1000G-TZ Tanzania 2015 1 \n", + "small-2020-af small-2020-af Ghana 2004 0 \n", + " Kenya 2010 0 \n", + " Malawi 2007 0 \n", + " Mozambique 2007 0 \n", + " 2014 0 \n", + " South Africa 2010 0 \n", + " 2013 0 \n", + " 2014 0 \n", + " Tanzania 2005 0 \n", + " Uganda 2001 0 \n", + " Zambia 2006 6 \n", + " 2011 4 \n", + "\n", + "taxon parensis \\\n", + "study_id sample_set country year \n", + "1178-VO-UG-LAWNICZAK 1178-VO-UG-LAWNICZAK-VMF00025 Kenya 2017 0 \n", + " Uganda 2016 0 \n", + " 2017 0 \n", + "1190-VO-GH-AMENGA-ETEGO 1190-VO-GH-AMENGA-ETEGO-VMF00013 Ghana 2016 0 \n", + " 1190-VO-GH-AMENGA-ETEGO-VMF00047 Ghana 2017 0 \n", + "1191-VO-MULTI-OLOUGHLIN 1191-VO-MULTI-OLOUGHLIN-VMF00106 Mali 2014 0 \n", + "1230-VO-MULTI-AYALA 1230-VO-MULTI-AYALA-AYDI-GA-2104 Gabon 2019 0 \n", + " 2020 0 \n", + "1236-VO-TZ-OKUMU 1236-VO-TZ-OKUMU-OKFR-TZ-2008 Tanzania 2019 0 \n", + " 1236-VO-TZ-OKUMU-VMF00248 Tanzania 2021 0 \n", + " 2022 1 \n", + "1237-VO-BJ-DJOGBENOU 1237-VO-BJ-DJOGBENOU-VMF00067 Benin 2017 0 \n", + "1244-VO-GH-YAWSON 1244-VO-GH-YAWSON-VMF00149 Ghana 2018 0 \n", + "1264-VO-CD-WATSENGA 1264-VO-CD-WATSENGA-VMF00164 Democratic Republic of the Congo 2020 0 \n", + "1273-VO-ZM-MULEBA 1273-VO-ZM-MULEBA-VMF00176 Zambia 2018 0 \n", + " 2020 0 \n", + " 2021 0 \n", + "1288-VO-UG-DONNELLY 1288-VO-UG-DONNELLY-VMF00219 Uganda 2017 0 \n", + " 2018 0 \n", + " 2019 0 \n", + "1315-VO-NG-OMITOLA 1315-VO-NG-OMITOLA-OMOL-NG-2008 Nigeria 2018 0 \n", + "1326-VO-UG-KAYONDO 1326-VO-UG-KAYONDO-KAJO-UG-2203 Uganda 2013 0 \n", + " 2017 0 \n", + "AG1000G-KE AG1000G-KE Kenya 2010 0 \n", + " 2012 4 \n", + "AG1000G-MW AG1000G-MW Malawi 2015 0 \n", + "AG1000G-TZ AG1000G-TZ Tanzania 2015 0 \n", + "small-2020-af small-2020-af Ghana 2004 0 \n", + " Kenya 2010 0 \n", + " Malawi 2007 0 \n", + " Mozambique 2007 0 \n", + " 2014 0 \n", + " South Africa 2010 0 \n", + " 2013 7 \n", + " 2014 3 \n", + " Tanzania 2005 0 \n", + " Uganda 2001 0 \n", + " Zambia 2006 0 \n", + " 2011 0 \n", + "\n", + "taxon vaneedeni \n", + "study_id sample_set country year \n", + "1178-VO-UG-LAWNICZAK 1178-VO-UG-LAWNICZAK-VMF00025 Kenya 2017 0 \n", + " Uganda 2016 0 \n", + " 2017 0 \n", + "1190-VO-GH-AMENGA-ETEGO 1190-VO-GH-AMENGA-ETEGO-VMF00013 Ghana 2016 0 \n", + " 1190-VO-GH-AMENGA-ETEGO-VMF00047 Ghana 2017 0 \n", + "1191-VO-MULTI-OLOUGHLIN 1191-VO-MULTI-OLOUGHLIN-VMF00106 Mali 2014 0 \n", + "1230-VO-MULTI-AYALA 1230-VO-MULTI-AYALA-AYDI-GA-2104 Gabon 2019 0 \n", + " 2020 0 \n", + "1236-VO-TZ-OKUMU 1236-VO-TZ-OKUMU-OKFR-TZ-2008 Tanzania 2019 0 \n", + " 1236-VO-TZ-OKUMU-VMF00248 Tanzania 2021 0 \n", + " 2022 0 \n", + "1237-VO-BJ-DJOGBENOU 1237-VO-BJ-DJOGBENOU-VMF00067 Benin 2017 0 \n", + "1244-VO-GH-YAWSON 1244-VO-GH-YAWSON-VMF00149 Ghana 2018 0 \n", + "1264-VO-CD-WATSENGA 1264-VO-CD-WATSENGA-VMF00164 Democratic Republic of the Congo 2020 0 \n", + "1273-VO-ZM-MULEBA 1273-VO-ZM-MULEBA-VMF00176 Zambia 2018 0 \n", + " 2020 0 \n", + " 2021 0 \n", + "1288-VO-UG-DONNELLY 1288-VO-UG-DONNELLY-VMF00219 Uganda 2017 0 \n", + " 2018 0 \n", + " 2019 0 \n", + "1315-VO-NG-OMITOLA 1315-VO-NG-OMITOLA-OMOL-NG-2008 Nigeria 2018 0 \n", + "1326-VO-UG-KAYONDO 1326-VO-UG-KAYONDO-KAJO-UG-2203 Uganda 2013 0 \n", + " 2017 0 \n", + "AG1000G-KE AG1000G-KE Kenya 2010 0 \n", + " 2012 0 \n", + "AG1000G-MW AG1000G-MW Malawi 2015 0 \n", + "AG1000G-TZ AG1000G-TZ Tanzania 2015 0 \n", + "small-2020-af small-2020-af Ghana 2004 0 \n", + " Kenya 2010 0 \n", + " Malawi 2007 0 \n", + " Mozambique 2007 0 \n", + " 2014 0 \n", + " South Africa 2010 1 \n", + " 2013 9 \n", + " 2014 0 \n", + " Tanzania 2005 0 \n", + " Uganda 2001 0 \n", + " Zambia 2006 0 \n", + " 2011 0 " + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_samples = af1.sample_metadata(sample_sets=\"1.1\")\n", + "df_summary = df_samples.pivot_table(\n", + " index=[\"study_id\",\"sample_set\", \"country\", \"year\"], \n", + " columns=[\"taxon\"],\n", + " values=\"sample_id\", \n", + " aggfunc=len,\n", + " fill_value=0)\n", + "df_summary" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "dLiU0ulIpk8p" + }, + "source": [ + "Note that there can be multiple sampling sites represented within the same sample set." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "OToX5vhfpk8p" + }, + "source": [ + "## Further reading\n", + "\n", + "We hope this page has provided a useful introduction to the `Af1.1` data resource. If you would like to start working with these data, please visit the [cloud data access guide](cloud) or the [data download guide](download) or continue browsing the other documentation on this site.\n", + "\n", + "If you have any questions about the data and how to use them, please do get in touch by [starting a new discussion](https://github.com/malariagen/vector-data/discussions/new) on the malariagen/vector-data repository on GitHub." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "celltoolbar": "Tags", + "colab": { + "name": "Ag3.0-intro.ipynb", + "provenance": [] + }, + "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.9.10" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/docs/af1/api.md b/docs/af1/api.md new file mode 100644 index 0000000..0b119ad --- /dev/null +++ b/docs/af1/api.md @@ -0,0 +1,3 @@ +# Af1 API + +For documentation on functions in the [malariagen_data](https://github.com/malariagen/malariagen-data-python) Python package for accessing *Anopheles funestus* data, please visit the [Af1 API docs page](https://malariagen.github.io/malariagen-data-python/latest/Af1.html). diff --git a/docs/af1/cloud.ipynb b/docs/af1/cloud.ipynb new file mode 100644 index 0000000..71dda59 --- /dev/null +++ b/docs/af1/cloud.ipynb @@ -0,0 +1,9618 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "DZw8vyUJ0y5k" + }, + "source": [ + "# Af1 cloud data access\n", + "\n", + "This notebook provides information about how to download data from the [MalariaGEN Vector Observatory Anopheles funestus Genomic Surveillance Project](https://www.malariagen.net/projects/anopheles-funestus-genomic-surveillance-project) via Google Cloud. This includes sample metadata, raw sequence reads, sequence read alignments, and single nucleotide polymorphism (SNP) calls. \n", + "\n", + "This notebook illustrates how to read data directly from the cloud, without having to first download any data locally. This notebook can be run from any computer, but will work best when run from a compute node within Google Cloud, because it will be physically closer to the data and so data transfer is faster. For example, this notebook can be run via [Google Colab](https://colab.research.google.com/) which are free interactive computing service running in the cloud.\n", + "\n", + "To launch this notebook in the cloud and run it for yourself, click the launch icon () at the top of the page and select one of the cloud computing services available.\n", + "\n", + "## Data hosting\n", + "\n", + "All data required for this notebook is hosted on Google Cloud Storage (GCS). Data are hosted in the `vo_afun_release` bucket, which is a multi-region bucket located in the United States. All data hosted in GCS are publicly accessible and do not require any authentication to access. " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Zn_-HkLIQH_0" + }, + "source": [ + "## Setup\n", + "\n", + "Running this notebook requires some Python packages to be installed:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "wqHBq442QH_1", + "outputId": "1c1306a2-d6f1-46a2-ee4d-30b13dad9148", + "tags": [ + "hide-output" + ] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[K |████████████████████████████████| 47 kB 1.3 MB/s \n", + "\u001b[K |████████████████████████████████| 153 kB 7.3 MB/s \n", + "\u001b[K |████████████████████████████████| 2.3 MB 32.8 MB/s \n", + "\u001b[K |████████████████████████████████| 3.3 MB 30.5 MB/s \n", + "\u001b[K |████████████████████████████████| 5.7 MB 27.8 MB/s \n", + "\u001b[K |████████████████████████████████| 134 kB 61.7 MB/s \n", + "\u001b[K |████████████████████████████████| 1.1 MB 29.9 MB/s \n", + "\u001b[K |████████████████████████████████| 144 kB 50.2 MB/s \n", + "\u001b[K |████████████████████████████████| 94 kB 979 kB/s \n", + "\u001b[K |████████████████████████████████| 271 kB 51.9 MB/s \n", + "\u001b[K |████████████████████████████████| 6.2 MB 26.2 MB/s \n", + "\u001b[?25h Building wheel for asciitree (setup.py) ... \u001b[?25l\u001b[?25hdone\n" + ] + } + ], + "source": [ + "%pip install -q malariagen_data" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "osgZ9pB7QH_1" + }, + "source": [ + "To make accessing these data more convenient, we've created the [malariagen_data](https://github.com/malariagen/malariagen-data-python) Python package. This is experimental so please let us know if you find any bugs or have any suggestions. See the [Ag3 API docs](api) for documentation of all functions available from this package. \n", + "\n", + "Import other packages we'll need to use here." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "id": "970klnG1eu8N" + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import dask\n", + "import dask.array as da\n", + "from dask.diagnostics.progress import ProgressBar\n", + "# silence some warnings\n", + "dask.config.set(**{'array.slicing.split_large_chunks': False})\n", + "import allel\n", + "import malariagen_data" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "jPqZ-LFPQH_2" + }, + "source": [ + "`Af1` data access from Google Cloud is set up with the following code:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 190 + }, + "id": "mIsSaTuOQH_2", + "outputId": "4facd5a9-6e43-460a-811c-30293568918e" + }, + "outputs": [ + { + "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\nconst 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 function drop(id) {\n const view = Bokeh.index.get_by_id(id)\n if (view != null) {\n view.model.document.clear()\n Bokeh.index.delete(view)\n }\n }\n\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\n // Clean up Bokeh references\n if (id != null) {\n drop(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 drop(id)\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 \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n \"
  • use INLINE resources instead, as so:
  • \\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(null);\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.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.3.0.min.js\"];\n const css_urls = [];\n\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {\n }\n ];\n\n function run_inline_js() {\n if (root.Bokeh !== undefined || force === true) {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\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(null)).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": "" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "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", + "
MalariaGEN Af1 API client
\n", + " Please note that data are subject to terms of use,\n", + " for more information see \n", + " the MalariaGEN website or contact data@malariagen.net.\n", + "
\n", + " Storage URL\n", + " gs://vo_afun_release/
\n", + " Data releases available\n", + " 1.0
\n", + " Results cache\n", + " None
\n", + " Cohorts analysis\n", + " 20231122
\n", + " Site filters analysis\n", + " dt_20200416
\n", + " Software version\n", + " malariagen_data 7.14.0
\n", + " Client location\n", + " unknown
\n", + " " + ], + "text/plain": [ + "\n", + "Storage URL : gs://vo_afun_release/\n", + "Data releases available : 1.0\n", + "Results cache : None\n", + "Cohorts analysis : 20231122\n", + "Site filters analysis : dt_20200416\n", + "Software version : malariagen_data 7.14.0\n", + "Client location : unknown\n", + "---\n", + "Please note that data are subject to terms of use,\n", + "for more information see https://www.malariagen.net/data\n", + "or contact data@malariagen.net." + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "af1 = malariagen_data.Af1()\n", + "af1" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ITy4zIVoQH_2" + }, + "source": [ + "## Sample sets\n", + "\n", + "Data are organised into different releases. As an example, data in Ag3.0 are organised into 28 sample sets. Each of these sample sets corresponds to a set of mosquito specimens contributed by a collaborating study. Depending on your objectives, you may want to access data from only specific sample sets, or all sample sets.\n", + "\n", + "To see which sample sets are available, load the sample set manifest into a pandas dataframe:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 927 + }, + "id": "b4ADQTOfQH_2", + "outputId": "f7c6d68b-053f-4698-8b6f-29720287c423" + }, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
sample_setsample_countstudy_idstudy_urlrelease
01229-VO-GH-DADZIE-VMF00095361229-VO-GH-DADZIEhttps://www.malariagen.net/network/where-we-wo...1.0
11230-VO-GA-CF-AYALA-VMF00045501230-VO-MULTI-AYALAhttps://www.malariagen.net/network/where-we-wo...1.0
21231-VO-MULTI-WONDJI-VMF000433201231-VO-MULTI-WONDJIhttps://www.malariagen.net/network/where-we-wo...1.0
31232-VO-KE-OCHOMO-VMF00044811232-VO-KE-OCHOMOhttps://www.malariagen.net/network/where-we-wo...1.0
41235-VO-MZ-PAAIJMANS-VMF00094761235-VO-MZ-PAAIJMANShttps://www.malariagen.net/network/where-we-wo...1.0
51236-VO-TZ-OKUMU-VMF00090101236-VO-TZ-OKUMUhttps://www.malariagen.net/network/where-we-wo...1.0
61240-VO-CD-KOEKEMOER-VMF00099431240-VO-MULTI-KOEKEMOERhttps://www.malariagen.net/network/where-we-wo...1.0
71240-VO-MZ-KOEKEMOER-VMF00101401240-VO-MULTI-KOEKEMOERhttps://www.malariagen.net/network/where-we-wo...1.0
\n", + "
" + ], + "text/plain": [ + " sample_set sample_count study_id \\\n", + "0 1229-VO-GH-DADZIE-VMF00095 36 1229-VO-GH-DADZIE \n", + "1 1230-VO-GA-CF-AYALA-VMF00045 50 1230-VO-MULTI-AYALA \n", + "2 1231-VO-MULTI-WONDJI-VMF00043 320 1231-VO-MULTI-WONDJI \n", + "3 1232-VO-KE-OCHOMO-VMF00044 81 1232-VO-KE-OCHOMO \n", + "4 1235-VO-MZ-PAAIJMANS-VMF00094 76 1235-VO-MZ-PAAIJMANS \n", + "5 1236-VO-TZ-OKUMU-VMF00090 10 1236-VO-TZ-OKUMU \n", + "6 1240-VO-CD-KOEKEMOER-VMF00099 43 1240-VO-MULTI-KOEKEMOER \n", + "7 1240-VO-MZ-KOEKEMOER-VMF00101 40 1240-VO-MULTI-KOEKEMOER \n", + "\n", + " study_url release \n", + "0 https://www.malariagen.net/network/where-we-wo... 1.0 \n", + "1 https://www.malariagen.net/network/where-we-wo... 1.0 \n", + "2 https://www.malariagen.net/network/where-we-wo... 1.0 \n", + "3 https://www.malariagen.net/network/where-we-wo... 1.0 \n", + "4 https://www.malariagen.net/network/where-we-wo... 1.0 \n", + "5 https://www.malariagen.net/network/where-we-wo... 1.0 \n", + "6 https://www.malariagen.net/network/where-we-wo... 1.0 \n", + "7 https://www.malariagen.net/network/where-we-wo... 1.0 " + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_sample_sets = af1.sample_sets(release=\"1.0\")\n", + "df_sample_sets" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "J0SHf6vaQH_3" + }, + "source": [ + "For more information about these sample sets, see the section on sample sets in the [introduction to Ag1000G phase 3](https://malariagen.github.io/vector-data/ag3/ag3.0.html)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "78L85pli9HdO" + }, + "source": [ + "## Sample metadata\n", + "\n", + "Data about the samples that were sequenced to generate this data resource are available, including the time and place of collection, the gender of the specimen, and our call regarding the species of the specimen. These are organised by sample set.\n", + "\n", + "E.g., load sample metadata for all samples in the Af1.0 release into a [pandas DataFrame](https://pandas.pydata.org/pandas-docs/stable/user_guide/dsintro.html#dataframe):" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 661 + }, + "id": "-V8nLGSaQH_4", + "outputId": "98a12919-fd6a-4fd5-8155-d90f05d877d7" + }, + "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", + " \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", + " \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", + " \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", + " \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", + "
sample_idpartner_sample_idcontributorcountrylocationyearmonthlatitudelongitudesex_call...admin1_nameadmin1_isoadmin2_nametaxoncohort_admin1_yearcohort_admin1_monthcohort_admin1_quartercohort_admin2_yearcohort_admin2_monthcohort_admin2_quarter
0VBS241951229-GH-A-GH01Samuel DadzieGhanaDimabi201789.420-1.083F...Northern RegionGH-NPTolonfunestusGH-NP_fune_2017GH-NP_fune_2017_08GH-NP_fune_2017_Q3GH-NP_Tolon_fune_2017GH-NP_Tolon_fune_2017_08GH-NP_Tolon_fune_2017_Q3
1VBS241961229-GH-A-GH02Samuel DadzieGhanaGbullung201779.488-1.009F...Northern RegionGH-NPKumbungufunestusGH-NP_fune_2017GH-NP_fune_2017_07GH-NP_fune_2017_Q3GH-NP_Kumbungu_fune_2017GH-NP_Kumbungu_fune_2017_07GH-NP_Kumbungu_fune_2017_Q3
2VBS241971229-GH-A-GH03Samuel DadzieGhanaDimabi201779.420-1.083F...Northern RegionGH-NPTolonfunestusGH-NP_fune_2017GH-NP_fune_2017_07GH-NP_fune_2017_Q3GH-NP_Tolon_fune_2017GH-NP_Tolon_fune_2017_07GH-NP_Tolon_fune_2017_Q3
3VBS241981229-GH-A-GH04Samuel DadzieGhanaDimabi201789.420-1.083F...Northern RegionGH-NPTolonfunestusGH-NP_fune_2017GH-NP_fune_2017_08GH-NP_fune_2017_Q3GH-NP_Tolon_fune_2017GH-NP_Tolon_fune_2017_08GH-NP_Tolon_fune_2017_Q3
4VBS241991229-GH-A-GH05Samuel DadzieGhanaGupanarigu201789.497-0.952F...Northern RegionGH-NPKumbungufunestusGH-NP_fune_2017GH-NP_fune_2017_08GH-NP_fune_2017_Q3GH-NP_Kumbungu_fune_2017GH-NP_Kumbungu_fune_2017_08GH-NP_Kumbungu_fune_2017_Q3
..................................................................
651VBS245341240-MZ-A-MozF_1314Lizette KoekemoerMozambiqueMotinho20158-10.85140.594F...Cabo DelgadoMZ-PPalmafunestusMZ-P_fune_2015MZ-P_fune_2015_08MZ-P_fune_2015_Q3MZ-P_Palma_fune_2015MZ-P_Palma_fune_2015_08MZ-P_Palma_fune_2015_Q3
652VBS245351240-MZ-A-MozF_1315Lizette KoekemoerMozambiqueMotinho20158-10.85140.594F...Cabo DelgadoMZ-PPalmafunestusMZ-P_fune_2015MZ-P_fune_2015_08MZ-P_fune_2015_Q3MZ-P_Palma_fune_2015MZ-P_Palma_fune_2015_08MZ-P_Palma_fune_2015_Q3
653VBS245361240-MZ-A-MozF_1317Lizette KoekemoerMozambiqueMotinho20158-10.85140.594F...Cabo DelgadoMZ-PPalmafunestusMZ-P_fune_2015MZ-P_fune_2015_08MZ-P_fune_2015_Q3MZ-P_Palma_fune_2015MZ-P_Palma_fune_2015_08MZ-P_Palma_fune_2015_Q3
654VBS245371240-MZ-A-MozF_1319Lizette KoekemoerMozambiqueMotinho20158-10.85140.594F...Cabo DelgadoMZ-PPalmafunestusMZ-P_fune_2015MZ-P_fune_2015_08MZ-P_fune_2015_Q3MZ-P_Palma_fune_2015MZ-P_Palma_fune_2015_08MZ-P_Palma_fune_2015_Q3
655VBS245391240-MZ-A-MozF_1323Lizette KoekemoerMozambiqueMotinho20158-10.85140.594F...Cabo DelgadoMZ-PPalmafunestusMZ-P_fune_2015MZ-P_fune_2015_08MZ-P_fune_2015_Q3MZ-P_Palma_fune_2015MZ-P_Palma_fune_2015_08MZ-P_Palma_fune_2015_Q3
\n", + "

656 rows × 26 columns

\n", + "
" + ], + "text/plain": [ + " sample_id partner_sample_id contributor country location \\\n", + "0 VBS24195 1229-GH-A-GH01 Samuel Dadzie Ghana Dimabi \n", + "1 VBS24196 1229-GH-A-GH02 Samuel Dadzie Ghana Gbullung \n", + "2 VBS24197 1229-GH-A-GH03 Samuel Dadzie Ghana Dimabi \n", + "3 VBS24198 1229-GH-A-GH04 Samuel Dadzie Ghana Dimabi \n", + "4 VBS24199 1229-GH-A-GH05 Samuel Dadzie Ghana Gupanarigu \n", + ".. ... ... ... ... ... \n", + "651 VBS24534 1240-MZ-A-MozF_1314 Lizette Koekemoer Mozambique Motinho \n", + "652 VBS24535 1240-MZ-A-MozF_1315 Lizette Koekemoer Mozambique Motinho \n", + "653 VBS24536 1240-MZ-A-MozF_1317 Lizette Koekemoer Mozambique Motinho \n", + "654 VBS24537 1240-MZ-A-MozF_1319 Lizette Koekemoer Mozambique Motinho \n", + "655 VBS24539 1240-MZ-A-MozF_1323 Lizette Koekemoer Mozambique Motinho \n", + "\n", + " year month latitude longitude sex_call ... admin1_name \\\n", + "0 2017 8 9.420 -1.083 F ... Northern Region \n", + "1 2017 7 9.488 -1.009 F ... Northern Region \n", + "2 2017 7 9.420 -1.083 F ... Northern Region \n", + "3 2017 8 9.420 -1.083 F ... Northern Region \n", + "4 2017 8 9.497 -0.952 F ... Northern Region \n", + ".. ... ... ... ... ... ... ... \n", + "651 2015 8 -10.851 40.594 F ... Cabo Delgado \n", + "652 2015 8 -10.851 40.594 F ... Cabo Delgado \n", + "653 2015 8 -10.851 40.594 F ... Cabo Delgado \n", + "654 2015 8 -10.851 40.594 F ... Cabo Delgado \n", + "655 2015 8 -10.851 40.594 F ... Cabo Delgado \n", + "\n", + " admin1_iso admin2_name taxon cohort_admin1_year cohort_admin1_month \\\n", + "0 GH-NP Tolon funestus GH-NP_fune_2017 GH-NP_fune_2017_08 \n", + "1 GH-NP Kumbungu funestus GH-NP_fune_2017 GH-NP_fune_2017_07 \n", + "2 GH-NP Tolon funestus GH-NP_fune_2017 GH-NP_fune_2017_07 \n", + "3 GH-NP Tolon funestus GH-NP_fune_2017 GH-NP_fune_2017_08 \n", + "4 GH-NP Kumbungu funestus GH-NP_fune_2017 GH-NP_fune_2017_08 \n", + ".. ... ... ... ... ... \n", + "651 MZ-P Palma funestus MZ-P_fune_2015 MZ-P_fune_2015_08 \n", + "652 MZ-P Palma funestus MZ-P_fune_2015 MZ-P_fune_2015_08 \n", + "653 MZ-P Palma funestus MZ-P_fune_2015 MZ-P_fune_2015_08 \n", + "654 MZ-P Palma funestus MZ-P_fune_2015 MZ-P_fune_2015_08 \n", + "655 MZ-P Palma funestus MZ-P_fune_2015 MZ-P_fune_2015_08 \n", + "\n", + " cohort_admin1_quarter cohort_admin2_year \\\n", + "0 GH-NP_fune_2017_Q3 GH-NP_Tolon_fune_2017 \n", + "1 GH-NP_fune_2017_Q3 GH-NP_Kumbungu_fune_2017 \n", + "2 GH-NP_fune_2017_Q3 GH-NP_Tolon_fune_2017 \n", + "3 GH-NP_fune_2017_Q3 GH-NP_Tolon_fune_2017 \n", + "4 GH-NP_fune_2017_Q3 GH-NP_Kumbungu_fune_2017 \n", + ".. ... ... \n", + "651 MZ-P_fune_2015_Q3 MZ-P_Palma_fune_2015 \n", + "652 MZ-P_fune_2015_Q3 MZ-P_Palma_fune_2015 \n", + "653 MZ-P_fune_2015_Q3 MZ-P_Palma_fune_2015 \n", + "654 MZ-P_fune_2015_Q3 MZ-P_Palma_fune_2015 \n", + "655 MZ-P_fune_2015_Q3 MZ-P_Palma_fune_2015 \n", + "\n", + " cohort_admin2_month cohort_admin2_quarter \n", + "0 GH-NP_Tolon_fune_2017_08 GH-NP_Tolon_fune_2017_Q3 \n", + "1 GH-NP_Kumbungu_fune_2017_07 GH-NP_Kumbungu_fune_2017_Q3 \n", + "2 GH-NP_Tolon_fune_2017_07 GH-NP_Tolon_fune_2017_Q3 \n", + "3 GH-NP_Tolon_fune_2017_08 GH-NP_Tolon_fune_2017_Q3 \n", + "4 GH-NP_Kumbungu_fune_2017_08 GH-NP_Kumbungu_fune_2017_Q3 \n", + ".. ... ... \n", + "651 MZ-P_Palma_fune_2015_08 MZ-P_Palma_fune_2015_Q3 \n", + "652 MZ-P_Palma_fune_2015_08 MZ-P_Palma_fune_2015_Q3 \n", + "653 MZ-P_Palma_fune_2015_08 MZ-P_Palma_fune_2015_Q3 \n", + "654 MZ-P_Palma_fune_2015_08 MZ-P_Palma_fune_2015_Q3 \n", + "655 MZ-P_Palma_fune_2015_08 MZ-P_Palma_fune_2015_Q3 \n", + "\n", + "[656 rows x 26 columns]" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_samples = af1.sample_metadata(sample_sets=\"1.0\")\n", + "df_samples" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ssCdOykfQH_4" + }, + "source": [ + "The `sample_id` column gives the sample identifier used throughout all Af1 analyses.\n", + "\n", + "The `country`, `location`, `latitude` and `longitude` columns give the location where the specimen was collected.\n", + "\n", + "The `year` and `month` columns give the approximate date when the specimen was collected.\n", + "\n", + "The `sex_call` column gives the gender as determined from the sequence data." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "9APw05D5gAQ9" + }, + "source": [ + "[Pandas](https://pandas.pydata.org/) can be used to explore and query the sample metadata in various ways. E.g., here is a summary of the numbers of samples by species:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "PpsTgviZQH_4", + "outputId": "ddbc9515-25dc-454f-9f02-9427f1261b06" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "taxon\n", + "funestus 656\n", + "dtype: int64" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_samples.groupby(\"taxon\").size()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "C4EPodCJjg0a" + }, + "source": [ + "## SNP calls\n", + "\n", + "Data on SNP calls, including the SNP positions, alleles, site filters, and genotypes, can be accessed as an [xarray Dataset](http://xarray.pydata.org/en/stable/user-guide/data-structures.html#dataset).\n", + "\n", + "E.g., access SNP calls for chromosome 2RL for all samples in `Af1.0`." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 430 + }, + "id": "433PD7k8jlNj", + "outputId": "bc5e1b8d-f1f4-4008-df56-f577a9080561" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.Dataset>\n",
+       "Dimensions:                       (variants: 102882611, alleles: 4, samples: 656, ploidy: 2)\n",
+       "Coordinates:\n",
+       "    variant_position              (variants) int32 dask.array<chunksize=(524288,), meta=np.ndarray>\n",
+       "    variant_contig                (variants) uint8 dask.array<chunksize=(524288,), meta=np.ndarray>\n",
+       "    sample_id                     (samples) <U36 dask.array<chunksize=(36,), meta=np.ndarray>\n",
+       "Dimensions without coordinates: variants, alleles, samples, ploidy\n",
+       "Data variables:\n",
+       "    variant_allele                (variants, alleles) |S1 dask.array<chunksize=(524288, 1), meta=np.ndarray>\n",
+       "    variant_filter_pass_funestus  (variants) bool dask.array<chunksize=(300000,), meta=np.ndarray>\n",
+       "    call_genotype                 (variants, samples, ploidy) int8 dask.array<chunksize=(300000, 36, 2), meta=np.ndarray>\n",
+       "    call_GQ                       (variants, samples) int8 dask.array<chunksize=(300000, 36), meta=np.ndarray>\n",
+       "    call_MQ                       (variants, samples) float32 dask.array<chunksize=(300000, 36), meta=np.ndarray>\n",
+       "    call_AD                       (variants, samples, alleles) int16 dask.array<chunksize=(300000, 36, 4), meta=np.ndarray>\n",
+       "    call_genotype_mask            (variants, samples, ploidy) bool dask.array<chunksize=(300000, 36, 2), meta=np.ndarray>\n",
+       "Attributes:\n",
+       "    contigs:  ('2RL', '3RL', 'X')
" + ], + "text/plain": [ + "\n", + "Dimensions: (variants: 102882611, alleles: 4, samples: 656, ploidy: 2)\n", + "Coordinates:\n", + " variant_position (variants) int32 dask.array\n", + " variant_contig (variants) uint8 dask.array\n", + " sample_id (samples) \n", + "Dimensions without coordinates: variants, alleles, samples, ploidy\n", + "Data variables:\n", + " variant_allele (variants, alleles) |S1 dask.array\n", + " variant_filter_pass_funestus (variants) bool dask.array\n", + " call_genotype (variants, samples, ploidy) int8 dask.array\n", + " call_GQ (variants, samples) int8 dask.array\n", + " call_MQ (variants, samples) float32 dask.array\n", + " call_AD (variants, samples, alleles) int16 dask.array\n", + " call_genotype_mask (variants, samples, ploidy) bool dask.array\n", + "Attributes:\n", + " contigs: ('2RL', '3RL', 'X')" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ds_snps = af1.snp_calls(region=\"2RL\", sample_sets=\"1.0\")\n", + "ds_snps" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "fx9ufvbCnPGn" + }, + "source": [ + "The arrays within this dataset are backed by [Dask arrays](https://docs.dask.org/en/latest/array.html), and can be accessed as shown below." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Lvv-lFHJ-Um2" + }, + "source": [ + "### SNP sites and alleles\n", + "\n", + "We have called SNP genotypes in all samples at all positions in the genome where the reference allele is not \"N\". Data on this set of genomic positions and alleles for a given chromosome (e.g., 2RL) can be accessed as [Dask arrays](https://docs.dask.org/en/latest/array.html) as follows." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 132 + }, + "id": "GO5Os0epQH_5", + "outputId": "7c970e20-4811-46a1-8944-4bd7f6e8359f" + }, + "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", + "
Array Chunk
Bytes 392.47 MiB 2.00 MiB
Shape (102882611,) (524288,)
Count 197 Tasks 197 Chunks
Type int32 numpy.ndarray
\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", + " 102882611\n", + " 1\n", + "\n", + "
" + ], + "text/plain": [ + "dask.array" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pos = ds_snps[\"variant_position\"].data\n", + "pos" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 197 + }, + "id": "eD5Gtb-xQH_5", + "outputId": "60a9f964-0335-4084-b359-7902d138bec3" + }, + "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", + "
Array Chunk
Bytes 392.47 MiB 1.50 MiB
Shape (102882611, 4) (524288, 3)
Count 985 Tasks 394 Chunks
Type |S1 numpy.ndarray
\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", + " 4\n", + " 102882611\n", + "\n", + "
" + ], + "text/plain": [ + "dask.array" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "alleles = ds_snps[\"variant_allele\"].data\n", + "alleles" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "k6i3W7y1QH_5" + }, + "source": [ + "Data can be loaded into memory as a [NumPy array](https://numpy.org/doc/stable/user/absolute_beginners.html) as shown in the following examples." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "3_1qTYtiQH_5", + "outputId": "c260b22a-cc89-4a3c-9371-21fde9ec189e" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], dtype=int32)" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# read first 10 SNP positions into a numpy array\n", + "p = pos[:10].compute()\n", + "p" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "UjeBeyOXQH_6", + "outputId": "4ef2a2e1-789a-4ec0-fff6-53e83f4951d1" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[b'T', b'A', b'C', b'G'],\n", + " [b'G', b'A', b'C', b'T'],\n", + " [b'G', b'A', b'C', b'T'],\n", + " [b'C', b'A', b'T', b'G'],\n", + " [b'G', b'A', b'C', b'T'],\n", + " [b'T', b'A', b'C', b'G'],\n", + " [b'C', b'A', b'T', b'G'],\n", + " [b'A', b'C', b'T', b'G'],\n", + " [b'C', b'A', b'T', b'G'],\n", + " [b'T', b'A', b'C', b'G']], dtype='|S1')" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# read first 10 SNP alleles into a numpy array\n", + "a = alleles[:10].compute()\n", + "a" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "XoHkXz0Cbk_p" + }, + "source": [ + "Here the first column contains the reference alleles, and the remaining columns contain the alternate alleles.\n", + "\n", + "Note that a byte string data type is used here for efficiency. E.g., the Python code `b'T'` represents a byte string containing the letter \"T\", which here stands for the nucleotide thymine.\n", + "\n", + "Note that we have chosen to genotype all samples at all sites in the genome, assuming all possible SNP alleles. Not all of these alternate alleles will actually have been observed in the `Af1` samples. To determine which sites and alleles are segregating, an allele count can be performed over the samples you are interested in. See the example below. " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "BGVj0OiyAQuX" + }, + "source": [ + "### Site filters\n", + "\n", + "SNP calling is not always reliable, and we have created some site filters to allow excluding low quality SNPs. \n", + "\n", + "Each set of site filters provides a \"filter_pass\" Boolean mask for each chromosome arm, where True indicates that the site passed the filter and is accessible to high quality SNP calling.\n", + "\n", + "The site filters data can be accessed as dask arrays as shown in the examples below. " + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 132 + }, + "id": "wh1AaMJ_QH_6", + "outputId": "e9b544fc-2db0-4f83-e23b-30258598d552" + }, + "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", + "
Array Chunk
Bytes 98.12 MiB 292.97 kiB
Shape (102882611,) (300000,)
Count 343 Tasks 343 Chunks
Type bool numpy.ndarray
\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", + " 102882611\n", + " 1\n", + "\n", + "
" + ], + "text/plain": [ + "dask.array" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# access gamb_colu_arab site filters for chromosome 2RL as a dask array\n", + "filter_pass = ds_snps['variant_filter_pass_funestus'].data\n", + "filter_pass" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "klokhPxwQH_6", + "outputId": "28c6cbfd-b6cc-46f0-9554-c027c4c57cae" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([False, False, False, False, False, False, False, False, False,\n", + " False])" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# read filter values for first 10 SNPs (True means the site passes filters)\n", + "f = filter_pass[:10].compute()\n", + "f" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note these filters are the result of different filter models. For the filters in this example, a decision-tree was used. These filters are the default ones used across functions in the API.\n", + "\n", + "We have also produced a second set of site filters, which are the result of static cutoffs on the site summary statistics. To access these hard-filters, instantiate an API client with the `site_filters_analysis` parameter as shown below.\n", + "\n", + "\n", + "```\n", + "af1_sc = malariagen_data.Af1(\n", + " site_filters_analysis=\"sc_20220908\",\n", + ")\n", + "\n", + "```\n", + "\n", + "Now, any function call via this API client will use the hard filters. For example, to access the site filters themselves and compute how many sites pass for Chromosome 3:\n", + "\n", + "```\n", + "x = af1_sc.site_filters(region=\"3RL\", mask=\"funestus\")\n", + "x\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "sMnfrmCNBzW8" + }, + "source": [ + "### SNP genotypes\n", + "\n", + "SNP genotypes for individual samples are available. Genotypes are stored as a three-dimensional array, where the first dimension corresponds to genomic positions, the second dimension is samples, and the third dimension is ploidy (2). Values coded as integers, where -1 represents a missing value, 0 represents the reference allele, and 1, 2, and 3 represent alternate alleles.\n", + "\n", + "SNP genotypes can be accessed as dask arrays as shown below." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 173 + }, + "id": "QPViDmX_QH_7", + "outputId": "125ba0b7-4e6d-4c61-f325-39e9eb9522e7" + }, + "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", + "
Array Chunk
Bytes 125.71 GiB 28.61 MiB
Shape (102882611, 656, 2) (300000, 50, 2)
Count 10976 Tasks 5488 Chunks
Type int8 numpy.ndarray
\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", + " \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", + " 2\n", + " 656\n", + " 102882611\n", + "\n", + "
" + ], + "text/plain": [ + "dask.array" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "gt = ds_snps[\"call_genotype\"].data\n", + "gt" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "lcG-QFZRRTwx" + }, + "source": [ + "Note that the columns of this array (second dimension) match the rows in the sample metadata, if the same sample sets were loaded. I.e.:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "H0pR2bOCRcLI", + "outputId": "b3283a90-3202-45e9-9482-a926594945df" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_samples = af1.sample_metadata(sample_sets=\"1.0\")\n", + "gt = ds_snps[\"call_genotype\"].data\n", + "len(df_samples) == gt.shape[1]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Xr_FJ-xARgyS" + }, + "source": [ + "You can use this correspondance to apply further subsetting operations to the genotypes by querying the sample metadata. E.g.:" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "WqyNsEwLRo0q", + "outputId": "77a966bd-5ab3-416f-fb16-8cc38f46bac2" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "found 656 funestus samples\n" + ] + } + ], + "source": [ + "loc_funestus = df_samples.eval(\"taxon == 'funestus'\").values\n", + "print(f\"found {np.count_nonzero(loc_funestus)} funestus samples\")" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 430 + }, + "id": "auvV_O0Dx1GT", + "outputId": "e3991a1a-1289-4e3d-f3f3-1539d7d336d0" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.Dataset>\n",
+       "Dimensions:                       (variants: 102882611, alleles: 4, samples: 656, ploidy: 2)\n",
+       "Coordinates:\n",
+       "    variant_position              (variants) int32 dask.array<chunksize=(524288,), meta=np.ndarray>\n",
+       "    variant_contig                (variants) uint8 dask.array<chunksize=(524288,), meta=np.ndarray>\n",
+       "    sample_id                     (samples) <U36 dask.array<chunksize=(36,), meta=np.ndarray>\n",
+       "Dimensions without coordinates: variants, alleles, samples, ploidy\n",
+       "Data variables:\n",
+       "    variant_allele                (variants, alleles) |S1 dask.array<chunksize=(524288, 1), meta=np.ndarray>\n",
+       "    variant_filter_pass_funestus  (variants) bool dask.array<chunksize=(300000,), meta=np.ndarray>\n",
+       "    call_genotype                 (variants, samples, ploidy) int8 dask.array<chunksize=(300000, 36, 2), meta=np.ndarray>\n",
+       "    call_GQ                       (variants, samples) int8 dask.array<chunksize=(300000, 36), meta=np.ndarray>\n",
+       "    call_MQ                       (variants, samples) float32 dask.array<chunksize=(300000, 36), meta=np.ndarray>\n",
+       "    call_AD                       (variants, samples, alleles) int16 dask.array<chunksize=(300000, 36, 4), meta=np.ndarray>\n",
+       "    call_genotype_mask            (variants, samples, ploidy) bool dask.array<chunksize=(300000, 36, 2), meta=np.ndarray>\n",
+       "Attributes:\n",
+       "    contigs:  ('2RL', '3RL', 'X')
" + ], + "text/plain": [ + "\n", + "Dimensions: (variants: 102882611, alleles: 4, samples: 656, ploidy: 2)\n", + "Coordinates:\n", + " variant_position (variants) int32 dask.array\n", + " variant_contig (variants) uint8 dask.array\n", + " sample_id (samples) \n", + "Dimensions without coordinates: variants, alleles, samples, ploidy\n", + "Data variables:\n", + " variant_allele (variants, alleles) |S1 dask.array\n", + " variant_filter_pass_funestus (variants) bool dask.array\n", + " call_genotype (variants, samples, ploidy) int8 dask.array\n", + " call_GQ (variants, samples) int8 dask.array\n", + " call_MQ (variants, samples) float32 dask.array\n", + " call_AD (variants, samples, alleles) int16 dask.array\n", + " call_genotype_mask (variants, samples, ploidy) bool dask.array\n", + "Attributes:\n", + " contigs: ('2RL', '3RL', 'X')" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ds_snps_funestus = ds_snps.isel(samples=loc_funestus)\n", + "ds_snps_funestus" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "xAreXD3ySw_e" + }, + "source": [ + "Data can be read into memory as numpy arrays, e.g., read genotypes for the first 5 SNPs and the first 3 samples:" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "AEH-iHpYQH_7", + "outputId": "04e075b3-5f18-4e6f-882e-898335312d71" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[[-1, -1],\n", + " [-1, -1],\n", + " [-1, -1]],\n", + "\n", + " [[-1, -1],\n", + " [-1, -1],\n", + " [-1, -1]],\n", + "\n", + " [[-1, -1],\n", + " [-1, -1],\n", + " [-1, -1]],\n", + "\n", + " [[-1, -1],\n", + " [-1, -1],\n", + " [-1, -1]],\n", + "\n", + " [[-1, -1],\n", + " [-1, -1],\n", + " [-1, -1]]], dtype=int8)" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g = gt[:5, :3, :].compute()\n", + "g" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "vcMEGuGsCSig" + }, + "source": [ + "If you want to work with the genotype calls, you may find it convenient to use [scikit-allel](http://scikit-allel.readthedocs.org/).\n", + "E.g., the code below sets up a genotype array." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 207 + }, + "id": "TBuf01BdbJ6z", + "outputId": "bec96465-4d21-4647-ced0-c687674dad40" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
<GenotypeDaskArray shape=(102882611, 656, 2) dtype=int8>
01234...651652653654655
0./../../../../...../../../../../.
1./../../../../...../../../../../.
2./../../../../...../../../../../.
......
102882608./../../../../...../../../../../.
102882609./../../../../...../../../../../.
102882610./../../../../...../../../../../.
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# use the scikit-allel wrapper class for genotype calls\n", + "gt = allel.GenotypeDaskArray(ds_snps[\"call_genotype\"].data)\n", + "gt" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "D40qZqB5gmJg" + }, + "source": [ + "## Copy number variation (CNV) data\n", + "\n", + "Data on copy number variation within the `Af1` cohort are available as three separate data types:\n", + "\n", + "* **HMM** -- Genome-wide inferences of copy number state within each individual mosquito in 300 bp non-overlapping windows.\n", + "* **Coverage calls** -- Genome-wide copy number variant calls, derived from the HMM outputs by analysing contiguous regions of elevated copy number state then clustering of variants across individuals based on breakpoint proximity.\n", + "\n", + "For more information on the methods used to generate these data, see the [variant-calling methods](methods) page.\n", + "\n", + "The `malariagen_data` Python package provides some convenience functions for accessing these data, illustrated below." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "HwZnhTkSgmJh" + }, + "source": [ + "### CNV HMM\n", + "\n", + "Access HMM data via the `cnv_hmm()` method, which returns an [xarray](http://xarray.pydata.org/en/stable/) dataset. E.g.:" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 367 + }, + "id": "OLQTv13egmJh", + "outputId": "cd354704-36fd-496e-8882-081e4cbe319b" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.Dataset>\n",
+       "Dimensions:                   (variants: 342946, samples: 511)\n",
+       "Coordinates:\n",
+       "    variant_end               (variants) int32 dask.array<chunksize=(65536,), meta=np.ndarray>\n",
+       "    variant_contig            (variants) uint8 dask.array<chunksize=(342946,), meta=np.ndarray>\n",
+       "    variant_position          (variants) int32 dask.array<chunksize=(65536,), meta=np.ndarray>\n",
+       "    sample_id                 (samples) object dask.array<chunksize=(8,), meta=np.ndarray>\n",
+       "Dimensions without coordinates: variants, samples\n",
+       "Data variables:\n",
+       "    call_CN                   (variants, samples) int8 dask.array<chunksize=(65536, 8), meta=np.ndarray>\n",
+       "    call_RawCov               (variants, samples) int32 dask.array<chunksize=(65536, 8), meta=np.ndarray>\n",
+       "    call_NormCov              (variants, samples) float32 dask.array<chunksize=(65536, 8), meta=np.ndarray>\n",
+       "    sample_coverage_variance  (samples) float32 dask.array<chunksize=(8,), meta=np.ndarray>\n",
+       "    sample_is_high_variance   (samples) bool dask.array<chunksize=(8,), meta=np.ndarray>\n",
+       "Attributes:\n",
+       "    contigs:  ('2RL', '3RL', 'X')
" + ], + "text/plain": [ + "\n", + "Dimensions: (variants: 342946, samples: 511)\n", + "Coordinates:\n", + " variant_end (variants) int32 dask.array\n", + " variant_contig (variants) uint8 dask.array\n", + " variant_position (variants) int32 dask.array\n", + " sample_id (samples) object dask.array\n", + "Dimensions without coordinates: variants, samples\n", + "Data variables:\n", + " call_CN (variants, samples) int8 dask.array\n", + " call_RawCov (variants, samples) int32 dask.array\n", + " call_NormCov (variants, samples) float32 dask.array\n", + " sample_coverage_variance (samples) float32 dask.array\n", + " sample_is_high_variance (samples) bool dask.array\n", + "Attributes:\n", + " contigs: ('2RL', '3RL', 'X')" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ds_hmm = af1.cnv_hmm(region=\"2RL\", sample_sets=\"1.0\")\n", + "ds_hmm" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "EL8QDNS6gmJh" + }, + "source": [ + "Here \"variants\" are the 300 bp windows in which coverage was calculated and the HMM fitted. Window start positions are given by the `variant_position` array and ends are given by `variant_end`." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "sfb4Vk0LgmJh", + "outputId": "df4139fd-2e6a-4606-a6a8-857818ce5abd" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 1, 301, 601, ..., 102882901, 102883201,\n", + " 102883501], dtype=int32)" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pos = ds_hmm['variant_position'].values\n", + "pos" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "lGL4D8qYgmJh", + "outputId": "a6bc6f9c-5669-410e-a4a7-f8daf249a1d1" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 300, 600, 900, ..., 102883200, 102883500,\n", + " 102883511], dtype=int32)" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "end = ds_hmm['variant_end'].values\n", + "end" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "15zeXjzFgmJh" + }, + "source": [ + "Copy number state is given by the `call_CN` array, where rows are windows and columns are individual samples.\n", + "\n", + "On the autosomes (2R, 2L, 3R, 3L) normal diploid copy number is 2. Values greater than 2 mean amplification, less then 2 mean deletion.\n", + "\n", + "On the X chromosome, normal copy number is 2 in females and 1 in males.\n", + "\n", + "For all chromosomes, -1 means missing, i.e., the window was not included.\n", + "\n", + "Rows are variants (windows), columns are individual samples." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "JVvGFxPzgmJi", + "outputId": "26cf53d6-8526-4079-f478-e21e312ccc63" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[-1, -1, -1, ..., -1, -1, -1],\n", + " [-1, -1, -1, ..., -1, -1, -1],\n", + " [-1, -1, -1, ..., -1, -1, -1],\n", + " ...,\n", + " [-1, -1, -1, ..., -1, -1, -1],\n", + " [-1, -1, -1, ..., -1, -1, -1],\n", + " [-1, -1, -1, ..., -1, -1, -1]], dtype=int8)" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cn = ds_hmm['call_CN'].values\n", + "cn" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Gj3gGqIIgmJi" + }, + "source": [ + "### CNV coverage calls\n", + "\n", + "Coverage calls can be accessed via the `cnv_coverage_calls()` method, which returns an xarray dataset.\n", + "\n", + "N.B., coverage calls can only be accessed on sample set at a time, because the CNV alleles do not necessarily match between sample sets. E.g.:" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 367 + }, + "id": "OyQ3r8jGgmJi", + "outputId": "6e9d64cd-6e43-4fbd-cc2d-7c2c52d963f7" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.Dataset>\n",
+       "Dimensions:              (variants: 30614, samples: 8)\n",
+       "Coordinates:\n",
+       "    variant_position     (variants) int32 dask.array<chunksize=(30614,), meta=np.ndarray>\n",
+       "    variant_end          (variants) int32 dask.array<chunksize=(30614,), meta=np.ndarray>\n",
+       "    variant_contig       (variants) uint8 dask.array<chunksize=(30614,), meta=np.ndarray>\n",
+       "    variant_id           (variants) object dask.array<chunksize=(30614,), meta=np.ndarray>\n",
+       "    sample_id            (samples) object dask.array<chunksize=(8,), meta=np.ndarray>\n",
+       "Dimensions without coordinates: variants, samples\n",
+       "Data variables:\n",
+       "    variant_CIPOS        (variants) int32 dask.array<chunksize=(30614,), meta=np.ndarray>\n",
+       "    variant_CIEND        (variants) int32 dask.array<chunksize=(30614,), meta=np.ndarray>\n",
+       "    variant_filter_pass  (variants) bool dask.array<chunksize=(30614,), meta=np.ndarray>\n",
+       "    call_genotype        (variants, samples) int8 dask.array<chunksize=(30614, 8), meta=np.ndarray>\n",
+       "Attributes:\n",
+       "    contigs:  ('2RL', '3RL', 'X')
" + ], + "text/plain": [ + "\n", + "Dimensions: (variants: 30614, samples: 8)\n", + "Coordinates:\n", + " variant_position (variants) int32 dask.array\n", + " variant_end (variants) int32 dask.array\n", + " variant_contig (variants) uint8 dask.array\n", + " variant_id (variants) object dask.array\n", + " sample_id (samples) object dask.array\n", + "Dimensions without coordinates: variants, samples\n", + "Data variables:\n", + " variant_CIPOS (variants) int32 dask.array\n", + " variant_CIEND (variants) int32 dask.array\n", + " variant_filter_pass (variants) bool dask.array\n", + " call_genotype (variants, samples) int8 dask.array\n", + "Attributes:\n", + " contigs: ('2RL', '3RL', 'X')" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ds_cnv = af1.cnv_coverage_calls(\n", + " region='2RL', \n", + " analysis='funestus', \n", + " sample_set='1229-VO-GH-DADZIE-VMF00095'\n", + ")\n", + "ds_cnv" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "qvUM-luggmJj" + }, + "source": [ + "Here \"variants\" are copy number variants, inferred from the HMM results. CNV start positions are given by the `variant_position` array and ends are given by `variant_end`." + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "6x0P-EyAgmJj", + "outputId": "46b1c201-50bc-43d1-9333-b455df43614d" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 80101, 80101, 83401, ..., 102870901, 102870901,\n", + " 102872101], dtype=int32)" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pos = ds_cnv['variant_position'].values\n", + "pos" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Hd4K_BVVgmJj", + "outputId": "80238f45-8660-4d3e-9be3-8fef36ba01d0" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 82200, 83400, 86400, ..., 102872400, 102873600,\n", + " 102873600], dtype=int32)" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "end = ds_cnv['variant_end'].values\n", + "end" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "XcvUG880gmJj" + }, + "source": [ + "CNV genotypes are given by the `call_genotype` array, coded as 0 for absence and 1 for presence of the CNV allele. Rows are CNV alleles and columns are individual samples." + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "VfXRPYPsgmJj", + "outputId": "5f6722f7-0c71-493f-8499-10d646f12f80" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[0, 0, 0, ..., 0, 0, 0],\n", + " [0, 0, 0, ..., 0, 0, 0],\n", + " [0, 0, 0, ..., 0, 0, 0],\n", + " ...,\n", + " [0, 0, 0, ..., 0, 0, 0],\n", + " [0, 0, 0, ..., 0, 0, 0],\n", + " [0, 0, 0, ..., 0, 0, 0]], dtype=int8)" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "gt = ds_cnv['call_genotype'].values\n", + "gt" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "TMFEbBH8gmJj" + }, + "source": [ + "Note that not all samples will have been included in the coverage calls, as some are excluded due to high coverage variance. Use the `sample_id` array to access the samples included in a given dataset, e.g.:" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "cNz9L5l9gmJk", + "outputId": "70d8d3c3-3891-4110-bed1-3090198c030c" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array(['VBS24196', 'VBS24197', 'VBS24201', 'VBS24213', 'VBS24216'],\n", + " dtype=object)" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samples = ds_cnv['sample_id'].values\n", + "samples[:5]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "IilAkh1JwRX6" + }, + "source": [ + "## Haplotypes\n", + "\n", + "The `Af1` data resource also includes haplotype reference panels, which were obtained by [phasing](https://en.wikipedia.org/wiki/Haplotype_estimation) the SNP calls. Phasing involves resolving the genotypes within each individual into a pair of haplotypes providing information about the two different DNA sequences inherited, one from each parent. Haplotypes provide greater power for a range of population genetic analyses, such as genome-wide scans for signals of recent selection, or analysis of adaptive gene flow between populations.\n", + "\n", + "Data can be accessed in the cloud via the ``haplotypes()`` method. E.g., access haplotypes from the \"funestus\" analysis for all available samples, for chromosome 2RL. This method returns an [xarray Dataset](http://xarray.pydata.org/en/stable/user-guide/data-structures.html#dataset)." + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 283 + }, + "id": "SaboHiwByToq", + "outputId": "a0fe48cf-dd93-479d-a0c9-1ba5d10ef59b" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.Dataset>\n",
+       "Dimensions:           (variants: 20633859, alleles: 2, samples: 656, ploidy: 2)\n",
+       "Coordinates:\n",
+       "    variant_position  (variants) int32 dask.array<chunksize=(262144,), meta=np.ndarray>\n",
+       "    variant_contig    (variants) uint8 dask.array<chunksize=(20633859,), meta=np.ndarray>\n",
+       "    sample_id         (samples) object dask.array<chunksize=(36,), meta=np.ndarray>\n",
+       "Dimensions without coordinates: variants, alleles, samples, ploidy\n",
+       "Data variables:\n",
+       "    variant_allele    (variants, alleles) |S1 dask.array<chunksize=(262144, 1), meta=np.ndarray>\n",
+       "    call_genotype     (variants, samples, ploidy) int8 dask.array<chunksize=(262144, 36, 2), meta=np.ndarray>\n",
+       "Attributes:\n",
+       "    contigs:   ('2RL', '3RL', 'X')\n",
+       "    analysis:  funestus
" + ], + "text/plain": [ + "\n", + "Dimensions: (variants: 20633859, alleles: 2, samples: 656, ploidy: 2)\n", + "Coordinates:\n", + " variant_position (variants) int32 dask.array\n", + " variant_contig (variants) uint8 dask.array\n", + " sample_id (samples) object dask.array\n", + "Dimensions without coordinates: variants, alleles, samples, ploidy\n", + "Data variables:\n", + " variant_allele (variants, alleles) |S1 dask.array\n", + " call_genotype (variants, samples, ploidy) int8 dask.array\n", + "Attributes:\n", + " contigs: ('2RL', '3RL', 'X')\n", + " analysis: funestus" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ds_haps = af1.haplotypes(region=\"2RL\", analysis=\"funestus\", sample_sets=\"1.0\")\n", + "ds_haps" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "UuapIdh8yVzF" + }, + "source": [ + "Here we have haplotype data for 656 samples at 20,633,859 SNPs.\n", + "\n", + "The SNP positions and alleles can be accessed as follows." + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 132 + }, + "id": "6xtyomWQydHl", + "outputId": "54c07b6c-f36f-4992-9a07-2297602e2e72" + }, + "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", + "
Array Chunk
Bytes 78.71 MiB 1.00 MiB
Shape (20633859,) (262144,)
Count 79 Tasks 79 Chunks
Type int32 numpy.ndarray
\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", + " 20633859\n", + " 1\n", + "\n", + "
" + ], + "text/plain": [ + "dask.array" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# access haplotype SNP positions\n", + "pos = ds_haps[\"variant_position\"].data # dask array\n", + "pos" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "T_5d5JWayfmW", + "outputId": "704b7f0f-0635-4ac9-f54e-f77000192968" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([79113, 79116, 79117, 79120, 79128, 79129, 79130, 79133, 79134,\n", + " 79136], dtype=int32)" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# load positions of first 10 haplotype SNPs\n", + "pos[:10].compute() # numpy array" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 197 + }, + "id": "1c5mKn-Gyhfi", + "outputId": "b7873b6d-4ebc-415c-c81c-9309fbfd3d56" + }, + "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", + "
Array Chunk
Bytes 39.36 MiB 256.00 kiB
Shape (20633859, 2) (262144, 1)
Count 474 Tasks 158 Chunks
Type |S1 numpy.ndarray
\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", + " 2\n", + " 20633859\n", + "\n", + "
" + ], + "text/plain": [ + "dask.array" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# access haplotype SNP alleles\n", + "alleles = ds_haps[\"variant_allele\"].data # dask array\n", + "alleles" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "DebkxYr7ylDW", + "outputId": "f5329191-c2cc-4087-c8e5-baeb10b03f36" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[b'T', b'A'],\n", + " [b'A', b'G'],\n", + " [b'T', b'A'],\n", + " [b'T', b'C'],\n", + " [b'A', b'G'],\n", + " [b'A', b'T'],\n", + " [b'A', b'G'],\n", + " [b'G', b'A'],\n", + " [b'A', b'G'],\n", + " [b'A', b'T']], dtype='|S1')" + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# load alleles of first 10 haplotype SNPs - note all are biallelic\n", + "alleles[:10].compute() # numpy array" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "5GzqrxDHXAud" + }, + "source": [ + "The phased genotypes can be accessed as follows." + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 173 + }, + "id": "_W3IP43Zynsy", + "outputId": "491fa5c8-558c-4f83-e588-8fc3db0071c3" + }, + "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", + "
Array Chunk
Bytes 25.21 GiB 32.00 MiB
Shape (20633859, 656, 2) (262144, 64, 2)
Count 2212 Tasks 1106 Chunks
Type int8 numpy.ndarray
\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", + " \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", + " 2\n", + " 656\n", + " 20633859\n", + "\n", + "
" + ], + "text/plain": [ + "dask.array" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# access genotypes\n", + "gt = ds_haps[\"call_genotype\"].data # dask array\n", + "gt" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 207 + }, + "id": "qUuzaZ8B3z8T", + "outputId": "b9ace447-d343-4ed0-9166-9c17e97bf86a" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
<GenotypeDaskArray shape=(20633859, 656, 2) dtype=int8>
01234...651652653654655
00/00/00/00/00/0...0/00/00/00/00/0
10/00/00/00/00/0...0/00/00/00/00/0
20/00/00/00/00/0...0/00/00/00/00/0
......
206338560/00/00/00/00/0...0/00/00/00/00/0
206338570/00/00/00/00/0...0/00/00/00/00/0
206338580/11/01/00/10/1...0/11/00/10/00/0
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# wrap as scikit-allel genotype array\n", + "gt = allel.GenotypeDaskArray(ds_haps[\"call_genotype\"].data)\n", + "gt" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 207 + }, + "id": "AHY9z5Bp31wJ", + "outputId": "4dcec211-eb6d-45c9-ff2a-6e27218aea02" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
<HaplotypeDaskArray shape=(20633859, 1312) dtype=int8>
01234...13071308130913101311
000000...00000
100000...00000
200000...00000
......
2063385600000...00000
2063385700000...00000
2063385801101...10000
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# convert to scikit-allel haplotype array - useful for some analyses\n", + "ht = gt.to_haplotypes()\n", + "ht" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "lSL0FWMv39Xf" + }, + "source": [ + "Note that in the haplotype array above, each row is a SNP and each column is a haplotype. There were $656$ samples in this analysis, and so we have $1312$ ($2\\times656$) haplotypes." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ulR0JYZT4J0l" + }, + "source": [ + "### Using sample metadata to subset haplotypes\n", + "\n", + "For some analyses, you'll want to subset the haplotypes, e.g., by location and species. In order to perform subsetting, you need to obtain sample metadata, and align it with the haplotype data. This ensures that every row in the sample metadata dataframe corresponds to every column in the phased genotypes array. E.g.:" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 386 + }, + "id": "v7u8OA7t4ZMl", + "outputId": "d0b057f5-6805-4dd1-eeb2-4ce2744fc780" + }, + "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", + " \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", + " \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", + "
sample_idpartner_sample_idcontributorcountrylocationyearmonthlatitudelongitudesex_call...admin1_nameadmin1_isoadmin2_nametaxoncohort_admin1_yearcohort_admin1_monthcohort_admin1_quartercohort_admin2_yearcohort_admin2_monthcohort_admin2_quarter
0VBS241951229-GH-A-GH01Samuel DadzieGhanaDimabi201789.420-1.083F...Northern RegionGH-NPTolonfunestusGH-NP_fune_2017GH-NP_fune_2017_08GH-NP_fune_2017_Q3GH-NP_Tolon_fune_2017GH-NP_Tolon_fune_2017_08GH-NP_Tolon_fune_2017_Q3
1VBS241961229-GH-A-GH02Samuel DadzieGhanaGbullung201779.488-1.009F...Northern RegionGH-NPKumbungufunestusGH-NP_fune_2017GH-NP_fune_2017_07GH-NP_fune_2017_Q3GH-NP_Kumbungu_fune_2017GH-NP_Kumbungu_fune_2017_07GH-NP_Kumbungu_fune_2017_Q3
2VBS241971229-GH-A-GH03Samuel DadzieGhanaDimabi201779.420-1.083F...Northern RegionGH-NPTolonfunestusGH-NP_fune_2017GH-NP_fune_2017_07GH-NP_fune_2017_Q3GH-NP_Tolon_fune_2017GH-NP_Tolon_fune_2017_07GH-NP_Tolon_fune_2017_Q3
3VBS241981229-GH-A-GH04Samuel DadzieGhanaDimabi201789.420-1.083F...Northern RegionGH-NPTolonfunestusGH-NP_fune_2017GH-NP_fune_2017_08GH-NP_fune_2017_Q3GH-NP_Tolon_fune_2017GH-NP_Tolon_fune_2017_08GH-NP_Tolon_fune_2017_Q3
4VBS241991229-GH-A-GH05Samuel DadzieGhanaGupanarigu201789.497-0.952F...Northern RegionGH-NPKumbungufunestusGH-NP_fune_2017GH-NP_fune_2017_08GH-NP_fune_2017_Q3GH-NP_Kumbungu_fune_2017GH-NP_Kumbungu_fune_2017_08GH-NP_Kumbungu_fune_2017_Q3
\n", + "

5 rows × 26 columns

\n", + "
" + ], + "text/plain": [ + " sample_id partner_sample_id contributor country location year month \\\n", + "0 VBS24195 1229-GH-A-GH01 Samuel Dadzie Ghana Dimabi 2017 8 \n", + "1 VBS24196 1229-GH-A-GH02 Samuel Dadzie Ghana Gbullung 2017 7 \n", + "2 VBS24197 1229-GH-A-GH03 Samuel Dadzie Ghana Dimabi 2017 7 \n", + "3 VBS24198 1229-GH-A-GH04 Samuel Dadzie Ghana Dimabi 2017 8 \n", + "4 VBS24199 1229-GH-A-GH05 Samuel Dadzie Ghana Gupanarigu 2017 8 \n", + "\n", + " latitude longitude sex_call ... admin1_name admin1_iso admin2_name \\\n", + "0 9.420 -1.083 F ... Northern Region GH-NP Tolon \n", + "1 9.488 -1.009 F ... Northern Region GH-NP Kumbungu \n", + "2 9.420 -1.083 F ... Northern Region GH-NP Tolon \n", + "3 9.420 -1.083 F ... Northern Region GH-NP Tolon \n", + "4 9.497 -0.952 F ... Northern Region GH-NP Kumbungu \n", + "\n", + " taxon cohort_admin1_year cohort_admin1_month cohort_admin1_quarter \\\n", + "0 funestus GH-NP_fune_2017 GH-NP_fune_2017_08 GH-NP_fune_2017_Q3 \n", + "1 funestus GH-NP_fune_2017 GH-NP_fune_2017_07 GH-NP_fune_2017_Q3 \n", + "2 funestus GH-NP_fune_2017 GH-NP_fune_2017_07 GH-NP_fune_2017_Q3 \n", + "3 funestus GH-NP_fune_2017 GH-NP_fune_2017_08 GH-NP_fune_2017_Q3 \n", + "4 funestus GH-NP_fune_2017 GH-NP_fune_2017_08 GH-NP_fune_2017_Q3 \n", + "\n", + " cohort_admin2_year cohort_admin2_month \\\n", + "0 GH-NP_Tolon_fune_2017 GH-NP_Tolon_fune_2017_08 \n", + "1 GH-NP_Kumbungu_fune_2017 GH-NP_Kumbungu_fune_2017_07 \n", + "2 GH-NP_Tolon_fune_2017 GH-NP_Tolon_fune_2017_07 \n", + "3 GH-NP_Tolon_fune_2017 GH-NP_Tolon_fune_2017_08 \n", + "4 GH-NP_Kumbungu_fune_2017 GH-NP_Kumbungu_fune_2017_08 \n", + "\n", + " cohort_admin2_quarter \n", + "0 GH-NP_Tolon_fune_2017_Q3 \n", + "1 GH-NP_Kumbungu_fune_2017_Q3 \n", + "2 GH-NP_Tolon_fune_2017_Q3 \n", + "3 GH-NP_Tolon_fune_2017_Q3 \n", + "4 GH-NP_Kumbungu_fune_2017_Q3 \n", + "\n", + "[5 rows x 26 columns]" + ] + }, + "execution_count": 49, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# load sample metadata\n", + "df_samples = af1.sample_metadata(sample_sets=\"1.0\")\n", + "df_samples.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "D2tkmZ0b4cQd", + "outputId": "4d758e09-0ef0-4d9f-b6d8-af5246e6b1d3" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array(['VBS24195', 'VBS24196', 'VBS24197', 'VBS24198', 'VBS24199'],\n", + " dtype=object)" + ] + }, + "execution_count": 50, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# load IDs of phased samples\n", + "samples_phased = ds_haps['sample_id'].values\n", + "samples_phased[:5]" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 386 + }, + "id": "to11muCk4hJp", + "outputId": "532d54ed-3020-4c65-dab3-86897a8903b5" + }, + "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", + " \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", + " \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", + "
sample_idpartner_sample_idcontributorcountrylocationyearmonthlatitudelongitudesex_call...admin1_nameadmin1_isoadmin2_nametaxoncohort_admin1_yearcohort_admin1_monthcohort_admin1_quartercohort_admin2_yearcohort_admin2_monthcohort_admin2_quarter
0VBS241951229-GH-A-GH01Samuel DadzieGhanaDimabi201789.420-1.083F...Northern RegionGH-NPTolonfunestusGH-NP_fune_2017GH-NP_fune_2017_08GH-NP_fune_2017_Q3GH-NP_Tolon_fune_2017GH-NP_Tolon_fune_2017_08GH-NP_Tolon_fune_2017_Q3
1VBS241961229-GH-A-GH02Samuel DadzieGhanaGbullung201779.488-1.009F...Northern RegionGH-NPKumbungufunestusGH-NP_fune_2017GH-NP_fune_2017_07GH-NP_fune_2017_Q3GH-NP_Kumbungu_fune_2017GH-NP_Kumbungu_fune_2017_07GH-NP_Kumbungu_fune_2017_Q3
2VBS241971229-GH-A-GH03Samuel DadzieGhanaDimabi201779.420-1.083F...Northern RegionGH-NPTolonfunestusGH-NP_fune_2017GH-NP_fune_2017_07GH-NP_fune_2017_Q3GH-NP_Tolon_fune_2017GH-NP_Tolon_fune_2017_07GH-NP_Tolon_fune_2017_Q3
3VBS241981229-GH-A-GH04Samuel DadzieGhanaDimabi201789.420-1.083F...Northern RegionGH-NPTolonfunestusGH-NP_fune_2017GH-NP_fune_2017_08GH-NP_fune_2017_Q3GH-NP_Tolon_fune_2017GH-NP_Tolon_fune_2017_08GH-NP_Tolon_fune_2017_Q3
4VBS241991229-GH-A-GH05Samuel DadzieGhanaGupanarigu201789.497-0.952F...Northern RegionGH-NPKumbungufunestusGH-NP_fune_2017GH-NP_fune_2017_08GH-NP_fune_2017_Q3GH-NP_Kumbungu_fune_2017GH-NP_Kumbungu_fune_2017_08GH-NP_Kumbungu_fune_2017_Q3
\n", + "

5 rows × 26 columns

\n", + "
" + ], + "text/plain": [ + " sample_id partner_sample_id contributor country location year month \\\n", + "0 VBS24195 1229-GH-A-GH01 Samuel Dadzie Ghana Dimabi 2017 8 \n", + "1 VBS24196 1229-GH-A-GH02 Samuel Dadzie Ghana Gbullung 2017 7 \n", + "2 VBS24197 1229-GH-A-GH03 Samuel Dadzie Ghana Dimabi 2017 7 \n", + "3 VBS24198 1229-GH-A-GH04 Samuel Dadzie Ghana Dimabi 2017 8 \n", + "4 VBS24199 1229-GH-A-GH05 Samuel Dadzie Ghana Gupanarigu 2017 8 \n", + "\n", + " latitude longitude sex_call ... admin1_name admin1_iso admin2_name \\\n", + "0 9.420 -1.083 F ... Northern Region GH-NP Tolon \n", + "1 9.488 -1.009 F ... Northern Region GH-NP Kumbungu \n", + "2 9.420 -1.083 F ... Northern Region GH-NP Tolon \n", + "3 9.420 -1.083 F ... Northern Region GH-NP Tolon \n", + "4 9.497 -0.952 F ... Northern Region GH-NP Kumbungu \n", + "\n", + " taxon cohort_admin1_year cohort_admin1_month cohort_admin1_quarter \\\n", + "0 funestus GH-NP_fune_2017 GH-NP_fune_2017_08 GH-NP_fune_2017_Q3 \n", + "1 funestus GH-NP_fune_2017 GH-NP_fune_2017_07 GH-NP_fune_2017_Q3 \n", + "2 funestus GH-NP_fune_2017 GH-NP_fune_2017_07 GH-NP_fune_2017_Q3 \n", + "3 funestus GH-NP_fune_2017 GH-NP_fune_2017_08 GH-NP_fune_2017_Q3 \n", + "4 funestus GH-NP_fune_2017 GH-NP_fune_2017_08 GH-NP_fune_2017_Q3 \n", + "\n", + " cohort_admin2_year cohort_admin2_month \\\n", + "0 GH-NP_Tolon_fune_2017 GH-NP_Tolon_fune_2017_08 \n", + "1 GH-NP_Kumbungu_fune_2017 GH-NP_Kumbungu_fune_2017_07 \n", + "2 GH-NP_Tolon_fune_2017 GH-NP_Tolon_fune_2017_07 \n", + "3 GH-NP_Tolon_fune_2017 GH-NP_Tolon_fune_2017_08 \n", + "4 GH-NP_Kumbungu_fune_2017 GH-NP_Kumbungu_fune_2017_08 \n", + "\n", + " cohort_admin2_quarter \n", + "0 GH-NP_Tolon_fune_2017_Q3 \n", + "1 GH-NP_Kumbungu_fune_2017_Q3 \n", + "2 GH-NP_Tolon_fune_2017_Q3 \n", + "3 GH-NP_Tolon_fune_2017_Q3 \n", + "4 GH-NP_Kumbungu_fune_2017_Q3 \n", + "\n", + "[5 rows x 26 columns]" + ] + }, + "execution_count": 51, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# align sample metadata to haplotypes\n", + "df_samples_phased = df_samples.set_index(\"sample_id\").loc[samples_phased].reset_index()\n", + "df_samples_phased.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "9yPZeWiM4mc5", + "outputId": "6fb945e7-21ca-4f66-92e9-bd10279713ab" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,\n", + " 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,\n", + " 34, 35])" + ] + }, + "execution_count": 53, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# now define some cohort of interest and locate samples\n", + "cohort_query = \"country == 'Ghana' and taxon == 'funestus' and year == 2017\"\n", + "loc_cohort_samples = df_samples_phased.query(cohort_query).index.values\n", + "loc_cohort_samples" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 283 + }, + "id": "_0Qql83z5KDF", + "outputId": "6a1b0681-4951-491b-8cb8-2af632b153d4" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.Dataset>\n",
+       "Dimensions:           (variants: 20633859, alleles: 2, samples: 36, ploidy: 2)\n",
+       "Coordinates:\n",
+       "    variant_position  (variants) int32 dask.array<chunksize=(262144,), meta=np.ndarray>\n",
+       "    variant_contig    (variants) uint8 dask.array<chunksize=(20633859,), meta=np.ndarray>\n",
+       "    sample_id         (samples) object dask.array<chunksize=(36,), meta=np.ndarray>\n",
+       "Dimensions without coordinates: variants, alleles, samples, ploidy\n",
+       "Data variables:\n",
+       "    variant_allele    (variants, alleles) |S1 dask.array<chunksize=(262144, 1), meta=np.ndarray>\n",
+       "    call_genotype     (variants, samples, ploidy) int8 dask.array<chunksize=(262144, 36, 2), meta=np.ndarray>\n",
+       "Attributes:\n",
+       "    contigs:   ('2RL', '3RL', 'X')\n",
+       "    analysis:  funestus
" + ], + "text/plain": [ + "\n", + "Dimensions: (variants: 20633859, alleles: 2, samples: 36, ploidy: 2)\n", + "Coordinates:\n", + " variant_position (variants) int32 dask.array\n", + " variant_contig (variants) uint8 dask.array\n", + " sample_id (samples) object dask.array\n", + "Dimensions without coordinates: variants, alleles, samples, ploidy\n", + "Data variables:\n", + " variant_allele (variants, alleles) |S1 dask.array\n", + " call_genotype (variants, samples, ploidy) int8 dask.array\n", + "Attributes:\n", + " contigs: ('2RL', '3RL', 'X')\n", + " analysis: funestus" + ] + }, + "execution_count": 54, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# subset haplotypes to cohort\n", + "ds_haps_cohort = ds_haps.isel(samples=loc_cohort_samples)\n", + "ds_haps_cohort" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 207 + }, + "id": "3lyENPmm5S-t", + "outputId": "393e70fe-1a01-4256-8ea5-e2b0fad0ece3" + }, + "outputs": [ + { + "data": { + "text/html": [ + "
<HaplotypeDaskArray shape=(20633859, 72) dtype=int8>
01234...6768697071
000000...00000
100000...00000
200000...00000
......
2063385600000...00000
2063385700000...00000
2063385801101...00101
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 55, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# now access subsetted haplotypes\n", + "gt_cohort = allel.GenotypeDaskArray(ds_haps_cohort['call_genotype'].data)\n", + "ht_cohort = gt_cohort.to_haplotypes()\n", + "ht_cohort" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Q2a0a0KY5DMh" + }, + "source": [ + "Note there are $36$ samples in the cohort and thus $72$ ($2\\times36$) haplotypes. " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "arZZ_OcPoSQV" + }, + "source": [ + "## Example computation\n", + "\n", + "Here's an example computation to count the number of segregating SNPs on chromosome arm 3R that also pass gamb_colu_arab site filters. This may take a minute or two, because it is scanning genotype calls at millions of SNPs in hundreds of samples." + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "mPUEp61aQH_8", + "outputId": "c8eecf02-09d0-4797-f25d-cf56ae1c8bb5" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[########################################] | 100% Completed | 30.1s\n" + ] + }, + { + "data": { + "text/plain": [ + "4779799" + ] + }, + "execution_count": 56, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# choose chromosome arm\n", + "region = \"2RL\"\n", + "\n", + "# choose site filter mask\n", + "mask = \"funestus\"\n", + "\n", + "# choose sample sets\n", + "sample_sets = [\"1229-VO-GH-DADZIE-VMF00095\"]\n", + "\n", + "# access SNP calls\n", + "ds_snps = af1.snp_calls(region=region, sample_sets=sample_sets)\n", + "\n", + "# locate pass sites\n", + "loc_pass = ds_snps[f\"variant_filter_pass_{mask}\"].values\n", + "\n", + "# perform an allele count over genotypes\n", + "gt = allel.GenotypeDaskArray(ds_snps[\"call_genotype\"].data)\n", + "with ProgressBar():\n", + " ac = gt.count_alleles(max_allele=3).compute()\n", + "\n", + "# locate segregating sites\n", + "loc_seg = ac.is_segregating()\n", + "\n", + "# count segregating and pass sites\n", + "n_pass_seg = np.count_nonzero(loc_pass & loc_seg)\n", + "n_pass_seg" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "-AJqC2woiBzi" + }, + "source": [ + "For more in-depth worked examples of various analyses, see the [Af1 analysis](https://malariagen.github.io/vector-data/af1/analysis.html) page." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "OS4U1IwZgARB" + }, + "source": [ + "## Running larger computations\n", + "\n", + "Please note that free cloud computing services such as Google Colab and MyBinder provide only limited computing resources. Thus although these services are able to efficiently read `Af1` data stored on Google Cloud, you may find that you run out of memory, or computations take a long time running on a single core. If you would like any suggestions regarding how to set up more powerful compute resources in the cloud, please feel free to get in touch via the [malariagen/vector-data GitHub discussion board](https://github.com/malariagen/vector-data/discussions)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "4n73mSO-heAF" + }, + "source": [ + "## Feedback and suggestions\n", + "\n", + "If there are particular analyses you would like to run, or if you have other suggestions for useful documentation we could add to this site, we would love to know, please get in touch via the [malariagen/vector-data GitHub discussion board](https://github.com/malariagen/vector-data/discussions)." + ] + } + ], + "metadata": { + "celltoolbar": "Tags", + "colab": { + "collapsed_sections": [], + "name": "Ag3.0 cloud data access 2022-03-14.ipynb", + "provenance": [] + }, + "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.9.10" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/docs/af1/download.ipynb b/docs/af1/download.ipynb new file mode 100644 index 0000000..9a284d7 --- /dev/null +++ b/docs/af1/download.ipynb @@ -0,0 +1,829 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "p0VbAgTdnvpP" + }, + "source": [ + "# Af1 data downloads\n", + "\n", + "This notebook provides information about how to download data from the [MalariaGEN Vector Observatory Anopheles funestus Genomic Surveillance Project](https://www.malariagen.net/projects/anopheles-funestus-genomic-surveillance-project). This includes sample metadata, raw sequence reads, sequence read alignments, and single nucleotide polymorphism (SNP) calls. Data from other releases can be accessed by changing the release in the examples from `v1` to the specific Af release, e.g. `v1.0`.\n", + "\n", + "Code examples that are intended to be run via a Linux command line are prefixed with an exclamation mark (!). If you are running these commands directly from a terminal, remove the exclamation mark.\n", + "\n", + "Examples in this notebook assume you are downloading data to a local folder within your home directory at the path `~/vo_afun_release/`. Change this if you want to download to a different folder on the local file system.\n", + "\n", + "## Data hosting\n", + "\n", + "`Af1` data are hosted by several different services.\n", + "\n", + "Raw sequence reads in FASTQ format and sequence read alignments in BAM format are hosted by the European Nucleotide Archive (ENA). This guide provides examples of downloading data from ENA via FTP using the `wget` command line tool, but please note that there are several other options for downloading data, see the [ENA documentation on how to download data files](https://ena-docs.readthedocs.io/en/latest/retrieval/file-download.html) for more information. \n", + "\n", + "SNP calls in VCF and Zarr formats are hosted on S3-compatible object storage at the Sanger Institute. This guide provides examples of downloading thes data using `wget`.\n", + "\n", + "Sample metadata in CSV format are hosted on Google Cloud Storage (GCS) in the `vo_afun_release` bucket, which is a multi-region bucket located in the United States. All data hosted on GCS are publicly accessible and do not require any authentication to access. This guide provides examples of downloading data from GCS to a local computer using the `wget` and `gsutil` command line tools. For more information about `gsutil`, see the [gsutil tool documentation](https://cloud.google.com/storage/docs/gsutil)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "t1wyCDH5nvpS" + }, + "source": [ + "## Sample sets\n", + "\n", + "Data in these releases are organised into sample sets. Each of these sample sets corresponds to a set of mosquito specimens contributed by a collaborating study. Depending on your objectives, you may want to download data from only specific sample sets, or all sample sets. For convenience there is a tab-delimited manifest file listing all sample sets in the release. Here is a direct download link for the sample set manifest:\n", + "\n", + "* https://storage.googleapis.com/vo_afun_release/v1/manifest.tsv\n", + "\n", + "The sample set manifest can also be downloaded via `gsutil` to a directory on the local file system, e.g.:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "rsX4TP6UnvpS", + "outputId": "a9afc995-80b7-4f62-ad0b-b4d95822cf38", + "tags": [ + "hide-output" + ] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/Users/ah32/vo_afun_release\n", + "/Users/ah32/vo_afun_release/v1.0\n", + "Copying gs://vo_afun_release/v1.0/manifest.tsv...\n", + "/ [1 files][ 1015 B/ 1015 B] \n", + "Operation completed over 1 objects/1015.0 B. \n" + ] + } + ], + "source": [ + "!mkdir -pv ~/vo_afun_release/v1.0/\n", + "!gsutil cp gs://vo_afun_release/v1.0/manifest.tsv ~/vo_afun_release/v1.0/" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "hWOAFxIDnvpT" + }, + "source": [ + "Here are the file contents:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "vC4ACrTEnvpT", + "outputId": "c7cfe64a-9a78-42ea-dbd9-9cc82410372d" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "sample_set\tsample_count\tstudy_id\tstudy_url\r\n", + "1229-VO-GH-DADZIE-VMF00095\t36\t1229-VO-GH-DADZIE\thttps://www.malariagen.net/network/where-we-work/1229-VO-GH-DADZIE\r\n", + "1230-VO-GA-CF-AYALA-VMF00045\t50\t1230-VO-MULTI-AYALA\thttps://www.malariagen.net/network/where-we-work/1230-VO-MULTI-AYALA\r\n", + "1231-VO-MULTI-WONDJI-VMF00043\t320\t1231-VO-MULTI-WONDJI\thttps://www.malariagen.net/network/where-we-work/1231-VO-MULTI-WONDJI\r\n", + "1232-VO-KE-OCHOMO-VMF00044\t81\t1232-VO-KE-OCHOMO\thttps://www.malariagen.net/network/where-we-work/1232-VO-KE-OCHOMO\r\n", + "1235-VO-MZ-PAAIJMANS-VMF00094\t76\t1235-VO-MZ-PAAIJMANS\thttps://www.malariagen.net/network/where-we-work/1235-VO-MZ-PAAIJMANS\r\n", + "1236-VO-TZ-OKUMU-VMF00090\t10\t1236-VO-TZ-OKUMU\thttps://www.malariagen.net/network/where-we-work/1236-VO-TZ-OKUMU\r\n", + "1240-VO-CD-KOEKEMOER-VMF00099\t43\t1240-VO-MULTI-KOEKEMOER\thttps://www.malariagen.net/network/where-we-work/1240-VO-MULTI-KOEKEMOER\r\n", + "1240-VO-MZ-KOEKEMOER-VMF00101\t40\t1240-VO-MULTI-KOEKEMOER\thttps://www.malariagen.net/network/where-we-work/1240-VO-MULTI-KOEKEMOER\r\n" + ] + } + ], + "source": [ + "!cat ~/vo_afun_release/v1.0/manifest.tsv" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "5hXT_c0pnvpU" + }, + "source": [ + "For more information about these sample sets, see the section on sample sets in the [Af1.0 (_Anopheles funestus_ Project Phase 1 Data Release)](intro)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "D0m-HL43nvpU" + }, + "source": [ + "## Sample metadata\n", + "\n", + "Data about the samples that were sequenced to generate this data resource are available, including the time and place of collection, the gender of the specimen, and our call regarding the species of the specimen.\n", + "\n", + "### Specimen collection metadata\n", + "\n", + "Specimen collection metadata can be downloaded from GCS. E.g., here is the download link for the sample metadata for sample set `1229-VO-GH-DADZIE-VMF00095`:\n", + "\n", + "* https://storage.googleapis.com/vo_afun_release/v1.0/metadata/general/1229-VO-GH-DADZIE-VMF00095/samples.meta.csv\n", + "\n", + "Sample metadata for all sample sets can also be downloaded using `gsutil`:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "CsQVgCl7nvpV", + "outputId": "e0409bcb-5eca-4b1b-e703-e968508f3aec", + "tags": [ + "hide-output" + ] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/Users/ah32/vo_afun_release/v1.0/metadata\n", + "Building synchronization state...\n", + "If you experience problems with multiprocessing on MacOS, they might be related to https://bugs.python.org/issue33725. You can disable multiprocessing by editing your .boto config or by adding the following flag to your command: `-o \"GSUtil:parallel_process_count=1\"`. Note that multithreading is still available even if you disable multiprocessing.\n", + "\n", + "Starting synchronization...\n", + "If you experience problems with multiprocessing on MacOS, they might be related to https://bugs.python.org/issue33725. You can disable multiprocessing by editing your .boto config or by adding the following flag to your command: `-o \"GSUtil:parallel_process_count=1\"`. Note that multithreading is still available even if you disable multiprocessing.\n", + "\n", + "Copying gs://vo_afun_release/v1.0/metadata/general/1229-VO-GH-DADZIE-VMF00095/samples.meta.csv...\n", + "Copying gs://vo_afun_release/v1.0/metadata/general/1230-VO-GA-CF-AYALA-VMF00045/samples.meta.csv...\n", + "Copying gs://vo_afun_release/v1.0/metadata/general/1229-VO-GH-DADZIE-VMF00095/wgs_snp_data.csv...\n", + "Copying gs://vo_afun_release/v1.0/metadata/general/1235-VO-MZ-PAAIJMANS-VMF00094/samples.meta.csv...\n", + "Copying gs://vo_afun_release/v1.0/metadata/general/1231-VO-MULTI-WONDJI-VMF00043/wgs_snp_data.csv...\n", + "Copying gs://vo_afun_release/v1.0/metadata/general/1235-VO-MZ-PAAIJMANS-VMF00094/wgs_snp_data.csv...\n", + "Copying gs://vo_afun_release/v1.0/metadata/general/1232-VO-KE-OCHOMO-VMF00044/wgs_snp_data.csv...\n", + "Copying gs://vo_afun_release/v1.0/metadata/general/1240-VO-CD-KOEKEMOER-VMF00099/samples.meta.csv...\n", + "Copying gs://vo_afun_release/v1.0/metadata/general/1231-VO-MULTI-WONDJI-VMF00043/samples.meta.csv...\n", + "Copying gs://vo_afun_release/v1.0/metadata/general/1232-VO-KE-OCHOMO-VMF00044/samples.meta.csv...\n", + "Copying gs://vo_afun_release/v1.0/metadata/general/1236-VO-TZ-OKUMU-VMF00090/wgs_snp_data.csv...\n", + "Copying gs://vo_afun_release/v1.0/metadata/general/1240-VO-CD-KOEKEMOER-VMF00099/wgs_snp_data.csv...\n", + "Copying gs://vo_afun_release/v1.0/metadata/general/1240-VO-MZ-KOEKEMOER-VMF00101/wgs_snp_data.csv...\n", + "Copying gs://vo_afun_release/v1.0/metadata/general/1230-VO-GA-CF-AYALA-VMF00045/wgs_snp_data.csv...\n", + "Copying gs://vo_afun_release/v1.0/metadata/general/1240-VO-MZ-KOEKEMOER-VMF00101/samples.meta.csv...\n", + "Copying gs://vo_afun_release/v1.0/metadata/general/README.md... \n", + "Copying gs://vo_afun_release/v1.0/metadata/general/1236-VO-TZ-OKUMU-VMF00090/samples.meta.csv...\n", + "- [17/17 files][305.0 KiB/305.0 KiB] 100% Done \n", + "Operation completed over 17 objects/305.0 KiB. \n" + ] + } + ], + "source": [ + "!mkdir -pv ~/vo_afun_release/v1.0/metadata/\n", + "!gsutil -m rsync -r gs://vo_afun_release/v1.0/metadata/general/ ~/vo_afun_release/v1.0/metadata/" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "R7GeyShRnvpV" + }, + "source": [ + "Here are the first few rows of the sample metadata for sample set `1229-VO-GH-DADZIE-VMF00095`:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "dhKjnl6knvpW", + "outputId": "6345e845-5288-41a1-e877-5417559b8c6c" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "sample_id,partner_sample_id,contributor,country,location,year,month,latitude,longitude,sex_call\r\n", + "VBS24195,1229-GH-A-GH01,Samuel Dadzie,Ghana,Dimabi,2017,8,9.420,-1.083,F\r\n", + "VBS24196,1229-GH-A-GH02,Samuel Dadzie,Ghana,Gbullung,2017,7,9.488,-1.009,F\r\n", + "VBS24197,1229-GH-A-GH03,Samuel Dadzie,Ghana,Dimabi,2017,7,9.420,-1.083,F\r\n", + "VBS24198,1229-GH-A-GH04,Samuel Dadzie,Ghana,Dimabi,2017,8,9.420,-1.083,F\r\n", + "VBS24199,1229-GH-A-GH05,Samuel Dadzie,Ghana,Gupanarigu,2017,8,9.497,-0.952,F\r\n", + "VBS24200,1229-GH-A-GH06,Samuel Dadzie,Ghana,Gupanarigu,2017,7,9.497,-0.952,F\r\n", + "VBS24201,1229-GH-A-GH07,Samuel Dadzie,Ghana,Gupanarigu,2017,7,9.497,-0.952,F\r\n", + "VBS24202,1229-GH-A-GH08,Samuel Dadzie,Ghana,Gupanarigu,2017,7,9.497,-0.952,F\r\n", + "VBS24203,1229-GH-A-GH09,Samuel Dadzie,Ghana,Gupanarigu,2017,7,9.497,-0.952,F\r\n" + ] + } + ], + "source": [ + "!head ~/vo_afun_release/v1.0/metadata/1229-VO-GH-DADZIE-VMF00095/samples.meta.csv" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "VKki7qHunvpW" + }, + "source": [ + "The `sample_id` column gives the sample identifier used throughout all analyses.\n", + "\n", + "The `country`, `location`, `latitude` and `longitude` columns give the location where the specimen was collected.\n", + "\n", + "The `year` and `month` columns give the approximate date when the specimen was collected.\n", + "\n", + "The `sex_call` column gives the gender as determined from the sequence data." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "EpMi0q3dnvpZ" + }, + "source": [ + "## SNP calls (VCF format)\n", + "\n", + "### SNP genotypes\n", + "\n", + "SNP genotypes for individual mosquitoes in VCF format are available for download from Sanger S3-compatible object storage. A VCF file is available for each individual sample. To download a VCF file for a given sample, you will need the sample identifier and the sample set in which the sample belongs. Then inspect the data catalog in the metadata. E.g., for sample set `1229-VO-GH-DADZIE-VMF00095`:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "sample_id,snp_genotypes_vcf\r\n", + "VBS24195,https://1229-vo-gh-dadzie-vmf00095.cog.sanger.ac.uk/VBS24195.vcf.gz\r\n", + "VBS24196,https://1229-vo-gh-dadzie-vmf00095.cog.sanger.ac.uk/VBS24196.vcf.gz\r\n", + "VBS24197,https://1229-vo-gh-dadzie-vmf00095.cog.sanger.ac.uk/VBS24197.vcf.gz\r\n", + "VBS24198,https://1229-vo-gh-dadzie-vmf00095.cog.sanger.ac.uk/VBS24198.vcf.gz\r\n", + "VBS24199,https://1229-vo-gh-dadzie-vmf00095.cog.sanger.ac.uk/VBS24199.vcf.gz\r\n", + "VBS24200,https://1229-vo-gh-dadzie-vmf00095.cog.sanger.ac.uk/VBS24200.vcf.gz\r\n", + "VBS24201,https://1229-vo-gh-dadzie-vmf00095.cog.sanger.ac.uk/VBS24201.vcf.gz\r\n", + "VBS24202,https://1229-vo-gh-dadzie-vmf00095.cog.sanger.ac.uk/VBS24202.vcf.gz\r\n", + "VBS24203,https://1229-vo-gh-dadzie-vmf00095.cog.sanger.ac.uk/VBS24203.vcf.gz\r\n" + ] + } + ], + "source": [ + "!head ~/vo_afun_release/v1.0/metadata/1229-VO-GH-DADZIE-VMF00095/wgs_snp_data.csv | cut -f1,4 -d," + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A VCF file and associated tabix index can be downloaded via wget, e.g.:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!wget --no-clobber https://1229-vo-gh-dadzie-vmf00095.cog.sanger.ac.uk/VBS24195.vcf.gz\n", + "!wget --no-clobber https://1229-vo-gh-dadzie-vmf00095.cog.sanger.ac.uk/VBS24195.vcf.gz.tbi" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "rd1icA5Snvpa" + }, + "source": [ + "Note that each of these VCF files is around 3 Gb, so downloading may take some time, and sufficient local storage will be needed.\n", + "\n", + "Each of these VCF files is an \"all sites\" VCF file, meaning that genotypes have been called at all genomic positions where the reference nucleotide is not \"N\", regardless of whether variation is observed in the given sample. This means that VCFs from multiple samples can be merged easily to create a multi-sample VCF, which may be required for certain analyses. For example, the code below merges VCFs for two samples for chromosome arm 3R up to 1 Mbp: " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "RcWJS9XJnvpa", + "tags": [ + "hide-output" + ] + }, + "outputs": [], + "source": [ + "!bcftools merge --output-type z --regions 3RL:1-1000000 --output merged.vcf.gz VBS24195.vcf.gz VBS24196.vcf.gz " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "un-0qdeEnvpa" + }, + "source": [ + "If you are just interested in analysing variants within a given set of samples, you might like to filter the merged VCF to remove non-variant sites and alleles, e.g., using [bcftools view](http://samtools.github.io/bcftools/bcftools.html#view):" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "tQ7ZQEQznvpa" + }, + "outputs": [], + "source": [ + "!bcftools view --output-type z --output-file merged_variant.vcf.gz --min-ac 1:nonmajor --trim-alt-alleles merged.vcf.gz" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ZgpIO8Oknvpa" + }, + "source": [ + "### Site filters\n", + "\n", + "SNP calling is not always reliable, and we have created some site filters to allow excluding low quality SNPs. We have created some sites-only VCF files with site filter information in the `FILTER` column. These VCF files are hosted on GCS. \n", + "\n", + "Each filter is available as a set of VCF files, one per chromosome arm. E.g., here is the direct download link for the site filters on chromosome arms 3RL:\n", + "\n", + "* https://storage.googleapis.com/vo_afun_release/v1.0/site_filters/dt_20200416/vcf/funestus/2RL_sitefilters.vcf.gz\n", + "\n", + "Alternatively, all site filters VCFs can be downloaded using `gsutil`, e.g.:\n", + "\n", + "" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "XQjL7R3bnvpa", + "tags": [ + "hide-output" + ] + }, + "outputs": [], + "source": [ + "!mkdir -pv ~/vo_afun_release/v1.0/site_filters/dt_20200416/vcf/funestus/\n", + "!gsutil -m rsync -r \\\n", + " gs://vo_afun_release/v1.0/site_filters/dt_20200416/vcf/funestus/ \\\n", + " ~/vo_afun_release/v1.0/site_filters/dt_20200416/vcf/funestus/" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!mkdir -pv ~/vo_afun_release/v1.0/site_filters/dt_20200416/vcf/funestus/\n", + "!gsutil -m rsync -r \\\n", + " gs://vo_afun_release/v1.0/site_filters/dt_20200416/vcf/funestus/ \\\n", + " ~/vo_afun_release/v1.0/site_filters/dt_20200416/vcf/funestus/" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note these filters are the result of different filter models, in this case, a decision-tree is used. These filters are the default ones used across the function.\n", + "\n", + "We have also produced a second set of site filters, which are the result of static cutoffs on the site summary statistics. \n", + "These hard-filters can also be downloaded via `gsutil`, e.g.:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!mkdir -pv ~/vo_afun_release/v1.0/site_filters/sc_20220908/vcf/funestus/\n", + "!gsutil -m rsync -r \\\n", + " gs://vo_afun_release/v1.0/site_filters/sc_20220908/vcf/funestus/ \\\n", + " ~/vo_afun_release/v1.0/site_filters/sc_20220908/vcf/funestus/" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "OBXGXzj9nvpb" + }, + "source": [ + "## SNP calls (Zarr format)\n", + "\n", + "SNP data are also available in Zarr format, which can be convenient and efficient to use for certain types of analysis. These data can be analysed directly in the cloud without downloading to the local system, see the [Ag3 cloud data access guide](cloud) for more information. The data can also be downloaded to your own system for local analysis if that is more convenient. Below are examples of how to download the Zarr data to your local system.\n", + "\n", + "The data are organised into several Zarr hierarchies. \n", + "\n", + "### SNP sites and alleles\n", + "\n", + "Data on the genomic positions (sites) and reference and alternate alleles that were genotyped can be downloaded as follows:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "hM4noAz3nvpb", + "tags": [ + "hide-output" + ] + }, + "outputs": [], + "source": [ + "!mkdir -pv ~/vo_afun_release/v1.0/snp_genotypes/all/sites/\n", + "!gsutil -m rsync -r \\\n", + " gs://vo_afun_release/v1.0/snp_genotypes/all/sites/ \\\n", + " ~/vo_afun_release/v1.0/snp_genotypes/all/sites/" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "GRqTjrIhnvpb" + }, + "source": [ + "### Site filters\n", + "\n", + "SNP calling is not always reliable, and we have created some site filters to allow excluding low quality SNPs. To download site filters data in Zarr format:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "tWu4ajAbnvpb", + "tags": [ + "hide-output" + ] + }, + "outputs": [], + "source": [ + "!mkdir -pv ~/vo_afun_release/v1.0/site_filters/dt_20200416/funestus/\n", + "!gsutil -m rsync -r \\\n", + " gs://vo_afun_release/v1.0/site_filters/dt_20200416/funestus/ \\\n", + " ~/vo_afun_release/v1.0/site_filters/dt_20200416/funestus/" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "vKfArxCFnvpb" + }, + "source": [ + "### SNP genotypes\n", + "\n", + "SNP genotypes are available for each sample set separately. E.g., to download SNP genotypes in Zarr format for sample set `1229-VO-GH-DADZIE-VMF00095`, excluding some data you probably won't need:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "umeGFe1jnvpb", + "tags": [ + "hide-output" + ] + }, + "outputs": [], + "source": [ + "!mkdir -pv ~/vo_afun_release/v1.0/snp_genotypes/all/1229-VO-GH-DADZIE-VMF00095/\n", + "!gsutil -m rsync -r \\\n", + " -x '.*/calldata/(AD|GQ|MQ)/.*' \\\n", + " gs://vo_afun_release/v1.0/snp_genotypes/all/1229-VO-GH-DADZIE-VMF00095/ \\\n", + " ~/vo_afun_release/v1.0/snp_genotypes/all/1229-VO-GH-DADZIE-VMF00095/" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "o3ALEZyZnvpb" + }, + "source": [ + "## Copy number variation (CNV) data\n", + "\n", + "Data on copy number variation within the `Af1` cohort are available as three separate data types:\n", + "\n", + "* **HMM** -- Genome-wide inferences of copy number state within each individual mosquito in 300 bp non-overlapping windows.\n", + "* **Coverage calls** -- Genome-wide copy number variant calls, derived from the HMM outputs by analysing contiguous regions of elevated copy number state then clustering of variants across individuals based on breakpoint proximity.\n", + "\n", + "For more information on the methods used to generate these data, see the [variant-calling methods](methods) page.\n", + "\n", + "For each of these data types, data can be downloaded from Google Cloud Storage, and are available in either VCF or Zarr format." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "z4vzTYvEnvpc" + }, + "source": [ + "### CNV HMM\n", + "\n", + "The HMM inferences of copy number state are available in VCF, Zarr and text formats, and are organised by sample set. \n", + "\n", + "For example, the VCF file for sample set `1229-VO-GH-DADZIE-VMF00095` can be downloaded from the following URL:\n", + "\n", + "* https://storage.googleapis.com/vo_afun_release/v1/cnv/1229-VO-GH-DADZIE-VMF00095/hmm/vcf/VBS24195_cnv_hmm.vcf.gz\n", + "\n", + "VCF files for all samples sets can be downloaded via gsutil as follows:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "bA-PIJaWnvpc" + }, + "outputs": [], + "source": [ + "# create a local directory to hold downloaded CNV data\n", + "!mkdir -pv ~/vo_afun_release/v1.0/cnv/" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "2EFQKAXHnvpc" + }, + "outputs": [], + "source": [ + "# download the HMM data in VCF format for all sample sets\n", + "!gsutil -m rsync -r \\\n", + " -x '.*/coverage_calls/.*|.*/hmm/zarr/.*|.*/hmm/per_sample/.*' \\\n", + " gs://vo_afun_release/v1.0/cnv/ ~/vo_afun_release/v1.0/cnv/" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "p4IWcfRJnvpc" + }, + "source": [ + "Zarr files for all sample sets can be downloaded as follows:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "jGfEE3y5nvpc" + }, + "outputs": [], + "source": [ + "# download HMM data in Zarr format for all sample sets\n", + "!gsutil -m rsync -r \\\n", + " -x '.*/coverage_calls/.*|.*/hmm/vcf/.*|.*/hmm/per_sample/.*' \\\n", + " gs://vo_afun_release/v1.0/cnv/ ~/vo_afun_release/v1.0/cnv/" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "WPgfWx0Wnvpc" + }, + "source": [ + "### CNV coverage calls\n", + "\n", + "Coverage-based CNV calls are available in VCF and Zarr formats, and are organised by sample set. \n", + "Note that some samples were excluded from coverage calling because of high coverage variance.\n", + "\n", + "For example, the VCF file for sample set `1229-VO-GH-DADZIE-VMF00095` can be downloaded from:\n", + "\n", + "* https://storage.googleapis.com/vo_afun_release/v1.0/cnv/1229-VO-GH-DADZIE-VMF00095/coverage_calls/funestus/vcf/1229-VO-GH-DADZIE-VMF00095_funestus_cnv_coverage_calls.vcf.gz\n", + "\n", + "VCF files for all sample sets can be downloaded with:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "uJEdxeTjnvpc" + }, + "outputs": [], + "source": [ + "# download coverage calls in VCF format for all sample sets\n", + "!gsutil -m rsync -r \\\n", + " -x '.*/hmm/.*|.*/coverage_calls/.*/zarr/.*' \\\n", + " gs://vo_afun_release/v1.0/cnv/ ~/vo_afun_release/v1.0/cnv/" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "F9rHpx_Invpc" + }, + "source": [ + "Zarr files for all sample sets can be downloaded with:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "fzdzu6CFnvpc" + }, + "outputs": [], + "source": [ + "# download coverage calls in Zarr format for all sample sets\n", + "!gsutil -m rsync -r \\\n", + " -x '.*/hmm/.*|.*/coverage_calls/.*/vcf/.*' \\\n", + " gs://vo_afun_release/v1.0/cnv/ ~/vo_afun_release/v1.0/cnv/" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "9hFhrALmnvpd" + }, + "source": [ + "## Haplotypes\n", + "\n", + "The `Af1` data resource also includes haplotype reference panels, which were obtained by [phasing](https://en.wikipedia.org/wiki/Haplotype_estimation) the SNP calls. \n", + "\n", + "Haplotype data can be downloaded in either VCF or Zarr format. See the subsections below for further details" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Kpa2QiLsnvpd" + }, + "source": [ + "### Haplotype reference panels (VCF format)\n", + "\n", + "These are the VCFs created by the phasing pipeline, containing all samples included each of the phasing runs. There is one VCF per phasing analysis per chromosome arm. The URL for each file has the following structure:\n", + "\n", + "* `https://storage.googleapis.com/vo_afun_release/v1.0/snp_haplotypes/panel/funestus/af1.0_funestus_{contig}_phased.vcf.gz`\n", + "\n", + "...where `{contig}` is one of \"2RL\", \"3RL\", \"X\". \n", + "\n", + "E.g., the panel VCF for the chromosome arm 3RL can be downloaded here:\n", + "\n", + "* https://storage.googleapis.com/vo_afun_release/v1.0/snp_haplotypes/panel/funestus/af1.0_funestus_3RL_phased.vcf.gz\n", + "\n", + "Note that these files can be large, up to ~5 GB.\n", + "\n", + "If you'd like to download all of the panel files, you could also use `gsutil`, e.g.:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "dN6QGcHtnvpd" + }, + "outputs": [], + "source": [ + "# create a local directory to store the data\n", + "!mkdir -pv ~/vo_afun_release/v1.0/snp_haplotypes/panel/funestus/\n", + "\n", + "# copy files from cloud to local file system\n", + "!gsutil -m rsync -r \\\n", + " -x '.*/.*zarr.zip' \\\n", + " gs://vo_afun_release/v1.0/snp_haplotypes/panel/funestus/ \\\n", + " ~/vo_afun_release/v1.0/snp_haplotypes/panel/funestus/" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Jh60c4evnvpd" + }, + "source": [ + "### Sample set haplotypes (VCF format)\n", + "\n", + "These VCFs are subsets of the panel VCFs, containing only samples in a given sample set. There is one VCF per sample set, per phasing analysis, per chromosome arm. The URL for each file has the following structure:\n", + "\n", + "* `https://storage.googleapis.com/vo_afun_release/v1.0/snp_haplotypes/{sample_set}/funestus/vcf/{sample_set}_funestus_{contig}_phased.vcf.gz`\n", + "\n", + "...where `{contig}` is one of \"2RL\",\"3RL\", \"X\"; and `{sample_set}` is one of the [Af sample sets](https://malariagen.github.io/vector-data/af1/af1.0.html#sample-sets).\n", + "\n", + "E.g., the VCF for sample set 1229-VO-GH-DADZIE-VMF00095, for chromosome arm 2RL, can be downloaded here:\n", + "\n", + "* https://storage.googleapis.com/vo_afun_release/v1.0/snp_haplotypes/1229-VO-GH-DADZIE-VMF00095/funestus/vcf/1229-VO-GH-DADZIE-VMF00095_funestus_2RL_phased.vcf.gz \n", + "\n", + "If you'd like to download all of the VCF files for a given sample set, you could also use gsutil, e.g.:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "v4nXM1lpnvpd" + }, + "outputs": [], + "source": [ + "# create a local directory to store the data\n", + "!mkdir -pv ~/vo_afun_release/v1.0/snp_haplotypes/1229-VO-GH-DADZIE-VMF00095/\n", + "\n", + "# copy files from cloud to local file system\n", + "!gsutil -m rsync -r \\\n", + " -x '.*/zarr/.*' \\\n", + " gs://vo_afun_release/v1.0/snp_haplotypes/1229-VO-GH-DADZIE-VMF00095/ \\\n", + " ~/vo_afun_release/v1.0/snp_haplotypes/1229-VO-GH-DADZIE-VMF00095/" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "31vzApoKnvpd" + }, + "source": [ + "### Sample set haplotypes (Zarr format)\n", + "\n", + "These contain the haplotype data in Zarr format, with one Zarr hierarchy per sample set. The root zarr path for a given hierarchy has the following structure:\n", + "\n", + "* `gs://vo_agam_release/v3/snp_haplotypes/{sample_set}/{analysis}/zarr`\n", + "* `gs://vo_afun_release/v1.0/snp_haplotypes/1229-VO-GH-DADZIE-VMF00095/funestus/zarr`\n", + "\n", + "Data can be downloaded with gsutil. E.g., download the Zarr data for sample 1229-VO-GH-DADZIE-VMF00095. Note that the sites are stored in a separate hierarchy:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "En9ebyYPnvpd" + }, + "outputs": [], + "source": [ + "# create local directories to store the data\n", + "!mkdir -pv ~/vo_afun_release//v1.0/snp_haplotypes/sites/funestus/\n", + "!mkdir -pv ~/vo_afun_release/v1.0/snp_haplotypes/1229-VO-GH-DADZIE-VMF00095/funestus/\n", + "\n", + "# copy haplotype data from cloud to local file system\n", + "!gsutil -m rsync -r \\\n", + " -x '.*/vcf/.*' \\\n", + " gs://vo_afun_release/v1.0/snp_haplotypes/1229-VO-GH-DADZIE-VMF00095/funestus/ \\\n", + " ~/vo_afun_release/v1.0/snp_haplotypes/1229-VO-GH-DADZIE-VMF00095/funestus/\n", + "\n", + "# copy phased sites data from cloud to local file system\n", + "!gsutil -m rsync -rn \\\n", + " gs://vo_afun_release/v1.0/snp_haplotypes/sites/funestus/ \\\n", + " ~/vo_afun_release//v1.0/snp_haplotypes/sites/funestus/ " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "8ABQPPgAnvph" + }, + "source": [ + "## Feedback and suggestions\n", + "\n", + "If there are particular analyses you would like to run, or if you have other suggestions for useful documentation we could add to this site, we would love to know, please get in touch via the [malariagen/vector-data GitHub discussion board](https://github.com/malariagen/vector-data/discussions)." + ] + } + ], + "metadata": { + "celltoolbar": "Tags", + "colab": { + "collapsed_sections": [ + "8ABQPPgAnvph" + ], + "name": "Ag3.0-data-downloads.ipynb", + "provenance": [] + }, + "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.9.10" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From 7a7c4b93e9a3404dde161faaefa94ee2044c494a Mon Sep 17 00:00:00 2001 From: ahernank Date: Wed, 12 Jun 2024 03:15:55 -0500 Subject: [PATCH 3/5] update 1.0 docs --- docs/_toc.yml | 2 - docs/af1/af1.0.ipynb | 660 +++++++++++++- docs/af1/cloud.ipynb | 1821 +++++++++++++++++++++++---------------- docs/af1/download.ipynb | 103 ++- 4 files changed, 1763 insertions(+), 823 deletions(-) diff --git a/docs/_toc.yml b/docs/_toc.yml index 4782584..6fd621b 100644 --- a/docs/_toc.yml +++ b/docs/_toc.yml @@ -20,10 +20,8 @@ parts: - caption: Anopheles funestus chapters: - file: af1/af1.0 - # - file: af1/af1.1 - file: af1/cloud - file: af1/download - - file: af1/methods - file: af1/api - caption: Anopheles minimus chapters: diff --git a/docs/af1/af1.0.ipynb b/docs/af1/af1.0.ipynb index 3779972..724f8b2 100644 --- a/docs/af1/af1.0.ipynb +++ b/docs/af1/af1.0.ipynb @@ -8,9 +8,9 @@ "source": [ "# Af1.0 (_Anopheles funestus_ Project Phase 1 Data Release)\n", "\n", - "The [MalariaGEN Vector Observatory Anopheles funestus Genomic Surveillance Project](https://www.malariagen.net/projects/anopheles-funestus-genomic-surveillance-project) is a collaborative project using whole-genome sequencing to enhance the monitoring and surveillance natural populations of mosquitoes in the major African malaria vector *Anopheles funestus* \n", + "The [MalariaGEN Vector Observatory Anopheles funestus Genomic Surveillance Project](https://www.malariagen.net/project/anopheles-funestus-genomic-surveillance-project/) is a collaborative project using whole-genome sequencing to enhance the monitoring and surveillance natural populations of mosquitoes in the major African malaria vector *Anopheles funestus* \n", "\n", - "The `Af1.0` release provides a first baseline understanding of Anopheles funestus genetic diversity and population structure across Africa using 656 whole genome sequenced individuals. Over the coming years, the [MalariaGEN Vector Observatory Anopheles funestus Genomic Surveillance Project](https://www.malariagen.net/projects/anopheles-funestus-genomic-surveillance-project) will continue to carry out further spatiotemporal sampling of _Anopheles funestus_ that builds upon Phase 1.\n", + "The `Af1.0` release provides a first baseline understanding of Anopheles funestus genetic diversity and population structure across Africa using 656 whole genome sequenced individuals. Over the coming years, the [MalariaGEN Vector Observatory Anopheles funestus Genomic Surveillance Project](https://www.malariagen.net/project/anopheles-funestus-genomic-surveillance-project/) will continue to carry out further spatiotemporal sampling of _Anopheles funestus_ that builds upon Phase 1.\n", "\n", "\n", "This page provides an introduction to open data resources released as part of the first phase of the Anopheles funestus Genomic Surveillance Project project, known as `Af1.0` for short. We hope the data from `Af1.0` will be a valuable resource for research and surveillance of malaria vectors. If you have any questions about this guide or how to use the data, please [start a new discussion](https://github.com/malariagen/vector-public-data/discussions/new) on the malariagen/vector-open-data repo on GitHub. If you find any bugs, please [raise an issue](https://github.com/malariagen/vector-public-data/issues/new/choose)." @@ -68,7 +68,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 1, "metadata": { "id": "AnmzLmEgpk8n", "tags": [ @@ -78,17 +78,335 @@ "outputs": [ { "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\nconst 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 function drop(id) {\n const view = Bokeh.index.get_by_id(id)\n if (view != null) {\n view.model.document.clear()\n Bokeh.index.delete(view)\n }\n }\n\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\n // Clean up Bokeh references\n if (id != null) {\n drop(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 drop(id)\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 \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n \"
  • use INLINE resources instead, as so:
  • \\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(null);\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.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.3.0.min.js\"];\n const css_urls = [];\n\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {\n }\n ];\n\n function run_inline_js() {\n if (root.Bokeh !== undefined || force === true) {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\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(null)).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": "" + "application/javascript": [ + "'use strict';\n", + "(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", + " function drop(id) {\n", + " const view = Bokeh.index.get_by_id(id)\n", + " if (view != null) {\n", + " view.model.document.clear()\n", + " Bokeh.index.delete(view)\n", + " }\n", + " }\n", + "\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", + "\n", + " // Clean up Bokeh references\n", + " if (id != null) {\n", + " drop(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", + " drop(id)\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", + " \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n", + " \"
  • use INLINE resources instead, as so:
  • \\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(error = null) {\n", + " const el = document.getElementById(null);\n", + " if (el != null) {\n", + " const html = (() => {\n", + " if (typeof root.Bokeh === \"undefined\") {\n", + " if (error == null) {\n", + " return \"BokehJS is loading ...\";\n", + " } else {\n", + " return \"BokehJS failed to load.\";\n", + " }\n", + " } else {\n", + " const prefix = `BokehJS ${root.Bokeh.version}`;\n", + " if (error == null) {\n", + " return `${prefix} successfully loaded.`;\n", + " } else {\n", + " return `${prefix} encountered errors while loading and may not function as expected.`;\n", + " }\n", + " }\n", + " })();\n", + " el.innerHTML = html;\n", + "\n", + " if (error != null) {\n", + " const wrapper = document.createElement(\"div\");\n", + " wrapper.style.overflow = \"auto\";\n", + " wrapper.style.height = \"5em\";\n", + " wrapper.style.resize = \"vertical\";\n", + " const content = document.createElement(\"div\");\n", + " content.style.fontFamily = \"monospace\";\n", + " content.style.whiteSpace = \"pre-wrap\";\n", + " content.style.backgroundColor = \"rgb(255, 221, 221)\";\n", + " content.textContent = error.stack ?? error.toString();\n", + " wrapper.append(content);\n", + " el.append(wrapper);\n", + " }\n", + " } else if (Date.now() < root._bokeh_timeout) {\n", + " setTimeout(() => display_loaded(error), 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.4.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.4.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.4.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.4.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.4.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", + " try {\n", + " for (let i = 0; i < inline_js.length; i++) {\n", + " inline_js[i].call(root, root.Bokeh);\n", + " }\n", + "\n", + " } catch (error) {throw error;\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(null)).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": "'use strict';\n(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 \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n \"
  • use INLINE resources instead, as so:
  • \\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(error = null) {\n const el = document.getElementById(null);\n if (el != null) {\n const html = (() => {\n if (typeof root.Bokeh === \"undefined\") {\n if (error == null) {\n return \"BokehJS is loading ...\";\n } else {\n return \"BokehJS failed to load.\";\n }\n } else {\n const prefix = `BokehJS ${root.Bokeh.version}`;\n if (error == null) {\n return `${prefix} successfully loaded.`;\n } else {\n return `${prefix} encountered errors while loading and may not function as expected.`;\n }\n }\n })();\n el.innerHTML = html;\n\n if (error != null) {\n const wrapper = document.createElement(\"div\");\n wrapper.style.overflow = \"auto\";\n wrapper.style.height = \"5em\";\n wrapper.style.resize = \"vertical\";\n const content = document.createElement(\"div\");\n content.style.fontFamily = \"monospace\";\n content.style.whiteSpace = \"pre-wrap\";\n content.style.backgroundColor = \"rgb(255, 221, 221)\";\n content.textContent = error.stack ?? error.toString();\n wrapper.append(content);\n el.append(wrapper);\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(() => display_loaded(error), 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.4.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.4.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.4.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.4.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.4.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 try {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\n\n } catch (error) {throw error;\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(null)).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" }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " \r" + ] + }, { "data": { "text/html": [ "\n", - "
\n" + "
\n" ] }, "metadata": {}, @@ -96,12 +414,37 @@ }, { "data": { - "application/javascript": "(function(root) {\n function embed_document(root) {\n const docs_json = {\"296c3457-1718-4a37-9272-57ee31251c76\":{\"version\":\"3.3.0\",\"title\":\"Bokeh Application\",\"roots\":[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p1496\",\"attributes\":{\"width\":800,\"height\":550,\"x_range\":{\"type\":\"object\",\"name\":\"Range1d\",\"id\":\"p1506\",\"attributes\":{\"start\":-3000000.0,\"end\":6000000.0}},\"y_range\":{\"type\":\"object\",\"name\":\"Range1d\",\"id\":\"p1507\",\"attributes\":{\"start\":-3500000.0,\"end\":2000000.0}},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1508\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1509\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p1499\",\"attributes\":{\"text\":\"Af1.0 Sampling Locations\"}},\"renderers\":[{\"type\":\"object\",\"name\":\"TileRenderer\",\"id\":\"p1529\",\"attributes\":{\"tile_source\":{\"type\":\"object\",\"name\":\"WMTSTileSource\",\"id\":\"p1528\",\"attributes\":{\"url\":\"https://a.basemaps.cartocdn.com/light_all/{z}/{x}/{y}@2x.png\",\"max_zoom\":20,\"attribution\":\"© OpenStreetMap contributors © CARTO\"}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1542\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1533\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1534\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1535\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"HwAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Obuasi\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Ghana\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1543\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1544\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1539\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":-180003.61661272336},\"y\":{\"type\":\"value\",\"value\":661642.0272950786},\"radius\":{\"type\":\"value\",\"value\":156335.20609917105},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1531\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1532\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1540\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":-180003.61661272336},\"y\":{\"type\":\"value\",\"value\":661642.0272950786},\"radius\":{\"type\":\"value\",\"value\":156335.20609917105},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1531\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1532\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1541\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":-180003.61661272336},\"y\":{\"type\":\"value\",\"value\":661642.0272950786},\"radius\":{\"type\":\"value\",\"value\":156335.20609917105},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1531\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1532\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1556\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1547\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1548\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1549\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"BgAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Dimabi\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Ghana\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1557\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1558\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1553\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":-120559.00852911526},\"y\":{\"type\":\"value\",\"value\":1053385.9711061884},\"radius\":{\"type\":\"value\",\"value\":99532.8},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1545\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1546\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1554\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":-120559.00852911526},\"y\":{\"type\":\"value\",\"value\":1053385.9711061884},\"radius\":{\"type\":\"value\",\"value\":99532.8},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1545\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1546\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1555\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":-120559.00852911526},\"y\":{\"type\":\"value\",\"value\":1053385.9711061884},\"radius\":{\"type\":\"value\",\"value\":99532.8},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1545\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1546\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1570\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1561\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1562\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1563\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"EwAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Gbullung\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Ghana\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1571\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1572\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1567\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":-112321.366210413},\"y\":{\"type\":\"value\",\"value\":1061059.9262004786},\"radius\":{\"type\":\"value\",\"value\":132796.74381095578},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1559\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1560\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1568\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":-112321.366210413},\"y\":{\"type\":\"value\",\"value\":1061059.9262004786},\"radius\":{\"type\":\"value\",\"value\":132796.74381095578},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1559\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1560\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1569\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":-112321.366210413},\"y\":{\"type\":\"value\",\"value\":1061059.9262004786},\"radius\":{\"type\":\"value\",\"value\":132796.74381095578},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1559\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1560\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1584\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1575\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1576\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1577\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"CgAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Gupanarigu\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Ghana\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1585\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1586\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1581\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":-105976.15523519642},\"y\":{\"type\":\"value\",\"value\":1062075.7105529539},\"radius\":{\"type\":\"value\",\"value\":107218.45855800275},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1573\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1574\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1582\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":-105976.15523519642},\"y\":{\"type\":\"value\",\"value\":1062075.7105529539},\"radius\":{\"type\":\"value\",\"value\":107218.45855800275},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1573\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1574\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1583\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":-105976.15523519642},\"y\":{\"type\":\"value\",\"value\":1062075.7105529539},\"radius\":{\"type\":\"value\",\"value\":107218.45855800275},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1573\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1574\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1598\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1589\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1590\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1591\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AQAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Woribogu\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Ghana\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1599\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1600\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1595\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":35733.556544640815},\"y\":{\"type\":\"value\",\"value\":991259.0921946851},\"radius\":{\"type\":\"value\",\"value\":99532.8},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1587\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1588\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1596\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":35733.556544640815},\"y\":{\"type\":\"value\",\"value\":991259.0921946851},\"radius\":{\"type\":\"value\",\"value\":99532.8},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1587\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1588\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1597\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":35733.556544640815},\"y\":{\"type\":\"value\",\"value\":991259.0921946851},\"radius\":{\"type\":\"value\",\"value\":99532.8},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1587\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1588\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1612\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1603\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1604\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1605\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"JQAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Kpome\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Benin\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1613\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1614\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1609\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":244902.87974520188},\"y\":{\"type\":\"value\",\"value\":712026.6560352404},\"radius\":{\"type\":\"value\",\"value\":165832.68555775317},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1601\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1602\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1610\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":244902.87974520188},\"y\":{\"type\":\"value\",\"value\":712026.6560352404},\"radius\":{\"type\":\"value\",\"value\":165832.68555775317},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1601\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1602\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1611\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":244902.87974520188},\"y\":{\"type\":\"value\",\"value\":712026.6560352404},\"radius\":{\"type\":\"value\",\"value\":165832.68555775317},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1601\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1602\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1626\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1617\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1618\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1619\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"KQAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Akaka Remo\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Nigeria\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1627\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1628\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1623\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":413774.54727859783},\"y\":{\"type\":\"value\",\"value\":775574.7398539328},\"radius\":{\"type\":\"value\",\"value\":171605.3584717831},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1615\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1616\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1624\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":413774.54727859783},\"y\":{\"type\":\"value\",\"value\":775574.7398539328},\"radius\":{\"type\":\"value\",\"value\":171605.3584717831},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1615\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1616\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1625\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":413774.54727859783},\"y\":{\"type\":\"value\",\"value\":775574.7398539328},\"radius\":{\"type\":\"value\",\"value\":171605.3584717831},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1615\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1616\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1640\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1631\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1632\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1633\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"LQAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Mibellon\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Cameroon\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1641\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1642\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1637\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":1280174.1441226462},\"y\":{\"type\":\"value\",\"value\":678432.1792110694},\"radius\":{\"type\":\"value\",\"value\":177013.77494857428},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1629\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1630\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1638\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":1280174.1441226462},\"y\":{\"type\":\"value\",\"value\":678432.1792110694},\"radius\":{\"type\":\"value\",\"value\":177013.77494857428},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1629\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1630\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1639\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":1280174.1441226462},\"y\":{\"type\":\"value\",\"value\":678432.1792110694},\"radius\":{\"type\":\"value\",\"value\":177013.77494857428},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1629\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1630\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1654\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1645\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1646\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1647\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"KAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Benguia\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Gabon\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1655\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1656\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1651\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":1501922.569782847},\"y\":{\"type\":\"value\",\"value\":-181809.3446907341},\"radius\":{\"type\":\"value\",\"value\":170198.6939053824},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1643\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1644\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1652\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":1501922.569782847},\"y\":{\"type\":\"value\",\"value\":-181809.3446907341},\"radius\":{\"type\":\"value\",\"value\":170198.6939053824},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1643\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1644\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1653\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":1501922.569782847},\"y\":{\"type\":\"value\",\"value\":-181809.3446907341},\"radius\":{\"type\":\"value\",\"value\":170198.6939053824},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1643\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1644\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1668\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1659\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1660\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1661\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"IgAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Kinshasa\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Democratic Republic of the Congo\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1669\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1670\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1665\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":1704635.3625173983},\"y\":{\"type\":\"value\",\"value\":-482137.9534045483},\"radius\":{\"type\":\"value\",\"value\":161223.81674709579},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1657\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1658\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1666\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":1704635.3625173983},\"y\":{\"type\":\"value\",\"value\":-482137.9534045483},\"radius\":{\"type\":\"value\",\"value\":161223.81674709579},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1657\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1658\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1667\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":1704635.3625173983},\"y\":{\"type\":\"value\",\"value\":-482137.9534045483},\"radius\":{\"type\":\"value\",\"value\":161223.81674709579},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1657\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1658\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1682\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1673\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1674\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1675\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"CgAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Bangui\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Central African Republic\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1683\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1684\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1679\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":2071433.0846812348},\"y\":{\"type\":\"value\",\"value\":487720.02304763725},\"radius\":{\"type\":\"value\",\"value\":107218.45855800275},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1671\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1672\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1680\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":2071433.0846812348},\"y\":{\"type\":\"value\",\"value\":487720.02304763725},\"radius\":{\"type\":\"value\",\"value\":107218.45855800275},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1671\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1672\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1681\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":2071433.0846812348},\"y\":{\"type\":\"value\",\"value\":487720.02304763725},\"radius\":{\"type\":\"value\",\"value\":107218.45855800275},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1671\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1672\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1696\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1687\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1688\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1689\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"KwAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Watsa Moke\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Democratic Republic of the Congo\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1697\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1698\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1693\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3289268.3139596474},\"y\":{\"type\":\"value\",\"value\":344590.0190058456},\"radius\":{\"type\":\"value\",\"value\":174351.50923242987},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1685\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1686\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1694\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3289268.3139596474},\"y\":{\"type\":\"value\",\"value\":344590.0190058456},\"radius\":{\"type\":\"value\",\"value\":174351.50923242987},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1685\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1686\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1695\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3289268.3139596474},\"y\":{\"type\":\"value\",\"value\":344590.0190058456},\"radius\":{\"type\":\"value\",\"value\":174351.50923242987},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1685\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1686\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1710\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1701\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1702\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1703\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"KwAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Katete\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Zambia\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1711\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1712\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1707\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3547418.2131092492},\"y\":{\"type\":\"value\",\"value\":-1595220.0593262194},\"radius\":{\"type\":\"value\",\"value\":174351.50923242987},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1699\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1700\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1708\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3547418.2131092492},\"y\":{\"type\":\"value\",\"value\":-1595220.0593262194},\"radius\":{\"type\":\"value\",\"value\":174351.50923242987},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1699\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1700\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1709\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3547418.2131092492},\"y\":{\"type\":\"value\",\"value\":-1595220.0593262194},\"radius\":{\"type\":\"value\",\"value\":174351.50923242987},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1699\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1700\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1724\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1715\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1716\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1717\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"FgAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Palmeira\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Mozambique\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1725\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1726\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1721\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3659405.6208472815},\"y\":{\"type\":\"value\",\"value\":-2907098.27835128},\"radius\":{\"type\":\"value\",\"value\":139447.4101451283},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1713\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1714\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1722\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3659405.6208472815},\"y\":{\"type\":\"value\",\"value\":-2907098.27835128},\"radius\":{\"type\":\"value\",\"value\":139447.4101451283},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1713\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1714\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1723\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3659405.6208472815},\"y\":{\"type\":\"value\",\"value\":-2907098.27835128},\"radius\":{\"type\":\"value\",\"value\":139447.4101451283},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1713\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1714\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1738\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1729\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1730\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1731\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"TAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Palmeiras\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Mozambique\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1739\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1740\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1735\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3659850.8988104556},\"y\":{\"type\":\"value\",\"value\":-2908329.170311803},\"radius\":{\"type\":\"value\",\"value\":210801.69082346273},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1727\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1728\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1736\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3659850.8988104556},\"y\":{\"type\":\"value\",\"value\":-2908329.170311803},\"radius\":{\"type\":\"value\",\"value\":210801.69082346273},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1727\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1728\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1737\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3659850.8988104556},\"y\":{\"type\":\"value\",\"value\":-2908329.170311803},\"radius\":{\"type\":\"value\",\"value\":210801.69082346273},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1727\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1728\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1752\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1743\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1744\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1745\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"MQAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Tororo\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Uganda\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1753\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1754\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1749\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3794102.204707143},\"y\":{\"type\":\"value\",\"value\":83492.00248384959},\"radius\":{\"type\":\"value\",\"value\":182110.4716872872},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1741\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1742\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1750\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3794102.204707143},\"y\":{\"type\":\"value\",\"value\":83492.00248384959},\"radius\":{\"type\":\"value\",\"value\":182110.4716872872},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1741\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1742\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1751\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3794102.204707143},\"y\":{\"type\":\"value\",\"value\":83492.00248384959},\"radius\":{\"type\":\"value\",\"value\":182110.4716872872},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1741\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1742\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1766\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1757\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1758\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1759\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AQAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Nyamilu\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Kenya\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1767\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1768\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1763\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3828388.6078714714},\"y\":{\"type\":\"value\",\"value\":-119564.1351697784},\"radius\":{\"type\":\"value\",\"value\":99532.8},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1755\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1756\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1764\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3828388.6078714714},\"y\":{\"type\":\"value\",\"value\":-119564.1351697784},\"radius\":{\"type\":\"value\",\"value\":99532.8},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1755\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1756\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1765\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3828388.6078714714},\"y\":{\"type\":\"value\",\"value\":-119564.1351697784},\"radius\":{\"type\":\"value\",\"value\":99532.8},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1755\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1756\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1780\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1771\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1772\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1773\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"BQAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Uriri\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Kenya\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1781\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1782\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1777\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3841969.58574825},\"y\":{\"type\":\"value\",\"value\":-105981.03181703556},\"radius\":{\"type\":\"value\",\"value\":99532.8},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1769\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1770\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1778\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3841969.58574825},\"y\":{\"type\":\"value\",\"value\":-105981.03181703556},\"radius\":{\"type\":\"value\",\"value\":99532.8},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1769\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1770\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1779\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3841969.58574825},\"y\":{\"type\":\"value\",\"value\":-105981.03181703556},\"radius\":{\"type\":\"value\",\"value\":99532.8},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1769\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1770\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1794\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1785\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1786\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1787\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"CAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Awendo\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Kenya\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1795\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1796\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1791\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3844195.975564116},\"y\":{\"type\":\"value\",\"value\":-100302.99525658593},\"radius\":{\"type\":\"value\",\"value\":99532.8},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1783\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1784\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1792\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3844195.975564116},\"y\":{\"type\":\"value\",\"value\":-100302.99525658593},\"radius\":{\"type\":\"value\",\"value\":99532.8},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1783\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1784\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1793\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3844195.975564116},\"y\":{\"type\":\"value\",\"value\":-100302.99525658593},\"radius\":{\"type\":\"value\",\"value\":99532.8},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1783\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1784\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1808\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1799\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1800\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1801\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"FQAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Uradi\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Kenya\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1809\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1810\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1805\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3845309.1704720487},\"y\":{\"type\":\"value\",\"value\":109098.42064735989},\"radius\":{\"type\":\"value\",\"value\":137301.7241314534},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1797\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1798\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1806\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3845309.1704720487},\"y\":{\"type\":\"value\",\"value\":109098.42064735989},\"radius\":{\"type\":\"value\",\"value\":137301.7241314534},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1797\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1798\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1807\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3845309.1704720487},\"y\":{\"type\":\"value\",\"value\":109098.42064735989},\"radius\":{\"type\":\"value\",\"value\":137301.7241314534},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1797\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1798\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1822\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1813\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1814\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1815\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"CQAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Sumba\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Kenya\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1823\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1824\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1819\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3851209.103484092},\"y\":{\"type\":\"value\",\"value\":-76366.99526291488},\"radius\":{\"type\":\"value\",\"value\":103518.28357153028},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1811\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1812\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1820\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3851209.103484092},\"y\":{\"type\":\"value\",\"value\":-76366.99526291488},\"radius\":{\"type\":\"value\",\"value\":103518.28357153028},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1811\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1812\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1821\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3851209.103484092},\"y\":{\"type\":\"value\",\"value\":-76366.99526291488},\"radius\":{\"type\":\"value\",\"value\":103518.28357153028},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1811\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1812\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1836\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1827\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1828\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1829\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"EgAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Chikwawa\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Malawi\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1837\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1838\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1833\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3872693.7652071943},\"y\":{\"type\":\"value\",\"value\":-1806691.5452973465},\"radius\":{\"type\":\"value\",\"value\":130424.86452075762},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1825\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1826\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1834\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3872693.7652071943},\"y\":{\"type\":\"value\",\"value\":-1806691.5452973465},\"radius\":{\"type\":\"value\",\"value\":130424.86452075762},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1825\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1826\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1835\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3872693.7652071943},\"y\":{\"type\":\"value\",\"value\":-1806691.5452973465},\"radius\":{\"type\":\"value\",\"value\":130424.86452075762},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1825\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1826\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1850\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1841\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1842\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1843\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"JQAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Ahero\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Kenya\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1851\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1852\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1847\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3887276.6185011133},\"y\":{\"type\":\"value\",\"value\":-19369.621171087503},\"radius\":{\"type\":\"value\",\"value\":165832.68555775317},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1839\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1840\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1848\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3887276.6185011133},\"y\":{\"type\":\"value\",\"value\":-19369.621171087503},\"radius\":{\"type\":\"value\",\"value\":165832.68555775317},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1839\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1840\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1849\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3887276.6185011133},\"y\":{\"type\":\"value\",\"value\":-19369.621171087503},\"radius\":{\"type\":\"value\",\"value\":165832.68555775317},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1839\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1840\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1864\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1855\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1856\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1857\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"CgAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Minepa Village\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Tanzania\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1865\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1866\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1861\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":4083310.241788068},\"y\":{\"type\":\"value\",\"value\":-924163.0301871514},\"radius\":{\"type\":\"value\",\"value\":107218.45855800275},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1853\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1854\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1862\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":4083310.241788068},\"y\":{\"type\":\"value\",\"value\":-924163.0301871514},\"radius\":{\"type\":\"value\",\"value\":107218.45855800275},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1853\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1854\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1863\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":4083310.241788068},\"y\":{\"type\":\"value\",\"value\":-924163.0301871514},\"radius\":{\"type\":\"value\",\"value\":107218.45855800275},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1853\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1854\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1878\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1869\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1870\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1871\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"KAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Motinho\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Mozambique\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1879\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1880\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1875\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":4518903.409262148},\"y\":{\"type\":\"value\",\"value\":-1215214.0015646738},\"radius\":{\"type\":\"value\",\"value\":170198.6939053824},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1867\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1868\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1876\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":4518903.409262148},\"y\":{\"type\":\"value\",\"value\":-1215214.0015646738},\"radius\":{\"type\":\"value\",\"value\":170198.6939053824},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1867\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1868\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1877\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":4518903.409262148},\"y\":{\"type\":\"value\",\"value\":-1215214.0015646738},\"radius\":{\"type\":\"value\",\"value\":170198.6939053824},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1867\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1868\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p1505\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p1520\"},{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p1521\",\"attributes\":{\"renderers\":\"auto\"}},{\"type\":\"object\",\"name\":\"BoxZoomTool\",\"id\":\"p1522\",\"attributes\":{\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p1523\",\"attributes\":{\"syncable\":false,\"level\":\"overlay\",\"visible\":false,\"left_units\":\"canvas\",\"right_units\":\"canvas\",\"top_units\":\"canvas\",\"bottom_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\":\"p1524\"},{\"type\":\"object\",\"name\":\"ResetTool\",\"id\":\"p1525\"},{\"type\":\"object\",\"name\":\"HelpTool\",\"id\":\"p1526\"},{\"type\":\"object\",\"name\":\"HoverTool\",\"id\":\"p1527\",\"attributes\":{\"renderers\":\"auto\",\"tooltips\":\"@location, @country
@n_samples @taxon\"}}]}},\"left\":[{\"type\":\"object\",\"name\":\"MercatorAxis\",\"id\":\"p1515\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"MercatorTicker\",\"id\":\"p1516\",\"attributes\":{\"mantissas\":[1,2,5],\"dimension\":\"lat\"}},\"formatter\":{\"type\":\"object\",\"name\":\"MercatorTickFormatter\",\"id\":\"p1517\",\"attributes\":{\"dimension\":\"lat\"}},\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1518\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"MercatorAxis\",\"id\":\"p1510\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"MercatorTicker\",\"id\":\"p1511\",\"attributes\":{\"mantissas\":[1,2,5],\"dimension\":\"lon\"}},\"formatter\":{\"type\":\"object\",\"name\":\"MercatorTickFormatter\",\"id\":\"p1512\",\"attributes\":{\"dimension\":\"lon\"}},\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1513\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1514\",\"attributes\":{\"axis\":{\"id\":\"p1510\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1519\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p1515\"}}}]}}]}};\n const render_items = [{\"docid\":\"296c3457-1718-4a37-9272-57ee31251c76\",\"roots\":{\"p1496\":\"f43abaaa-1e50-4764-8ab6-757ccc771ad8\"},\"root_ids\":[\"p1496\"]}];\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/javascript": [ + "(function(root) {\n", + " function embed_document(root) {\n", + " const docs_json = {\"1e2e2107-2a70-455d-a639-7f140fe7f52f\":{\"version\":\"3.4.1\",\"title\":\"Bokeh Application\",\"roots\":[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p1001\",\"attributes\":{\"width\":800,\"height\":550,\"x_range\":{\"type\":\"object\",\"name\":\"Range1d\",\"id\":\"p1011\",\"attributes\":{\"start\":-3000000.0,\"end\":6000000.0}},\"y_range\":{\"type\":\"object\",\"name\":\"Range1d\",\"id\":\"p1012\",\"attributes\":{\"start\":-3500000.0,\"end\":2000000.0}},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1013\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1014\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p1004\",\"attributes\":{\"text\":\"Af1.0 Sampling Locations\"}},\"renderers\":[{\"type\":\"object\",\"name\":\"TileRenderer\",\"id\":\"p1038\",\"attributes\":{\"tile_source\":{\"type\":\"object\",\"name\":\"WMTSTileSource\",\"id\":\"p1037\",\"attributes\":{\"url\":\"https://a.basemaps.cartocdn.com/light_all/{z}/{x}/{y}@2x.png\",\"max_zoom\":20,\"attribution\":\"© OpenStreetMap contributors © CARTO\"}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1051\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1042\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1043\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1044\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"HwAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Obuasi\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Ghana\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1052\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1053\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1048\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":-180003.61661272336},\"y\":{\"type\":\"value\",\"value\":661642.0272950786},\"radius\":{\"type\":\"value\",\"value\":156335.20609917105},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1040\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1041\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1049\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":-180003.61661272336},\"y\":{\"type\":\"value\",\"value\":661642.0272950786},\"radius\":{\"type\":\"value\",\"value\":156335.20609917105},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1040\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1041\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1050\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":-180003.61661272336},\"y\":{\"type\":\"value\",\"value\":661642.0272950786},\"radius\":{\"type\":\"value\",\"value\":156335.20609917105},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1040\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1041\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1065\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1056\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1057\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1058\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"BgAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Dimabi\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Ghana\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1066\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1067\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1062\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":-120559.00852911526},\"y\":{\"type\":\"value\",\"value\":1053385.971106188},\"radius\":{\"type\":\"value\",\"value\":99532.8},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1054\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1055\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1063\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":-120559.00852911526},\"y\":{\"type\":\"value\",\"value\":1053385.971106188},\"radius\":{\"type\":\"value\",\"value\":99532.8},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1054\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1055\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1064\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":-120559.00852911526},\"y\":{\"type\":\"value\",\"value\":1053385.971106188},\"radius\":{\"type\":\"value\",\"value\":99532.8},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1054\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1055\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1079\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1070\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1071\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1072\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"EwAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Gbullung\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Ghana\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1080\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1081\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1076\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":-112321.366210413},\"y\":{\"type\":\"value\",\"value\":1061059.9262004783},\"radius\":{\"type\":\"value\",\"value\":132796.7438109558},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1068\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1069\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1077\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":-112321.366210413},\"y\":{\"type\":\"value\",\"value\":1061059.9262004783},\"radius\":{\"type\":\"value\",\"value\":132796.7438109558},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1068\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1069\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1078\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":-112321.366210413},\"y\":{\"type\":\"value\",\"value\":1061059.9262004783},\"radius\":{\"type\":\"value\",\"value\":132796.7438109558},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1068\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1069\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1093\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1084\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1085\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1086\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"CgAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Gupanarigu\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Ghana\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1094\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1095\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1090\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":-105976.15523519642},\"y\":{\"type\":\"value\",\"value\":1062075.7105529539},\"radius\":{\"type\":\"value\",\"value\":107218.45855800272},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1082\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1083\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1091\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":-105976.15523519642},\"y\":{\"type\":\"value\",\"value\":1062075.7105529539},\"radius\":{\"type\":\"value\",\"value\":107218.45855800272},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1082\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1083\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1092\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":-105976.15523519642},\"y\":{\"type\":\"value\",\"value\":1062075.7105529539},\"radius\":{\"type\":\"value\",\"value\":107218.45855800272},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1082\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1083\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1107\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1098\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1099\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1100\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AQAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Woribogu\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Ghana\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1108\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1109\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1104\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":35733.556544640815},\"y\":{\"type\":\"value\",\"value\":991259.0921946851},\"radius\":{\"type\":\"value\",\"value\":99532.8},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1096\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1097\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1105\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":35733.556544640815},\"y\":{\"type\":\"value\",\"value\":991259.0921946851},\"radius\":{\"type\":\"value\",\"value\":99532.8},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1096\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1097\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1106\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":35733.556544640815},\"y\":{\"type\":\"value\",\"value\":991259.0921946851},\"radius\":{\"type\":\"value\",\"value\":99532.8},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1096\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1097\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1121\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1112\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1113\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1114\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"JQAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Kpome\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Benin\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1122\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1123\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1118\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":244902.87974520188},\"y\":{\"type\":\"value\",\"value\":712026.6560352404},\"radius\":{\"type\":\"value\",\"value\":165832.68555775317},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1110\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1111\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1119\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":244902.87974520188},\"y\":{\"type\":\"value\",\"value\":712026.6560352404},\"radius\":{\"type\":\"value\",\"value\":165832.68555775317},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1110\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1111\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1120\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":244902.87974520188},\"y\":{\"type\":\"value\",\"value\":712026.6560352404},\"radius\":{\"type\":\"value\",\"value\":165832.68555775317},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1110\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1111\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1135\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1126\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1127\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1128\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"KQAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Akaka Remo\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Nigeria\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1136\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1137\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1132\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":413774.54727859783},\"y\":{\"type\":\"value\",\"value\":775574.7398539326},\"radius\":{\"type\":\"value\",\"value\":171605.3584717831},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1124\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1125\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1133\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":413774.54727859783},\"y\":{\"type\":\"value\",\"value\":775574.7398539326},\"radius\":{\"type\":\"value\",\"value\":171605.3584717831},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1124\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1125\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1134\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":413774.54727859783},\"y\":{\"type\":\"value\",\"value\":775574.7398539326},\"radius\":{\"type\":\"value\",\"value\":171605.3584717831},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1124\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1125\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1149\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1140\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1141\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1142\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"LQAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Mibellon\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Cameroon\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1150\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1151\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1146\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":1280174.1441226462},\"y\":{\"type\":\"value\",\"value\":678432.1792110694},\"radius\":{\"type\":\"value\",\"value\":177013.77494857428},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1138\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1139\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1147\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":1280174.1441226462},\"y\":{\"type\":\"value\",\"value\":678432.1792110694},\"radius\":{\"type\":\"value\",\"value\":177013.77494857428},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1138\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1139\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1148\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":1280174.1441226462},\"y\":{\"type\":\"value\",\"value\":678432.1792110694},\"radius\":{\"type\":\"value\",\"value\":177013.77494857428},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1138\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1139\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1163\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1154\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1155\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1156\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"KAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Benguia\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Gabon\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1164\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1165\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1160\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":1501922.569782847},\"y\":{\"type\":\"value\",\"value\":-181809.3446907341},\"radius\":{\"type\":\"value\",\"value\":170198.69390538236},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1152\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1153\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1161\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":1501922.569782847},\"y\":{\"type\":\"value\",\"value\":-181809.3446907341},\"radius\":{\"type\":\"value\",\"value\":170198.69390538236},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1152\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1153\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1162\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":1501922.569782847},\"y\":{\"type\":\"value\",\"value\":-181809.3446907341},\"radius\":{\"type\":\"value\",\"value\":170198.69390538236},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1152\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1153\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1177\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1168\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1169\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1170\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"IgAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Kinshasa\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Democratic Republic of the Congo\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1178\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1179\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1174\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":1704635.3625173983},\"y\":{\"type\":\"value\",\"value\":-482137.9534045483},\"radius\":{\"type\":\"value\",\"value\":161223.81674709579},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1166\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1167\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1175\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":1704635.3625173983},\"y\":{\"type\":\"value\",\"value\":-482137.9534045483},\"radius\":{\"type\":\"value\",\"value\":161223.81674709579},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1166\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1167\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1176\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":1704635.3625173983},\"y\":{\"type\":\"value\",\"value\":-482137.9534045483},\"radius\":{\"type\":\"value\",\"value\":161223.81674709579},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1166\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1167\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1191\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1182\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1183\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1184\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"CgAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Bangui\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Central African Republic\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1192\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1193\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1188\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":2071433.0846812348},\"y\":{\"type\":\"value\",\"value\":487720.02304763725},\"radius\":{\"type\":\"value\",\"value\":107218.45855800272},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1180\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1181\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1189\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":2071433.0846812348},\"y\":{\"type\":\"value\",\"value\":487720.02304763725},\"radius\":{\"type\":\"value\",\"value\":107218.45855800272},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1180\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1181\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1190\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":2071433.0846812348},\"y\":{\"type\":\"value\",\"value\":487720.02304763725},\"radius\":{\"type\":\"value\",\"value\":107218.45855800272},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1180\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1181\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1205\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1196\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1197\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1198\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"KwAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Watsa Moke\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Democratic Republic of the Congo\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1206\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1207\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1202\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3289268.3139596474},\"y\":{\"type\":\"value\",\"value\":344590.0190058456},\"radius\":{\"type\":\"value\",\"value\":174351.50923242987},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1194\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1195\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1203\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3289268.3139596474},\"y\":{\"type\":\"value\",\"value\":344590.0190058456},\"radius\":{\"type\":\"value\",\"value\":174351.50923242987},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1194\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1195\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1204\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3289268.3139596474},\"y\":{\"type\":\"value\",\"value\":344590.0190058456},\"radius\":{\"type\":\"value\",\"value\":174351.50923242987},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1194\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1195\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1219\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1210\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1211\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1212\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"KwAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Katete\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Zambia\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1220\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1221\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1216\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3547418.2131092492},\"y\":{\"type\":\"value\",\"value\":-1595220.0593262194},\"radius\":{\"type\":\"value\",\"value\":174351.50923242987},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1208\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1209\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1217\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3547418.2131092492},\"y\":{\"type\":\"value\",\"value\":-1595220.0593262194},\"radius\":{\"type\":\"value\",\"value\":174351.50923242987},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1208\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1209\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1218\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3547418.2131092492},\"y\":{\"type\":\"value\",\"value\":-1595220.0593262194},\"radius\":{\"type\":\"value\",\"value\":174351.50923242987},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1208\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1209\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1233\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1224\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1225\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1226\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"FgAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Palmeira\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Mozambique\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1234\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1235\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1230\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3659405.6208472815},\"y\":{\"type\":\"value\",\"value\":-2907098.27835128},\"radius\":{\"type\":\"value\",\"value\":139447.4101451283},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1222\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1223\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1231\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3659405.6208472815},\"y\":{\"type\":\"value\",\"value\":-2907098.27835128},\"radius\":{\"type\":\"value\",\"value\":139447.4101451283},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1222\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1223\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1232\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3659405.6208472815},\"y\":{\"type\":\"value\",\"value\":-2907098.27835128},\"radius\":{\"type\":\"value\",\"value\":139447.4101451283},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1222\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1223\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1247\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1238\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1239\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1240\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"TAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Palmeiras\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Mozambique\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1248\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1249\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1244\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3659850.8988104556},\"y\":{\"type\":\"value\",\"value\":-2908329.1703118025},\"radius\":{\"type\":\"value\",\"value\":210801.69082346273},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1236\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1237\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1245\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3659850.8988104556},\"y\":{\"type\":\"value\",\"value\":-2908329.1703118025},\"radius\":{\"type\":\"value\",\"value\":210801.69082346273},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1236\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1237\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1246\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3659850.8988104556},\"y\":{\"type\":\"value\",\"value\":-2908329.1703118025},\"radius\":{\"type\":\"value\",\"value\":210801.69082346273},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1236\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1237\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1261\",\"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\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"MQAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Tororo\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Uganda\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1262\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1263\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1258\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3794102.204707143},\"y\":{\"type\":\"value\",\"value\":83492.00248384959},\"radius\":{\"type\":\"value\",\"value\":182110.4716872872},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1250\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1251\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1259\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3794102.204707143},\"y\":{\"type\":\"value\",\"value\":83492.00248384959},\"radius\":{\"type\":\"value\",\"value\":182110.4716872872},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1250\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1251\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1260\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3794102.204707143},\"y\":{\"type\":\"value\",\"value\":83492.00248384959},\"radius\":{\"type\":\"value\",\"value\":182110.4716872872},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1250\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1251\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1275\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1266\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1267\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1268\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AQAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Nyamilu\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Kenya\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1276\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1277\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1272\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3828388.6078714714},\"y\":{\"type\":\"value\",\"value\":-119564.13516977837},\"radius\":{\"type\":\"value\",\"value\":99532.8},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1264\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1265\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1273\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3828388.6078714714},\"y\":{\"type\":\"value\",\"value\":-119564.13516977837},\"radius\":{\"type\":\"value\",\"value\":99532.8},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1264\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1265\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1274\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3828388.6078714714},\"y\":{\"type\":\"value\",\"value\":-119564.13516977837},\"radius\":{\"type\":\"value\",\"value\":99532.8},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1264\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1265\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1289\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1280\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1281\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1282\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"BQAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Uriri\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Kenya\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1290\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1291\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1286\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3841969.58574825},\"y\":{\"type\":\"value\",\"value\":-105981.03181703556},\"radius\":{\"type\":\"value\",\"value\":99532.8},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1278\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1279\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1287\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3841969.58574825},\"y\":{\"type\":\"value\",\"value\":-105981.03181703556},\"radius\":{\"type\":\"value\",\"value\":99532.8},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1278\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1279\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1288\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3841969.58574825},\"y\":{\"type\":\"value\",\"value\":-105981.03181703556},\"radius\":{\"type\":\"value\",\"value\":99532.8},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1278\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1279\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1303\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1294\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1295\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1296\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"CAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Awendo\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Kenya\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1304\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1305\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1300\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3844195.975564116},\"y\":{\"type\":\"value\",\"value\":-100302.99525658593},\"radius\":{\"type\":\"value\",\"value\":99532.8},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1292\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1293\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1301\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3844195.975564116},\"y\":{\"type\":\"value\",\"value\":-100302.99525658593},\"radius\":{\"type\":\"value\",\"value\":99532.8},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1292\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1293\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1302\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3844195.975564116},\"y\":{\"type\":\"value\",\"value\":-100302.99525658593},\"radius\":{\"type\":\"value\",\"value\":99532.8},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1292\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1293\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1317\",\"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\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"FQAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Uradi\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Kenya\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1318\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1319\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1314\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3845309.1704720487},\"y\":{\"type\":\"value\",\"value\":109098.42064735989},\"radius\":{\"type\":\"value\",\"value\":137301.7241314534},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1306\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1307\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1315\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3845309.1704720487},\"y\":{\"type\":\"value\",\"value\":109098.42064735989},\"radius\":{\"type\":\"value\",\"value\":137301.7241314534},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1306\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1307\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1316\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3845309.1704720487},\"y\":{\"type\":\"value\",\"value\":109098.42064735989},\"radius\":{\"type\":\"value\",\"value\":137301.7241314534},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1306\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1307\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1331\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1322\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1323\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1324\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"CQAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Sumba\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Kenya\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1332\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1333\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1328\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3851209.103484092},\"y\":{\"type\":\"value\",\"value\":-76366.99526291488},\"radius\":{\"type\":\"value\",\"value\":103518.28357153028},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1320\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1321\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1329\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3851209.103484092},\"y\":{\"type\":\"value\",\"value\":-76366.99526291488},\"radius\":{\"type\":\"value\",\"value\":103518.28357153028},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1320\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1321\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1330\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3851209.103484092},\"y\":{\"type\":\"value\",\"value\":-76366.99526291488},\"radius\":{\"type\":\"value\",\"value\":103518.28357153028},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1320\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1321\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1345\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1336\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1337\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1338\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"EgAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Chikwawa\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Malawi\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1346\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1347\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1342\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3872693.7652071943},\"y\":{\"type\":\"value\",\"value\":-1806691.545297346},\"radius\":{\"type\":\"value\",\"value\":130424.86452075765},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1334\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1335\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1343\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3872693.7652071943},\"y\":{\"type\":\"value\",\"value\":-1806691.545297346},\"radius\":{\"type\":\"value\",\"value\":130424.86452075765},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1334\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1335\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1344\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3872693.7652071943},\"y\":{\"type\":\"value\",\"value\":-1806691.545297346},\"radius\":{\"type\":\"value\",\"value\":130424.86452075765},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1334\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1335\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1359\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1350\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1351\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1352\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"JQAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Ahero\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Kenya\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1360\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1361\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1356\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3887276.6185011133},\"y\":{\"type\":\"value\",\"value\":-19369.621171087503},\"radius\":{\"type\":\"value\",\"value\":165832.68555775317},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1348\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1349\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1357\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3887276.6185011133},\"y\":{\"type\":\"value\",\"value\":-19369.621171087503},\"radius\":{\"type\":\"value\",\"value\":165832.68555775317},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1348\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1349\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1358\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":3887276.6185011133},\"y\":{\"type\":\"value\",\"value\":-19369.621171087503},\"radius\":{\"type\":\"value\",\"value\":165832.68555775317},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1348\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1349\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1373\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1364\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1365\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1366\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"CgAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Minepa Village\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Tanzania\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1374\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1375\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1370\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":4083310.241788068},\"y\":{\"type\":\"value\",\"value\":-924163.0301871514},\"radius\":{\"type\":\"value\",\"value\":107218.45855800272},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1362\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1363\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1371\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":4083310.241788068},\"y\":{\"type\":\"value\",\"value\":-924163.0301871514},\"radius\":{\"type\":\"value\",\"value\":107218.45855800272},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1362\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1363\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1372\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":4083310.241788068},\"y\":{\"type\":\"value\",\"value\":-924163.0301871514},\"radius\":{\"type\":\"value\",\"value\":107218.45855800272},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1362\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1363\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}},{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1387\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1378\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1379\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1380\"},\"data\":{\"type\":\"map\",\"entries\":[[\"index\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"taxon\",{\"type\":\"ndarray\",\"array\":[\"funestus\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"n_samples\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"KAAAAA==\"},\"shape\":[1],\"dtype\":\"int32\",\"order\":\"little\"}],[\"location\",{\"type\":\"ndarray\",\"array\":[\"Motinho\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"country\",{\"type\":\"ndarray\",\"array\":[\"Mozambique\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}],[\"angle\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"GC1EVPshGUA=\"},\"shape\":[1],\"dtype\":\"float64\",\"order\":\"little\"}],[\"color\",{\"type\":\"ndarray\",\"array\":[\"#d62728\"],\"shape\":[1],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1388\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1389\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1384\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":4518903.409262148},\"y\":{\"type\":\"value\",\"value\":-1215214.0015646738},\"radius\":{\"type\":\"value\",\"value\":170198.69390538236},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1376\",\"attributes\":{\"field\":\"angle\",\"include_zero\":true}}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"type\":\"object\",\"name\":\"CumSum\",\"id\":\"p1377\",\"attributes\":{\"field\":\"angle\"}}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.9},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.9},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.9}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1385\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":4518903.409262148},\"y\":{\"type\":\"value\",\"value\":-1215214.0015646738},\"radius\":{\"type\":\"value\",\"value\":170198.69390538236},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1376\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1377\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Wedge\",\"id\":\"p1386\",\"attributes\":{\"x\":{\"type\":\"value\",\"value\":4518903.409262148},\"y\":{\"type\":\"value\",\"value\":-1215214.0015646738},\"radius\":{\"type\":\"value\",\"value\":170198.69390538236},\"start_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1376\"}},\"end_angle\":{\"type\":\"expr\",\"expr\":{\"id\":\"p1377\"}},\"line_color\":{\"type\":\"field\",\"field\":\"color\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"line_width\":{\"type\":\"value\",\"value\":0.5},\"fill_color\":{\"type\":\"field\",\"field\":\"color\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p1010\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p1025\"},{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p1026\",\"attributes\":{\"renderers\":\"auto\"}},{\"type\":\"object\",\"name\":\"BoxZoomTool\",\"id\":\"p1027\",\"attributes\":{\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p1028\",\"attributes\":{\"syncable\":false,\"level\":\"overlay\",\"visible\":false,\"left\":{\"type\":\"number\",\"value\":\"nan\"},\"right\":{\"type\":\"number\",\"value\":\"nan\"},\"top\":{\"type\":\"number\",\"value\":\"nan\"},\"bottom\":{\"type\":\"number\",\"value\":\"nan\"},\"left_units\":\"canvas\",\"right_units\":\"canvas\",\"top_units\":\"canvas\",\"bottom_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\":\"p1033\"},{\"type\":\"object\",\"name\":\"ResetTool\",\"id\":\"p1034\"},{\"type\":\"object\",\"name\":\"HelpTool\",\"id\":\"p1035\"},{\"type\":\"object\",\"name\":\"HoverTool\",\"id\":\"p1036\",\"attributes\":{\"renderers\":\"auto\",\"tooltips\":\"@location, @country
@n_samples @taxon\"}}]}},\"left\":[{\"type\":\"object\",\"name\":\"MercatorAxis\",\"id\":\"p1020\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"MercatorTicker\",\"id\":\"p1021\",\"attributes\":{\"mantissas\":[1,2,5],\"dimension\":\"lat\"}},\"formatter\":{\"type\":\"object\",\"name\":\"MercatorTickFormatter\",\"id\":\"p1022\",\"attributes\":{\"dimension\":\"lat\"}},\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1023\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"MercatorAxis\",\"id\":\"p1015\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"MercatorTicker\",\"id\":\"p1016\",\"attributes\":{\"mantissas\":[1,2,5],\"dimension\":\"lon\"}},\"formatter\":{\"type\":\"object\",\"name\":\"MercatorTickFormatter\",\"id\":\"p1017\",\"attributes\":{\"dimension\":\"lon\"}},\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1018\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1019\",\"attributes\":{\"axis\":{\"id\":\"p1015\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1024\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p1020\"}}}]}}]}};\n", + " const render_items = [{\"docid\":\"1e2e2107-2a70-455d-a639-7f140fe7f52f\",\"roots\":{\"p1001\":\"bbb6c5c1-6a34-4ba1-8cbc-af276a6a52e6\"},\"root_ids\":[\"p1001\"]}];\n", + " void 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": "p1496" + "id": "p1001" } }, "output_type": "display_data" @@ -212,10 +555,7 @@ "source": [ "## Whole-genome sequencing and variant calling\n", "\n", - "All samples in `Af1.0` have been sequenced individually to high coverage using Illumina technology at the Wellcome Sanger Institute. These sequence data have then been analysed to identify genetic variants such as single nucleotide polymorphisms (SNPs). After variant calling, both the samples and the variants have been through a range of quality control analyses, to ensure the data are of high quality. Both the raw sequence data and the curated variant calls are openly available for download and analysis. \n", - "\n", - "\n", - "For further information about the sequencing and variant calling methods used, please see the [methods page](methods)." + "All samples in `Af1.0` have been sequenced individually to high coverage using Illumina technology at the Wellcome Sanger Institute. These sequence data have then been analysed to identify genetic variants such as single nucleotide polymorphisms (SNPs). After variant calling, both the samples and the variants have been through a range of quality control analyses, to ensure the data are of high quality. Both the raw sequence data and the curated variant calls are openly available for download and analysis. " ] }, { @@ -228,9 +568,9 @@ "\n", "Data from `Af1.0` are hosted by several different services. \n", "\n", - "Raw sequence reads, sequence read alignments and SNP calls are available for download from the European Nucleotide Archive (ENA). Further information on how to find and download these data is provided in the [data download guide](download).\n", + "Raw sequence reads, sequence read alignments and SNP calls are available for download from the European Nucleotide Archive (ENA). Further information on how to find and download these data is provided in the [data download guide](https://malariagen.github.io/vector-data/af1/download.html).\n", "\n", - "The SNP data have also been uploaded to Google Cloud, and can be analysed directly within the cloud without having to download or copy any data, including via free interactive computing services such as [MyBinder](https://gke.mybinder.org/) and [Google Colab](https://colab.research.google.com/). Further information about analysing these data in the cloud is provided in the [cloud data access guide](cloud)." + "The SNP data have also been uploaded to Google Cloud, and can be analysed directly within the cloud without having to download or copy any data, including via free interactive computing services such as [MyBinder](https://gke.mybinder.org/) and [Google Colab](https://colab.research.google.com/). Further information about analysing these data in the cloud is provided in the [cloud data access guide](https://malariagen.github.io/vector-data/af1/cloud.html)." ] }, { @@ -256,7 +596,289 @@ "outputs": [ { "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\nconst 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 function drop(id) {\n const view = Bokeh.index.get_by_id(id)\n if (view != null) {\n view.model.document.clear()\n Bokeh.index.delete(view)\n }\n }\n\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\n // Clean up Bokeh references\n if (id != null) {\n drop(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 drop(id)\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 \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n \"
  • use INLINE resources instead, as so:
  • \\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(null);\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.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.3.0.min.js\"];\n const css_urls = [];\n\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {\n }\n ];\n\n function run_inline_js() {\n if (root.Bokeh !== undefined || force === true) {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\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(null)).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/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", + " function drop(id) {\n", + " const view = Bokeh.index.get_by_id(id)\n", + " if (view != null) {\n", + " view.model.document.clear()\n", + " Bokeh.index.delete(view)\n", + " }\n", + " }\n", + "\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", + "\n", + " // Clean up Bokeh references\n", + " if (id != null) {\n", + " drop(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", + " drop(id)\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", + " \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n", + " \"
  • use INLINE resources instead, as so:
  • \\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(null);\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.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.3.0.min.js\"];\n", + " const css_urls = [];\n", + "\n", + " const inline_js = [ function(Bokeh) {\n", + " Bokeh.set_log_level(\"info\");\n", + " },\n", + "function(Bokeh) {\n", + " }\n", + " ];\n", + "\n", + " function run_inline_js() {\n", + " if (root.Bokeh !== undefined || force === true) {\n", + " for (let i = 0; i < inline_js.length; i++) {\n", + " inline_js[i].call(root, root.Bokeh);\n", + " }\n", + "} 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(null)).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": "" }, "metadata": {}, @@ -584,7 +1206,7 @@ "id": "dLiU0ulIpk8p" }, "source": [ - "Note that there are also multiple sampling sites represented within some sample sets." + "Note that there are also multiple sampling sites represented within some sample sets. More information about these sample sets can be found in the [Af1.0 data resource webpage](https://www.malariagen.net/data_package/af10-anopheles-funestus-data-resource/)." ] }, { @@ -615,9 +1237,9 @@ "provenance": [] }, "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "global-global-binder-5.0.0", "language": "python", - "name": "python3" + "name": "conda-env-global-global-binder-5.0.0-py" }, "language_info": { "codemirror_mode": { @@ -629,7 +1251,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.10" + "version": "3.10.14" } }, "nbformat": 4, diff --git a/docs/af1/cloud.ipynb b/docs/af1/cloud.ipynb index 71dda59..8696b38 100644 --- a/docs/af1/cloud.ipynb +++ b/docs/af1/cloud.ipynb @@ -48,18 +48,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[K |████████████████████████████████| 47 kB 1.3 MB/s \n", - "\u001b[K |████████████████████████████████| 153 kB 7.3 MB/s \n", - "\u001b[K |████████████████████████████████| 2.3 MB 32.8 MB/s \n", - "\u001b[K |████████████████████████████████| 3.3 MB 30.5 MB/s \n", - "\u001b[K |████████████████████████████████| 5.7 MB 27.8 MB/s \n", - "\u001b[K |████████████████████████████████| 134 kB 61.7 MB/s \n", - "\u001b[K |████████████████████████████████| 1.1 MB 29.9 MB/s \n", - "\u001b[K |████████████████████████████████| 144 kB 50.2 MB/s \n", - "\u001b[K |████████████████████████████████| 94 kB 979 kB/s \n", - "\u001b[K |████████████████████████████████| 271 kB 51.9 MB/s \n", - "\u001b[K |████████████████████████████████| 6.2 MB 26.2 MB/s \n", - "\u001b[?25h Building wheel for asciitree (setup.py) ... \u001b[?25l\u001b[?25hdone\n" + "Note: you may need to restart the kernel to use updated packages.\n" ] } ], @@ -73,16 +62,17 @@ "id": "osgZ9pB7QH_1" }, "source": [ - "To make accessing these data more convenient, we've created the [malariagen_data](https://github.com/malariagen/malariagen-data-python) Python package. This is experimental so please let us know if you find any bugs or have any suggestions. See the [Ag3 API docs](api) for documentation of all functions available from this package. \n", + "To make accessing these data more convenient, we've created the [malariagen_data](https://github.com/malariagen/malariagen-data-python) Python package. This is experimental so please let us know if you find any bugs or have any suggestions. See the [Af1 API docs](https://malariagen.github.io/malariagen-data-python/latest/Af1.html) for documentation of all functions available from this package. \n", "\n", "Import other packages we'll need to use here." ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "metadata": { - "id": "970klnG1eu8N" + "id": "970klnG1eu8N", + "tags": [] }, "outputs": [], "source": [ @@ -107,20 +97,332 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 190 }, "id": "mIsSaTuOQH_2", - "outputId": "4facd5a9-6e43-460a-811c-30293568918e" + "outputId": "4facd5a9-6e43-460a-811c-30293568918e", + "tags": [] }, "outputs": [ { "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\nconst 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 function drop(id) {\n const view = Bokeh.index.get_by_id(id)\n if (view != null) {\n view.model.document.clear()\n Bokeh.index.delete(view)\n }\n }\n\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\n // Clean up Bokeh references\n if (id != null) {\n drop(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 drop(id)\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 \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n \"
  • use INLINE resources instead, as so:
  • \\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(null);\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.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.3.0.min.js\"];\n const css_urls = [];\n\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {\n }\n ];\n\n function run_inline_js() {\n if (root.Bokeh !== undefined || force === true) {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\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(null)).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": "" + "application/javascript": [ + "'use strict';\n", + "(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", + " function drop(id) {\n", + " const view = Bokeh.index.get_by_id(id)\n", + " if (view != null) {\n", + " view.model.document.clear()\n", + " Bokeh.index.delete(view)\n", + " }\n", + " }\n", + "\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", + "\n", + " // Clean up Bokeh references\n", + " if (id != null) {\n", + " drop(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", + " drop(id)\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", + " \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n", + " \"
  • use INLINE resources instead, as so:
  • \\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(error = null) {\n", + " const el = document.getElementById(null);\n", + " if (el != null) {\n", + " const html = (() => {\n", + " if (typeof root.Bokeh === \"undefined\") {\n", + " if (error == null) {\n", + " return \"BokehJS is loading ...\";\n", + " } else {\n", + " return \"BokehJS failed to load.\";\n", + " }\n", + " } else {\n", + " const prefix = `BokehJS ${root.Bokeh.version}`;\n", + " if (error == null) {\n", + " return `${prefix} successfully loaded.`;\n", + " } else {\n", + " return `${prefix} encountered errors while loading and may not function as expected.`;\n", + " }\n", + " }\n", + " })();\n", + " el.innerHTML = html;\n", + "\n", + " if (error != null) {\n", + " const wrapper = document.createElement(\"div\");\n", + " wrapper.style.overflow = \"auto\";\n", + " wrapper.style.height = \"5em\";\n", + " wrapper.style.resize = \"vertical\";\n", + " const content = document.createElement(\"div\");\n", + " content.style.fontFamily = \"monospace\";\n", + " content.style.whiteSpace = \"pre-wrap\";\n", + " content.style.backgroundColor = \"rgb(255, 221, 221)\";\n", + " content.textContent = error.stack ?? error.toString();\n", + " wrapper.append(content);\n", + " el.append(wrapper);\n", + " }\n", + " } else if (Date.now() < root._bokeh_timeout) {\n", + " setTimeout(() => display_loaded(error), 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.4.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.4.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.4.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.4.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.4.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", + " try {\n", + " for (let i = 0; i < inline_js.length; i++) {\n", + " inline_js[i].call(root, root.Bokeh);\n", + " }\n", + "\n", + " } catch (error) {throw error;\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(null)).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": "'use strict';\n(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 \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n \"
  • use INLINE resources instead, as so:
  • \\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(error = null) {\n const el = document.getElementById(null);\n if (el != null) {\n const html = (() => {\n if (typeof root.Bokeh === \"undefined\") {\n if (error == null) {\n return \"BokehJS is loading ...\";\n } else {\n return \"BokehJS failed to load.\";\n }\n } else {\n const prefix = `BokehJS ${root.Bokeh.version}`;\n if (error == null) {\n return `${prefix} successfully loaded.`;\n } else {\n return `${prefix} encountered errors while loading and may not function as expected.`;\n }\n }\n })();\n el.innerHTML = html;\n\n if (error != null) {\n const wrapper = document.createElement(\"div\");\n wrapper.style.overflow = \"auto\";\n wrapper.style.height = \"5em\";\n wrapper.style.resize = \"vertical\";\n const content = document.createElement(\"div\");\n content.style.fontFamily = \"monospace\";\n content.style.whiteSpace = \"pre-wrap\";\n content.style.backgroundColor = \"rgb(255, 221, 221)\";\n content.textContent = error.stack ?? error.toString();\n wrapper.append(content);\n el.append(wrapper);\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(() => display_loaded(error), 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.4.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.4.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.4.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.4.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.4.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 try {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\n\n } catch (error) {throw error;\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(null)).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" @@ -137,7 +439,8 @@ " \n", " Please note that data are subject to terms of use,\n", " for more information see \n", - " the MalariaGEN website or contact data@malariagen.net.\n", + " the MalariaGEN website or contact support@malariagen.net.\n", + " See also the Af1 API docs.\n", " \n", " \n", " \n", @@ -145,7 +448,7 @@ " \n", " Storage URL\n", " \n", - " gs://vo_afun_release/\n", + " gs://vo_afun_release_master_us_central1\n", " \n", " \n", " \n", @@ -163,7 +466,7 @@ " \n", " Cohorts analysis\n", " \n", - " 20231122\n", + " 20231215\n", " \n", " \n", " \n", @@ -175,13 +478,13 @@ " \n", " Software version\n", " \n", - " malariagen_data 7.14.0\n", + " malariagen_data 10.0.0\n", " \n", " \n", " \n", " Client location\n", " \n", - " unknown\n", + " Iowa, United States (Google Cloud us-central1)\n", " \n", " \n", " \n", @@ -189,20 +492,21 @@ ], "text/plain": [ "\n", - "Storage URL : gs://vo_afun_release/\n", + "Storage URL : gs://vo_afun_release_master_us_central1\n", "Data releases available : 1.0\n", "Results cache : None\n", - "Cohorts analysis : 20231122\n", + "Cohorts analysis : 20231215\n", "Site filters analysis : dt_20200416\n", - "Software version : malariagen_data 7.14.0\n", - "Client location : unknown\n", + "Software version : malariagen_data 10.0.0\n", + "Client location : Iowa, United States (Google Cloud us-central1)\n", "---\n", "Please note that data are subject to terms of use,\n", "for more information see https://www.malariagen.net/data\n", - "or contact data@malariagen.net." + "or contact support@malariagen.net. For API documentation see \n", + "https://malariagen.github.io/malariagen-data-python/v10.0.0/Af1.html" ] }, - "execution_count": 2, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -220,7 +524,7 @@ "source": [ "## Sample sets\n", "\n", - "Data are organised into different releases. As an example, data in Ag3.0 are organised into 28 sample sets. Each of these sample sets corresponds to a set of mosquito specimens contributed by a collaborating study. Depending on your objectives, you may want to access data from only specific sample sets, or all sample sets.\n", + "Data are organised into different releases. As an example, data in Af1.0 are organised into 8 sample sets. Each of these sample sets corresponds to a set of mosquito specimens contributed by a collaborating study. Depending on your objectives, you may want to access data from only specific sample sets, or all sample sets.\n", "\n", "To see which sample sets are available, load the sample set manifest into a pandas dataframe:" ] @@ -372,7 +676,7 @@ "id": "J0SHf6vaQH_3" }, "source": [ - "For more information about these sample sets, see the section on sample sets in the [introduction to Ag1000G phase 3](https://malariagen.github.io/vector-data/ag3/ag3.0.html)." + "For more information about these sample sets, you can read about each sample set from the URLs under the field `study_url`." ] }, { @@ -397,9 +701,17 @@ "height": 661 }, "id": "-V8nLGSaQH_4", - "outputId": "98a12919-fd6a-4fd5-8155-d90f05d877d7" + "outputId": "98a12919-fd6a-4fd5-8155-d90f05d877d7", + "tags": [] }, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " \r" + ] + }, { "data": { "text/html": [ @@ -825,7 +1137,8 @@ "base_uri": "https://localhost:8080/" }, "id": "PpsTgviZQH_4", - "outputId": "ddbc9515-25dc-454f-9f02-9427f1261b06" + "outputId": "ddbc9515-25dc-454f-9f02-9427f1261b06", + "tags": [] }, "outputs": [ { @@ -860,16 +1173,24 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 6, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 430 }, "id": "433PD7k8jlNj", - "outputId": "bc5e1b8d-f1f4-4008-df56-f577a9080561" + "outputId": "bc5e1b8d-f1f4-4008-df56-f577a9080561", + "tags": [] }, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " \r" + ] + }, { "data": { "text/html": [ @@ -904,6 +1225,7 @@ "}\n", "\n", "html[theme=dark],\n", + "body[data-theme=dark],\n", "body.vscode-dark {\n", " --xr-font-color0: rgba(255, 255, 255, 1);\n", " --xr-font-color2: rgba(255, 255, 255, 0.54);\n", @@ -916,7 +1238,7 @@ "}\n", "\n", ".xr-wrap {\n", - " display: block;\n", + " display: block !important;\n", " min-width: 300px;\n", " max-width: 700px;\n", "}\n", @@ -1133,6 +1455,11 @@ " grid-column: 4;\n", "}\n", "\n", + ".xr-index-preview {\n", + " grid-column: 2 / 5;\n", + " color: var(--xr-font-color2);\n", + "}\n", + "\n", ".xr-var-name,\n", ".xr-var-dims,\n", ".xr-var-dtype,\n", @@ -1154,14 +1481,16 @@ "}\n", "\n", ".xr-var-attrs,\n", - ".xr-var-data {\n", + ".xr-var-data,\n", + ".xr-index-data {\n", " display: none;\n", " background-color: var(--xr-background-color) !important;\n", " padding-bottom: 5px !important;\n", "}\n", "\n", ".xr-var-attrs-in:checked ~ .xr-var-attrs,\n", - ".xr-var-data-in:checked ~ .xr-var-data {\n", + ".xr-var-data-in:checked ~ .xr-var-data,\n", + ".xr-index-data-in:checked ~ .xr-index-data {\n", " display: block;\n", "}\n", "\n", @@ -1171,13 +1500,16 @@ "\n", ".xr-var-name span,\n", ".xr-var-data,\n", + ".xr-index-name div,\n", + ".xr-index-data,\n", ".xr-attrs {\n", " padding-left: 25px !important;\n", "}\n", "\n", ".xr-attrs,\n", ".xr-var-attrs,\n", - ".xr-var-data {\n", + ".xr-var-data,\n", + ".xr-index-data {\n", " grid-column: 1 / -1;\n", "}\n", "\n", @@ -1215,7 +1547,8 @@ "}\n", "\n", ".xr-icon-database,\n", - ".xr-icon-file-text2 {\n", + ".xr-icon-file-text2,\n", + ".xr-no-icon {\n", " display: inline-block;\n", " vertical-align: middle;\n", " width: 1em;\n", @@ -1224,26 +1557,27 @@ " stroke: currentColor;\n", " fill: currentColor;\n", "}\n", - "
<xarray.Dataset>\n",
-       "Dimensions:                       (variants: 102882611, alleles: 4, samples: 656, ploidy: 2)\n",
+       "
<xarray.Dataset> Size: 1TB\n",
+       "Dimensions:                       (variants: 102882611, alleles: 4,\n",
+       "                                   samples: 656, ploidy: 2)\n",
        "Coordinates:\n",
-       "    variant_position              (variants) int32 dask.array<chunksize=(524288,), meta=np.ndarray>\n",
-       "    variant_contig                (variants) uint8 dask.array<chunksize=(524288,), meta=np.ndarray>\n",
-       "    sample_id                     (samples) <U36 dask.array<chunksize=(36,), meta=np.ndarray>\n",
+       "    variant_position              (variants) int32 412MB dask.array<chunksize=(524288,), meta=np.ndarray>\n",
+       "    variant_contig                (variants) uint8 103MB dask.array<chunksize=(524288,), meta=np.ndarray>\n",
+       "    sample_id                     (samples) <U36 94kB dask.array<chunksize=(36,), meta=np.ndarray>\n",
        "Dimensions without coordinates: variants, alleles, samples, ploidy\n",
        "Data variables:\n",
-       "    variant_allele                (variants, alleles) |S1 dask.array<chunksize=(524288, 1), meta=np.ndarray>\n",
-       "    variant_filter_pass_funestus  (variants) bool dask.array<chunksize=(300000,), meta=np.ndarray>\n",
-       "    call_genotype                 (variants, samples, ploidy) int8 dask.array<chunksize=(300000, 36, 2), meta=np.ndarray>\n",
-       "    call_GQ                       (variants, samples) int8 dask.array<chunksize=(300000, 36), meta=np.ndarray>\n",
-       "    call_MQ                       (variants, samples) float32 dask.array<chunksize=(300000, 36), meta=np.ndarray>\n",
-       "    call_AD                       (variants, samples, alleles) int16 dask.array<chunksize=(300000, 36, 4), meta=np.ndarray>\n",
-       "    call_genotype_mask            (variants, samples, ploidy) bool dask.array<chunksize=(300000, 36, 2), meta=np.ndarray>\n",
+       "    variant_allele                (variants, alleles) |S1 412MB dask.array<chunksize=(524288, 1), meta=np.ndarray>\n",
+       "    variant_filter_pass_funestus  (variants) bool 103MB dask.array<chunksize=(300000,), meta=np.ndarray>\n",
+       "    call_genotype                 (variants, samples, ploidy) int8 135GB dask.array<chunksize=(300000, 36, 2), meta=np.ndarray>\n",
+       "    call_GQ                       (variants, samples) int8 67GB dask.array<chunksize=(300000, 36), meta=np.ndarray>\n",
+       "    call_MQ                       (variants, samples) float32 270GB dask.array<chunksize=(300000, 36), meta=np.ndarray>\n",
+       "    call_AD                       (variants, samples, alleles) int16 540GB dask.array<chunksize=(300000, 36, 4), meta=np.ndarray>\n",
+       "    call_genotype_mask            (variants, samples, ploidy) bool 135GB dask.array<chunksize=(300000, 36, 2), meta=np.ndarray>\n",
        "Attributes:\n",
-       "    contigs:  ('2RL', '3RL', 'X')
" + "
    • contigs :
      ('2RL', '3RL', 'X')
    • " ], "text/plain": [ - "\n", - "Dimensions: (variants: 102882611, alleles: 4, samples: 656, ploidy: 2)\n", + " Size: 1TB\n", + "Dimensions: (variants: 102882611, alleles: 4,\n", + " samples: 656, ploidy: 2)\n", "Coordinates:\n", - " variant_position (variants) int32 dask.array\n", - " variant_contig (variants) uint8 dask.array\n", - " sample_id (samples) \n", + " variant_position (variants) int32 412MB dask.array\n", + " variant_contig (variants) uint8 103MB dask.array\n", + " sample_id (samples) \n", "Dimensions without coordinates: variants, alleles, samples, ploidy\n", "Data variables:\n", - " variant_allele (variants, alleles) |S1 dask.array\n", - " variant_filter_pass_funestus (variants) bool dask.array\n", - " call_genotype (variants, samples, ploidy) int8 dask.array\n", - " call_GQ (variants, samples) int8 dask.array\n", - " call_MQ (variants, samples) float32 dask.array\n", - " call_AD (variants, samples, alleles) int16 dask.array\n", - " call_genotype_mask (variants, samples, ploidy) bool dask.array\n", + " variant_allele (variants, alleles) |S1 412MB dask.array\n", + " variant_filter_pass_funestus (variants) bool 103MB dask.array\n", + " call_genotype (variants, samples, ploidy) int8 135GB dask.array\n", + " call_GQ (variants, samples) int8 67GB dask.array\n", + " call_MQ (variants, samples) float32 270GB dask.array\n", + " call_AD (variants, samples, alleles) int16 540GB dask.array\n", + " call_genotype_mask (variants, samples, ploidy) bool 135GB dask.array\n", "Attributes:\n", " contigs: ('2RL', '3RL', 'X')" ] }, - "execution_count": 8, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -2277,14 +2592,15 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 7, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 132 }, "id": "GO5Os0epQH_5", - "outputId": "7c970e20-4811-46a1-8944-4bd7f6e8359f" + "outputId": "7c970e20-4811-46a1-8944-4bd7f6e8359f", + "tags": [] }, "outputs": [ { @@ -2293,7 +2609,7 @@ "\n", " \n", "
      \n", - " \n", + "
      \n", " \n", " \n", " \n", @@ -2315,14 +2631,12 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", "
      (524288,)
      Count 197 Tasks 197 Chunks Dask graph 197 chunks in 1 graph layer
      Type int32 numpy.ndarray Data type int32 numpy.ndarray
      \n", @@ -2371,7 +2685,7 @@ "dask.array" ] }, - "execution_count": 9, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -2383,14 +2697,15 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 8, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 197 }, "id": "eD5Gtb-xQH_5", - "outputId": "60a9f964-0335-4084-b359-7902d138bec3" + "outputId": "60a9f964-0335-4084-b359-7902d138bec3", + "tags": [] }, "outputs": [ { @@ -2399,7 +2714,7 @@ "\n", " \n", "
      \n", - " \n", + "
      \n", " \n", " \n", " \n", @@ -2421,14 +2736,12 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", "
      (524288, 3)
      Count 985 Tasks 394 Chunks Dask graph 394 chunks in 4 graph layers
      Type |S1 numpy.ndarray Data type |S1 numpy.ndarray
      \n", @@ -2478,7 +2791,7 @@ "dask.array" ] }, - "execution_count": 10, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -2499,13 +2812,14 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 9, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "3_1qTYtiQH_5", - "outputId": "c260b22a-cc89-4a3c-9371-21fde9ec189e" + "outputId": "c260b22a-cc89-4a3c-9371-21fde9ec189e", + "tags": [] }, "outputs": [ { @@ -2514,7 +2828,7 @@ "array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], dtype=int32)" ] }, - "execution_count": 11, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -2527,13 +2841,14 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 10, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "UjeBeyOXQH_6", - "outputId": "4ef2a2e1-789a-4ec0-fff6-53e83f4951d1" + "outputId": "4ef2a2e1-789a-4ec0-fff6-53e83f4951d1", + "tags": [] }, "outputs": [ { @@ -2551,7 +2866,7 @@ " [b'T', b'A', b'C', b'G']], dtype='|S1')" ] }, - "execution_count": 12, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -2592,14 +2907,15 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 11, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 132 }, "id": "wh1AaMJ_QH_6", - "outputId": "e9b544fc-2db0-4f83-e23b-30258598d552" + "outputId": "e9b544fc-2db0-4f83-e23b-30258598d552", + "tags": [] }, "outputs": [ { @@ -2608,7 +2924,7 @@ "\n", " \n", "
      \n", - " \n", + "
      \n", " \n", " \n", " \n", @@ -2630,14 +2946,12 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", "
      (300000,)
      Count 343 Tasks 343 Chunks Dask graph 343 chunks in 1 graph layer
      Type bool numpy.ndarray Data type bool numpy.ndarray
      \n", @@ -2686,7 +3000,7 @@ "dask.array" ] }, - "execution_count": 14, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -2699,13 +3013,14 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 12, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "klokhPxwQH_6", - "outputId": "28c6cbfd-b6cc-46f0-9554-c027c4c57cae" + "outputId": "28c6cbfd-b6cc-46f0-9554-c027c4c57cae", + "tags": [] }, "outputs": [ { @@ -2715,7 +3030,7 @@ " False])" ] }, - "execution_count": 15, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -2765,14 +3080,15 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 13, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 173 }, "id": "QPViDmX_QH_7", - "outputId": "125ba0b7-4e6d-4c61-f325-39e9eb9522e7" + "outputId": "125ba0b7-4e6d-4c61-f325-39e9eb9522e7", + "tags": [] }, "outputs": [ { @@ -2781,7 +3097,7 @@ "\n", " \n", "
      \n", - " \n", + "
      \n", " \n", " \n", " \n", @@ -2803,14 +3119,12 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", "
      (300000, 50, 2)
      Count 10976 Tasks 5488 Chunks Dask graph 5488 chunks in 9 graph layers
      Type int8 numpy.ndarray Data type int8 numpy.ndarray
      \n", @@ -2930,7 +3244,7 @@ "dask.array" ] }, - "execution_count": 16, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -2951,13 +3265,14 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 14, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "H0pR2bOCRcLI", - "outputId": "b3283a90-3202-45e9-9482-a926594945df" + "outputId": "b3283a90-3202-45e9-9482-a926594945df", + "tags": [] }, "outputs": [ { @@ -2966,7 +3281,7 @@ "True" ] }, - "execution_count": 17, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -2988,13 +3303,14 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 15, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "WqyNsEwLRo0q", - "outputId": "77a966bd-5ab3-416f-fb16-8cc38f46bac2" + "outputId": "77a966bd-5ab3-416f-fb16-8cc38f46bac2", + "tags": [] }, "outputs": [ { @@ -3012,14 +3328,15 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 16, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 430 }, "id": "auvV_O0Dx1GT", - "outputId": "e3991a1a-1289-4e3d-f3f3-1539d7d336d0" + "outputId": "e3991a1a-1289-4e3d-f3f3-1539d7d336d0", + "tags": [] }, "outputs": [ { @@ -3056,6 +3373,7 @@ "}\n", "\n", "html[theme=dark],\n", + "body[data-theme=dark],\n", "body.vscode-dark {\n", " --xr-font-color0: rgba(255, 255, 255, 1);\n", " --xr-font-color2: rgba(255, 255, 255, 0.54);\n", @@ -3068,7 +3386,7 @@ "}\n", "\n", ".xr-wrap {\n", - " display: block;\n", + " display: block !important;\n", " min-width: 300px;\n", " max-width: 700px;\n", "}\n", @@ -3285,6 +3603,11 @@ " grid-column: 4;\n", "}\n", "\n", + ".xr-index-preview {\n", + " grid-column: 2 / 5;\n", + " color: var(--xr-font-color2);\n", + "}\n", + "\n", ".xr-var-name,\n", ".xr-var-dims,\n", ".xr-var-dtype,\n", @@ -3306,14 +3629,16 @@ "}\n", "\n", ".xr-var-attrs,\n", - ".xr-var-data {\n", + ".xr-var-data,\n", + ".xr-index-data {\n", " display: none;\n", " background-color: var(--xr-background-color) !important;\n", " padding-bottom: 5px !important;\n", "}\n", "\n", ".xr-var-attrs-in:checked ~ .xr-var-attrs,\n", - ".xr-var-data-in:checked ~ .xr-var-data {\n", + ".xr-var-data-in:checked ~ .xr-var-data,\n", + ".xr-index-data-in:checked ~ .xr-index-data {\n", " display: block;\n", "}\n", "\n", @@ -3323,13 +3648,16 @@ "\n", ".xr-var-name span,\n", ".xr-var-data,\n", + ".xr-index-name div,\n", + ".xr-index-data,\n", ".xr-attrs {\n", " padding-left: 25px !important;\n", "}\n", "\n", ".xr-attrs,\n", ".xr-var-attrs,\n", - ".xr-var-data {\n", + ".xr-var-data,\n", + ".xr-index-data {\n", " grid-column: 1 / -1;\n", "}\n", "\n", @@ -3367,7 +3695,8 @@ "}\n", "\n", ".xr-icon-database,\n", - ".xr-icon-file-text2 {\n", + ".xr-icon-file-text2,\n", + ".xr-no-icon {\n", " display: inline-block;\n", " vertical-align: middle;\n", " width: 1em;\n", @@ -3376,26 +3705,27 @@ " stroke: currentColor;\n", " fill: currentColor;\n", "}\n", - "
      <xarray.Dataset>\n",
      -       "Dimensions:                       (variants: 102882611, alleles: 4, samples: 656, ploidy: 2)\n",
      +       "
      <xarray.Dataset> Size: 1TB\n",
      +       "Dimensions:                       (variants: 102882611, alleles: 4,\n",
      +       "                                   samples: 656, ploidy: 2)\n",
              "Coordinates:\n",
      -       "    variant_position              (variants) int32 dask.array<chunksize=(524288,), meta=np.ndarray>\n",
      -       "    variant_contig                (variants) uint8 dask.array<chunksize=(524288,), meta=np.ndarray>\n",
      -       "    sample_id                     (samples) <U36 dask.array<chunksize=(36,), meta=np.ndarray>\n",
      +       "    variant_position              (variants) int32 412MB dask.array<chunksize=(524288,), meta=np.ndarray>\n",
      +       "    variant_contig                (variants) uint8 103MB dask.array<chunksize=(524288,), meta=np.ndarray>\n",
      +       "    sample_id                     (samples) <U36 94kB dask.array<chunksize=(36,), meta=np.ndarray>\n",
              "Dimensions without coordinates: variants, alleles, samples, ploidy\n",
              "Data variables:\n",
      -       "    variant_allele                (variants, alleles) |S1 dask.array<chunksize=(524288, 1), meta=np.ndarray>\n",
      -       "    variant_filter_pass_funestus  (variants) bool dask.array<chunksize=(300000,), meta=np.ndarray>\n",
      -       "    call_genotype                 (variants, samples, ploidy) int8 dask.array<chunksize=(300000, 36, 2), meta=np.ndarray>\n",
      -       "    call_GQ                       (variants, samples) int8 dask.array<chunksize=(300000, 36), meta=np.ndarray>\n",
      -       "    call_MQ                       (variants, samples) float32 dask.array<chunksize=(300000, 36), meta=np.ndarray>\n",
      -       "    call_AD                       (variants, samples, alleles) int16 dask.array<chunksize=(300000, 36, 4), meta=np.ndarray>\n",
      -       "    call_genotype_mask            (variants, samples, ploidy) bool dask.array<chunksize=(300000, 36, 2), meta=np.ndarray>\n",
      +       "    variant_allele                (variants, alleles) |S1 412MB dask.array<chunksize=(524288, 1), meta=np.ndarray>\n",
      +       "    variant_filter_pass_funestus  (variants) bool 103MB dask.array<chunksize=(300000,), meta=np.ndarray>\n",
      +       "    call_genotype                 (variants, samples, ploidy) int8 135GB dask.array<chunksize=(300000, 36, 2), meta=np.ndarray>\n",
      +       "    call_GQ                       (variants, samples) int8 67GB dask.array<chunksize=(300000, 36), meta=np.ndarray>\n",
      +       "    call_MQ                       (variants, samples) float32 270GB dask.array<chunksize=(300000, 36), meta=np.ndarray>\n",
      +       "    call_AD                       (variants, samples, alleles) int16 540GB dask.array<chunksize=(300000, 36, 4), meta=np.ndarray>\n",
      +       "    call_genotype_mask            (variants, samples, ploidy) bool 135GB dask.array<chunksize=(300000, 36, 2), meta=np.ndarray>\n",
              "Attributes:\n",
      -       "    contigs:  ('2RL', '3RL', 'X')
      " + "
      • contigs :
        ('2RL', '3RL', 'X')
      • " ], "text/plain": [ - "\n", - "Dimensions: (variants: 102882611, alleles: 4, samples: 656, ploidy: 2)\n", + " Size: 1TB\n", + "Dimensions: (variants: 102882611, alleles: 4,\n", + " samples: 656, ploidy: 2)\n", "Coordinates:\n", - " variant_position (variants) int32 dask.array\n", - " variant_contig (variants) uint8 dask.array\n", - " sample_id (samples) \n", + " variant_position (variants) int32 412MB dask.array\n", + " variant_contig (variants) uint8 103MB dask.array\n", + " sample_id (samples) \n", "Dimensions without coordinates: variants, alleles, samples, ploidy\n", "Data variables:\n", - " variant_allele (variants, alleles) |S1 dask.array\n", - " variant_filter_pass_funestus (variants) bool dask.array\n", - " call_genotype (variants, samples, ploidy) int8 dask.array\n", - " call_GQ (variants, samples) int8 dask.array\n", - " call_MQ (variants, samples) float32 dask.array\n", - " call_AD (variants, samples, alleles) int16 dask.array\n", - " call_genotype_mask (variants, samples, ploidy) bool dask.array\n", + " variant_allele (variants, alleles) |S1 412MB dask.array\n", + " variant_filter_pass_funestus (variants) bool 103MB dask.array\n", + " call_genotype (variants, samples, ploidy) int8 135GB dask.array\n", + " call_GQ (variants, samples) int8 67GB dask.array\n", + " call_MQ (variants, samples) float32 270GB dask.array\n", + " call_AD (variants, samples, alleles) int16 540GB dask.array\n", + " call_genotype_mask (variants, samples, ploidy) bool 135GB dask.array\n", "Attributes:\n", " contigs: ('2RL', '3RL', 'X')" ] }, - "execution_count": 22, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -4418,13 +4729,14 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 17, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "AEH-iHpYQH_7", - "outputId": "04e075b3-5f18-4e6f-882e-898335312d71" + "outputId": "04e075b3-5f18-4e6f-882e-898335312d71", + "tags": [] }, "outputs": [ { @@ -4451,7 +4763,7 @@ " [-1, -1]]], dtype=int8)" ] }, - "execution_count": 23, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -4473,14 +4785,15 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 19, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 207 }, "id": "TBuf01BdbJ6z", - "outputId": "bec96465-4d21-4647-ced0-c687674dad40" + "outputId": "bec96465-4d21-4647-ced0-c687674dad40", + "tags": [] }, "outputs": [ { @@ -4492,7 +4805,7 @@ "" ] }, - "execution_count": 24, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } @@ -4534,16 +4847,24 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 20, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 367 }, "id": "OLQTv13egmJh", - "outputId": "cd354704-36fd-496e-8882-081e4cbe319b" + "outputId": "cd354704-36fd-496e-8882-081e4cbe319b", + "tags": [] }, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " \r" + ] + }, { "data": { "text/html": [ @@ -4578,6 +4899,7 @@ "}\n", "\n", "html[theme=dark],\n", + "body[data-theme=dark],\n", "body.vscode-dark {\n", " --xr-font-color0: rgba(255, 255, 255, 1);\n", " --xr-font-color2: rgba(255, 255, 255, 0.54);\n", @@ -4590,7 +4912,7 @@ "}\n", "\n", ".xr-wrap {\n", - " display: block;\n", + " display: block !important;\n", " min-width: 300px;\n", " max-width: 700px;\n", "}\n", @@ -4807,6 +5129,11 @@ " grid-column: 4;\n", "}\n", "\n", + ".xr-index-preview {\n", + " grid-column: 2 / 5;\n", + " color: var(--xr-font-color2);\n", + "}\n", + "\n", ".xr-var-name,\n", ".xr-var-dims,\n", ".xr-var-dtype,\n", @@ -4828,14 +5155,16 @@ "}\n", "\n", ".xr-var-attrs,\n", - ".xr-var-data {\n", + ".xr-var-data,\n", + ".xr-index-data {\n", " display: none;\n", " background-color: var(--xr-background-color) !important;\n", " padding-bottom: 5px !important;\n", "}\n", "\n", ".xr-var-attrs-in:checked ~ .xr-var-attrs,\n", - ".xr-var-data-in:checked ~ .xr-var-data {\n", + ".xr-var-data-in:checked ~ .xr-var-data,\n", + ".xr-index-data-in:checked ~ .xr-index-data {\n", " display: block;\n", "}\n", "\n", @@ -4845,13 +5174,16 @@ "\n", ".xr-var-name span,\n", ".xr-var-data,\n", + ".xr-index-name div,\n", + ".xr-index-data,\n", ".xr-attrs {\n", " padding-left: 25px !important;\n", "}\n", "\n", ".xr-attrs,\n", ".xr-var-attrs,\n", - ".xr-var-data {\n", + ".xr-var-data,\n", + ".xr-index-data {\n", " grid-column: 1 / -1;\n", "}\n", "\n", @@ -4889,7 +5221,8 @@ "}\n", "\n", ".xr-icon-database,\n", - ".xr-icon-file-text2 {\n", + ".xr-icon-file-text2,\n", + ".xr-no-icon {\n", " display: inline-block;\n", " vertical-align: middle;\n", " width: 1em;\n", @@ -4898,25 +5231,25 @@ " stroke: currentColor;\n", " fill: currentColor;\n", "}\n", - "
        <xarray.Dataset>\n",
        +       "
        <xarray.Dataset> Size: 2GB\n",
                "Dimensions:                   (variants: 342946, samples: 511)\n",
                "Coordinates:\n",
        -       "    variant_end               (variants) int32 dask.array<chunksize=(65536,), meta=np.ndarray>\n",
        -       "    variant_contig            (variants) uint8 dask.array<chunksize=(342946,), meta=np.ndarray>\n",
        -       "    variant_position          (variants) int32 dask.array<chunksize=(65536,), meta=np.ndarray>\n",
        -       "    sample_id                 (samples) object dask.array<chunksize=(8,), meta=np.ndarray>\n",
        +       "    variant_position          (variants) int32 1MB dask.array<chunksize=(65536,), meta=np.ndarray>\n",
        +       "    variant_end               (variants) int32 1MB dask.array<chunksize=(65536,), meta=np.ndarray>\n",
        +       "    variant_contig            (variants) uint8 343kB dask.array<chunksize=(342946,), meta=np.ndarray>\n",
        +       "    sample_id                 (samples) object 4kB dask.array<chunksize=(8,), meta=np.ndarray>\n",
                "Dimensions without coordinates: variants, samples\n",
                "Data variables:\n",
        -       "    call_CN                   (variants, samples) int8 dask.array<chunksize=(65536, 8), meta=np.ndarray>\n",
        -       "    call_RawCov               (variants, samples) int32 dask.array<chunksize=(65536, 8), meta=np.ndarray>\n",
        -       "    call_NormCov              (variants, samples) float32 dask.array<chunksize=(65536, 8), meta=np.ndarray>\n",
        -       "    sample_coverage_variance  (samples) float32 dask.array<chunksize=(8,), meta=np.ndarray>\n",
        -       "    sample_is_high_variance   (samples) bool dask.array<chunksize=(8,), meta=np.ndarray>\n",
        +       "    call_CN                   (variants, samples) int8 175MB dask.array<chunksize=(65536, 8), meta=np.ndarray>\n",
        +       "    call_RawCov               (variants, samples) int32 701MB dask.array<chunksize=(65536, 8), meta=np.ndarray>\n",
        +       "    call_NormCov              (variants, samples) float32 701MB dask.array<chunksize=(65536, 8), meta=np.ndarray>\n",
        +       "    sample_coverage_variance  (samples) float32 2kB dask.array<chunksize=(8,), meta=np.ndarray>\n",
        +       "    sample_is_high_variance   (samples) bool 511B dask.array<chunksize=(8,), meta=np.ndarray>\n",
                "Attributes:\n",
        -       "    contigs:  ('2RL', '3RL', 'X')
        " + "
        • contigs :
          ('2RL', '3RL', 'X')
        • " ], "text/plain": [ - "\n", + " Size: 2GB\n", "Dimensions: (variants: 342946, samples: 511)\n", "Coordinates:\n", - " variant_end (variants) int32 dask.array\n", - " variant_contig (variants) uint8 dask.array\n", - " variant_position (variants) int32 dask.array\n", - " sample_id (samples) object dask.array\n", + " variant_position (variants) int32 1MB dask.array\n", + " variant_end (variants) int32 1MB dask.array\n", + " variant_contig (variants) uint8 343kB dask.array\n", + " sample_id (samples) object 4kB dask.array\n", "Dimensions without coordinates: variants, samples\n", "Data variables:\n", - " call_CN (variants, samples) int8 dask.array\n", - " call_RawCov (variants, samples) int32 dask.array\n", - " call_NormCov (variants, samples) float32 dask.array\n", - " sample_coverage_variance (samples) float32 dask.array\n", - " sample_is_high_variance (samples) bool dask.array\n", + " call_CN (variants, samples) int8 175MB dask.array\n", + " call_RawCov (variants, samples) int32 701MB dask.array\n", + " call_NormCov (variants, samples) float32 701MB dask.array\n", + " sample_coverage_variance (samples) float32 2kB dask.array\n", + " sample_is_high_variance (samples) bool 511B dask.array\n", "Attributes:\n", " contigs: ('2RL', '3RL', 'X')" ] }, - "execution_count": 26, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } @@ -5553,13 +5868,14 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 21, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "sfb4Vk0LgmJh", - "outputId": "df4139fd-2e6a-4606-a6a8-857818ce5abd" + "outputId": "df4139fd-2e6a-4606-a6a8-857818ce5abd", + "tags": [] }, "outputs": [ { @@ -5569,7 +5885,7 @@ " 102883501], dtype=int32)" ] }, - "execution_count": 27, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } @@ -5581,13 +5897,14 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 22, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "lGL4D8qYgmJh", - "outputId": "a6bc6f9c-5669-410e-a4a7-f8daf249a1d1" + "outputId": "a6bc6f9c-5669-410e-a4a7-f8daf249a1d1", + "tags": [] }, "outputs": [ { @@ -5597,7 +5914,7 @@ " 102883511], dtype=int32)" ] }, - "execution_count": 28, + "execution_count": 22, "metadata": {}, "output_type": "execute_result" } @@ -5615,7 +5932,7 @@ "source": [ "Copy number state is given by the `call_CN` array, where rows are windows and columns are individual samples.\n", "\n", - "On the autosomes (2R, 2L, 3R, 3L) normal diploid copy number is 2. Values greater than 2 mean amplification, less then 2 mean deletion.\n", + "On the autosomes (2RL, 3RL) normal diploid copy number is 2. Values greater than 2 mean amplification, less then 2 mean deletion.\n", "\n", "On the X chromosome, normal copy number is 2 in females and 1 in males.\n", "\n", @@ -5626,13 +5943,14 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 23, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "JVvGFxPzgmJi", - "outputId": "26cf53d6-8526-4079-f478-e21e312ccc63" + "outputId": "26cf53d6-8526-4079-f478-e21e312ccc63", + "tags": [] }, "outputs": [ { @@ -5647,7 +5965,7 @@ " [-1, -1, -1, ..., -1, -1, -1]], dtype=int8)" ] }, - "execution_count": 29, + "execution_count": 23, "metadata": {}, "output_type": "execute_result" } @@ -5672,14 +5990,15 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 24, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 367 }, "id": "OyQ3r8jGgmJi", - "outputId": "6e9d64cd-6e43-4fbd-cc2d-7c2c52d963f7" + "outputId": "6e9d64cd-6e43-4fbd-cc2d-7c2c52d963f7", + "tags": [] }, "outputs": [ { @@ -5716,6 +6035,7 @@ "}\n", "\n", "html[theme=dark],\n", + "body[data-theme=dark],\n", "body.vscode-dark {\n", " --xr-font-color0: rgba(255, 255, 255, 1);\n", " --xr-font-color2: rgba(255, 255, 255, 0.54);\n", @@ -5728,7 +6048,7 @@ "}\n", "\n", ".xr-wrap {\n", - " display: block;\n", + " display: block !important;\n", " min-width: 300px;\n", " max-width: 700px;\n", "}\n", @@ -5945,6 +6265,11 @@ " grid-column: 4;\n", "}\n", "\n", + ".xr-index-preview {\n", + " grid-column: 2 / 5;\n", + " color: var(--xr-font-color2);\n", + "}\n", + "\n", ".xr-var-name,\n", ".xr-var-dims,\n", ".xr-var-dtype,\n", @@ -5966,14 +6291,16 @@ "}\n", "\n", ".xr-var-attrs,\n", - ".xr-var-data {\n", + ".xr-var-data,\n", + ".xr-index-data {\n", " display: none;\n", " background-color: var(--xr-background-color) !important;\n", " padding-bottom: 5px !important;\n", "}\n", "\n", ".xr-var-attrs-in:checked ~ .xr-var-attrs,\n", - ".xr-var-data-in:checked ~ .xr-var-data {\n", + ".xr-var-data-in:checked ~ .xr-var-data,\n", + ".xr-index-data-in:checked ~ .xr-index-data {\n", " display: block;\n", "}\n", "\n", @@ -5983,13 +6310,16 @@ "\n", ".xr-var-name span,\n", ".xr-var-data,\n", + ".xr-index-name div,\n", + ".xr-index-data,\n", ".xr-attrs {\n", " padding-left: 25px !important;\n", "}\n", "\n", ".xr-attrs,\n", ".xr-var-attrs,\n", - ".xr-var-data {\n", + ".xr-var-data,\n", + ".xr-index-data {\n", " grid-column: 1 / -1;\n", "}\n", "\n", @@ -6027,7 +6357,8 @@ "}\n", "\n", ".xr-icon-database,\n", - ".xr-icon-file-text2 {\n", + ".xr-icon-file-text2,\n", + ".xr-no-icon {\n", " display: inline-block;\n", " vertical-align: middle;\n", " width: 1em;\n", @@ -6036,25 +6367,25 @@ " stroke: currentColor;\n", " fill: currentColor;\n", "}\n", - "
          <xarray.Dataset>\n",
          +       "
          <xarray.Dataset> Size: 1MB\n",
                  "Dimensions:              (variants: 30614, samples: 8)\n",
                  "Coordinates:\n",
          -       "    variant_position     (variants) int32 dask.array<chunksize=(30614,), meta=np.ndarray>\n",
          -       "    variant_end          (variants) int32 dask.array<chunksize=(30614,), meta=np.ndarray>\n",
          -       "    variant_contig       (variants) uint8 dask.array<chunksize=(30614,), meta=np.ndarray>\n",
          -       "    variant_id           (variants) object dask.array<chunksize=(30614,), meta=np.ndarray>\n",
          -       "    sample_id            (samples) object dask.array<chunksize=(8,), meta=np.ndarray>\n",
          +       "    variant_position     (variants) int32 122kB dask.array<chunksize=(30614,), meta=np.ndarray>\n",
          +       "    variant_end          (variants) int32 122kB dask.array<chunksize=(30614,), meta=np.ndarray>\n",
          +       "    variant_contig       (variants) uint8 31kB dask.array<chunksize=(30614,), meta=np.ndarray>\n",
          +       "    variant_id           (variants) object 245kB dask.array<chunksize=(30614,), meta=np.ndarray>\n",
          +       "    sample_id            (samples) object 64B dask.array<chunksize=(8,), meta=np.ndarray>\n",
                  "Dimensions without coordinates: variants, samples\n",
                  "Data variables:\n",
          -       "    variant_CIPOS        (variants) int32 dask.array<chunksize=(30614,), meta=np.ndarray>\n",
          -       "    variant_CIEND        (variants) int32 dask.array<chunksize=(30614,), meta=np.ndarray>\n",
          -       "    variant_filter_pass  (variants) bool dask.array<chunksize=(30614,), meta=np.ndarray>\n",
          -       "    call_genotype        (variants, samples) int8 dask.array<chunksize=(30614, 8), meta=np.ndarray>\n",
          +       "    variant_CIPOS        (variants) int32 122kB dask.array<chunksize=(30614,), meta=np.ndarray>\n",
          +       "    variant_CIEND        (variants) int32 122kB dask.array<chunksize=(30614,), meta=np.ndarray>\n",
          +       "    variant_filter_pass  (variants) bool 31kB dask.array<chunksize=(30614,), meta=np.ndarray>\n",
          +       "    call_genotype        (variants, samples) int8 245kB dask.array<chunksize=(30614, 8), meta=np.ndarray>\n",
                  "Attributes:\n",
          -       "    contigs:  ('2RL', '3RL', 'X')
          " + "
          • contigs :
            ('2RL', '3RL', 'X')
          • " ], "text/plain": [ - "\n", + " Size: 1MB\n", "Dimensions: (variants: 30614, samples: 8)\n", "Coordinates:\n", - " variant_position (variants) int32 dask.array\n", - " variant_end (variants) int32 dask.array\n", - " variant_contig (variants) uint8 dask.array\n", - " variant_id (variants) object dask.array\n", - " sample_id (samples) object dask.array\n", + " variant_position (variants) int32 122kB dask.array\n", + " variant_end (variants) int32 122kB dask.array\n", + " variant_contig (variants) uint8 31kB dask.array\n", + " variant_id (variants) object 245kB dask.array\n", + " sample_id (samples) object 64B dask.array\n", "Dimensions without coordinates: variants, samples\n", "Data variables:\n", - " variant_CIPOS (variants) int32 dask.array\n", - " variant_CIEND (variants) int32 dask.array\n", - " variant_filter_pass (variants) bool dask.array\n", - " call_genotype (variants, samples) int8 dask.array\n", + " variant_CIPOS (variants) int32 122kB dask.array\n", + " variant_CIEND (variants) int32 122kB dask.array\n", + " variant_filter_pass (variants) bool 31kB dask.array\n", + " call_genotype (variants, samples) int8 245kB dask.array\n", "Attributes:\n", " contigs: ('2RL', '3RL', 'X')" ] }, - "execution_count": 34, + "execution_count": 24, "metadata": {}, "output_type": "execute_result" } @@ -6610,13 +6923,14 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 27, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "6x0P-EyAgmJj", - "outputId": "46b1c201-50bc-43d1-9333-b455df43614d" + "outputId": "46b1c201-50bc-43d1-9333-b455df43614d", + "tags": [] }, "outputs": [ { @@ -6626,7 +6940,7 @@ " 102872101], dtype=int32)" ] }, - "execution_count": 35, + "execution_count": 27, "metadata": {}, "output_type": "execute_result" } @@ -6638,13 +6952,14 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 28, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Hd4K_BVVgmJj", - "outputId": "80238f45-8660-4d3e-9be3-8fef36ba01d0" + "outputId": "80238f45-8660-4d3e-9be3-8fef36ba01d0", + "tags": [] }, "outputs": [ { @@ -6654,7 +6969,7 @@ " 102873600], dtype=int32)" ] }, - "execution_count": 36, + "execution_count": 28, "metadata": {}, "output_type": "execute_result" } @@ -6675,13 +6990,14 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 29, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "VfXRPYPsgmJj", - "outputId": "5f6722f7-0c71-493f-8499-10d646f12f80" + "outputId": "5f6722f7-0c71-493f-8499-10d646f12f80", + "tags": [] }, "outputs": [ { @@ -6696,7 +7012,7 @@ " [0, 0, 0, ..., 0, 0, 0]], dtype=int8)" ] }, - "execution_count": 38, + "execution_count": 29, "metadata": {}, "output_type": "execute_result" } @@ -6717,13 +7033,14 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 30, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "cNz9L5l9gmJk", - "outputId": "70d8d3c3-3891-4110-bed1-3090198c030c" + "outputId": "70d8d3c3-3891-4110-bed1-3090198c030c", + "tags": [] }, "outputs": [ { @@ -6733,7 +7050,7 @@ " dtype=object)" ] }, - "execution_count": 39, + "execution_count": 30, "metadata": {}, "output_type": "execute_result" } @@ -6758,16 +7075,24 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 31, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 283 }, "id": "SaboHiwByToq", - "outputId": "a0fe48cf-dd93-479d-a0c9-1ba5d10ef59b" + "outputId": "a0fe48cf-dd93-479d-a0c9-1ba5d10ef59b", + "tags": [] }, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " \r" + ] + }, { "data": { "text/html": [ @@ -6802,6 +7127,7 @@ "}\n", "\n", "html[theme=dark],\n", + "body[data-theme=dark],\n", "body.vscode-dark {\n", " --xr-font-color0: rgba(255, 255, 255, 1);\n", " --xr-font-color2: rgba(255, 255, 255, 0.54);\n", @@ -6814,7 +7140,7 @@ "}\n", "\n", ".xr-wrap {\n", - " display: block;\n", + " display: block !important;\n", " min-width: 300px;\n", " max-width: 700px;\n", "}\n", @@ -7031,6 +7357,11 @@ " grid-column: 4;\n", "}\n", "\n", + ".xr-index-preview {\n", + " grid-column: 2 / 5;\n", + " color: var(--xr-font-color2);\n", + "}\n", + "\n", ".xr-var-name,\n", ".xr-var-dims,\n", ".xr-var-dtype,\n", @@ -7052,14 +7383,16 @@ "}\n", "\n", ".xr-var-attrs,\n", - ".xr-var-data {\n", + ".xr-var-data,\n", + ".xr-index-data {\n", " display: none;\n", " background-color: var(--xr-background-color) !important;\n", " padding-bottom: 5px !important;\n", "}\n", "\n", ".xr-var-attrs-in:checked ~ .xr-var-attrs,\n", - ".xr-var-data-in:checked ~ .xr-var-data {\n", + ".xr-var-data-in:checked ~ .xr-var-data,\n", + ".xr-index-data-in:checked ~ .xr-index-data {\n", " display: block;\n", "}\n", "\n", @@ -7069,13 +7402,16 @@ "\n", ".xr-var-name span,\n", ".xr-var-data,\n", + ".xr-index-name div,\n", + ".xr-index-data,\n", ".xr-attrs {\n", " padding-left: 25px !important;\n", "}\n", "\n", ".xr-attrs,\n", ".xr-var-attrs,\n", - ".xr-var-data {\n", + ".xr-var-data,\n", + ".xr-index-data {\n", " grid-column: 1 / -1;\n", "}\n", "\n", @@ -7113,7 +7449,8 @@ "}\n", "\n", ".xr-icon-database,\n", - ".xr-icon-file-text2 {\n", + ".xr-icon-file-text2,\n", + ".xr-no-icon {\n", " display: inline-block;\n", " vertical-align: middle;\n", " width: 1em;\n", @@ -7122,22 +7459,22 @@ " stroke: currentColor;\n", " fill: currentColor;\n", "}\n", - "
            <xarray.Dataset>\n",
            +       "
            <xarray.Dataset> Size: 27GB\n",
                    "Dimensions:           (variants: 20633859, alleles: 2, samples: 656, ploidy: 2)\n",
                    "Coordinates:\n",
            -       "    variant_position  (variants) int32 dask.array<chunksize=(262144,), meta=np.ndarray>\n",
            -       "    variant_contig    (variants) uint8 dask.array<chunksize=(20633859,), meta=np.ndarray>\n",
            -       "    sample_id         (samples) object dask.array<chunksize=(36,), meta=np.ndarray>\n",
            +       "    variant_position  (variants) int32 83MB dask.array<chunksize=(262144,), meta=np.ndarray>\n",
            +       "    variant_contig    (variants) uint8 21MB dask.array<chunksize=(20633859,), meta=np.ndarray>\n",
            +       "    sample_id         (samples) object 5kB dask.array<chunksize=(36,), meta=np.ndarray>\n",
                    "Dimensions without coordinates: variants, alleles, samples, ploidy\n",
                    "Data variables:\n",
            -       "    variant_allele    (variants, alleles) |S1 dask.array<chunksize=(262144, 1), meta=np.ndarray>\n",
            -       "    call_genotype     (variants, samples, ploidy) int8 dask.array<chunksize=(262144, 36, 2), meta=np.ndarray>\n",
            +       "    variant_allele    (variants, alleles) |S1 41MB dask.array<chunksize=(262144, 1), meta=np.ndarray>\n",
            +       "    call_genotype     (variants, samples, ploidy) int8 27GB dask.array<chunksize=(262144, 36, 2), meta=np.ndarray>\n",
                    "Attributes:\n",
                    "    contigs:   ('2RL', '3RL', 'X')\n",
            -       "    analysis:  funestus
            " + "
            • contigs :
              ('2RL', '3RL', 'X')
              analysis :
              funestus
            • " ], "text/plain": [ - "\n", + " Size: 27GB\n", "Dimensions: (variants: 20633859, alleles: 2, samples: 656, ploidy: 2)\n", "Coordinates:\n", - " variant_position (variants) int32 dask.array\n", - " variant_contig (variants) uint8 dask.array\n", - " sample_id (samples) object dask.array\n", + " variant_position (variants) int32 83MB dask.array\n", + " variant_contig (variants) uint8 21MB dask.array\n", + " sample_id (samples) object 5kB dask.array\n", "Dimensions without coordinates: variants, alleles, samples, ploidy\n", "Data variables:\n", - " variant_allele (variants, alleles) |S1 dask.array\n", - " call_genotype (variants, samples, ploidy) int8 dask.array\n", + " variant_allele (variants, alleles) |S1 41MB dask.array\n", + " call_genotype (variants, samples, ploidy) int8 27GB dask.array\n", "Attributes:\n", " contigs: ('2RL', '3RL', 'X')\n", " analysis: funestus" ] }, - "execution_count": 41, + "execution_count": 31, "metadata": {}, "output_type": "execute_result" } @@ -7589,14 +7916,15 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 32, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 132 }, "id": "6xtyomWQydHl", - "outputId": "54c07b6c-f36f-4992-9a07-2297602e2e72" + "outputId": "54c07b6c-f36f-4992-9a07-2297602e2e72", + "tags": [] }, "outputs": [ { @@ -7605,7 +7933,7 @@ "\n", " \n", "
              \n", - " \n", + "
              \n", " \n", " \n", " \n", @@ -7627,14 +7955,12 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", "
              (262144,)
              Count 79 Tasks 79 Chunks Dask graph 79 chunks in 1 graph layer
              Type int32 numpy.ndarray Data type int32 numpy.ndarray
              \n", @@ -7683,7 +8009,7 @@ "dask.array" ] }, - "execution_count": 42, + "execution_count": 32, "metadata": {}, "output_type": "execute_result" } @@ -7696,13 +8022,14 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 33, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "T_5d5JWayfmW", - "outputId": "704b7f0f-0635-4ac9-f54e-f77000192968" + "outputId": "704b7f0f-0635-4ac9-f54e-f77000192968", + "tags": [] }, "outputs": [ { @@ -7712,7 +8039,7 @@ " 79136], dtype=int32)" ] }, - "execution_count": 43, + "execution_count": 33, "metadata": {}, "output_type": "execute_result" } @@ -7724,14 +8051,15 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 34, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 197 }, "id": "1c5mKn-Gyhfi", - "outputId": "b7873b6d-4ebc-415c-c81c-9309fbfd3d56" + "outputId": "b7873b6d-4ebc-415c-c81c-9309fbfd3d56", + "tags": [] }, "outputs": [ { @@ -7740,7 +8068,7 @@ "\n", " \n", "
              \n", - " \n", + "
              \n", " \n", " \n", " \n", @@ -7762,14 +8090,12 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", "
              (262144, 1)
              Count 474 Tasks 158 Chunks Dask graph 158 chunks in 5 graph layers
              Type |S1 numpy.ndarray Data type |S1 numpy.ndarray
              \n", @@ -7819,7 +8145,7 @@ "dask.array" ] }, - "execution_count": 44, + "execution_count": 34, "metadata": {}, "output_type": "execute_result" } @@ -7832,13 +8158,14 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 35, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "DebkxYr7ylDW", - "outputId": "f5329191-c2cc-4087-c8e5-baeb10b03f36" + "outputId": "f5329191-c2cc-4087-c8e5-baeb10b03f36", + "tags": [] }, "outputs": [ { @@ -7856,7 +8183,7 @@ " [b'A', b'T']], dtype='|S1')" ] }, - "execution_count": 45, + "execution_count": 35, "metadata": {}, "output_type": "execute_result" } @@ -7877,14 +8204,15 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 36, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 173 }, "id": "_W3IP43Zynsy", - "outputId": "491fa5c8-558c-4f83-e588-8fc3db0071c3" + "outputId": "491fa5c8-558c-4f83-e588-8fc3db0071c3", + "tags": [] }, "outputs": [ { @@ -7893,7 +8221,7 @@ "\n", " \n", "
              \n", - " \n", + "
              \n", " \n", " \n", " \n", @@ -7915,14 +8243,12 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", "
              (262144, 64, 2)
              Count 2212 Tasks 1106 Chunks Dask graph 1106 chunks in 9 graph layers
              Type int8 numpy.ndarray Data type int8 numpy.ndarray
              \n", @@ -8038,7 +8364,7 @@ "dask.array" ] }, - "execution_count": 46, + "execution_count": 36, "metadata": {}, "output_type": "execute_result" } @@ -8051,14 +8377,15 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 37, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 207 }, "id": "qUuzaZ8B3z8T", - "outputId": "b9ace447-d343-4ed0-9166-9c17e97bf86a" + "outputId": "b9ace447-d343-4ed0-9166-9c17e97bf86a", + "tags": [] }, "outputs": [ { @@ -8070,7 +8397,7 @@ "" ] }, - "execution_count": 47, + "execution_count": 37, "metadata": {}, "output_type": "execute_result" } @@ -8083,14 +8410,15 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 38, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 207 }, "id": "AHY9z5Bp31wJ", - "outputId": "4dcec211-eb6d-45c9-ff2a-6e27218aea02" + "outputId": "4dcec211-eb6d-45c9-ff2a-6e27218aea02", + "tags": [] }, "outputs": [ { @@ -8102,7 +8430,7 @@ "" ] }, - "execution_count": 48, + "execution_count": 38, "metadata": {}, "output_type": "execute_result" } @@ -8135,14 +8463,15 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 39, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 386 }, "id": "v7u8OA7t4ZMl", - "outputId": "d0b057f5-6805-4dd1-eeb2-4ce2744fc780" + "outputId": "d0b057f5-6805-4dd1-eeb2-4ce2744fc780", + "tags": [] }, "outputs": [ { @@ -8354,7 +8683,7 @@ "[5 rows x 26 columns]" ] }, - "execution_count": 49, + "execution_count": 39, "metadata": {}, "output_type": "execute_result" } @@ -8367,13 +8696,14 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 40, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "D2tkmZ0b4cQd", - "outputId": "4d758e09-0ef0-4d9f-b6d8-af5246e6b1d3" + "outputId": "4d758e09-0ef0-4d9f-b6d8-af5246e6b1d3", + "tags": [] }, "outputs": [ { @@ -8383,7 +8713,7 @@ " dtype=object)" ] }, - "execution_count": 50, + "execution_count": 40, "metadata": {}, "output_type": "execute_result" } @@ -8396,14 +8726,15 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 41, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 386 }, "id": "to11muCk4hJp", - "outputId": "532d54ed-3020-4c65-dab3-86897a8903b5" + "outputId": "532d54ed-3020-4c65-dab3-86897a8903b5", + "tags": [] }, "outputs": [ { @@ -8615,7 +8946,7 @@ "[5 rows x 26 columns]" ] }, - "execution_count": 51, + "execution_count": 41, "metadata": {}, "output_type": "execute_result" } @@ -8628,13 +8959,14 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 42, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "9yPZeWiM4mc5", - "outputId": "6fb945e7-21ca-4f66-92e9-bd10279713ab" + "outputId": "6fb945e7-21ca-4f66-92e9-bd10279713ab", + "tags": [] }, "outputs": [ { @@ -8645,7 +8977,7 @@ " 34, 35])" ] }, - "execution_count": 53, + "execution_count": 42, "metadata": {}, "output_type": "execute_result" } @@ -8659,14 +8991,15 @@ }, { "cell_type": "code", - "execution_count": 54, + "execution_count": 43, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 283 }, "id": "_0Qql83z5KDF", - "outputId": "6a1b0681-4951-491b-8cb8-2af632b153d4" + "outputId": "6a1b0681-4951-491b-8cb8-2af632b153d4", + "tags": [] }, "outputs": [ { @@ -8703,6 +9036,7 @@ "}\n", "\n", "html[theme=dark],\n", + "body[data-theme=dark],\n", "body.vscode-dark {\n", " --xr-font-color0: rgba(255, 255, 255, 1);\n", " --xr-font-color2: rgba(255, 255, 255, 0.54);\n", @@ -8715,7 +9049,7 @@ "}\n", "\n", ".xr-wrap {\n", - " display: block;\n", + " display: block !important;\n", " min-width: 300px;\n", " max-width: 700px;\n", "}\n", @@ -8932,6 +9266,11 @@ " grid-column: 4;\n", "}\n", "\n", + ".xr-index-preview {\n", + " grid-column: 2 / 5;\n", + " color: var(--xr-font-color2);\n", + "}\n", + "\n", ".xr-var-name,\n", ".xr-var-dims,\n", ".xr-var-dtype,\n", @@ -8953,14 +9292,16 @@ "}\n", "\n", ".xr-var-attrs,\n", - ".xr-var-data {\n", + ".xr-var-data,\n", + ".xr-index-data {\n", " display: none;\n", " background-color: var(--xr-background-color) !important;\n", " padding-bottom: 5px !important;\n", "}\n", "\n", ".xr-var-attrs-in:checked ~ .xr-var-attrs,\n", - ".xr-var-data-in:checked ~ .xr-var-data {\n", + ".xr-var-data-in:checked ~ .xr-var-data,\n", + ".xr-index-data-in:checked ~ .xr-index-data {\n", " display: block;\n", "}\n", "\n", @@ -8970,13 +9311,16 @@ "\n", ".xr-var-name span,\n", ".xr-var-data,\n", + ".xr-index-name div,\n", + ".xr-index-data,\n", ".xr-attrs {\n", " padding-left: 25px !important;\n", "}\n", "\n", ".xr-attrs,\n", ".xr-var-attrs,\n", - ".xr-var-data {\n", + ".xr-var-data,\n", + ".xr-index-data {\n", " grid-column: 1 / -1;\n", "}\n", "\n", @@ -9014,7 +9358,8 @@ "}\n", "\n", ".xr-icon-database,\n", - ".xr-icon-file-text2 {\n", + ".xr-icon-file-text2,\n", + ".xr-no-icon {\n", " display: inline-block;\n", " vertical-align: middle;\n", " width: 1em;\n", @@ -9023,22 +9368,22 @@ " stroke: currentColor;\n", " fill: currentColor;\n", "}\n", - "
              <xarray.Dataset>\n",
              +       "
              <xarray.Dataset> Size: 2GB\n",
                      "Dimensions:           (variants: 20633859, alleles: 2, samples: 36, ploidy: 2)\n",
                      "Coordinates:\n",
              -       "    variant_position  (variants) int32 dask.array<chunksize=(262144,), meta=np.ndarray>\n",
              -       "    variant_contig    (variants) uint8 dask.array<chunksize=(20633859,), meta=np.ndarray>\n",
              -       "    sample_id         (samples) object dask.array<chunksize=(36,), meta=np.ndarray>\n",
              +       "    variant_position  (variants) int32 83MB dask.array<chunksize=(262144,), meta=np.ndarray>\n",
              +       "    variant_contig    (variants) uint8 21MB dask.array<chunksize=(20633859,), meta=np.ndarray>\n",
              +       "    sample_id         (samples) object 288B dask.array<chunksize=(36,), meta=np.ndarray>\n",
                      "Dimensions without coordinates: variants, alleles, samples, ploidy\n",
                      "Data variables:\n",
              -       "    variant_allele    (variants, alleles) |S1 dask.array<chunksize=(262144, 1), meta=np.ndarray>\n",
              -       "    call_genotype     (variants, samples, ploidy) int8 dask.array<chunksize=(262144, 36, 2), meta=np.ndarray>\n",
              +       "    variant_allele    (variants, alleles) |S1 41MB dask.array<chunksize=(262144, 1), meta=np.ndarray>\n",
              +       "    call_genotype     (variants, samples, ploidy) int8 1GB dask.array<chunksize=(262144, 36, 2), meta=np.ndarray>\n",
                      "Attributes:\n",
                      "    contigs:   ('2RL', '3RL', 'X')\n",
              -       "    analysis:  funestus
              " + "
              • contigs :
                ('2RL', '3RL', 'X')
                analysis :
                funestus
              • " ], "text/plain": [ - "\n", + " Size: 2GB\n", "Dimensions: (variants: 20633859, alleles: 2, samples: 36, ploidy: 2)\n", "Coordinates:\n", - " variant_position (variants) int32 dask.array\n", - " variant_contig (variants) uint8 dask.array\n", - " sample_id (samples) object dask.array\n", + " variant_position (variants) int32 83MB dask.array\n", + " variant_contig (variants) uint8 21MB dask.array\n", + " sample_id (samples) object 288B dask.array\n", "Dimensions without coordinates: variants, alleles, samples, ploidy\n", "Data variables:\n", - " variant_allele (variants, alleles) |S1 dask.array\n", - " call_genotype (variants, samples, ploidy) int8 dask.array\n", + " variant_allele (variants, alleles) |S1 41MB dask.array\n", + " call_genotype (variants, samples, ploidy) int8 1GB dask.array\n", "Attributes:\n", " contigs: ('2RL', '3RL', 'X')\n", " analysis: funestus" ] }, - "execution_count": 54, + "execution_count": 43, "metadata": {}, "output_type": "execute_result" } @@ -9447,14 +9782,15 @@ }, { "cell_type": "code", - "execution_count": 55, + "execution_count": 44, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 207 }, "id": "3lyENPmm5S-t", - "outputId": "393e70fe-1a01-4256-8ea5-e2b0fad0ece3" + "outputId": "393e70fe-1a01-4256-8ea5-e2b0fad0ece3", + "tags": [] }, "outputs": [ { @@ -9466,7 +9802,7 @@ "" ] }, - "execution_count": 55, + "execution_count": 44, "metadata": {}, "output_type": "execute_result" } @@ -9556,15 +9892,6 @@ "n_pass_seg" ] }, - { - "cell_type": "markdown", - "metadata": { - "id": "-AJqC2woiBzi" - }, - "source": [ - "For more in-depth worked examples of various analyses, see the [Af1 analysis](https://malariagen.github.io/vector-data/af1/analysis.html) page." - ] - }, { "cell_type": "markdown", "metadata": { @@ -9596,9 +9923,9 @@ "provenance": [] }, "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "global-global-binder-5.0.0", "language": "python", - "name": "python3" + "name": "conda-env-global-global-binder-5.0.0-py" }, "language_info": { "codemirror_mode": { @@ -9610,9 +9937,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.10" + "version": "3.10.14" } }, "nbformat": 4, - "nbformat_minor": 1 + "nbformat_minor": 4 } diff --git a/docs/af1/download.ipynb b/docs/af1/download.ipynb index 9a284d7..2617be9 100644 --- a/docs/af1/download.ipynb +++ b/docs/af1/download.ipynb @@ -22,7 +22,9 @@ "\n", "SNP calls in VCF and Zarr formats are hosted on S3-compatible object storage at the Sanger Institute. This guide provides examples of downloading thes data using `wget`.\n", "\n", - "Sample metadata in CSV format are hosted on Google Cloud Storage (GCS) in the `vo_afun_release` bucket, which is a multi-region bucket located in the United States. All data hosted on GCS are publicly accessible and do not require any authentication to access. This guide provides examples of downloading data from GCS to a local computer using the `wget` and `gsutil` command line tools. For more information about `gsutil`, see the [gsutil tool documentation](https://cloud.google.com/storage/docs/gsutil)." + "Sample metadata in CSV format are hosted on Google Cloud Storage (GCS) in the `vo_afun_release` bucket, which is a multi-region bucket located in the United States. All data hosted on GCS are publicly accessible but do require an authentication step, please see details on the [Vector Observatory Data Access page](https://malariagen.github.io/vector-data/vobs/vobs-data-access.html).\n", + "\n", + "The guide below provides examples of downloading data from GCS to a local computer using the `wget` and `gsutil` command line tools. For more information about `gsutil`, see the [gsutil tool documentation](https://cloud.google.com/storage/docs/gsutil)." ] }, { @@ -33,11 +35,7 @@ "source": [ "## Sample sets\n", "\n", - "Data in these releases are organised into sample sets. Each of these sample sets corresponds to a set of mosquito specimens contributed by a collaborating study. Depending on your objectives, you may want to download data from only specific sample sets, or all sample sets. For convenience there is a tab-delimited manifest file listing all sample sets in the release. Here is a direct download link for the sample set manifest:\n", - "\n", - "* https://storage.googleapis.com/vo_afun_release/v1/manifest.tsv\n", - "\n", - "The sample set manifest can also be downloaded via `gsutil` to a directory on the local file system, e.g.:" + "Data in these releases are organised into sample sets. Each of these sample sets corresponds to a set of mosquito specimens contributed by a collaborating study. Depending on your objectives, you may want to download data from only specific sample sets, or all sample sets. For convenience there is a tab-delimited manifest file listing all sample sets in the release, this can be downloaded via `gsutil` to a directory on the local file system, e.g.:" ] }, { @@ -95,15 +93,15 @@ "name": "stdout", "output_type": "stream", "text": [ - "sample_set\tsample_count\tstudy_id\tstudy_url\r\n", - "1229-VO-GH-DADZIE-VMF00095\t36\t1229-VO-GH-DADZIE\thttps://www.malariagen.net/network/where-we-work/1229-VO-GH-DADZIE\r\n", - "1230-VO-GA-CF-AYALA-VMF00045\t50\t1230-VO-MULTI-AYALA\thttps://www.malariagen.net/network/where-we-work/1230-VO-MULTI-AYALA\r\n", - "1231-VO-MULTI-WONDJI-VMF00043\t320\t1231-VO-MULTI-WONDJI\thttps://www.malariagen.net/network/where-we-work/1231-VO-MULTI-WONDJI\r\n", - "1232-VO-KE-OCHOMO-VMF00044\t81\t1232-VO-KE-OCHOMO\thttps://www.malariagen.net/network/where-we-work/1232-VO-KE-OCHOMO\r\n", - "1235-VO-MZ-PAAIJMANS-VMF00094\t76\t1235-VO-MZ-PAAIJMANS\thttps://www.malariagen.net/network/where-we-work/1235-VO-MZ-PAAIJMANS\r\n", - "1236-VO-TZ-OKUMU-VMF00090\t10\t1236-VO-TZ-OKUMU\thttps://www.malariagen.net/network/where-we-work/1236-VO-TZ-OKUMU\r\n", - "1240-VO-CD-KOEKEMOER-VMF00099\t43\t1240-VO-MULTI-KOEKEMOER\thttps://www.malariagen.net/network/where-we-work/1240-VO-MULTI-KOEKEMOER\r\n", - "1240-VO-MZ-KOEKEMOER-VMF00101\t40\t1240-VO-MULTI-KOEKEMOER\thttps://www.malariagen.net/network/where-we-work/1240-VO-MULTI-KOEKEMOER\r\n" + "sample_set\tsample_count\tstudy_id\tstudy_url\n", + "1229-VO-GH-DADZIE-VMF00095\t36\t1229-VO-GH-DADZIE\thttps://www.malariagen.net/network/where-we-work/1229-VO-GH-DADZIE\n", + "1230-VO-GA-CF-AYALA-VMF00045\t50\t1230-VO-MULTI-AYALA\thttps://www.malariagen.net/network/where-we-work/1230-VO-MULTI-AYALA\n", + "1231-VO-MULTI-WONDJI-VMF00043\t320\t1231-VO-MULTI-WONDJI\thttps://www.malariagen.net/network/where-we-work/1231-VO-MULTI-WONDJI\n", + "1232-VO-KE-OCHOMO-VMF00044\t81\t1232-VO-KE-OCHOMO\thttps://www.malariagen.net/network/where-we-work/1232-VO-KE-OCHOMO\n", + "1235-VO-MZ-PAAIJMANS-VMF00094\t76\t1235-VO-MZ-PAAIJMANS\thttps://www.malariagen.net/network/where-we-work/1235-VO-MZ-PAAIJMANS\n", + "1236-VO-TZ-OKUMU-VMF00090\t10\t1236-VO-TZ-OKUMU\thttps://www.malariagen.net/network/where-we-work/1236-VO-TZ-OKUMU\n", + "1240-VO-CD-KOEKEMOER-VMF00099\t43\t1240-VO-MULTI-KOEKEMOER\thttps://www.malariagen.net/network/where-we-work/1240-VO-MULTI-KOEKEMOER\n", + "1240-VO-MZ-KOEKEMOER-VMF00101\t40\t1240-VO-MULTI-KOEKEMOER\thttps://www.malariagen.net/network/where-we-work/1240-VO-MULTI-KOEKEMOER\n" ] } ], @@ -117,7 +115,7 @@ "id": "5hXT_c0pnvpU" }, "source": [ - "For more information about these sample sets, see the section on sample sets in the [Af1.0 (_Anopheles funestus_ Project Phase 1 Data Release)](intro)." + "For more information about these sample sets, you can explore the [Af1.0 data user guide](https://malariagen.github.io/vector-data/af1/af1.0.html)." ] }, { @@ -132,11 +130,7 @@ "\n", "### Specimen collection metadata\n", "\n", - "Specimen collection metadata can be downloaded from GCS. E.g., here is the download link for the sample metadata for sample set `1229-VO-GH-DADZIE-VMF00095`:\n", - "\n", - "* https://storage.googleapis.com/vo_afun_release/v1.0/metadata/general/1229-VO-GH-DADZIE-VMF00095/samples.meta.csv\n", - "\n", - "Sample metadata for all sample sets can also be downloaded using `gsutil`:" + "Specimen collection metadata can be downloaded from GCS. E.g., sample metadata for all sample sets can be downloaded using `gsutil`. If you only want the sample metadata for a single sample set, these can be accessed by including the sample set name on the link below, e.g. to access the metadata for `1229-VO-GH-DADZIE-VMF00095`, you would use: `gs://vo_afun_release/v1.0/metadata/general/1229-VO-GH-DADZIE-VMF00095/samples.meta.csv`:" ] }, { @@ -215,16 +209,16 @@ "name": "stdout", "output_type": "stream", "text": [ - "sample_id,partner_sample_id,contributor,country,location,year,month,latitude,longitude,sex_call\r\n", - "VBS24195,1229-GH-A-GH01,Samuel Dadzie,Ghana,Dimabi,2017,8,9.420,-1.083,F\r\n", - "VBS24196,1229-GH-A-GH02,Samuel Dadzie,Ghana,Gbullung,2017,7,9.488,-1.009,F\r\n", - "VBS24197,1229-GH-A-GH03,Samuel Dadzie,Ghana,Dimabi,2017,7,9.420,-1.083,F\r\n", - "VBS24198,1229-GH-A-GH04,Samuel Dadzie,Ghana,Dimabi,2017,8,9.420,-1.083,F\r\n", - "VBS24199,1229-GH-A-GH05,Samuel Dadzie,Ghana,Gupanarigu,2017,8,9.497,-0.952,F\r\n", - "VBS24200,1229-GH-A-GH06,Samuel Dadzie,Ghana,Gupanarigu,2017,7,9.497,-0.952,F\r\n", - "VBS24201,1229-GH-A-GH07,Samuel Dadzie,Ghana,Gupanarigu,2017,7,9.497,-0.952,F\r\n", - "VBS24202,1229-GH-A-GH08,Samuel Dadzie,Ghana,Gupanarigu,2017,7,9.497,-0.952,F\r\n", - "VBS24203,1229-GH-A-GH09,Samuel Dadzie,Ghana,Gupanarigu,2017,7,9.497,-0.952,F\r\n" + "sample_id,partner_sample_id,contributor,country,location,year,month,latitude,longitude,sex_call\n", + "VBS24195,1229-GH-A-GH01,Samuel Dadzie,Ghana,Dimabi,2017,8,9.420,-1.083,F\n", + "VBS24196,1229-GH-A-GH02,Samuel Dadzie,Ghana,Gbullung,2017,7,9.488,-1.009,F\n", + "VBS24197,1229-GH-A-GH03,Samuel Dadzie,Ghana,Dimabi,2017,7,9.420,-1.083,F\n", + "VBS24198,1229-GH-A-GH04,Samuel Dadzie,Ghana,Dimabi,2017,8,9.420,-1.083,F\n", + "VBS24199,1229-GH-A-GH05,Samuel Dadzie,Ghana,Gupanarigu,2017,8,9.497,-0.952,F\n", + "VBS24200,1229-GH-A-GH06,Samuel Dadzie,Ghana,Gupanarigu,2017,7,9.497,-0.952,F\n", + "VBS24201,1229-GH-A-GH07,Samuel Dadzie,Ghana,Gupanarigu,2017,7,9.497,-0.952,F\n", + "VBS24202,1229-GH-A-GH08,Samuel Dadzie,Ghana,Gupanarigu,2017,7,9.497,-0.952,F\n", + "VBS24203,1229-GH-A-GH09,Samuel Dadzie,Ghana,Gupanarigu,2017,7,9.497,-0.952,F\n" ] } ], @@ -269,16 +263,16 @@ "name": "stdout", "output_type": "stream", "text": [ - "sample_id,snp_genotypes_vcf\r\n", - "VBS24195,https://1229-vo-gh-dadzie-vmf00095.cog.sanger.ac.uk/VBS24195.vcf.gz\r\n", - "VBS24196,https://1229-vo-gh-dadzie-vmf00095.cog.sanger.ac.uk/VBS24196.vcf.gz\r\n", - "VBS24197,https://1229-vo-gh-dadzie-vmf00095.cog.sanger.ac.uk/VBS24197.vcf.gz\r\n", - "VBS24198,https://1229-vo-gh-dadzie-vmf00095.cog.sanger.ac.uk/VBS24198.vcf.gz\r\n", - "VBS24199,https://1229-vo-gh-dadzie-vmf00095.cog.sanger.ac.uk/VBS24199.vcf.gz\r\n", - "VBS24200,https://1229-vo-gh-dadzie-vmf00095.cog.sanger.ac.uk/VBS24200.vcf.gz\r\n", - "VBS24201,https://1229-vo-gh-dadzie-vmf00095.cog.sanger.ac.uk/VBS24201.vcf.gz\r\n", - "VBS24202,https://1229-vo-gh-dadzie-vmf00095.cog.sanger.ac.uk/VBS24202.vcf.gz\r\n", - "VBS24203,https://1229-vo-gh-dadzie-vmf00095.cog.sanger.ac.uk/VBS24203.vcf.gz\r\n" + "sample_id,snp_genotypes_vcf\n", + "VBS24195,https://1229-vo-gh-dadzie-vmf00095.cog.sanger.ac.uk/VBS24195.vcf.gz\n", + "VBS24196,https://1229-vo-gh-dadzie-vmf00095.cog.sanger.ac.uk/VBS24196.vcf.gz\n", + "VBS24197,https://1229-vo-gh-dadzie-vmf00095.cog.sanger.ac.uk/VBS24197.vcf.gz\n", + "VBS24198,https://1229-vo-gh-dadzie-vmf00095.cog.sanger.ac.uk/VBS24198.vcf.gz\n", + "VBS24199,https://1229-vo-gh-dadzie-vmf00095.cog.sanger.ac.uk/VBS24199.vcf.gz\n", + "VBS24200,https://1229-vo-gh-dadzie-vmf00095.cog.sanger.ac.uk/VBS24200.vcf.gz\n", + "VBS24201,https://1229-vo-gh-dadzie-vmf00095.cog.sanger.ac.uk/VBS24201.vcf.gz\n", + "VBS24202,https://1229-vo-gh-dadzie-vmf00095.cog.sanger.ac.uk/VBS24202.vcf.gz\n", + "VBS24203,https://1229-vo-gh-dadzie-vmf00095.cog.sanger.ac.uk/VBS24203.vcf.gz\n" ] } ], @@ -358,9 +352,9 @@ "\n", "SNP calling is not always reliable, and we have created some site filters to allow excluding low quality SNPs. We have created some sites-only VCF files with site filter information in the `FILTER` column. These VCF files are hosted on GCS. \n", "\n", - "Each filter is available as a set of VCF files, one per chromosome arm. E.g., here is the direct download link for the site filters on chromosome arms 3RL:\n", + "Each filter is available as a set of VCF files, one per chromosome arm. E.g., you can access the site filters on chromosome arms 2RL from:\n", "\n", - "* https://storage.googleapis.com/vo_afun_release/v1.0/site_filters/dt_20200416/vcf/funestus/2RL_sitefilters.vcf.gz\n", + "`gs://vo_afun_release/v1.0/site_filters/dt_20200416/vcf/funestus/2RL_sitefilters.vcf.gz`\n", "\n", "Alternatively, all site filters VCFs can be downloaded using `gsutil`, e.g.:\n", "\n", @@ -430,7 +424,7 @@ "source": [ "## SNP calls (Zarr format)\n", "\n", - "SNP data are also available in Zarr format, which can be convenient and efficient to use for certain types of analysis. These data can be analysed directly in the cloud without downloading to the local system, see the [Ag3 cloud data access guide](cloud) for more information. The data can also be downloaded to your own system for local analysis if that is more convenient. Below are examples of how to download the Zarr data to your local system.\n", + "SNP data are also available in Zarr format, which can be convenient and efficient to use for certain types of analysis. These data can be analysed directly in the cloud without downloading to the local system, see the [Af1 cloud data access guide](https://malariagen.github.io/vector-data/af1/cloud.html) for more information. The data can also be downloaded to your own system for local analysis if that is more convenient. Below are examples of how to download the Zarr data to your local system.\n", "\n", "The data are organised into several Zarr hierarchies. \n", "\n", @@ -541,9 +535,9 @@ "\n", "The HMM inferences of copy number state are available in VCF, Zarr and text formats, and are organised by sample set. \n", "\n", - "For example, the VCF file for sample set `1229-VO-GH-DADZIE-VMF00095` can be downloaded from the following URL:\n", + "For example, the VCF file for sample set `1229-VO-GH-DADZIE-VMF00095` can be downloaded from:\n", "\n", - "* https://storage.googleapis.com/vo_afun_release/v1/cnv/1229-VO-GH-DADZIE-VMF00095/hmm/vcf/VBS24195_cnv_hmm.vcf.gz\n", + "* gs://vo_afun_release/v1/cnv/1229-VO-GH-DADZIE-VMF00095/hmm/vcf/VBS24195_cnv_hmm.vcf.gz\n", "\n", "VCF files for all samples sets can be downloaded via gsutil as follows:" ] @@ -610,7 +604,7 @@ "\n", "For example, the VCF file for sample set `1229-VO-GH-DADZIE-VMF00095` can be downloaded from:\n", "\n", - "* https://storage.googleapis.com/vo_afun_release/v1.0/cnv/1229-VO-GH-DADZIE-VMF00095/coverage_calls/funestus/vcf/1229-VO-GH-DADZIE-VMF00095_funestus_cnv_coverage_calls.vcf.gz\n", + "* gs://vo_afun_release/v1.0/cnv/1229-VO-GH-DADZIE-VMF00095/coverage_calls/funestus/vcf/1229-VO-GH-DADZIE-VMF00095_funestus_cnv_coverage_calls.vcf.gz\n", "\n", "VCF files for all sample sets can be downloaded with:" ] @@ -675,13 +669,13 @@ "\n", "These are the VCFs created by the phasing pipeline, containing all samples included each of the phasing runs. There is one VCF per phasing analysis per chromosome arm. The URL for each file has the following structure:\n", "\n", - "* `https://storage.googleapis.com/vo_afun_release/v1.0/snp_haplotypes/panel/funestus/af1.0_funestus_{contig}_phased.vcf.gz`\n", + "* `gs://vo_afun_release/v1.0/snp_haplotypes/panel/funestus/af1.0_funestus_{contig}_phased.vcf.gz`\n", "\n", "...where `{contig}` is one of \"2RL\", \"3RL\", \"X\". \n", "\n", - "E.g., the panel VCF for the chromosome arm 3RL can be downloaded here:\n", + "E.g., the panel VCF for the chromosome arm 3RL can be downloaded from:\n", "\n", - "* https://storage.googleapis.com/vo_afun_release/v1.0/snp_haplotypes/panel/funestus/af1.0_funestus_3RL_phased.vcf.gz\n", + "* gs://vo_afun_release/v1.0/snp_haplotypes/panel/funestus/af1.0_funestus_3RL_phased.vcf.gz\n", "\n", "Note that these files can be large, up to ~5 GB.\n", "\n", @@ -716,13 +710,13 @@ "\n", "These VCFs are subsets of the panel VCFs, containing only samples in a given sample set. There is one VCF per sample set, per phasing analysis, per chromosome arm. The URL for each file has the following structure:\n", "\n", - "* `https://storage.googleapis.com/vo_afun_release/v1.0/snp_haplotypes/{sample_set}/funestus/vcf/{sample_set}_funestus_{contig}_phased.vcf.gz`\n", + "* `gs://vo_afun_release/v1.0/snp_haplotypes/{sample_set}/funestus/vcf/{sample_set}_funestus_{contig}_phased.vcf.gz`\n", "\n", "...where `{contig}` is one of \"2RL\",\"3RL\", \"X\"; and `{sample_set}` is one of the [Af sample sets](https://malariagen.github.io/vector-data/af1/af1.0.html#sample-sets).\n", "\n", "E.g., the VCF for sample set 1229-VO-GH-DADZIE-VMF00095, for chromosome arm 2RL, can be downloaded here:\n", "\n", - "* https://storage.googleapis.com/vo_afun_release/v1.0/snp_haplotypes/1229-VO-GH-DADZIE-VMF00095/funestus/vcf/1229-VO-GH-DADZIE-VMF00095_funestus_2RL_phased.vcf.gz \n", + "* gs://vo_afun_release/v1.0/snp_haplotypes/1229-VO-GH-DADZIE-VMF00095/funestus/vcf/1229-VO-GH-DADZIE-VMF00095_funestus_2RL_phased.vcf.gz \n", "\n", "If you'd like to download all of the VCF files for a given sample set, you could also use gsutil, e.g.:" ] @@ -755,8 +749,7 @@ "\n", "These contain the haplotype data in Zarr format, with one Zarr hierarchy per sample set. The root zarr path for a given hierarchy has the following structure:\n", "\n", - "* `gs://vo_agam_release/v3/snp_haplotypes/{sample_set}/{analysis}/zarr`\n", - "* `gs://vo_afun_release/v1.0/snp_haplotypes/1229-VO-GH-DADZIE-VMF00095/funestus/zarr`\n", + "* `gs://vo_afun_release/v1.0/snp_haplotypes/{sample_set}/funestus/zarr`\n", "\n", "Data can be downloaded with gsutil. E.g., download the Zarr data for sample 1229-VO-GH-DADZIE-VMF00095. Note that the sites are stored in a separate hierarchy:" ] @@ -821,7 +814,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.10" + "version": "3.10.11" } }, "nbformat": 4, From 1bc7b0d7898bc8558962decf7d38f83cd8b915d7 Mon Sep 17 00:00:00 2001 From: ahernank Date: Wed, 12 Jun 2024 05:22:31 -0500 Subject: [PATCH 4/5] add af1.x pages --- docs/_toc.yml | 4 +- docs/af1/af1.1.ipynb | 292 +++++++++++++++++- docs/af1/af1.2.ipynb | 709 +++++++++++++++++++++++++++++++++++++++++++ docs/af1/af1.3.ipynb | 672 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 1671 insertions(+), 6 deletions(-) create mode 100644 docs/af1/af1.2.ipynb create mode 100644 docs/af1/af1.3.ipynb diff --git a/docs/_toc.yml b/docs/_toc.yml index 6fd621b..09db0e9 100644 --- a/docs/_toc.yml +++ b/docs/_toc.yml @@ -20,6 +20,9 @@ parts: - caption: Anopheles funestus chapters: - file: af1/af1.0 + - file: af1/af1.1 + - file: af1/af1.2 + - file: af1/af1.3 - file: af1/cloud - file: af1/download - file: af1/api @@ -33,7 +36,6 @@ parts: - caption: Partners and community chapters: - file: studies-ag1000g - - file: studies-af1.0-consortium - caption: Release notes chapters: - file: release-notes diff --git a/docs/af1/af1.1.ipynb b/docs/af1/af1.1.ipynb index 068e91a..eed7d59 100644 --- a/docs/af1/af1.1.ipynb +++ b/docs/af1/af1.1.ipynb @@ -10,7 +10,7 @@ "\n", "The **[Af1.1](af1.1): _Anopheles gambiae_ data resource** contains single nucleotide polymorphism (SNP) calls, copy number variant (CNV) calls and SNP haplotypes from whole-genome sequencing of 1138 mosquitoes.\n", "\n", - "More information about this release can be found in the [data resource website](https://www.malariagen.net/data/af31-anopheles-funestus-data-resource). \n", + "More information about this release can be found in the [data resource website](https://www.malariagen.net/data_package/af11-anopheles-funestus-data-resource/). \n", "\n", "This page provides an introduction to open data resources released as part of `Af1.1`. \n", "\n", @@ -29,9 +29,9 @@ "\n", "Although malaria is generally an endemic rather than an epidemic disease, and the focus of this project is on surveillance of disease vectors rather than pathogens, our data terms of use build on MalariaGEN's approach to data sharing, and adopt norms which have been established for rapid sharing of pathogen genomic data during disease outbreaks. The primary rationale for this approach is that malaria remains a public health emergency, where ethically appropriate and rapid sharing of genomic surveillance data can help to detect and respond to biological threats such as new forms of insecticide resistance, and to adapt malaria vector control strategies to different settings and changing circumstances.\n", "\n", - "The publication embargo for all data on this release will expire on the **8th of December 2025**. \n", + "The publication embargo for all data on this release will expire on the **29th of April 2026**. \n", "\n", - "If you have any questions about the terms of use, please email [data@malariagen.net](mailto:data@malariagen.net)" + "If you have any questions about the terms of use, please email [support@malariagen.net](mailto:support@malariagen.net)" ] }, { @@ -130,7 +130,289 @@ "outputs": [ { "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\nconst 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 function drop(id) {\n const view = Bokeh.index.get_by_id(id)\n if (view != null) {\n view.model.document.clear()\n Bokeh.index.delete(view)\n }\n }\n\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\n // Clean up Bokeh references\n if (id != null) {\n drop(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 drop(id)\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 \"
                • re-rerun `output_notebook()` to attempt to load from CDN again, or
                • \\n\"+\n \"
                • use INLINE resources instead, as so:
                • \\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(null);\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.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.3.0.min.js\"];\n const css_urls = [];\n\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {\n }\n ];\n\n function run_inline_js() {\n if (root.Bokeh !== undefined || force === true) {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\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(null)).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/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", + " function drop(id) {\n", + " const view = Bokeh.index.get_by_id(id)\n", + " if (view != null) {\n", + " view.model.document.clear()\n", + " Bokeh.index.delete(view)\n", + " }\n", + " }\n", + "\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", + "\n", + " // Clean up Bokeh references\n", + " if (id != null) {\n", + " drop(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", + " drop(id)\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", + " \"
                • re-rerun `output_notebook()` to attempt to load from CDN again, or
                • \\n\"+\n", + " \"
                • use INLINE resources instead, as so:
                • \\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(null);\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.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.3.0.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.3.0.min.js\"];\n", + " const css_urls = [];\n", + "\n", + " const inline_js = [ function(Bokeh) {\n", + " Bokeh.set_log_level(\"info\");\n", + " },\n", + "function(Bokeh) {\n", + " }\n", + " ];\n", + "\n", + " function run_inline_js() {\n", + " if (root.Bokeh !== undefined || force === true) {\n", + " for (let i = 0; i < inline_js.length; i++) {\n", + " inline_js[i].call(root, root.Bokeh);\n", + " }\n", + "} 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(null)).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": "" }, "metadata": {}, @@ -954,7 +1236,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.10" + "version": "3.10.11" } }, "nbformat": 4, diff --git a/docs/af1/af1.2.ipynb b/docs/af1/af1.2.ipynb new file mode 100644 index 0000000..72bf313 --- /dev/null +++ b/docs/af1/af1.2.ipynb @@ -0,0 +1,709 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "LBNBl2exUYWu" + }, + "source": [ + "# Af1.2\n", + "\n", + "The **[Af1.2](af1.2): _Anopheles gambiae_ data resource** contains single nucleotide polymorphism (SNP) calls and SNP haplotypes from whole-genome sequencing of 317 mosquitoes.\n", + "\n", + "More information about this release can be found in the [data resource website](https://www.malariagen.net/data_package/af12-anopheles-funestus-data-resource/). \n", + "\n", + "This page provides an introduction to open data resources released as part of `Af1.2`. \n", + "\n", + "If you have any questions about this guide or how to use the data, please [start a new discussion](https://github.com/malariagen/vector-public-data/discussions/new) on the malariagen/vector-open-data repo on GitHub. If you find any bugs, please [raise an issue](https://github.com/malariagen/vector-public-data/issues/new/choose)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "kJqs4cXppk8j" + }, + "source": [ + "## Terms of use\n", + "\n", + "Data from this project will be made publicly available before journal publication. Unless otherwise stated, analyses of project data are ongoing and publications are in preparation by project partners, and it is not permitted to use project data for publication (including any type of communication with the general public) without prior permission from the originating partner studies. \n", + "\n", + "Although malaria is generally an endemic rather than an epidemic disease, and the focus of this project is on surveillance of disease vectors rather than pathogens, our data terms of use build on MalariaGEN's approach to data sharing, and adopt norms which have been established for rapid sharing of pathogen genomic data during disease outbreaks. The primary rationale for this approach is that malaria remains a public health emergency, where ethically appropriate and rapid sharing of genomic surveillance data can help to detect and respond to biological threats such as new forms of insecticide resistance, and to adapt malaria vector control strategies to different settings and changing circumstances.\n", + "\n", + "The publication embargo for all data on this release will expire on the **29th of April 2026**. \n", + "\n", + "If you have any questions about the terms of use, please email [support@malariagen.net](mailto:support@malariagen.net)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "iNSicUCtpk8j" + }, + "source": [ + "## Partner studies\n", + "\n", + "- [1236-VO-TZ-OKUMU](https://www.malariagen.net/network/where-we-work/1236-VO-TZ-OKUMU) - _Anopheles funestus_ vector surveillance in Tanzania\n", + "\n", + "- [1281-VO-CM-CHRISTOPHE](https://www.malariagen.net/network/where-we-work/1281-VO-CM-CHRISTOPHE) - PAMCA _Anopheles_ genomics programme - Malaria vector surveillance, population genetics and insecticide resistance characterization in four eco-epidemiological settings in Cameroon\n", + "\n", + "This release also includes data from one study openly available in the literature: [small-2023](https://doi.org/10.1073/pnas.2219835120)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "5RHbe7N6pk8k" + }, + "source": [ + "## Whole-genome sequencing and variant calling\n", + "\n", + "All samples in `Af1.2` have been sequenced individually to high coverage using Illumina technology at the Wellcome Sanger Institute. These sequence data have then been analysed to identify genetic variants such as single nucleotide polymorphisms (SNPs). After variant calling, both the samples and the variants have been through a range of quality control analyses, to ensure the data are of high quality. Both the raw sequence data and the curated variant calls are openly available for download and analysis. \n", + "\n", + "\n", + "For further information about the sequencing and variant calling methods used, please see the [methods page](methods)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "9Hfchko2pk8l" + }, + "source": [ + "## Data hosting\n", + "\n", + "Data from `Af1.2` are hosted by several different services. \n", + "\n", + "The SNP data have also been uploaded to Google Cloud, and can be analysed directly within the cloud without having to download or copy any data, including via free interactive computing services such as [MyBinder](https://gke.mybinder.org/) and [Google Colab](https://colab.research.google.com/). Further information about analysing these data in the cloud is provided in the [cloud data access guide](cloud)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "lTJ_EnvOpk8l" + }, + "source": [ + "## Sample sets\n", + "\n", + "The samples included in `Af1.2` have been organised into 3 sample sets. \n", + "\n", + "Each sample set corresponds to a set of mosquito specimens from a contributing study. Study details can be found in the partner studies webpages listed above." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "hGA4d7Yrpk8m", + "outputId": "c29827c1-0361-4926-c227-8f6e76c2a497", + "tags": [ + "remove-input" + ] + }, + "outputs": [], + "source": [ + "%pip install -qq malariagen_data" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "id": "AnmzLmEgpk8n", + "tags": [ + "remove-input" + ] + }, + "outputs": [ + { + "data": { + "application/javascript": [ + "'use strict';\n", + "(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", + " function drop(id) {\n", + " const view = Bokeh.index.get_by_id(id)\n", + " if (view != null) {\n", + " view.model.document.clear()\n", + " Bokeh.index.delete(view)\n", + " }\n", + " }\n", + "\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", + "\n", + " // Clean up Bokeh references\n", + " if (id != null) {\n", + " drop(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", + " drop(id)\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", + " \"
                • re-rerun `output_notebook()` to attempt to load from CDN again, or
                • \\n\"+\n", + " \"
                • use INLINE resources instead, as so:
                • \\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(error = null) {\n", + " const el = document.getElementById(null);\n", + " if (el != null) {\n", + " const html = (() => {\n", + " if (typeof root.Bokeh === \"undefined\") {\n", + " if (error == null) {\n", + " return \"BokehJS is loading ...\";\n", + " } else {\n", + " return \"BokehJS failed to load.\";\n", + " }\n", + " } else {\n", + " const prefix = `BokehJS ${root.Bokeh.version}`;\n", + " if (error == null) {\n", + " return `${prefix} successfully loaded.`;\n", + " } else {\n", + " return `${prefix} encountered errors while loading and may not function as expected.`;\n", + " }\n", + " }\n", + " })();\n", + " el.innerHTML = html;\n", + "\n", + " if (error != null) {\n", + " const wrapper = document.createElement(\"div\");\n", + " wrapper.style.overflow = \"auto\";\n", + " wrapper.style.height = \"5em\";\n", + " wrapper.style.resize = \"vertical\";\n", + " const content = document.createElement(\"div\");\n", + " content.style.fontFamily = \"monospace\";\n", + " content.style.whiteSpace = \"pre-wrap\";\n", + " content.style.backgroundColor = \"rgb(255, 221, 221)\";\n", + " content.textContent = error.stack ?? error.toString();\n", + " wrapper.append(content);\n", + " el.append(wrapper);\n", + " }\n", + " } else if (Date.now() < root._bokeh_timeout) {\n", + " setTimeout(() => display_loaded(error), 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.4.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.4.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.4.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.4.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.4.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", + " try {\n", + " for (let i = 0; i < inline_js.length; i++) {\n", + " inline_js[i].call(root, root.Bokeh);\n", + " }\n", + "\n", + " } catch (error) {throw error;\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(null)).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": "'use strict';\n(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 \"
                • re-rerun `output_notebook()` to attempt to load from CDN again, or
                • \\n\"+\n \"
                • use INLINE resources instead, as so:
                • \\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(error = null) {\n const el = document.getElementById(null);\n if (el != null) {\n const html = (() => {\n if (typeof root.Bokeh === \"undefined\") {\n if (error == null) {\n return \"BokehJS is loading ...\";\n } else {\n return \"BokehJS failed to load.\";\n }\n } else {\n const prefix = `BokehJS ${root.Bokeh.version}`;\n if (error == null) {\n return `${prefix} successfully loaded.`;\n } else {\n return `${prefix} encountered errors while loading and may not function as expected.`;\n }\n }\n })();\n el.innerHTML = html;\n\n if (error != null) {\n const wrapper = document.createElement(\"div\");\n wrapper.style.overflow = \"auto\";\n wrapper.style.height = \"5em\";\n wrapper.style.resize = \"vertical\";\n const content = document.createElement(\"div\");\n content.style.fontFamily = \"monospace\";\n content.style.whiteSpace = \"pre-wrap\";\n content.style.backgroundColor = \"rgb(255, 221, 221)\";\n content.textContent = error.stack ?? error.toString();\n wrapper.append(content);\n el.append(wrapper);\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(() => display_loaded(error), 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.4.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.4.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.4.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.4.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.4.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 try {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\n\n } catch (error) {throw error;\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(null)).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": [ + "import malariagen_data\n", + "af1 = malariagen_data.Af1()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 927 + }, + "id": "qsElasBepk8n", + "outputId": "4bf80a06-c2e8-4d2d-b4a6-99c8c66da7db", + "tags": [ + "remove-input" + ] + }, + "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", + "
                sample_setsample_count
                study_id
                1236-VO-TZ-OKUMU1236-VO-TZ-OKUMU-VMF0025259
                1281-VO-CM-CHRISTOPHE1281-VO-CM-CHRISTOPHE-VMF0022781
                small-2023small-2023177
                \n", + "
                " + ], + "text/plain": [ + " sample_set sample_count\n", + "study_id \n", + "1236-VO-TZ-OKUMU 1236-VO-TZ-OKUMU-VMF00252 59\n", + "1281-VO-CM-CHRISTOPHE 1281-VO-CM-CHRISTOPHE-VMF00227 81\n", + "small-2023 small-2023 177" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_sample_sets = af1.sample_sets(release=\"1.2\")\n", + "df_sample_sets[['study_id','sample_set', 'sample_count']].set_index('study_id')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "yJ16OQ0Hpk8o" + }, + "source": [ + "Here is a more detailed breakdown of the samples contained within this sample set, summarised by country, year of collection, and species:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "a1OMvuTxUWpJ", + "outputId": "9f872334-fd50-4649-990a-df60ea71c12c", + "tags": [ + "remove-input" + ] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "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", + "
                taxonfunestus
                study_idsample_setcountryyear
                1236-VO-TZ-OKUMU1236-VO-TZ-OKUMU-VMF00252Tanzania202259
                1281-VO-CM-CHRISTOPHE1281-VO-CM-CHRISTOPHE-VMF00227Cameroon202081
                small-2023small-2023Burkina Faso200055
                200112
                2002110
                \n", + "
                " + ], + "text/plain": [ + "taxon funestus\n", + "study_id sample_set country year \n", + "1236-VO-TZ-OKUMU 1236-VO-TZ-OKUMU-VMF00252 Tanzania 2022 59\n", + "1281-VO-CM-CHRISTOPHE 1281-VO-CM-CHRISTOPHE-VMF00227 Cameroon 2020 81\n", + "small-2023 small-2023 Burkina Faso 2000 55\n", + " 2001 12\n", + " 2002 110" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_samples = af1.sample_metadata(sample_sets=\"1.2\")\n", + "df_summary = df_samples.pivot_table(\n", + " index=[\"study_id\",\"sample_set\", \"country\", \"year\"], \n", + " columns=[\"taxon\"],\n", + " values=\"sample_id\", \n", + " aggfunc=len,\n", + " fill_value=0)\n", + "df_summary" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "dLiU0ulIpk8p" + }, + "source": [ + "Note that there can be multiple sampling sites represented within the same sample set." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "OToX5vhfpk8p" + }, + "source": [ + "## Further reading\n", + "\n", + "We hope this page has provided a useful introduction to the `Af1.2` data resource. If you would like to start working with these data, please visit the [cloud data access guide](cloud) or the [data download guide](download) or continue browsing the other documentation on this site.\n", + "\n", + "If you have any questions about the data and how to use them, please do get in touch by [starting a new discussion](https://github.com/malariagen/vector-data/discussions/new) on the malariagen/vector-data repository on GitHub." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "celltoolbar": "Tags", + "colab": { + "name": "Ag3.0-intro.ipynb", + "provenance": [] + }, + "kernelspec": { + "display_name": "global-global-binder-5.0.0", + "language": "python", + "name": "conda-env-global-global-binder-5.0.0-py" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.14" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/docs/af1/af1.3.ipynb b/docs/af1/af1.3.ipynb new file mode 100644 index 0000000..826e048 --- /dev/null +++ b/docs/af1/af1.3.ipynb @@ -0,0 +1,672 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "LBNBl2exUYWu" + }, + "source": [ + "# Af1.3\n", + "\n", + "The **[Af1.3](af1.3): _Anopheles gambiae_ data resource** contains single nucleotide polymorphism (SNP) calls and SNP haplotypes from whole-genome sequencing of 193 mosquitoes.\n", + "\n", + "More information about this release can be found in the [data resource website](https://www.malariagen.net/data_package/af13-anopheles-funestus-data-resource/). \n", + "\n", + "This page provides an introduction to open data resources released as part of `Af1.3`. \n", + "\n", + "If you have any questions about this guide or how to use the data, please [start a new discussion](https://github.com/malariagen/vector-public-data/discussions/new) on the malariagen/vector-open-data repo on GitHub. If you find any bugs, please [raise an issue](https://github.com/malariagen/vector-public-data/issues/new/choose)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "kJqs4cXppk8j" + }, + "source": [ + "## Terms of use\n", + "\n", + "Data from this project will be made publicly available before journal publication. Unless otherwise stated, analyses of project data are ongoing and publications are in preparation by project partners, and it is not permitted to use project data for publication (including any type of communication with the general public) without prior permission from the originating partner studies. \n", + "\n", + "Although malaria is generally an endemic rather than an epidemic disease, and the focus of this project is on surveillance of disease vectors rather than pathogens, our data terms of use build on MalariaGEN's approach to data sharing, and adopt norms which have been established for rapid sharing of pathogen genomic data during disease outbreaks. The primary rationale for this approach is that malaria remains a public health emergency, where ethically appropriate and rapid sharing of genomic surveillance data can help to detect and respond to biological threats such as new forms of insecticide resistance, and to adapt malaria vector control strategies to different settings and changing circumstances.\n", + "\n", + "The publication embargo for all data on this release will expire on the **29th of April 2026**. \n", + "\n", + "If you have any questions about the terms of use, please email [support@malariagen.net](mailto:support@malariagen.net)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "iNSicUCtpk8j" + }, + "source": [ + "## Partner studies\n", + "\n", + "- [1236-VO-TZ-OKUMU](https://www.malariagen.net/network/where-we-work/1236-VO-TZ-OKUMU) - _Anopheles funestus_ vector surveillance in Tanzania" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "5RHbe7N6pk8k" + }, + "source": [ + "## Whole-genome sequencing and variant calling\n", + "\n", + "All samples in `Af1.3` have been sequenced individually to high coverage using Illumina technology at the Wellcome Sanger Institute. These sequence data have then been analysed to identify genetic variants such as single nucleotide polymorphisms (SNPs). After variant calling, both the samples and the variants have been through a range of quality control analyses, to ensure the data are of high quality. Both the raw sequence data and the curated variant calls are openly available for download and analysis. \n", + "\n", + "\n", + "For further information about the sequencing and variant calling methods used, please see the [methods page](methods)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "9Hfchko2pk8l" + }, + "source": [ + "## Data hosting\n", + "\n", + "Data from `Af1.3` are hosted by several different services. \n", + "\n", + "The SNP data have also been uploaded to Google Cloud, and can be analysed directly within the cloud without having to download or copy any data, including via free interactive computing services such as [MyBinder](https://gke.mybinder.org/) and [Google Colab](https://colab.research.google.com/). Further information about analysing these data in the cloud is provided in the [cloud data access guide](cloud)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "lTJ_EnvOpk8l" + }, + "source": [ + "## Sample sets\n", + "\n", + "The samples included in `Af1.3` have been organised into 1 sample set. \n", + "\n", + "Each sample set corresponds to a set of mosquito specimens from a contributing study. Study details can be found in the partner studies webpages listed above." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "hGA4d7Yrpk8m", + "outputId": "c29827c1-0361-4926-c227-8f6e76c2a497", + "tags": [ + "remove-input" + ] + }, + "outputs": [], + "source": [ + "%pip install -qq malariagen_data" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "id": "AnmzLmEgpk8n", + "tags": [ + "remove-input" + ] + }, + "outputs": [ + { + "data": { + "application/javascript": [ + "'use strict';\n", + "(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", + " function drop(id) {\n", + " const view = Bokeh.index.get_by_id(id)\n", + " if (view != null) {\n", + " view.model.document.clear()\n", + " Bokeh.index.delete(view)\n", + " }\n", + " }\n", + "\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", + "\n", + " // Clean up Bokeh references\n", + " if (id != null) {\n", + " drop(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", + " drop(id)\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", + " \"
                • re-rerun `output_notebook()` to attempt to load from CDN again, or
                • \\n\"+\n", + " \"
                • use INLINE resources instead, as so:
                • \\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(error = null) {\n", + " const el = document.getElementById(null);\n", + " if (el != null) {\n", + " const html = (() => {\n", + " if (typeof root.Bokeh === \"undefined\") {\n", + " if (error == null) {\n", + " return \"BokehJS is loading ...\";\n", + " } else {\n", + " return \"BokehJS failed to load.\";\n", + " }\n", + " } else {\n", + " const prefix = `BokehJS ${root.Bokeh.version}`;\n", + " if (error == null) {\n", + " return `${prefix} successfully loaded.`;\n", + " } else {\n", + " return `${prefix} encountered errors while loading and may not function as expected.`;\n", + " }\n", + " }\n", + " })();\n", + " el.innerHTML = html;\n", + "\n", + " if (error != null) {\n", + " const wrapper = document.createElement(\"div\");\n", + " wrapper.style.overflow = \"auto\";\n", + " wrapper.style.height = \"5em\";\n", + " wrapper.style.resize = \"vertical\";\n", + " const content = document.createElement(\"div\");\n", + " content.style.fontFamily = \"monospace\";\n", + " content.style.whiteSpace = \"pre-wrap\";\n", + " content.style.backgroundColor = \"rgb(255, 221, 221)\";\n", + " content.textContent = error.stack ?? error.toString();\n", + " wrapper.append(content);\n", + " el.append(wrapper);\n", + " }\n", + " } else if (Date.now() < root._bokeh_timeout) {\n", + " setTimeout(() => display_loaded(error), 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.4.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.4.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.4.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.4.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.4.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", + " try {\n", + " for (let i = 0; i < inline_js.length; i++) {\n", + " inline_js[i].call(root, root.Bokeh);\n", + " }\n", + "\n", + " } catch (error) {throw error;\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(null)).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": "'use strict';\n(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 \"
                • re-rerun `output_notebook()` to attempt to load from CDN again, or
                • \\n\"+\n \"
                • use INLINE resources instead, as so:
                • \\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(error = null) {\n const el = document.getElementById(null);\n if (el != null) {\n const html = (() => {\n if (typeof root.Bokeh === \"undefined\") {\n if (error == null) {\n return \"BokehJS is loading ...\";\n } else {\n return \"BokehJS failed to load.\";\n }\n } else {\n const prefix = `BokehJS ${root.Bokeh.version}`;\n if (error == null) {\n return `${prefix} successfully loaded.`;\n } else {\n return `${prefix} encountered errors while loading and may not function as expected.`;\n }\n }\n })();\n el.innerHTML = html;\n\n if (error != null) {\n const wrapper = document.createElement(\"div\");\n wrapper.style.overflow = \"auto\";\n wrapper.style.height = \"5em\";\n wrapper.style.resize = \"vertical\";\n const content = document.createElement(\"div\");\n content.style.fontFamily = \"monospace\";\n content.style.whiteSpace = \"pre-wrap\";\n content.style.backgroundColor = \"rgb(255, 221, 221)\";\n content.textContent = error.stack ?? error.toString();\n wrapper.append(content);\n el.append(wrapper);\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(() => display_loaded(error), 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.4.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.4.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.4.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.4.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.4.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 try {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\n\n } catch (error) {throw error;\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(null)).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": [ + "import malariagen_data\n", + "af1 = malariagen_data.Af1()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 927 + }, + "id": "qsElasBepk8n", + "outputId": "4bf80a06-c2e8-4d2d-b4a6-99c8c66da7db", + "tags": [ + "remove-input" + ] + }, + "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", + "
                sample_setsample_count
                study_id
                1236-VO-TZ-OKUMU1236-VO-TZ-OKUMU-VMF00261193
                \n", + "
                " + ], + "text/plain": [ + " sample_set sample_count\n", + "study_id \n", + "1236-VO-TZ-OKUMU 1236-VO-TZ-OKUMU-VMF00261 193" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_sample_sets = af1.sample_sets(release=\"1.3\")\n", + "df_sample_sets[['study_id','sample_set', 'sample_count']].set_index('study_id')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "yJ16OQ0Hpk8o" + }, + "source": [ + "Here is a more detailed breakdown of the samples contained within this sample set, summarised by country, year of collection, and species:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "a1OMvuTxUWpJ", + "outputId": "9f872334-fd50-4649-990a-df60ea71c12c", + "tags": [ + "remove-input" + ] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "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", + "
                taxonfunestus
                study_idsample_setcountryyear
                1236-VO-TZ-OKUMU1236-VO-TZ-OKUMU-VMF00261Tanzania2022138
                202355
                \n", + "
                " + ], + "text/plain": [ + "taxon funestus\n", + "study_id sample_set country year \n", + "1236-VO-TZ-OKUMU 1236-VO-TZ-OKUMU-VMF00261 Tanzania 2022 138\n", + " 2023 55" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_samples = af1.sample_metadata(sample_sets=\"1.3\")\n", + "df_summary = df_samples.pivot_table(\n", + " index=[\"study_id\",\"sample_set\", \"country\", \"year\"], \n", + " columns=[\"taxon\"],\n", + " values=\"sample_id\", \n", + " aggfunc=len,\n", + " fill_value=0)\n", + "df_summary" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "dLiU0ulIpk8p" + }, + "source": [ + "Note that there can be multiple sampling sites represented within the same sample set." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "OToX5vhfpk8p" + }, + "source": [ + "## Further reading\n", + "\n", + "We hope this page has provided a useful introduction to the `Af1.3` data resource. If you would like to start working with these data, please visit the [cloud data access guide](cloud) or the [data download guide](download) or continue browsing the other documentation on this site.\n", + "\n", + "If you have any questions about the data and how to use them, please do get in touch by [starting a new discussion](https://github.com/malariagen/vector-data/discussions/new) on the malariagen/vector-data repository on GitHub." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "celltoolbar": "Tags", + "colab": { + "name": "Ag3.0-intro.ipynb", + "provenance": [] + }, + "kernelspec": { + "display_name": "global-global-binder-5.0.0", + "language": "python", + "name": "conda-env-global-global-binder-5.0.0-py" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.14" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From c983bc76d0e8794a7fe257deae2de4bb085eaa70 Mon Sep 17 00:00:00 2001 From: ahernank Date: Wed, 12 Jun 2024 05:37:07 -0500 Subject: [PATCH 5/5] fix method line --- docs/af1/af1.1.ipynb | 5 +---- docs/af1/af1.2.ipynb | 5 +---- docs/af1/af1.3.ipynb | 5 +---- 3 files changed, 3 insertions(+), 12 deletions(-) diff --git a/docs/af1/af1.1.ipynb b/docs/af1/af1.1.ipynb index eed7d59..74b1107 100644 --- a/docs/af1/af1.1.ipynb +++ b/docs/af1/af1.1.ipynb @@ -68,10 +68,7 @@ "source": [ "## Whole-genome sequencing and variant calling\n", "\n", - "All samples in `Af1.1` have been sequenced individually to high coverage using Illumina technology at the Wellcome Sanger Institute. These sequence data have then been analysed to identify genetic variants such as single nucleotide polymorphisms (SNPs). After variant calling, both the samples and the variants have been through a range of quality control analyses, to ensure the data are of high quality. Both the raw sequence data and the curated variant calls are openly available for download and analysis. \n", - "\n", - "\n", - "For further information about the sequencing and variant calling methods used, please see the [methods page](methods)." + "All samples in `Af1.1` have been sequenced individually to high coverage using Illumina technology at the Wellcome Sanger Institute. These sequence data have then been analysed to identify genetic variants such as single nucleotide polymorphisms (SNPs). After variant calling, both the samples and the variants have been through a range of quality control analyses, to ensure the data are of high quality. Both the raw sequence data and the curated variant calls are openly available for download and analysis. " ] }, { diff --git a/docs/af1/af1.2.ipynb b/docs/af1/af1.2.ipynb index 72bf313..5030756 100644 --- a/docs/af1/af1.2.ipynb +++ b/docs/af1/af1.2.ipynb @@ -57,10 +57,7 @@ "source": [ "## Whole-genome sequencing and variant calling\n", "\n", - "All samples in `Af1.2` have been sequenced individually to high coverage using Illumina technology at the Wellcome Sanger Institute. These sequence data have then been analysed to identify genetic variants such as single nucleotide polymorphisms (SNPs). After variant calling, both the samples and the variants have been through a range of quality control analyses, to ensure the data are of high quality. Both the raw sequence data and the curated variant calls are openly available for download and analysis. \n", - "\n", - "\n", - "For further information about the sequencing and variant calling methods used, please see the [methods page](methods)." + "All samples in `Af1.2` have been sequenced individually to high coverage using Illumina technology at the Wellcome Sanger Institute. These sequence data have then been analysed to identify genetic variants such as single nucleotide polymorphisms (SNPs). After variant calling, both the samples and the variants have been through a range of quality control analyses, to ensure the data are of high quality. Both the raw sequence data and the curated variant calls are openly available for download and analysis. " ] }, { diff --git a/docs/af1/af1.3.ipynb b/docs/af1/af1.3.ipynb index 826e048..185ac62 100644 --- a/docs/af1/af1.3.ipynb +++ b/docs/af1/af1.3.ipynb @@ -53,10 +53,7 @@ "source": [ "## Whole-genome sequencing and variant calling\n", "\n", - "All samples in `Af1.3` have been sequenced individually to high coverage using Illumina technology at the Wellcome Sanger Institute. These sequence data have then been analysed to identify genetic variants such as single nucleotide polymorphisms (SNPs). After variant calling, both the samples and the variants have been through a range of quality control analyses, to ensure the data are of high quality. Both the raw sequence data and the curated variant calls are openly available for download and analysis. \n", - "\n", - "\n", - "For further information about the sequencing and variant calling methods used, please see the [methods page](methods)." + "All samples in `Af1.3` have been sequenced individually to high coverage using Illumina technology at the Wellcome Sanger Institute. These sequence data have then been analysed to identify genetic variants such as single nucleotide polymorphisms (SNPs). After variant calling, both the samples and the variants have been through a range of quality control analyses, to ensure the data are of high quality. Both the raw sequence data and the curated variant calls are openly available for download and analysis. " ] }, {