diff --git a/Tutorials/SWOTHR_s3Access_real_data_v11.ipynb b/Tutorials/SWOTHR_s3Access_real_data_v11.ipynb
new file mode 100644
index 0000000..a3ecf92
--- /dev/null
+++ b/Tutorials/SWOTHR_s3Access_real_data_v11.ipynb
@@ -0,0 +1,4060 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# SWOT Hydrology Dataset Exploration in the Cloud\n",
+ "\n",
+ "## Accessing and Visualizing SWOT Datasets\n",
+ "\n",
+ "### Requirement:\n",
+ "This tutorial can only be run in an **AWS cloud instance running in us-west-2**: NASA Earthdata Cloud data in S3 can be directly accessed via `earthaccess` python library; this access is limited to requests made within the US West (Oregon) (code: `us-west-2`) AWS region.\n",
+ "\n",
+ "### Learning Objectives:\n",
+ "- Access SWOT HR data prodcuts (archived in NASA Earthdata Cloud) within the AWS cloud, without downloading to local machine\n",
+ "- Visualize accessed data for a quick check\n",
+ "\n",
+ "#### SWOT Level 2 KaRIn High Rate Version 1.1 (where available) Datasets:\n",
+ "\n",
+ "1. **River Vector Shapefile** - SWOT_L2_HR_RIVERSP_1.1\n",
+ "\n",
+ "2. **Lake Vector Shapefile** - SWOT_L2_HR_LAKESP_1.1\n",
+ "\n",
+ "3. **Water Mask Pixel Cloud NetCDF** - SWOT_L2_HR_PIXC_1.1\n",
+ "\n",
+ "4. **Water Mask Pixel Cloud Vector Attribute NetCDF** - SWOT_L2_HR_PIXCVec_1.1\n",
+ "\n",
+ "5. **Raster NetCDF** - SWOT_L2_HR_Raster_1.1\n",
+ "\n",
+ "6. **Single Look Complex Data product** - SWOT_L1B_HR_SLC_1.1\n",
+ "\n",
+ "_Notebook Author: Cassie Nickles, NASA PO.DAAC (Aug 2023) || Other Contributors: Zoe Walschots (PO.DAAC Summer Intern 2023), Catalina Taglialatela (NASA PO.DAAC), Luis Lopez (NASA NSIDC DAAC)_\n",
+ "\n",
+ "_Last updated: 4 Dec 2023_\n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Libraries Needed"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "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.2.2'.replace('rc', '-rc.').replace('.dev', '-dev.');\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.2.3/dist/bundled/floatpanel/jspanel4@4.12.0/dist/jspanel.js', 'https://cdn.holoviz.org/panel/1.2.3/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/modal/jspanel.modal.js', 'https://cdn.holoviz.org/panel/1.2.3/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/tooltip/jspanel.tooltip.js', 'https://cdn.holoviz.org/panel/1.2.3/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/hint/jspanel.hint.js', 'https://cdn.holoviz.org/panel/1.2.3/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/layout/jspanel.layout.js', 'https://cdn.holoviz.org/panel/1.2.3/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/contextmenu/jspanel.contextmenu.js', 'https://cdn.holoviz.org/panel/1.2.3/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.2.3/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.2.3/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.2.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.2.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.2.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.2.2.min.js\", \"https://cdn.holoviz.org/panel/1.2.3/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.2.2'.replace('rc', '-rc.').replace('.dev', '-dev.');\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.2.3/dist/bundled/floatpanel/jspanel4@4.12.0/dist/jspanel.js', 'https://cdn.holoviz.org/panel/1.2.3/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/modal/jspanel.modal.js', 'https://cdn.holoviz.org/panel/1.2.3/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/tooltip/jspanel.tooltip.js', 'https://cdn.holoviz.org/panel/1.2.3/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/hint/jspanel.hint.js', 'https://cdn.holoviz.org/panel/1.2.3/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/layout/jspanel.layout.js', 'https://cdn.holoviz.org/panel/1.2.3/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/contextmenu/jspanel.contextmenu.js', 'https://cdn.holoviz.org/panel/1.2.3/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.2.3/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.2.3/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.2.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.2.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.2.2.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.2.2.min.js\", \"https://cdn.holoviz.org/panel/1.2.3/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"
+ }
+ ],
+ "source": [
+ "import glob\n",
+ "import os\n",
+ "import requests\n",
+ "import s3fs\n",
+ "import fiona\n",
+ "import netCDF4 as nc\n",
+ "import h5netcdf\n",
+ "import xarray as xr\n",
+ "import pandas as pd\n",
+ "import geopandas as gpd\n",
+ "import numpy as np\n",
+ "import matplotlib.pyplot as plt\n",
+ "import hvplot.xarray\n",
+ "import earthaccess\n",
+ "from earthaccess import Auth, DataCollections, DataGranules, Store"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Earthdata Login\n",
+ "\n",
+ "An Earthdata Login account is required to access data, as well as discover restricted data, from the NASA Earthdata system. Thus, to access NASA data, you need Earthdata Login. If you don't already have one, please visit https://urs.earthdata.nasa.gov to register and manage your Earthdata Login account. This account is free to create and only takes a moment to set up. We use `earthaccess` to authenticate your login credentials below."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "EARTHDATA_USERNAME and EARTHDATA_PASSWORD are not set in the current environment, try setting them or use a different strategy (netrc, interactive)\n",
+ "You're now authenticated with NASA Earthdata Login\n",
+ "Using token with expiration date: 01/07/2024\n",
+ "Using .netrc file for EDL\n"
+ ]
+ }
+ ],
+ "source": [
+ "auth = earthaccess.login()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "tags": []
+ },
+ "source": [
+ "### Single File Access\n",
+ "\n",
+ "#### **1. River Vector Shapefiles**\n",
+ "\n",
+ "The s3 access link can be found using `earthaccess` data search. Since this collection consists of Reach and Node files, we need to extract only the granule for the Reach file. We do this by filtering for the 'Reach' title in the data link.\n",
+ "\n",
+ "Alternatively, Earthdata Search [(see tutorial)](https://nasa-openscapes.github.io/2021-Cloud-Workshop-AGU/tutorials/01_Earthdata_Search.html) can be used to search in a map graphic user interface.\n",
+ "\n",
+ "For additional tips on spatial searching of SWOT HR L2 data, see also [PO.DAAC Cookbook - SWOT Chapter tips section](https://podaac.github.io/tutorials/quarto_text/SWOT.html#tips-for-swot-hr-spatial-search).\n",
+ "\n",
+ "#### Search for the data of interest"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Granules found: 14\n"
+ ]
+ }
+ ],
+ "source": [
+ "#Retrieves granule from the day we want, in this case by passing to `earthdata.search_data` function the data collection shortname, temporal bounds, and for restricted data one must specify the search count\n",
+ "river_results = earthaccess.search_data(short_name = 'SWOT_L2_HR_RIVERSP_1.1', \n",
+ " temporal = ('2023-04-08 00:00:00', '2023-04-22 23:59:59'),\n",
+ " granule_name = '*Reach*_013_NA*') # here we filter by Reach files (not node), pass #13 and continent code=NA"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Set up an `s3fs` session for Direct Cloud Access\n",
+ "`s3fs` sessions are used for authenticated access to s3 bucket and allows for typical file-system style operations. Below we create session by passing in the data access information."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [],
+ "source": [
+ "fs_s3 = earthaccess.get_s3fs_session(results=river_results)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "tags": []
+ },
+ "source": [
+ "#### Create Fiona session to work with zip and embedded shapefiles in the AWS Cloud\n",
+ "The native format for this data is a **.zip** file, and we want the **.shp** file within the .zip file, so we will create a Fiona AWS session using the credentials from setting up the s3fs session above to access the shapefiles within the zip files. If we don't do this, the alternative would be to download the data to the cloud environment (e.g. EC2 instance, user S3 bucket) and extract the .zip file there."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [],
+ "source": [
+ "fiona_session=fiona.session.AWSSession(\n",
+ " aws_access_key_id=fs_s3.storage_options[\"key\"],\n",
+ " aws_secret_access_key=fs_s3.storage_options[\"secret\"],\n",
+ " aws_session_token=fs_s3.storage_options[\"token\"]\n",
+ " )"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " reach_id | \n",
+ " time | \n",
+ " time_tai | \n",
+ " time_str | \n",
+ " p_lat | \n",
+ " p_lon | \n",
+ " river_name | \n",
+ " wse | \n",
+ " wse_u | \n",
+ " wse_r_u | \n",
+ " ... | \n",
+ " p_wid_var | \n",
+ " p_n_nodes | \n",
+ " p_dist_out | \n",
+ " p_length | \n",
+ " p_maf | \n",
+ " p_dam_id | \n",
+ " p_n_ch_max | \n",
+ " p_n_ch_mod | \n",
+ " p_low_slp | \n",
+ " geometry | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " 77460000013 | \n",
+ " 7.342535e+08 | \n",
+ " 7.342536e+08 | \n",
+ " 2023-04-08T07:18:42Z | \n",
+ " 40.621824 | \n",
+ " -124.244823 | \n",
+ " Eel River | \n",
+ " 2.320100e+00 | \n",
+ " 9.653000e-02 | \n",
+ " 3.490000e-02 | \n",
+ " ... | \n",
+ " 23702.805 | \n",
+ " 96 | \n",
+ " 19376.986 | \n",
+ " 19194.609276 | \n",
+ " -1.000000e+12 | \n",
+ " 0 | \n",
+ " 4 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " LINESTRING (-124.29069 40.66364, -124.29104 40... | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " 77460000021 | \n",
+ " 7.342535e+08 | \n",
+ " 7.342536e+08 | \n",
+ " 2023-04-08T07:18:42Z | \n",
+ " 40.542406 | \n",
+ " -124.156177 | \n",
+ " Eel River | \n",
+ " 9.248800e+00 | \n",
+ " 9.071000e-02 | \n",
+ " 1.130000e-02 | \n",
+ " ... | \n",
+ " 3435.524 | \n",
+ " 51 | \n",
+ " 29478.836 | \n",
+ " 10101.849934 | \n",
+ " -1.000000e+12 | \n",
+ " 0 | \n",
+ " 2 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " LINESTRING (-124.16119 40.58421, -124.16097 40... | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " 77460000031 | \n",
+ " 7.342535e+08 | \n",
+ " 7.342536e+08 | \n",
+ " 2023-04-08T07:18:42Z | \n",
+ " 40.494638 | \n",
+ " -124.107178 | \n",
+ " Eel River | \n",
+ " 1.970160e+01 | \n",
+ " 5.754600e-01 | \n",
+ " 5.683800e-01 | \n",
+ " ... | \n",
+ " 1202.549 | \n",
+ " 50 | \n",
+ " 39553.707 | \n",
+ " 10074.871060 | \n",
+ " -1.000000e+12 | \n",
+ " 0 | \n",
+ " 2 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " LINESTRING (-124.13864 40.50871, -124.13829 40... | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " 77460000041 | \n",
+ " 7.342535e+08 | \n",
+ " 7.342536e+08 | \n",
+ " 2023-04-08T07:18:42Z | \n",
+ " 40.447111 | \n",
+ " -124.021272 | \n",
+ " Eel River | \n",
+ " 3.471650e+01 | \n",
+ " 1.486718e+01 | \n",
+ " 1.486691e+01 | \n",
+ " ... | \n",
+ " 645.984 | \n",
+ " 81 | \n",
+ " 55843.425 | \n",
+ " 16289.718636 | \n",
+ " -1.000000e+12 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " LINESTRING (-124.09611 40.46269, -124.09575 40... | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " 77460000051 | \n",
+ " 7.342535e+08 | \n",
+ " 7.342536e+08 | \n",
+ " 2023-04-08T07:18:42Z | \n",
+ " 40.395990 | \n",
+ " -123.930243 | \n",
+ " Eel River | \n",
+ " 3.229870e+01 | \n",
+ " 9.148000e-02 | \n",
+ " 1.638000e-02 | \n",
+ " ... | \n",
+ " 1532.658 | \n",
+ " 51 | \n",
+ " 66073.910 | \n",
+ " 10230.484650 | \n",
+ " -1.000000e+12 | \n",
+ " 0 | \n",
+ " 2 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " LINESTRING (-123.95755 40.42295, -123.95719 40... | \n",
+ "
\n",
+ " \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " 355 | \n",
+ " 78322900143 | \n",
+ " -1.000000e+12 | \n",
+ " -1.000000e+12 | \n",
+ " no_data | \n",
+ " 50.998910 | \n",
+ " -119.011806 | \n",
+ " no_data | \n",
+ " -1.000000e+12 | \n",
+ " -1.000000e+12 | \n",
+ " -1.000000e+12 | \n",
+ " ... | \n",
+ " 116183.841 | \n",
+ " 15 | \n",
+ " 59585.535 | \n",
+ " 2935.007230 | \n",
+ " -1.000000e+12 | \n",
+ " 0 | \n",
+ " 1 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " LINESTRING (-119.03134 51.00406, -119.03105 51... | \n",
+ "
\n",
+ " \n",
+ " 356 | \n",
+ " 78322900153 | \n",
+ " 7.342537e+08 | \n",
+ " 7.342537e+08 | \n",
+ " 2023-04-08T07:21:51Z | \n",
+ " 51.047442 | \n",
+ " -119.042215 | \n",
+ " no_data | \n",
+ " 3.451806e+02 | \n",
+ " 1.114110e+00 | \n",
+ " 1.110470e+00 | \n",
+ " ... | \n",
+ " 41059.043 | \n",
+ " 51 | \n",
+ " 30434.699 | \n",
+ " 10168.113068 | \n",
+ " -1.000000e+12 | \n",
+ " 0 | \n",
+ " 2 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " LINESTRING (-119.03140 51.09147, -119.03165 51... | \n",
+ "
\n",
+ " \n",
+ " 357 | \n",
+ " 78322900173 | \n",
+ " -1.000000e+12 | \n",
+ " -1.000000e+12 | \n",
+ " no_data | \n",
+ " 50.916115 | \n",
+ " -119.036919 | \n",
+ " no_data | \n",
+ " -1.000000e+12 | \n",
+ " -1.000000e+12 | \n",
+ " -1.000000e+12 | \n",
+ " ... | \n",
+ " 186564.361 | \n",
+ " 98 | \n",
+ " 39488.857 | \n",
+ " 19642.879384 | \n",
+ " -1.000000e+12 | \n",
+ " 0 | \n",
+ " 4 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " LINESTRING (-118.99201 50.99421, -118.99200 50... | \n",
+ "
\n",
+ " \n",
+ " 358 | \n",
+ " 78322900183 | \n",
+ " 7.342537e+08 | \n",
+ " 7.342537e+08 | \n",
+ " 2023-04-08T07:21:52Z | \n",
+ " 51.060235 | \n",
+ " -118.938606 | \n",
+ " no_data | \n",
+ " -1.000000e+12 | \n",
+ " -1.000000e+12 | \n",
+ " -1.000000e+12 | \n",
+ " ... | \n",
+ " 177029.325 | \n",
+ " 86 | \n",
+ " 56650.527 | \n",
+ " 17161.670624 | \n",
+ " -1.000000e+12 | \n",
+ " 0 | \n",
+ " 4 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " LINESTRING (-118.99200 50.99394, -118.99201 50... | \n",
+ "
\n",
+ " \n",
+ " 359 | \n",
+ " 78322900211 | \n",
+ " -1.000000e+12 | \n",
+ " -1.000000e+12 | \n",
+ " no_data | \n",
+ " 50.549433 | \n",
+ " -119.062048 | \n",
+ " Shuswap River | \n",
+ " -1.000000e+12 | \n",
+ " -1.000000e+12 | \n",
+ " -1.000000e+12 | \n",
+ " ... | \n",
+ " 122.690 | \n",
+ " 50 | \n",
+ " 103956.987 | \n",
+ " 10074.432813 | \n",
+ " -1.000000e+12 | \n",
+ " 0 | \n",
+ " 2 | \n",
+ " 1 | \n",
+ " 0 | \n",
+ " LINESTRING (-119.11242 50.54684, -119.11207 50... | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
360 rows × 127 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " reach_id time time_tai time_str p_lat \\\n",
+ "0 77460000013 7.342535e+08 7.342536e+08 2023-04-08T07:18:42Z 40.621824 \n",
+ "1 77460000021 7.342535e+08 7.342536e+08 2023-04-08T07:18:42Z 40.542406 \n",
+ "2 77460000031 7.342535e+08 7.342536e+08 2023-04-08T07:18:42Z 40.494638 \n",
+ "3 77460000041 7.342535e+08 7.342536e+08 2023-04-08T07:18:42Z 40.447111 \n",
+ "4 77460000051 7.342535e+08 7.342536e+08 2023-04-08T07:18:42Z 40.395990 \n",
+ ".. ... ... ... ... ... \n",
+ "355 78322900143 -1.000000e+12 -1.000000e+12 no_data 50.998910 \n",
+ "356 78322900153 7.342537e+08 7.342537e+08 2023-04-08T07:21:51Z 51.047442 \n",
+ "357 78322900173 -1.000000e+12 -1.000000e+12 no_data 50.916115 \n",
+ "358 78322900183 7.342537e+08 7.342537e+08 2023-04-08T07:21:52Z 51.060235 \n",
+ "359 78322900211 -1.000000e+12 -1.000000e+12 no_data 50.549433 \n",
+ "\n",
+ " p_lon river_name wse wse_u wse_r_u ... \\\n",
+ "0 -124.244823 Eel River 2.320100e+00 9.653000e-02 3.490000e-02 ... \n",
+ "1 -124.156177 Eel River 9.248800e+00 9.071000e-02 1.130000e-02 ... \n",
+ "2 -124.107178 Eel River 1.970160e+01 5.754600e-01 5.683800e-01 ... \n",
+ "3 -124.021272 Eel River 3.471650e+01 1.486718e+01 1.486691e+01 ... \n",
+ "4 -123.930243 Eel River 3.229870e+01 9.148000e-02 1.638000e-02 ... \n",
+ ".. ... ... ... ... ... ... \n",
+ "355 -119.011806 no_data -1.000000e+12 -1.000000e+12 -1.000000e+12 ... \n",
+ "356 -119.042215 no_data 3.451806e+02 1.114110e+00 1.110470e+00 ... \n",
+ "357 -119.036919 no_data -1.000000e+12 -1.000000e+12 -1.000000e+12 ... \n",
+ "358 -118.938606 no_data -1.000000e+12 -1.000000e+12 -1.000000e+12 ... \n",
+ "359 -119.062048 Shuswap River -1.000000e+12 -1.000000e+12 -1.000000e+12 ... \n",
+ "\n",
+ " p_wid_var p_n_nodes p_dist_out p_length p_maf p_dam_id \\\n",
+ "0 23702.805 96 19376.986 19194.609276 -1.000000e+12 0 \n",
+ "1 3435.524 51 29478.836 10101.849934 -1.000000e+12 0 \n",
+ "2 1202.549 50 39553.707 10074.871060 -1.000000e+12 0 \n",
+ "3 645.984 81 55843.425 16289.718636 -1.000000e+12 0 \n",
+ "4 1532.658 51 66073.910 10230.484650 -1.000000e+12 0 \n",
+ ".. ... ... ... ... ... ... \n",
+ "355 116183.841 15 59585.535 2935.007230 -1.000000e+12 0 \n",
+ "356 41059.043 51 30434.699 10168.113068 -1.000000e+12 0 \n",
+ "357 186564.361 98 39488.857 19642.879384 -1.000000e+12 0 \n",
+ "358 177029.325 86 56650.527 17161.670624 -1.000000e+12 0 \n",
+ "359 122.690 50 103956.987 10074.432813 -1.000000e+12 0 \n",
+ "\n",
+ " p_n_ch_max p_n_ch_mod p_low_slp \\\n",
+ "0 4 1 0 \n",
+ "1 2 1 0 \n",
+ "2 2 1 0 \n",
+ "3 1 1 0 \n",
+ "4 2 1 0 \n",
+ ".. ... ... ... \n",
+ "355 1 1 0 \n",
+ "356 2 1 0 \n",
+ "357 4 1 0 \n",
+ "358 4 1 0 \n",
+ "359 2 1 0 \n",
+ "\n",
+ " geometry \n",
+ "0 LINESTRING (-124.29069 40.66364, -124.29104 40... \n",
+ "1 LINESTRING (-124.16119 40.58421, -124.16097 40... \n",
+ "2 LINESTRING (-124.13864 40.50871, -124.13829 40... \n",
+ "3 LINESTRING (-124.09611 40.46269, -124.09575 40... \n",
+ "4 LINESTRING (-123.95755 40.42295, -123.95719 40... \n",
+ ".. ... \n",
+ "355 LINESTRING (-119.03134 51.00406, -119.03105 51... \n",
+ "356 LINESTRING (-119.03140 51.09147, -119.03165 51... \n",
+ "357 LINESTRING (-118.99201 50.99421, -118.99200 50... \n",
+ "358 LINESTRING (-118.99200 50.99394, -118.99201 50... \n",
+ "359 LINESTRING (-119.11242 50.54684, -119.11207 50... \n",
+ "\n",
+ "[360 rows x 127 columns]"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Get the link for the first zip file\n",
+ "river_link = earthaccess.results.DataGranule.data_links(river_results[0], access='direct')[0]\n",
+ "\n",
+ "# We use the zip+ prefix so fiona knows that we are operating on a zip file\n",
+ "river_shp_url = f\"zip+{river_link}\"\n",
+ "\n",
+ "with fiona.Env(session=fiona_session):\n",
+ " SWOT_HR_shp1 = gpd.read_file(river_shp_url) \n",
+ "\n",
+ "#view the attribute table\n",
+ "SWOT_HR_shp1 "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "tags": []
+ },
+ "source": [
+ "#### Quickly plot the SWOT river data"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Simple plot\n",
+ "fig, ax = plt.subplots(figsize=(7,5))\n",
+ "SWOT_HR_shp1.plot(ax=ax, color='black')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [],
+ "source": [
+ "# # Another way to plot geopandas dataframes is with `explore`, which also plots a basemap\n",
+ "# SWOT_HR_shp1.explore()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### **2. Lake Vector Shapefiles**"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The lake vector shapefiles can be accessed in the same way as the river shapefiles above. \n",
+ "\n",
+ "For additional tips on spatial searching of SWOT HR L2 data, see also [PO.DAAC Cookbook - SWOT Chapter tips section](https://podaac.github.io/tutorials/quarto_text/SWOT.html#tips-for-swot-hr-spatial-search)."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "tags": []
+ },
+ "source": [
+ "#### Search for data of interest"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Granules found: 14\n"
+ ]
+ }
+ ],
+ "source": [
+ "lake_results = earthaccess.search_data(short_name = 'SWOT_L2_HR_LAKESP_1.1', \n",
+ " temporal = ('2023-04-08 00:00:00', '2023-04-22 23:59:59'),\n",
+ " granule_name = '*Obs*_013_NA*') # here we filter by files with 'Obs' in the name (This collection has three options: Obs, Unassigned, and Prior), pass #13 and continent code=NA"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Set up an `s3fs` session for Direct Cloud Access\n",
+ "`s3fs` sessions are used for authenticated access to s3 bucket and allows for typical file-system style operations. Below we create session by passing in the data access information."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [],
+ "source": [
+ "fs_s3 = earthaccess.get_s3fs_session(results=lake_results)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Create Fiona session to work with zip and embedded shapefiles in the AWS Cloud\n",
+ "The native format for this data is a .zip file, and we want the .shp file within the .zip file, so we will create a Fiona AWS session using the credentials from setting up the s3fs session above to access the shapefiles within the zip files. If we don't do this, the alternative would be to download the data to the cloud environment (e.g. EC2 instance, user S3 bucket) and extract the .zip file there."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [],
+ "source": [
+ "fiona_session=fiona.session.AWSSession(\n",
+ " aws_access_key_id=fs_s3.storage_options[\"key\"],\n",
+ " aws_secret_access_key=fs_s3.storage_options[\"secret\"],\n",
+ " aws_session_token=fs_s3.storage_options[\"token\"]\n",
+ " )"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " obs_id | \n",
+ " lake_id | \n",
+ " overlap | \n",
+ " n_overlap | \n",
+ " reach_id | \n",
+ " time | \n",
+ " time_tai | \n",
+ " time_str | \n",
+ " wse | \n",
+ " wse_u | \n",
+ " ... | \n",
+ " load_tidef | \n",
+ " load_tideg | \n",
+ " pole_tide | \n",
+ " dry_trop_c | \n",
+ " wet_trop_c | \n",
+ " iono_c | \n",
+ " xovr_cal_c | \n",
+ " lake_name | \n",
+ " p_res_id | \n",
+ " geometry | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " 781229R000006 | \n",
+ " 7810001133 | \n",
+ " 85 | \n",
+ " 1 | \n",
+ " no_data | \n",
+ " 7.342536e+08 | \n",
+ " 7.342536e+08 | \n",
+ " 2023-04-08T07:19:21Z | \n",
+ " 593.993 | \n",
+ " 0.011 | \n",
+ " ... | \n",
+ " -0.019138 | \n",
+ " -0.018407 | \n",
+ " -0.002311 | \n",
+ " -2.164411 | \n",
+ " -0.074947 | \n",
+ " -0.003339 | \n",
+ " -1.000000e+12 | \n",
+ " APPLEGATE RESERVOIR;APPLEGATE LAKE | \n",
+ " 116 | \n",
+ " MULTIPOLYGON (((-123.10728 42.03437, -123.1073... | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " 782232R000018 | \n",
+ " 7820002572;7820002253 | \n",
+ " 86;80 | \n",
+ " 2 | \n",
+ " no_data | \n",
+ " 7.342536e+08 | \n",
+ " 7.342536e+08 | \n",
+ " 2023-04-08T07:19:51Z | \n",
+ " 439.811 | \n",
+ " 0.167 | \n",
+ " ... | \n",
+ " -0.016663 | \n",
+ " -0.016105 | \n",
+ " -0.002303 | \n",
+ " -2.199668 | \n",
+ " -0.069287 | \n",
+ " -0.003153 | \n",
+ " -1.000000e+12 | \n",
+ " HILLS CREEK RESERVOIR | \n",
+ " -99999999 | \n",
+ " MULTIPOLYGON (((-122.45387 43.68914, -122.4539... | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " 782243R000013 | \n",
+ " 7820039162 | \n",
+ " 10 | \n",
+ " 1 | \n",
+ " no_data | \n",
+ " 7.342537e+08 | \n",
+ " 7.342537e+08 | \n",
+ " 2023-04-08T07:21:40Z | \n",
+ " 341.457 | \n",
+ " 0.003 | \n",
+ " ... | \n",
+ " -0.009852 | \n",
+ " -0.009920 | \n",
+ " -0.002187 | \n",
+ " -2.211506 | \n",
+ " -0.079803 | \n",
+ " -0.002515 | \n",
+ " -1.000000e+12 | \n",
+ " WHITEMAN CREEK;OKANAGAN LAKE;OKANAGAN | \n",
+ " -99999999 | \n",
+ " MULTIPOLYGON (((-119.72285 49.72639, -119.7227... | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " 782243R015586 | \n",
+ " 7820039162 | \n",
+ " 17 | \n",
+ " 1 | \n",
+ " no_data | \n",
+ " 7.342537e+08 | \n",
+ " 7.342537e+08 | \n",
+ " 2023-04-08T07:21:48Z | \n",
+ " 341.513 | \n",
+ " 0.028 | \n",
+ " ... | \n",
+ " -0.009454 | \n",
+ " -0.009599 | \n",
+ " -0.002172 | \n",
+ " -2.209661 | \n",
+ " -0.079193 | \n",
+ " -0.002491 | \n",
+ " -1.000000e+12 | \n",
+ " WHITEMAN CREEK;OKANAGAN LAKE;OKANAGAN | \n",
+ " -99999999 | \n",
+ " MULTIPOLYGON (((-119.49606 50.06182, -119.4961... | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " 783245R000005 | \n",
+ " 7830263943 | \n",
+ " 32 | \n",
+ " 1 | \n",
+ " 78322700063;78322700091;78322800011;7832290001... | \n",
+ " 7.342537e+08 | \n",
+ " 7.342537e+08 | \n",
+ " 2023-04-08T07:22:01Z | \n",
+ " 344.832 | \n",
+ " 0.014 | \n",
+ " ... | \n",
+ " -0.009029 | \n",
+ " -0.009206 | \n",
+ " -0.002157 | \n",
+ " -2.207273 | \n",
+ " -0.082830 | \n",
+ " -0.002465 | \n",
+ " -1.000000e+12 | \n",
+ " ROSS CREEK;EAGLE RIVER;SHUSWAP;LITTLE RIVER;SC... | \n",
+ " -99999999 | \n",
+ " MULTIPOLYGON (((-119.35814 50.94441, -119.3580... | \n",
+ "
\n",
+ " \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " 831 | \n",
+ " 783246R009013 | \n",
+ " 7830249372;7830249352 | \n",
+ " 81;71 | \n",
+ " 2 | \n",
+ " no_data | \n",
+ " 7.342537e+08 | \n",
+ " 7.342538e+08 | \n",
+ " 2023-04-08T07:22:13Z | \n",
+ " 1837.232 | \n",
+ " 0.563 | \n",
+ " ... | \n",
+ " -0.008546 | \n",
+ " -0.008791 | \n",
+ " -0.002133 | \n",
+ " -2.094712 | \n",
+ " -0.066065 | \n",
+ " -0.002440 | \n",
+ " -1.000000e+12 | \n",
+ " no_data | \n",
+ " -99999999 | \n",
+ " MULTIPOLYGON (((-118.98292 51.59811, -118.9830... | \n",
+ "
\n",
+ " \n",
+ " 832 | \n",
+ " 783246R009931 | \n",
+ " 7830249332 | \n",
+ " 87 | \n",
+ " 1 | \n",
+ " no_data | \n",
+ " 7.342537e+08 | \n",
+ " 7.342538e+08 | \n",
+ " 2023-04-08T07:22:14Z | \n",
+ " 1635.514 | \n",
+ " 0.325 | \n",
+ " ... | \n",
+ " -0.008539 | \n",
+ " -0.008785 | \n",
+ " -0.002132 | \n",
+ " -2.136184 | \n",
+ " -0.071612 | \n",
+ " -0.002440 | \n",
+ " -1.000000e+12 | \n",
+ " no_data | \n",
+ " -99999999 | \n",
+ " POLYGON ((-118.98463 51.61215, -118.98453 51.6... | \n",
+ "
\n",
+ " \n",
+ " 833 | \n",
+ " 783246R010740 | \n",
+ " 7830243082 | \n",
+ " 82 | \n",
+ " 1 | \n",
+ " no_data | \n",
+ " 7.342537e+08 | \n",
+ " 7.342538e+08 | \n",
+ " 2023-04-08T07:22:14Z | \n",
+ " 2094.295 | \n",
+ " 5.792 | \n",
+ " ... | \n",
+ " -0.008558 | \n",
+ " -0.008815 | \n",
+ " -0.002135 | \n",
+ " -1.942940 | \n",
+ " -0.048756 | \n",
+ " -0.002438 | \n",
+ " -1.000000e+12 | \n",
+ " no_data | \n",
+ " -99999999 | \n",
+ " MULTIPOLYGON (((-119.07615 51.67504, -119.0759... | \n",
+ "
\n",
+ " \n",
+ " 834 | \n",
+ " 783246R010910 | \n",
+ " 7830256902 | \n",
+ " 21 | \n",
+ " 1 | \n",
+ " no_data | \n",
+ " 7.342537e+08 | \n",
+ " 7.342538e+08 | \n",
+ " 2023-04-08T07:22:14Z | \n",
+ " 1996.670 | \n",
+ " 0.303 | \n",
+ " ... | \n",
+ " -0.008524 | \n",
+ " -0.008775 | \n",
+ " -0.002132 | \n",
+ " -1.863152 | \n",
+ " -0.041920 | \n",
+ " -0.002443 | \n",
+ " -1.000000e+12 | \n",
+ " no_data | \n",
+ " -99999999 | \n",
+ " POLYGON ((-118.97489 51.63692, -118.97478 51.6... | \n",
+ "
\n",
+ " \n",
+ " 835 | \n",
+ " 782246R012796 | \n",
+ " 7820071012 | \n",
+ " 75 | \n",
+ " 1 | \n",
+ " no_data | \n",
+ " 7.342537e+08 | \n",
+ " 7.342538e+08 | \n",
+ " 2023-04-08T07:22:15Z | \n",
+ " 1962.504 | \n",
+ " 0.385 | \n",
+ " ... | \n",
+ " -0.008469 | \n",
+ " -0.008730 | \n",
+ " -0.002128 | \n",
+ " -2.104326 | \n",
+ " -0.068847 | \n",
+ " -0.002438 | \n",
+ " -1.000000e+12 | \n",
+ " no_data | \n",
+ " -99999999 | \n",
+ " POLYGON ((-118.88701 51.66364, -118.88710 51.6... | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
836 rows × 36 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " obs_id lake_id overlap n_overlap \\\n",
+ "0 781229R000006 7810001133 85 1 \n",
+ "1 782232R000018 7820002572;7820002253 86;80 2 \n",
+ "2 782243R000013 7820039162 10 1 \n",
+ "3 782243R015586 7820039162 17 1 \n",
+ "4 783245R000005 7830263943 32 1 \n",
+ ".. ... ... ... ... \n",
+ "831 783246R009013 7830249372;7830249352 81;71 2 \n",
+ "832 783246R009931 7830249332 87 1 \n",
+ "833 783246R010740 7830243082 82 1 \n",
+ "834 783246R010910 7830256902 21 1 \n",
+ "835 782246R012796 7820071012 75 1 \n",
+ "\n",
+ " reach_id time \\\n",
+ "0 no_data 7.342536e+08 \n",
+ "1 no_data 7.342536e+08 \n",
+ "2 no_data 7.342537e+08 \n",
+ "3 no_data 7.342537e+08 \n",
+ "4 78322700063;78322700091;78322800011;7832290001... 7.342537e+08 \n",
+ ".. ... ... \n",
+ "831 no_data 7.342537e+08 \n",
+ "832 no_data 7.342537e+08 \n",
+ "833 no_data 7.342537e+08 \n",
+ "834 no_data 7.342537e+08 \n",
+ "835 no_data 7.342537e+08 \n",
+ "\n",
+ " time_tai time_str wse wse_u ... load_tidef \\\n",
+ "0 7.342536e+08 2023-04-08T07:19:21Z 593.993 0.011 ... -0.019138 \n",
+ "1 7.342536e+08 2023-04-08T07:19:51Z 439.811 0.167 ... -0.016663 \n",
+ "2 7.342537e+08 2023-04-08T07:21:40Z 341.457 0.003 ... -0.009852 \n",
+ "3 7.342537e+08 2023-04-08T07:21:48Z 341.513 0.028 ... -0.009454 \n",
+ "4 7.342537e+08 2023-04-08T07:22:01Z 344.832 0.014 ... -0.009029 \n",
+ ".. ... ... ... ... ... ... \n",
+ "831 7.342538e+08 2023-04-08T07:22:13Z 1837.232 0.563 ... -0.008546 \n",
+ "832 7.342538e+08 2023-04-08T07:22:14Z 1635.514 0.325 ... -0.008539 \n",
+ "833 7.342538e+08 2023-04-08T07:22:14Z 2094.295 5.792 ... -0.008558 \n",
+ "834 7.342538e+08 2023-04-08T07:22:14Z 1996.670 0.303 ... -0.008524 \n",
+ "835 7.342538e+08 2023-04-08T07:22:15Z 1962.504 0.385 ... -0.008469 \n",
+ "\n",
+ " load_tideg pole_tide dry_trop_c wet_trop_c iono_c xovr_cal_c \\\n",
+ "0 -0.018407 -0.002311 -2.164411 -0.074947 -0.003339 -1.000000e+12 \n",
+ "1 -0.016105 -0.002303 -2.199668 -0.069287 -0.003153 -1.000000e+12 \n",
+ "2 -0.009920 -0.002187 -2.211506 -0.079803 -0.002515 -1.000000e+12 \n",
+ "3 -0.009599 -0.002172 -2.209661 -0.079193 -0.002491 -1.000000e+12 \n",
+ "4 -0.009206 -0.002157 -2.207273 -0.082830 -0.002465 -1.000000e+12 \n",
+ ".. ... ... ... ... ... ... \n",
+ "831 -0.008791 -0.002133 -2.094712 -0.066065 -0.002440 -1.000000e+12 \n",
+ "832 -0.008785 -0.002132 -2.136184 -0.071612 -0.002440 -1.000000e+12 \n",
+ "833 -0.008815 -0.002135 -1.942940 -0.048756 -0.002438 -1.000000e+12 \n",
+ "834 -0.008775 -0.002132 -1.863152 -0.041920 -0.002443 -1.000000e+12 \n",
+ "835 -0.008730 -0.002128 -2.104326 -0.068847 -0.002438 -1.000000e+12 \n",
+ "\n",
+ " lake_name p_res_id \\\n",
+ "0 APPLEGATE RESERVOIR;APPLEGATE LAKE 116 \n",
+ "1 HILLS CREEK RESERVOIR -99999999 \n",
+ "2 WHITEMAN CREEK;OKANAGAN LAKE;OKANAGAN -99999999 \n",
+ "3 WHITEMAN CREEK;OKANAGAN LAKE;OKANAGAN -99999999 \n",
+ "4 ROSS CREEK;EAGLE RIVER;SHUSWAP;LITTLE RIVER;SC... -99999999 \n",
+ ".. ... ... \n",
+ "831 no_data -99999999 \n",
+ "832 no_data -99999999 \n",
+ "833 no_data -99999999 \n",
+ "834 no_data -99999999 \n",
+ "835 no_data -99999999 \n",
+ "\n",
+ " geometry \n",
+ "0 MULTIPOLYGON (((-123.10728 42.03437, -123.1073... \n",
+ "1 MULTIPOLYGON (((-122.45387 43.68914, -122.4539... \n",
+ "2 MULTIPOLYGON (((-119.72285 49.72639, -119.7227... \n",
+ "3 MULTIPOLYGON (((-119.49606 50.06182, -119.4961... \n",
+ "4 MULTIPOLYGON (((-119.35814 50.94441, -119.3580... \n",
+ ".. ... \n",
+ "831 MULTIPOLYGON (((-118.98292 51.59811, -118.9830... \n",
+ "832 POLYGON ((-118.98463 51.61215, -118.98453 51.6... \n",
+ "833 MULTIPOLYGON (((-119.07615 51.67504, -119.0759... \n",
+ "834 POLYGON ((-118.97489 51.63692, -118.97478 51.6... \n",
+ "835 POLYGON ((-118.88701 51.66364, -118.88710 51.6... \n",
+ "\n",
+ "[836 rows x 36 columns]"
+ ]
+ },
+ "execution_count": 12,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Get the link for the first zip file\n",
+ "lake_link = earthaccess.results.DataGranule.data_links(lake_results[0], access='direct')[0]\n",
+ "\n",
+ "# We use the zip+ prefix so fiona knows that we are operating on a zip file\n",
+ "lake_shp_url = f\"zip+{lake_link}\"\n",
+ "\n",
+ "with fiona.Env(session=fiona_session):\n",
+ " SWOT_HR_shp2 = gpd.read_file(lake_shp_url) \n",
+ "\n",
+ "#view the attribute table\n",
+ "SWOT_HR_shp2"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "tags": []
+ },
+ "source": [
+ "#### Quickly plot the SWOT lakes data"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {
+ "tags": []
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 13,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ "