{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Density Matrices notes + demo (ePSproc + PEMtk dev.)\n", "30/08/21, 24/07/24\n", "\n", "In this notebook density matrices are considered & numerical routines demonstrated.\n", "\n", "24/07/24: Updated notes and added density matrix from spherical tensor example." ] }, { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "## Density Matrices" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The general density operator, for a mixture of indepent states $|\\psi_{n} \\rangle$, can be defined as (Eqn. 2.8, Blum [1]):\n", "\n", "\\begin{equation}\n", "\\hat{\\rho}=\\sum_{n}W_{n}|\\psi_{n}\\rangle\\langle\\psi_{n}|\n", "\\end{equation}\n", "\n", "Where $W_{n}$ defines the (statistical) weighting of each state $\\psi_{n}$ in the mixture.\n", "\n", "For a given basis set, $|\\phi_{m}\\rangle$, the states can be expanded and the matrix elements of $\\boldsymbol{\\rho}$ defined (Eqns. 2.9 - 2.11, Blum [1]):\n", "\\begin{equation}\n", "| \\psi_{n} \\rangle = \\sum_{m'} a_{m'}^{(n)}| \\phi_{m'}\\rangle\n", "\\end{equation}\n", "\n", "\\begin{equation}\n", "\\hat{\\rho}=\\sum_{n}\\sum_{mm'}W_{n}a_{m'}^{(n)}a_{m}^{(n)*}|\\phi_{m'}\\rangle\\langle\\phi_{m}|\n", "\\end{equation}\n", "\n", "And the matrix elements - _the density matrix_ - given explicitly as:\n", "\n", "\\begin{equation}\n", "\\boldsymbol{\\rho}_{i,j}=\\langle\\phi_{i}|\\hat{\\rho}|\\phi_{j}\\rangle=\\sum_{n}W_{n}a_{i}^{(n)}a_{j}^{(n)*}\n", "\\end{equation}\n", "\n", "For all pairs of basis states $(i,j)$. This defines the density matrix in the $\\{|\\phi_n\\rangle\\}$ _representation_ (basis space)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The expectation value of an operator $\\hat{Q}$ can then be found as (Eqn. 2.18, Blum [1]):\n", "\n", "\\begin{eqnarray}\n", "\\langle \\hat{Q}\\rangle & = & \\sum_{n}\\sum_{mm'}W_{n}a_{m'}^{(n)}a_{m}^{(n)*}\\langle\\phi_{m}|\\hat{Q}|\\phi_{m'}\\rangle\\\\\n", " & = & \\sum_{mm'}\\langle\\phi_{m'}|\\hat{\\rho}|\\phi_{m}\\rangle\\langle\\phi_{m}|\\hat{Q}|\\phi_{m'}\\rangle\\\\\n", " & = & \\mathrm{tr}(\\rho Q)\n", "\\end{eqnarray}\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For basic examples, in terms of $|J,M\\rangle$ states and alignment, see the [Quantum Metrology with Photoelectrons notes](https://github.com/phockett/Quantum-Metrology-with-Photoelectrons/blob/master/Alignment/Alignment-1.ipynb).\n", "\n", "Here, we'll look at applying the formalism to photoionization, using `ePSproc` for the numerics...\n", "\n", "[1] Blum, K. (2012). Density Matrix Theory and Applications (3rd Editio, Vol. 64). Berlin, Heidelberg: Springer Berlin Heidelberg. https://doi.org/10.1007/978-3-642-20561-3" ] }, { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "## Setup" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "tags": [] }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "OMP: Info #276: omp_set_nested routine deprecated, please use omp_set_max_active_levels instead.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "* sparse not found, sparse matrix forms not available. \n", "* natsort not found, some sorting functions not available. \n" ] }, { "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.').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.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/jspanel.js', 'https://cdn.holoviz.org/panel/1.2.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/modal/jspanel.modal.js', 'https://cdn.holoviz.org/panel/1.2.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/tooltip/jspanel.tooltip.js', 'https://cdn.holoviz.org/panel/1.2.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/hint/jspanel.hint.js', 'https://cdn.holoviz.org/panel/1.2.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/layout/jspanel.layout.js', 'https://cdn.holoviz.org/panel/1.2.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/contextmenu/jspanel.contextmenu.js', 'https://cdn.holoviz.org/panel/1.2.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.2.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.2.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.2.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.').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.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/jspanel.js', 'https://cdn.holoviz.org/panel/1.2.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/modal/jspanel.modal.js', 'https://cdn.holoviz.org/panel/1.2.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/tooltip/jspanel.tooltip.js', 'https://cdn.holoviz.org/panel/1.2.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/hint/jspanel.hint.js', 'https://cdn.holoviz.org/panel/1.2.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/layout/jspanel.layout.js', 'https://cdn.holoviz.org/panel/1.2.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/contextmenu/jspanel.contextmenu.js', 'https://cdn.holoviz.org/panel/1.2.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.2.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.2.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.2.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" }, { "name": "stdout", "output_type": "stream", "text": [ "* Setting plotter defaults with epsproc.basicPlotters.setPlotters(). Run directly to modify, or change options in local env.\n" ] }, { "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.').replace('.dev', '-dev.');\n", " var is_dev = py_version.indexOf(\"+\") !== -1 || py_version.indexOf(\"-\") !== -1;\n", " var reloading = true;\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.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/jspanel.js', 'https://cdn.holoviz.org/panel/1.2.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/modal/jspanel.modal.js', 'https://cdn.holoviz.org/panel/1.2.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/tooltip/jspanel.tooltip.js', 'https://cdn.holoviz.org/panel/1.2.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/hint/jspanel.hint.js', 'https://cdn.holoviz.org/panel/1.2.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/layout/jspanel.layout.js', 'https://cdn.holoviz.org/panel/1.2.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/contextmenu/jspanel.contextmenu.js', 'https://cdn.holoviz.org/panel/1.2.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.2.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.2.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 = [];\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.').replace('.dev', '-dev.');\n var is_dev = py_version.indexOf(\"+\") !== -1 || py_version.indexOf(\"-\") !== -1;\n var reloading = true;\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.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/jspanel.js', 'https://cdn.holoviz.org/panel/1.2.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/modal/jspanel.modal.js', 'https://cdn.holoviz.org/panel/1.2.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/tooltip/jspanel.tooltip.js', 'https://cdn.holoviz.org/panel/1.2.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/hint/jspanel.hint.js', 'https://cdn.holoviz.org/panel/1.2.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/layout/jspanel.layout.js', 'https://cdn.holoviz.org/panel/1.2.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/contextmenu/jspanel.contextmenu.js', 'https://cdn.holoviz.org/panel/1.2.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.2.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.2.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 = [];\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" }, { "name": "stdout", "output_type": "stream", "text": [ "* Set Holoviews with bokeh.\n", "* pyevtk not found, VTK export not available. \n" ] } ], "source": [ "import sys\n", "import os\n", "from pathlib import Path\n", "import numpy as np\n", "# import epsproc as ep\n", "import xarray as xr\n", "\n", "import matplotlib.pyplot as plt\n", "\n", "from datetime import datetime as dt\n", "timeString = dt.now()\n", "\n", "import epsproc as ep\n", "\n", "# Multijob class dev code\n", "from epsproc.classes.multiJob import ePSmultiJob" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "tags": [] }, "outputs": [], "source": [ "epDemoDataPath = Path(ep.__path__[0]).parent/'data'/'photoionization'/'n2_multiorb'" ] }, { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "### Load test data" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "*** Job orb6 details\n", "Key: orb6\n", "Dir /home/jovyan/code-share/github-share/ePSproc/data/photoionization/n2_multiorb, 1 file(s).\n", "{ 'batch': 'ePS n2, batch n2_1pu_0.1-50.1eV, orbital A2',\n", " 'event': ' N2 A-state (1piu-1)',\n", " 'orbE': -17.09691397835426,\n", " 'orbLabel': '1piu-1'}\n", "\n", "*** Job orb5 details\n", "Key: orb5\n", "Dir /home/jovyan/code-share/github-share/ePSproc/data/photoionization/n2_multiorb, 1 file(s).\n", "{ 'batch': 'ePS n2, batch n2_3sg_0.1-50.1eV, orbital A2',\n", " 'event': ' N2 X-state (3sg-1)',\n", " 'orbE': -17.34181645456815,\n", " 'orbLabel': '3sg-1'}\n" ] } ], "source": [ "# Class dev code\n", "from epsproc.classes.multiJob import ePSmultiJob\n", "from epsproc.classes.base import ePSbase\n", "\n", "# Instantiate class object.\n", "# Minimally this needs just the dataPath, if verbose = 1 is set then some useful output will also be printed.\n", "data = ePSbase(epDemoDataPath, verbose = 1)\n", "\n", "# ScanFiles() - this will look for data files on the path provided, and read from them.\n", "data.scanFiles()" ] }, { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "## Density matrix functions - demo with photoionization matrix elements\n", "\n", "As of ePSproc v1.3.1-dev [commit f5e4019](https://github.com/phockett/ePSproc/commit/f5e4019686aa3a24e9fff19b273b4b03372cfe19), density matrix routines are implemented in :py:func:`epsproc.calc.density` (functional forms only).\n", "\n", "Note this currently requires [Holoviews](http://holoviews.org/) for plotting." ] }, { "cell_type": "code", "execution_count": 4, "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.').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.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/jspanel.js', 'https://cdn.holoviz.org/panel/1.2.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/modal/jspanel.modal.js', 'https://cdn.holoviz.org/panel/1.2.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/tooltip/jspanel.tooltip.js', 'https://cdn.holoviz.org/panel/1.2.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/hint/jspanel.hint.js', 'https://cdn.holoviz.org/panel/1.2.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/layout/jspanel.layout.js', 'https://cdn.holoviz.org/panel/1.2.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/contextmenu/jspanel.contextmenu.js', 'https://cdn.holoviz.org/panel/1.2.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.2.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.2.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.2.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.').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.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/jspanel.js', 'https://cdn.holoviz.org/panel/1.2.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/modal/jspanel.modal.js', 'https://cdn.holoviz.org/panel/1.2.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/tooltip/jspanel.tooltip.js', 'https://cdn.holoviz.org/panel/1.2.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/hint/jspanel.hint.js', 'https://cdn.holoviz.org/panel/1.2.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/layout/jspanel.layout.js', 'https://cdn.holoviz.org/panel/1.2.0/dist/bundled/floatpanel/jspanel4@4.12.0/dist/extensions/contextmenu/jspanel.contextmenu.js', 'https://cdn.holoviz.org/panel/1.2.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.2.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.2.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.2.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 routines\n", "from epsproc.calc import density" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Set data\n", "\n", "The routines are not currently wrapped by the main data class, so we'll just use a single sample dataset here." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "tags": [] }, "outputs": [], "source": [ "# Set data from master class\n", "k = 'orb5' # N2 orb5 (SG) dataset\n", "matE = data.data[k]['matE']\n", "selDims = {'Type':'L'}\n", "thres = 1e-2" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Plotting data n2_3sg_0.1-50.1eV_A2.inp.out, pType=a, thres=0.01, with Seaborn\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABGcAAAQGCAYAAACaf9eXAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAABJ0AAASdAHeZh94AADRKElEQVR4nOzdd1yVZePH8e8BVFRAcCO4y51758aRK1eampp7pLa0YbvnKa3nSSs1S9yampobZ45cqSjuXeYEAQcKiMo6vz98OD9PHJRxDjfq5/16+Qru+7qv67rPOQTne65hMpvNZgEAAAAAAMAQTkZ3AAAAAAAA4GlGOAMAAAAAAGAgwhkAAAAAAAADEc4AAAAAAAAYiHAGAAAAAADAQIQzAAAAAAAABiKcAQAAAAAAMBDhDAAAAAAAgIEIZwAAAAAAAAxEOAMAAAAAAGAgF6M7gCdT3LW/7VJPtvyl7FIPAAAAAABZFeEMHCPuntE9AAAAAADgsUA4A4cwJ8Qb3QUAAAAAAB4LhDNwjHhGzgAAAAAAkBqEM3AIc1ys0V0AAAAAAOCxQDgDx0iIM7oHAAAAAAA8Fghn4BjxWWvkjL+/v06cOKETJ07o4sWLcnJy0okTJ2yWDQwM1IYNG7Rv3z6FhIRIkooVK6b27durR48ecnV1TVWb77//vpYvX27zXP/+/fXee++l72YAAAAAAE8Uwhk4hDmLrTkzfvx4eXh4qHz58oqJidGNGzdSLPvNN98oJCRELVq0UM+ePRUXF6fNmzfrq6++0urVq7Vw4ULlyJEj1W3/5z//SXbsmWeeSdd9AAAAAACePIQzcIwstlvTb7/9pmLFikmSevfu/dBwZtSoUapRo4ZcXP7/x6N3794aNWqUAgIC9Ouvv+qVV15JddsdOnRIf8cBAAAAAE88J6M7gCdU3D37/LOTpGAmNerUqWMVzCRp06aNJOn06dNpattsNis6OloJCQlpug4AAAAA8HRg5Awcw067NcXExKSqXK5cuezS3sOEhYVJkvLnz5+m62rWrKno6Gg5OzurUqVKGjRokFq0aOGILgIAAAAAHkOEM3AIe605U61atVSVS+tolrSKjo7W9OnTlS1bNrVv3z5V1+TLl0+9e/dWpUqV5O7urvPnz+vnn3/WiBEj9M4772jgwIEO7TMAAAAA4PFAOAPHyGJrzmREfHy83nrrLQUHB2vMmDEqWbJkqq575513kh3r3r27OnXqpO+++05t27aVt7e3vbsLAAAAAHjMEM7AMew0rengwYN2qSe94uPjNWrUKG3fvl0DBw5U3759M1Rf7ty51a9fP3322WfauXOnunbtap+OAgAAAAAeW4QzcAw7hTOZsZZMSuLi4jRq1Cht2LBBQ4YM0dtvv22Xen19fSVJ169ft0t9AAAAAIDHG+EMHOMxn9YUGxurN998U5s3b9aIESM0cuRIu9V9/vx5SWlfWBgAAAAA8GQinIFj2GnkjBFiY2P1+uuva+vWrXrrrbc0dOjQh5a/ceOGIiIiVLBgQbm7u0u6v8uUs7OzcuTIkazs9OnTlT17djVs2NBh9wAAAAAAeHwQzsAx4uKM7oGVFStWKCQkRJIUHBwss9msKVOmWM6/9tprlq9Hjx6trVu3qnr16vL29tbKlSut6ipWrJjVLlLz58/X5MmTNW7cOHXu3FmSdOHCBQ0YMEB+fn4qXry4PDw8dO7cOS1btky3bt3Sxx9/rEKFCjnylgEAAAAAjwnCGThGFpvWtHTpUgUGBlod+/777y1fPxjOHDt2TJJ04MABHThwIFldnTp1euQW3/nz51eDBg0UFBSkdevW6c6dO/L09FTNmjXVt29f1apVKyO3AwAAAAB4gpjMZrPZ6E7gyXNnxmi71JNzwDd2qQcAAAAAgKyKkTNwCHMWm9YEAAAAAEBWRTgDxyCcAQAAAAAgVQhn4BgJCUb3AAAAAACAxwLhDBwji42c8ff314kTJ3TixAldvHhRTk5OOnHiRIrl4+PjNXPmTC1dulTBwcHy9PSUn5+f3nzzTXl5eaW63eDgYE2YMEG7du1STEyMSpYsqV69eqlr1672uC0AAAAAwBOAcAYOYY7NWrs1jR8/Xh4eHipfvrxiYmJ048aNh5YfM2aMVq1apaZNm2rAgAG6fPmy5syZowMHDmjRokXKlSvXI9sMDQ3Vyy+/rKioKL366qvy9fXV5s2b9dFHHyksLEwjRoyw1+0BAAAAAB5jhDNwjCw2rem3335TsWLFJEm9e/d+aDize/durVq1Ss2aNdOPP/5oOV6xYkW9/vrrmjlzZqqClQkTJujq1auaNGmSWrZsKUnq1q2bhg4dqh9//FEdOnRQ0aJFM3hnAAAAAIDHnZPRHcATKi7OLv9iYmJS9e9RkoKZ1Fi5cqUkqV+/flbHW7VqJR8fH8v5h7lz5442bNggX19fSzCTpF+/foqPj9fq1atT3ScAAAAAwJOLkTNwCHtNa6perVqqyp0+fdou7UnS4cOH5eTkpKpVqyY7V61aNQUEBOjmzZvy9PRMsY4zZ87o7t27KdZhMpl05MgRu/UZAAAAAPD4IpyBY2SxaU1pERoaKi8vL2XPnj3ZuUKFClnKPCycCQ0NlSQVLlw42bns2bPLy8tLYWFh9ukwAAAAAOCxRjgDhzDH2iecOXjwoF3qSYu7d+8qT548Ns/lyJHDUuZh7ty5I0k2A56kepLKAAAAAACeboQzcAw7TWtKza5I9ubq6qrY2Fib5+7du2cp8zA5c+aUpIfWk5YtuQEAAAAATy7CGTiEOe7xndZUuHBhnT9/XrGxsclGviRNRbI1XemfdUj/P73pQbGxsYqIiFCVKlXs1GMAAJCZ/vvf/+rYsWM6f/68IiIi5OrqqiJFiqh58+Z65ZVXsswHMLt27dKOHTt08uRJnTp1Sjdv3lT16tW1cOFCo7sGAPgHdmuCQ5jjE+3yzwiVK1dWYmKiDh8+nOzcwYMHVaxYsYeuNyNJZcqUUY4cOXTo0KFk5w4dOiSz2azKlSvbqccAACAzzZkzR3fu3FH9+vXVp08ftW/fXs7Ozpo0aZJefPFFXblyxeguSpLmz5+vWbNm6eDBgypYsKDR3QEAPAQjZ+AQ5lhjghV76NChg1asWKGZM2eqVq1aluMbN25UcHCwRo4caVX+xo0bioiIUMGCBeXu7i7p/rSmli1bavXq1dq4caPVdtozZ86Ui4uL2rVrlzk3BAAA7CooKMiyDt2Dvv32W/3000+aOnWqPvvss8zv2D8MGjRIb731lkqVKqUrV67Iz8/P6C4BAFJAOAOHMMeaje6ClRUrVigkJESSFBwcLLPZrClTpljOv/baa5av69evr3bt2ikgIEBDhw6Vn5+fLl++rNmzZ+uZZ55Rv379rOqeP3++Jk+erHHjxqlz586W42+//bZ2796td999V8ePH5evr682b96srVu36rXXXlOxYsUcfNcAAMARbAUzktS6dWv99NNPunDhguVYbGysfvnlFy1fvlyXL19WbGys8uXLp7Jly6p3796qX7++VR2rVq3SrFmzdPbsWeXOnVsNGjTQ6NGjNXr0aAUGBur06dOp7me1atXSd4MAgExHOAOHMMdnrXBm6dKlCgwMtDr2/fffW75+MJyRpK+++kplypTRsmXL9Pnnn8vT01MdOnTQm2++qdy5c6eqzSJFiuiXX37Rt99+q19++UUxMTEqUaKE/vWvf+nll1/O+E0BAIAsZcuWLZKksmXLWo6NGTNGAQEBKlOmjDp06CBXV1eFh4crKChIO3bssApnpk2bpm+++UZ58uRRx44d5e7urj/++EM9evSwjM4FADyZTGazOWu9i8YT4VrrxnapJ/+6bXapBwAAwN5mzJihmJgYRUVF6dixYwoKClLZsmU1e/Zs5c2bV1FRUapVq5YqVKigJUuWyNnZ2er6iIgIy+LBly5d0gsvvCB3d3ctX75c3t7ekiSz2axRo0ZpzZo1kpSmkTMPunz5svz8/FgQGACyKEbOwCESbe8gDQAA8MSYOXOmrl27Zvm+YcOG+uqrr5Q3b15JkslkktlsVvbs2eXklHwfjgd3dVq9erXi4+PVq1cvSzCTVMeoUaO0fv16JSQ8vrthAgAejnAGDmFOMBndBQAAAIfatWuXJOnatWs6ePCgvvnmG3Xs2FFTp05VxYoV5ebmpqZNm2rr1q3q0KGDWrZsqZo1a6pKlSrKmTOnVV0nT56UJNWoUSNZOz4+PipcuLCCg4MtxyIjIzVnzpxkZV999VV5eHjY8zYBAJmAcAYOkRBLOAMAAJ4O+fPnV4sWLVShQgW1atVK7733ngICAiRJ3333naZNm6aAgABNmjRJ0v0FhZPK5c+fX5IUFRVlqSulNv4ZzkyePDlZuU6dOhHOAMBjiHAGDpEQl3zorpEmTZpk8w+YB23fvl2FChVK8fyyZcs0ZswYm+cqVqyoZcuWZaiPAADg8ebj46NnnnlGJ0+e1I0bN5Q3b165urpq5MiRGjlypK5cuaJ9+/Zp+fLlWrVqlYKDg7VgwQJJkpubm6T7o3CeffbZZHU/OH1Kknx9fdO9/gwAIOshnIFDJGaxaU0tWrSwuXV1SEiIvvvuO1WsWPGhwcyDhg4dqlKlSlkd8/T0tEc3AQDAYy48PFySki3+K0ne3t568cUX1a5dO73wwgsKCgqyLApcvnx5/fbbbwoKClK9evWsrgsODlZoaGim9B8AYAzCGThEVhs5U65cOZUrVy7Z8e+++06S1K1bt1TXVb9+fdWpU8deXQMAAI+Rc+fOKX/+/Mm2tk5MTNT333+v69evq1q1asqTJ49u3Lihq1evWm2tLUkxMTGKiYmRi4uLsmXLJklq3769pkyZop9//lldunSx2q1pwoQJLAYMAE84whk4RHy8fcKZmJiYVJXLlStXmutOSEjQsmXLlCtXLrVr1y5N196+fVvZsmVT9uzZ09wuAAB4fG3btk0TJkxQjRo15OvrK09PT127dk379u3TpUuXVKBAAX3xxReSpLCwMHXs2FFlypRR2bJl5e3trejoaP3++++6evWqevfubZnOVKxYMb3++uuaMGGCOnTooNatW8vd3V1//PGHbt68qXLlyqV5GtP+/fv166+/Svr/v6kuXLig999/31Lmq6++ssfDAgDIIMIZOESCncKZatWqpapceuZcb9++XWFhYerSpYvlD6PUeO211xQdHS1JKl68uLp27ap+/frJxYUfJwAAnnT169fXxYsXFRQUpBMnTigqKko5c+ZUiRIl1KFDB/Xu3dsy3dnHx0cjR45UYGCg9u7dq4iICHl6eqpkyZIaNWqU2rZta1X3kCFDVKhQIc2ePVvLli1T7ty51aBBA73zzjsaMGBAmv5ekaSLFy9q+fLlVseuX79udYxwBgCyBpPZbDYb3Qk8eY6VSttIlJR0yfZnqsqlJ5wZNmyYtmzZosWLF6tKlSqPLL927Vpt3LhR9evXV4ECBRQWFqaVK1fqwIEDatq0qaZMmSInp6w1nQsAADz+oqOjVb9+fZUvX16LFi0yujsAAAfgo344RHyCfUKKg8cO2qWefwoPD9e2bdtUpkyZVAUzktSmTRu1adPG6tjLL7+sUaNGac2aNVq3bl2yT8AAAABS68aNG3J3d7esQyNJ8fHx+uqrr3Tv3j01b97cwN4BAByJcAYOYa9wJj1ryaTGsmXLlJCQkKaFgG0xmUwaPny41qxZo61btxLOAACAdNuwYYMmTpyo+vXrq3Dhwrp165b27dun8+fPq3z58urdu7fRXQQAOAjhDBwiITHrTu8xm8369ddf5erqqg4dOmS4vqJFi0q6/2kXAABAelWpUkU1atTQvn37dPPmTUmSr6+vhg4dqkGDBsnV1dXYDgIAHIZwBg4Rn4XDmd27d+vSpUvq0KGDPDw8MlzfuXPnJEn58+fPcF0AAODpVaFCBU2ePNnobgAADEA4A4eIM5uM7kKKlixZIkkpTmm6c+eOQkJC5O7uroIFC1qOR0REyMvLy6psfHy8JkyYIEnMAwcAAAAApAvhDBwiQVlz5MyNGzf022+/qVSpUqpZs6bNMkeOHFGfPn3UqVMnq+0l27dvrxo1aqhMmTIqWLCgwsLCtHbtWp09e1Zt27ZVixYtMus2AAAAAABPkKz5DhqPvTiZ7PLP3lauXKm4uLh0LQTcvn17Xb58WXPnztVnn32m2bNny8vLS+PGjdP48eNlMmXd0UIAAMfo3bu3ypYta3Q34ABly5Z9bBbg3bt3r8qWLatJkyYZ3ZVUadasmZo1a5al2rh8+bLKli2r999/34G9AoCUMXIGDhGXRYOKfv36qV+/fg8tU6dOHZ0+fTrZ8ffee89R3QIAZBHvv/++li9fbnUsZ86c8vX1VZMmTTRo0CDlyZPH7u2WLVtWtWvX1rx589J0Xe/evRUYGGjz9xaeHJcvX5afn1+yUb14soWGhur777/Xjh07dPPmTRUsWFB+fn4aMWJEmv8/dPPmTf3www/avHmzwsPD5enpqYYNG+qNN95Q4cKFk5Vfv3699u3bp5MnT+rUqVO6ffu22rdvr2+++cZetwfgHwhn4BCOGPUCAEBm8fPzU/ny5SVJV69e1datWzVt2jRt2LBBS5Yskaenp7EdBPBEu3jxorp3767r16/Lz89PpUqV0pEjRzR37lzt2LFDCxcuTLYWYkoiIiLUvXt3nT9/XnXr1lWbNm30999/a9myZdq2bZsWLVpk2X00yY8//qhTp04pV65cKly4sP7++29H3CaABxDOwCESsujIGQAAUqN58+bq3Lmz5fvbt2+rW7du+uuvv/Tzzz9rxIgRBvYOwJPu888/1/Xr1/XRRx9ZTa8bN26cZs+erW+//Vb/+te/UlXXt99+q/Pnz6tfv35W07bmzp2rL7/8Up999plmzJhhdc2YMWNUuHBhFS9eXIGBgerTp499bgxAilhzBg4RazLZ5Z89lS1bNsV/Z86cSVUdd+7c0TfffKNmzZqpUqVKatasmcaPH687d+7Yta8AgKwld+7c6tixo6T7C8c/SmJiohYuXKguXbqoWrVqqlq1qrp06aIFCxYoMTHRUm7ZsmWWNWsCAwOtfjc9bP2QpPUxAgMDJVn/juvdu7cSEhLUuHFjVa9eXbdv37ZZx7///W+VLVtW69evtxxLuj4sLEzvvPOO6tWrp8qVK6tz585avXp1iv3ZsWOHBg0apDp16qhSpUpq3ry5vv76a0VGRj7yscoMUVFRmj59uvr06aNGjRqpUqVKqlu3roYOHaqDBw8+9NrUPhZms1nLly9X9+7dVbduXT333HNq3LixBgwYoLVr16a775MmTZKfn58kafny5VbP9bJly5KVP3nypAYPHqyaNWuqSpUq6tWrlw4cOGCz3rJly2rv3r1avXq1unbtqmrVqlmt03Lnzh1NnTpVHTp0UNWqVVWtWjW9/PLLCggIsMv9x8TE6Ouvv1aTJk1UqVIltWjRQv7+/jKbzTbLr127Vq+88opq1KihypUrq3379po6dapiY2NT9VhKUnR0tMaNG6dGjRrpueee0wsvvKBZs2al2KYRLl68qJ07d8rHx0evvPKK1bmRI0cqV65cWrVqlWJiYh5Z1+3bt7Vy5UrlypUrWajcq1cv+fj4aOfOnbp06ZLVubp166pEiRKsqQhkIkbOwCHisuj/x2vWrGlzMWBvb+9HXpuQkKDBgwcrMDBQHTp0UK1atXTq1CnNmDFDR44c0axZs+TkRN4JAE+qpDdvqXmz8s477yggIEDe3t566aWXZDKZtGnTJn3++ecKCgrS+PHjJUnly5fXiBEjNHnyZPn4+KhTp06WOmrXrp1i/R4eHhoxYoSWL1+u4OBgqzddPj4+cnZ2VteuXTVp0iStWbMm2e++u3fvatWqVSpQoIDljX+SW7duqUePHnJ3d1fnzp0VFRWldevWafTo0QoLC9PAgQOtyk+ePFmTJk2Sp6enmjRporx58+rMmTOaOXOmtm/frkWLFsnNze2Rj5kjnT17Vt99951q1qypJk2ayMPDQ1euXNGWLVu0Y8cO/fjjj2rUqFGy69LyWHz77beaOnWqfH191bp1a7m7u+vq1as6evSo1q9frzZt2qSr77Vr11afPn00d+5clStXTs2bN7ecS5p6l+TYsWOaPn26qlatqq5duyokJEQbN25U3759tWLFCpUqVSpZ/bNmzdKuXbvUtGlT1alTR1FRUZKkyMhIvfrqqzpx4oQqVqyoLl26KDExUTt37tSoUaP0559/6q233kr3/cfFxWnAgAEKDw9Xo0aN5OzsrE2bNmn8+PGKjY1NFiRMmDBBU6dOlZeXl9q1a6dcuXJpx44dmjBhgnbu3KkZM2Yoe/bsD30sY2Nj1bdvXx09elTlypVT+/btFRUVpSlTpliCzqxg7969kqQGDRok+9vSzc1N1atX186dO3X48GHVq1fvoXUdPnxYd+/eVYMGDZL9HDo5OalBgwZatGiR9uzZk2xqE4DMRTgDh0jIouFM0aJF1aFDh3Rdu3z5cgUGBqp379766KOPLMd9fHz09ddfa9WqVZZPVQEAT5bbt29rxYoVkqTKlSs/tGxAQIACAgJUoUIF/fzzz8qdO7ck6c0331SvXr0UEBCgJk2aqH379ipfvrzKly9vCWdGjhyZqv54eHho5MiRCgwMVHBwsM3runXrph9//FG//PJLsnBm7dq1ioyM1NChQ5UtWzarc6dPn9YLL7ygb7/91vLGcNCgQerSpYu+++47tWrVyvImbs+ePZo0aZKqVasmf39/eXh4WOpZtmyZxowZo4kTJ+qDDz545D1dvnw52WLMj9KpUyf5+vo+slzp0qW1fft25c2b1+p4aGioXnrpJctIin9Ky2OxaNEiFSpUSAEBAcqZM6dVPTdu3EjTfT2oTp068vHx0dy5c1W+fPmHvkZ+//13jRs3zmpK3i+//KJPP/3UstvkP+3Zs0eLFi1ShQoVrI6PHTtWJ06c0OjRozVo0CDL8Xv37um1117T1KlT9cILL1gCorTef3h4uMqVK6dZs2bJ1dVVkjRixAi1atVKs2fP1pAhQyyvzYMHD2rq1Kny9vbWkiVLVKBAAUnSqFGjNGLECG3dulUzZ87U0KFDH/ZQaubMmTp69Khatmyp77//PtlzmlZp3R2rdu3aqlOnziPLJa3vUqJECZvnixcvrp07d+rcuXOPDGfOnTv3yLok6fz584/sFwDHIpyBQ2TVkTPS/U9q7t27l+ZP8VauXClJyXZ76tmzp77//nutWLGCcAYAnhCbNm1ScHCwJOnatWvasmWLwsPDVaxYMfXq1euh1y5dulTS/TeOScGMJOXKlUvvvPOO+vbtqyVLlqh9+/aOuwHJsrPLhg0bdOzYMVWqVMlybtGiRXJyclLXrl2TXefs7KzRo0dbfWJftGhR9e7dW5MnT9bKlSstoxqSdpf697//bRXMSFLnzp01d+5crV69OlXhTHBwsCZPnpyme6xdu3aqwhl3d3ebxwsXLqwXXnhB8+bNU0hIiIoUKWJ1Pi2PhSS5uLjI2dk5WTv/DIUcpXr16lbBjCR16dJF//73v1OcjtetW7dkwUxERIRWrVqlSpUqWQUzkpQjRw6988472rlzp1avXm01eiet9//RRx9ZghlJypcvn/z8/LRixQqdO3dOZcqUkfT/P1PDhg2zBDNJ7b333nvatm2blixZ8shwZtmyZXJyctI777yT4nOaFmktP2LEiFSFM9HR0ZJSft0mHU8a5fQwSWVS+rs3LXUBcCzCGThEnJ3qSc1cWun+H7ypsWHDBq1atUoJCQlyd3dXkyZN9Oabbz7yDzuz2ayjR4+qYMGC8vHxsTrn6uqq8uXL6+jRo6nqAwAg69u8ebM2b94s6f7/5318fNS+fXsNHjz4kVvYnjhxQk5OTjanJdWqVUvOzs46efKkQ/r9Tz179tSGDRu0aNEiSzhz+vRpHTp0SI0aNbL5+8/b29vm9Iak+zlx4oTl2KFDh5QtWzatX7/eau2aJHFxcbpx44YiIiIeubNMnTp1HLoleFBQkObOnatDhw7p+vXriouz/mslLCwsWTiTlseiffv2mjdvntq0aaPWrVurVq1aqlatWopvsB3hwQAuSbZs2ZQvX74U1/+xNRLs6NGjSkhIkMlksjk6JD4+XpKsdvBJ6/27u7tbRm08KGlb5wf7m/Q4161bN1n5kiVLqnDhwrp8+bKioqJSbC86OloXLlyQt7e3ihUrluz8w6YRpoQt7AHYE+EMHCLeTiNnqlWrlqpyqfnlWKlSJbVq1UolSpRQbGysgoKCtGTJEu3YsUMLFixQ6dKlU7z25s2bunPnjp599lmb5wsVKqSDBw8qOjra8Hn1AICM++fUkLSIiopSnjx5bK5/4eLiIi8vL12/fj2jXUyVunXrqnTp0goICNB7770nNzc3LV68WJL08ssv27wmf/78Dz3+4CfsN2/eVHx8/CNHEMTExKR6219H+O233/T6668rR44cql+/vooVK6acOXPKyclJgYGBCgwMtLmobFoeizFjxsjX11fLli2Tv7+//P395eLiokaNGun999+3GUTY2z9HLyVxcXGxWoj6Qbbu8ebNm5LuhzQP+/DpwcWm03r/D+urdH+tvyRJj/ODo2YeVKBAAYWEhCgyMvKh4Yx0f3SOLSk910ZI+lsypdEsScdTE/wllUm6/4zUBcCxCGfgEFlxWlPSkNgk7dq1U5MmTTR48GCNHTs22RaCD7p7964kpbjQXI4cOSTd39WAcAYAnm7u7u66deuW4uLikq3nEh8fr4iIiEz9XdG9e3d9+eWXWr16tTp16qRVq1apUKFCatq0qc3y165de+jxB9/Eubm5yWw222UxVUeuOfP9998rW7ZsWrp0abIPYz755JMU+5+Wx8LZ2Vl9+/ZV3759df36dQUFBWnNmjVav369/vrrL61Zs+aRC9YawdYC10n31bdvX40ZMyZV9Tjy/pP6c+3aNZujXq5evWpVzpakn7mUgtGUnuuHcdSaM0kLN6e0DsyFCxck3R819ChJZR5VV0pr0gDIPIQzcIg42Wc7wkdtb5lRjRs3VpUqVbRnzx7du3fPErL8U9J86JS2arx3754kJVsADwDw9Clfvrx2796t/fv3J1usc9++fUpISEi2xoeTk5PVSIHUSlo3IyEhweZaH9L9AGPChAlavHixcuTIocjISPXu3TvF8leuXNHly5eThR5JAcaDfa9atap+//13/fnnnymOLk0tR645c+HCBT377LPJgpnExEQFBQWleF1aHosH5cuXTy1btlTLli316quvas+ePTpz5ozNaUepkfRcpec1kh6VK1eWk5OT9u/fn67r7X3/5cuX1/Hjx7V3795k4cyFCxcUGhoqX1/fFEfjSPfDmeLFi+vSpUu6ePFisnrSEzA6as2ZpDI7d+5UYmKi1fo40dHROnDggHLmzKkqVao8sq4qVarI1dVVBw4cSDbCO2n3Lcn2lDEAmYt9f+EQcXb6lytXrlT9ywhfX1/Fx8dbhvDa4unpqZw5cyo0NNTm+bCwMLm5uTFqBgBg2fVl/PjxunPnjuX4nTt3LFtov/TSS1bXeHp6pvg75mE8PT0lSSEhISmWcXd3V7t27XTixAl99913cnZ2TrZ704MSEhL0zTffWE2DuXTpkubNmycXFxe9+OKLluN9+/aVJH388ccKCwtLVldMTIwOHTqUqntJWnMmLf9S80ZXur+z4vnz5636aDabNWnSJP31118pXpfaxyJpuvQ/xcXF6datW5KsP8BZtmyZypYtq/fffz9V/ffw8JDJZNKVK1dSVT6j8uXLp/bt2+vYsWP64YcfbIZCFy9e1KVLlySl/f7TKuln6scff7Ta+SkhIUFff/21EhMTk/1M2dK5c2clJiam+JymVVpfr6ndja1YsWJq0KCBgoODNX/+fKtzkyZNUkxMjF588cVkfwOfPXtWZ8+etTqWO3dudejQQTEx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o7Zt22Z53dWsWVNDhw5VpUqVkpWPiorSxIkTtWHDBkVERMjHx0cvv/yyJeT6570XLlxYhQsXTnV/zGazfvnlF0nSO++8Y/V3YfPmzVWzZk3t379fgYGBqlu3bgbu3NqmTZu0fv16HT161PLBY6lSpdSxY0f16tUr1X+fbt68WXPnztXZs2d18+ZNeXp6qkSJEmrdurVeeeUVq7I3b97UjBkztGnTJgUHBytbtmyqVKmSBg0apAYNGtjt3oCnCeEMHCLenGB0Fx7pp59+0oYNGyy/jB+lTZs2yf4wfPnllzVq1CitWbNG69atU9u2bR3VXQBAJho1apSCgoLUsGFDNW7cWNu3b9f06dN148YNjRs3zqrs77//rjfeeEOxsbFq2LCh2rZtq8jISJ0+fVrTp0/PUDhjNps1ZswYLV++XF5eXmrRooXy5s2r0NBQ7d27VyVLlkw2dXfDhg3asWOHGjVqpO7duyskJESSFBkZqR49euivv/7Sc889p1dffVURERFat26d+vfvr88++0zdu3e31PPtt99q6tSp8vX1VevWreXu7q6rV6/q6NGjWr9+veV34qlTp9StWzeZTCY1a9ZMvr6+io6O1sWLF7Vw4UK9+eabqQpnUtueJB0/flz9+/fXrVu31KBBA7Vs2VIRERHatGmTevbsqR9++EGNGze2lI+NjdXQoUO1a9cueXt7q127dnJzc1NwcLA2bdqkGjVqqESJEurTp482b96swMBAderUKU3TgCZMmKCpU6fKy8tL7dq1U65cubRjxw5NmDBBO3fu1IwZM5IFNHFxcRowYIDCw8PVqFEjOTs7a9OmTRo/frxiY2M1YsSIVLefWim9PtJr8uTJmjRpkjw9PdWkSRPlzZtXZ86c0cyZM7V9+3YtWrRIbm5udur9/7t06ZJ69uyp8PBw1a1bV23bttWVK1e0fv16/f7775o0aZKaNm1qKX/v3j29+uqrOn78uCpUqKD27dsrKipKP/30k/bv32+XPl28eFEhISEqUaKEihYtmux8o0aNtH//fu3Zs8eu4cw333wjJycnVa5cWYUKFVJUVJT27NmjL7/8UkePHtV///vfR9axaNEiffLJJypQoICaNm0qLy8vXb9+XadPn9ayZcuswpng4GD17t1bwcHBqlmzpho2bKg7d+5o69atGjhwoP71r3+pW7dudrs/4GlBOAOHsNe0poMHD9qlnn+aM2eOvv32W9WuXVvffPNNuj+ZMplMGj58uNasWaOtW7cSzgDAE+LSpUsKCAiw7Mb31ltvqUOHDlqxYoXefvttFShQQJJ048YNjRo1SgkJCZozZ06ydSFCQ0Mz1I/Fixdr+fLleu655zRr1iyrNSYSEhJ0/fr1ZNds27ZN/v7+atSokdXxb775Rn/99Zdefvllff7555bffYMGDVKXLl30xRdfqEGDBpbRIIsWLVKhQoUUEBCgnDlzWtV148YNy9crVqzQvXv39MMPPySbYnPr1q1k16Ykte3Fx8frzTffVExMjObOnWv1mIeFhemll17Shx9+qC1btljCkMmTJ2vXrl1q2rSpJk6caBWSxMbGWqYr9+3bV1FRUZZwJrULAh88eFBTp06Vt7e3lixZYnl9jBo1SiNGjNDWrVs1c+ZMDR061Oq68PBwlStXTrNmzZKrq6skacSIEWrVqpVmz56tIUOGpCrYSouUXh/psWfPHk2aNEnVqlWTv7+/1SiZpJE6EydO1AcffJDhtv7ps88+U3h4uN58800NGzbMcrxnz57q1auX3n//fW3ZskW5c+eWJE2fPl3Hjx9X27ZtNX78eMvrf9iwYan6kC41zp07J0kqWbKkzfNJiwifP38+TfUGBgZq0qRJyY536tRJvr6+8vf3V7FixazOJSYmasyYMVqxYoV69er1yHVuFi1apGzZsmnlypXKly+f1bkHf/6k+6PHQkJCNGHCBKu/fSMjI9W7d2998cUXatasWZqWDQAgMQcDDpFgTrTLv1y5cqXqX1rMmjVLY8eOVb169eTv75/qPxpTkvTJyD9/cQEAHl+jR4+2BDPS/bXN2rdvr8TERB07dsxyfMWKFYqOjlb37t1tLtiZlikRtvz888+SpH/961/JFv90dna2ufaJn59fsjfesbGxWrVqlXLlyqW3337b6kOJEiVKqHfv3oqLi9OKFSusrnNxcZGzs3OyNvLmzZvsWFK48KA8efKkacpvatr7/fffdfHiRfXq1SvZY16oUCENHDhQV69e1e7duyXdD7EWLFggV1dXff7558lGr2TPnt3m/aTF0qVLJd1/o58UzCTdz3vvvScnJyctWbLE5rUfffSR1WOXL18++fn5KSoqyvJm355svT7SK2nnp3//+9/Jpi917txZ5cuX1+rVq+3S1oNC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vXtXn376abIpHrGxsVaL+ietyZOWLaa7dOkiSfrxxx+t6kpISNDXX3+txMREvfTSS6muzwhubm4qVaqUDhw4oL/++styPCEhQePGjbP5HCdNSfv4449tBl8xMTGWNYKSLFu2TGXLltX777+f7r4WLlxYzz//vIKDgzVnzhyrc4cPH1ZAQIDy5MljNeW8Y8eOSkxM1IQJE2Q2my3Hr1y5kqyO9DKZTJbt6P/73/9aBXybNm3S/v379cwzz9hcPDy9ktbQ+efopRMnTmjq1KmprmfPnj1Wj0uSpNdz0s/xc889p5o1a+q3337Tr7/+arOu06dP2200EvA0YVoTHCLebHtILAAAT5K8efNq/Pjxev3119WnTx81atRIZcuWVXR0tE6fPq0rV65YfQDw3nvvKTAwUHPnzk3VNs1du3bV/v37tXLlSrVs2VJ+fn7KmzevwsPDtWfPHnXp0uWhC4U+aNSoUdq/f79+/vlnHT16VHXq1FFERITWrVun27dv6+OPP7bsQHj37l317NlTxYsXV8WKFVWkSBHdu3dPf/zxh86ePatmzZqpdOnSku5vUbxnzx7VrFlTvr6+ypUrl/766y9t375defLk0csvv/zIvqWlvWzZsmnSpEkaOHCgBg8erGrVqql8+fJydXVVaGiojh49qkuXLmnnzp2WQGf48OE6fPiwtm7dqlatWqlJkybKnTu3rly5ol27dundd9+1TLmqW7eunJycNGHCBP3555+WESWvvfZaiv2vXr26Bg4cqOnTp6tdu3Zq1aqVcubMqR07dujMmTOqUaOGBgwYkKrnyUgDBgzQhx9+qB49euiFF15Qjhw5tHfvXsXFxalcuXI6deqUVfl69epp1KhRmjBhglq1aqVGjRrJ19dXMTExCgkJ0b59+1S9enXNmDHDck1SYGFrV660+Pzzz9WjRw/95z//0a5du1SpUiVduXJF69evl5OTk8aOHWu1a9LAgQO1adMmrVmzRufOndPzzz+vqKgorV+/XjVr1tSmTZtsftj2YIiUtMjtN998Y9mi+6WXXlLNmjUtZfr166etW7dqw4YN6tq1q+rVq2fpV86cOTV27Ng07WD2KB06dNCMGTM0duxY7d27V8WLF9eFCxf0+++/q0WLFlq7dm2q6hkxYoRy5cqlqlWrysfHR2azWfv379fRo0dVsWJF1a9f31J2/Pjx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JTembR6lh3lp6mmH9V0pfq7D+u5zdZTD+vbo84H179evJ139DQCcoZCv4679AICMJS72crr3Wbp0aTVr1kzjx49P977/jjlnMonklv8+deqklixZqJw5c6lSpSomjAoAAAAAgH8vDw8P+fj4OLwOjzVlEt26vajChf1UvPhTcnfProsXL+qXX7bLMBL09ttvWZ9/AwAAAAAAqVO6dGmdOuX4VYO5cyaTaN26ne7evav163/SwoXf6rffDqhGjRr68suv1KTJs2YPDwAAAACAf51evXpp27Zt+uWXXxxahztnMomePfuoZ88+Zg8DAAAAAIBMIywsTHXq1FGvXr3UqFEjlStXTvnz55fFYknStnXr1nbXIZwBAAAAAABIxogRI2SxWGQYhtatW6d16+6vyPz3cMYwDFksFsIZAAAAAACA9PbRRx85pQ7hDAAAAAAAQDLatGnjlDpMCAwAAAAAAGAiwhkAAAAAAAAT8VgTAAAAAABACu7evatvv/1W27dv17Vr1xQbG5ukjcVi0YYNG+yuQTgDAAAAAACQjNu3b6tTp046deqUPD09FRERIS8vL927d0/R0dGSpAIFCsjVNW3xCo81AQAAAAAAJGPq1Kk6deqUPvjgA+3Zs0eS1LVrV+3fv18LFy5UmTJlVKRIEf34449pqkM4AwAAAAAAkIxNmzYpKChI7dq1k8Visb5usVgUGBior7/+WmfOnNHUqVPTVCddH2vKW+GT9OwuXYQdHJ6m/ffuDVH//r01atQ7at68ZTqNKnN45UZ/s4eQxFTvyWYPAQAAAACQSYSGhqp+/frWr11cXHTv3j3r197e3qpbt67WrFmjV1991e46zDljhzt37mjhwvmqXLmqqlSpmub+fv11l7Zs2aQTJ47p1KlTiomJ1ttvv69nn30uHUYLW4WFhWnBgnnasWO7QkNDJRnKnTuPSpYspdq166hly9aJ2oeGXtGSJYu0Z8+vunLlimJiouXllVMlSpRQjRq11Lx5S+XOnceU9wIAAAAAsJ+7u3uiO2a8vLx0/fr1RG28vb117dq1NNUhnHmESpUqa+vWnYkm97lz545mzpwuSekSzqxd+6PWrv1RxYoVU4kST+nIkcNp7hP2uXo1VN27d9GtW+GqX7+hWrZso6xZs+ry5Us6ePCAFi36NlE48+OPP2js2DGSLGrQoKGaN28lD48c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t2/X7t27tWjRIvn7+9tc5wFnXhsyAu6cAR4zERER6tKli44cOSJ3d3cVKVJEknTx4kXdvXtXZcqU0dy5c23+7UfPnj116tQpfffdd7JYLKpVq5ZmzZqlmjVrauvWrRoyZIhmzpxp9wSzj5pzBumvVatWunPnjqZMmZJkVShbvPLKKzp+/Ljmz5+vQoUKpdjuypUreumllxQQEKApU6bYXGfMmDFasGCB3n77bTVr1kzXrl3TF198oXXr1qlGjRqaNm2aNaBZuXKl3njjDbsmkO7QoYNOnTqlIUOGJLtK2fnz59WkSRNNnDgxTb8Fq169ugYOHKiXXnpJklSnTh35+voqODg40aNHkZGR6tChgzw9PbVo0SKb67Rv317u7u6aO3euLBaLpkyZounTp6tSpUr65ptvrOFSXFyc2rVrp+zZs9tVR5LCw8PVpUsXnThxQr6+vgoMDEzywfvAgQO6fPmySpYsqeDgYOXOnduuWjExMerUqZOOHDliDdKyZs2q119/PclxS8v58NVXXz10+61btzRr1iw999xzKlmypCwWi/VuKFv06NFDefPm1SeffCJJWrdunQYNGiRXV1dVqlTJ+sH7wIEDypo1qxYsWGBzIC5JW7duVZ8+feTq6qps2bIpISFBwcHB6t27t+Li4lSlShXFx8crJCREsbGxmjNnjqpWrWpzHWedC846DyTOhYx+LkhcFzL6uTBhwgTNnDlTw4YNU6dOnZL9ZWFMTIy+/fZbffrpp+rRo4eGDh1qc53vvvtOb731lqpUqaKmTZvq6tWrWrx4sSIjIzV69Gi98MIL1rZpvS4EBAQk+oXOw35hk5YVNuvWravOnTurV69ekqQXXnhBp06d0pdffqmaNWta223YsEFDhw5V48aNNX78eJvrDBgwQAcOHND06dNVoEABDR8+XDdu3FBYWJi++eYb6y/X9u/fr+7du6tevXr67LPPbK4jOffakGEYAB4rY8eONfz9/Y1JkyYZUVFR1tejo6ONyZMnG/7+/sbHH39sc7/VqlUzvvzyS8MwDOPmzZuGv7+/8csvv1i3//e//zVefvnltL8BOE358uWNWbNmpbmfoKAg45tvvklV25kzZxpBQUF21WnWrJnx5ptvJnl96tSphr+/v9G9e3cjJibGMAzDWLFihREQEGBXnYSEBOObb74xAgMDjQ4dOhjHjx9P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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Check data with lmPlot()\n", "ep.lmPlot(matE, selDims = selDims, thres = thres);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Calculate density matrix\n", "\n", "The numerics essentially computer the outer product from the specified dimensions, as per the previous definition:\n", "\n", "\\begin{equation}\n", "\\boldsymbol{\\rho}_{i,j}=\\langle\\phi_{i}|\\hat{\\rho}|\\phi_{j}\\rangle=\\sum_{n}W_{n}a_{i}^{(n)}a_{j}^{(n)*}\n", "\\end{equation}\n", "\n", "where $a_{i}^{(n)}a_{j}^{(n)*}$ are the values along the specified dimensions/state vector/representation. These dimensions must be in data, but will be restacked as necessary to define the effective basis space. For instance, from the ionization matrix element data shown above, setting `[l,m]` would select the $|\\alpha\\rangle = |l,m\\rangle$ basis (equivalently `LM`, since the dimensions are already stacked in the ionization matrix elements). Setting `['LM','mu']` would set the $|\\alpha\\rangle = |l,m,\\mu\\rangle$ as the basis vector and so forth, where $|\\alpha\\rangle$ is used as a generic state vector denoting all required quantum numbers.\n", "\n", "Note, however, that this selection is purely based on the numerics, which computes the outer product $|\\alpha\\rangle\\langle\\alpha'|$ to form the density matrix, hence does not guarantee a well-formed density matrix in the strictest sense (depending on the basis set), although will always present a basis state correlation matrix of sorts." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "tags": [] }, "outputs": [], "source": [ "# Compose density matrix\n", "\n", "# Set dimensions/state vector/representation\n", "# These must be in original data, but will be restacked as necessary to define the effective basis space.\n", "denDims = ['LM', 'mu'] \n", "\n", "# Calculate\n", "daOut, *_ = density.densityCalc(matE, denDims = denDims, selDims = selDims, thres = thres) # OK" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataArray 'n2_3sg_0.1-50.1eV_A2.inp.out' (Eke: 51, Sym: 2, l,m,mu: 9,\n",
       "                                                  l,m,mu_p: 9)>\n",
       "array([[[[        nan       +nanj,         nan       +nanj,\n",
       "                  nan       +nanj, ...,         nan       +nanj,\n",
       "                  nan       +nanj,         nan       +nanj],\n",
       "         [        nan       +nanj,  7.49604313+0.j        ,\n",
       "                  nan       +nanj, ...,         nan       +nanj,\n",
       "                  nan       +nanj,         nan       +nanj],\n",
       "         [        nan       +nanj,         nan       +nanj,\n",
       "                  nan       +nanj, ...,         nan       +nanj,\n",
       "                  nan       +nanj,         nan       +nanj],\n",
       "         ...,\n",
       "         [        nan       +nanj,         nan       +nanj,\n",
       "                  nan       +nanj, ...,         nan       +nanj,\n",
       "                  nan       +nanj,         nan       +nanj],\n",
       "         [        nan       +nanj,         nan       +nanj,\n",
       "                  nan       +nanj, ...,         nan       +nanj,\n",
       "                  nan       +nanj,         nan       +nanj],\n",
       "         [        nan       +nanj,         nan       +nanj,\n",
       "                  nan       +nanj, ...,         nan       +nanj,\n",
       "                  nan       +nanj,         nan       +nanj]],\n",
       "\n",
       "...\n",
       "\n",
       "        [[ 0.66738586+0.j        ,         nan       +nanj,\n",
       "           0.66738586+0.j        , ..., -0.08467309+0.06156213j,\n",
       "                  nan       +nanj, -0.08467309+0.06156213j],\n",
       "         [        nan       +nanj,         nan       +nanj,\n",
       "                  nan       +nanj, ...,         nan       +nanj,\n",
       "                  nan       +nanj,         nan       +nanj],\n",
       "         [ 0.66738586+0.j        ,         nan       +nanj,\n",
       "           0.66738586+0.j        , ..., -0.08467309+0.06156213j,\n",
       "                  nan       +nanj, -0.08467309+0.06156213j],\n",
       "         ...,\n",
       "         [-0.08467309-0.06156213j,         nan       +nanj,\n",
       "          -0.08467309-0.06156213j, ...,  0.01642143+0.j        ,\n",
       "                  nan       +nanj,  0.01642143+0.j        ],\n",
       "         [        nan       +nanj,         nan       +nanj,\n",
       "                  nan       +nanj, ...,         nan       +nanj,\n",
       "                  nan       +nanj,         nan       +nanj],\n",
       "         [-0.08467309-0.06156213j,         nan       +nanj,\n",
       "          -0.08467309-0.06156213j, ...,  0.01642143+0.j        ,\n",
       "                  nan       +nanj,  0.01642143+0.j        ]]]])\n",
       "Coordinates:\n",
       "    Type      <U1 'L'\n",
       "  * Sym       (Sym) MultiIndex\n",
       "  - Cont      (Sym) object 'SU' 'PU'\n",
       "  - Targ      (Sym) object 'SG' 'SG'\n",
       "  - Total     (Sym) object 'SU' 'PU'\n",
       "  * Eke       (Eke) float64 0.1 1.1 2.1 3.1 4.1 5.1 ... 46.1 47.1 48.1 49.1 50.1\n",
       "    Ehv       (Eke) float64 17.4 18.4 19.4 20.4 21.4 ... 64.4 65.4 66.4 67.4\n",
       "    SF        (Eke) complex128 (2.1560627+3.741674j) ... (4.4127053+1.8281945j)\n",
       "  * l,m,mu    (l,m,mu) MultiIndex\n",
       "  - l         (l,m,mu) int64 1 1 1 3 3 3 5 5 5\n",
       "  - m         (l,m,mu) int64 -1 0 1 -1 0 1 -1 0 1\n",
       "  - mu        (l,m,mu) int64 1 0 -1 1 0 -1 1 0 -1\n",
       "  * l,m,mu_p  (l,m,mu_p) MultiIndex\n",
       "  - l_p       (l,m,mu_p) int64 1 1 1 3 3 3 5 5 5\n",
       "  - m_p       (l,m,mu_p) int64 -1 0 1 -1 0 1 -1 0 1\n",
       "  - mu_p      (l,m,mu_p) int64 1 0 -1 1 0 -1 1 0 -1\n",
       "Attributes:\n",
       "    dataType:  Density Matrix\n",
       "    file:      n2_3sg_0.1-50.1eV_A2.inp.out\n",
       "    fileBase:  /home/jovyan/code-share/github-share/ePSproc/data/photoionizat...\n",
       "    fileList:  n2_3sg_0.1-50.1eV_A2.inp.out\n",
       "    jobLabel:  3sg-1\n",
       "    density:   {'denSettings': {'da': <xarray.DataArray 'n2_3sg_0.1-50.1eV_A2...\n",
       "    kdims:     ['l,m,mu', 'l,m,mu_p']
" ], "text/plain": [ "\n", "array([[[[ nan +nanj, nan +nanj,\n", " nan +nanj, ..., nan +nanj,\n", " nan +nanj, nan +nanj],\n", " [ nan +nanj, 7.49604313+0.j ,\n", " nan +nanj, ..., nan +nanj,\n", " nan +nanj, nan +nanj],\n", " [ nan +nanj, nan +nanj,\n", " nan +nanj, ..., nan +nanj,\n", " nan +nanj, nan +nanj],\n", " ...,\n", " [ nan +nanj, nan +nanj,\n", " nan +nanj, ..., nan +nanj,\n", " nan +nanj, nan +nanj],\n", " [ nan +nanj, nan +nanj,\n", " nan +nanj, ..., nan +nanj,\n", " nan +nanj, nan +nanj],\n", " [ nan +nanj, nan +nanj,\n", " nan +nanj, ..., nan +nanj,\n", " nan +nanj, nan +nanj]],\n", "\n", "...\n", "\n", " [[ 0.66738586+0.j , nan +nanj,\n", " 0.66738586+0.j , ..., -0.08467309+0.06156213j,\n", " nan +nanj, -0.08467309+0.06156213j],\n", " [ nan +nanj, nan +nanj,\n", " nan +nanj, ..., nan +nanj,\n", " nan +nanj, nan +nanj],\n", " [ 0.66738586+0.j , nan +nanj,\n", " 0.66738586+0.j , ..., -0.08467309+0.06156213j,\n", " nan +nanj, -0.08467309+0.06156213j],\n", " ...,\n", " [-0.08467309-0.06156213j, nan +nanj,\n", " -0.08467309-0.06156213j, ..., 0.01642143+0.j ,\n", " nan +nanj, 0.01642143+0.j ],\n", " [ nan +nanj, nan +nanj,\n", " nan +nanj, ..., nan +nanj,\n", " nan +nanj, nan +nanj],\n", " [-0.08467309-0.06156213j, nan +nanj,\n", " -0.08467309-0.06156213j, ..., 0.01642143+0.j ,\n", " nan +nanj, 0.01642143+0.j ]]]])\n", "Coordinates:\n", " Type \n", "
\n", "\n", "" ], "text/plain": [ ":HoloMap [Sym,Eke,pType]\n", " :HeatMap [l,m,mu,l,m,mu_p] (n2_3sg_0.1-50.1eV_A2.inp.out)" ] }, "execution_count": 9, "metadata": { "application/vnd.holoviews_exec.v0+json": { "id": "p1002" } }, "output_type": "execute_result" } ], "source": [ "# Plot full matrix\n", "# This is interactive (with Holoviews), with the widgets allowing selection of other (stacked) dimensions.\n", "# Plot types [real, imag, abs] are also set.\n", "# Note this may take a while for data with a large number of dimensions.\n", "density.matPlot(daOut)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "tags": [] }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "WARNING:param.HeatMapPlot261168: Due to internal constraints, when aspect and width/height is set, the bokeh backend uses those values as frame_width/frame_height instead. This ensures the aspect is respected, but means that the plot might be slightly larger than anticipated. Set the frame_width/frame_height explicitly to suppress this warning.\n", "WARNING:param.HeatMapPlot261174: Due to internal constraints, when aspect and width/height is set, the bokeh backend uses those values as frame_width/frame_height instead. This ensures the aspect is respected, but means that the plot might be slightly larger than anticipated. Set the frame_width/frame_height explicitly to suppress this warning.\n", "WARNING:param.HeatMapPlot261179: Due to internal constraints, when aspect and width/height is set, the bokeh backend uses those values as frame_width/frame_height instead. This ensures the aspect is respected, but means that the plot might be slightly larger than anticipated. Set the frame_width/frame_height explicitly to suppress this warning.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Set plot kdims to ['l,m,mu', 'l,m,mu_p']; pass kdims = [dim1,dim2] for more control.\n" ] }, { "data": {}, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.holoviews_exec.v0+json": "", "text/html": [ "
\n", "
\n", "
\n", "" ], "text/plain": [ ":NdLayout [Eke]\n", " :HoloMap [pType]\n", " :HeatMap [l,m,mu,l,m,mu_p] (n2_3sg_0.1-50.1eV_A2.inp.out)" ] }, "execution_count": 10, "metadata": { "application/vnd.holoviews_exec.v0+json": { "id": "p6041" } }, "output_type": "execute_result" } ], "source": [ "# For more control, the Xarray and/or Holoviews object can be manipulated prior to plotting\n", "\n", "hvmap = density.matPlot(daOut.sum('Sym').sel(Eke=slice(5,50,20))) # Sum & slice data prior to plot\n", " # Note that summation may replace NaNs with zeros.\n", "hvmap.layout('Eke').cols(1) # Layout results by Eke, single column layout" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "TODO:\n", "\n", "- Cmapping & dynamic map range control.\n", "- NaN replacement issues?\n", "- Normalisation." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Density matrices from other data types\n", "\n", "As defined above, an approximate density/correlation matrix can be composed from any Xarray. Strictly speaking, this may not always provide a well-formed density matrix, but will always provide a correlation matrix which may be interesting/informative for a given case.\n", "\n", "Here we'll look at some other data-types, using the [AF-BLM routine](https://epsproc.readthedocs.io/en/dev/methods/ePSproc_geom_methods_summary_190821-v1-tidy.html) (strictly speaking, this defines a set of geometric tensors, which may have a direct relation with the corresponding density matrix - this [will be explored below](#Density-matrix-from-geometric-tensors), here we'll just do the numerics). For an more details of the AF-BLM routine see the [theory notes](https://epsproc.readthedocs.io/en/dev/methods/ePSproc_geom_methods_summary_190821-v1-tidy.html) and the [basis set exploration page](https://pemtk.readthedocs.io/en/latest/fitting/PEMtk_fitting_basis-set_demo_050621-full.html). (Note 24/07/24 update: results here are slightly different to previously, since AFBLM code now defaults to p=0/z-pol case, so R=0 terms only in default case.)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "tags": [] }, "outputs": [], "source": [ "# Calculate AFPADs with full basis set return\n", "# The default case will compute LF-BLM parameters\n", "BetasNormX, basis = ep.afblmXprod(matE, selDims=selDims, basisReturn='Full', symSum=False)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "dict_keys(['QNs', 'EPRX', 'lambdaTerm', 'BLMtable', 'BLMtableResort', 'AFterm', 'AKQS', 'polProd', 'phaseConvention', 'BLMRenorm', 'matEmult'])" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Basis set arrays\n", "basis.keys()" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "tags": [] }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "WARNING:param.HeatMapPlot261731: Due to internal constraints, when aspect and width/height is set, the bokeh backend uses those values as frame_width/frame_height instead. This ensures the aspect is respected, but means that the plot might be slightly larger than anticipated. Set the frame_width/frame_height explicitly to suppress this warning.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Set plot kdims to ['BLM', 'BLM_p']; pass kdims = [dim1,dim2] for more control.\n" ] }, { "data": {}, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.holoviews_exec.v0+json": "", "text/html": [ "
\n", "
\n", "
\n", "" ], "text/plain": [ ":HoloMap [Sym,Eke,pType]\n", " :HeatMap [BLM,BLM_p] (BLMplot)" ] }, "execution_count": 13, "metadata": { "application/vnd.holoviews_exec.v0+json": { "id": "p6857" } }, "output_type": "execute_result" } ], "source": [ "# Compose density matrix\n", "\n", "# Set dimensions/state vector/representation\n", "# These must be in original data, but will be restacked as necessary to define the effective basis space.\n", "denDims = 'BLM'\n", "\n", "# Calculate\n", "daOut, *_ = density.densityCalc(BetasNormX, denDims = denDims, selDims = selDims, thres = thres) # OK\n", "\n", "daOut.name = 'BLMplot' # Set name - note this can't be the same as a dimension!\n", "\n", "# Plot\n", "hvmap = density.matPlot(daOut.sel(Eke=slice(5,50,20))) # Sum & slice data prior to plot\n", " # Note that summation may replace NaNs with zeros.\n", "hvmap" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Not very interesting so far/in this case... but what about some of the basis tensors?" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "dict_keys(['QNs', 'EPRX', 'lambdaTerm', 'BLMtable', 'BLMtableResort', 'AFterm', 'AKQS', 'polProd', 'phaseConvention', 'BLMRenorm', 'matEmult'])" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Available basis arrays\n", "basis.keys()" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "tags": [] }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "WARNING:param.HeatMapPlot263160: Due to internal constraints, when aspect and width/height is set, the bokeh backend uses those values as frame_width/frame_height instead. This ensures the aspect is respected, but means that the plot might be slightly larger than anticipated. Set the frame_width/frame_height explicitly to suppress this warning.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "{'L', 't', 'S-Rp', 'R', 'M'} set() {'L', 'R', 'M', 't', 'S-Rp'}\n", "Set plot kdims to ['Rp,P', 'Rp,P_p']; pass kdims = [dim1,dim2] for more control.\n" ] }, { "data": {}, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.holoviews_exec.v0+json": "", "text/html": [ "
\n", "
\n", "
\n", "" ], "text/plain": [ ":HoloMap [pType]\n", " :HeatMap [Rp,P,Rp,P_p] (AFterm)" ] }, "execution_count": 15, "metadata": { "application/vnd.holoviews_exec.v0+json": { "id": "p7384" } }, "output_type": "execute_result" } ], "source": [ "# Compose density matrix\n", "\n", "termName = 'AFterm'\n", "daIn = basis[termName] # Set data\n", "\n", "# Set dimensions/state vector/representation\n", "# These must be in original data, but will be restacked as necessary to define the effective basis space.\n", "denDims = ['P','Rp']\n", "\n", "# Calculate + sum over other terms\n", "daOut, *_ = density.densityCalc(daIn, denDims = denDims, selDims = selDims, thres = thres, sumDims=True, squeeze=False) # Note may need squeeze=False for updated selectors if denDim maybe squeezed out!\n", "\n", "daOut.name = termName # Set name - note this can't be the same as a dimension!\n", "\n", "# Plot\n", "hvmap = density.matPlot(daOut) # Sum & slice data prior to plot\n", " # Note that summation may replace NaNs with zeros.\n", "hvmap" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this case, the Xarray already contains all the tensor components, so this calculation is somewhat redundant, as we can see from a closer inspection..." ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataArray (P: 3, L: 3, R: 1, M: 1, Rp: 5, S-Rp: 5, t: 1)>\n",
       "array([[[[[[[ 0.        ],\n",
       "            [ 0.        ],\n",
       "            [ 0.        ],\n",
       "            [ 0.        ],\n",
       "            [ 0.        ]],\n",
       "\n",
       "           [[ 0.        ],\n",
       "            [ 0.        ],\n",
       "            [ 0.        ],\n",
       "            [ 0.        ],\n",
       "            [ 0.        ]],\n",
       "\n",
       "           [[ 0.        ],\n",
       "            [ 0.        ],\n",
       "            [ 1.        ],\n",
       "            [ 0.        ],\n",
       "            [ 0.        ]],\n",
       "\n",
       "           [[ 0.        ],\n",
       "            [ 0.        ],\n",
       "...\n",
       "            [-0.2       ],\n",
       "            [ 0.        ]],\n",
       "\n",
       "           [[ 0.        ],\n",
       "            [ 0.        ],\n",
       "            [ 0.2       ],\n",
       "            [ 0.        ],\n",
       "            [ 0.        ]],\n",
       "\n",
       "           [[ 0.        ],\n",
       "            [-0.2       ],\n",
       "            [ 0.        ],\n",
       "            [ 0.        ],\n",
       "            [ 0.        ]],\n",
       "\n",
       "           [[ 0.2       ],\n",
       "            [ 0.        ],\n",
       "            [ 0.        ],\n",
       "            [ 0.        ],\n",
       "            [ 0.        ]]]]]]])\n",
       "Coordinates:\n",
       "  * P        (P) int64 0 1 2\n",
       "  * L        (L) int64 0 1 2\n",
       "  * R        (R) int64 0\n",
       "  * M        (M) int64 0\n",
       "  * Rp       (Rp) int64 -2 -1 0 1 2\n",
       "  * S-Rp     (S-Rp) int64 -2 -1 0 1 2\n",
       "  * t        (t) int64 0
" ], "text/plain": [ "\n", "array([[[[[[[ 0. ],\n", " [ 0. ],\n", " [ 0. ],\n", " [ 0. ],\n", " [ 0. ]],\n", "\n", " [[ 0. ],\n", " [ 0. ],\n", " [ 0. ],\n", " [ 0. ],\n", " [ 0. ]],\n", "\n", " [[ 0. ],\n", " [ 0. ],\n", " [ 1. ],\n", " [ 0. ],\n", " [ 0. ]],\n", "\n", " [[ 0. ],\n", " [ 0. ],\n", "...\n", " [-0.2 ],\n", " [ 0. ]],\n", "\n", " [[ 0. ],\n", " [ 0. ],\n", " [ 0.2 ],\n", " [ 0. ],\n", " [ 0. ]],\n", "\n", " [[ 0. ],\n", " [-0.2 ],\n", " [ 0. ],\n", " [ 0. ],\n", " [ 0. ]],\n", "\n", " [[ 0.2 ],\n", " [ 0. ],\n", " [ 0. ],\n", " [ 0. ],\n", " [ 0. ]]]]]]])\n", "Coordinates:\n", " * P (P) int64 0 1 2\n", " * L (L) int64 0 1 2\n", " * R (R) int64 0\n", " * M (M) int64 0\n", " * Rp (Rp) int64 -2 -1 0 1 2\n", " * S-Rp (S-Rp) int64 -2 -1 0 1 2\n", " * t (t) int64 0" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "basis[termName]" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Set dataType (No dataType)\n", "Plotting data (No filename), pType=a, thres=0.01, with Seaborn\n" ] }, { "data": { "image/png": "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Roa89NJLOnr0qObPn69Nmzapbt268vLy0tWrV3XmzBnt3r1br776qp588sl77qN///4aP368AgIC1LJlSzk7O2v37t06efKkmjRpok2bNmXhE9nq0qWLDh06pJ9//lktWrRQgwYNVLx4cUVFRSk8PFx///23OnfurA8++MDqvm3btkm6/fMAALg/BEewO6kpD09wFBUVpU8//VTFihVTaGioZS1/mzZt1K5dO3388ccKCQlJt41Tp07prbfeUvv27fXpp59aHXtr5MMPP9TNmzcVEhKiatWqSbr9pqxbt26aMGGCWrZs+UD3aAAAICu1bNlShQoV0tKlS9WrV69M3Tt8+HAtX75csbGxhtcnTZqk2rVra9GiRVqwYIEkqUKFCho4cKB69Ohx32PPLBcXF33//fdatmyZlixZot9//13x8fHy9PRUqVKl9Morr6hDhw731UdgYKBcXV31448/aunSpcqVK5f8/Pw0YcIErVu3LtuDI0kaP368GjVqpPnz5+vPP/+0bFRevHhxDRo0yCawS01N1fLly1WpUiXVrFkz28cHAI87B5PJZMrpQQAP0sHy7bOknar/rrzvNhYvXqyxY8dq+PDhCgoKsro2ZswYy5vA4sWLp9nGuHHjtGTJEm3ZskUFCxbUzZs35eTkZHjqS3h4uJo1ayZ/f3/NnTvXcCyff/65OnbseN/PBgBATpk2bZomTZqkJUuWPNB9h/Bw2Lhxo4YNG8Z7GgDIIg/P1AvgAUlOccySr/j4+Ax9pWffvn2SZPhpmLnswIED6bbx+++/q3z58tq3b5/atm2rGjVqqHr16urevbt27NhhVXf//v2SJF9f33vuDwCAh13//v1VokQJffvttzk9FDxg5v2Xqlat+sCXDgLA44qlarA7qalZc7JGRqc+Hzt2LM1r5o0mixUrZnPNXBYZGZnm/TExMbp8+bKSkpIUFBSk7t2769VXX9Xp06c1depUDRw4ULNnz5a/v79VW15eXvfUHwAAj4JcuXLp888/144dOxQfH6+8efPm9JDwgFy+fFlNmza17EEFALh/BEewO0kpTjk9BAvzqSxGy8rMZUanpJjFxcVJkm7cuKEXX3xRr732muVa1apV1b9/f02aNEnz58+/a3+5cuWyqgMAwKOsdu3aql27dk4PAw9Y0aJFNXz48JweBgA8VgiOYHeSU7NmheaePXvuu408efJIkhITE22umcty586d5v3msEeSzWlo9erVU4kSJbRv3z7dvHlTefLkSbe/hIQEqzEBAAAAAEBwBLuToqyZtpwV097NS8YiIyNVoUIFq2vmJWNGy9jMPDw8lDdvXsXHx6tIkSI214sUKaKIiAhFR0crT548lrbMS+Qy2x8AAAAAwL6wOTbsTpLJMUu+soKPj48k49lLe/fulSRVq1YtzfsdHBws1432Jrpw4YKcnZ3l4eFh1da99gcAAAAAsC8ER7A7SXLIkq+s0Lx5c+XLl08LFy5UbGyspTwiIkJr1qyRv7+/ihcvLun23kMnT57UpUuXrNoICAiQJP30009W5evXr9elS5dUr149y5K20qVLy9fXV2FhYTp48KClbnJysubOnSt3d3c1bdo0S54NAHB3ffr0kbe3d04PA9nA29tbffr0yelhZMiOHTvk7e2t4ODgnB5KhjRt2jTb369kto/w8HB5e3trzJgx2TgqAMgZLFWD3Ul6iE7YKFCggN544w2NHz9ePXr0UPfu3ZWYmKh58+ZJkt5++21L3f3796tv374KCAjQp59+ainv2LGjVqxYoZ9++klXr15VnTp1dO7cOc2bN0/u7u42b2DGjRun3r17a9CgQerfv788PT21bNkyHTp0SB9//LHc3d0fzMMDwGNozJgxWrJkiVVZnjx5VKpUKTVu3FhDhgxRgQIFsrxfb29v+fv7a+7cuZm6r0+fPgoLC0v3BFA8+sLDw9WsWTOb9xB4vEVGRuqbb77Rli1bdOPGDRUtWlTNmjVTUFBQpv87dOPGDX333XfasGGDLl26JA8PDzVs2FCvvPKK4TYHa9as0d9//60jR47o6NGjiouLU4cOHfTll19m1eMBeIAIjmB3smqPo6wSGBgoDw8PzZo1S1988YVcXFzk5+enkSNHqlKlSne939HRUVOmTNGMGTO0fPlybdiwQfny5VPz5s01YsQIlStXzqr+008/rdDQUH311VeaNWuWkpKSVLFiRQUHB6tly5bZ9ZgAYFeaNWumypUrS7p9PPimTZs0Y8YMrV27VgsXLrQsIQaA7HD27FkFBgbq6tWratasmcqXL6/9+/crJCREW7ZsUWhoqDw9PTPU1vXr1xUYGKjTp0+rbt26atu2rf79918tXrxYf/zxhxYsWKDSpUtb3TNlyhQdPXpUefPmVbFixfTvv/9mx2MCeEAIjmB3HqYZR2atW7dW69at061Tp06dND8RzpUrl4KCghQUFJSh/ipVqqRp06ZlepwAgIxp3ry51WmXcXFx6tatm06cOKF58+Zl+L/XAHAv3n//fV29elXjxo2zWjI5YcIEzZkzR1999ZU++OCDDLX11Vdf6fTp0xowYIDVTPaQkBB9/PHHeu+99zRr1iyre8aOHatixYqpbNmyCgsLU9++fbPmwQDkCPY4gt1JdHDIki8AADIqX7586tSpk6TbS4/vJjU1VaGhoXr++edVs2ZN1ahRQ88//7x+/vlnpaamWuotXrzYskdSWFiYvL29LV/p7Vdj3o8lLCxMkqzu69Onj1JSUvTss8/K19dXcXFxhm18+OGH8vb21po1ayxl5vsvXryo119/XfXq1ZOPj486d+6sFStWpDmeLVu2aMiQIapTp46qVq2q5s2b67PPPlN0dPRdX6sHISYmRjNnzlTfvn3VqFEjVa1aVXXr1tXQoUMND5y4U0ZfC5PJpCVLligwMFB169ZVtWrV9Oyzz2rQoEH69ddf73nswcHBatasmSRpyZIlVt/rxYsX29Q/cuSIXnjhBfn5+al69erq3bu3du/ebdiut7e3duzYoRUrVqhr166qWbOm1b5AN2/e1LRp09SxY0fVqFFDNWvWVPfu3bVy5cosef74+Hh99tlnaty4sapWraoWLVpo+vTpMplMhvV//fVX9erVS7Vq1ZKPj486dOigadOmKTExMUOvpSTFxsZqwoQJatSokapVq6bWrVtr9uzZafaZE86ePautW7eqZMmS6tWrl9W14cOHK2/evFq+fLni4+Pv2lZcXJyWLVumvHnz2gTevXv3VsmSJbV161adO3fO6lrdunX1xBNPyIH3zMBjgRlHsDsp/PsFAMgB5l8sM/KL1Ouvv66VK1eqePHi6tKlixwcHLR+/Xq9//772rVrlyZOnChJqly5soKCgjR58mSVLFnScmCCJPn7+6fZfv78+RUUFKQlS5bo/PnzVr8QlixZUk5OTuratauCg4O1atUqdevWzer+W7duafny5SpSpIgllDCLiopSjx495O7urs6dOysmJkarV6/W6NGjdfHiRQ0ePNiq/uTJkxUcHCwPDw81btxYBQsW1PHjx/XDDz9o8+bNWrBggdzc3O76mmWnkydP6uuvv5afn58aN26s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jx49dOLECVWrVk39+vXT9evXtXr1ag0cOFDvvfeeAgMDLe189dVXmjZtmkqVKqU2bdrI3d1dly9f1oEDB7RmzRpLkHP06FF169ZNDg4Oatq0qUqVKqXY2FidPXtWoaGhGjlyZIaCo4z2J0mHDh3SwIEDFRUVpQYNGqhly5a6fv261q9fr549e+q7777Ts88+a6mfmJiooUOHatu2bSpevLjat28vNzc3nT9/XuvXr1etWrX0xBNPqG/fvtqwYYPCwsIUEBCQqaVdkyZN0rRp0+Tp6an27dsrb9682rJliyZNmqStW7dq1qxZNuFRUlKSBg0apEuXLqlRo0ZycnLS+vXrNXHiRCUmJmbLv+lp/Xzcq8mTJys4OFgeHh5q3LixChYsqOPHj+uHH37Q5s2btWDBArm5uWXR6P/PuXPn1LNnT126dEl169ZVu3btdOHCBa1Zs0a///67goOD1aRJE0v9hIQE9evXT4cOHVKVKlXUoUMHxcTEaOrUqdq5c2eWjOns2bOKiIjQE088odKlS9tcb9SokXbu3Knt27dnaXD05ZdfytHRUT4+PvLy8lJMTIy2b9+ujz/+WAcOHNAXX3xx1zYWLFigd999V0WKFFGTJk3k6empq1ev6tixY1q8eLFVcHT+/Hn16dNH58+fl5+fnxo2bKibN29q06ZNGjx4sD744AN169Yty54PwP0jOILdSTE9PCeiRUVF6dNPP1WxYsUUGhpqeWPUpk0btWvXTh9//LFCQkLSbWPw4MEaPHiwTXmFChX05Zdfat26derUqZOlfNKkSbp8+bKCg4PVsmVLSVK3bt00dOhQTZkyRR07djR8swIAyLhz585p5cqV8vDwkCS9+uqr6tixo5YuXarXXntNRYoUkSRdu3ZNo0aNUkpKin788UebfUgiIyPvaxy//PKLlixZomrVqmn27NlWe5qkpKTo6tWrNvf88ccfmj59uho1amRV/uWXX+rEiRPq3r273n//fctsliFDhuj555/XRx99pAYNGlhm0SxYsEBeXl5auXKl8uTJY9XWtWvXLP9/6dKlSkhI0HfffWezbCoqKsrm3rRktL/k5GSNHDlS8fHxCgkJsXrNL168qC5duujtt9/Wxo0bLUHN5MmTtW3bNjVp0kTffvutVYCTmJio2NhYSVL//v0VExNjCY4yujn2nj17NG3aNBUvXlwL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NViqBruT+hDtceTj46P58+drz549VptYS/+3ead5TXhmpaSkWL1hlqSKFSsqV65cNm/CzP2ZTKYs3fQSAJC+ggULauLEiRoxYoT69u2rRo0aydvbW7GxsTp27JguXLigjRs3Wuq/+eabCgsLU0hISIaOeu/atat27typZcuWqWXLlmrWrJkKFiyoS5cuafv27Xr++efT3TT3TqNGjdLOnTs1b948HThwQHXq1NH169e1evVqxcXF6Z133lHp0qUl3V5m3bNnT5UtW1ZPP/20SpQooYSEBP355586efKkmjZtatmDb+bMmdq+fbv8/PxUqlQp5c2bVydOnNDmzZtVoEABde/e/a5jy0x/Li4uCg4O1uDBg/XCCy+oZs2aqly5snLnzq3IyEgdOHBA586d09atWy1h08svv6x9+/Zp06ZNatWqlRo3bqx8+fLpwoUL2rZtm9544w3LMrq6devK0dFRkyZN0j///GOZifPSSy+lOX5fX18NHjxYM2fOVPv27dWqVSvlyZNHW7Zs0fHjx1WrVi0NGjQoQ9+nnDRo0CC9/fbb6tGjh1q3bq1cuXJpx44dSkpKUqVKlXT06FGr+vXq1dOoUaM0adIktWrVSo0aNVKpUqUUHx+viIgI/f333/L19dWsWbMs95jDFKPT8zLj/fffV48ePfT5559r27Ztqlq1qi5cuKA1a9bI0dFRn3zyidXpZoMHD9b69eu1atUqnTp1Ss8884xiYmK0Zs0a+fn5af369YbL+O4MuMwbPn/55ZfKly+fJKlLly7y8/Oz1BkwYIA2bdqktWvXqmvXrqpXr55lXHny5NEnn3ySqZMG76Zjx46aNWuWPvnkE+3YsUNly5bVmTNn9Pvvv6tFixb69ddfM9ROUFCQ8ubNqxo1aqhkyZIymUzauXOnDhw4oKefflr169e31J04caL69eunt99+W3PnzlX16tXl7u6uyMhIHT9+XMePH9eCBQuybO8oAPeP4Ah252HaHLt58+b6+OOPtXDhQvXv39/yBiUiIkJr1qyRv7+/5RSemzdvKiIiQu7u7lbHJ1++fNlwc8fQ0FAlJiZanaCWJ08etWzZUitWrNC6deuspiX/8MMPcnZ2tmxCCgB4MBo3bqxFixZpxowZ+uuvv7Rt2zblz59f5cuX14svvnhfbTs4OOjzzz9XgwYN9Msvv2j16tVKTExU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WphXXnk5s2fPyi9+8eu0adM2H3/8cb7//QFp126LdOiwQzbfvHWWLl2ap556Mq+88nL22eebX3oXGAAAAFTVgw8+mObNm2fChAnZeOONkySDBg3KIYcckjvuuCN77rlnrrnmmjRsWH03NgiO1jKnnDIwPXsekNtvvy3Tpj2diRPvztKlH2fjjZtl++3bp1+/k8tfY7/99u0zdOjwXHvt0DzxxGNZvnx5ttuufX7zm9+lSZONCoOjPn2OyIIF8zN58gMZPXpUli9fll137ZKDD+5VXvPGG2/JmDGj8/jjf8nEiRNSp05JWrRomfbtv55TT/1++V1LyWcTVg8ffkOGDbsqTzzxWGbPnpktt/xazjtvSBo1apRHH3240iNsO+/cMSNH3piRI6/L3/72VB577C9p1qxZvvWtb2fAgO/la1/bqlrGsnHjJrnmmusyfvzteeCBSXn44YeydOnHad68RbbYYov86EfnpFu3PZIkjRo1zBlnnJWpU5/Os8/O+N8Qa8O0bdsu//VfP07v3odVS08AAADwRf71r3+ld+/e5aFR8tkTNd/61rcybty4DBkypFpDoyQpKSsrK1vZjV966aUsXbosm23WtlqbYP10zTVX5U9/uj6XXXZVunffq7bb4SvU/Iqiyc2rxz9P+EeN1d523xtrrPbvFv2sxmqf2/LiGqtdNveSJMnChZXfdAgAwLqjdduqzTO7vlu2dF611OnQoUMGDRqUQYMGVVh+5ZVX5uqrr87MmTMrzVdcVeY4osYtXLiw0rJ//OPF3HbbLWnadOPsumuXWugKAAAA1g0lJZ+9Zby6Q6PEo2p8Bfr3/27atdsi22yzXRo1api5c+fm8ccfS1nZp7n44gvToEGD2m4RAAAA1grz5s3L3/72t0rLkuTpp59O0YNlXbt2Xe3jCY6ocYcfflT+/OdHMnnypHz44Ydp0mSjdO/ePX37npguXXav7fYAAABgrTF+/PiMHz++0vKysrL069ev0vKSkpLMnl38ZvaVITiixp166vdz6qnfr+02AAAAYK1WlTuHVpfgCAAAAGAtcOONNffCni9icmwAAAAACgmOAAAAACgkOAIAAABYx/ztb3/LtGnT8umnn1apjjmOAAAAANYx/fr1S0lJSdq2bZtTTz01Rx55ZDbYYINVruOOIwAAAIB1TNeuXdOlS5e89957ueSSS9Kz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Z8O5YMH8lJaWpl27dl/6+E+SdO68WzbfvHWmTJmc733vtGy22eZJkg8+eD933z0+bdu2K3+7GuunqVOfzk477ZSGDSunxY8++nCSfz821rZtu/K3sK2KvfbaOx07dsrEiRPSr9/JlcKg22+/LUce+e95jpYuXZqbbx6dOnXqpEePb5ZvV1r6URYsWJAmTZqkZctWq9wHAAAAX+7999/P3XffnXHjxuW5555LSUlJ9t577xx77LHZb7/9yrOJ6iI4qoKNN26Wo48+LqNGjcx9901M796HJ0l+9rOLMn361Nxxx8S0adPmS2vUrVs3//VfQ3LeeWfn+98/Jcce+53Ur18v48ffkbfeeiuXXnr5Kr81i3XL2LE3Z+rUp7P33vukQ4cd0rTpRlmyZEkef/yxTJ8+Ndtuu1169z6sysc55ZSB+dGPBmXEiOG5+OJfVFjXvHnz9O9/Qnr3Piz16tXP5MmTMmfOcznxxP7ZYosty7ebNWtWzjhjYA45pHcuuuhnVe4JAACAf7vgggty//33p7S0NJtttllOP/30HHXUUSvMHqpCcFRFffuekHHjxub666/LQQcdWukNaytjr72+kSuuuDojRvwxf/zjNUmSHXbYKVdeeU12261LdbfMWubzcGb69Gl5+umn8s4776RBgwbZcsstM3DgD3LccX2r5dnV7t33ys47d8wDD0zKSScNyFZbbV2+7vTTz8rMmTMyfvwdWbjwzbRu3SZnn31ujjuub5WPCwAAwMoZP3586tWrlwMOOCD77LNP6tSpkyeeeGKF+x199NGrfcySslWY2fmll17K0qXLstlmbVf7gMDaY+LEu/PLX16SoUOHp0uX3autbvMrmlRbrf/rnyf8o8Zqb7vvjTVW+3eLau4OrXNbXlxjtcvmXpIkWbjwvRo7BgAAta912w613cJabdnSedVSp0OHz34fSkpKVmr7srKylJSU5LnnnlvtY7rjCAAAAGAtMGjQoK/8mIIjgDXA9t03qrniNXcTFgDAWsVdM6tv/rw5td0CqZ3gyKzLAAAAABRyxxHwhXr16pNevfrUdhsAAADUEsERAAAAwDrmqquuSr169XLwwQfna1/72mrXERwBAAAArGOuuuqqlJSU5Morr8y3v/3tDBw4sPytbKtCcAQAAACwjhk0aFA+/fTTvPDCC3niiSdy33335bnnnlvlOoIjAAAAgHXM/30D2wsvvLBadbxVDQAAAGAd9PHHH+f9999PkrRv3361agiOAAAAANZBl1xySbp161alGoIjAAAAgHVUWVlZlfYXHAEAAABQSHAEAAAAQKFqfava9W2aVGe5ajHg9fdruwW+Qmd0/mltt1DJ0Gd+UdstAAAAwGqp1uBoXbV48eKMGTM6TzzxWObPn5+kLM2abZLtt2+fvffeJ336HL5Sdbp3363C53r16qVVq03TteseOfXUgdl0082qv/nV8O6772bSpHvz178+npdf/mcWL16cFi1apkOHHXLyyafk61/vUNstrnfWt2sQAACANYPgaAUWLJifAQNOzDvvLMl+++2fPn2OSP369TNv3muZMeOZjB1780r/0J4k22yzbfr1OzlJ8sEHH+SZZ6ZlwoTx+etfH8vo0WOz8cbNauQ8VsWsWc/msst+ly5duuaII47OJps0z9y5r+bOO8flkUceys9//v/yrW99u7bbXG+sj9cgAAAAawbB0QqMHj0qixe/lbPPPjfHHde30vq33lq0SvWaN2+Rgw8+tPzz0UcfmxYtWmTs2DGZOHFCvvvdflXuuaq+9rWtM3bsHdliiy0rLD/ooENy0kl984c//C777/+t1Kljiqyvwvp4DQIAAFDZDjvs8JUf00/+K/Daa68mSXbfvVvh+hYtWlb5GF277lHhWJ+bOPHudO++W5566n9y/fXX5YgjemWfffbIsccekVtvvaVSndLSj/LKKy9n0aKFVeqnTZs2lUKjJNl22+2yzTbbZfHit/L224urdAxW3vp4DQIAAFBZWVnZKv+qKnccrUDbtu2SfPYD9BlnnJV69ap/yObNey1J0rTpxoXrr776irz//vs57LAjUr/+Bpk8eVIuvfS/s3jxWznttDPKt5s1a1bOOGNgDjmkdy666GfV3uenn36axYsXpX79+mnSZKNqr08x1yAAAABJMmfOnK/8mIKjFejbt1/uv/++jBkzOpMm3ZvOnXfNjjvulE6dOqdjx06r/LjW8uXLsmTJ20mSDz/8MNOnT8t1112bunXr5cADDyrcZ/Hixbnppluz0UafhTXHHHNcTjvt1IwaNTK9evVJu3ZbVO0kV9K4cbdm0aJFOeSQ3mnQoMFXckxcgwAAANQewdEKtG3bLjfeeEvGjLkpjz325zz88JQ8/PCUJEmbNm1z/vk/zh577LnS9aZPn5aDDtq/wrKttto6v/zludl22+0K9znqqGPKf2BPkg022CB9+56Qn/zkgjz66CPlc9J06bJ7nnxy2qqe4kqZOvXpXHnlH9KmTdv88IeDa+QYFHMNAgAAUFsERyuhdes2GTz4vAwefF4WL16cmTNn5MEHJ2fy5Ek5//xzcuONt2SLLbbMhx9+mI8++rDCvo0bN0nDhg3LP7dv3yGDBv0wZWVlWbRoYcaNG5u5c19NvXr1v/D4W2+9zRcue+21uat1TivT6+f+/vdnct55P0qzZpvk8suHZuONix9nouasi9cgAAAAaz7B0Spq3rx5evTYNz167JvNN988o0aNzOTJD2TAgFNz002jMmLE8Arb/+Qnl6RXrz7ln5s2bZpu3fYo/9yz5wHp3/+EDBlyXsaMGZcWLVp8JeexMr0myfTpU3POOT/MRhs1zVVXDSucNJuv1rpyDQIAALDmExxVQceOnZIkCxe+mSQ55JBe2WWXXStss802le/U+E+NGjXKWWcNzuDBZ2b48KszZMhPK23z8ssvpUePfSstS7Lac8usTK9Tp/4t55zzw2yySfMMHXpt2rRpu1rHouaszdcgAAAAaz7B0QpMnfp0dtpppzRs2KjSukcffTjJvx/Zadu2XfkbsFbFXnvtnY4dO2XixAnp1+/kSj+I3377bTnyyH/PMbN06dLcfPPo1KlTJz16fLN8u9LSj7JgwYI0adIkLVu2+tJjrqjXv/3tf3LuuWenVauWueqqa7P55q1X+byoHuvqNQgAAMCaT3C0AmPH3pypU5/O3nvvkw4ddkjTphtlyZIlefzxxzJ9+tRsu+126d37sCof55RTBuZHPxqUESOG5+KLf1FhXfPmzdO//wnp3fuw1KtXP5MnT8qcOc/lxBP7V3h0rLpehf7cc7Nz7rlnZ9myZenT58hMn155suN99+2ZRo0qBxlUv/XxGgQAAGDNUK3B0YDX36/OcmuEz38wnj59Wp5++qm88847adCgQbbccssMHPiDHHdc32oJULp33ys779wxDzwwKSedNCBbbbV1+brTTz8rM2fOyPjxd2ThwjfTunWbnH32uTnuuL5VPm6Rf/7zH/n449IkydVXX1G4zS677LpGBkdDn/nFijday6yP1yAAAABrBnccrcDOO3fMzjt3rJZaK3pN+XXX/alwed26dTNgwPcyYMD3vnT/6noVeq9efSpNkk3tWR+vQQAAANYMdWq7AQAAAADWTIIjAAAAAAoJjgAAAAAoZI6jNZi5hqhtrkEAAID1mzuOAAAAACgkOAIAAACgkOAIAAAAgEKCIwAAAAAKCY4AAAAAKCQ4AgAAAKCQ4AgAAACAQoIjAAAAAArVq85ifzmydXWWqxb73DG/tlvgK9S8029ru4VKFs84r7ZbAAAAgNVSrcHRumrx4sUZM2Z0nnjiscyfPz9JWZo12yTbb98+e++9T/r0OXyl6nTvvluFz/Xq1UurVpuma9c9cuqpA7PppptVf/OracqUyXnyySfy/PNz8tJL/8yyZcsybNiIdO68a223tt55/fXXc889d+eb39wv7dt/vVpqvvjiCxk2bGhmzHgmn3zySbbddruceGL/fPOb+1VLfQAAANYNgqMVWLBgfgYMODHvvLMk++23f/r0OSL169fPvHmvZcaMZzJ27M0rHRwlyTbbbJt+/U5OknzwwQd55plpmTBhfP7618cyevTYbLxxsxo5j1U1btytmTXr2Wy77Xb52te2yj//+Y/abmm9NX/+6xkxYnhat25TLcHRiy++kO9/f0Dq198g3/lOvzRr1iyTJt2b888/Jz/5ySXp1atPNXQNAADAukBwtAKjR4/K4sVv5eyzz81xx/WttP6ttxatUr3mzVvk4IMPLf989NHHpkWLFhk7dkwmTpyQ7363X5V7rg4XXfSztGrVKvXq1c8f/zhMcLQO+f3v/7989NFHGTp0eHbYYcckSZ8+h2XAgJNy+eW/z3779Uzjxk1quUsAAADWBCbHXoHXXns1SbL77t0K17do0bLKx+jadY8Kx/rcxIl3p3v33fLUU/+T66+/Lkcc0Sv77LNHjj32iNx66y2V6pSWfpRXXnk5ixYtrHJPrVu3Sb169atch6r54x+H5YwzBiZJfvnLS9K9+27p3n23/OAH3yvfZtGihXnllZdTWvrRCuu9/vrreeaZ6dl11y7loVGS1KtXP8cee3zee++9/PnPj1b/iQAAALBWEhytQNu27ZJ8FuIsW7asRo4xb95rSZKmTTcuXH/11Vfk3nsn5LDDjshppw3KhhtumEsv/e8MGza0wnazZs3K8ccflauvvqpG+uSrt+++PXPSSQOSJIcffmQuvvgXufjiX+Tkk08p3+bqq6/K8ccflVmzZq2w3qxZzyZJOnbsVGldp067JElmz15xHQAAANYPHlVbgb59++X+++/LmDGjM2nSvencedfsuONO6dSpczp27JQ6dVYte1u+fFmWLHk7SfLhhx9m+vRpue66a1O3br0ceOBBhfssXrw4N910azbaaKMkyTHHHJfTTjs1o0aNTK9efdKu3RZVO0nWWNtv3z7vvvtu/vSn67Pzzp0qPOa4Ot58880kKZyIfdNNN/3fbd6o0jEAAABYdwiOVqBt23a58cZbMmbMTXnssT/n4Yen5OGHpyRJ2rRpm/PP/3H22GPPla43ffq0HHTQ/hWWbbXV1vnlL8/NtttuV7jPUUcdUx4aJckGG2yQvn1PyE9+ckEeffSR8nmRunTZPU8+OW1VT5G13EUX/SwXXfSzldr2449LkyQbbFD5McQNNmhQYRsAAAAQHK2E1q3bZPDg8zJ48HlZvHhxZs6ckQcfnJzJkyfl/PPPyY033pItttgyH374YT766MMK+zZu3CQNGzYs/9y+fYcMGvTDlJWVZdGihRk3bmzmzn31S+cT2nrrbb5w2WuvzV2tc1qZXln3NGjw2e/v0qWfVFq3dOnHFbYBAAAAwdEqat68eXr02Dc9euybzTffPKNGjczkyQ9kwIBTc9NNozJixPAK2//f15s3bdo03brtUf65Z88D0r//CRky5LyMGTMuLVq0+ErOY2V6Zd3zZY+jfdljbAAAAKyfBEdV8PkEwwsXfvYD9yGH9Mouu+xaYZtttql8t9B/atSoUc46a3AGDz4zw4dfnSFDflppm5dffik9euxbaVmS1Z7faHV6pXaUlJRUW62ddto5STJz5oxK65599rNlO+64U7UdDwAAgLWb4GgFpk59OjvttFMaNmxUad2jjz6c5N+PjbVt2678LWyrYq+99k7Hjp0yceKE9Ot3cqUw6Pbbb8uRR/57nqOlS5fm5ptHp06dOunR45vl25WWfpQFCxakSZMmadmy1Zcec3V75au34YafXXvvvvtu4fpFixbm/fffz+abb154nf6nNm3aplOnzpk2bWrmzJmdDh12TJIsW7Yst946Jk2aNMk++/So3hMAAABgrSU4WoGxY2/O1KlPZ++990mHDjukadONsmTJkjz++GOZPn1qtt12u/TufViVj3PKKQPzox8NyogRw3Pxxb+osK558+bp3/+E9O59WOrVq5/JkydlzpzncuKJ/bPFFluWbzdr1qycccbAHHJI75WeLPmLTJ8+NdOnT0+SPPPMZxNu33ffxEybNjVJcvDBh6R16zZVOgYrZ6uttsmGGzbOHXfcmoYNG2ajjTbKJptskt1375Ykufrqq3LvvRMydOjwdOmy+wrrDR58Xn7wg1Pzwx8OyvHH902zZs1y33335vnn5+TCCy9KkyYbrbAGAAAA64dqDY72uWN+dZZbI3wezkyfPi1PP/1U3nnnnTRo0CBbbrllBg78QY47rm8aNfryuzxWRvfue2XnnTvmgQcm5aSTBmSrrbYuX3f66Wdl5swZGT/+jixc+GZat26Ts88+N8cd17fKx/0iTz/9t0pzIN11153l/73LLp3XyOBo8YzzaruFatewYcP88pe/zrBhV+eyy36XpUuXZtddu5QHR6uqQ4cdMnz4yAwbdlVuumlUPvlkWbbddrv8+te/zX777b/iAgAAAKw3SsrKyspWduOXXnopS5cuy2abta3JnvhfEyfenV/+8pKVvpME1hbNr2hSY7X/ecI/aqz2tvveWGO179ru0hqrfdg/BtdY7bK5lyRJFi58r8aOAQBQXVq37VDbLay15s+bU9strNVatVp7n+yoU9sNAAAAALBmEhwBAAAAUEhwBAAAAEAhb1Vbg/Xq1Se9evWp7TYAAACA9ZQ7jgAAAAAoJDgCAAAAoJDgCAAAAIBCgiMAAAAACgmOAAAAACgkOAIAAACgkOAIAAAAgEKCIwAAAAAK1avOYs07/bY6y1WLxTPOq+0WAAAAANZK1RocrasWL16cMWNG54knHsv8+fOTlKVZs02y/fbts/fe+6RPn8NXqk737rtV+FyvXr20arVpunbdI6eeOjCbbrpZ9Te/AqWlH2XEiD9m8uT789Zbi9KiRcsceOBBGTDg1DRs2Ogr7wcAAABYcwiOVmDBgvkZMODEvPPOkuy33/7p0+eI1K9fP/PmvZYZM57J2LE3r3RwlCTbbLNt+vU7OUnywQcf5JlnpmXChPH5618fy+jRY7Pxxs1q5DyKLF++PGeffVamT5+agw8+NJ0775YXX3whN900KrNnz8wVV1yTOnU8zQgAAADrK8HRCowePSqLF7+Vs88+N8cd17fS+rfeWrRK9Zo3b5GDDz60/PPRRx+bFi1aZOzYMZk4cUK++91+Ve55Zd1774RMnz41xxxzfM4557/Kl7du3SZXXvmHTJp0bw45pNdX1g8AAACwZnE7yQq89tqrSZLdd+9WuL5Fi5ZVPkbXrntUONbnJk68O92775annvqfXH/9dTniiF7ZZ589cuyxR+TWW2+pVKe09KO88srLWbRo4Uod995770mS9O17QoXlRx11TBo0aJh77524OqcDAAAArCMERyvQtm27JJ+FOMuWLauRY8yb91qSpGnTjQvXX331Fbn33gk57LAjctppg7Lhhhvm0kv/O8OGDa2w3axZs3L88Ufl6quvWuExy8rK8txzs9KqVau0bt2mwrqGDRumffv2ee652at5RgAAAMC6wKNqK9C3b7/cf/99GTNmdCZNujedO++aHXfcKZ06dU7Hjp1WeQ6g5cuXZcmSt5MkH374YaZPn5brrrs2devWy4EHHlS4z+LFi3PTTbdmo402SpIcc8xxOe20UzNq1Mj06tUn7dptscrn9e6776S0tDTbbLNd4fpNN90szz47Ix988H4aN26yyvUBAACAtZ/gaAXatm2XG2+8JWPG3JTHHvtzHn54Sh5+eEqSpE2btjn//B9njz32XOl606dPy0EH7V9h2VZbbZ1f/vLcbLttcYhz1FHHlIdGSbLBBhukb98T8pOfXJBHH32kfF6kLl12z5NPTlupPkpLS/+3Vv3C9RtssEH5doIjAAAAWD8JjlZC69ZtMnjweRk8+LwsXrw4M2fOyIMPTs7kyZNy/vnn5MYbb8kWW2yZDz/8MB999GGFfRs3bpKGDRuWf27fvkMGDfphysrKsmjRwowbNzZz576aevWKA5wk2Xrrbb5w2WuvzV2tc/q8p6VLPylcv3Tp0grbAQAAAOsfwdEqat68eXr02Dc9euybzTffPKNGjczkyQ9kwIBTc9NNozJixPAK2//kJ5ekV68+5Z+bNm2abt32KP/cs+cB6d//hAwZcl7GjBmXFi1afCXn0bTpxmnYsGEWLnyjcP2bb76Rxo2buNsIAAAA1mOCoyro2LFTkmThwjeTJIcc0iu77LJrhW222aby3UL/qVGjRjnrrMEZPPjMDB9+dYYM+WmlbV5++aX06LFvpWVJVmt+oyQpKSnJDjvsmOnTp2X+/NcrTJBdWlqaF154ofz8AAAAgPWTt6qtwNSpT6e09KPCdY8++nCSfz821rZtu3TrtkeFXy1btlrhMfbaa+907NgpEydOKHz07Pbb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AAAKCY4AAAAAKCQ4AgAAAKCQ4AgAAACAQoIjAAAAAAqVlJWVldV2EwAAAACsedxxBAAAAEAhwREAAAAAhQRHAAAAABQSHAEAAABQSHAEAAAAQCHBEQAAAACFBEcAAAAAFBIcAQAAAFBIcAQAAABAIcERAAAAAIUERwAAAAAUEhwBAAAAUEhwBAAAAEAhwREAAAAAhQRHAAAAABQSHAEAAABQqF5tNwCwqj799NPUqSP3rqoTTzwxP/jBD7LnnnsWrn/yySdz9dVXZ9SoUV9xZyvngQceyHXXXZcXXngh9evXT5cuXTJ48OC0b99+pfZ/++23c9lll2XKlClZsmRJ2rZtm6OPPjr9+/dPvXrr1l+Pw4cPz+zZszN79uy8+uqrqVOnTmbPnl1t9ceOHZunn346s2fPzssvv5zly5fn0Ucfzeabb15tx1gTVNc4rk/X3n+qjvGbMWNG7r777jz33HN57rnn8sEHH+SHP/xhTj/99Brquna88sormTBhQh5//PHMnTs3H3zwQdq0aZO99torAwcOzKabbrratd94443cddddeeyxx/Lyyy/nnXfeSevWrbPbbrvltNNOy9e+9rVqPJPaUZPjl6w/33lJ9Y3l+vi9Vx1jt7585xWp6viVlZVlwoQJefTRRzNz5sy88cYbadKkSbbeeuuceOKJOeCAA1JSUvIVnc3az09ewFrlmmuuyc4771zbbayWZcuW1XYLFTz11FNZtGjRF65fvHhx/va3v32FHa282267LWeeeWY++uijnHvuuTnttNPy/PPP5/jjj8/zzz+/wv3ff//9nHDCCbntttty0EEH5eKLL84uu+yS3/3ud/npT3/6FZzBV+v3v/99Hn/88Wy++eZp2bJltde/9tpr8+CDD6Zp06Zp27ZttddfU1THOK5v195/qo7xe/TRR3PTTTdl8eLF2Wmnnaq5wzXHuHHjcv3116dNmzYZOHBghgwZkl122SU333xzevXqlX/+85+rXfuhhx7KFVdckcaNG+fkk0/OT3/60+yzzz6555570qtXrzX2e39V1OT4JevPd15SPWO5vn7vVcfYrS/feUWqOn5Lly7NeeedlxdffDHf/va3c+GFF+bEE0/Mm2++mUGDBuVnP/vZV3Qm64gygLXI1VdfXdahQ4fabmOVLF++vGzcuHFlBxxwQJXqvPrqq2UjR44su+SSS8ouueSSspEjR5a9+uqrq13v61//etndd9/9hevHjBlT1qlTp9WuX1OWLFlStttuu5X16NGj7L333itfPm/evLLOnTuX9evXb4U1LrvssrL27duXXX/99RWW//znPy9r37592VNPPVXtfdemf/3rX+X/fcIJJ5TtsMMO1Vr/1VdfLVu+fHlZWVlZ2fnnn1/Wvn37svnz51frMdYE1TGO69u195+qY/wWLlxY9v7775eVlZWVPfnkk2Xt27cvGzp0aLX1uKaYMWNG2TvvvFNp+S233FLWvn37srPOOmu1a7/wwgtlb7zxRqXlf/nLX8rat29fdtRRR6127TVFTY5fWdn6851XVlY9Y7m+fu9Vx9itL995Rao6fp988knZX//610rLP/jgg7IDDzywrH379mUvvPBCtfW7rls37wsE+F+rc3fSzJkzV2n72bNn55VXXskmm2ySrl27Vrjl+p577smVV16ZV155JY0bN17lXj53+eWXZ/jw4Vm+fHmF5b/97W9z6qmn5uyzz16pOnPmzMmcOXPKPz/99NOVaibJkiVLMmbMmGy77bar3XNNmTJlSt5///30798/TZo0KV/epk2bfPvb386dd96Z+fPnp3Xr1l9Y46677kqjRo3yne98p8Ly/v37Z/To0Rk/fny6du1aY+fwVdtyyy1rtP4WW2xRo/XXFNUxjuvbtfefqmP8auKOuTVRx44dC5cfeuihueiii1bqzsovsv322xcu/8Y3vpGNN964SrXXFDU5fsn6852XVM9Yrq/fe9UxduvLd16Rqo5fvXr10r1790rLN9xww+y777654YYb8sILL3zhdyIVCY6AddqyZcvSsGHD7LzzztX+HPPHH3+cQYMG5bHHHitf1rZt24wcOTINGjTI4MGDM3Xq1DRq1CgDBw5M//79V+s4o0ePzjXXXJNOnTqlf//+2W677ZIkL774YkaOHJnhw4enVatWOeGEE1ZY68EHH8xVV12VJCkpKcnYsWMzduzYwm0bN26cCy+8cLV6rkl///vfkyS77rprpXW77rpr7rzzzjz77LNfGBwtWrQo8+bNy6677pqGDRtWWNeuXbu0atUqM2bMqP7GWe+59qiqN954I0nN/DD53nvv5cMPP0yrVq2qvfaaoibHb32zsmPpe68y12HVVMf4fV6jRYsW1dLT+kBwBKzT2rRpk9dffz2vv/56jjzyyBx99NHVNnnlddddl7/85S/Zcccds8cee+TVV1/NlClT8rOf/SxvvPFG/vWvf+WUU07JqaeemmbNmq32cUaPHp2dd945N910U+rXr1++fPvtt88BBxyQ448/PqNHj16p4OiII45It27dUlZWlpNOOimnnXZa9tprrwrblJSUZMMNN8x2222XBg0arHbfNeXzv+yLfh8/X7ZgwYIv3P/zdV90HWy++eZ59dVXq9omVOLao6ouv/zyJMmRRx5Z7bWHDh2aTz75pEZqrylqcvzWNys7lr73KnMdVk1Vx2/WrFmZPHlyvva1r6VLly7V2do6TXAErNMeeuihPP7447ntttty7bXX5pprrslee+2VY445Jj179qzSmzwmTZqUzp075+abby5/y9vll1+ea665JptuumnuvPPOannUa968eTnnnHMqhEaf22CDDdK7d+9ceumlK1Wrbdu25RN5Dho0KAceeOBKv4VsTfHRRx8l+ezc/6/Pl5WWln7h/p+vK9o/SRo0aFB+DKhOrj2qYtiwYbn//vtzwAEH5IgjjqjW2nfffXdGjhyZTp065fvf/3611l5T1OT4rW9WZSx971XkOqyaqo7f5xNj16lTJ7/97W8L/21NMcERUOuGDRu20tuuztte9t577+y99955++23M378+Nx+++0566yz0rx58xx22GE5+uijVyvgmTt3bs4+++zy0ChJevXqlWuuuSbf+973qm1+oE033TRLly79wvWffPJJNttss1WuO2jQoKq0VWsaNWqUJIVj8vmy/3s7/H/6fN0XjenHH39cfgw+895771UK4zbeeOMv/EGAYq49Vtef/vSn/OEPf0i3bt3yu9/9boWPXq/Kn9n7778/Q4YMSfv27XPttdeuk3+ua3L81jerOpa+9/5tVceOiqo6fgsXLszJJ5+chQsX5rLLLssuu+xSQ52umwRHQK277LLLVmn71f2LdpNNNkn//v3Tv3//TJs2LePGjcstt9ySG264IUOGDMmJJ564SvVKS0vTvHnzCss+/7z11luvVo9FjjrqqNx+++3p27dvhcmgk8/+cXv77bfnqKOOqrbjrek+D8kWLFhQKZxb0S3x/7nuix5nW7BgwWoFceuyX/3qV7nzzjsrLBs1alT22GOPWupo7eTaY3WMHDkyv/nNb7LnnnvmmmuuWakfslf2z+y9996b8847L9tuu21uuOGGSn+nrQtqcvzWN6szlr73PrM6Y8e/VXX83njjjZx00kmZN29errjiivTs2bOGOl13CY6AWjdq1Kiv/JidOnXKG2+8kVdeeSXTpk3Lu+++W63169atW221dt1110yZMiW9e/dO3759y8OSf/zjHxkzZkxatGiRzp07V7oba118Q0ny2e/dLbfckunTp2fvvfeusO6ZZ55J8sVv4kg+m0yxTZs2mTNnTkpLSyvcnTRv3rwsXLgw3/zmN2uk97XVqaeemj59+lRY1qFDh1rqZu3l2mNVDR8+PL///e+zzz77ZOjQoSs979zK/JmdMGFCzj///HTo0CHXX399lebiW1PV5Pitb1Z3LH3vrf7Y8Zmqjt+CBQty0kknZf78+Rk6dGh69OhRQ52u2wRHQK3r1q3bV3asF198MePGjcvdd9+dJUuWZLvttsuQIUNy+OGHr1a9KVOmZN68eeWfP/roo5SUlGTChAnlb//6XElJyWrNHfGfb2P7/e9/X37HVVlZWZJk/vz5GTBgQPk2ZWVlKSkpyXPPPbfKx1obHHDAAfnVr36V2267LSeffHL5XVivv/56Jk2alG7dun3hG9U+16dPnwwbNixjxoypML4jR45Mkhx22GE1dwJroe222678bX5UjWuPlTVs2LD84Q9/yH777ZcrrrhilR6TWtGf2bvuuisXXHBBdt5554wYMSJNmzatjpbXKDU5fuubqoxlsn5/71V17NZ3VR2/+fPn58QTT8zChQszbNiwSi+EYeWVlH3+kwfAOuqDDz7IPffck3HjxuXZZ5/NhhtumEMPPTRHH310OnXqtNp1V/X/Pq5umPN/b5dfWevypIu33HJLLr744rRv3z7HHXdcli5dmtGjR+ftt9/OmDFjyn9vXnvttey///7p1q1bbrzxxvL933///Rx99NF59dVX07dv33z961/P3/72t9x111057LDD8t///d+1dWo1Yvz48Xn99deTJOPGjcv8+fNz5plnlq8//fTTy//7i8bsyzz00EOZM2dOkmTy5MmZPXt2TjnllPJQr1+/ftloo42q63RqTXWM4/p27f2n6hi/efPm5a677irf5vbbb89ee+1Vfodl165d14m7LW+66ab8/Oc/T8uWLTN48OBKL3Jo3LhxDjjggCSr/mf2oYceyhlnnJGGDRvm3HPPrfQIdLL2/yBfk+OXrD/feUn1jOX6+r1XHWO3vnznFanq+L3//vs5/PDDM3fu3BxzzDGF47Tbbrtliy22qPmTWQe44whYpw0ZMiSTJk1KaWlpOnfunF/96lc5+OCDq+XZ8q/qEbt1OQBaXccff3yaNWuWESNGlL8VY/fdd8+PfvSjCoHeBx98kOSzCcb/U5MmTXLzzTfnsssuy6RJk3LLLbekbdu2OeeccyrcvbWuuP322/PUU09VWPb562yTij+wf9GYfZkHHnigUsA5YsSI8v/u06fPOvFDVHWM4/p27f2n6hi/1157rcI+SfLEE0/kiSeeSPLZpP/rwg9Rzz77bJJk0aJF+fGPf1xpfdu2bct/YFrVP7OzZs3Kp59+mg8//DA///nPC7dZ24Ojmhy/ZP35zkuqZyzX1++96hi79eU7r0hVx2/JkiWZO3dukuS2227LbbfdVqnGr3/9a8HRSnLHEbBO69ChQxo2bJhvfetbK/WWs9V9nKy2vfzyy9U6Ife64oYbbsjvfve7TJgwwfisJGNWPYxj1Ri/lWesqsb4VR9jufqMXdUYv5rnjiNgnVdaWpoJEyas1LZrW3A0d+7cDB06NBMnTszMmTNru501zl/+8pccd9xx/hGxCoxZ9TCOVWP8Vp6xqhrjV32M5eozdlVj/GqeO46Addr/fSxiZXyVk3V/mXfeeSd33nlnXnnllTRr1iy9evUqn6xz8eLFueyyy3LHHXdk2bJl6dy5c2655ZZa7hgAAFjXCI4A1kBvvPFGjj322Lz55pvlb0+rV69e/vjHP6ZevXo588wzs2TJknTu3DmDBg3KN77xjVruGAAAWBcJjgDWQD/96U8zbty49OvXL3vttVf+9a9/ZejQodl0003z5ptvplWrVjn//PPTo0eP2m4VAABYh5njCGAN9MQTT+SQQw6p8BaJpk2bZsiQIenYsWNGjRpVLW+GAwAA+DJ1arsBACp74403svvuu1dY9vnrVr/73e8KjQAAgK+E4AhgDbRs2bI0adKkwrLGjRsnSTbbbLPaaAkAAFgPCY4A1lAlJSWrtBwAAKC6mRwbYA3UoUOHbL/99mnVqlX5sk8++SRPP/10dthhhzRr1qzC9iUlJRkxYsRX3CUAALCuExwBrIE6dOiwStuXlJTkueeeq6FuAACA9ZXgCAAAAIBC9Wq7AQAAWJ99/etfr/C5Tp06adq0ab7+9a/nmGOOSe/evVeqzgUXXJA777yzwrKGDRumbdu26dGjRwYOHJjmzZtXW98ArB8ERwBrmY8//jj33XdfvvGNb6Rly5a13Q4A1WTQoEFJPnuz5ksvvZQpU6bkf/7nfzJz5swMGTJkpevsv//+2WGHHZIkixYtyp///OeMHDkyDzzwQG6//fZssskmNdI/AOsmwRHAWua9997LkCFDcv311wuOANYhZ555ZoXPf/3rX9O/f//86U9/Sr9+/dKuXbuVqnPAAQfkyCOPLP/88ccf59hjj82cOXNy0003lQdUALAy6tR2AwCsOtPTAaz79txzz2yzzTYpKyvLs88+u9p1GjRoUP64W1Gdnj17pmfPnnnvvffy85//PPvss086duyYQw45JKNGjfJ3DsB6zh1HAACwhvo8tCkpKamWevXqFf/zf+nSpTn55JPz3nvv5dBDD80nn3yS+++/P7/61a/y8ssv5+KLL66W4wOw9hEcAQDAGuiJJ57Iyy+/nJKSknTs2HG165SWluauu+5KknTp0qVwm4ULF2aLLbbIxIkTs8EGGyT57NG5o48+OjfffHMOOeSQdO3adbV7AGDtJTgCWMtsuOGGGTRoULbYYovabgWAanTllVcm+Wxy7JdffjkPPvhgysrKcvLJJ6dt27YrXefBBx/MvHnzkiRvvfVWHnnkkcyfPz9du3bNd77znS/c75xzzikPjZKkWbNmOf300zNkyJDccccdgiOA9ZTgCGAt89Zbb6VevXoZMWJEtttuuxx11FFp2LBhbbcFQBVdddVVST57LK1p06bp0qVLjj766Bx22GGrVGfKlCmZMmVKhWV77713rr322tSvX79wn3r16mXXXXettLxbt25JktmzZ69SDwCsOwRHAGugcePGZdSoURk5cmRatGhRvvzxxx/PoEGDUlpamrKyspSUlOTWW2/NmDFjsuGGG9ZixwBU1fPPP18tdX7961/nyCOPzPLlyzN37txcfvnluffee3PJJZfkV7/6VeE+m2yySerWrVtpeatWrZJ89kZPANZP3qoGsAZ65JFH0rhx4wqhUVlZWS6++OKUlpbme9/7Xq655pocfvjhef755zNq1Kha7BaANVHdunWz1VZb5fe//3122WWXjBs3rtKdSJ97++23s3z58krLFy5cmCTZaKONarRXANZcgiOANdCcOXMqTWA6ffr0vPbaa+nVq1cGDx6c/fbbL7/+9a/TtWvXPPjgg7XUKQBrujp16uTCCy9Mkvzud78rDIiWLVuW6dOnV1r+1FNPJUl23HHHmm0SgDWW4AhgDbR48eJKk19PmzYtJSUlOfjggyss33ffffPKK698hd0BUJsuuOCCfP3rX88dd9yx0vvssssu2W+//fLSSy9l/Pjxhdv8/ve/z9KlS8s/L1myJNdcc02S5Mgjj6xSzwCsvcxxBLAGKikpySeffFJh2YwZM5IknTt3rrB8k002SWlp6VfVGgC17NNPP02SwjmJvsxZZ52VRx55JEOHDk3v3r0rvEGtVatWWbp0aXr16pWePXtm2bJlmTRpUhYuXJi+fft6oxrAeswdRwBroDZt2lR4ZGD58uWZOnVq2rVrl+bNm1fY9t13302zZs2+4g4BqC0vvPBCGjdunH333XeV9ttxxx3zrW99K/PmzcvYsWMrrNtggw1yww03ZO+9984999yTW265JRtttFEuvPDCXHTRRdXYPQBrG3ccAayBvvnNb+aGG27Irrvumu7du+f222/P4sWLc+ihh1badubMmWnbtm0tdAlAdViVt6m9++67ef7559O/f/9svPHGFdb95je/yW9+85sv3f/KK6/8wnUbbbRRLr744lx88cUr3Q8A6z7BEcAaaMCAAbnzzjvLX5tcVlaWpk2bpn///hW2Ky0tzSOPPJLjjz++NtoE4Cv29NNPp169epX+PgCAmiI4AlgDNW/ePOPGjct1112Xf/3rX9lyyy3Tv3//tG7dusJ2M2bMyB577JEDDzywljoF4KvUs2fPPPvss7XdBgDrkZKysrKy2m4CAACoHT179kySPPTQQ7XcCQBrIsERAAAAAIW8VQ0AAACAQoIjAAAAAAoJjgAAAAAoJDgCAAAAoJDgCAAAAIBCgiMAAAAACgmOAAAAACgkOAIAAACgkOAIAAAAgEKCIwAAAAAK/f+UCXGt+ra6hwAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "# Use lmPlot to show the full dimensionality\n", "ep.lmPlot(basis[termName], xDim={'PR':denDims});" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this case, we could also compose the density matrix directly by passing the relevant dims to the plotting function (all other dims will be stacked)...\n", "\n", "(Two issues - plotting may be slow for multi-dim case, and many combinations may be zero/uninteresting.)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "tags": [] }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "WARNING:param.HeatMapPlot264200: Due to internal constraints, when aspect and width/height is set, the bokeh backend uses those values as frame_width/frame_height instead. This ensures the aspect is respected, but means that the plot might be slightly larger than anticipated. Set the frame_width/frame_height explicitly to suppress this warning.\n" ] }, { "data": {}, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.holoviews_exec.v0+json": "", "text/html": [ "
\n", "
\n", "
\n", "" ], "text/plain": [ ":HoloMap [P,L,M,S-Rp,t,pType]\n", " :HeatMap [R,Rp] (AFterm)" ] }, "execution_count": 18, "metadata": { "application/vnd.holoviews_exec.v0+json": { "id": "p7630" } }, "output_type": "execute_result" } ], "source": [ "# Plot\n", "daIn.name = termName # Set name - note this can't be the same as a dimension!\n", "# hvmap = density.matPlot(daIn.squeeze(), kdims = ['P','Rp']) # Sum & slice data prior to plot\n", " # Note that summation may replace NaNs with zeros.\n", "hvmap = density.matPlot(daIn, kdims = ['R','Rp'])\n", "hvmap" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "tags": [] }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "WARNING:param.HeatMapPlot424103: Due to internal constraints, when aspect and width/height is set, the bokeh backend uses those values as frame_width/frame_height instead. This ensures the aspect is respected, but means that the plot might be slightly larger than anticipated. Set the frame_width/frame_height explicitly to suppress this warning.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Set plot kdims to ['mu,mup', 'mu,mup_p']; pass kdims = [dim1,dim2] for more control.\n" ] }, { "data": {}, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.holoviews_exec.v0+json": "", "text/html": [ "
\n", "
\n", "
\n", "" ], "text/plain": [ ":HoloMap [Rp,P,pType]\n", " :HeatMap [mu,mup,mu,mup_p] (lambdaTerm)" ] }, "execution_count": 19, "metadata": { "application/vnd.holoviews_exec.v0+json": { "id": "p10703" } }, "output_type": "execute_result" } ], "source": [ "# Compose density matrix\n", "\n", "termName = 'lambdaTerm' # 'AKQS' # Also needs fixing for single-value case? # 'lambdaTerm' # Needs fixing for singleton dim case! # NOW OK if squeeze = False\n", "daIn = basis[termName] # Set data\n", "\n", "# Set dimensions/state vector/representation\n", "# These must be in original data, but will be restacked as necessary to define the effective basis space.\n", "denDims = ['mu','mup'] # 'ADM' #\n", "daIn.name = termName\n", "\n", "# Calculate + sum over other terms\n", "daOut, *_ = density.densityCalc(daIn, denDims = denDims, selDims = selDims, thres = thres) #, squeeze = False) #, sumDims=True) # OK\n", "\n", "daOut.name = termName # Set name - note this can't be the same as a dimension!\n", "\n", "# Plot\n", "hvmap = density.matPlot(daOut) # Sum & slice data prior to plot\n", " # Note that summation may replace NaNs with zeros.\n", "hvmap" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "{'dataDims': ('Rp', 'P', 'mu', 'mup', 'Labels'),\n", " 'dataDimsUS': ('Rp', 'P', 'mu', 'mup', 'Labels'),\n", " 'refDims': ['mu', 'mup'],\n", " 'refDimsUS': ['mu', 'mup'],\n", " 'shared': ['mu', 'mup'],\n", " 'extra': ['Labels', 'Rp', 'P'],\n", " 'extraUS': [],\n", " 'invalid': [],\n", " 'invalidUS': [],\n", " 'stacked': [],\n", " 'stackedMap': {},\n", " 'stackedShared': [],\n", " 'stackedExtra': [],\n", " 'stackedComponents': [],\n", " 'stackedInvalid': [],\n", " 'missing': [],\n", " 'safeStack': {},\n", " 'stackedRef': False,\n", " 'nonDimCoords': ['Euler'],\n", " 'nonDimMap': {},\n", " 'nonDimStacked': {},\n", " 'nonDimDicts': {},\n", " 'nonDimDims': {}}" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ep.util.misc.checkDims(daIn, refDims = denDims)\n" ] }, { "cell_type": "markdown", "metadata": { "tags": [] }, "source": [ "## Density matrix from geometric tensors\n", "\n", "As [discussed here](https://epsproc.readthedocs.io/en/dev/methods/ePSproc_geom_methods_summary_190821-v1-tidy.html), photoionization can be defined in terms of a set of geometric tensors (state multipoles). These are [intimately related to the density matrix](https://github.com/phockett/Quantum-Metrology-with-Photoelectrons/blob/master/Alignment/Alignment-1.ipynb#State-Multipoles), and can be thought of as a coupled basis equivalent. \n", "\n", "For example, in the $\\{|JM\\rangle\\}$ representation (Eqn. 4.8 in Blum [1]):\n", "\n", "\\begin{equation}\n", "\\hat{T}(J',J)_{KQ}=\\sum_{M'M}(-1)^{J'-M'}(2K+1)^{1/2}\\left(\\begin{array}{ccc}\n", "J' & J & K\\\\\n", "M' & -M & Q\n", "\\end{array}\\right)|J'M'\\rangle\\langle JM|\n", "\\end{equation}\n", "\n", "Where $\\hat{T}(J',J)_{KQ}$ are tensor operators. The corresponding matrix elements are (Eqn. 4.9 in Blum [1]):\n", "\n", "\\begin{equation}\n", "\\langle J'M'|\\hat{T}(J',J)_{KQ}|JM\\rangle=(-1)^{J'-M'}(2K+1)^{1/2}\\left(\\begin{array}{ccc}\n", "J' & J & K\\\\\n", "M' & -M & Q\n", "\\end{array}\\right)\n", "\\end{equation}\n", "\n", "The density matrix can be written in terms of the tensor operators\n", "(Eqn. 4.30 in Blum):\n", "\n", "\\begin{equation}\n", "\\boldsymbol{\\rho}=\\sum_{KQ}\\sum_{J'J}\\left[\\sum_{M'M}\\langle J'M'|\\hat{\\rho}|JM\\rangle(-1)^{J'-M'}(2K+1)^{1/2}\\left(\\begin{array}{ccc}\n", "J' & J & K\\\\\n", "M' & -M & Q\n", "\\end{array}\\right)\\right]\\hat{T}(J',J)_{KQ}\n", "\\end{equation}\n", "\n", "And the state multipoles are defined as the term in square brackets\n", "(Eqn. 4.31 in Blum):\n", "\n", "\\begin{equation}\n", "\\left\\langle T(J',J)_{KQ}^{\\dagger}\\right\\rangle =\\sum_{M'M}\\langle J'M'|\\hat{\\rho}|JM\\rangle(-1)^{J'-M'}(2K+1)^{1/2}\\left(\\begin{array}{ccc}\n", "J' & J & K\\\\\n", "M' & -M & -Q\n", "\\end{array}\\right)\n", "\\end{equation}\n", "\n", "And the inverse (Eqn. 4.34 in Blum):\n", "\n", "\\begin{equation}\n", "\\langle J'M'|\\hat{\\rho}|JM\\rangle=\\sum_{KQ}(-1)^{J'-M'}(2K+1)^{1/2}\\left(\\begin{array}{ccc}\n", "J' & J & K\\\\\n", "M' & -M & -Q\n", "\\end{array}\\right)\\left\\langle T(J',J)_{KQ}^{\\dagger}\\right\\rangle \n", "\\end{equation}\n", "\n", "---\n", "\n", "As [discussed above](#Density-matrices-from-other-data-types), the AF-$\\beta_{LM}$ routines currently define a set of geometric tensors. These can be regarded & treated in general as state multipole type terms (although this is not strictly true in all cases) with appropriate summations. This means that the basis can be readily expressed in terms of mulitpoles or density matrices, and a few examples are given below.\n", "\n", "(Note demos in previous section only plot existing tensors, but don't convert definitions.)\n", "\n", "TODO: update matPlot & consolidate dim-handling routines from densityCalc to provide easier plotting routines here (without manual restack etc.)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Density matrix from arb tensors\n", "\n", "As of [commit e2dcdd326e6e144fb4c442383ee096353314b17f](https://github.com/phockett/ePSproc/commit/e2dcdd326e6e144fb4c442383ee096353314b17f) (23/07/24), `densityFromSphTensor()` is available. This implements the final equation above (Eqn. 4.34 in Blum) to convert an input spherical tensor to density matrix form." ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Set denDims={'JM': ['J', 'M'], 'JpMp': ['Jp', 'Mp']}. Pass directly for more control.\n", "Set sphDims={'KQ': ['K', 'Q']}. Pass directly for more control.\n", "['J', 'Jp']\n", "['M', 'Mp']\n", "['J', 'Jp', 'K', 'M', 'Mp', 'Q']\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataArray 'BLM' (t: 6, JM: 45, JpMp: 45)>\n",
       "array([[[0., 0., 0., ..., 0., 0., 0.],\n",
       "        [0., 0., 0., ..., 0., 0., 0.],\n",
       "        [0., 0., 0., ..., 0., 0., 0.],\n",
       "        ...,\n",
       "        [0., 0., 0., ..., 0., 0., 0.],\n",
       "        [0., 0., 0., ..., 0., 0., 0.],\n",
       "        [0., 0., 0., ..., 0., 0., 0.]],\n",
       "\n",
       "       [[0., 0., 0., ..., 0., 0., 0.],\n",
       "        [0., 0., 0., ..., 0., 0., 0.],\n",
       "        [0., 0., 0., ..., 0., 0., 0.],\n",
       "        ...,\n",
       "        [0., 0., 0., ..., 0., 0., 0.],\n",
       "        [0., 0., 0., ..., 0., 0., 0.],\n",
       "        [0., 0., 0., ..., 0., 0., 0.]],\n",
       "\n",
       "       [[0., 0., 0., ..., 0., 0., 0.],\n",
       "        [0., 0., 0., ..., 0., 0., 0.],\n",
       "        [0., 0., 0., ..., 0., 0., 0.],\n",
       "        ...,\n",
       "...\n",
       "        ...,\n",
       "        [0., 0., 0., ..., 0., 0., 0.],\n",
       "        [0., 0., 0., ..., 0., 0., 0.],\n",
       "        [0., 0., 0., ..., 0., 0., 0.]],\n",
       "\n",
       "       [[0., 0., 0., ..., 0., 0., 0.],\n",
       "        [0., 0., 0., ..., 0., 0., 0.],\n",
       "        [0., 0., 0., ..., 0., 0., 0.],\n",
       "        ...,\n",
       "        [0., 0., 0., ..., 0., 0., 0.],\n",
       "        [0., 0., 0., ..., 0., 0., 0.],\n",
       "        [0., 0., 0., ..., 0., 0., 0.]],\n",
       "\n",
       "       [[0., 0., 0., ..., 0., 0., 0.],\n",
       "        [0., 0., 0., ..., 0., 0., 0.],\n",
       "        [0., 0., 0., ..., 0., 0., 0.],\n",
       "        ...,\n",
       "        [0., 0., 0., ..., 0., 0., 0.],\n",
       "        [0., 0., 0., ..., 0., 0., 0.],\n",
       "        [0., 0., 0., ..., 0., 0., 0.]]])\n",
       "Coordinates:\n",
       "  * t        (t) int64 0 1 2 3 4 5\n",
       "  * JM       (JM) MultiIndex\n",
       "  - J        (JM) int64 0 0 0 0 0 0 0 0 0 1 1 1 1 ... 3 3 3 3 4 4 4 4 4 4 4 4 4\n",
       "  - M        (JM) int64 4 3 2 1 0 -1 -2 -3 -4 4 3 ... -4 4 3 2 1 0 -1 -2 -3 -4\n",
       "  * JpMp     (JpMp) MultiIndex\n",
       "  - Jp       (JpMp) int64 0 0 0 0 0 0 0 0 0 1 1 1 1 ... 3 3 3 4 4 4 4 4 4 4 4 4\n",
       "  - Mp       (JpMp) int64 -4 -3 -2 -1 0 1 2 3 4 -4 ... 4 -4 -3 -2 -1 0 1 2 3 4
" ], "text/plain": [ "\n", "array([[[0., 0., 0., ..., 0., 0., 0.],\n", " [0., 0., 0., ..., 0., 0., 0.],\n", " [0., 0., 0., ..., 0., 0., 0.],\n", " ...,\n", " [0., 0., 0., ..., 0., 0., 0.],\n", " [0., 0., 0., ..., 0., 0., 0.],\n", " [0., 0., 0., ..., 0., 0., 0.]],\n", "\n", " [[0., 0., 0., ..., 0., 0., 0.],\n", " [0., 0., 0., ..., 0., 0., 0.],\n", " [0., 0., 0., ..., 0., 0., 0.],\n", " ...,\n", " [0., 0., 0., ..., 0., 0., 0.],\n", " [0., 0., 0., ..., 0., 0., 0.],\n", " [0., 0., 0., ..., 0., 0., 0.]],\n", "\n", " [[0., 0., 0., ..., 0., 0., 0.],\n", " [0., 0., 0., ..., 0., 0., 0.],\n", " [0., 0., 0., ..., 0., 0., 0.],\n", " ...,\n", "...\n", " ...,\n", " [0., 0., 0., ..., 0., 0., 0.],\n", " [0., 0., 0., ..., 0., 0., 0.],\n", " [0., 0., 0., ..., 0., 0., 0.]],\n", "\n", " [[0., 0., 0., ..., 0., 0., 0.],\n", " [0., 0., 0., ..., 0., 0., 0.],\n", " [0., 0., 0., ..., 0., 0., 0.],\n", " ...,\n", " [0., 0., 0., ..., 0., 0., 0.],\n", " [0., 0., 0., ..., 0., 0., 0.],\n", " [0., 0., 0., ..., 0., 0., 0.]],\n", "\n", " [[0., 0., 0., ..., 0., 0., 0.],\n", " [0., 0., 0., ..., 0., 0., 0.],\n", " [0., 0., 0., ..., 0., 0., 0.],\n", " ...,\n", " [0., 0., 0., ..., 0., 0., 0.],\n", " [0., 0., 0., ..., 0., 0., 0.],\n", " [0., 0., 0., ..., 0., 0., 0.]]])\n", "Coordinates:\n", " * t (t) int64 0 1 2 3 4 5\n", " * JM (JM) MultiIndex\n", " - J (JM) int64 0 0 0 0 0 0 0 0 0 1 1 1 1 ... 3 3 3 3 4 4 4 4 4 4 4 4 4\n", " - M (JM) int64 4 3 2 1 0 -1 -2 -3 -4 4 3 ... -4 4 3 2 1 0 -1 -2 -3 -4\n", " * JpMp (JpMp) MultiIndex\n", " - Jp (JpMp) int64 0 0 0 0 0 0 0 0 0 1 1 1 1 ... 3 3 3 4 4 4 4 4 4 4 4 4\n", " - Mp (JpMp) int64 -4 -3 -2 -1 0 1 2 3 4 -4 ... 4 -4 -3 -2 -1 0 1 2 3 4" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Create arb time-dependent tensor using `setBLMs`\n", "from epsproc.sphCalc import setBLMs\n", "TKQ = setBLMs([[0,0,1,1,1,1,1,1],\n", " [1,0,0,0.5,0.8,1,0.5,0],[1,-1,0,0.5,0.8,1,0.5,0],[1,1,0,0.5,-0.5,1,0.5,0],\n", " [2,0,1,0.5,0,0,0.5,1],\n", " [4,2,0,0,0,0.5,0.8,1],[4,-2,0,0,0,0,-0.8,1]])\n", " # LMlabels = ['K','Q'], dimNames = ['KQ','t'])\n", "\n", "# Rename dims to match arb case...\n", "TKQ = TKQ.unstack('BLM').rename({'l':'K','m':'Q'}).stack({'KQ':['K','Q']}) #.fillna(0) # Optional\n", "TKQ.attrs['dataType']='TKQ'\n", "\n", "# Compute density matrix\n", "# Default case should work for preset datatypes, or pass dims for more control.\n", "# Other dims should be handled/propagated transparently.\n", "pmmFromTKQ = density.densityFromSphTensor(TKQ)\n", "\n", "# Full results as Xarray, note default case may also keep input sph tensor dims, which should be summed over for the standard result.\n", "pmmFromTKQ = pmmFromTKQ.sum(['K','Q'])\n", "pmmFromTKQ" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "tags": [] }, "outputs": [], "source": [ "# from epsproc.sphFuncs.sphConv import cleanLMcoords\n", "# # cleanLMcoords(pmmFromTKQ.sel(J=2,Jp=2).stack({'KQ': ['K', 'Q']}), refDims = ['K','Q'])\n", "# pmmFromTKQ.sel(J=2,Jp=2) #.stack({'KQ': ['K', 'Q']})" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Set plot kdims to ['M', 'Mp']; pass kdims = [dim1,dim2] for more control.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "WARNING:param.HeatMapPlot431177: Due to internal constraints, when aspect and width/height is set, the bokeh backend uses those values as frame_width/frame_height instead. This ensures the aspect is respected, but means that the plot might be slightly larger than anticipated. Set the frame_width/frame_height explicitly to suppress this warning.\n" ] }, { "data": {}, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.holoviews_exec.v0+json": "", "text/html": [ "
\n", "
\n", "
\n", "" ], "text/plain": [ ":HoloMap [t,pType]\n", " :HeatMap [M,Mp] (BLM)" ] }, "execution_count": 23, "metadata": { "application/vnd.holoviews_exec.v0+json": { "id": "p11691" } }, "output_type": "execute_result" } ], "source": [ "# Plot, optionally subselect and stack on dims (otherwise all dims will be available in widget)\n", "\n", "# density.matPlot(pmmFromTKQ, kdims=['JM','JpMp']) # All dims\n", "\n", "density.matPlot(pmmFromTKQ.sel(J=2,Jp=2)) # With selected J,Jp\n", "\n", "# density.matPlot(pmmFromTKQ.sel(J=2,Jp=2).stack({'KQ': ['K', 'Q']}), kdims=['M','Mp']) # Select on J,Jp and restack sphDims for unsummed case" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### $B_{L,M}$ term\n", "\n", "The coupling of the partial wave pairs, $|l,m\\rangle$ and $|l',m'\\rangle$, into the observable set of $\\{L,M\\}$ is [defined by a tensor contraction with two 3j terms](https://epsproc.readthedocs.io/en/latest/methods/geometric_method_dev_260220_090420_tidy.html#B_{L,M}-term).\n", "\n", "\\begin{equation}\n", "B_{L,M}=(-1)^{m}\\left(\\frac{(2l+1)(2l'+1)(2L+1)}{4\\pi}\\right)^{1/2}\\left(\\begin{array}{ccc}\n", "l & l' & L\\\\\n", "0 & 0 & 0\n", "\\end{array}\\right)\\left(\\begin{array}{ccc}\n", "l & l' & L\\\\\n", "-m & m' & M\n", "\\end{array}\\right)\n", "\\end{equation}\n", "\n", "Note for the AF case $B_{L,S-R'}(l,l',m,m')$ instead of $B_{L,-M}(l,l',m,m')$ for MF case. This allows for all MF projections to contribute (rather than a single specified polarization geometry).\n", "\n", "This term, with a subset of elements defined for the photoionization matrix elements set previously, is (currently, v1.3.0) given by the 'BLMtableResort' basis array." ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataArray 'w3jStacked' (m: 3, mp: 3, S-Rp: 5, l: 4, lp: 4, L: 8)>\n",
       "array([[[[[[        nan,         nan,         nan, ...,         nan,\n",
       "                    nan,         nan],\n",
       "           [        nan,         nan,         nan, ...,         nan,\n",
       "                    nan,         nan],\n",
       "           [        nan,         nan,         nan, ...,         nan,\n",
       "                    nan,         nan],\n",
       "           [        nan,         nan,         nan, ...,         nan,\n",
       "                    nan,         nan]],\n",
       "\n",
       "          [[        nan,         nan,         nan, ...,         nan,\n",
       "                    nan,         nan],\n",
       "           [        nan,         nan,         nan, ...,         nan,\n",
       "                    nan,         nan],\n",
       "           [        nan,         nan,         nan, ...,         nan,\n",
       "                    nan,         nan],\n",
       "           [        nan,         nan,         nan, ...,         nan,\n",
       "                    nan,         nan]],\n",
       "\n",
       "          [[        nan,         nan,         nan, ...,         nan,\n",
       "                    nan,         nan],\n",
       "...\n",
       "           [        nan,         nan,         nan, ...,         nan,\n",
       "                    nan,         nan]],\n",
       "\n",
       "          [[        nan,         nan,         nan, ...,         nan,\n",
       "                    nan,         nan],\n",
       "           [        nan,         nan,         nan, ...,         nan,\n",
       "                    nan,         nan],\n",
       "           [        nan,         nan,         nan, ...,         nan,\n",
       "                    nan,         nan],\n",
       "           [        nan,         nan,         nan, ...,         nan,\n",
       "                    nan,         nan]],\n",
       "\n",
       "          [[        nan,         nan,         nan, ...,         nan,\n",
       "                    nan,         nan],\n",
       "           [        nan,         nan,         nan, ...,         nan,\n",
       "                    nan,         nan],\n",
       "           [        nan,         nan,         nan, ...,         nan,\n",
       "                    nan,         nan],\n",
       "           [        nan,         nan,         nan, ...,         nan,\n",
       "                    nan,         nan]]]]]])\n",
       "Coordinates:\n",
       "  * L        (L) int64 0 2 4 6 8 10 12 14\n",
       "  * m        (m) int64 -1 0 1\n",
       "  * mp       (mp) int64 -1 0 1\n",
       "  * S-Rp     (S-Rp) int64 -2 -1 0 1 2\n",
       "  * l        (l) int64 1 3 5 7\n",
       "  * lp       (lp) int64 1 3 5 7\n",
       "Attributes:\n",
       "    dataType:   betaTerm\n",
       "    phaseCons:  {'phaseConvention': 'E', 'genMatEcons': {'negm': False}, 'EPR...
" ], "text/plain": [ "\n", "array([[[[[[ nan, nan, nan, ..., nan,\n", " nan, nan],\n", " [ nan, nan, nan, ..., nan,\n", " nan, nan],\n", " [ nan, nan, nan, ..., nan,\n", " nan, nan],\n", " [ nan, nan, nan, ..., nan,\n", " nan, nan]],\n", "\n", " [[ nan, nan, nan, ..., nan,\n", " nan, nan],\n", " [ nan, nan, nan, ..., nan,\n", " nan, nan],\n", " [ nan, nan, nan, ..., nan,\n", " nan, nan],\n", " [ nan, nan, nan, ..., nan,\n", " nan, nan]],\n", "\n", " [[ nan, nan, nan, ..., nan,\n", " nan, nan],\n", "...\n", " [ nan, nan, nan, ..., nan,\n", " nan, nan]],\n", "\n", " [[ nan, nan, nan, ..., nan,\n", " nan, nan],\n", " [ nan, nan, nan, ..., nan,\n", " nan, nan],\n", " [ nan, nan, nan, ..., nan,\n", " nan, nan],\n", " [ nan, nan, nan, ..., nan,\n", " nan, nan]],\n", "\n", " [[ nan, nan, nan, ..., nan,\n", " nan, nan],\n", " [ nan, nan, nan, ..., nan,\n", " nan, nan],\n", " [ nan, nan, nan, ..., nan,\n", " nan, nan],\n", " [ nan, nan, nan, ..., nan,\n", " nan, nan]]]]]])\n", "Coordinates:\n", " * L (L) int64 0 2 4 6 8 10 12 14\n", " * m (m) int64 -1 0 1\n", " * mp (mp) int64 -1 0 1\n", " * S-Rp (S-Rp) int64 -2 -1 0 1 2\n", " * l (l) int64 1 3 5 7\n", " * lp (lp) int64 1 3 5 7\n", "Attributes:\n", " dataType: betaTerm\n", " phaseCons: {'phaseConvention': 'E', 'genMatEcons': {'negm': False}, 'EPR..." ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "basis['BLMtableResort']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The lmPlot() routine can be used to show the full dimensionality..." ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Plotting data (No filename), pType=a, thres=0.01, with Seaborn\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "No artists with labels found to put in legend. Note that artists whose label start with an underscore are ignored when legend() is called with no argument.\n" ] } ], "source": [ "# Plot BLM term with restack to standard LM terms\n", "ep.lmPlot(basis['BLMtableResort'].rename({'S-Rp':'M'}).stack({'LM':['L','M']}), xDim={'LM':['L','M']}); " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The above shows, essentially, all the terms in the summation. By suitable summation we can look at the corresponding density matrix or state multipole." ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "WARNING:param.HeatMapPlot434377: Due to internal constraints, when aspect and width/height is set, the bokeh backend uses those values as frame_width/frame_height instead. This ensures the aspect is respected, but means that the plot might be slightly larger than anticipated. Set the frame_width/frame_height explicitly to suppress this warning.\n" ] }, { "data": {}, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.holoviews_exec.v0+json": "", "text/html": [ "
\n", "
\n", "
\n", "" ], "text/plain": [ ":HoloMap [pType]\n", " :HeatMap [lm,lmp] (BLMtableResort)" ] }, "execution_count": 26, "metadata": { "application/vnd.holoviews_exec.v0+json": { "id": "p12294" } }, "output_type": "execute_result" } ], "source": [ "# Compose density matrix\n", "\n", "termName = 'BLMtableResort' # 'AKQS' # Also needs fixing for single-value case? # 'lambdaTerm' # Needs fixing for singleton dim case! # NOW OK if squeeze = False\n", "daIn = basis[termName] # Set data\n", "\n", "# Reformat\n", "daIn = daIn.rename({'S-Rp':'M'}).stack({'LM':['L','M'], 'lm':['l','m'], 'lmp':['lp','mp']})\n", "\n", "# Set dimensions/state vector/representation\n", "# These must be in original data, but will be restacked as necessary to define the effective basis space.\n", "denDims = ['lm','lmp'] # 'ADM' #\n", "daIn.name = termName\n", "\n", "hvmap = density.matPlot(daIn.sum('LM').squeeze(), kdims = denDims)\n", "\n", "hvmap" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "WARNING:param.HeatMapPlot434538: Due to internal constraints, when aspect and width/height is set, the bokeh backend uses those values as frame_width/frame_height instead. This ensures the aspect is respected, but means that the plot might be slightly larger than anticipated. Set the frame_width/frame_height explicitly to suppress this warning.\n" ] }, { "data": {}, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.holoviews_exec.v0+json": "", "text/html": [ "
\n", "
\n", "
\n", "" ], "text/plain": [ ":HoloMap [pType]\n", " :HeatMap [L,M] (BLMtableResort)" ] }, "execution_count": 27, "metadata": { "application/vnd.holoviews_exec.v0+json": { "id": "p12540" } }, "output_type": "execute_result" } ], "source": [ "# Plot tensor BLM (state multipole) term with restack to standard LM terms\n", "hvmap = density.matPlot(daIn.sum(['lm','lmp']).unstack(), kdims = ['L','M'])\n", "hvmap" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Lambda terms\n", "\n", "https://epsproc.readthedocs.io/en/dev/methods/ePSproc_geom_methods_summary_190821-v1-tidy.html#\\Lambda-Term" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "# Compose density matrix\n", "\n", "termName = 'lambdaTerm' # 'AKQS' # Also needs fixing for single-value case? # 'lambdaTerm' # Needs fixing for singleton dim case! # NOW OK if squeeze = False\n", "daIn = basis[termName] # Set data\n", "\n", "# Set dimensions/state vector/representation\n", "# These must be in original data, but will be restacked as necessary to define the effective basis space.\n", "denDims = ['mu','mup'] # 'ADM' #\n", "daIn.name = termName\n", "\n", "hvmap = density.matPlot(daIn.squeeze(), kdims = denDims)" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "WARNING:param.HeatMapPlot435058: Due to internal constraints, when aspect and width/height is set, the bokeh backend uses those values as frame_width/frame_height instead. This ensures the aspect is respected, but means that the plot might be slightly larger than anticipated. Set the frame_width/frame_height explicitly to suppress this warning.\n" ] }, { "data": {}, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.holoviews_exec.v0+json": "", "text/html": [ "
\n", "
\n", "
\n", "" ], "text/plain": [ ":HoloMap [Rp,P,pType]\n", " :HeatMap [mu,mup] (lambdaTerm)" ] }, "execution_count": 29, "metadata": { "application/vnd.holoviews_exec.v0+json": { "id": "p12804" } }, "output_type": "execute_result" } ], "source": [ "hvmap" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "WARNING:param.HeatMapPlot454337: Due to internal constraints, when aspect and width/height is set, the bokeh backend uses those values as frame_width/frame_height instead. This ensures the aspect is respected, but means that the plot might be slightly larger than anticipated. Set the frame_width/frame_height explicitly to suppress this warning.\n", "WARNING:param.HeatMapPlot454342: Due to internal constraints, when aspect and width/height is set, the bokeh backend uses those values as frame_width/frame_height instead. This ensures the aspect is respected, but means that the plot might be slightly larger than anticipated. Set the frame_width/frame_height explicitly to suppress this warning.\n", "WARNING:param.HeatMapPlot454347: Due to internal constraints, when aspect and width/height is set, the bokeh backend uses those values as frame_width/frame_height instead. This ensures the aspect is respected, but means that the plot might be slightly larger than anticipated. Set the frame_width/frame_height explicitly to suppress this warning.\n" ] }, { "data": {}, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.holoviews_exec.v0+json": "", "text/html": [ "
\n", "
\n", "
\n", "" ], "text/plain": [ ":NdLayout [P]\n", " :HoloMap [pType]\n", " :HeatMap [mu,mup] (lambdaTerm)" ] }, "execution_count": 30, "metadata": { "application/vnd.holoviews_exec.v0+json": { "id": "p14058" } }, "output_type": "execute_result" } ], "source": [ "# Try with explicity summation over tensor (K,Q) dims...\n", "# hvmap = density.matPlot(daIn.sum(['P','Rp']).squeeze(), kdims = denDims) # Sum over P,Rp\n", "hvmap = density.matPlot(daIn.sum('Rp').squeeze(), kdims = denDims) # Sum over Rp only\n", "hvmap.layout('P').cols(1)" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataArray (m: 3, mp: 3, S-Rp: 5, l: 4, lp: 4, L: 2, mu: 3, mup: 3,\n",
       "                   Labels: 1, M: 1, t: 1)>\n",
       "array([[[[[[[[[[[        nan+nanj]]],\n",
       "\n",
       "\n",
       "              [[[        nan+nanj]]],\n",
       "\n",
       "\n",
       "              [[[        nan+nanj]]]],\n",
       "\n",
       "\n",
       "\n",
       "             [[[[        nan+nanj]]],\n",
       "\n",
       "\n",
       "              [[[        nan+nanj]]],\n",
       "\n",
       "\n",
       "              [[[        nan+nanj]]]],\n",
       "\n",
       "\n",
       "\n",
       "...\n",
       "\n",
       "\n",
       "\n",
       "             [[[[        nan+nanj]]],\n",
       "\n",
       "\n",
       "              [[[        nan+nanj]]],\n",
       "\n",
       "\n",
       "              [[[        nan+nanj]]]],\n",
       "\n",
       "\n",
       "\n",
       "             [[[[        nan+nanj]]],\n",
       "\n",
       "\n",
       "              [[[        nan+nanj]]],\n",
       "\n",
       "\n",
       "              [[[        nan+nanj]]]]]]]]]]])\n",
       "Coordinates:\n",
       "  * L        (L) int64 0 2\n",
       "  * m        (m) int64 -1 0 1\n",
       "  * mp       (mp) int64 -1 0 1\n",
       "  * S-Rp     (S-Rp) int64 -2 -1 0 1 2\n",
       "  * l        (l) int64 1 3 5 7\n",
       "  * lp       (lp) int64 1 3 5 7\n",
       "  * mu       (mu) int64 -1 0 1\n",
       "  * mup      (mup) int64 -1 0 1\n",
       "    Euler    (Labels) object (0.0, 0.0, 0.0)\n",
       "  * Labels   (Labels) <U1 'z'\n",
       "  * M        (M) int64 0\n",
       "  * t        (t) int64 0
" ], "text/plain": [ "\n", "array([[[[[[[[[[[ nan+nanj]]],\n", "\n", "\n", " [[[ nan+nanj]]],\n", "\n", "\n", " [[[ nan+nanj]]]],\n", "\n", "\n", "\n", " [[[[ nan+nanj]]],\n", "\n", "\n", " [[[ nan+nanj]]],\n", "\n", "\n", " [[[ nan+nanj]]]],\n", "\n", "\n", "\n", "...\n", "\n", "\n", "\n", " [[[[ nan+nanj]]],\n", "\n", "\n", " [[[ nan+nanj]]],\n", "\n", "\n", " [[[ nan+nanj]]]],\n", "\n", "\n", "\n", " [[[[ nan+nanj]]],\n", "\n", "\n", " [[[ nan+nanj]]],\n", "\n", "\n", " [[[ nan+nanj]]]]]]]]]]])\n", "Coordinates:\n", " * L (L) int64 0 2\n", " * m (m) int64 -1 0 1\n", " * mp (mp) int64 -1 0 1\n", " * S-Rp (S-Rp) int64 -2 -1 0 1 2\n", " * l (l) int64 1 3 5 7\n", " * lp (lp) int64 1 3 5 7\n", " * mu (mu) int64 -1 0 1\n", " * mup (mup) int64 -1 0 1\n", " Euler (Labels) object (0.0, 0.0, 0.0)\n", " * Labels (Labels) \n", " \n", " Thu Jul 25 09:44:53 2024 EDT\n", " \n", " \n", " OS\n", " Linux\n", " CPU(s)\n", " 64\n", " Machine\n", " x86_64\n", " Architecture\n", " 64bit\n", " \n", " \n", " RAM\n", " 62.8 GiB\n", " Environment\n", " Jupyter\n", " File system\n", " btrfs\n", " \n", " \n", " Python 3.10.11 | packaged by conda-forge | (main, May 10 2023, 18:58:44) [GCC 11.3.0]\n", " \n", " \n", " epsproc\n", " 1.3.2-dev\n", " holoviews\n", " 1.16.2\n", " hvplot\n", " 0.8.4\n", " xarray\n", " 2022.3.0\n", " \n", " \n", " matplotlib\n", " 3.5.3\n", " bokeh\n", " 3.1.1\n", " numpy\n", " 1.23.5\n", " scipy\n", " 1.10.1\n", " \n", " \n", " IPython\n", " 8.13.2\n", " scooby\n", " 0.7.2\n", " \n", " \n", " \n", " \n", " \n", "" ], "text/plain": [ "\n", "--------------------------------------------------------------------------------\n", " Date: Thu Jul 25 09:44:53 2024 EDT\n", "\n", " OS : Linux\n", " CPU(s) : 64\n", " Machine : x86_64\n", " Architecture : 64bit\n", " RAM : 62.8 GiB\n", " Environment : Jupyter\n", " File system : btrfs\n", "\n", " Python 3.10.11 | packaged by conda-forge | (main, May 10 2023, 18:58:44)\n", " [GCC 11.3.0]\n", "\n", " epsproc : 1.3.2-dev\n", " holoviews : 1.16.2\n", " hvplot : 0.8.4\n", " xarray : 2022.3.0\n", " matplotlib : 3.5.3\n", " bokeh : 3.1.1\n", " numpy : 1.23.5\n", " scipy : 1.10.1\n", " IPython : 8.13.2\n", " scooby : 0.7.2\n", "--------------------------------------------------------------------------------" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import scooby\n", "scooby.Report(additional=['epsproc', 'holoviews', 'hvplot', 'xarray', 'matplotlib', 'bokeh'])" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "* \u001b[32m3d-AFPAD-dev\u001b[m\n", " dev\u001b[m\n", " master\u001b[m\n", "ba3d6780d95999e518caf85e08e80e7cbc68b6b2\n" ] } ], "source": [ "# Check current Git commit for local ePSproc version\n", "from pathlib import Path\n", "!git -C {Path(ep.__file__).parent} branch\n", "!git -C {Path(ep.__file__).parent} log --format=\"%H\" -n 1" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "fatal: unable to connect to github.com:\n", "github.com[0: 140.82.114.4]: errno=Connection timed out\n", "\n" ] } ], "source": [ "# Check current remote commits\n", "!git ls-remote --heads git://github.com/phockett/ePSproc" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "8fdb9101787f\n" ] } ], "source": [ "!hostname" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "# conda environments:\n", "#\n", "base * /opt/conda\n", "\n" ] } ], "source": [ "!conda env list" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "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.11" } }, "nbformat": 4, "nbformat_minor": 4 }