From 9fb70e07b99c5c884cc676afe4a475ccc83868ac Mon Sep 17 00:00:00 2001 From: mgrover1 Date: Mon, 20 Nov 2023 14:18:56 -0600 Subject: [PATCH 1/3] ADD: Add enso globus notebook --- notebooks/enso-globus.ipynb | 1620 +++++++++++++++++++++++++++++++++++ 1 file changed, 1620 insertions(+) create mode 100644 notebooks/enso-globus.ipynb diff --git a/notebooks/enso-globus.ipynb b/notebooks/enso-globus.ipynb new file mode 100644 index 0000000..10ea8a2 --- /dev/null +++ b/notebooks/enso-globus.ipynb @@ -0,0 +1,1620 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "48c69fff-ab3b-49c8-b85b-95fef1250249", + "metadata": {}, + "source": [ + "\"Globus\n", + "\"ESGF" + ] + }, + { + "cell_type": "markdown", + "id": "483dcdb6-e125-4a52-a21f-55cfe1000dea", + "metadata": {}, + "source": [ + "# ENSO Calculations using Globus Compute" + ] + }, + { + "cell_type": "markdown", + "id": "4a415308-0e9a-470c-bb68-da75b349c006", + "metadata": {}, + "source": [ + "## Overview\n", + "\n", + "In this workflow, we combine topics covered in previous Pythia Foundations and CMIP6 Cookbook content to compute the [Niño 3.4 Index](https://climatedataguide.ucar.edu/climate-data/nino-sst-indices-nino-12-3-34-4-oni-and-tni) to multiple datasets, with the primary computations occuring on a remote machine. As a refresher of what the ENSO 3.4 index is, please see the following text, which is also included in the [ENSO Xarray](https://foundations.projectpythia.org/core/xarray/enso-xarray.html) content in the Pythia Foundations content.\n", + "\n", + "> Niño 3.4 (5N-5S, 170W-120W): The Niño 3.4 anomalies may be thought of as representing the average equatorial SSTs across the Pacific from about the dateline to the South American coast. The Niño 3.4 index typically uses a 5-month running mean, and El Niño or La Niña events are defined when the Niño 3.4 SSTs exceed +/- 0.4C for a period of six months or more.\n", + "\n", + "> Niño X Index computation: a) Compute area averaged total SST from Niño X region; b) Compute monthly climatology (e.g., 1950-1979) for area averaged total SST from Niño X region, and subtract climatology from area averaged total SST time series to obtain anomalies; c) Smooth the anomalies with a 5-month running mean; d) Normalize the smoothed values by its standard deviation over the climatological period.\n", + "\n", + "![](https://www.ncdc.noaa.gov/monitoring-content/teleconnections/nino-regions.gif)\n", + "\n", + "The previous cookbook, we ran this in a single notebook locally. In this example, we aim to execute the workflow on a remote machine, with only the visualizion of the dataset occuring locally.\n", + "\n", + "The overall goal of this tutorial is to introduce the idea of functions as a service with Globus, and how this can be used to calculate ENSO indices." + ] + }, + { + "cell_type": "markdown", + "id": "2d4c6aed-a9c5-4d29-bfa3-c8e8be230567", + "metadata": {}, + "source": [ + "## Prerequisites\n", + "\n", + "| Concepts | Importance | Notes |\n", + "| --- | --- | --- |\n", + "| [Intro to Xarray](https://foundations.projectpythia.org/core/xarray/xarray-intro.html) | Necessary | |\n", + "| [hvPlot Basics](https://hvplot.holoviz.org/getting_started/hvplot.html) | Necessary | Interactive Visualization with hvPlot |\n", + "| [Understanding of NetCDF](https://foundations.projectpythia.org/core/data-formats/netcdf-cf.html) | Helpful | Familiarity with metadata structure |\n", + "| [Calculating ENSO with Xarray](https://foundations.projectpythia.org/core/xarray/enso-xarray.html) | Neccessary | Understanding of Masking and Xarray Functions |\n", + "| Dask | Helpful | |\n", + "\n", + "- **Time to learn**: 30 minutes" + ] + }, + { + "cell_type": "markdown", + "id": "7ff38f37-8f14-443f-b0c7-188baf75d1be", + "metadata": {}, + "source": [ + "## Imports" + ] + }, + { + "cell_type": "code", + "execution_count": 131, + "id": "52bcfa1a-3907-446d-b384-29e97b5c8cb9", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "application/javascript": [ + "(function(root) {\n", + " function now() {\n", + " return new Date();\n", + " }\n", + "\n", + " var force = true;\n", + " var py_version = '3.1.1'.replace('rc', '-rc.');\n", + " var is_dev = py_version.indexOf(\"+\") !== -1 || py_version.indexOf(\"-\") !== -1;\n", + " var reloading = false;\n", + " var Bokeh = root.Bokeh;\n", + " var bokeh_loaded = Bokeh != null && (Bokeh.version === py_version || (Bokeh.versions !== undefined && Bokeh.versions.has(py_version)));\n", + "\n", + " if (typeof (root._bokeh_timeout) === \"undefined\" || force) {\n", + " root._bokeh_timeout = Date.now() + 5000;\n", + " root._bokeh_failed_load = false;\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, js_modules, js_exports, callback) {\n", + " if (css_urls == null) css_urls = [];\n", + " if (js_urls == null) js_urls = [];\n", + " if (js_modules == null) js_modules = [];\n", + " if (js_exports == null) js_exports = {};\n", + "\n", + " root._bokeh_onload_callbacks.push(callback);\n", + "\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.length === 0 && js_modules.length === 0 && Object.keys(js_exports).length === 0) {\n", + " run_callbacks();\n", + " return null;\n", + " }\n", + " if (!reloading) {\n", + " console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n", + " }\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", + " window._bokeh_on_load = on_load\n", + "\n", + " function on_error() {\n", + " console.error(\"failed to load \" + url);\n", + " }\n", + "\n", + " var skip = [];\n", + " if (window.requirejs) {\n", + " window.requirejs.config({'packages': {}, 'paths': {'jspanel': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/jspanel', 'jspanel-modal': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/modal/jspanel.modal', 'jspanel-tooltip': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/tooltip/jspanel.tooltip', 'jspanel-hint': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/hint/jspanel.hint', 'jspanel-layout': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/layout/jspanel.layout', 'jspanel-contextmenu': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/contextmenu/jspanel.contextmenu', 'jspanel-dock': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/dock/jspanel.dock', 'gridstack': 'https://cdn.jsdelivr.net/npm/gridstack@7.2.3/dist/gridstack-all', 'notyf': 'https://cdn.jsdelivr.net/npm/notyf@3/notyf.min'}, 'shim': {'jspanel': {'exports': 'jsPanel'}, 'gridstack': {'exports': 'GridStack'}}});\n", + " require([\"jspanel\"], function(jsPanel) {\n", + "\twindow.jsPanel = jsPanel\n", + "\ton_load()\n", + " })\n", + " require([\"jspanel-modal\"], function() {\n", + "\ton_load()\n", + " })\n", + " require([\"jspanel-tooltip\"], function() {\n", + "\ton_load()\n", + " })\n", + " require([\"jspanel-hint\"], function() {\n", + "\ton_load()\n", + " })\n", + " require([\"jspanel-layout\"], function() {\n", + "\ton_load()\n", + " })\n", + " require([\"jspanel-contextmenu\"], function() {\n", + "\ton_load()\n", + " })\n", + " require([\"jspanel-dock\"], function() {\n", + "\ton_load()\n", + " })\n", + " require([\"gridstack\"], function(GridStack) {\n", + "\twindow.GridStack = GridStack\n", + "\ton_load()\n", + " })\n", + " require([\"notyf\"], function() {\n", + "\ton_load()\n", + " })\n", + " root._bokeh_is_loading = css_urls.length + 9;\n", + " } else {\n", + " root._bokeh_is_loading = css_urls.length + js_urls.length + js_modules.length + Object.keys(js_exports).length;\n", + " }\n", + "\n", + " var existing_stylesheets = []\n", + " var links = document.getElementsByTagName('link')\n", + " for (var i = 0; i < links.length; i++) {\n", + " var link = links[i]\n", + " if (link.href != null) {\n", + "\texisting_stylesheets.push(link.href)\n", + " }\n", + " }\n", + " for (var i = 0; i < css_urls.length; i++) {\n", + " var url = css_urls[i];\n", + " if (existing_stylesheets.indexOf(url) !== -1) {\n", + "\ton_load()\n", + "\tcontinue;\n", + " }\n", + " const element = document.createElement(\"link\");\n", + " element.onload = on_load;\n", + " element.onerror = on_error;\n", + " element.rel = \"stylesheet\";\n", + " element.type = \"text/css\";\n", + " element.href = url;\n", + " console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n", + " document.body.appendChild(element);\n", + " } if (((window['jsPanel'] !== undefined) && (!(window['jsPanel'] instanceof HTMLElement))) || window.requirejs) {\n", + " var urls = ['https://cdn.holoviz.org/panel/1.1.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/jspanel.js', 'https://cdn.holoviz.org/panel/1.1.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/modal/jspanel.modal.js', 'https://cdn.holoviz.org/panel/1.1.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/tooltip/jspanel.tooltip.js', 'https://cdn.holoviz.org/panel/1.1.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/hint/jspanel.hint.js', 'https://cdn.holoviz.org/panel/1.1.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/layout/jspanel.layout.js', 'https://cdn.holoviz.org/panel/1.1.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/contextmenu/jspanel.contextmenu.js', 'https://cdn.holoviz.org/panel/1.1.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/dock/jspanel.dock.js'];\n", + " for (var i = 0; i < urls.length; i++) {\n", + " skip.push(urls[i])\n", + " }\n", + " } if (((window['GridStack'] !== undefined) && (!(window['GridStack'] instanceof HTMLElement))) || window.requirejs) {\n", + " var urls = ['https://cdn.holoviz.org/panel/1.1.0/dist/bundled/gridstack/gridstack@7.2.3/dist/gridstack-all.js'];\n", + " for (var i = 0; i < urls.length; i++) {\n", + " skip.push(urls[i])\n", + " }\n", + " } if (((window['Notyf'] !== undefined) && (!(window['Notyf'] instanceof HTMLElement))) || window.requirejs) {\n", + " var urls = ['https://cdn.holoviz.org/panel/1.1.0/dist/bundled/notificationarea/notyf@3/notyf.min.js'];\n", + " for (var i = 0; i < urls.length; i++) {\n", + " skip.push(urls[i])\n", + " }\n", + " } var existing_scripts = []\n", + " var scripts = document.getElementsByTagName('script')\n", + " for (var i = 0; i < scripts.length; i++) {\n", + " var script = scripts[i]\n", + " if (script.src != null) {\n", + "\texisting_scripts.push(script.src)\n", + " }\n", + " }\n", + " for (var i = 0; i < js_urls.length; i++) {\n", + " var url = js_urls[i];\n", + " if (skip.indexOf(url) !== -1 || existing_scripts.indexOf(url) !== -1) {\n", + "\tif (!window.requirejs) {\n", + "\t on_load();\n", + "\t}\n", + "\tcontinue;\n", + " }\n", + " var element = document.createElement('script');\n", + " element.onload = on_load;\n", + " element.onerror = on_error;\n", + " element.async = false;\n", + " element.src = url;\n", + " console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", + " document.head.appendChild(element);\n", + " }\n", + " for (var i = 0; i < js_modules.length; i++) {\n", + " var url = js_modules[i];\n", + " if (skip.indexOf(url) !== -1 || existing_scripts.indexOf(url) !== -1) {\n", + "\tif (!window.requirejs) {\n", + "\t on_load();\n", + "\t}\n", + "\tcontinue;\n", + " }\n", + " var element = document.createElement('script');\n", + " element.onload = on_load;\n", + " element.onerror = on_error;\n", + " element.async = false;\n", + " element.src = url;\n", + " element.type = \"module\";\n", + " console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", + " document.head.appendChild(element);\n", + " }\n", + " for (const name in js_exports) {\n", + " var url = js_exports[name];\n", + " if (skip.indexOf(url) >= 0 || root[name] != null) {\n", + "\tif (!window.requirejs) {\n", + "\t on_load();\n", + "\t}\n", + "\tcontinue;\n", + " }\n", + " var element = document.createElement('script');\n", + " element.onerror = on_error;\n", + " element.async = false;\n", + " element.type = \"module\";\n", + " console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", + " element.textContent = `\n", + " import ${name} from \"${url}\"\n", + " window.${name} = ${name}\n", + " window._bokeh_on_load()\n", + " `\n", + " document.head.appendChild(element);\n", + " }\n", + " if (!js_urls.length && !js_modules.length) {\n", + " on_load()\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", + " var js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.1.1.min.js\", \"https://cdn.holoviz.org/panel/1.1.0/dist/panel.min.js\"];\n", + " var js_modules = [];\n", + " var js_exports = {};\n", + " var css_urls = [];\n", + " var inline_js = [ function(Bokeh) {\n", + " Bokeh.set_log_level(\"info\");\n", + " },\n", + "function(Bokeh) {} // ensure no trailing comma for IE\n", + " ];\n", + "\n", + " function run_inline_js() {\n", + " if ((root.Bokeh !== undefined) || (force === true)) {\n", + " for (var i = 0; i < inline_js.length; i++) {\n", + " inline_js[i].call(root, root.Bokeh);\n", + " }\n", + " // Cache old bokeh versions\n", + " if (Bokeh != undefined && !reloading) {\n", + "\tvar NewBokeh = root.Bokeh;\n", + "\tif (Bokeh.versions === undefined) {\n", + "\t Bokeh.versions = new Map();\n", + "\t}\n", + "\tif (NewBokeh.version !== Bokeh.version) {\n", + "\t Bokeh.versions.set(NewBokeh.version, NewBokeh)\n", + "\t}\n", + "\troot.Bokeh = Bokeh;\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", + " }\n", + " root._bokeh_is_initializing = false\n", + " }\n", + "\n", + " function load_or_wait() {\n", + " // Implement a backoff loop that tries to ensure we do not load multiple\n", + " // versions of Bokeh and its dependencies at the same time.\n", + " // In recent versions we use the root._bokeh_is_initializing flag\n", + " // to determine whether there is an ongoing attempt to initialize\n", + " // bokeh, however for backward compatibility we also try to ensure\n", + " // that we do not start loading a newer (Panel>=1.0 and Bokeh>3) version\n", + " // before older versions are fully initialized.\n", + " if (root._bokeh_is_initializing && Date.now() > root._bokeh_timeout) {\n", + " root._bokeh_is_initializing = false;\n", + " root._bokeh_onload_callbacks = undefined;\n", + " console.log(\"Bokeh: BokehJS was loaded multiple times but one version failed to initialize.\");\n", + " load_or_wait();\n", + " } else if (root._bokeh_is_initializing || (typeof root._bokeh_is_initializing === \"undefined\" && root._bokeh_onload_callbacks !== undefined)) {\n", + " setTimeout(load_or_wait, 100);\n", + " } else {\n", + " Bokeh = root.Bokeh;\n", + " bokeh_loaded = Bokeh != null && (Bokeh.version === py_version || (Bokeh.versions !== undefined && Bokeh.versions.has(py_version)));\n", + " root._bokeh_is_initializing = true\n", + " root._bokeh_onload_callbacks = []\n", + " if (!reloading && (!bokeh_loaded || is_dev)) {\n", + "\troot.Bokeh = undefined;\n", + " }\n", + " load_libs(css_urls, js_urls, js_modules, js_exports, function() {\n", + "\tconsole.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n", + "\trun_inline_js();\n", + " });\n", + " }\n", + " }\n", + " // Give older versions of the autoload script a head-start to ensure\n", + " // they initialize before we start loading newer version.\n", + " setTimeout(load_or_wait, 100)\n", + "}(window));" + ], + "application/vnd.holoviews_load.v0+json": "(function(root) {\n function now() {\n return new Date();\n }\n\n var force = true;\n var py_version = '3.1.1'.replace('rc', '-rc.');\n var is_dev = py_version.indexOf(\"+\") !== -1 || py_version.indexOf(\"-\") !== -1;\n var reloading = false;\n var Bokeh = root.Bokeh;\n var bokeh_loaded = Bokeh != null && (Bokeh.version === py_version || (Bokeh.versions !== undefined && Bokeh.versions.has(py_version)));\n\n if (typeof (root._bokeh_timeout) === \"undefined\" || force) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\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, js_modules, js_exports, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n if (js_modules == null) js_modules = [];\n if (js_exports == null) js_exports = {};\n\n root._bokeh_onload_callbacks.push(callback);\n\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.length === 0 && js_modules.length === 0 && Object.keys(js_exports).length === 0) {\n run_callbacks();\n return null;\n }\n if (!reloading) {\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n }\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 window._bokeh_on_load = on_load\n\n function on_error() {\n console.error(\"failed to load \" + url);\n }\n\n var skip = [];\n if (window.requirejs) {\n window.requirejs.config({'packages': {}, 'paths': {'jspanel': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/jspanel', 'jspanel-modal': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/modal/jspanel.modal', 'jspanel-tooltip': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/tooltip/jspanel.tooltip', 'jspanel-hint': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/hint/jspanel.hint', 'jspanel-layout': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/layout/jspanel.layout', 'jspanel-contextmenu': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/contextmenu/jspanel.contextmenu', 'jspanel-dock': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/dock/jspanel.dock', 'gridstack': 'https://cdn.jsdelivr.net/npm/gridstack@7.2.3/dist/gridstack-all', 'notyf': 'https://cdn.jsdelivr.net/npm/notyf@3/notyf.min'}, 'shim': {'jspanel': {'exports': 'jsPanel'}, 'gridstack': {'exports': 'GridStack'}}});\n require([\"jspanel\"], function(jsPanel) {\n\twindow.jsPanel = jsPanel\n\ton_load()\n })\n require([\"jspanel-modal\"], function() {\n\ton_load()\n })\n require([\"jspanel-tooltip\"], function() {\n\ton_load()\n })\n require([\"jspanel-hint\"], function() {\n\ton_load()\n })\n require([\"jspanel-layout\"], function() {\n\ton_load()\n })\n require([\"jspanel-contextmenu\"], function() {\n\ton_load()\n })\n require([\"jspanel-dock\"], function() {\n\ton_load()\n })\n require([\"gridstack\"], function(GridStack) {\n\twindow.GridStack = GridStack\n\ton_load()\n })\n require([\"notyf\"], function() {\n\ton_load()\n })\n root._bokeh_is_loading = css_urls.length + 9;\n } else {\n root._bokeh_is_loading = css_urls.length + js_urls.length + js_modules.length + Object.keys(js_exports).length;\n }\n\n var existing_stylesheets = []\n var links = document.getElementsByTagName('link')\n for (var i = 0; i < links.length; i++) {\n var link = links[i]\n if (link.href != null) {\n\texisting_stylesheets.push(link.href)\n }\n }\n for (var i = 0; i < css_urls.length; i++) {\n var url = css_urls[i];\n if (existing_stylesheets.indexOf(url) !== -1) {\n\ton_load()\n\tcontinue;\n }\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error;\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n } if (((window['jsPanel'] !== undefined) && (!(window['jsPanel'] instanceof HTMLElement))) || window.requirejs) {\n var urls = ['https://cdn.holoviz.org/panel/1.1.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/jspanel.js', 'https://cdn.holoviz.org/panel/1.1.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/modal/jspanel.modal.js', 'https://cdn.holoviz.org/panel/1.1.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/tooltip/jspanel.tooltip.js', 'https://cdn.holoviz.org/panel/1.1.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/hint/jspanel.hint.js', 'https://cdn.holoviz.org/panel/1.1.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/layout/jspanel.layout.js', 'https://cdn.holoviz.org/panel/1.1.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/contextmenu/jspanel.contextmenu.js', 'https://cdn.holoviz.org/panel/1.1.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/dock/jspanel.dock.js'];\n for (var i = 0; i < urls.length; i++) {\n skip.push(urls[i])\n }\n } if (((window['GridStack'] !== undefined) && (!(window['GridStack'] instanceof HTMLElement))) || window.requirejs) {\n var urls = ['https://cdn.holoviz.org/panel/1.1.0/dist/bundled/gridstack/gridstack@7.2.3/dist/gridstack-all.js'];\n for (var i = 0; i < urls.length; i++) {\n skip.push(urls[i])\n }\n } if (((window['Notyf'] !== undefined) && (!(window['Notyf'] instanceof HTMLElement))) || window.requirejs) {\n var urls = ['https://cdn.holoviz.org/panel/1.1.0/dist/bundled/notificationarea/notyf@3/notyf.min.js'];\n for (var i = 0; i < urls.length; i++) {\n skip.push(urls[i])\n }\n } var existing_scripts = []\n var scripts = document.getElementsByTagName('script')\n for (var i = 0; i < scripts.length; i++) {\n var script = scripts[i]\n if (script.src != null) {\n\texisting_scripts.push(script.src)\n }\n }\n for (var i = 0; i < js_urls.length; i++) {\n var url = js_urls[i];\n if (skip.indexOf(url) !== -1 || existing_scripts.indexOf(url) !== -1) {\n\tif (!window.requirejs) {\n\t on_load();\n\t}\n\tcontinue;\n }\n var element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error;\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n for (var i = 0; i < js_modules.length; i++) {\n var url = js_modules[i];\n if (skip.indexOf(url) !== -1 || existing_scripts.indexOf(url) !== -1) {\n\tif (!window.requirejs) {\n\t on_load();\n\t}\n\tcontinue;\n }\n var element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error;\n element.async = false;\n element.src = url;\n element.type = \"module\";\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n for (const name in js_exports) {\n var url = js_exports[name];\n if (skip.indexOf(url) >= 0 || root[name] != null) {\n\tif (!window.requirejs) {\n\t on_load();\n\t}\n\tcontinue;\n }\n var element = document.createElement('script');\n element.onerror = on_error;\n element.async = false;\n element.type = \"module\";\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n element.textContent = `\n import ${name} from \"${url}\"\n window.${name} = ${name}\n window._bokeh_on_load()\n `\n document.head.appendChild(element);\n }\n if (!js_urls.length && !js_modules.length) {\n on_load()\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 var js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.1.1.min.js\", \"https://cdn.holoviz.org/panel/1.1.0/dist/panel.min.js\"];\n var js_modules = [];\n var js_exports = {};\n var css_urls = [];\n var inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {} // ensure no trailing comma for IE\n ];\n\n function run_inline_js() {\n if ((root.Bokeh !== undefined) || (force === true)) {\n for (var i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\n // Cache old bokeh versions\n if (Bokeh != undefined && !reloading) {\n\tvar NewBokeh = root.Bokeh;\n\tif (Bokeh.versions === undefined) {\n\t Bokeh.versions = new Map();\n\t}\n\tif (NewBokeh.version !== Bokeh.version) {\n\t Bokeh.versions.set(NewBokeh.version, NewBokeh)\n\t}\n\troot.Bokeh = Bokeh;\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 }\n root._bokeh_is_initializing = false\n }\n\n function load_or_wait() {\n // Implement a backoff loop that tries to ensure we do not load multiple\n // versions of Bokeh and its dependencies at the same time.\n // In recent versions we use the root._bokeh_is_initializing flag\n // to determine whether there is an ongoing attempt to initialize\n // bokeh, however for backward compatibility we also try to ensure\n // that we do not start loading a newer (Panel>=1.0 and Bokeh>3) version\n // before older versions are fully initialized.\n if (root._bokeh_is_initializing && Date.now() > root._bokeh_timeout) {\n root._bokeh_is_initializing = false;\n root._bokeh_onload_callbacks = undefined;\n console.log(\"Bokeh: BokehJS was loaded multiple times but one version failed to initialize.\");\n load_or_wait();\n } else if (root._bokeh_is_initializing || (typeof root._bokeh_is_initializing === \"undefined\" && root._bokeh_onload_callbacks !== undefined)) {\n setTimeout(load_or_wait, 100);\n } else {\n Bokeh = root.Bokeh;\n bokeh_loaded = Bokeh != null && (Bokeh.version === py_version || (Bokeh.versions !== undefined && Bokeh.versions.has(py_version)));\n root._bokeh_is_initializing = true\n root._bokeh_onload_callbacks = []\n if (!reloading && (!bokeh_loaded || is_dev)) {\n\troot.Bokeh = undefined;\n }\n load_libs(css_urls, js_urls, js_modules, js_exports, function() {\n\tconsole.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n\trun_inline_js();\n });\n }\n }\n // Give older versions of the autoload script a head-start to ensure\n // they initialize before we start loading newer version.\n setTimeout(load_or_wait, 100)\n}(window));" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "\n", + "if ((window.PyViz === undefined) || (window.PyViz instanceof HTMLElement)) {\n", + " window.PyViz = {comms: {}, comm_status:{}, kernels:{}, receivers: {}, plot_index: []}\n", + "}\n", + "\n", + "\n", + " function JupyterCommManager() {\n", + " }\n", + "\n", + " JupyterCommManager.prototype.register_target = function(plot_id, comm_id, msg_handler) {\n", + " if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n", + " var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n", + " comm_manager.register_target(comm_id, function(comm) {\n", + " comm.on_msg(msg_handler);\n", + " });\n", + " } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n", + " window.PyViz.kernels[plot_id].registerCommTarget(comm_id, function(comm) {\n", + " comm.onMsg = msg_handler;\n", + " });\n", + " } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n", + " google.colab.kernel.comms.registerTarget(comm_id, (comm) => {\n", + " var messages = comm.messages[Symbol.asyncIterator]();\n", + " function processIteratorResult(result) {\n", + " var message = result.value;\n", + " console.log(message)\n", + " var content = {data: message.data, comm_id};\n", + " var buffers = []\n", + " for (var buffer of message.buffers || []) {\n", + " buffers.push(new DataView(buffer))\n", + " }\n", + " var metadata = message.metadata || {};\n", + " var msg = {content, buffers, metadata}\n", + " msg_handler(msg);\n", + " return messages.next().then(processIteratorResult);\n", + " }\n", + " return messages.next().then(processIteratorResult);\n", + " })\n", + " }\n", + " }\n", + "\n", + " JupyterCommManager.prototype.get_client_comm = function(plot_id, comm_id, msg_handler) {\n", + " if (comm_id in window.PyViz.comms) {\n", + " return window.PyViz.comms[comm_id];\n", + " } else if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n", + " var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n", + " var comm = comm_manager.new_comm(comm_id, {}, {}, {}, comm_id);\n", + " if (msg_handler) {\n", + " comm.on_msg(msg_handler);\n", + " }\n", + " } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n", + " var comm = window.PyViz.kernels[plot_id].connectToComm(comm_id);\n", + " comm.open();\n", + " if (msg_handler) {\n", + " comm.onMsg = msg_handler;\n", + " }\n", + " } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n", + " var comm_promise = google.colab.kernel.comms.open(comm_id)\n", + " comm_promise.then((comm) => {\n", + " window.PyViz.comms[comm_id] = comm;\n", + " if (msg_handler) {\n", + " var messages = comm.messages[Symbol.asyncIterator]();\n", + " function processIteratorResult(result) {\n", + " var message = result.value;\n", + " var content = {data: message.data};\n", + " var metadata = message.metadata || {comm_id};\n", + " var msg = {content, metadata}\n", + " msg_handler(msg);\n", + " return messages.next().then(processIteratorResult);\n", + " }\n", + " return messages.next().then(processIteratorResult);\n", + " }\n", + " }) \n", + " var sendClosure = (data, metadata, buffers, disposeOnDone) => {\n", + " return comm_promise.then((comm) => {\n", + " comm.send(data, metadata, buffers, disposeOnDone);\n", + " });\n", + " };\n", + " var comm = {\n", + " send: sendClosure\n", + " };\n", + " }\n", + " window.PyViz.comms[comm_id] = comm;\n", + " return comm;\n", + " }\n", + " window.PyViz.comm_manager = new JupyterCommManager();\n", + " \n", + "\n", + "\n", + "var JS_MIME_TYPE = 'application/javascript';\n", + "var HTML_MIME_TYPE = 'text/html';\n", + "var EXEC_MIME_TYPE = 'application/vnd.holoviews_exec.v0+json';\n", + "var CLASS_NAME = 'output';\n", + "\n", + "/**\n", + " * Render data to the DOM node\n", + " */\n", + "function render(props, node) {\n", + " var div = document.createElement(\"div\");\n", + " var script = document.createElement(\"script\");\n", + " node.appendChild(div);\n", + " node.appendChild(script);\n", + "}\n", + "\n", + "/**\n", + " * Handle when a new output is added\n", + " */\n", + "function handle_add_output(event, handle) {\n", + " var output_area = handle.output_area;\n", + " var output = handle.output;\n", + " if ((output.data == undefined) || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n", + " return\n", + " }\n", + " var id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n", + " var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n", + " if (id !== undefined) {\n", + " var nchildren = toinsert.length;\n", + " var html_node = toinsert[nchildren-1].children[0];\n", + " html_node.innerHTML = output.data[HTML_MIME_TYPE];\n", + " var scripts = [];\n", + " var nodelist = html_node.querySelectorAll(\"script\");\n", + " for (var i in nodelist) {\n", + " if (nodelist.hasOwnProperty(i)) {\n", + " scripts.push(nodelist[i])\n", + " }\n", + " }\n", + "\n", + " scripts.forEach( function (oldScript) {\n", + " var newScript = document.createElement(\"script\");\n", + " var attrs = [];\n", + " var nodemap = oldScript.attributes;\n", + " for (var j in nodemap) {\n", + " if (nodemap.hasOwnProperty(j)) {\n", + " attrs.push(nodemap[j])\n", + " }\n", + " }\n", + " attrs.forEach(function(attr) { newScript.setAttribute(attr.name, attr.value) });\n", + " newScript.appendChild(document.createTextNode(oldScript.innerHTML));\n", + " oldScript.parentNode.replaceChild(newScript, oldScript);\n", + " });\n", + " if (JS_MIME_TYPE in output.data) {\n", + " toinsert[nchildren-1].children[1].textContent = output.data[JS_MIME_TYPE];\n", + " }\n", + " output_area._hv_plot_id = id;\n", + " if ((window.Bokeh !== undefined) && (id in Bokeh.index)) {\n", + " window.PyViz.plot_index[id] = Bokeh.index[id];\n", + " } else {\n", + " window.PyViz.plot_index[id] = null;\n", + " }\n", + " } else if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n", + " var bk_div = document.createElement(\"div\");\n", + " bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n", + " var script_attrs = bk_div.children[0].attributes;\n", + " for (var i = 0; i < script_attrs.length; i++) {\n", + " toinsert[toinsert.length - 1].childNodes[1].setAttribute(script_attrs[i].name, script_attrs[i].value);\n", + " }\n", + " // store reference to server id on output_area\n", + " output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n", + " }\n", + "}\n", + "\n", + "/**\n", + " * Handle when an output is cleared or removed\n", + " */\n", + "function handle_clear_output(event, handle) {\n", + " var id = handle.cell.output_area._hv_plot_id;\n", + " var server_id = handle.cell.output_area._bokeh_server_id;\n", + " if (((id === undefined) || !(id in PyViz.plot_index)) && (server_id !== undefined)) { return; }\n", + " var comm = window.PyViz.comm_manager.get_client_comm(\"hv-extension-comm\", \"hv-extension-comm\", function () {});\n", + " if (server_id !== null) {\n", + " comm.send({event_type: 'server_delete', 'id': server_id});\n", + " return;\n", + " } else if (comm !== null) {\n", + " comm.send({event_type: 'delete', 'id': id});\n", + " }\n", + " delete PyViz.plot_index[id];\n", + " if ((window.Bokeh !== undefined) & (id in window.Bokeh.index)) {\n", + " var doc = window.Bokeh.index[id].model.document\n", + " doc.clear();\n", + " const i = window.Bokeh.documents.indexOf(doc);\n", + " if (i > -1) {\n", + " window.Bokeh.documents.splice(i, 1);\n", + " }\n", + " }\n", + "}\n", + "\n", + "/**\n", + " * Handle kernel restart event\n", + " */\n", + "function handle_kernel_cleanup(event, handle) {\n", + " delete PyViz.comms[\"hv-extension-comm\"];\n", + " window.PyViz.plot_index = {}\n", + "}\n", + "\n", + "/**\n", + " * Handle update_display_data messages\n", + " */\n", + "function handle_update_output(event, handle) {\n", + " handle_clear_output(event, {cell: {output_area: handle.output_area}})\n", + " handle_add_output(event, handle)\n", + "}\n", + "\n", + "function register_renderer(events, OutputArea) {\n", + " function append_mime(data, metadata, element) {\n", + " // create a DOM node to render to\n", + " var toinsert = this.create_output_subarea(\n", + " metadata,\n", + " CLASS_NAME,\n", + " EXEC_MIME_TYPE\n", + " );\n", + " this.keyboard_manager.register_events(toinsert);\n", + " // Render to node\n", + " var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n", + " render(props, toinsert[0]);\n", + " element.append(toinsert);\n", + " return toinsert\n", + " }\n", + "\n", + " events.on('output_added.OutputArea', handle_add_output);\n", + " events.on('output_updated.OutputArea', handle_update_output);\n", + " events.on('clear_output.CodeCell', handle_clear_output);\n", + " events.on('delete.Cell', handle_clear_output);\n", + " events.on('kernel_ready.Kernel', handle_kernel_cleanup);\n", + "\n", + " OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n", + " safe: true,\n", + " index: 0\n", + " });\n", + "}\n", + "\n", + "if (window.Jupyter !== undefined) {\n", + " try {\n", + " var events = require('base/js/events');\n", + " var OutputArea = require('notebook/js/outputarea').OutputArea;\n", + " if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n", + " register_renderer(events, OutputArea);\n", + " }\n", + " } catch(err) {\n", + " }\n", + "}\n" + ], + "application/vnd.holoviews_load.v0+json": "\nif ((window.PyViz === undefined) || (window.PyViz instanceof HTMLElement)) {\n window.PyViz = {comms: {}, comm_status:{}, kernels:{}, receivers: {}, plot_index: []}\n}\n\n\n function JupyterCommManager() {\n }\n\n JupyterCommManager.prototype.register_target = function(plot_id, comm_id, msg_handler) {\n if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n comm_manager.register_target(comm_id, function(comm) {\n comm.on_msg(msg_handler);\n });\n } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n window.PyViz.kernels[plot_id].registerCommTarget(comm_id, function(comm) {\n comm.onMsg = msg_handler;\n });\n } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n google.colab.kernel.comms.registerTarget(comm_id, (comm) => {\n var messages = comm.messages[Symbol.asyncIterator]();\n function processIteratorResult(result) {\n var message = result.value;\n console.log(message)\n var content = {data: message.data, comm_id};\n var buffers = []\n for (var buffer of message.buffers || []) {\n buffers.push(new DataView(buffer))\n }\n var metadata = message.metadata || {};\n var msg = {content, buffers, metadata}\n msg_handler(msg);\n return messages.next().then(processIteratorResult);\n }\n return messages.next().then(processIteratorResult);\n })\n }\n }\n\n JupyterCommManager.prototype.get_client_comm = function(plot_id, comm_id, msg_handler) {\n if (comm_id in window.PyViz.comms) {\n return window.PyViz.comms[comm_id];\n } else if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n var comm = comm_manager.new_comm(comm_id, {}, {}, {}, comm_id);\n if (msg_handler) {\n comm.on_msg(msg_handler);\n }\n } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n var comm = window.PyViz.kernels[plot_id].connectToComm(comm_id);\n comm.open();\n if (msg_handler) {\n comm.onMsg = msg_handler;\n }\n } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n var comm_promise = google.colab.kernel.comms.open(comm_id)\n comm_promise.then((comm) => {\n window.PyViz.comms[comm_id] = comm;\n if (msg_handler) {\n var messages = comm.messages[Symbol.asyncIterator]();\n function processIteratorResult(result) {\n var message = result.value;\n var content = {data: message.data};\n var metadata = message.metadata || {comm_id};\n var msg = {content, metadata}\n msg_handler(msg);\n return messages.next().then(processIteratorResult);\n }\n return messages.next().then(processIteratorResult);\n }\n }) \n var sendClosure = (data, metadata, buffers, disposeOnDone) => {\n return comm_promise.then((comm) => {\n comm.send(data, metadata, buffers, disposeOnDone);\n });\n };\n var comm = {\n send: sendClosure\n };\n }\n window.PyViz.comms[comm_id] = comm;\n return comm;\n }\n window.PyViz.comm_manager = new JupyterCommManager();\n \n\n\nvar JS_MIME_TYPE = 'application/javascript';\nvar HTML_MIME_TYPE = 'text/html';\nvar EXEC_MIME_TYPE = 'application/vnd.holoviews_exec.v0+json';\nvar CLASS_NAME = 'output';\n\n/**\n * Render data to the DOM node\n */\nfunction render(props, node) {\n var div = document.createElement(\"div\");\n var script = document.createElement(\"script\");\n node.appendChild(div);\n node.appendChild(script);\n}\n\n/**\n * Handle when a new output is added\n */\nfunction handle_add_output(event, handle) {\n var output_area = handle.output_area;\n var output = handle.output;\n if ((output.data == undefined) || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n return\n }\n var id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n if (id !== undefined) {\n var nchildren = toinsert.length;\n var html_node = toinsert[nchildren-1].children[0];\n html_node.innerHTML = output.data[HTML_MIME_TYPE];\n var scripts = [];\n var nodelist = html_node.querySelectorAll(\"script\");\n for (var i in nodelist) {\n if (nodelist.hasOwnProperty(i)) {\n scripts.push(nodelist[i])\n }\n }\n\n scripts.forEach( function (oldScript) {\n var newScript = document.createElement(\"script\");\n var attrs = [];\n var nodemap = oldScript.attributes;\n for (var j in nodemap) {\n if (nodemap.hasOwnProperty(j)) {\n attrs.push(nodemap[j])\n }\n }\n attrs.forEach(function(attr) { newScript.setAttribute(attr.name, attr.value) });\n newScript.appendChild(document.createTextNode(oldScript.innerHTML));\n oldScript.parentNode.replaceChild(newScript, oldScript);\n });\n if (JS_MIME_TYPE in output.data) {\n toinsert[nchildren-1].children[1].textContent = output.data[JS_MIME_TYPE];\n }\n output_area._hv_plot_id = id;\n if ((window.Bokeh !== undefined) && (id in Bokeh.index)) {\n window.PyViz.plot_index[id] = Bokeh.index[id];\n } else {\n window.PyViz.plot_index[id] = null;\n }\n } else if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n var bk_div = document.createElement(\"div\");\n bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n var script_attrs = bk_div.children[0].attributes;\n for (var i = 0; i < script_attrs.length; i++) {\n toinsert[toinsert.length - 1].childNodes[1].setAttribute(script_attrs[i].name, script_attrs[i].value);\n }\n // store reference to server id on output_area\n output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n }\n}\n\n/**\n * Handle when an output is cleared or removed\n */\nfunction handle_clear_output(event, handle) {\n var id = handle.cell.output_area._hv_plot_id;\n var server_id = handle.cell.output_area._bokeh_server_id;\n if (((id === undefined) || !(id in PyViz.plot_index)) && (server_id !== undefined)) { return; }\n var comm = window.PyViz.comm_manager.get_client_comm(\"hv-extension-comm\", \"hv-extension-comm\", function () {});\n if (server_id !== null) {\n comm.send({event_type: 'server_delete', 'id': server_id});\n return;\n } else if (comm !== null) {\n comm.send({event_type: 'delete', 'id': id});\n }\n delete PyViz.plot_index[id];\n if ((window.Bokeh !== undefined) & (id in window.Bokeh.index)) {\n var doc = window.Bokeh.index[id].model.document\n doc.clear();\n const i = window.Bokeh.documents.indexOf(doc);\n if (i > -1) {\n window.Bokeh.documents.splice(i, 1);\n }\n }\n}\n\n/**\n * Handle kernel restart event\n */\nfunction handle_kernel_cleanup(event, handle) {\n delete PyViz.comms[\"hv-extension-comm\"];\n window.PyViz.plot_index = {}\n}\n\n/**\n * Handle update_display_data messages\n */\nfunction handle_update_output(event, handle) {\n handle_clear_output(event, {cell: {output_area: handle.output_area}})\n handle_add_output(event, handle)\n}\n\nfunction register_renderer(events, OutputArea) {\n function append_mime(data, metadata, element) {\n // create a DOM node to render to\n var toinsert = this.create_output_subarea(\n metadata,\n CLASS_NAME,\n EXEC_MIME_TYPE\n );\n this.keyboard_manager.register_events(toinsert);\n // Render to node\n var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n render(props, toinsert[0]);\n element.append(toinsert);\n return toinsert\n }\n\n events.on('output_added.OutputArea', handle_add_output);\n events.on('output_updated.OutputArea', handle_update_output);\n events.on('clear_output.CodeCell', handle_clear_output);\n events.on('delete.Cell', handle_clear_output);\n events.on('kernel_ready.Kernel', handle_kernel_cleanup);\n\n OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n safe: true,\n index: 0\n });\n}\n\nif (window.Jupyter !== undefined) {\n try {\n var events = require('base/js/events');\n var OutputArea = require('notebook/js/outputarea').OutputArea;\n if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n register_renderer(events, OutputArea);\n }\n } catch(err) {\n }\n}\n" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + "\n", + "\n", + "\n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import hvplot.xarray\n", + "import holoviews as hv\n", + "import numpy as np\n", + "import hvplot.xarray\n", + "import matplotlib.pyplot as plt\n", + "import cartopy.crs as ccrs\n", + "from intake_esgf import ESGFCatalog\n", + "import xarray as xr\n", + "import cf_xarray\n", + "import warnings\n", + "import os\n", + "from globus_compute_sdk import Executor, Client\n", + "warnings.filterwarnings(\"ignore\")\n", + "\n", + "hv.extension(\"bokeh\")" + ] + }, + { + "cell_type": "markdown", + "id": "252748e9-c3a4-4018-8b9b-c26c40465faf", + "metadata": {}, + "source": [ + "## Accessing our Data and Computing the ENSO 3.4 Index\n", + "As mentioned in the introduction, we are utilizing functions from the previous ENSO notebooks. In order to run these with Globus Compute, we need to comply with the following requirements\n", + "- All libraries/packages used in the function need to be installed on the globus compute endpoint\n", + "- All functions/libraries/packages need to be imported and defined within the function to execute\n", + "- The output from the function needs to serializable (ex. xarray.Dataset, numpy.array)\n", + "\n", + "Using these constraints, we setup the following function, with the key parameter being which modeling center (model) to compare. Two examples here include The National Center for Atmospheric Research (NCAR) and the Model for Interdisciplinary Research on Climate (MIROC)." + ] + }, + { + "cell_type": "code", + "execution_count": 121, + "id": "2b74d939-f87d-4a44-9e4a-6643b7d04fe7", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def run_plot_enso(model, return_path=False):\n", + " import numpy as np\n", + " import matplotlib.pyplot as plt\n", + " from intake_esgf import ESGFCatalog\n", + " import xarray as xr\n", + " import cf_xarray\n", + " import warnings\n", + " warnings.filterwarnings(\"ignore\")\n", + "\n", + " def search_esgf(institution_id, grid='gn'):\n", + "\n", + " # Search and load the ocean surface temperature (tos)\n", + " cat = ESGFCatalog()\n", + " cat.search(\n", + " activity_id=\"CMIP\",\n", + " experiment_id=\"historical\",\n", + " institution_id=institution_id,\n", + " variable_id=[\"tos\"],\n", + " member_id='r11i1p1f1',\n", + " table_id=\"Omon\",\n", + " )\n", + " try:\n", + " tos_ds = cat.to_datatree()[grid].to_dataset()\n", + " except ValueError:\n", + " tos_ds = cat.to_dataset_dict()[\"\"]\n", + "\n", + " # Search and load the ocean grid cell area\n", + " cat = ESGFCatalog()\n", + " cat.search(\n", + " activity_id=\"CMIP\",\n", + " experiment_id=\"historical\",\n", + " institution_id=institution_id,\n", + " variable_id=[\"areacello\"],\n", + " member_id='r11i1p1f1',\n", + " )\n", + " try:\n", + " area_ds = cat.to_datatree()[grid].to_dataset()\n", + " except ValueError:\n", + " area_ds = cat.to_dataset_dict()[\"\"]\n", + " return xr.merge([tos_ds, area_ds])\n", + "\n", + " def calculate_enso(ds):\n", + "\n", + " # Subset the El Nino 3.4 index region\n", + " dso = ds.where(\n", + " (ds.cf[\"latitude\"] < 5) & (ds.cf[\"latitude\"] > -5) & (ds.cf[\"longitude\"] > 190) & (ds.cf[\"longitude\"] < 240), drop=True\n", + " )\n", + "\n", + " # Calculate the monthly means\n", + " gb = dso.tos.groupby('time.month')\n", + "\n", + " # Subtract the monthly averages, returning the anomalies\n", + " tos_nino34_anom = gb - gb.mean(dim='time')\n", + "\n", + " # Determine the non-time dimensions and average using these\n", + " non_time_dims = set(tos_nino34_anom.dims)\n", + " non_time_dims.remove(ds.tos.cf[\"T\"].name)\n", + " weighted_average = tos_nino34_anom.weighted(ds[\"areacello\"]).mean(dim=list(non_time_dims))\n", + "\n", + " # Calculate the rolling average\n", + " rolling_average = weighted_average.rolling(time=5, center=True).mean()\n", + " std_dev = weighted_average.std()\n", + " return rolling_average / std_dev\n", + "\n", + " def add_enso_thresholds(da, threshold=0.4):\n", + "\n", + " # Conver the xr.DataArray into an xr.Dataset\n", + " ds = da.to_dataset()\n", + "\n", + " # Cleanup the time and use the thresholds\n", + " try:\n", + " ds[\"time\"]= ds.indexes[\"time\"].to_datetimeindex()\n", + " except:\n", + " pass\n", + " ds[\"tos_gt_04\"] = (\"time\", ds.tos.where(ds.tos >= threshold, threshold).data)\n", + " ds[\"tos_lt_04\"] = (\"time\", ds.tos.where(ds.tos <= -threshold, -threshold).data)\n", + "\n", + " # Add fields for the thresholds\n", + " ds[\"el_nino_threshold\"] = (\"time\", np.zeros_like(ds.tos) + threshold)\n", + " ds[\"la_nina_threshold\"] = (\"time\", np.zeros_like(ds.tos) - threshold)\n", + "\n", + " return ds\n", + " \n", + " ds = search_esgf(\"NCAR\")\n", + " enso_index = add_enso_thresholds(calculate_enso(ds).compute())\n", + " enso_index.attrs = ds.attrs\n", + " enso_index.attrs[\"model\"] = model\n", + "\n", + " return enso_index" + ] + }, + { + "cell_type": "markdown", + "id": "e5ad93de-5473-4579-8ee4-cadd0fbb90b2", + "metadata": {}, + "source": [ + "## Configure Globus Compute\n", + "\n", + "Now that we have our functions, we can move toward using [Globus Flows](https://www.globus.org/globus-flows-service) and [Globus Compute](https://www.globus.org/compute).\n", + "\n", + "Globus Flows is a reliable and secure platform for orchestrating and performing research data management and analysis tasks. A flow is often needed to manage data coming from instruments, e.g., image files can be moved from local storage attached to a microscope to a high-performance storage system where they may be accessed by all members of the research project.\n", + "\n", + "More examples of creating and running flows can be found on our [demo instance](https://jupyter.demo.globus.org/hub/)." + ] + }, + { + "cell_type": "markdown", + "id": "663dfed0-e099-43db-98ad-9eb5021ac69e", + "metadata": {}, + "source": [ + "### Setup a Globus Compute Endpoint\n", + "Globus Compute (GC) is a service that allows **python functions** to be sent to remote points, executed, with the output from that function returned to the user. While there are a collection of endpoints already installed, we highlight in this section the steps required to configure for yourself. This idea is also known as \"serverless\" computing, where users do not need to think about the underlying infrastructure executing the code, but rather submit functions to be run and returned.\n", + "\n", + "To start a GC endpoint at your system you need to login, [configure a conda environment](https://foundations.projectpythia.org/foundations/how-to-run-python.html#installing-and-managing-python-with-conda), and `pip install globus-compute-endpoint`.\n", + "\n", + "You can then run:\n", + "\n", + "```globus-compute-endpoint configure esgf-test```\n", + "\n", + "```globus-compute-endpoint start esgf-test```\n", + "\n", + "Note that by default your endpoint will execute tasks on the login node (if you are using a High Performance Compute System). Additional configuration is needed for the endpoint to provision compute nodes. For example, here is the documentation on configuring globus compute endpoints on the Argonne Leadership Computing Facility's Polaris system\n", + "- https://globus-compute.readthedocs.io/en/latest/endpoints.html#polaris-alcf" + ] + }, + { + "cell_type": "code", + "execution_count": 133, + "id": "fe8d9e8b-e38d-41a5-b5f6-df9916d69f83", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "endpoint_id = \"b3d1d669-d49b-412e-af81-95f3368e525c\"" + ] + }, + { + "cell_type": "markdown", + "id": "ef408588-1e81-4726-892b-a9b0ad2f38cc", + "metadata": {}, + "source": [ + "### Setup an Executor to Run our Functions\n", + "Once we have our compute endpoint ID, we need to pass this to our executor, which will be used to pass our functions from our local machine to the machine we would like to compute on." + ] + }, + { + "cell_type": "code", + "execution_count": 135, + "id": "0aa43e9e-6840-4b46-9a0c-ceeef8ca7e1e", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "Executor" + ] + }, + "execution_count": 135, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "gce = Executor(endpoint_id=endpoint_id)\n", + "gce" + ] + }, + { + "cell_type": "markdown", + "id": "4afe4cec-fca9-40ed-b20a-39061ad1d45a", + "metadata": {}, + "source": [ + "### Test our Functions\n", + "Now that we have our functions prepared, and an executor to run on, we can test them out using our endpoint!\n", + "\n", + "We pass in our function name, and the additional arguments for our functions. For example, let's look at comparing at the NCAR and MIROC modeling center's CMIP6 simulations." + ] + }, + { + "cell_type": "code", + "execution_count": 136, + "id": "664c9fd2-8822-4e34-9c2b-8558c489e487", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "ncar_task = gce.submit(run_plot_enso, model='NCAR')\n", + "miroc_task = gce.submit(run_plot_enso, model='MIROC')" + ] + }, + { + "cell_type": "markdown", + "id": "ccffe7fe-f11c-4b43-9b1a-b140eb1aa8a5", + "metadata": {}, + "source": [ + "The results are started as python objects, with the resultant datasets available using `.result()`" + ] + }, + { + "cell_type": "code", + "execution_count": 137, + "id": "6c2f0f35-9847-43bb-8e4c-b42ba5060233", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.Dataset>\n",
+       "Dimensions:            (time: 1980)\n",
+       "Coordinates:\n",
+       "  * time               (time) datetime64[ns] 1850-01-15T13:00:00.000008 ... 2...\n",
+       "    month              (time) int64 1 2 3 4 5 6 7 8 9 ... 4 5 6 7 8 9 10 11 12\n",
+       "Data variables:\n",
+       "    tos                (time) float32 nan nan 0.06341 ... 0.7921 nan nan\n",
+       "    tos_gt_04          (time) float32 0.4 0.4 0.4 0.4 ... 0.6829 0.7921 0.4 0.4\n",
+       "    tos_lt_04          (time) float32 -0.4 -0.4 -0.4 -0.4 ... -0.4 -0.4 -0.4\n",
+       "    el_nino_threshold  (time) float32 0.4 0.4 0.4 0.4 0.4 ... 0.4 0.4 0.4 0.4\n",
+       "    la_nina_threshold  (time) float32 -0.4 -0.4 -0.4 -0.4 ... -0.4 -0.4 -0.4\n",
+       "Attributes: (12/46)\n",
+       "    Conventions:            CF-1.7 CMIP-6.2\n",
+       "    activity_id:            CMIP\n",
+       "    branch_method:          standard\n",
+       "    branch_time_in_child:   674885.0\n",
+       "    branch_time_in_parent:  219000.0\n",
+       "    case_id:                972\n",
+       "    ...                     ...\n",
+       "    table_id:               Omon\n",
+       "    tracking_id:            hdl:21.14100/b0ffb89d-095d-4533-a159-a2e1241ff138\n",
+       "    variable_id:            tos\n",
+       "    variant_info:           CMIP6 20th century experiments (1850-2014) with C...\n",
+       "    variant_label:          r11i1p1f1\n",
+       "    model:                  NCAR
" + ], + "text/plain": [ + "\n", + "Dimensions: (time: 1980)\n", + "Coordinates:\n", + " * time (time) datetime64[ns] 1850-01-15T13:00:00.000008 ... 2...\n", + " month (time) int64 1 2 3 4 5 6 7 8 9 ... 4 5 6 7 8 9 10 11 12\n", + "Data variables:\n", + " tos (time) float32 nan nan 0.06341 ... 0.7921 nan nan\n", + " tos_gt_04 (time) float32 0.4 0.4 0.4 0.4 ... 0.6829 0.7921 0.4 0.4\n", + " tos_lt_04 (time) float32 -0.4 -0.4 -0.4 -0.4 ... -0.4 -0.4 -0.4\n", + " el_nino_threshold (time) float32 0.4 0.4 0.4 0.4 0.4 ... 0.4 0.4 0.4 0.4\n", + " la_nina_threshold (time) float32 -0.4 -0.4 -0.4 -0.4 ... -0.4 -0.4 -0.4\n", + "Attributes: (12/46)\n", + " Conventions: CF-1.7 CMIP-6.2\n", + " activity_id: CMIP\n", + " branch_method: standard\n", + " branch_time_in_child: 674885.0\n", + " branch_time_in_parent: 219000.0\n", + " case_id: 972\n", + " ... ...\n", + " table_id: Omon\n", + " tracking_id: hdl:21.14100/b0ffb89d-095d-4533-a159-a2e1241ff138\n", + " variable_id: tos\n", + " variant_info: CMIP6 20th century experiments (1850-2014) with C...\n", + " variant_label: r11i1p1f1\n", + " model: NCAR" + ] + }, + "execution_count": 137, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ncar_ds = ncar_task.result()\n", + "miroc_ds = miroc_task.result()\n", + "\n", + "ncar_ds" + ] + }, + { + "cell_type": "markdown", + "id": "f1257d1a-9712-427b-b9ce-4db644420839", + "metadata": {}, + "source": [ + "### Plot our Data\n", + "Now that we have pre-computed datasets, the last step is to visualize the output. In the other example, we stepped through how to utilize the `.hvplot` tool to create interactive displays of ENSO values. We will utilize that functionality here, wrapping into a function." + ] + }, + { + "cell_type": "code", + "execution_count": 138, + "id": "cac34be7-4faa-417c-b607-d8ee094be3e5", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def plot_enso(ds):\n", + " el_nino = ds.hvplot.area(x=\"time\", y2='tos_gt_04', y='el_nino_threshold', color='red', hover=False)\n", + " el_nino_label = hv.Text(ds.isel(time=40).time.values, 2, 'El Niño').opts(text_color='red',)\n", + "\n", + " # Create the La Niña area graphs\n", + " la_nina = ds.hvplot.area(x=\"time\", y2='tos_lt_04', y='la_nina_threshold', color='blue', hover=False)\n", + " la_nina_label = hv.Text(ds.isel(time=-40).time.values, -2, 'La Niña').opts(text_color='blue')\n", + "\n", + " # Plot a timeseries of the ENSO 3.4 index\n", + " enso = ds.tos.hvplot(x='time', line_width=0.5, color='k', xlabel='Year', ylabel='ENSO 3.4 Index')\n", + "\n", + " # Combine all the plots into a single plot\n", + " return (el_nino_label * la_nina_label * el_nino * la_nina * enso).opts(title=f'{ds.attrs[\"model\"]} {ds.attrs[\"source_id\"]} \\n Ensemble Member: {ds.attrs[\"variant_label\"]}')" + ] + }, + { + "cell_type": "markdown", + "id": "13492e2d-c32a-4bcc-b341-837d5ea91a1a", + "metadata": {}, + "source": [ + "Once we have the function, we apply to our two datasets and combine into a single column." + ] + }, + { + "cell_type": "code", + "execution_count": 139, + "id": "b6332c80-0ee9-4a4f-a277-95efc2cc8252", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": {}, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.holoviews_exec.v0+json": "", + "text/html": [ + "
\n", + "
\n", + "
\n", + "" + ], + "text/plain": [ + ":Layout\n", + " .Overlay.I :Overlay\n", + " .Text.I :Text [x,y]\n", + " .Text.II :Text [x,y]\n", + " .Area.I :Area [time] (el_nino_threshold,tos_gt_04)\n", + " .Area.II :Area [time] (la_nina_threshold,tos_lt_04)\n", + " .Curve.I :Curve [time] (tos)\n", + " .Overlay.II :Overlay\n", + " .Text.I :Text [x,y]\n", + " .Text.II :Text [x,y]\n", + " .Area.I :Area [time] (el_nino_threshold,tos_gt_04)\n", + " .Area.II :Area [time] (la_nina_threshold,tos_lt_04)\n", + " .Curve.I :Curve [time] (tos)" + ] + }, + "execution_count": 139, + "metadata": { + "application/vnd.holoviews_exec.v0+json": { + "id": "59645fce-ca6a-4432-aa0e-77521837d618" + } + }, + "output_type": "execute_result" + } + ], + "source": [ + "(plot_enso(ncar_ds) + plot_enso(miroc_ds)).cols(1)" + ] + }, + { + "cell_type": "markdown", + "id": "b3bfceb9-124a-4d72-9d49-3ca255965e29", + "metadata": {}, + "source": [ + "## Summary\n", + "In this notebook, we applied the ENSO 3.4 index calculations to CMIP6 datasets remotely using Globus Compute and created interactive plots comparing where we see El Niño and La Niña.\n", + "\n", + "### What's next?\n", + "We will see some more advanced examples of using the CMIP6 and other data access methods as well as computations.\n", + "\n", + "## Resources and references\n", + "- [Intake-ESGF Documentation](https://github.com/nocollier/intake-esgf)\n", + "- [Globus Compute Documentation](https://www.globus.org/compute)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f5b2864f-6661-4aa4-8d65-8dc10c961b36", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 49f11359b1b26b958a8f255208476334d5b8b613 Mon Sep 17 00:00:00 2001 From: mgrover1 Date: Tue, 28 Nov 2023 09:58:35 -0600 Subject: [PATCH 2/3] ADD: Add new notebook and associated files --- _config.yml | 13 +- _toc.yml | 4 +- environment.yml | 13 +- notebooks/enso-globus.ipynb | 528 +--------------------------- notebooks/images/esgf.png | Bin 0 -> 128511 bytes notebooks/images/globus-logo.png | Bin 0 -> 8023 bytes notebooks/images/logos/esgf2-us.png | Bin 0 -> 18651 bytes 7 files changed, 26 insertions(+), 532 deletions(-) create mode 100644 notebooks/images/esgf.png create mode 100644 notebooks/images/globus-logo.png create mode 100644 notebooks/images/logos/esgf2-us.png diff --git a/_config.yml b/_config.yml index b3c1065..8d3ab28 100644 --- a/_config.yml +++ b/_config.yml @@ -1,14 +1,14 @@ # Book settings # Learn more at https://jupyterbook.org/customize/config.html -title: Project Pythia Cookbook Template -author: the Project Pythia Community -logo: notebooks/images/logos/pythia_logo-white-rtext.svg +title: ESGF Cookbook +author: the ESGF Community +logo: notebooks/images/logos/esgf2-us.png copyright: "2023" execute: # To execute notebooks via a Binder instead, replace 'cache' with 'binder' - execute_notebooks: cache + execute_notebooks: "off" timeout: 600 allow_errors: False # cells with expected failures must set the `raises-exception` cell tag @@ -35,13 +35,12 @@ sphinx: html_permalinks_icon: '' html_theme_options: home_page_in_toc: true - repository_url: https://github.com/ProjectPythia/cookbook-template/ # Online location of your book + repository_url: https://github.com/esgf2-us/esgf-cookbook # Online location of your book repository_branch: main # Which branch of the repository should be used when creating links (optional) use_issues_button: true use_repository_button: true use_edit_page_button: true - google_analytics_id: G-T52X8HNYE8 - github_url: https://github.com/ProjectPythia + github_url: https://github.com/esgf2-us/ twitter_url: https://twitter.com/project_pythia icon_links: - name: YouTube diff --git a/_toc.yml b/_toc.yml index 995f86b..9f60832 100644 --- a/_toc.yml +++ b/_toc.yml @@ -4,6 +4,6 @@ parts: - caption: Preamble chapters: - file: notebooks/how-to-cite - - caption: Introduction + - caption: Workflows chapters: - - file: notebooks/notebook-template + - file: notebooks/enso-globus diff --git a/environment.yml b/environment.yml index 6fa3710..ce8e0b0 100644 --- a/environment.yml +++ b/environment.yml @@ -1,10 +1,21 @@ -name: cookbook-dev +name: esgf-cookbook-dev channels: - conda-forge + - pyviz dependencies: - jupyter-book - jupyterlab - jupyter_server + - hvplot + - holoviews + - numpy + - cartopy + - matplotlib + - globus-compute-sdk + - globus-compute-endpoint + - xarray + - cf_xarray - pip - pip: - sphinx-pythia-theme + - git+https://github.com/nocollier/intake-esgf diff --git a/notebooks/enso-globus.ipynb b/notebooks/enso-globus.ipynb index 10ea8a2..d33eeda 100644 --- a/notebooks/enso-globus.ipynb +++ b/notebooks/enso-globus.ipynb @@ -5,8 +5,8 @@ "id": "48c69fff-ab3b-49c8-b85b-95fef1250249", "metadata": {}, "source": [ - "\"Globus\n", - "\"ESGF" + "\"Globus\n", + "\"ESGF" ] }, { @@ -73,532 +73,16 @@ "outputs": [ { "data": { - "application/javascript": [ - "(function(root) {\n", - " function now() {\n", - " return new Date();\n", - " }\n", - "\n", - " var force = true;\n", - " var py_version = '3.1.1'.replace('rc', '-rc.');\n", - " var is_dev = py_version.indexOf(\"+\") !== -1 || py_version.indexOf(\"-\") !== -1;\n", - " var reloading = false;\n", - " var Bokeh = root.Bokeh;\n", - " var bokeh_loaded = Bokeh != null && (Bokeh.version === py_version || (Bokeh.versions !== undefined && Bokeh.versions.has(py_version)));\n", - "\n", - " if (typeof (root._bokeh_timeout) === \"undefined\" || force) {\n", - " root._bokeh_timeout = Date.now() + 5000;\n", - " root._bokeh_failed_load = false;\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, js_modules, js_exports, callback) {\n", - " if (css_urls == null) css_urls = [];\n", - " if (js_urls == null) js_urls = [];\n", - " if (js_modules == null) js_modules = [];\n", - " if (js_exports == null) js_exports = {};\n", - "\n", - " root._bokeh_onload_callbacks.push(callback);\n", - "\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.length === 0 && js_modules.length === 0 && Object.keys(js_exports).length === 0) {\n", - " run_callbacks();\n", - " return null;\n", - " }\n", - " if (!reloading) {\n", - " console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n", - " }\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", - " window._bokeh_on_load = on_load\n", - "\n", - " function on_error() {\n", - " console.error(\"failed to load \" + url);\n", - " }\n", - "\n", - " var skip = [];\n", - " if (window.requirejs) {\n", - " window.requirejs.config({'packages': {}, 'paths': {'jspanel': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/jspanel', 'jspanel-modal': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/modal/jspanel.modal', 'jspanel-tooltip': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/tooltip/jspanel.tooltip', 'jspanel-hint': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/hint/jspanel.hint', 'jspanel-layout': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/layout/jspanel.layout', 'jspanel-contextmenu': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/contextmenu/jspanel.contextmenu', 'jspanel-dock': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/dock/jspanel.dock', 'gridstack': 'https://cdn.jsdelivr.net/npm/gridstack@7.2.3/dist/gridstack-all', 'notyf': 'https://cdn.jsdelivr.net/npm/notyf@3/notyf.min'}, 'shim': {'jspanel': {'exports': 'jsPanel'}, 'gridstack': {'exports': 'GridStack'}}});\n", - " require([\"jspanel\"], function(jsPanel) {\n", - "\twindow.jsPanel = jsPanel\n", - "\ton_load()\n", - " })\n", - " require([\"jspanel-modal\"], function() {\n", - "\ton_load()\n", - " })\n", - " require([\"jspanel-tooltip\"], function() {\n", - "\ton_load()\n", - " })\n", - " require([\"jspanel-hint\"], function() {\n", - "\ton_load()\n", - " })\n", - " require([\"jspanel-layout\"], function() {\n", - "\ton_load()\n", - " })\n", - " require([\"jspanel-contextmenu\"], function() {\n", - "\ton_load()\n", - " })\n", - " require([\"jspanel-dock\"], function() {\n", - "\ton_load()\n", - " })\n", - " require([\"gridstack\"], function(GridStack) {\n", - "\twindow.GridStack = GridStack\n", - "\ton_load()\n", - " })\n", - " require([\"notyf\"], function() {\n", - "\ton_load()\n", - " })\n", - " root._bokeh_is_loading = css_urls.length + 9;\n", - " } else {\n", - " root._bokeh_is_loading = css_urls.length + js_urls.length + js_modules.length + Object.keys(js_exports).length;\n", - " }\n", - "\n", - " var existing_stylesheets = []\n", - " var links = document.getElementsByTagName('link')\n", - " for (var i = 0; i < links.length; i++) {\n", - " var link = links[i]\n", - " if (link.href != null) {\n", - "\texisting_stylesheets.push(link.href)\n", - " }\n", - " }\n", - " for (var i = 0; i < css_urls.length; i++) {\n", - " var url = css_urls[i];\n", - " if (existing_stylesheets.indexOf(url) !== -1) {\n", - "\ton_load()\n", - "\tcontinue;\n", - " }\n", - " const element = document.createElement(\"link\");\n", - " element.onload = on_load;\n", - " element.onerror = on_error;\n", - " element.rel = \"stylesheet\";\n", - " element.type = \"text/css\";\n", - " element.href = url;\n", - " console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n", - " document.body.appendChild(element);\n", - " } if (((window['jsPanel'] !== undefined) && (!(window['jsPanel'] instanceof HTMLElement))) || window.requirejs) {\n", - " var urls = ['https://cdn.holoviz.org/panel/1.1.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/jspanel.js', 'https://cdn.holoviz.org/panel/1.1.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/modal/jspanel.modal.js', 'https://cdn.holoviz.org/panel/1.1.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/tooltip/jspanel.tooltip.js', 'https://cdn.holoviz.org/panel/1.1.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/hint/jspanel.hint.js', 'https://cdn.holoviz.org/panel/1.1.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/layout/jspanel.layout.js', 'https://cdn.holoviz.org/panel/1.1.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/contextmenu/jspanel.contextmenu.js', 'https://cdn.holoviz.org/panel/1.1.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/dock/jspanel.dock.js'];\n", - " for (var i = 0; i < urls.length; i++) {\n", - " skip.push(urls[i])\n", - " }\n", - " } if (((window['GridStack'] !== undefined) && (!(window['GridStack'] instanceof HTMLElement))) || window.requirejs) {\n", - " var urls = ['https://cdn.holoviz.org/panel/1.1.0/dist/bundled/gridstack/gridstack@7.2.3/dist/gridstack-all.js'];\n", - " for (var i = 0; i < urls.length; i++) {\n", - " skip.push(urls[i])\n", - " }\n", - " } if (((window['Notyf'] !== undefined) && (!(window['Notyf'] instanceof HTMLElement))) || window.requirejs) {\n", - " var urls = ['https://cdn.holoviz.org/panel/1.1.0/dist/bundled/notificationarea/notyf@3/notyf.min.js'];\n", - " for (var i = 0; i < urls.length; i++) {\n", - " skip.push(urls[i])\n", - " }\n", - " } var existing_scripts = []\n", - " var scripts = document.getElementsByTagName('script')\n", - " for (var i = 0; i < scripts.length; i++) {\n", - " var script = scripts[i]\n", - " if (script.src != null) {\n", - "\texisting_scripts.push(script.src)\n", - " }\n", - " }\n", - " for (var i = 0; i < js_urls.length; i++) {\n", - " var url = js_urls[i];\n", - " if (skip.indexOf(url) !== -1 || existing_scripts.indexOf(url) !== -1) {\n", - "\tif (!window.requirejs) {\n", - "\t on_load();\n", - "\t}\n", - "\tcontinue;\n", - " }\n", - " var element = document.createElement('script');\n", - " element.onload = on_load;\n", - " element.onerror = on_error;\n", - " element.async = false;\n", - " element.src = url;\n", - " console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", - " document.head.appendChild(element);\n", - " }\n", - " for (var i = 0; i < js_modules.length; i++) {\n", - " var url = js_modules[i];\n", - " if (skip.indexOf(url) !== -1 || existing_scripts.indexOf(url) !== -1) {\n", - "\tif (!window.requirejs) {\n", - "\t on_load();\n", - "\t}\n", - "\tcontinue;\n", - " }\n", - " var element = document.createElement('script');\n", - " element.onload = on_load;\n", - " element.onerror = on_error;\n", - " element.async = false;\n", - " element.src = url;\n", - " element.type = \"module\";\n", - " console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", - " document.head.appendChild(element);\n", - " }\n", - " for (const name in js_exports) {\n", - " var url = js_exports[name];\n", - " if (skip.indexOf(url) >= 0 || root[name] != null) {\n", - "\tif (!window.requirejs) {\n", - "\t on_load();\n", - "\t}\n", - "\tcontinue;\n", - " }\n", - " var element = document.createElement('script');\n", - " element.onerror = on_error;\n", - " element.async = false;\n", - " element.type = \"module\";\n", - " console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", - " element.textContent = `\n", - " import ${name} from \"${url}\"\n", - " window.${name} = ${name}\n", - " window._bokeh_on_load()\n", - " `\n", - " document.head.appendChild(element);\n", - " }\n", - " if (!js_urls.length && !js_modules.length) {\n", - " on_load()\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", - " var js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.1.1.min.js\", \"https://cdn.holoviz.org/panel/1.1.0/dist/panel.min.js\"];\n", - " var js_modules = [];\n", - " var js_exports = {};\n", - " var css_urls = [];\n", - " var inline_js = [ function(Bokeh) {\n", - " Bokeh.set_log_level(\"info\");\n", - " },\n", - "function(Bokeh) {} // ensure no trailing comma for IE\n", - " ];\n", - "\n", - " function run_inline_js() {\n", - " if ((root.Bokeh !== undefined) || (force === true)) {\n", - " for (var i = 0; i < inline_js.length; i++) {\n", - " inline_js[i].call(root, root.Bokeh);\n", - " }\n", - " // Cache old bokeh versions\n", - " if (Bokeh != undefined && !reloading) {\n", - "\tvar NewBokeh = root.Bokeh;\n", - "\tif (Bokeh.versions === undefined) {\n", - "\t Bokeh.versions = new Map();\n", - "\t}\n", - "\tif (NewBokeh.version !== Bokeh.version) {\n", - "\t Bokeh.versions.set(NewBokeh.version, NewBokeh)\n", - "\t}\n", - "\troot.Bokeh = Bokeh;\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", - " }\n", - " root._bokeh_is_initializing = false\n", - " }\n", - "\n", - " function load_or_wait() {\n", - " // Implement a backoff loop that tries to ensure we do not load multiple\n", - " // versions of Bokeh and its dependencies at the same time.\n", - " // In recent versions we use the root._bokeh_is_initializing flag\n", - " // to determine whether there is an ongoing attempt to initialize\n", - " // bokeh, however for backward compatibility we also try to ensure\n", - " // that we do not start loading a newer (Panel>=1.0 and Bokeh>3) version\n", - " // before older versions are fully initialized.\n", - " if (root._bokeh_is_initializing && Date.now() > root._bokeh_timeout) {\n", - " root._bokeh_is_initializing = false;\n", - " root._bokeh_onload_callbacks = undefined;\n", - " console.log(\"Bokeh: BokehJS was loaded multiple times but one version failed to initialize.\");\n", - " load_or_wait();\n", - " } else if (root._bokeh_is_initializing || (typeof root._bokeh_is_initializing === \"undefined\" && root._bokeh_onload_callbacks !== undefined)) {\n", - " setTimeout(load_or_wait, 100);\n", - " } else {\n", - " Bokeh = root.Bokeh;\n", - " bokeh_loaded = Bokeh != null && (Bokeh.version === py_version || (Bokeh.versions !== undefined && Bokeh.versions.has(py_version)));\n", - " root._bokeh_is_initializing = true\n", - " root._bokeh_onload_callbacks = []\n", - " if (!reloading && (!bokeh_loaded || is_dev)) {\n", - "\troot.Bokeh = undefined;\n", - " }\n", - " load_libs(css_urls, js_urls, js_modules, js_exports, function() {\n", - "\tconsole.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n", - "\trun_inline_js();\n", - " });\n", - " }\n", - " }\n", - " // Give older versions of the autoload script a head-start to ensure\n", - " // they initialize before we start loading newer version.\n", - " setTimeout(load_or_wait, 100)\n", - "}(window));" - ], - "application/vnd.holoviews_load.v0+json": "(function(root) {\n function now() {\n return new Date();\n }\n\n var force = true;\n var py_version = '3.1.1'.replace('rc', '-rc.');\n var is_dev = py_version.indexOf(\"+\") !== -1 || py_version.indexOf(\"-\") !== -1;\n var reloading = false;\n var Bokeh = root.Bokeh;\n var bokeh_loaded = Bokeh != null && (Bokeh.version === py_version || (Bokeh.versions !== undefined && Bokeh.versions.has(py_version)));\n\n if (typeof (root._bokeh_timeout) === \"undefined\" || force) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\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, js_modules, js_exports, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n if (js_modules == null) js_modules = [];\n if (js_exports == null) js_exports = {};\n\n root._bokeh_onload_callbacks.push(callback);\n\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.length === 0 && js_modules.length === 0 && Object.keys(js_exports).length === 0) {\n run_callbacks();\n return null;\n }\n if (!reloading) {\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n }\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 window._bokeh_on_load = on_load\n\n function on_error() {\n console.error(\"failed to load \" + url);\n }\n\n var skip = [];\n if (window.requirejs) {\n window.requirejs.config({'packages': {}, 'paths': {'jspanel': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/jspanel', 'jspanel-modal': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/modal/jspanel.modal', 'jspanel-tooltip': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/tooltip/jspanel.tooltip', 'jspanel-hint': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/hint/jspanel.hint', 'jspanel-layout': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/layout/jspanel.layout', 'jspanel-contextmenu': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/contextmenu/jspanel.contextmenu', 'jspanel-dock': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/dock/jspanel.dock', 'gridstack': 'https://cdn.jsdelivr.net/npm/gridstack@7.2.3/dist/gridstack-all', 'notyf': 'https://cdn.jsdelivr.net/npm/notyf@3/notyf.min'}, 'shim': {'jspanel': {'exports': 'jsPanel'}, 'gridstack': {'exports': 'GridStack'}}});\n require([\"jspanel\"], function(jsPanel) {\n\twindow.jsPanel = jsPanel\n\ton_load()\n })\n require([\"jspanel-modal\"], function() {\n\ton_load()\n })\n require([\"jspanel-tooltip\"], function() {\n\ton_load()\n })\n require([\"jspanel-hint\"], function() {\n\ton_load()\n })\n require([\"jspanel-layout\"], function() {\n\ton_load()\n })\n require([\"jspanel-contextmenu\"], function() {\n\ton_load()\n })\n require([\"jspanel-dock\"], function() {\n\ton_load()\n })\n require([\"gridstack\"], function(GridStack) {\n\twindow.GridStack = GridStack\n\ton_load()\n })\n require([\"notyf\"], function() {\n\ton_load()\n })\n root._bokeh_is_loading = css_urls.length + 9;\n } else {\n root._bokeh_is_loading = css_urls.length + js_urls.length + js_modules.length + Object.keys(js_exports).length;\n }\n\n var existing_stylesheets = []\n var links = document.getElementsByTagName('link')\n for (var i = 0; i < links.length; i++) {\n var link = links[i]\n if (link.href != null) {\n\texisting_stylesheets.push(link.href)\n }\n }\n for (var i = 0; i < css_urls.length; i++) {\n var url = css_urls[i];\n if (existing_stylesheets.indexOf(url) !== -1) {\n\ton_load()\n\tcontinue;\n }\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error;\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n } if (((window['jsPanel'] !== undefined) && (!(window['jsPanel'] instanceof HTMLElement))) || window.requirejs) {\n var urls = ['https://cdn.holoviz.org/panel/1.1.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/jspanel.js', 'https://cdn.holoviz.org/panel/1.1.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/modal/jspanel.modal.js', 'https://cdn.holoviz.org/panel/1.1.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/tooltip/jspanel.tooltip.js', 'https://cdn.holoviz.org/panel/1.1.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/hint/jspanel.hint.js', 'https://cdn.holoviz.org/panel/1.1.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/layout/jspanel.layout.js', 'https://cdn.holoviz.org/panel/1.1.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/contextmenu/jspanel.contextmenu.js', 'https://cdn.holoviz.org/panel/1.1.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/dock/jspanel.dock.js'];\n for (var i = 0; i < urls.length; i++) {\n skip.push(urls[i])\n }\n } if (((window['GridStack'] !== undefined) && (!(window['GridStack'] instanceof HTMLElement))) || window.requirejs) {\n var urls = ['https://cdn.holoviz.org/panel/1.1.0/dist/bundled/gridstack/gridstack@7.2.3/dist/gridstack-all.js'];\n for (var i = 0; i < urls.length; i++) {\n skip.push(urls[i])\n }\n } if (((window['Notyf'] !== undefined) && (!(window['Notyf'] instanceof HTMLElement))) || window.requirejs) {\n var urls = ['https://cdn.holoviz.org/panel/1.1.0/dist/bundled/notificationarea/notyf@3/notyf.min.js'];\n for (var i = 0; i < urls.length; i++) {\n skip.push(urls[i])\n }\n } var existing_scripts = []\n var scripts = document.getElementsByTagName('script')\n for (var i = 0; i < scripts.length; i++) {\n var script = scripts[i]\n if (script.src != null) {\n\texisting_scripts.push(script.src)\n }\n }\n for (var i = 0; i < js_urls.length; i++) {\n var url = js_urls[i];\n if (skip.indexOf(url) !== -1 || existing_scripts.indexOf(url) !== -1) {\n\tif (!window.requirejs) {\n\t on_load();\n\t}\n\tcontinue;\n }\n var element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error;\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n for (var i = 0; i < js_modules.length; i++) {\n var url = js_modules[i];\n if (skip.indexOf(url) !== -1 || existing_scripts.indexOf(url) !== -1) {\n\tif (!window.requirejs) {\n\t on_load();\n\t}\n\tcontinue;\n }\n var element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error;\n element.async = false;\n element.src = url;\n element.type = \"module\";\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n for (const name in js_exports) {\n var url = js_exports[name];\n if (skip.indexOf(url) >= 0 || root[name] != null) {\n\tif (!window.requirejs) {\n\t on_load();\n\t}\n\tcontinue;\n }\n var element = document.createElement('script');\n element.onerror = on_error;\n element.async = false;\n element.type = \"module\";\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n element.textContent = `\n import ${name} from \"${url}\"\n window.${name} = ${name}\n window._bokeh_on_load()\n `\n document.head.appendChild(element);\n }\n if (!js_urls.length && !js_modules.length) {\n on_load()\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 var js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.1.1.min.js\", \"https://cdn.holoviz.org/panel/1.1.0/dist/panel.min.js\"];\n var js_modules = [];\n var js_exports = {};\n var css_urls = [];\n var inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {} // ensure no trailing comma for IE\n ];\n\n function run_inline_js() {\n if ((root.Bokeh !== undefined) || (force === true)) {\n for (var i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\n // Cache old bokeh versions\n if (Bokeh != undefined && !reloading) {\n\tvar NewBokeh = root.Bokeh;\n\tif (Bokeh.versions === undefined) {\n\t Bokeh.versions = new Map();\n\t}\n\tif (NewBokeh.version !== Bokeh.version) {\n\t Bokeh.versions.set(NewBokeh.version, NewBokeh)\n\t}\n\troot.Bokeh = Bokeh;\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 }\n root._bokeh_is_initializing = false\n }\n\n function load_or_wait() {\n // Implement a backoff loop that tries to ensure we do not load multiple\n // versions of Bokeh and its dependencies at the same time.\n // In recent versions we use the root._bokeh_is_initializing flag\n // to determine whether there is an ongoing attempt to initialize\n // bokeh, however for backward compatibility we also try to ensure\n // that we do not start loading a newer (Panel>=1.0 and Bokeh>3) version\n // before older versions are fully initialized.\n if (root._bokeh_is_initializing && Date.now() > root._bokeh_timeout) {\n root._bokeh_is_initializing = false;\n root._bokeh_onload_callbacks = undefined;\n console.log(\"Bokeh: BokehJS was loaded multiple times but one version failed to initialize.\");\n load_or_wait();\n } else if (root._bokeh_is_initializing || (typeof root._bokeh_is_initializing === \"undefined\" && root._bokeh_onload_callbacks !== undefined)) {\n setTimeout(load_or_wait, 100);\n } else {\n Bokeh = root.Bokeh;\n bokeh_loaded = Bokeh != null && (Bokeh.version === py_version || (Bokeh.versions !== undefined && Bokeh.versions.has(py_version)));\n root._bokeh_is_initializing = true\n root._bokeh_onload_callbacks = []\n if (!reloading && (!bokeh_loaded || is_dev)) {\n\troot.Bokeh = undefined;\n }\n load_libs(css_urls, js_urls, js_modules, js_exports, function() {\n\tconsole.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n\trun_inline_js();\n });\n }\n }\n // Give older versions of the autoload script a head-start to ensure\n // they initialize before we start loading newer version.\n setTimeout(load_or_wait, 100)\n}(window));" + "application/javascript": "(function(root) {\n function now() {\n return new Date();\n }\n\n var force = true;\n var py_version = '3.1.1'.replace('rc', '-rc.');\n var is_dev = py_version.indexOf(\"+\") !== -1 || py_version.indexOf(\"-\") !== -1;\n var reloading = false;\n var Bokeh = root.Bokeh;\n var bokeh_loaded = Bokeh != null && (Bokeh.version === py_version || (Bokeh.versions !== undefined && Bokeh.versions.has(py_version)));\n\n if (typeof (root._bokeh_timeout) === \"undefined\" || force) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\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, js_modules, js_exports, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n if (js_modules == null) js_modules = [];\n if (js_exports == null) js_exports = {};\n\n root._bokeh_onload_callbacks.push(callback);\n\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.length === 0 && js_modules.length === 0 && Object.keys(js_exports).length === 0) {\n run_callbacks();\n return null;\n }\n if (!reloading) {\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n }\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 window._bokeh_on_load = on_load\n\n function on_error() {\n console.error(\"failed to load \" + url);\n }\n\n var skip = [];\n if (window.requirejs) {\n window.requirejs.config({'packages': {}, 'paths': {'jspanel': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/jspanel', 'jspanel-modal': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/modal/jspanel.modal', 'jspanel-tooltip': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/tooltip/jspanel.tooltip', 'jspanel-hint': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/hint/jspanel.hint', 'jspanel-layout': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/layout/jspanel.layout', 'jspanel-contextmenu': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/contextmenu/jspanel.contextmenu', 'jspanel-dock': 'https://cdn.jsdelivr.net/npm/jspanel4@4.12.0/dist/extensions/dock/jspanel.dock', 'gridstack': 'https://cdn.jsdelivr.net/npm/gridstack@7.2.3/dist/gridstack-all', 'notyf': 'https://cdn.jsdelivr.net/npm/notyf@3/notyf.min'}, 'shim': {'jspanel': {'exports': 'jsPanel'}, 'gridstack': {'exports': 'GridStack'}}});\n require([\"jspanel\"], function(jsPanel) {\n\twindow.jsPanel = jsPanel\n\ton_load()\n })\n require([\"jspanel-modal\"], function() {\n\ton_load()\n })\n require([\"jspanel-tooltip\"], function() {\n\ton_load()\n })\n require([\"jspanel-hint\"], function() {\n\ton_load()\n })\n require([\"jspanel-layout\"], function() {\n\ton_load()\n })\n require([\"jspanel-contextmenu\"], function() {\n\ton_load()\n })\n require([\"jspanel-dock\"], function() {\n\ton_load()\n })\n require([\"gridstack\"], function(GridStack) {\n\twindow.GridStack = GridStack\n\ton_load()\n })\n require([\"notyf\"], function() {\n\ton_load()\n })\n root._bokeh_is_loading = css_urls.length + 9;\n } else {\n root._bokeh_is_loading = css_urls.length + js_urls.length + js_modules.length + Object.keys(js_exports).length;\n }\n\n var existing_stylesheets = []\n var links = document.getElementsByTagName('link')\n for (var i = 0; i < links.length; i++) {\n var link = links[i]\n if (link.href != null) {\n\texisting_stylesheets.push(link.href)\n }\n }\n for (var i = 0; i < css_urls.length; i++) {\n var url = css_urls[i];\n if (existing_stylesheets.indexOf(url) !== -1) {\n\ton_load()\n\tcontinue;\n }\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error;\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n } if (((window['jsPanel'] !== undefined) && (!(window['jsPanel'] instanceof HTMLElement))) || window.requirejs) {\n var urls = ['https://cdn.holoviz.org/panel/1.1.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/jspanel.js', 'https://cdn.holoviz.org/panel/1.1.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/modal/jspanel.modal.js', 'https://cdn.holoviz.org/panel/1.1.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/tooltip/jspanel.tooltip.js', 'https://cdn.holoviz.org/panel/1.1.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/hint/jspanel.hint.js', 'https://cdn.holoviz.org/panel/1.1.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/layout/jspanel.layout.js', 'https://cdn.holoviz.org/panel/1.1.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/contextmenu/jspanel.contextmenu.js', 'https://cdn.holoviz.org/panel/1.1.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/dock/jspanel.dock.js'];\n for (var i = 0; i < urls.length; i++) {\n skip.push(urls[i])\n }\n } if (((window['GridStack'] !== undefined) && (!(window['GridStack'] instanceof HTMLElement))) || window.requirejs) {\n var urls = ['https://cdn.holoviz.org/panel/1.1.0/dist/bundled/gridstack/gridstack@7.2.3/dist/gridstack-all.js'];\n for (var i = 0; i < urls.length; i++) {\n skip.push(urls[i])\n }\n } if (((window['Notyf'] !== undefined) && (!(window['Notyf'] instanceof HTMLElement))) || window.requirejs) {\n var urls = ['https://cdn.holoviz.org/panel/1.1.0/dist/bundled/notificationarea/notyf@3/notyf.min.js'];\n for (var i = 0; i < urls.length; i++) {\n skip.push(urls[i])\n }\n } var existing_scripts = []\n var scripts = document.getElementsByTagName('script')\n for (var i = 0; i < scripts.length; i++) {\n var script = scripts[i]\n if (script.src != null) {\n\texisting_scripts.push(script.src)\n }\n }\n for (var i = 0; i < js_urls.length; i++) {\n var url = js_urls[i];\n if (skip.indexOf(url) !== -1 || existing_scripts.indexOf(url) !== -1) {\n\tif (!window.requirejs) {\n\t on_load();\n\t}\n\tcontinue;\n }\n var element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error;\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n for (var i = 0; i < js_modules.length; i++) {\n var url = js_modules[i];\n if (skip.indexOf(url) !== -1 || existing_scripts.indexOf(url) !== -1) {\n\tif (!window.requirejs) {\n\t on_load();\n\t}\n\tcontinue;\n }\n var element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error;\n element.async = false;\n element.src = url;\n element.type = \"module\";\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n for (const name in js_exports) {\n var url = js_exports[name];\n if (skip.indexOf(url) >= 0 || root[name] != null) {\n\tif (!window.requirejs) {\n\t on_load();\n\t}\n\tcontinue;\n }\n var element = document.createElement('script');\n element.onerror = on_error;\n element.async = false;\n element.type = \"module\";\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n element.textContent = `\n import ${name} from \"${url}\"\n window.${name} = ${name}\n window._bokeh_on_load()\n `\n document.head.appendChild(element);\n }\n if (!js_urls.length && !js_modules.length) {\n on_load()\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 var js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.1.1.min.js\", \"https://cdn.holoviz.org/panel/1.1.0/dist/panel.min.js\"];\n var js_modules = [];\n var js_exports = {};\n var css_urls = [];\n var inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {} // ensure no trailing comma for IE\n ];\n\n function run_inline_js() {\n if ((root.Bokeh !== undefined) || (force === true)) {\n for (var i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\n // Cache old bokeh versions\n if (Bokeh != undefined && !reloading) {\n\tvar NewBokeh = root.Bokeh;\n\tif (Bokeh.versions === undefined) {\n\t Bokeh.versions = new Map();\n\t}\n\tif (NewBokeh.version !== Bokeh.version) {\n\t Bokeh.versions.set(NewBokeh.version, NewBokeh)\n\t}\n\troot.Bokeh = Bokeh;\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 }\n root._bokeh_is_initializing = false\n }\n\n function load_or_wait() {\n // Implement a backoff loop that tries to ensure we do not load multiple\n // versions of Bokeh and its dependencies at the same time.\n // In recent versions we use the root._bokeh_is_initializing flag\n // to determine whether there is an ongoing attempt to initialize\n // bokeh, however for backward compatibility we also try to ensure\n // that we do not start loading a newer (Panel>=1.0 and Bokeh>3) version\n // before older versions are fully initialized.\n if (root._bokeh_is_initializing && Date.now() > root._bokeh_timeout) {\n root._bokeh_is_initializing = false;\n root._bokeh_onload_callbacks = undefined;\n console.log(\"Bokeh: BokehJS was loaded multiple times but one version failed to initialize.\");\n load_or_wait();\n } else if (root._bokeh_is_initializing || (typeof root._bokeh_is_initializing === \"undefined\" && root._bokeh_onload_callbacks !== undefined)) {\n setTimeout(load_or_wait, 100);\n } else {\n Bokeh = root.Bokeh;\n bokeh_loaded = Bokeh != null && (Bokeh.version === py_version || (Bokeh.versions !== undefined && Bokeh.versions.has(py_version)));\n root._bokeh_is_initializing = true\n root._bokeh_onload_callbacks = []\n if (!reloading && (!bokeh_loaded || is_dev)) {\n\troot.Bokeh = undefined;\n }\n load_libs(css_urls, js_urls, js_modules, js_exports, function() {\n\tconsole.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n\trun_inline_js();\n });\n }\n }\n // Give older versions of the autoload script a head-start to ensure\n // they initialize before we start loading newer version.\n setTimeout(load_or_wait, 100)\n}(window));", + "application/vnd.holoviews_load.v0+json": "" }, "metadata": {}, "output_type": "display_data" }, { "data": { - "application/javascript": [ - "\n", - "if ((window.PyViz === undefined) || (window.PyViz instanceof HTMLElement)) {\n", - " window.PyViz = {comms: {}, comm_status:{}, kernels:{}, receivers: {}, plot_index: []}\n", - "}\n", - "\n", - "\n", - " function JupyterCommManager() {\n", - " }\n", - "\n", - " JupyterCommManager.prototype.register_target = function(plot_id, comm_id, msg_handler) {\n", - " if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n", - " var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n", - " comm_manager.register_target(comm_id, function(comm) {\n", - " comm.on_msg(msg_handler);\n", - " });\n", - " } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n", - " window.PyViz.kernels[plot_id].registerCommTarget(comm_id, function(comm) {\n", - " comm.onMsg = msg_handler;\n", - " });\n", - " } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n", - " google.colab.kernel.comms.registerTarget(comm_id, (comm) => {\n", - " var messages = comm.messages[Symbol.asyncIterator]();\n", - " function processIteratorResult(result) {\n", - " var message = result.value;\n", - " console.log(message)\n", - " var content = {data: message.data, comm_id};\n", - " var buffers = []\n", - " for (var buffer of message.buffers || []) {\n", - " buffers.push(new DataView(buffer))\n", - " }\n", - " var metadata = message.metadata || {};\n", - " var msg = {content, buffers, metadata}\n", - " msg_handler(msg);\n", - " return messages.next().then(processIteratorResult);\n", - " }\n", - " return messages.next().then(processIteratorResult);\n", - " })\n", - " }\n", - " }\n", - "\n", - " JupyterCommManager.prototype.get_client_comm = function(plot_id, comm_id, msg_handler) {\n", - " if (comm_id in window.PyViz.comms) {\n", - " return window.PyViz.comms[comm_id];\n", - " } else if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n", - " var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n", - " var comm = comm_manager.new_comm(comm_id, {}, {}, {}, comm_id);\n", - " if (msg_handler) {\n", - " comm.on_msg(msg_handler);\n", - " }\n", - " } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n", - " var comm = window.PyViz.kernels[plot_id].connectToComm(comm_id);\n", - " comm.open();\n", - " if (msg_handler) {\n", - " comm.onMsg = msg_handler;\n", - " }\n", - " } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n", - " var comm_promise = google.colab.kernel.comms.open(comm_id)\n", - " comm_promise.then((comm) => {\n", - " window.PyViz.comms[comm_id] = comm;\n", - " if (msg_handler) {\n", - " var messages = comm.messages[Symbol.asyncIterator]();\n", - " function processIteratorResult(result) {\n", - " var message = result.value;\n", - " var content = {data: message.data};\n", - " var metadata = message.metadata || {comm_id};\n", - " var msg = {content, metadata}\n", - " msg_handler(msg);\n", - " return messages.next().then(processIteratorResult);\n", - " }\n", - " return messages.next().then(processIteratorResult);\n", - " }\n", - " }) \n", - " var sendClosure = (data, metadata, buffers, disposeOnDone) => {\n", - " return comm_promise.then((comm) => {\n", - " comm.send(data, metadata, buffers, disposeOnDone);\n", - " });\n", - " };\n", - " var comm = {\n", - " send: sendClosure\n", - " };\n", - " }\n", - " window.PyViz.comms[comm_id] = comm;\n", - " return comm;\n", - " }\n", - " window.PyViz.comm_manager = new JupyterCommManager();\n", - " \n", - "\n", - "\n", - "var JS_MIME_TYPE = 'application/javascript';\n", - "var HTML_MIME_TYPE = 'text/html';\n", - "var EXEC_MIME_TYPE = 'application/vnd.holoviews_exec.v0+json';\n", - "var CLASS_NAME = 'output';\n", - "\n", - "/**\n", - " * Render data to the DOM node\n", - " */\n", - "function render(props, node) {\n", - " var div = document.createElement(\"div\");\n", - " var script = document.createElement(\"script\");\n", - " node.appendChild(div);\n", - " node.appendChild(script);\n", - "}\n", - "\n", - "/**\n", - " * Handle when a new output is added\n", - " */\n", - "function handle_add_output(event, handle) {\n", - " var output_area = handle.output_area;\n", - " var output = handle.output;\n", - " if ((output.data == undefined) || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n", - " return\n", - " }\n", - " var id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n", - " var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n", - " if (id !== undefined) {\n", - " var nchildren = toinsert.length;\n", - " var html_node = toinsert[nchildren-1].children[0];\n", - " html_node.innerHTML = output.data[HTML_MIME_TYPE];\n", - " var scripts = [];\n", - " var nodelist = html_node.querySelectorAll(\"script\");\n", - " for (var i in nodelist) {\n", - " if (nodelist.hasOwnProperty(i)) {\n", - " scripts.push(nodelist[i])\n", - " }\n", - " }\n", - "\n", - " scripts.forEach( function (oldScript) {\n", - " var newScript = document.createElement(\"script\");\n", - " var attrs = [];\n", - " var nodemap = oldScript.attributes;\n", - " for (var j in nodemap) {\n", - " if (nodemap.hasOwnProperty(j)) {\n", - " attrs.push(nodemap[j])\n", - " }\n", - " }\n", - " attrs.forEach(function(attr) { newScript.setAttribute(attr.name, attr.value) });\n", - " newScript.appendChild(document.createTextNode(oldScript.innerHTML));\n", - " oldScript.parentNode.replaceChild(newScript, oldScript);\n", - " });\n", - " if (JS_MIME_TYPE in output.data) {\n", - " toinsert[nchildren-1].children[1].textContent = output.data[JS_MIME_TYPE];\n", - " }\n", - " output_area._hv_plot_id = id;\n", - " if ((window.Bokeh !== undefined) && (id in Bokeh.index)) {\n", - " window.PyViz.plot_index[id] = Bokeh.index[id];\n", - " } else {\n", - " window.PyViz.plot_index[id] = null;\n", - " }\n", - " } else if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n", - " var bk_div = document.createElement(\"div\");\n", - " bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n", - " var script_attrs = bk_div.children[0].attributes;\n", - " for (var i = 0; i < script_attrs.length; i++) {\n", - " toinsert[toinsert.length - 1].childNodes[1].setAttribute(script_attrs[i].name, script_attrs[i].value);\n", - " }\n", - " // store reference to server id on output_area\n", - " output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n", - " }\n", - "}\n", - "\n", - "/**\n", - " * Handle when an output is cleared or removed\n", - " */\n", - "function handle_clear_output(event, handle) {\n", - " var id = handle.cell.output_area._hv_plot_id;\n", - " var server_id = handle.cell.output_area._bokeh_server_id;\n", - " if (((id === undefined) || !(id in PyViz.plot_index)) && (server_id !== undefined)) { return; }\n", - " var comm = window.PyViz.comm_manager.get_client_comm(\"hv-extension-comm\", \"hv-extension-comm\", function () {});\n", - " if (server_id !== null) {\n", - " comm.send({event_type: 'server_delete', 'id': server_id});\n", - " return;\n", - " } else if (comm !== null) {\n", - " comm.send({event_type: 'delete', 'id': id});\n", - " }\n", - " delete PyViz.plot_index[id];\n", - " if ((window.Bokeh !== undefined) & (id in window.Bokeh.index)) {\n", - " var doc = window.Bokeh.index[id].model.document\n", - " doc.clear();\n", - " const i = window.Bokeh.documents.indexOf(doc);\n", - " if (i > -1) {\n", - " window.Bokeh.documents.splice(i, 1);\n", - " }\n", - " }\n", - "}\n", - "\n", - "/**\n", - " * Handle kernel restart event\n", - " */\n", - "function handle_kernel_cleanup(event, handle) {\n", - " delete PyViz.comms[\"hv-extension-comm\"];\n", - " window.PyViz.plot_index = {}\n", - "}\n", - "\n", - "/**\n", - " * Handle update_display_data messages\n", - " */\n", - "function handle_update_output(event, handle) {\n", - " handle_clear_output(event, {cell: {output_area: handle.output_area}})\n", - " handle_add_output(event, handle)\n", - "}\n", - "\n", - "function register_renderer(events, OutputArea) {\n", - " function append_mime(data, metadata, element) {\n", - " // create a DOM node to render to\n", - " var toinsert = this.create_output_subarea(\n", - " metadata,\n", - " CLASS_NAME,\n", - " EXEC_MIME_TYPE\n", - " );\n", - " this.keyboard_manager.register_events(toinsert);\n", - " // Render to node\n", - " var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n", - " render(props, toinsert[0]);\n", - " element.append(toinsert);\n", - " return toinsert\n", - " }\n", - "\n", - " events.on('output_added.OutputArea', handle_add_output);\n", - " events.on('output_updated.OutputArea', handle_update_output);\n", - " events.on('clear_output.CodeCell', handle_clear_output);\n", - " events.on('delete.Cell', handle_clear_output);\n", - " events.on('kernel_ready.Kernel', handle_kernel_cleanup);\n", - "\n", - " OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n", - " safe: true,\n", - " index: 0\n", - " });\n", - "}\n", - "\n", - "if (window.Jupyter !== undefined) {\n", - " try {\n", - " var events = require('base/js/events');\n", - " var OutputArea = require('notebook/js/outputarea').OutputArea;\n", - " if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n", - " register_renderer(events, OutputArea);\n", - " }\n", - " } catch(err) {\n", - " }\n", - "}\n" - ], - "application/vnd.holoviews_load.v0+json": "\nif ((window.PyViz === undefined) || (window.PyViz instanceof HTMLElement)) {\n window.PyViz = {comms: {}, comm_status:{}, kernels:{}, receivers: {}, plot_index: []}\n}\n\n\n function JupyterCommManager() {\n }\n\n JupyterCommManager.prototype.register_target = function(plot_id, comm_id, msg_handler) {\n if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n comm_manager.register_target(comm_id, function(comm) {\n comm.on_msg(msg_handler);\n });\n } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n window.PyViz.kernels[plot_id].registerCommTarget(comm_id, function(comm) {\n comm.onMsg = msg_handler;\n });\n } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n google.colab.kernel.comms.registerTarget(comm_id, (comm) => {\n var messages = comm.messages[Symbol.asyncIterator]();\n function processIteratorResult(result) {\n var message = result.value;\n console.log(message)\n var content = {data: message.data, comm_id};\n var buffers = []\n for (var buffer of message.buffers || []) {\n buffers.push(new DataView(buffer))\n }\n var metadata = message.metadata || {};\n var msg = {content, buffers, metadata}\n msg_handler(msg);\n return messages.next().then(processIteratorResult);\n }\n return messages.next().then(processIteratorResult);\n })\n }\n }\n\n JupyterCommManager.prototype.get_client_comm = function(plot_id, comm_id, msg_handler) {\n if (comm_id in window.PyViz.comms) {\n return window.PyViz.comms[comm_id];\n } else if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n var comm = comm_manager.new_comm(comm_id, {}, {}, {}, comm_id);\n if (msg_handler) {\n comm.on_msg(msg_handler);\n }\n } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n var comm = window.PyViz.kernels[plot_id].connectToComm(comm_id);\n comm.open();\n if (msg_handler) {\n comm.onMsg = msg_handler;\n }\n } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n var comm_promise = google.colab.kernel.comms.open(comm_id)\n comm_promise.then((comm) => {\n window.PyViz.comms[comm_id] = comm;\n if (msg_handler) {\n var messages = comm.messages[Symbol.asyncIterator]();\n function processIteratorResult(result) {\n var message = result.value;\n var content = {data: message.data};\n var metadata = message.metadata || {comm_id};\n var msg = {content, metadata}\n msg_handler(msg);\n return messages.next().then(processIteratorResult);\n }\n return messages.next().then(processIteratorResult);\n }\n }) \n var sendClosure = (data, metadata, buffers, disposeOnDone) => {\n return comm_promise.then((comm) => {\n comm.send(data, metadata, buffers, disposeOnDone);\n });\n };\n var comm = {\n send: sendClosure\n };\n }\n window.PyViz.comms[comm_id] = comm;\n return comm;\n }\n window.PyViz.comm_manager = new JupyterCommManager();\n \n\n\nvar JS_MIME_TYPE = 'application/javascript';\nvar HTML_MIME_TYPE = 'text/html';\nvar EXEC_MIME_TYPE = 'application/vnd.holoviews_exec.v0+json';\nvar CLASS_NAME = 'output';\n\n/**\n * Render data to the DOM node\n */\nfunction render(props, node) {\n var div = document.createElement(\"div\");\n var script = document.createElement(\"script\");\n node.appendChild(div);\n node.appendChild(script);\n}\n\n/**\n * Handle when a new output is added\n */\nfunction handle_add_output(event, handle) {\n var output_area = handle.output_area;\n var output = handle.output;\n if ((output.data == undefined) || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n return\n }\n var id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n if (id !== undefined) {\n var nchildren = toinsert.length;\n var html_node = toinsert[nchildren-1].children[0];\n html_node.innerHTML = output.data[HTML_MIME_TYPE];\n var scripts = [];\n var nodelist = html_node.querySelectorAll(\"script\");\n for (var i in nodelist) {\n if (nodelist.hasOwnProperty(i)) {\n scripts.push(nodelist[i])\n }\n }\n\n scripts.forEach( function (oldScript) {\n var newScript = document.createElement(\"script\");\n var attrs = [];\n var nodemap = oldScript.attributes;\n for (var j in nodemap) {\n if (nodemap.hasOwnProperty(j)) {\n attrs.push(nodemap[j])\n }\n }\n attrs.forEach(function(attr) { newScript.setAttribute(attr.name, attr.value) });\n newScript.appendChild(document.createTextNode(oldScript.innerHTML));\n oldScript.parentNode.replaceChild(newScript, oldScript);\n });\n if (JS_MIME_TYPE in output.data) {\n toinsert[nchildren-1].children[1].textContent = output.data[JS_MIME_TYPE];\n }\n output_area._hv_plot_id = id;\n if ((window.Bokeh !== undefined) && (id in Bokeh.index)) {\n window.PyViz.plot_index[id] = Bokeh.index[id];\n } else {\n window.PyViz.plot_index[id] = null;\n }\n } else if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n var bk_div = document.createElement(\"div\");\n bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n var script_attrs = bk_div.children[0].attributes;\n for (var i = 0; i < script_attrs.length; i++) {\n toinsert[toinsert.length - 1].childNodes[1].setAttribute(script_attrs[i].name, script_attrs[i].value);\n }\n // store reference to server id on output_area\n output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n }\n}\n\n/**\n * Handle when an output is cleared or removed\n */\nfunction handle_clear_output(event, handle) {\n var id = handle.cell.output_area._hv_plot_id;\n var server_id = handle.cell.output_area._bokeh_server_id;\n if (((id === undefined) || !(id in PyViz.plot_index)) && (server_id !== undefined)) { return; }\n var comm = window.PyViz.comm_manager.get_client_comm(\"hv-extension-comm\", \"hv-extension-comm\", function () {});\n if (server_id !== null) {\n comm.send({event_type: 'server_delete', 'id': server_id});\n return;\n } else if (comm !== null) {\n comm.send({event_type: 'delete', 'id': id});\n }\n delete PyViz.plot_index[id];\n if ((window.Bokeh !== undefined) & (id in window.Bokeh.index)) {\n var doc = window.Bokeh.index[id].model.document\n doc.clear();\n const i = window.Bokeh.documents.indexOf(doc);\n if (i > -1) {\n window.Bokeh.documents.splice(i, 1);\n }\n }\n}\n\n/**\n * Handle kernel restart event\n */\nfunction handle_kernel_cleanup(event, handle) {\n delete PyViz.comms[\"hv-extension-comm\"];\n window.PyViz.plot_index = {}\n}\n\n/**\n * Handle update_display_data messages\n */\nfunction handle_update_output(event, handle) {\n handle_clear_output(event, {cell: {output_area: handle.output_area}})\n handle_add_output(event, handle)\n}\n\nfunction register_renderer(events, OutputArea) {\n function append_mime(data, metadata, element) {\n // create a DOM node to render to\n var toinsert = this.create_output_subarea(\n metadata,\n CLASS_NAME,\n EXEC_MIME_TYPE\n );\n this.keyboard_manager.register_events(toinsert);\n // Render to node\n var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n render(props, toinsert[0]);\n element.append(toinsert);\n return toinsert\n }\n\n events.on('output_added.OutputArea', handle_add_output);\n events.on('output_updated.OutputArea', handle_update_output);\n events.on('clear_output.CodeCell', handle_clear_output);\n events.on('delete.Cell', handle_clear_output);\n events.on('kernel_ready.Kernel', handle_kernel_cleanup);\n\n OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n safe: true,\n index: 0\n });\n}\n\nif (window.Jupyter !== undefined) {\n try {\n var events = require('base/js/events');\n var OutputArea = require('notebook/js/outputarea').OutputArea;\n if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n register_renderer(events, OutputArea);\n }\n } catch(err) {\n }\n}\n" + "application/javascript": "\nif ((window.PyViz === undefined) || (window.PyViz instanceof HTMLElement)) {\n window.PyViz = {comms: {}, comm_status:{}, kernels:{}, receivers: {}, plot_index: []}\n}\n\n\n function JupyterCommManager() {\n }\n\n JupyterCommManager.prototype.register_target = function(plot_id, comm_id, msg_handler) {\n if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n comm_manager.register_target(comm_id, function(comm) {\n comm.on_msg(msg_handler);\n });\n } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n window.PyViz.kernels[plot_id].registerCommTarget(comm_id, function(comm) {\n comm.onMsg = msg_handler;\n });\n } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n google.colab.kernel.comms.registerTarget(comm_id, (comm) => {\n var messages = comm.messages[Symbol.asyncIterator]();\n function processIteratorResult(result) {\n var message = result.value;\n console.log(message)\n var content = {data: message.data, comm_id};\n var buffers = []\n for (var buffer of message.buffers || []) {\n buffers.push(new DataView(buffer))\n }\n var metadata = message.metadata || {};\n var msg = {content, buffers, metadata}\n msg_handler(msg);\n return messages.next().then(processIteratorResult);\n }\n return messages.next().then(processIteratorResult);\n })\n }\n }\n\n JupyterCommManager.prototype.get_client_comm = function(plot_id, comm_id, msg_handler) {\n if (comm_id in window.PyViz.comms) {\n return window.PyViz.comms[comm_id];\n } else if (window.comm_manager || ((window.Jupyter !== undefined) && (Jupyter.notebook.kernel != null))) {\n var comm_manager = window.comm_manager || Jupyter.notebook.kernel.comm_manager;\n var comm = comm_manager.new_comm(comm_id, {}, {}, {}, comm_id);\n if (msg_handler) {\n comm.on_msg(msg_handler);\n }\n } else if ((plot_id in window.PyViz.kernels) && (window.PyViz.kernels[plot_id])) {\n var comm = window.PyViz.kernels[plot_id].connectToComm(comm_id);\n comm.open();\n if (msg_handler) {\n comm.onMsg = msg_handler;\n }\n } else if (typeof google != 'undefined' && google.colab.kernel != null) {\n var comm_promise = google.colab.kernel.comms.open(comm_id)\n comm_promise.then((comm) => {\n window.PyViz.comms[comm_id] = comm;\n if (msg_handler) {\n var messages = comm.messages[Symbol.asyncIterator]();\n function processIteratorResult(result) {\n var message = result.value;\n var content = {data: message.data};\n var metadata = message.metadata || {comm_id};\n var msg = {content, metadata}\n msg_handler(msg);\n return messages.next().then(processIteratorResult);\n }\n return messages.next().then(processIteratorResult);\n }\n }) \n var sendClosure = (data, metadata, buffers, disposeOnDone) => {\n return comm_promise.then((comm) => {\n comm.send(data, metadata, buffers, disposeOnDone);\n });\n };\n var comm = {\n send: sendClosure\n };\n }\n window.PyViz.comms[comm_id] = comm;\n return comm;\n }\n window.PyViz.comm_manager = new JupyterCommManager();\n \n\n\nvar JS_MIME_TYPE = 'application/javascript';\nvar HTML_MIME_TYPE = 'text/html';\nvar EXEC_MIME_TYPE = 'application/vnd.holoviews_exec.v0+json';\nvar CLASS_NAME = 'output';\n\n/**\n * Render data to the DOM node\n */\nfunction render(props, node) {\n var div = document.createElement(\"div\");\n var script = document.createElement(\"script\");\n node.appendChild(div);\n node.appendChild(script);\n}\n\n/**\n * Handle when a new output is added\n */\nfunction handle_add_output(event, handle) {\n var output_area = handle.output_area;\n var output = handle.output;\n if ((output.data == undefined) || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n return\n }\n var id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n if (id !== undefined) {\n var nchildren = toinsert.length;\n var html_node = toinsert[nchildren-1].children[0];\n html_node.innerHTML = output.data[HTML_MIME_TYPE];\n var scripts = [];\n var nodelist = html_node.querySelectorAll(\"script\");\n for (var i in nodelist) {\n if (nodelist.hasOwnProperty(i)) {\n scripts.push(nodelist[i])\n }\n }\n\n scripts.forEach( function (oldScript) {\n var newScript = document.createElement(\"script\");\n var attrs = [];\n var nodemap = oldScript.attributes;\n for (var j in nodemap) {\n if (nodemap.hasOwnProperty(j)) {\n attrs.push(nodemap[j])\n }\n }\n attrs.forEach(function(attr) { newScript.setAttribute(attr.name, attr.value) });\n newScript.appendChild(document.createTextNode(oldScript.innerHTML));\n oldScript.parentNode.replaceChild(newScript, oldScript);\n });\n if (JS_MIME_TYPE in output.data) {\n toinsert[nchildren-1].children[1].textContent = output.data[JS_MIME_TYPE];\n }\n output_area._hv_plot_id = id;\n if ((window.Bokeh !== undefined) && (id in Bokeh.index)) {\n window.PyViz.plot_index[id] = Bokeh.index[id];\n } else {\n window.PyViz.plot_index[id] = null;\n }\n } else if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n var bk_div = document.createElement(\"div\");\n bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n var script_attrs = bk_div.children[0].attributes;\n for (var i = 0; i < script_attrs.length; i++) {\n toinsert[toinsert.length - 1].childNodes[1].setAttribute(script_attrs[i].name, script_attrs[i].value);\n }\n // store reference to server id on output_area\n output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n }\n}\n\n/**\n * Handle when an output is cleared or removed\n */\nfunction handle_clear_output(event, handle) {\n var id = handle.cell.output_area._hv_plot_id;\n var server_id = handle.cell.output_area._bokeh_server_id;\n if (((id === undefined) || !(id in PyViz.plot_index)) && (server_id !== undefined)) { return; }\n var comm = window.PyViz.comm_manager.get_client_comm(\"hv-extension-comm\", \"hv-extension-comm\", function () {});\n if (server_id !== null) {\n comm.send({event_type: 'server_delete', 'id': server_id});\n return;\n } else if (comm !== null) {\n comm.send({event_type: 'delete', 'id': id});\n }\n delete PyViz.plot_index[id];\n if ((window.Bokeh !== undefined) & (id in window.Bokeh.index)) {\n var doc = window.Bokeh.index[id].model.document\n doc.clear();\n const i = window.Bokeh.documents.indexOf(doc);\n if (i > -1) {\n window.Bokeh.documents.splice(i, 1);\n }\n }\n}\n\n/**\n * Handle kernel restart event\n */\nfunction handle_kernel_cleanup(event, handle) {\n delete PyViz.comms[\"hv-extension-comm\"];\n window.PyViz.plot_index = {}\n}\n\n/**\n * Handle update_display_data messages\n */\nfunction handle_update_output(event, handle) {\n handle_clear_output(event, {cell: {output_area: handle.output_area}})\n handle_add_output(event, handle)\n}\n\nfunction register_renderer(events, OutputArea) {\n function append_mime(data, metadata, element) {\n // create a DOM node to render to\n var toinsert = this.create_output_subarea(\n metadata,\n CLASS_NAME,\n EXEC_MIME_TYPE\n );\n this.keyboard_manager.register_events(toinsert);\n // Render to node\n var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n render(props, toinsert[0]);\n element.append(toinsert);\n return toinsert\n }\n\n events.on('output_added.OutputArea', handle_add_output);\n events.on('output_updated.OutputArea', handle_update_output);\n events.on('clear_output.CodeCell', handle_clear_output);\n events.on('delete.Cell', handle_clear_output);\n events.on('kernel_ready.Kernel', handle_kernel_cleanup);\n\n OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n safe: true,\n index: 0\n });\n}\n\nif (window.Jupyter !== undefined) {\n try {\n var events = require('base/js/events');\n var OutputArea = require('notebook/js/outputarea').OutputArea;\n if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n register_renderer(events, OutputArea);\n }\n } catch(err) {\n }\n}\n", + "application/vnd.holoviews_load.v0+json": "" }, "metadata": {}, "output_type": "display_data" diff --git a/notebooks/images/esgf.png b/notebooks/images/esgf.png new file mode 100644 index 0000000000000000000000000000000000000000..c55455b289b495d208170b495901c67ae1f34176 GIT binary patch literal 128511 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
bRd5pub0ffj_vyNOIz2dUAlb)O& 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
pWKmk-91or*y^v?D1! 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%0Aw4|Ki>Wy=-Ly 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�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 literal 0 HcmV?d00001 diff --git a/notebooks/images/globus-logo.png b/notebooks/images/globus-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..2bdb508549a4e7eaba5b10ac44edf04fb4e9a3ec GIT binary patch literal 8023 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 literal 0 HcmV?d00001 diff --git a/notebooks/images/logos/esgf2-us.png b/notebooks/images/logos/esgf2-us.png new file mode 100644 index 0000000000000000000000000000000000000000..fad229c4ef8719a249e063105353d3b4a0fb4114 GIT binary patch literal 18651 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 literal 0 HcmV?d00001 From f3a59b5329ac02bcf102757282c16ed0c605fd98 Mon Sep 17 00:00:00 2001 From: mgrover1 Date: Tue, 28 Nov 2023 09:59:09 -0600 Subject: [PATCH 3/3] Update readme title --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 25029ec..a0d84ac 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -thumbnail +thumbnail -# (Replace_with_your_title) Cookbook +# ESGF Cookbook [![nightly-build](https://github.com/ProjectPythia/cookbook-template/actions/workflows/nightly-build.yaml/badge.svg)](https://github.com/ProjectPythia/cookbook-template/actions/workflows/nightly-build.yaml) [![Binder](https://binder.projectpythia.org/badge_logo.svg)](https://binder.projectpythia.org/v2/gh/ProjectPythia/cookbook-template/main?labpath=notebooks)