Skip to content

Instantly share code, notes, and snippets.

@icbicket
Created October 12, 2021 15:51
Show Gist options
  • Save icbicket/5a5ec29f6b0d3abef3c71d5bc1cb30ad to your computer and use it in GitHub Desktop.
Save icbicket/5a5ec29f6b0d3abef3c71d5bc1cb30ad to your computer and use it in GitHub Desktop.
Visual example of fitting a bandgap in low-loss electron energy loss spectroscopy
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Bandgap Fitting"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This notebook gives a very visual example of how to fit a bandgap from EELS data using the NumPy, Matplotlib, and Astropy libraries. We take an SiO2 low-loss EELS spectrum, fit a power law to the zero loss peak (ZLP), subtract this power law from the ZLP tail, then fit a line to the bandgap edge of SiO2. Some familiarity with Python helps."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Import necessary libraries"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Three libraries are used in this notebok, as listed below. The version numbers in which the notebook was written are given, but it may also work with other versions of the libraries.\n",
"\n",
"- NumPy (v 1.18.4): https://pypi.org/project/numpy/, https://numpy.org/\n",
"- Matplotlib (v 3.3.4): https://pypi.org/project/matplotlib/, https://matplotlib.org/\n",
"- Astropy (3.0.4): https://pypi.org/project/astropy/, https://www.astropy.org/\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib notebook\n",
"\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"from astropy.modeling import powerlaws, models, fitting"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Load the SiO2 spectrum"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Import the SiO2 spectrum from disk. The example spectrum used in this notebook was downloaded and saved from https://eelsdb.eu/spectra/amorphous-silicon-dioxide-2/. (You can insert the filepath to your spectrum in the first argument to `loadtxt`)\n",
"\n",
"Structural and chemical analysis of a model Si-SiO2 interface using spatially resolved electron energy-loss spectroscopy M.C. Cheynet, T. Epicier, *Philosophical Magazine*, **84**, 17, (2004), 1753.\n",
"\n",
"- `sio2[:, 0]` represents the energy axis\n",
"- `sio2[:, 1]` represents the EELS intensity"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"sio2 = np.loadtxt('SiO2_LowLoss_M__Cheynet_89.txt',\n",
" delimiter=', ',\n",
" skiprows=14,\n",
" )"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A quick and easy way (not necessarily the most accurate) to identify the ZLP in the spectrum is to find the index (argument) at which the spectrum is maximum: `zlp_arg_sio2`"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"zlp_arg_sio2 = np.argmax(sio2[:, 1])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In case the energy axis is not calibrated (*i.e.* the ZLP is not actually at 0 eV): here is a quick way to recalibrate it."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"spectrumrange = sio2[:, 0] - sio2[zlp_arg_sio2, 0]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Plot the spectrum"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Plot the spectrum. Notice that the ZLP is at 0 eV, you can zoom in to see approximately where the bandgap edge is on the SiO2 in the raw data (~9-11 eV)."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"/* global mpl */\n",
"window.mpl = {};\n",
"\n",
"mpl.get_websocket_type = function () {\n",
" if (typeof WebSocket !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof MozWebSocket !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert(\n",
" 'Your browser does not have WebSocket support. ' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.'\n",
" );\n",
" }\n",
"};\n",
"\n",
"mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = this.ws.binaryType !== undefined;\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById('mpl-warnings');\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent =\n",
" 'This browser does not support binary websocket messages. ' +\n",
" 'Performance may be slow.';\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = document.createElement('div');\n",
" this.root.setAttribute('style', 'display: inline-block');\n",
" this._root_extra_style(this.root);\n",
"\n",
" parent_element.appendChild(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message('supports_binary', { value: fig.supports_binary });\n",
" fig.send_message('send_image_mode', {});\n",
" if (fig.ratio !== 1) {\n",
" fig.send_message('set_dpi_ratio', { dpi_ratio: fig.ratio });\n",
" }\n",
" fig.send_message('refresh', {});\n",
" };\n",
"\n",
" this.imageObj.onload = function () {\n",
" if (fig.image_mode === 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function () {\n",
" fig.ws.close();\n",
" };\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"};\n",
"\n",
"mpl.figure.prototype._init_header = function () {\n",
" var titlebar = document.createElement('div');\n",
" titlebar.classList =\n",
" 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
" var titletext = document.createElement('div');\n",
" titletext.classList = 'ui-dialog-title';\n",
" titletext.setAttribute(\n",
" 'style',\n",
" 'width: 100%; text-align: center; padding: 3px;'\n",
" );\n",
" titlebar.appendChild(titletext);\n",
" this.root.appendChild(titlebar);\n",
" this.header = titletext;\n",
"};\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
"\n",
"mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
"\n",
"mpl.figure.prototype._init_canvas = function () {\n",
" var fig = this;\n",
"\n",
" var canvas_div = (this.canvas_div = document.createElement('div'));\n",
" canvas_div.setAttribute(\n",
" 'style',\n",
" 'border: 1px solid #ddd;' +\n",
" 'box-sizing: content-box;' +\n",
" 'clear: both;' +\n",
" 'min-height: 1px;' +\n",
" 'min-width: 1px;' +\n",
" 'outline: 0;' +\n",
" 'overflow: hidden;' +\n",
" 'position: relative;' +\n",
" 'resize: both;'\n",
" );\n",
"\n",
" function on_keyboard_event_closure(name) {\n",
" return function (event) {\n",
" return fig.key_event(event, name);\n",
" };\n",
" }\n",
"\n",
" canvas_div.addEventListener(\n",
" 'keydown',\n",
" on_keyboard_event_closure('key_press')\n",
" );\n",
" canvas_div.addEventListener(\n",
" 'keyup',\n",
" on_keyboard_event_closure('key_release')\n",
" );\n",
"\n",
" this._canvas_extra_style(canvas_div);\n",
" this.root.appendChild(canvas_div);\n",
"\n",
" var canvas = (this.canvas = document.createElement('canvas'));\n",
" canvas.classList.add('mpl-canvas');\n",
" canvas.setAttribute('style', 'box-sizing: content-box;');\n",
"\n",
" this.context = canvas.getContext('2d');\n",
"\n",
" var backingStore =\n",
" this.context.backingStorePixelRatio ||\n",
" this.context.webkitBackingStorePixelRatio ||\n",
" this.context.mozBackingStorePixelRatio ||\n",
" this.context.msBackingStorePixelRatio ||\n",
" this.context.oBackingStorePixelRatio ||\n",
" this.context.backingStorePixelRatio ||\n",
" 1;\n",
"\n",
" this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
"\n",
" var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
" 'canvas'\n",
" ));\n",
" rubberband_canvas.setAttribute(\n",
" 'style',\n",
" 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n",
" );\n",
"\n",
" // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
" if (this.ResizeObserver === undefined) {\n",
" if (window.ResizeObserver !== undefined) {\n",
" this.ResizeObserver = window.ResizeObserver;\n",
" } else {\n",
" var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
" this.ResizeObserver = obs.ResizeObserver;\n",
" }\n",
" }\n",
"\n",
" this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
" var nentries = entries.length;\n",
" for (var i = 0; i < nentries; i++) {\n",
" var entry = entries[i];\n",
" var width, height;\n",
" if (entry.contentBoxSize) {\n",
" if (entry.contentBoxSize instanceof Array) {\n",
" // Chrome 84 implements new version of spec.\n",
" width = entry.contentBoxSize[0].inlineSize;\n",
" height = entry.contentBoxSize[0].blockSize;\n",
" } else {\n",
" // Firefox implements old version of spec.\n",
" width = entry.contentBoxSize.inlineSize;\n",
" height = entry.contentBoxSize.blockSize;\n",
" }\n",
" } else {\n",
" // Chrome <84 implements even older version of spec.\n",
" width = entry.contentRect.width;\n",
" height = entry.contentRect.height;\n",
" }\n",
"\n",
" // Keep the size of the canvas and rubber band canvas in sync with\n",
" // the canvas container.\n",
" if (entry.devicePixelContentBoxSize) {\n",
" // Chrome 84 implements new version of spec.\n",
" canvas.setAttribute(\n",
" 'width',\n",
" entry.devicePixelContentBoxSize[0].inlineSize\n",
" );\n",
" canvas.setAttribute(\n",
" 'height',\n",
" entry.devicePixelContentBoxSize[0].blockSize\n",
" );\n",
" } else {\n",
" canvas.setAttribute('width', width * fig.ratio);\n",
" canvas.setAttribute('height', height * fig.ratio);\n",
" }\n",
" canvas.setAttribute(\n",
" 'style',\n",
" 'width: ' + width + 'px; height: ' + height + 'px;'\n",
" );\n",
"\n",
" rubberband_canvas.setAttribute('width', width);\n",
" rubberband_canvas.setAttribute('height', height);\n",
"\n",
" // And update the size in Python. We ignore the initial 0/0 size\n",
" // that occurs as the element is placed into the DOM, which should\n",
" // otherwise not happen due to the minimum size styling.\n",
" if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
" fig.request_resize(width, height);\n",
" }\n",
" }\n",
" });\n",
" this.resizeObserverInstance.observe(canvas_div);\n",
"\n",
" function on_mouse_event_closure(name) {\n",
" return function (event) {\n",
" return fig.mouse_event(event, name);\n",
" };\n",
" }\n",
"\n",
" rubberband_canvas.addEventListener(\n",
" 'mousedown',\n",
" on_mouse_event_closure('button_press')\n",
" );\n",
" rubberband_canvas.addEventListener(\n",
" 'mouseup',\n",
" on_mouse_event_closure('button_release')\n",
" );\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband_canvas.addEventListener(\n",
" 'mousemove',\n",
" on_mouse_event_closure('motion_notify')\n",
" );\n",
"\n",
" rubberband_canvas.addEventListener(\n",
" 'mouseenter',\n",
" on_mouse_event_closure('figure_enter')\n",
" );\n",
" rubberband_canvas.addEventListener(\n",
" 'mouseleave',\n",
" on_mouse_event_closure('figure_leave')\n",
" );\n",
"\n",
" canvas_div.addEventListener('wheel', function (event) {\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" on_mouse_event_closure('scroll')(event);\n",
" });\n",
"\n",
" canvas_div.appendChild(canvas);\n",
" canvas_div.appendChild(rubberband_canvas);\n",
"\n",
" this.rubberband_context = rubberband_canvas.getContext('2d');\n",
" this.rubberband_context.strokeStyle = '#000000';\n",
"\n",
" this._resize_canvas = function (width, height, forward) {\n",
" if (forward) {\n",
" canvas_div.style.width = width + 'px';\n",
" canvas_div.style.height = height + 'px';\n",
" }\n",
" };\n",
"\n",
" // Disable right mouse context menu.\n",
" this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n",
" event.preventDefault();\n",
" return false;\n",
" });\n",
"\n",
" function set_focus() {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"};\n",
"\n",
"mpl.figure.prototype._init_toolbar = function () {\n",
" var fig = this;\n",
"\n",
" var toolbar = document.createElement('div');\n",
" toolbar.classList = 'mpl-toolbar';\n",
" this.root.appendChild(toolbar);\n",
"\n",
" function on_click_closure(name) {\n",
" return function (_event) {\n",
" return fig.toolbar_button_onclick(name);\n",
" };\n",
" }\n",
"\n",
" function on_mouseover_closure(tooltip) {\n",
" return function (event) {\n",
" if (!event.currentTarget.disabled) {\n",
" return fig.toolbar_button_onmouseover(tooltip);\n",
" }\n",
" };\n",
" }\n",
"\n",
" fig.buttons = {};\n",
" var buttonGroup = document.createElement('div');\n",
" buttonGroup.classList = 'mpl-button-group';\n",
" for (var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" /* Instead of a spacer, we start a new button group. */\n",
" if (buttonGroup.hasChildNodes()) {\n",
" toolbar.appendChild(buttonGroup);\n",
" }\n",
" buttonGroup = document.createElement('div');\n",
" buttonGroup.classList = 'mpl-button-group';\n",
" continue;\n",
" }\n",
"\n",
" var button = (fig.buttons[name] = document.createElement('button'));\n",
" button.classList = 'mpl-widget';\n",
" button.setAttribute('role', 'button');\n",
" button.setAttribute('aria-disabled', 'false');\n",
" button.addEventListener('click', on_click_closure(method_name));\n",
" button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
"\n",
" var icon_img = document.createElement('img');\n",
" icon_img.src = '_images/' + image + '.png';\n",
" icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
" icon_img.alt = tooltip;\n",
" button.appendChild(icon_img);\n",
"\n",
" buttonGroup.appendChild(button);\n",
" }\n",
"\n",
" if (buttonGroup.hasChildNodes()) {\n",
" toolbar.appendChild(buttonGroup);\n",
" }\n",
"\n",
" var fmt_picker = document.createElement('select');\n",
" fmt_picker.classList = 'mpl-widget';\n",
" toolbar.appendChild(fmt_picker);\n",
" this.format_dropdown = fmt_picker;\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = document.createElement('option');\n",
" option.selected = fmt === mpl.default_extension;\n",
" option.innerHTML = fmt;\n",
" fmt_picker.appendChild(option);\n",
" }\n",
"\n",
" var status_bar = document.createElement('span');\n",
" status_bar.classList = 'mpl-message';\n",
" toolbar.appendChild(status_bar);\n",
" this.message = status_bar;\n",
"};\n",
"\n",
"mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
"};\n",
"\n",
"mpl.figure.prototype.send_message = function (type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"};\n",
"\n",
"mpl.figure.prototype.send_draw_message = function () {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1], msg['forward']);\n",
" fig.send_message('refresh', {});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
" var x0 = msg['x0'] / fig.ratio;\n",
" var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
" var x1 = msg['x1'] / fig.ratio;\n",
" var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0,\n",
" 0,\n",
" fig.canvas.width / fig.ratio,\n",
" fig.canvas.height / fig.ratio\n",
" );\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch (cursor) {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_message = function (fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
" for (var key in msg) {\n",
" if (!(key in fig.buttons)) {\n",
" continue;\n",
" }\n",
" fig.buttons[key].disabled = !msg[key];\n",
" fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
" if (msg['mode'] === 'PAN') {\n",
" fig.buttons['Pan'].classList.add('active');\n",
" fig.buttons['Zoom'].classList.remove('active');\n",
" } else if (msg['mode'] === 'ZOOM') {\n",
" fig.buttons['Pan'].classList.remove('active');\n",
" fig.buttons['Zoom'].classList.add('active');\n",
" } else {\n",
" fig.buttons['Pan'].classList.remove('active');\n",
" fig.buttons['Zoom'].classList.remove('active');\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function () {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message('ack', {});\n",
"};\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function (fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = 'image/png';\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src\n",
" );\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data\n",
" );\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" } else if (\n",
" typeof evt.data === 'string' &&\n",
" evt.data.slice(0, 21) === 'data:image/png;base64'\n",
" ) {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig['handle_' + msg_type];\n",
" } catch (e) {\n",
" console.log(\n",
" \"No handler for the '\" + msg_type + \"' message type: \",\n",
" msg\n",
" );\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\n",
" \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
" e,\n",
" e.stack,\n",
" msg\n",
" );\n",
" }\n",
" }\n",
" };\n",
"};\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function (e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e) {\n",
" e = window.event;\n",
" }\n",
" if (e.target) {\n",
" targ = e.target;\n",
" } else if (e.srcElement) {\n",
" targ = e.srcElement;\n",
" }\n",
" if (targ.nodeType === 3) {\n",
" // defeat Safari bug\n",
" targ = targ.parentNode;\n",
" }\n",
"\n",
" // pageX,Y are the mouse positions relative to the document\n",
" var boundingRect = targ.getBoundingClientRect();\n",
" var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n",
" var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n",
"\n",
" return { x: x, y: y };\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys(original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object') {\n",
" obj[key] = original[key];\n",
" }\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function (event, name) {\n",
" var canvas_pos = mpl.findpos(event);\n",
"\n",
" if (name === 'button_press') {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x * this.ratio;\n",
" var y = canvas_pos.y * this.ratio;\n",
"\n",
" this.send_message(name, {\n",
" x: x,\n",
" y: y,\n",
" button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event),\n",
" });\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"};\n",
"\n",
"mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"};\n",
"\n",
"mpl.figure.prototype.key_event = function (event, name) {\n",
" // Prevent repeat events\n",
" if (name === 'key_press') {\n",
" if (event.which === this._key) {\n",
" return;\n",
" } else {\n",
" this._key = event.which;\n",
" }\n",
" }\n",
" if (name === 'key_release') {\n",
" this._key = null;\n",
" }\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which !== 17) {\n",
" value += 'ctrl+';\n",
" }\n",
" if (event.altKey && event.which !== 18) {\n",
" value += 'alt+';\n",
" }\n",
" if (event.shiftKey && event.which !== 16) {\n",
" value += 'shift+';\n",
" }\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
" return false;\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
" if (name === 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message('toolbar_button', { name: name });\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"\n",
"///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
"// prettier-ignore\n",
"var _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
"\n",
"mpl.default_extension = \"png\";/* global mpl */\n",
"\n",
"var comm_websocket_adapter = function (comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function () {\n",
" comm.close();\n",
" };\n",
" ws.send = function (m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function (msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data']);\n",
" });\n",
" return ws;\n",
"};\n",
"\n",
"mpl.mpl_figure_comm = function (comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = document.getElementById(id);\n",
" var ws_proxy = comm_websocket_adapter(comm);\n",
"\n",
" function ondownload(figure, _format) {\n",
" window.open(figure.canvas.toDataURL());\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element;\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error('Failed to find cell for figure', id, fig);\n",
" return;\n",
" }\n",
" fig.cell_info[0].output_area.element.on(\n",
" 'cleared',\n",
" { fig: fig },\n",
" fig._remove_fig_handler\n",
" );\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function (fig, msg) {\n",
" var width = fig.canvas.width / fig.ratio;\n",
" fig.cell_info[0].output_area.element.off(\n",
" 'cleared',\n",
" fig._remove_fig_handler\n",
" );\n",
" fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable();\n",
" fig.parent_element.innerHTML =\n",
" '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
" fig.close_ws(fig, msg);\n",
"};\n",
"\n",
"mpl.figure.prototype.close_ws = function (fig, msg) {\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"};\n",
"\n",
"mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var width = this.canvas.width / this.ratio;\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] =\n",
" '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
"};\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function () {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message('ack', {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () {\n",
" fig.push_to_output();\n",
" }, 1000);\n",
"};\n",
"\n",
"mpl.figure.prototype._init_toolbar = function () {\n",
" var fig = this;\n",
"\n",
" var toolbar = document.createElement('div');\n",
" toolbar.classList = 'btn-toolbar';\n",
" this.root.appendChild(toolbar);\n",
"\n",
" function on_click_closure(name) {\n",
" return function (_event) {\n",
" return fig.toolbar_button_onclick(name);\n",
" };\n",
" }\n",
"\n",
" function on_mouseover_closure(tooltip) {\n",
" return function (event) {\n",
" if (!event.currentTarget.disabled) {\n",
" return fig.toolbar_button_onmouseover(tooltip);\n",
" }\n",
" };\n",
" }\n",
"\n",
" fig.buttons = {};\n",
" var buttonGroup = document.createElement('div');\n",
" buttonGroup.classList = 'btn-group';\n",
" var button;\n",
" for (var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" /* Instead of a spacer, we start a new button group. */\n",
" if (buttonGroup.hasChildNodes()) {\n",
" toolbar.appendChild(buttonGroup);\n",
" }\n",
" buttonGroup = document.createElement('div');\n",
" buttonGroup.classList = 'btn-group';\n",
" continue;\n",
" }\n",
"\n",
" button = fig.buttons[name] = document.createElement('button');\n",
" button.classList = 'btn btn-default';\n",
" button.href = '#';\n",
" button.title = name;\n",
" button.innerHTML = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n",
" button.addEventListener('click', on_click_closure(method_name));\n",
" button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
" buttonGroup.appendChild(button);\n",
" }\n",
"\n",
" if (buttonGroup.hasChildNodes()) {\n",
" toolbar.appendChild(buttonGroup);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = document.createElement('span');\n",
" status_bar.classList = 'mpl-message pull-right';\n",
" toolbar.appendChild(status_bar);\n",
" this.message = status_bar;\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = document.createElement('div');\n",
" buttongrp.classList = 'btn-group inline pull-right';\n",
" button = document.createElement('button');\n",
" button.classList = 'btn btn-mini btn-primary';\n",
" button.href = '#';\n",
" button.title = 'Stop Interaction';\n",
" button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n",
" button.addEventListener('click', function (_evt) {\n",
" fig.handle_close(fig, {});\n",
" });\n",
" button.addEventListener(\n",
" 'mouseover',\n",
" on_mouseover_closure('Stop Interaction')\n",
" );\n",
" buttongrp.appendChild(button);\n",
" var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
" titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
"};\n",
"\n",
"mpl.figure.prototype._remove_fig_handler = function (event) {\n",
" var fig = event.data.fig;\n",
" if (event.target !== this) {\n",
" // Ignore bubbled events from children.\n",
" return;\n",
" }\n",
" fig.close_ws(fig, {});\n",
"};\n",
"\n",
"mpl.figure.prototype._root_extra_style = function (el) {\n",
" el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
"};\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function (el) {\n",
" // this is important to make the div 'focusable\n",
" el.setAttribute('tabindex', 0);\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" } else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager) {\n",
" manager = IPython.keyboard_manager;\n",
" }\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which === 13) {\n",
" this.canvas_div.blur();\n",
" // select the cell after this one\n",
" var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
" IPython.notebook.select(index + 1);\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
" fig.ondownload(fig, null);\n",
"};\n",
"\n",
"mpl.find_output_cell = function (html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i = 0; i < ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code') {\n",
" for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] === html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"};\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel !== null) {\n",
" IPython.notebook.kernel.comm_manager.register_target(\n",
" 'matplotlib',\n",
" mpl.mpl_figure_comm\n",
" );\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\" width=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x7f20909c7a20>"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"plt.close('all')\n",
"fig, ax = plt.subplots()\n",
"ax.plot(spectrumrange, sio2[:, 1], label='raw data')\n",
"ax.set_ylabel('EELS intensity (a.u.)')\n",
"ax.set_xlabel('Energy loss (eV)')\n",
"plt.legend()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Plot the EELS intensity vs the index of each value in order to identify a fit range"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"/* global mpl */\n",
"window.mpl = {};\n",
"\n",
"mpl.get_websocket_type = function () {\n",
" if (typeof WebSocket !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof MozWebSocket !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert(\n",
" 'Your browser does not have WebSocket support. ' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.'\n",
" );\n",
" }\n",
"};\n",
"\n",
"mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = this.ws.binaryType !== undefined;\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById('mpl-warnings');\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent =\n",
" 'This browser does not support binary websocket messages. ' +\n",
" 'Performance may be slow.';\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = document.createElement('div');\n",
" this.root.setAttribute('style', 'display: inline-block');\n",
" this._root_extra_style(this.root);\n",
"\n",
" parent_element.appendChild(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message('supports_binary', { value: fig.supports_binary });\n",
" fig.send_message('send_image_mode', {});\n",
" if (fig.ratio !== 1) {\n",
" fig.send_message('set_dpi_ratio', { dpi_ratio: fig.ratio });\n",
" }\n",
" fig.send_message('refresh', {});\n",
" };\n",
"\n",
" this.imageObj.onload = function () {\n",
" if (fig.image_mode === 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function () {\n",
" fig.ws.close();\n",
" };\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"};\n",
"\n",
"mpl.figure.prototype._init_header = function () {\n",
" var titlebar = document.createElement('div');\n",
" titlebar.classList =\n",
" 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
" var titletext = document.createElement('div');\n",
" titletext.classList = 'ui-dialog-title';\n",
" titletext.setAttribute(\n",
" 'style',\n",
" 'width: 100%; text-align: center; padding: 3px;'\n",
" );\n",
" titlebar.appendChild(titletext);\n",
" this.root.appendChild(titlebar);\n",
" this.header = titletext;\n",
"};\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
"\n",
"mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
"\n",
"mpl.figure.prototype._init_canvas = function () {\n",
" var fig = this;\n",
"\n",
" var canvas_div = (this.canvas_div = document.createElement('div'));\n",
" canvas_div.setAttribute(\n",
" 'style',\n",
" 'border: 1px solid #ddd;' +\n",
" 'box-sizing: content-box;' +\n",
" 'clear: both;' +\n",
" 'min-height: 1px;' +\n",
" 'min-width: 1px;' +\n",
" 'outline: 0;' +\n",
" 'overflow: hidden;' +\n",
" 'position: relative;' +\n",
" 'resize: both;'\n",
" );\n",
"\n",
" function on_keyboard_event_closure(name) {\n",
" return function (event) {\n",
" return fig.key_event(event, name);\n",
" };\n",
" }\n",
"\n",
" canvas_div.addEventListener(\n",
" 'keydown',\n",
" on_keyboard_event_closure('key_press')\n",
" );\n",
" canvas_div.addEventListener(\n",
" 'keyup',\n",
" on_keyboard_event_closure('key_release')\n",
" );\n",
"\n",
" this._canvas_extra_style(canvas_div);\n",
" this.root.appendChild(canvas_div);\n",
"\n",
" var canvas = (this.canvas = document.createElement('canvas'));\n",
" canvas.classList.add('mpl-canvas');\n",
" canvas.setAttribute('style', 'box-sizing: content-box;');\n",
"\n",
" this.context = canvas.getContext('2d');\n",
"\n",
" var backingStore =\n",
" this.context.backingStorePixelRatio ||\n",
" this.context.webkitBackingStorePixelRatio ||\n",
" this.context.mozBackingStorePixelRatio ||\n",
" this.context.msBackingStorePixelRatio ||\n",
" this.context.oBackingStorePixelRatio ||\n",
" this.context.backingStorePixelRatio ||\n",
" 1;\n",
"\n",
" this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
"\n",
" var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
" 'canvas'\n",
" ));\n",
" rubberband_canvas.setAttribute(\n",
" 'style',\n",
" 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n",
" );\n",
"\n",
" // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
" if (this.ResizeObserver === undefined) {\n",
" if (window.ResizeObserver !== undefined) {\n",
" this.ResizeObserver = window.ResizeObserver;\n",
" } else {\n",
" var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
" this.ResizeObserver = obs.ResizeObserver;\n",
" }\n",
" }\n",
"\n",
" this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
" var nentries = entries.length;\n",
" for (var i = 0; i < nentries; i++) {\n",
" var entry = entries[i];\n",
" var width, height;\n",
" if (entry.contentBoxSize) {\n",
" if (entry.contentBoxSize instanceof Array) {\n",
" // Chrome 84 implements new version of spec.\n",
" width = entry.contentBoxSize[0].inlineSize;\n",
" height = entry.contentBoxSize[0].blockSize;\n",
" } else {\n",
" // Firefox implements old version of spec.\n",
" width = entry.contentBoxSize.inlineSize;\n",
" height = entry.contentBoxSize.blockSize;\n",
" }\n",
" } else {\n",
" // Chrome <84 implements even older version of spec.\n",
" width = entry.contentRect.width;\n",
" height = entry.contentRect.height;\n",
" }\n",
"\n",
" // Keep the size of the canvas and rubber band canvas in sync with\n",
" // the canvas container.\n",
" if (entry.devicePixelContentBoxSize) {\n",
" // Chrome 84 implements new version of spec.\n",
" canvas.setAttribute(\n",
" 'width',\n",
" entry.devicePixelContentBoxSize[0].inlineSize\n",
" );\n",
" canvas.setAttribute(\n",
" 'height',\n",
" entry.devicePixelContentBoxSize[0].blockSize\n",
" );\n",
" } else {\n",
" canvas.setAttribute('width', width * fig.ratio);\n",
" canvas.setAttribute('height', height * fig.ratio);\n",
" }\n",
" canvas.setAttribute(\n",
" 'style',\n",
" 'width: ' + width + 'px; height: ' + height + 'px;'\n",
" );\n",
"\n",
" rubberband_canvas.setAttribute('width', width);\n",
" rubberband_canvas.setAttribute('height', height);\n",
"\n",
" // And update the size in Python. We ignore the initial 0/0 size\n",
" // that occurs as the element is placed into the DOM, which should\n",
" // otherwise not happen due to the minimum size styling.\n",
" if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
" fig.request_resize(width, height);\n",
" }\n",
" }\n",
" });\n",
" this.resizeObserverInstance.observe(canvas_div);\n",
"\n",
" function on_mouse_event_closure(name) {\n",
" return function (event) {\n",
" return fig.mouse_event(event, name);\n",
" };\n",
" }\n",
"\n",
" rubberband_canvas.addEventListener(\n",
" 'mousedown',\n",
" on_mouse_event_closure('button_press')\n",
" );\n",
" rubberband_canvas.addEventListener(\n",
" 'mouseup',\n",
" on_mouse_event_closure('button_release')\n",
" );\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband_canvas.addEventListener(\n",
" 'mousemove',\n",
" on_mouse_event_closure('motion_notify')\n",
" );\n",
"\n",
" rubberband_canvas.addEventListener(\n",
" 'mouseenter',\n",
" on_mouse_event_closure('figure_enter')\n",
" );\n",
" rubberband_canvas.addEventListener(\n",
" 'mouseleave',\n",
" on_mouse_event_closure('figure_leave')\n",
" );\n",
"\n",
" canvas_div.addEventListener('wheel', function (event) {\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" on_mouse_event_closure('scroll')(event);\n",
" });\n",
"\n",
" canvas_div.appendChild(canvas);\n",
" canvas_div.appendChild(rubberband_canvas);\n",
"\n",
" this.rubberband_context = rubberband_canvas.getContext('2d');\n",
" this.rubberband_context.strokeStyle = '#000000';\n",
"\n",
" this._resize_canvas = function (width, height, forward) {\n",
" if (forward) {\n",
" canvas_div.style.width = width + 'px';\n",
" canvas_div.style.height = height + 'px';\n",
" }\n",
" };\n",
"\n",
" // Disable right mouse context menu.\n",
" this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n",
" event.preventDefault();\n",
" return false;\n",
" });\n",
"\n",
" function set_focus() {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"};\n",
"\n",
"mpl.figure.prototype._init_toolbar = function () {\n",
" var fig = this;\n",
"\n",
" var toolbar = document.createElement('div');\n",
" toolbar.classList = 'mpl-toolbar';\n",
" this.root.appendChild(toolbar);\n",
"\n",
" function on_click_closure(name) {\n",
" return function (_event) {\n",
" return fig.toolbar_button_onclick(name);\n",
" };\n",
" }\n",
"\n",
" function on_mouseover_closure(tooltip) {\n",
" return function (event) {\n",
" if (!event.currentTarget.disabled) {\n",
" return fig.toolbar_button_onmouseover(tooltip);\n",
" }\n",
" };\n",
" }\n",
"\n",
" fig.buttons = {};\n",
" var buttonGroup = document.createElement('div');\n",
" buttonGroup.classList = 'mpl-button-group';\n",
" for (var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" /* Instead of a spacer, we start a new button group. */\n",
" if (buttonGroup.hasChildNodes()) {\n",
" toolbar.appendChild(buttonGroup);\n",
" }\n",
" buttonGroup = document.createElement('div');\n",
" buttonGroup.classList = 'mpl-button-group';\n",
" continue;\n",
" }\n",
"\n",
" var button = (fig.buttons[name] = document.createElement('button'));\n",
" button.classList = 'mpl-widget';\n",
" button.setAttribute('role', 'button');\n",
" button.setAttribute('aria-disabled', 'false');\n",
" button.addEventListener('click', on_click_closure(method_name));\n",
" button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
"\n",
" var icon_img = document.createElement('img');\n",
" icon_img.src = '_images/' + image + '.png';\n",
" icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
" icon_img.alt = tooltip;\n",
" button.appendChild(icon_img);\n",
"\n",
" buttonGroup.appendChild(button);\n",
" }\n",
"\n",
" if (buttonGroup.hasChildNodes()) {\n",
" toolbar.appendChild(buttonGroup);\n",
" }\n",
"\n",
" var fmt_picker = document.createElement('select');\n",
" fmt_picker.classList = 'mpl-widget';\n",
" toolbar.appendChild(fmt_picker);\n",
" this.format_dropdown = fmt_picker;\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = document.createElement('option');\n",
" option.selected = fmt === mpl.default_extension;\n",
" option.innerHTML = fmt;\n",
" fmt_picker.appendChild(option);\n",
" }\n",
"\n",
" var status_bar = document.createElement('span');\n",
" status_bar.classList = 'mpl-message';\n",
" toolbar.appendChild(status_bar);\n",
" this.message = status_bar;\n",
"};\n",
"\n",
"mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
"};\n",
"\n",
"mpl.figure.prototype.send_message = function (type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"};\n",
"\n",
"mpl.figure.prototype.send_draw_message = function () {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1], msg['forward']);\n",
" fig.send_message('refresh', {});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
" var x0 = msg['x0'] / fig.ratio;\n",
" var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
" var x1 = msg['x1'] / fig.ratio;\n",
" var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0,\n",
" 0,\n",
" fig.canvas.width / fig.ratio,\n",
" fig.canvas.height / fig.ratio\n",
" );\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch (cursor) {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_message = function (fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
" for (var key in msg) {\n",
" if (!(key in fig.buttons)) {\n",
" continue;\n",
" }\n",
" fig.buttons[key].disabled = !msg[key];\n",
" fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
" if (msg['mode'] === 'PAN') {\n",
" fig.buttons['Pan'].classList.add('active');\n",
" fig.buttons['Zoom'].classList.remove('active');\n",
" } else if (msg['mode'] === 'ZOOM') {\n",
" fig.buttons['Pan'].classList.remove('active');\n",
" fig.buttons['Zoom'].classList.add('active');\n",
" } else {\n",
" fig.buttons['Pan'].classList.remove('active');\n",
" fig.buttons['Zoom'].classList.remove('active');\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function () {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message('ack', {});\n",
"};\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function (fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = 'image/png';\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src\n",
" );\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data\n",
" );\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" } else if (\n",
" typeof evt.data === 'string' &&\n",
" evt.data.slice(0, 21) === 'data:image/png;base64'\n",
" ) {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig['handle_' + msg_type];\n",
" } catch (e) {\n",
" console.log(\n",
" \"No handler for the '\" + msg_type + \"' message type: \",\n",
" msg\n",
" );\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\n",
" \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
" e,\n",
" e.stack,\n",
" msg\n",
" );\n",
" }\n",
" }\n",
" };\n",
"};\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function (e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e) {\n",
" e = window.event;\n",
" }\n",
" if (e.target) {\n",
" targ = e.target;\n",
" } else if (e.srcElement) {\n",
" targ = e.srcElement;\n",
" }\n",
" if (targ.nodeType === 3) {\n",
" // defeat Safari bug\n",
" targ = targ.parentNode;\n",
" }\n",
"\n",
" // pageX,Y are the mouse positions relative to the document\n",
" var boundingRect = targ.getBoundingClientRect();\n",
" var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n",
" var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n",
"\n",
" return { x: x, y: y };\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys(original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object') {\n",
" obj[key] = original[key];\n",
" }\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function (event, name) {\n",
" var canvas_pos = mpl.findpos(event);\n",
"\n",
" if (name === 'button_press') {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x * this.ratio;\n",
" var y = canvas_pos.y * this.ratio;\n",
"\n",
" this.send_message(name, {\n",
" x: x,\n",
" y: y,\n",
" button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event),\n",
" });\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"};\n",
"\n",
"mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"};\n",
"\n",
"mpl.figure.prototype.key_event = function (event, name) {\n",
" // Prevent repeat events\n",
" if (name === 'key_press') {\n",
" if (event.which === this._key) {\n",
" return;\n",
" } else {\n",
" this._key = event.which;\n",
" }\n",
" }\n",
" if (name === 'key_release') {\n",
" this._key = null;\n",
" }\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which !== 17) {\n",
" value += 'ctrl+';\n",
" }\n",
" if (event.altKey && event.which !== 18) {\n",
" value += 'alt+';\n",
" }\n",
" if (event.shiftKey && event.which !== 16) {\n",
" value += 'shift+';\n",
" }\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
" return false;\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
" if (name === 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message('toolbar_button', { name: name });\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"\n",
"///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
"// prettier-ignore\n",
"var _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
"\n",
"mpl.default_extension = \"png\";/* global mpl */\n",
"\n",
"var comm_websocket_adapter = function (comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function () {\n",
" comm.close();\n",
" };\n",
" ws.send = function (m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function (msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data']);\n",
" });\n",
" return ws;\n",
"};\n",
"\n",
"mpl.mpl_figure_comm = function (comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = document.getElementById(id);\n",
" var ws_proxy = comm_websocket_adapter(comm);\n",
"\n",
" function ondownload(figure, _format) {\n",
" window.open(figure.canvas.toDataURL());\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element;\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error('Failed to find cell for figure', id, fig);\n",
" return;\n",
" }\n",
" fig.cell_info[0].output_area.element.on(\n",
" 'cleared',\n",
" { fig: fig },\n",
" fig._remove_fig_handler\n",
" );\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function (fig, msg) {\n",
" var width = fig.canvas.width / fig.ratio;\n",
" fig.cell_info[0].output_area.element.off(\n",
" 'cleared',\n",
" fig._remove_fig_handler\n",
" );\n",
" fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable();\n",
" fig.parent_element.innerHTML =\n",
" '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
" fig.close_ws(fig, msg);\n",
"};\n",
"\n",
"mpl.figure.prototype.close_ws = function (fig, msg) {\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"};\n",
"\n",
"mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var width = this.canvas.width / this.ratio;\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] =\n",
" '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
"};\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function () {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message('ack', {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () {\n",
" fig.push_to_output();\n",
" }, 1000);\n",
"};\n",
"\n",
"mpl.figure.prototype._init_toolbar = function () {\n",
" var fig = this;\n",
"\n",
" var toolbar = document.createElement('div');\n",
" toolbar.classList = 'btn-toolbar';\n",
" this.root.appendChild(toolbar);\n",
"\n",
" function on_click_closure(name) {\n",
" return function (_event) {\n",
" return fig.toolbar_button_onclick(name);\n",
" };\n",
" }\n",
"\n",
" function on_mouseover_closure(tooltip) {\n",
" return function (event) {\n",
" if (!event.currentTarget.disabled) {\n",
" return fig.toolbar_button_onmouseover(tooltip);\n",
" }\n",
" };\n",
" }\n",
"\n",
" fig.buttons = {};\n",
" var buttonGroup = document.createElement('div');\n",
" buttonGroup.classList = 'btn-group';\n",
" var button;\n",
" for (var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" /* Instead of a spacer, we start a new button group. */\n",
" if (buttonGroup.hasChildNodes()) {\n",
" toolbar.appendChild(buttonGroup);\n",
" }\n",
" buttonGroup = document.createElement('div');\n",
" buttonGroup.classList = 'btn-group';\n",
" continue;\n",
" }\n",
"\n",
" button = fig.buttons[name] = document.createElement('button');\n",
" button.classList = 'btn btn-default';\n",
" button.href = '#';\n",
" button.title = name;\n",
" button.innerHTML = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n",
" button.addEventListener('click', on_click_closure(method_name));\n",
" button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
" buttonGroup.appendChild(button);\n",
" }\n",
"\n",
" if (buttonGroup.hasChildNodes()) {\n",
" toolbar.appendChild(buttonGroup);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = document.createElement('span');\n",
" status_bar.classList = 'mpl-message pull-right';\n",
" toolbar.appendChild(status_bar);\n",
" this.message = status_bar;\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = document.createElement('div');\n",
" buttongrp.classList = 'btn-group inline pull-right';\n",
" button = document.createElement('button');\n",
" button.classList = 'btn btn-mini btn-primary';\n",
" button.href = '#';\n",
" button.title = 'Stop Interaction';\n",
" button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n",
" button.addEventListener('click', function (_evt) {\n",
" fig.handle_close(fig, {});\n",
" });\n",
" button.addEventListener(\n",
" 'mouseover',\n",
" on_mouseover_closure('Stop Interaction')\n",
" );\n",
" buttongrp.appendChild(button);\n",
" var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
" titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
"};\n",
"\n",
"mpl.figure.prototype._remove_fig_handler = function (event) {\n",
" var fig = event.data.fig;\n",
" if (event.target !== this) {\n",
" // Ignore bubbled events from children.\n",
" return;\n",
" }\n",
" fig.close_ws(fig, {});\n",
"};\n",
"\n",
"mpl.figure.prototype._root_extra_style = function (el) {\n",
" el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
"};\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function (el) {\n",
" // this is important to make the div 'focusable\n",
" el.setAttribute('tabindex', 0);\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" } else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager) {\n",
" manager = IPython.keyboard_manager;\n",
" }\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which === 13) {\n",
" this.canvas_div.blur();\n",
" // select the cell after this one\n",
" var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
" IPython.notebook.select(index + 1);\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
" fig.ondownload(fig, null);\n",
"};\n",
"\n",
"mpl.find_output_cell = function (html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i = 0; i < ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code') {\n",
" for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] === html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"};\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel !== null) {\n",
" IPython.notebook.kernel.comm_manager.register_target(\n",
" 'matplotlib',\n",
" mpl.mpl_figure_comm\n",
" );\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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ANhGQUGBli9frh07dnh9Mz///POKjIzUzp07deTIEU2fPl233367Ll++bG3z0EMPKTExUe+8844OHDig4cOHa/bs2b39VG4JHdXj/PnzSk1N1V/+8heVlpbq0KFDSk5O1r333ms7BvXoHp29N67bsWOHEhMTFRsb2y4AUovu0VktKioqNGDAAC1ZskSHDx9WRUWF8vPzdfbsWWubzMxM3XbbbSosLFRRUZG+853v6P777+/tp+J6ndUiIyNDd9xxh/bu3auqqipt3rxZAQEBys/Pt7ahFt0jPT1deXl5On78uEpKSjR58mQNGTJEDQ0N1jadvdbXrl3T6NGjlZqaquLiYhUUFCgqKkrLli37Kp5SjyIAdqDtm7m1tVWDBg3SCy+8YK07f/68goOD9ec//1nS//7VbYzR+++/b23z5ptvqk+fPu0+mcLN6exTJ0l67733ZIyxPumgHj3jRrU4ffq04uLidPz4cQ0dOtQWAKlFz/BWi1mzZunHP/7xDfc5f/68AgMDtX37dmvdyZMnZYzRoUOHeuxcb3XeapGQkKBVq1bZ1t1zzz1avny5JGrRk+rr62WM0f79+yV17bUuKChQ3759bZ8Kbtq0SREREWpubu7dJ9DDCIAdaPtmPnXqlIwxKi4utm03btw4PfXUU5KknJwc9e/f3/b41atXFRAQoB07dvT8Sd/CuhIAd+/erT59+lh3d6cePcNbLVpaWvT9739fGzZskKR2AZBa9Iy2tWhpaZHH49GqVauUlpam6OhoJScn27YpLCyUMUafffaZ7VhDhgzRunXreu3cbzU3+gQwKSlJp0+fVmtrq/bs2SOPx2OFEmrRc8rLy2WM0bFjxyR17bVesWKFEhMTbY9XVlbKGKPDhw/3zon3EgJgB9q+mQ8ePChjjP7973/btnvkkUf06KOPSpJWr16tkSNHtjtWdHS0fve73/XsCd/iOguAly9f1j333KM5c+ZY66hHz/BWizVr1mjixIlqbW2V1D4AUoue0bYWdXV1MsYoLCxM69atU3FxsZ577jn16dNH+/btkyRt27ZNQUFB7Y513333aenSpb127rcab++LpqYmzZ07V8YY9evXT0FBQdqyZYv1OLXoGS0tLZoyZYoeeOABa11XXuuMjAylpaXZHm9sbJQxRgUFBT170r2MANgBAqBv6SgAXrlyRdOmTdPYsWNt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\" width=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"(0.0, 20000.0)"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"plt.close('all')\n",
"fig, ax = plt.subplots()\n",
"ax.plot(sio2[:, 1], label='raw data')\n",
"ax.set_ylabel('EELS intensity (a.u.)')\n",
"ax.set_xlabel('Data index')\n",
"ax.set_xlim([100, 200])\n",
"ax.set_ylim([0, 2e4])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"From the plot produced by the cell above, we observe the bandgap edge around indices 170-190, so to fit the background before the bandgap, we must choose indices before this edge begins: we choose the range 125-165 (adjust these to see how it affects the fit!).\n",
"\n",
"Plot the data with the fit range to see where it is visually, adjust the indices as necessary."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"/* global mpl */\n",
"window.mpl = {};\n",
"\n",
"mpl.get_websocket_type = function () {\n",
" if (typeof WebSocket !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof MozWebSocket !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert(\n",
" 'Your browser does not have WebSocket support. ' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.'\n",
" );\n",
" }\n",
"};\n",
"\n",
"mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = this.ws.binaryType !== undefined;\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById('mpl-warnings');\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent =\n",
" 'This browser does not support binary websocket messages. ' +\n",
" 'Performance may be slow.';\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = document.createElement('div');\n",
" this.root.setAttribute('style', 'display: inline-block');\n",
" this._root_extra_style(this.root);\n",
"\n",
" parent_element.appendChild(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message('supports_binary', { value: fig.supports_binary });\n",
" fig.send_message('send_image_mode', {});\n",
" if (fig.ratio !== 1) {\n",
" fig.send_message('set_dpi_ratio', { dpi_ratio: fig.ratio });\n",
" }\n",
" fig.send_message('refresh', {});\n",
" };\n",
"\n",
" this.imageObj.onload = function () {\n",
" if (fig.image_mode === 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function () {\n",
" fig.ws.close();\n",
" };\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"};\n",
"\n",
"mpl.figure.prototype._init_header = function () {\n",
" var titlebar = document.createElement('div');\n",
" titlebar.classList =\n",
" 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
" var titletext = document.createElement('div');\n",
" titletext.classList = 'ui-dialog-title';\n",
" titletext.setAttribute(\n",
" 'style',\n",
" 'width: 100%; text-align: center; padding: 3px;'\n",
" );\n",
" titlebar.appendChild(titletext);\n",
" this.root.appendChild(titlebar);\n",
" this.header = titletext;\n",
"};\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
"\n",
"mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
"\n",
"mpl.figure.prototype._init_canvas = function () {\n",
" var fig = this;\n",
"\n",
" var canvas_div = (this.canvas_div = document.createElement('div'));\n",
" canvas_div.setAttribute(\n",
" 'style',\n",
" 'border: 1px solid #ddd;' +\n",
" 'box-sizing: content-box;' +\n",
" 'clear: both;' +\n",
" 'min-height: 1px;' +\n",
" 'min-width: 1px;' +\n",
" 'outline: 0;' +\n",
" 'overflow: hidden;' +\n",
" 'position: relative;' +\n",
" 'resize: both;'\n",
" );\n",
"\n",
" function on_keyboard_event_closure(name) {\n",
" return function (event) {\n",
" return fig.key_event(event, name);\n",
" };\n",
" }\n",
"\n",
" canvas_div.addEventListener(\n",
" 'keydown',\n",
" on_keyboard_event_closure('key_press')\n",
" );\n",
" canvas_div.addEventListener(\n",
" 'keyup',\n",
" on_keyboard_event_closure('key_release')\n",
" );\n",
"\n",
" this._canvas_extra_style(canvas_div);\n",
" this.root.appendChild(canvas_div);\n",
"\n",
" var canvas = (this.canvas = document.createElement('canvas'));\n",
" canvas.classList.add('mpl-canvas');\n",
" canvas.setAttribute('style', 'box-sizing: content-box;');\n",
"\n",
" this.context = canvas.getContext('2d');\n",
"\n",
" var backingStore =\n",
" this.context.backingStorePixelRatio ||\n",
" this.context.webkitBackingStorePixelRatio ||\n",
" this.context.mozBackingStorePixelRatio ||\n",
" this.context.msBackingStorePixelRatio ||\n",
" this.context.oBackingStorePixelRatio ||\n",
" this.context.backingStorePixelRatio ||\n",
" 1;\n",
"\n",
" this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
"\n",
" var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
" 'canvas'\n",
" ));\n",
" rubberband_canvas.setAttribute(\n",
" 'style',\n",
" 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n",
" );\n",
"\n",
" // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
" if (this.ResizeObserver === undefined) {\n",
" if (window.ResizeObserver !== undefined) {\n",
" this.ResizeObserver = window.ResizeObserver;\n",
" } else {\n",
" var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
" this.ResizeObserver = obs.ResizeObserver;\n",
" }\n",
" }\n",
"\n",
" this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
" var nentries = entries.length;\n",
" for (var i = 0; i < nentries; i++) {\n",
" var entry = entries[i];\n",
" var width, height;\n",
" if (entry.contentBoxSize) {\n",
" if (entry.contentBoxSize instanceof Array) {\n",
" // Chrome 84 implements new version of spec.\n",
" width = entry.contentBoxSize[0].inlineSize;\n",
" height = entry.contentBoxSize[0].blockSize;\n",
" } else {\n",
" // Firefox implements old version of spec.\n",
" width = entry.contentBoxSize.inlineSize;\n",
" height = entry.contentBoxSize.blockSize;\n",
" }\n",
" } else {\n",
" // Chrome <84 implements even older version of spec.\n",
" width = entry.contentRect.width;\n",
" height = entry.contentRect.height;\n",
" }\n",
"\n",
" // Keep the size of the canvas and rubber band canvas in sync with\n",
" // the canvas container.\n",
" if (entry.devicePixelContentBoxSize) {\n",
" // Chrome 84 implements new version of spec.\n",
" canvas.setAttribute(\n",
" 'width',\n",
" entry.devicePixelContentBoxSize[0].inlineSize\n",
" );\n",
" canvas.setAttribute(\n",
" 'height',\n",
" entry.devicePixelContentBoxSize[0].blockSize\n",
" );\n",
" } else {\n",
" canvas.setAttribute('width', width * fig.ratio);\n",
" canvas.setAttribute('height', height * fig.ratio);\n",
" }\n",
" canvas.setAttribute(\n",
" 'style',\n",
" 'width: ' + width + 'px; height: ' + height + 'px;'\n",
" );\n",
"\n",
" rubberband_canvas.setAttribute('width', width);\n",
" rubberband_canvas.setAttribute('height', height);\n",
"\n",
" // And update the size in Python. We ignore the initial 0/0 size\n",
" // that occurs as the element is placed into the DOM, which should\n",
" // otherwise not happen due to the minimum size styling.\n",
" if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
" fig.request_resize(width, height);\n",
" }\n",
" }\n",
" });\n",
" this.resizeObserverInstance.observe(canvas_div);\n",
"\n",
" function on_mouse_event_closure(name) {\n",
" return function (event) {\n",
" return fig.mouse_event(event, name);\n",
" };\n",
" }\n",
"\n",
" rubberband_canvas.addEventListener(\n",
" 'mousedown',\n",
" on_mouse_event_closure('button_press')\n",
" );\n",
" rubberband_canvas.addEventListener(\n",
" 'mouseup',\n",
" on_mouse_event_closure('button_release')\n",
" );\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband_canvas.addEventListener(\n",
" 'mousemove',\n",
" on_mouse_event_closure('motion_notify')\n",
" );\n",
"\n",
" rubberband_canvas.addEventListener(\n",
" 'mouseenter',\n",
" on_mouse_event_closure('figure_enter')\n",
" );\n",
" rubberband_canvas.addEventListener(\n",
" 'mouseleave',\n",
" on_mouse_event_closure('figure_leave')\n",
" );\n",
"\n",
" canvas_div.addEventListener('wheel', function (event) {\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" on_mouse_event_closure('scroll')(event);\n",
" });\n",
"\n",
" canvas_div.appendChild(canvas);\n",
" canvas_div.appendChild(rubberband_canvas);\n",
"\n",
" this.rubberband_context = rubberband_canvas.getContext('2d');\n",
" this.rubberband_context.strokeStyle = '#000000';\n",
"\n",
" this._resize_canvas = function (width, height, forward) {\n",
" if (forward) {\n",
" canvas_div.style.width = width + 'px';\n",
" canvas_div.style.height = height + 'px';\n",
" }\n",
" };\n",
"\n",
" // Disable right mouse context menu.\n",
" this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n",
" event.preventDefault();\n",
" return false;\n",
" });\n",
"\n",
" function set_focus() {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"};\n",
"\n",
"mpl.figure.prototype._init_toolbar = function () {\n",
" var fig = this;\n",
"\n",
" var toolbar = document.createElement('div');\n",
" toolbar.classList = 'mpl-toolbar';\n",
" this.root.appendChild(toolbar);\n",
"\n",
" function on_click_closure(name) {\n",
" return function (_event) {\n",
" return fig.toolbar_button_onclick(name);\n",
" };\n",
" }\n",
"\n",
" function on_mouseover_closure(tooltip) {\n",
" return function (event) {\n",
" if (!event.currentTarget.disabled) {\n",
" return fig.toolbar_button_onmouseover(tooltip);\n",
" }\n",
" };\n",
" }\n",
"\n",
" fig.buttons = {};\n",
" var buttonGroup = document.createElement('div');\n",
" buttonGroup.classList = 'mpl-button-group';\n",
" for (var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" /* Instead of a spacer, we start a new button group. */\n",
" if (buttonGroup.hasChildNodes()) {\n",
" toolbar.appendChild(buttonGroup);\n",
" }\n",
" buttonGroup = document.createElement('div');\n",
" buttonGroup.classList = 'mpl-button-group';\n",
" continue;\n",
" }\n",
"\n",
" var button = (fig.buttons[name] = document.createElement('button'));\n",
" button.classList = 'mpl-widget';\n",
" button.setAttribute('role', 'button');\n",
" button.setAttribute('aria-disabled', 'false');\n",
" button.addEventListener('click', on_click_closure(method_name));\n",
" button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
"\n",
" var icon_img = document.createElement('img');\n",
" icon_img.src = '_images/' + image + '.png';\n",
" icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
" icon_img.alt = tooltip;\n",
" button.appendChild(icon_img);\n",
"\n",
" buttonGroup.appendChild(button);\n",
" }\n",
"\n",
" if (buttonGroup.hasChildNodes()) {\n",
" toolbar.appendChild(buttonGroup);\n",
" }\n",
"\n",
" var fmt_picker = document.createElement('select');\n",
" fmt_picker.classList = 'mpl-widget';\n",
" toolbar.appendChild(fmt_picker);\n",
" this.format_dropdown = fmt_picker;\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = document.createElement('option');\n",
" option.selected = fmt === mpl.default_extension;\n",
" option.innerHTML = fmt;\n",
" fmt_picker.appendChild(option);\n",
" }\n",
"\n",
" var status_bar = document.createElement('span');\n",
" status_bar.classList = 'mpl-message';\n",
" toolbar.appendChild(status_bar);\n",
" this.message = status_bar;\n",
"};\n",
"\n",
"mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
"};\n",
"\n",
"mpl.figure.prototype.send_message = function (type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"};\n",
"\n",
"mpl.figure.prototype.send_draw_message = function () {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1], msg['forward']);\n",
" fig.send_message('refresh', {});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
" var x0 = msg['x0'] / fig.ratio;\n",
" var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
" var x1 = msg['x1'] / fig.ratio;\n",
" var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0,\n",
" 0,\n",
" fig.canvas.width / fig.ratio,\n",
" fig.canvas.height / fig.ratio\n",
" );\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch (cursor) {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_message = function (fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
" for (var key in msg) {\n",
" if (!(key in fig.buttons)) {\n",
" continue;\n",
" }\n",
" fig.buttons[key].disabled = !msg[key];\n",
" fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
" if (msg['mode'] === 'PAN') {\n",
" fig.buttons['Pan'].classList.add('active');\n",
" fig.buttons['Zoom'].classList.remove('active');\n",
" } else if (msg['mode'] === 'ZOOM') {\n",
" fig.buttons['Pan'].classList.remove('active');\n",
" fig.buttons['Zoom'].classList.add('active');\n",
" } else {\n",
" fig.buttons['Pan'].classList.remove('active');\n",
" fig.buttons['Zoom'].classList.remove('active');\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function () {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message('ack', {});\n",
"};\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function (fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = 'image/png';\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src\n",
" );\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data\n",
" );\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" } else if (\n",
" typeof evt.data === 'string' &&\n",
" evt.data.slice(0, 21) === 'data:image/png;base64'\n",
" ) {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig['handle_' + msg_type];\n",
" } catch (e) {\n",
" console.log(\n",
" \"No handler for the '\" + msg_type + \"' message type: \",\n",
" msg\n",
" );\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\n",
" \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
" e,\n",
" e.stack,\n",
" msg\n",
" );\n",
" }\n",
" }\n",
" };\n",
"};\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function (e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e) {\n",
" e = window.event;\n",
" }\n",
" if (e.target) {\n",
" targ = e.target;\n",
" } else if (e.srcElement) {\n",
" targ = e.srcElement;\n",
" }\n",
" if (targ.nodeType === 3) {\n",
" // defeat Safari bug\n",
" targ = targ.parentNode;\n",
" }\n",
"\n",
" // pageX,Y are the mouse positions relative to the document\n",
" var boundingRect = targ.getBoundingClientRect();\n",
" var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n",
" var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n",
"\n",
" return { x: x, y: y };\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys(original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object') {\n",
" obj[key] = original[key];\n",
" }\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function (event, name) {\n",
" var canvas_pos = mpl.findpos(event);\n",
"\n",
" if (name === 'button_press') {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x * this.ratio;\n",
" var y = canvas_pos.y * this.ratio;\n",
"\n",
" this.send_message(name, {\n",
" x: x,\n",
" y: y,\n",
" button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event),\n",
" });\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"};\n",
"\n",
"mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"};\n",
"\n",
"mpl.figure.prototype.key_event = function (event, name) {\n",
" // Prevent repeat events\n",
" if (name === 'key_press') {\n",
" if (event.which === this._key) {\n",
" return;\n",
" } else {\n",
" this._key = event.which;\n",
" }\n",
" }\n",
" if (name === 'key_release') {\n",
" this._key = null;\n",
" }\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which !== 17) {\n",
" value += 'ctrl+';\n",
" }\n",
" if (event.altKey && event.which !== 18) {\n",
" value += 'alt+';\n",
" }\n",
" if (event.shiftKey && event.which !== 16) {\n",
" value += 'shift+';\n",
" }\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
" return false;\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
" if (name === 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message('toolbar_button', { name: name });\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"\n",
"///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
"// prettier-ignore\n",
"var _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
"\n",
"mpl.default_extension = \"png\";/* global mpl */\n",
"\n",
"var comm_websocket_adapter = function (comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function () {\n",
" comm.close();\n",
" };\n",
" ws.send = function (m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function (msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data']);\n",
" });\n",
" return ws;\n",
"};\n",
"\n",
"mpl.mpl_figure_comm = function (comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = document.getElementById(id);\n",
" var ws_proxy = comm_websocket_adapter(comm);\n",
"\n",
" function ondownload(figure, _format) {\n",
" window.open(figure.canvas.toDataURL());\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element;\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error('Failed to find cell for figure', id, fig);\n",
" return;\n",
" }\n",
" fig.cell_info[0].output_area.element.on(\n",
" 'cleared',\n",
" { fig: fig },\n",
" fig._remove_fig_handler\n",
" );\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function (fig, msg) {\n",
" var width = fig.canvas.width / fig.ratio;\n",
" fig.cell_info[0].output_area.element.off(\n",
" 'cleared',\n",
" fig._remove_fig_handler\n",
" );\n",
" fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable();\n",
" fig.parent_element.innerHTML =\n",
" '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
" fig.close_ws(fig, msg);\n",
"};\n",
"\n",
"mpl.figure.prototype.close_ws = function (fig, msg) {\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"};\n",
"\n",
"mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var width = this.canvas.width / this.ratio;\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] =\n",
" '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
"};\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function () {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message('ack', {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () {\n",
" fig.push_to_output();\n",
" }, 1000);\n",
"};\n",
"\n",
"mpl.figure.prototype._init_toolbar = function () {\n",
" var fig = this;\n",
"\n",
" var toolbar = document.createElement('div');\n",
" toolbar.classList = 'btn-toolbar';\n",
" this.root.appendChild(toolbar);\n",
"\n",
" function on_click_closure(name) {\n",
" return function (_event) {\n",
" return fig.toolbar_button_onclick(name);\n",
" };\n",
" }\n",
"\n",
" function on_mouseover_closure(tooltip) {\n",
" return function (event) {\n",
" if (!event.currentTarget.disabled) {\n",
" return fig.toolbar_button_onmouseover(tooltip);\n",
" }\n",
" };\n",
" }\n",
"\n",
" fig.buttons = {};\n",
" var buttonGroup = document.createElement('div');\n",
" buttonGroup.classList = 'btn-group';\n",
" var button;\n",
" for (var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" /* Instead of a spacer, we start a new button group. */\n",
" if (buttonGroup.hasChildNodes()) {\n",
" toolbar.appendChild(buttonGroup);\n",
" }\n",
" buttonGroup = document.createElement('div');\n",
" buttonGroup.classList = 'btn-group';\n",
" continue;\n",
" }\n",
"\n",
" button = fig.buttons[name] = document.createElement('button');\n",
" button.classList = 'btn btn-default';\n",
" button.href = '#';\n",
" button.title = name;\n",
" button.innerHTML = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n",
" button.addEventListener('click', on_click_closure(method_name));\n",
" button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
" buttonGroup.appendChild(button);\n",
" }\n",
"\n",
" if (buttonGroup.hasChildNodes()) {\n",
" toolbar.appendChild(buttonGroup);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = document.createElement('span');\n",
" status_bar.classList = 'mpl-message pull-right';\n",
" toolbar.appendChild(status_bar);\n",
" this.message = status_bar;\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = document.createElement('div');\n",
" buttongrp.classList = 'btn-group inline pull-right';\n",
" button = document.createElement('button');\n",
" button.classList = 'btn btn-mini btn-primary';\n",
" button.href = '#';\n",
" button.title = 'Stop Interaction';\n",
" button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n",
" button.addEventListener('click', function (_evt) {\n",
" fig.handle_close(fig, {});\n",
" });\n",
" button.addEventListener(\n",
" 'mouseover',\n",
" on_mouseover_closure('Stop Interaction')\n",
" );\n",
" buttongrp.appendChild(button);\n",
" var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
" titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
"};\n",
"\n",
"mpl.figure.prototype._remove_fig_handler = function (event) {\n",
" var fig = event.data.fig;\n",
" if (event.target !== this) {\n",
" // Ignore bubbled events from children.\n",
" return;\n",
" }\n",
" fig.close_ws(fig, {});\n",
"};\n",
"\n",
"mpl.figure.prototype._root_extra_style = function (el) {\n",
" el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
"};\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function (el) {\n",
" // this is important to make the div 'focusable\n",
" el.setAttribute('tabindex', 0);\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" } else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager) {\n",
" manager = IPython.keyboard_manager;\n",
" }\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which === 13) {\n",
" this.canvas_div.blur();\n",
" // select the cell after this one\n",
" var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
" IPython.notebook.select(index + 1);\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
" fig.ondownload(fig, null);\n",
"};\n",
"\n",
"mpl.find_output_cell = function (html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i = 0; i < ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code') {\n",
" for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] === html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"};\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel !== null) {\n",
" IPython.notebook.kernel.comm_manager.register_target(\n",
" 'matplotlib',\n",
" mpl.mpl_figure_comm\n",
" );\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4nOzdeVhUZf8G8AMkhMsoCmluxw2XpNT3LcossTcTtdJX3/qVLdqGWVZmpcd93NKsXMots3CrNNesA+K+oYCiIMugsosKIijKvszcvz/MyZFtcGY4M8z9ua7nupqZM3O+0PfyuTlnznMEEBEREZFdEZQugIiIiIhqFwMgERERkZ1hACQiIiKyMwyARERERHaGAZCIiIjIzjAAEhEREdkZBkAiIiIiO8MASERERGRnGACJiIiI7AwDIBEREZGdYQAkIiIisjMMgERERER2hgGQiIiIyM4wABIRERHZGQZAIiIiIjvDAEhERERkZxgAiYiIiOwMAyARERGRnWEAJCIiIrIzDIBEREREdoYBkIiIiMjOMAASERER2RkGQCIiIiI7wwBIREREZGcYAImIiIjsDAMgERERkZ1hACQiIiKyMwyARERERHaGAZCIiIjIzjAAEhEREdkZBkAiIiIiO8MASERERGRnGACJiIiI7AwDIBEREZGdYQAkIiIisjMMgERERER2hgGQiIiIyM4wABIRERHZGQZAIiIiIjvDAEhERERkZxgAiYiIiOwMAyARERGRnWEAJCIiIrIzDIBEREREdoYBkIiIiMjOMAASERER2RkGQCIiIiI7wwBIREREZGcYAImIiIjsDAMgERERkZ1hACQiIiKyMwyARERERHam1gPgihUr8PDDD6NRo0Zo1KgRnnjiCQQGBupfLywsxIcffoimTZuiQYMGGD58ODIyMgw+IzU1FYMHD4arqys8PDzwxRdfoLS01GCbgwcPolevXnB2dkbHjh2xZs2acrUsW7YMoijCxcUF3t7eCAsLs8jPTERERGRNaj0A/vnnnwgICMD58+dx7tw5TJkyBfXq1UNMTAwAYMyYMWjTpg3279+P8PBwPPHEE3jyySf17y8rK4OXlxf69++PiIgIBAYGwt3dHZMnT9Zvk5SUhPr16+Ozzz6DRqPB0qVL4eTkhKCgIP02mzZtgrOzM/z9/REbGws/Pz80adIEV65cqb1fBhEREZECrOIUsJubG3766Sfk5OSgXr162LJli/61uLg4CIKAkJAQAEBgYCAcHR0NjgquXLkSKpUKxcXFAICJEyeie/fuBvt45ZVX4Ovrq3/s7e2NsWPH6h9rtVq0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\" width=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x7f2090809748>"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fit_range = (125, 165)\n",
"\n",
"plt.close('all')\n",
"fig, ax = plt.subplots()\n",
"ax.plot(spectrumrange, sio2[:, 1], label='raw data')\n",
"ax.plot(\n",
" spectrumrange[fit_range[0]:fit_range[1]], \n",
" sio2[fit_range[0]:fit_range[1], 1], \n",
" label='selected fit range',\n",
" linestyle='--',\n",
")\n",
"ax.set_ylabel('EELS intensity (a.u.)')\n",
"ax.set_xlabel('Energy loss (eV)')\n",
"ax.set_xlim([3, 15])\n",
"ax.set_ylim([0, 3e4])\n",
"plt.legend()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Fit the ZLP tail"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Use the Astropy [fitting toolbox](https://docs.astropy.org/en/stable/modeling/index.html) to fit a power law to the ZLP tail in the range defined above (by `fit_range`). We use the following functions, but you can experiment:\n",
"- [Least squares fitting](https://docs.astropy.org/en/stable/api/astropy.modeling.fitting.LevMarLSQFitter.html?highlight=levmarlsq#astropy.modeling.fitting.LevMarLSQFitter)\n",
"- [Power law 1D](https://docs.astropy.org/en/stable/api/astropy.modeling.powerlaws.PowerLaw1D.html#astropy.modeling.powerlaws.PowerLaw1D)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Model: PowerLaw1D\n",
"Inputs: ('x',)\n",
"Outputs: ('y',)\n",
"Model set size: 1\n",
"Parameters:\n",
" amplitude x_0 alpha \n",
" ----------------- ----------------- ------------------\n",
" 722.5477313062214 21.86715070174754 1.9634765417908058\n"
]
}
],
"source": [
"fit = fitting.LevMarLSQFitter()\n",
"power_model = powerlaws.PowerLaw1D()\n",
"fitted_power = fit(power_model, spectrumrange[fit_range[0]:fit_range[1]], sio2[fit_range[0]:fit_range[1], 1])\n",
"print(fitted_power)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Plot the fit to see how it looks: it should fit well in the fit range, up to near where the bandgap edge begins (in this case, up to around 8.5 eV), in order to derive an accurate bandgap value. If it doesn't fit well, try to manipulate the initial values given to `power_model` to something closer to what you expect. (You are also free to explore the statistics of the fit, calculate error values, *etc.*, rather than just eyeballing the plot)."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"/* global mpl */\n",
"window.mpl = {};\n",
"\n",
"mpl.get_websocket_type = function () {\n",
" if (typeof WebSocket !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof MozWebSocket !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert(\n",
" 'Your browser does not have WebSocket support. ' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.'\n",
" );\n",
" }\n",
"};\n",
"\n",
"mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = this.ws.binaryType !== undefined;\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById('mpl-warnings');\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent =\n",
" 'This browser does not support binary websocket messages. ' +\n",
" 'Performance may be slow.';\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = document.createElement('div');\n",
" this.root.setAttribute('style', 'display: inline-block');\n",
" this._root_extra_style(this.root);\n",
"\n",
" parent_element.appendChild(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message('supports_binary', { value: fig.supports_binary });\n",
" fig.send_message('send_image_mode', {});\n",
" if (fig.ratio !== 1) {\n",
" fig.send_message('set_dpi_ratio', { dpi_ratio: fig.ratio });\n",
" }\n",
" fig.send_message('refresh', {});\n",
" };\n",
"\n",
" this.imageObj.onload = function () {\n",
" if (fig.image_mode === 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function () {\n",
" fig.ws.close();\n",
" };\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"};\n",
"\n",
"mpl.figure.prototype._init_header = function () {\n",
" var titlebar = document.createElement('div');\n",
" titlebar.classList =\n",
" 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
" var titletext = document.createElement('div');\n",
" titletext.classList = 'ui-dialog-title';\n",
" titletext.setAttribute(\n",
" 'style',\n",
" 'width: 100%; text-align: center; padding: 3px;'\n",
" );\n",
" titlebar.appendChild(titletext);\n",
" this.root.appendChild(titlebar);\n",
" this.header = titletext;\n",
"};\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
"\n",
"mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
"\n",
"mpl.figure.prototype._init_canvas = function () {\n",
" var fig = this;\n",
"\n",
" var canvas_div = (this.canvas_div = document.createElement('div'));\n",
" canvas_div.setAttribute(\n",
" 'style',\n",
" 'border: 1px solid #ddd;' +\n",
" 'box-sizing: content-box;' +\n",
" 'clear: both;' +\n",
" 'min-height: 1px;' +\n",
" 'min-width: 1px;' +\n",
" 'outline: 0;' +\n",
" 'overflow: hidden;' +\n",
" 'position: relative;' +\n",
" 'resize: both;'\n",
" );\n",
"\n",
" function on_keyboard_event_closure(name) {\n",
" return function (event) {\n",
" return fig.key_event(event, name);\n",
" };\n",
" }\n",
"\n",
" canvas_div.addEventListener(\n",
" 'keydown',\n",
" on_keyboard_event_closure('key_press')\n",
" );\n",
" canvas_div.addEventListener(\n",
" 'keyup',\n",
" on_keyboard_event_closure('key_release')\n",
" );\n",
"\n",
" this._canvas_extra_style(canvas_div);\n",
" this.root.appendChild(canvas_div);\n",
"\n",
" var canvas = (this.canvas = document.createElement('canvas'));\n",
" canvas.classList.add('mpl-canvas');\n",
" canvas.setAttribute('style', 'box-sizing: content-box;');\n",
"\n",
" this.context = canvas.getContext('2d');\n",
"\n",
" var backingStore =\n",
" this.context.backingStorePixelRatio ||\n",
" this.context.webkitBackingStorePixelRatio ||\n",
" this.context.mozBackingStorePixelRatio ||\n",
" this.context.msBackingStorePixelRatio ||\n",
" this.context.oBackingStorePixelRatio ||\n",
" this.context.backingStorePixelRatio ||\n",
" 1;\n",
"\n",
" this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
"\n",
" var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
" 'canvas'\n",
" ));\n",
" rubberband_canvas.setAttribute(\n",
" 'style',\n",
" 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n",
" );\n",
"\n",
" // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
" if (this.ResizeObserver === undefined) {\n",
" if (window.ResizeObserver !== undefined) {\n",
" this.ResizeObserver = window.ResizeObserver;\n",
" } else {\n",
" var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
" this.ResizeObserver = obs.ResizeObserver;\n",
" }\n",
" }\n",
"\n",
" this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
" var nentries = entries.length;\n",
" for (var i = 0; i < nentries; i++) {\n",
" var entry = entries[i];\n",
" var width, height;\n",
" if (entry.contentBoxSize) {\n",
" if (entry.contentBoxSize instanceof Array) {\n",
" // Chrome 84 implements new version of spec.\n",
" width = entry.contentBoxSize[0].inlineSize;\n",
" height = entry.contentBoxSize[0].blockSize;\n",
" } else {\n",
" // Firefox implements old version of spec.\n",
" width = entry.contentBoxSize.inlineSize;\n",
" height = entry.contentBoxSize.blockSize;\n",
" }\n",
" } else {\n",
" // Chrome <84 implements even older version of spec.\n",
" width = entry.contentRect.width;\n",
" height = entry.contentRect.height;\n",
" }\n",
"\n",
" // Keep the size of the canvas and rubber band canvas in sync with\n",
" // the canvas container.\n",
" if (entry.devicePixelContentBoxSize) {\n",
" // Chrome 84 implements new version of spec.\n",
" canvas.setAttribute(\n",
" 'width',\n",
" entry.devicePixelContentBoxSize[0].inlineSize\n",
" );\n",
" canvas.setAttribute(\n",
" 'height',\n",
" entry.devicePixelContentBoxSize[0].blockSize\n",
" );\n",
" } else {\n",
" canvas.setAttribute('width', width * fig.ratio);\n",
" canvas.setAttribute('height', height * fig.ratio);\n",
" }\n",
" canvas.setAttribute(\n",
" 'style',\n",
" 'width: ' + width + 'px; height: ' + height + 'px;'\n",
" );\n",
"\n",
" rubberband_canvas.setAttribute('width', width);\n",
" rubberband_canvas.setAttribute('height', height);\n",
"\n",
" // And update the size in Python. We ignore the initial 0/0 size\n",
" // that occurs as the element is placed into the DOM, which should\n",
" // otherwise not happen due to the minimum size styling.\n",
" if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
" fig.request_resize(width, height);\n",
" }\n",
" }\n",
" });\n",
" this.resizeObserverInstance.observe(canvas_div);\n",
"\n",
" function on_mouse_event_closure(name) {\n",
" return function (event) {\n",
" return fig.mouse_event(event, name);\n",
" };\n",
" }\n",
"\n",
" rubberband_canvas.addEventListener(\n",
" 'mousedown',\n",
" on_mouse_event_closure('button_press')\n",
" );\n",
" rubberband_canvas.addEventListener(\n",
" 'mouseup',\n",
" on_mouse_event_closure('button_release')\n",
" );\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband_canvas.addEventListener(\n",
" 'mousemove',\n",
" on_mouse_event_closure('motion_notify')\n",
" );\n",
"\n",
" rubberband_canvas.addEventListener(\n",
" 'mouseenter',\n",
" on_mouse_event_closure('figure_enter')\n",
" );\n",
" rubberband_canvas.addEventListener(\n",
" 'mouseleave',\n",
" on_mouse_event_closure('figure_leave')\n",
" );\n",
"\n",
" canvas_div.addEventListener('wheel', function (event) {\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" on_mouse_event_closure('scroll')(event);\n",
" });\n",
"\n",
" canvas_div.appendChild(canvas);\n",
" canvas_div.appendChild(rubberband_canvas);\n",
"\n",
" this.rubberband_context = rubberband_canvas.getContext('2d');\n",
" this.rubberband_context.strokeStyle = '#000000';\n",
"\n",
" this._resize_canvas = function (width, height, forward) {\n",
" if (forward) {\n",
" canvas_div.style.width = width + 'px';\n",
" canvas_div.style.height = height + 'px';\n",
" }\n",
" };\n",
"\n",
" // Disable right mouse context menu.\n",
" this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n",
" event.preventDefault();\n",
" return false;\n",
" });\n",
"\n",
" function set_focus() {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"};\n",
"\n",
"mpl.figure.prototype._init_toolbar = function () {\n",
" var fig = this;\n",
"\n",
" var toolbar = document.createElement('div');\n",
" toolbar.classList = 'mpl-toolbar';\n",
" this.root.appendChild(toolbar);\n",
"\n",
" function on_click_closure(name) {\n",
" return function (_event) {\n",
" return fig.toolbar_button_onclick(name);\n",
" };\n",
" }\n",
"\n",
" function on_mouseover_closure(tooltip) {\n",
" return function (event) {\n",
" if (!event.currentTarget.disabled) {\n",
" return fig.toolbar_button_onmouseover(tooltip);\n",
" }\n",
" };\n",
" }\n",
"\n",
" fig.buttons = {};\n",
" var buttonGroup = document.createElement('div');\n",
" buttonGroup.classList = 'mpl-button-group';\n",
" for (var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" /* Instead of a spacer, we start a new button group. */\n",
" if (buttonGroup.hasChildNodes()) {\n",
" toolbar.appendChild(buttonGroup);\n",
" }\n",
" buttonGroup = document.createElement('div');\n",
" buttonGroup.classList = 'mpl-button-group';\n",
" continue;\n",
" }\n",
"\n",
" var button = (fig.buttons[name] = document.createElement('button'));\n",
" button.classList = 'mpl-widget';\n",
" button.setAttribute('role', 'button');\n",
" button.setAttribute('aria-disabled', 'false');\n",
" button.addEventListener('click', on_click_closure(method_name));\n",
" button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
"\n",
" var icon_img = document.createElement('img');\n",
" icon_img.src = '_images/' + image + '.png';\n",
" icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
" icon_img.alt = tooltip;\n",
" button.appendChild(icon_img);\n",
"\n",
" buttonGroup.appendChild(button);\n",
" }\n",
"\n",
" if (buttonGroup.hasChildNodes()) {\n",
" toolbar.appendChild(buttonGroup);\n",
" }\n",
"\n",
" var fmt_picker = document.createElement('select');\n",
" fmt_picker.classList = 'mpl-widget';\n",
" toolbar.appendChild(fmt_picker);\n",
" this.format_dropdown = fmt_picker;\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = document.createElement('option');\n",
" option.selected = fmt === mpl.default_extension;\n",
" option.innerHTML = fmt;\n",
" fmt_picker.appendChild(option);\n",
" }\n",
"\n",
" var status_bar = document.createElement('span');\n",
" status_bar.classList = 'mpl-message';\n",
" toolbar.appendChild(status_bar);\n",
" this.message = status_bar;\n",
"};\n",
"\n",
"mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
"};\n",
"\n",
"mpl.figure.prototype.send_message = function (type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"};\n",
"\n",
"mpl.figure.prototype.send_draw_message = function () {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1], msg['forward']);\n",
" fig.send_message('refresh', {});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
" var x0 = msg['x0'] / fig.ratio;\n",
" var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
" var x1 = msg['x1'] / fig.ratio;\n",
" var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0,\n",
" 0,\n",
" fig.canvas.width / fig.ratio,\n",
" fig.canvas.height / fig.ratio\n",
" );\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch (cursor) {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_message = function (fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
" for (var key in msg) {\n",
" if (!(key in fig.buttons)) {\n",
" continue;\n",
" }\n",
" fig.buttons[key].disabled = !msg[key];\n",
" fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
" if (msg['mode'] === 'PAN') {\n",
" fig.buttons['Pan'].classList.add('active');\n",
" fig.buttons['Zoom'].classList.remove('active');\n",
" } else if (msg['mode'] === 'ZOOM') {\n",
" fig.buttons['Pan'].classList.remove('active');\n",
" fig.buttons['Zoom'].classList.add('active');\n",
" } else {\n",
" fig.buttons['Pan'].classList.remove('active');\n",
" fig.buttons['Zoom'].classList.remove('active');\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function () {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message('ack', {});\n",
"};\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function (fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = 'image/png';\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src\n",
" );\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data\n",
" );\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" } else if (\n",
" typeof evt.data === 'string' &&\n",
" evt.data.slice(0, 21) === 'data:image/png;base64'\n",
" ) {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig['handle_' + msg_type];\n",
" } catch (e) {\n",
" console.log(\n",
" \"No handler for the '\" + msg_type + \"' message type: \",\n",
" msg\n",
" );\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\n",
" \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
" e,\n",
" e.stack,\n",
" msg\n",
" );\n",
" }\n",
" }\n",
" };\n",
"};\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function (e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e) {\n",
" e = window.event;\n",
" }\n",
" if (e.target) {\n",
" targ = e.target;\n",
" } else if (e.srcElement) {\n",
" targ = e.srcElement;\n",
" }\n",
" if (targ.nodeType === 3) {\n",
" // defeat Safari bug\n",
" targ = targ.parentNode;\n",
" }\n",
"\n",
" // pageX,Y are the mouse positions relative to the document\n",
" var boundingRect = targ.getBoundingClientRect();\n",
" var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n",
" var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n",
"\n",
" return { x: x, y: y };\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys(original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object') {\n",
" obj[key] = original[key];\n",
" }\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function (event, name) {\n",
" var canvas_pos = mpl.findpos(event);\n",
"\n",
" if (name === 'button_press') {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x * this.ratio;\n",
" var y = canvas_pos.y * this.ratio;\n",
"\n",
" this.send_message(name, {\n",
" x: x,\n",
" y: y,\n",
" button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event),\n",
" });\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"};\n",
"\n",
"mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"};\n",
"\n",
"mpl.figure.prototype.key_event = function (event, name) {\n",
" // Prevent repeat events\n",
" if (name === 'key_press') {\n",
" if (event.which === this._key) {\n",
" return;\n",
" } else {\n",
" this._key = event.which;\n",
" }\n",
" }\n",
" if (name === 'key_release') {\n",
" this._key = null;\n",
" }\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which !== 17) {\n",
" value += 'ctrl+';\n",
" }\n",
" if (event.altKey && event.which !== 18) {\n",
" value += 'alt+';\n",
" }\n",
" if (event.shiftKey && event.which !== 16) {\n",
" value += 'shift+';\n",
" }\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
" return false;\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
" if (name === 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message('toolbar_button', { name: name });\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"\n",
"///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
"// prettier-ignore\n",
"var _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
"\n",
"mpl.default_extension = \"png\";/* global mpl */\n",
"\n",
"var comm_websocket_adapter = function (comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function () {\n",
" comm.close();\n",
" };\n",
" ws.send = function (m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function (msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data']);\n",
" });\n",
" return ws;\n",
"};\n",
"\n",
"mpl.mpl_figure_comm = function (comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = document.getElementById(id);\n",
" var ws_proxy = comm_websocket_adapter(comm);\n",
"\n",
" function ondownload(figure, _format) {\n",
" window.open(figure.canvas.toDataURL());\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element;\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error('Failed to find cell for figure', id, fig);\n",
" return;\n",
" }\n",
" fig.cell_info[0].output_area.element.on(\n",
" 'cleared',\n",
" { fig: fig },\n",
" fig._remove_fig_handler\n",
" );\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function (fig, msg) {\n",
" var width = fig.canvas.width / fig.ratio;\n",
" fig.cell_info[0].output_area.element.off(\n",
" 'cleared',\n",
" fig._remove_fig_handler\n",
" );\n",
" fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable();\n",
" fig.parent_element.innerHTML =\n",
" '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
" fig.close_ws(fig, msg);\n",
"};\n",
"\n",
"mpl.figure.prototype.close_ws = function (fig, msg) {\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"};\n",
"\n",
"mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var width = this.canvas.width / this.ratio;\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] =\n",
" '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
"};\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function () {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message('ack', {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () {\n",
" fig.push_to_output();\n",
" }, 1000);\n",
"};\n",
"\n",
"mpl.figure.prototype._init_toolbar = function () {\n",
" var fig = this;\n",
"\n",
" var toolbar = document.createElement('div');\n",
" toolbar.classList = 'btn-toolbar';\n",
" this.root.appendChild(toolbar);\n",
"\n",
" function on_click_closure(name) {\n",
" return function (_event) {\n",
" return fig.toolbar_button_onclick(name);\n",
" };\n",
" }\n",
"\n",
" function on_mouseover_closure(tooltip) {\n",
" return function (event) {\n",
" if (!event.currentTarget.disabled) {\n",
" return fig.toolbar_button_onmouseover(tooltip);\n",
" }\n",
" };\n",
" }\n",
"\n",
" fig.buttons = {};\n",
" var buttonGroup = document.createElement('div');\n",
" buttonGroup.classList = 'btn-group';\n",
" var button;\n",
" for (var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" /* Instead of a spacer, we start a new button group. */\n",
" if (buttonGroup.hasChildNodes()) {\n",
" toolbar.appendChild(buttonGroup);\n",
" }\n",
" buttonGroup = document.createElement('div');\n",
" buttonGroup.classList = 'btn-group';\n",
" continue;\n",
" }\n",
"\n",
" button = fig.buttons[name] = document.createElement('button');\n",
" button.classList = 'btn btn-default';\n",
" button.href = '#';\n",
" button.title = name;\n",
" button.innerHTML = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n",
" button.addEventListener('click', on_click_closure(method_name));\n",
" button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
" buttonGroup.appendChild(button);\n",
" }\n",
"\n",
" if (buttonGroup.hasChildNodes()) {\n",
" toolbar.appendChild(buttonGroup);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = document.createElement('span');\n",
" status_bar.classList = 'mpl-message pull-right';\n",
" toolbar.appendChild(status_bar);\n",
" this.message = status_bar;\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = document.createElement('div');\n",
" buttongrp.classList = 'btn-group inline pull-right';\n",
" button = document.createElement('button');\n",
" button.classList = 'btn btn-mini btn-primary';\n",
" button.href = '#';\n",
" button.title = 'Stop Interaction';\n",
" button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n",
" button.addEventListener('click', function (_evt) {\n",
" fig.handle_close(fig, {});\n",
" });\n",
" button.addEventListener(\n",
" 'mouseover',\n",
" on_mouseover_closure('Stop Interaction')\n",
" );\n",
" buttongrp.appendChild(button);\n",
" var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
" titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
"};\n",
"\n",
"mpl.figure.prototype._remove_fig_handler = function (event) {\n",
" var fig = event.data.fig;\n",
" if (event.target !== this) {\n",
" // Ignore bubbled events from children.\n",
" return;\n",
" }\n",
" fig.close_ws(fig, {});\n",
"};\n",
"\n",
"mpl.figure.prototype._root_extra_style = function (el) {\n",
" el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
"};\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function (el) {\n",
" // this is important to make the div 'focusable\n",
" el.setAttribute('tabindex', 0);\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" } else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager) {\n",
" manager = IPython.keyboard_manager;\n",
" }\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which === 13) {\n",
" this.canvas_div.blur();\n",
" // select the cell after this one\n",
" var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
" IPython.notebook.select(index + 1);\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
" fig.ondownload(fig, null);\n",
"};\n",
"\n",
"mpl.find_output_cell = function (html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i = 0; i < ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code') {\n",
" for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] === html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"};\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel !== null) {\n",
" IPython.notebook.kernel.comm_manager.register_target(\n",
" 'matplotlib',\n",
" mpl.mpl_figure_comm\n",
" );\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4nOzdd3QUZdsG8EkiG4GwoSQfSBtQAypIsQTBgr4iTQXh1RewgIUgGhRBYUINIoIIAkoTlSIWUECKk0INPZRAQknvBEiABALpZff6/oiMrmmbbJnd7PU75znH3Z3duRNvfa7M7DwjgIiIiIgciqB2AURERERkXQyARERERA6GAZCIiIjIwTAAEhERETkYBkAiIiIiB8MASERERORgGACJiIiIHAwDIBEREZGDYQAkIiIicjAMgEREREQOhgGQiIiIyMEwABIRERE5GAZAIiIiIgfDAEhERETkYBgAiYiIiBwMAyARERGRg2EAJCIiInIwDIBEREREDoYBkIiIiMjBMAASERERORgGQCIiIiIHwwBIRERE5GAYAImIiIgcDAMgERERkYNhACQiIiJyMAyARERERA6GAZCIiIjIwTAAEhERETkYBkAiIiIiB8MASERERORgGACJiIiIHAwDIBEREZGDYQAkIiIicjAMgEREREQOhgGQiIiIyMEwABIRERE5GAZAIiIiIgfDAEhERETkYBgAiYiIiBwMAyARERGRg2EAJCIiInIwDIBEREREDoYBkIiIiMjBMAASERERORgGQCIiIiIHwwBIRERE5GAYAImIiIgcDAMgERERkYNhACQiIiJyMAyARERERA6GAZCIiIjIwTAAEhERETkYqwfAFStW4MEHH0SjRo3QqFEjPPbYYwgMDFReLygowPvvv4+mTZuiYcOGGDp0KDIyMgw+IzU1FQMHDkT9+vXh6emJTz75BCUlJQbbhISEoHv37tBoNLjnnnuwdu3acrUsW7YMoijC1dUV3t7eOH78uEV+ZiIiIiJbYvUAuGPHDgQEBCAuLg6xsbGYOnUq6tWrh/PnzwMAxo4dizZt2mDv3r0ICwvDY489hl69einvLy0tRefOndGnTx+Eh4cjMDAQHh4emDJlirJNUlISGjRogIkTJyIqKgpLly6Fi4sLgoODlW02btwIjUaDNWvWIDIyEj4+PmjcuDGuXLlivV8GERERkQps4hRwkyZN8MMPPyA7Oxv16tXDpk2blNeio6MhCAJCQ0MBAIGBgXB2djY4Krhy5UpotVoUFRUBACZPnoxOnToZ7GPYsGHo16+f8tjb2xu+vr7KY51Oh5YtW2Le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\" width=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x7f209084c400>"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"plt.close('all')\n",
"fig, ax = plt.subplots()\n",
"ax.plot(spectrumrange, sio2[:, 1], label='raw data')\n",
"\n",
"ax.plot(\n",
" spectrumrange[fit_range[0]:], \n",
" fitted_power(spectrumrange[fit_range[0]:]), \n",
" label='fitted power law',\n",
" linestyle='--',\n",
")\n",
"\n",
"ax.set_ylabel('EELS intensity (a.u.)')\n",
"ax.set_xlabel('Energy loss (eV)')\n",
"ax.set_xlim([3, 15])\n",
"ax.set_ylim([0, 3e4])\n",
"plt.legend()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Subtract the fitted power law\n",
"Subtract the fitted power law from the raw data to get a background-subtracted spectrum."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"sio2_subtracted_spectrum = sio2[fit_range[0]:, 1]-fitted_power(spectrumrange[fit_range[0]:])\n",
"spectrumrange_subtracted = spectrumrange[fit_range[0]:]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Plot the raw data, fitted power law, and the background-subtracted spectrum. We observe that the pre-bandgap area of the background-subtracted spectrum is now very close to 0 and has no distinctive features."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"/* global mpl */\n",
"window.mpl = {};\n",
"\n",
"mpl.get_websocket_type = function () {\n",
" if (typeof WebSocket !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof MozWebSocket !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert(\n",
" 'Your browser does not have WebSocket support. ' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.'\n",
" );\n",
" }\n",
"};\n",
"\n",
"mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = this.ws.binaryType !== undefined;\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById('mpl-warnings');\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent =\n",
" 'This browser does not support binary websocket messages. ' +\n",
" 'Performance may be slow.';\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = document.createElement('div');\n",
" this.root.setAttribute('style', 'display: inline-block');\n",
" this._root_extra_style(this.root);\n",
"\n",
" parent_element.appendChild(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message('supports_binary', { value: fig.supports_binary });\n",
" fig.send_message('send_image_mode', {});\n",
" if (fig.ratio !== 1) {\n",
" fig.send_message('set_dpi_ratio', { dpi_ratio: fig.ratio });\n",
" }\n",
" fig.send_message('refresh', {});\n",
" };\n",
"\n",
" this.imageObj.onload = function () {\n",
" if (fig.image_mode === 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function () {\n",
" fig.ws.close();\n",
" };\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"};\n",
"\n",
"mpl.figure.prototype._init_header = function () {\n",
" var titlebar = document.createElement('div');\n",
" titlebar.classList =\n",
" 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
" var titletext = document.createElement('div');\n",
" titletext.classList = 'ui-dialog-title';\n",
" titletext.setAttribute(\n",
" 'style',\n",
" 'width: 100%; text-align: center; padding: 3px;'\n",
" );\n",
" titlebar.appendChild(titletext);\n",
" this.root.appendChild(titlebar);\n",
" this.header = titletext;\n",
"};\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
"\n",
"mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
"\n",
"mpl.figure.prototype._init_canvas = function () {\n",
" var fig = this;\n",
"\n",
" var canvas_div = (this.canvas_div = document.createElement('div'));\n",
" canvas_div.setAttribute(\n",
" 'style',\n",
" 'border: 1px solid #ddd;' +\n",
" 'box-sizing: content-box;' +\n",
" 'clear: both;' +\n",
" 'min-height: 1px;' +\n",
" 'min-width: 1px;' +\n",
" 'outline: 0;' +\n",
" 'overflow: hidden;' +\n",
" 'position: relative;' +\n",
" 'resize: both;'\n",
" );\n",
"\n",
" function on_keyboard_event_closure(name) {\n",
" return function (event) {\n",
" return fig.key_event(event, name);\n",
" };\n",
" }\n",
"\n",
" canvas_div.addEventListener(\n",
" 'keydown',\n",
" on_keyboard_event_closure('key_press')\n",
" );\n",
" canvas_div.addEventListener(\n",
" 'keyup',\n",
" on_keyboard_event_closure('key_release')\n",
" );\n",
"\n",
" this._canvas_extra_style(canvas_div);\n",
" this.root.appendChild(canvas_div);\n",
"\n",
" var canvas = (this.canvas = document.createElement('canvas'));\n",
" canvas.classList.add('mpl-canvas');\n",
" canvas.setAttribute('style', 'box-sizing: content-box;');\n",
"\n",
" this.context = canvas.getContext('2d');\n",
"\n",
" var backingStore =\n",
" this.context.backingStorePixelRatio ||\n",
" this.context.webkitBackingStorePixelRatio ||\n",
" this.context.mozBackingStorePixelRatio ||\n",
" this.context.msBackingStorePixelRatio ||\n",
" this.context.oBackingStorePixelRatio ||\n",
" this.context.backingStorePixelRatio ||\n",
" 1;\n",
"\n",
" this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
"\n",
" var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
" 'canvas'\n",
" ));\n",
" rubberband_canvas.setAttribute(\n",
" 'style',\n",
" 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n",
" );\n",
"\n",
" // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
" if (this.ResizeObserver === undefined) {\n",
" if (window.ResizeObserver !== undefined) {\n",
" this.ResizeObserver = window.ResizeObserver;\n",
" } else {\n",
" var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
" this.ResizeObserver = obs.ResizeObserver;\n",
" }\n",
" }\n",
"\n",
" this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
" var nentries = entries.length;\n",
" for (var i = 0; i < nentries; i++) {\n",
" var entry = entries[i];\n",
" var width, height;\n",
" if (entry.contentBoxSize) {\n",
" if (entry.contentBoxSize instanceof Array) {\n",
" // Chrome 84 implements new version of spec.\n",
" width = entry.contentBoxSize[0].inlineSize;\n",
" height = entry.contentBoxSize[0].blockSize;\n",
" } else {\n",
" // Firefox implements old version of spec.\n",
" width = entry.contentBoxSize.inlineSize;\n",
" height = entry.contentBoxSize.blockSize;\n",
" }\n",
" } else {\n",
" // Chrome <84 implements even older version of spec.\n",
" width = entry.contentRect.width;\n",
" height = entry.contentRect.height;\n",
" }\n",
"\n",
" // Keep the size of the canvas and rubber band canvas in sync with\n",
" // the canvas container.\n",
" if (entry.devicePixelContentBoxSize) {\n",
" // Chrome 84 implements new version of spec.\n",
" canvas.setAttribute(\n",
" 'width',\n",
" entry.devicePixelContentBoxSize[0].inlineSize\n",
" );\n",
" canvas.setAttribute(\n",
" 'height',\n",
" entry.devicePixelContentBoxSize[0].blockSize\n",
" );\n",
" } else {\n",
" canvas.setAttribute('width', width * fig.ratio);\n",
" canvas.setAttribute('height', height * fig.ratio);\n",
" }\n",
" canvas.setAttribute(\n",
" 'style',\n",
" 'width: ' + width + 'px; height: ' + height + 'px;'\n",
" );\n",
"\n",
" rubberband_canvas.setAttribute('width', width);\n",
" rubberband_canvas.setAttribute('height', height);\n",
"\n",
" // And update the size in Python. We ignore the initial 0/0 size\n",
" // that occurs as the element is placed into the DOM, which should\n",
" // otherwise not happen due to the minimum size styling.\n",
" if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
" fig.request_resize(width, height);\n",
" }\n",
" }\n",
" });\n",
" this.resizeObserverInstance.observe(canvas_div);\n",
"\n",
" function on_mouse_event_closure(name) {\n",
" return function (event) {\n",
" return fig.mouse_event(event, name);\n",
" };\n",
" }\n",
"\n",
" rubberband_canvas.addEventListener(\n",
" 'mousedown',\n",
" on_mouse_event_closure('button_press')\n",
" );\n",
" rubberband_canvas.addEventListener(\n",
" 'mouseup',\n",
" on_mouse_event_closure('button_release')\n",
" );\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband_canvas.addEventListener(\n",
" 'mousemove',\n",
" on_mouse_event_closure('motion_notify')\n",
" );\n",
"\n",
" rubberband_canvas.addEventListener(\n",
" 'mouseenter',\n",
" on_mouse_event_closure('figure_enter')\n",
" );\n",
" rubberband_canvas.addEventListener(\n",
" 'mouseleave',\n",
" on_mouse_event_closure('figure_leave')\n",
" );\n",
"\n",
" canvas_div.addEventListener('wheel', function (event) {\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" on_mouse_event_closure('scroll')(event);\n",
" });\n",
"\n",
" canvas_div.appendChild(canvas);\n",
" canvas_div.appendChild(rubberband_canvas);\n",
"\n",
" this.rubberband_context = rubberband_canvas.getContext('2d');\n",
" this.rubberband_context.strokeStyle = '#000000';\n",
"\n",
" this._resize_canvas = function (width, height, forward) {\n",
" if (forward) {\n",
" canvas_div.style.width = width + 'px';\n",
" canvas_div.style.height = height + 'px';\n",
" }\n",
" };\n",
"\n",
" // Disable right mouse context menu.\n",
" this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n",
" event.preventDefault();\n",
" return false;\n",
" });\n",
"\n",
" function set_focus() {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"};\n",
"\n",
"mpl.figure.prototype._init_toolbar = function () {\n",
" var fig = this;\n",
"\n",
" var toolbar = document.createElement('div');\n",
" toolbar.classList = 'mpl-toolbar';\n",
" this.root.appendChild(toolbar);\n",
"\n",
" function on_click_closure(name) {\n",
" return function (_event) {\n",
" return fig.toolbar_button_onclick(name);\n",
" };\n",
" }\n",
"\n",
" function on_mouseover_closure(tooltip) {\n",
" return function (event) {\n",
" if (!event.currentTarget.disabled) {\n",
" return fig.toolbar_button_onmouseover(tooltip);\n",
" }\n",
" };\n",
" }\n",
"\n",
" fig.buttons = {};\n",
" var buttonGroup = document.createElement('div');\n",
" buttonGroup.classList = 'mpl-button-group';\n",
" for (var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" /* Instead of a spacer, we start a new button group. */\n",
" if (buttonGroup.hasChildNodes()) {\n",
" toolbar.appendChild(buttonGroup);\n",
" }\n",
" buttonGroup = document.createElement('div');\n",
" buttonGroup.classList = 'mpl-button-group';\n",
" continue;\n",
" }\n",
"\n",
" var button = (fig.buttons[name] = document.createElement('button'));\n",
" button.classList = 'mpl-widget';\n",
" button.setAttribute('role', 'button');\n",
" button.setAttribute('aria-disabled', 'false');\n",
" button.addEventListener('click', on_click_closure(method_name));\n",
" button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
"\n",
" var icon_img = document.createElement('img');\n",
" icon_img.src = '_images/' + image + '.png';\n",
" icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
" icon_img.alt = tooltip;\n",
" button.appendChild(icon_img);\n",
"\n",
" buttonGroup.appendChild(button);\n",
" }\n",
"\n",
" if (buttonGroup.hasChildNodes()) {\n",
" toolbar.appendChild(buttonGroup);\n",
" }\n",
"\n",
" var fmt_picker = document.createElement('select');\n",
" fmt_picker.classList = 'mpl-widget';\n",
" toolbar.appendChild(fmt_picker);\n",
" this.format_dropdown = fmt_picker;\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = document.createElement('option');\n",
" option.selected = fmt === mpl.default_extension;\n",
" option.innerHTML = fmt;\n",
" fmt_picker.appendChild(option);\n",
" }\n",
"\n",
" var status_bar = document.createElement('span');\n",
" status_bar.classList = 'mpl-message';\n",
" toolbar.appendChild(status_bar);\n",
" this.message = status_bar;\n",
"};\n",
"\n",
"mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
"};\n",
"\n",
"mpl.figure.prototype.send_message = function (type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"};\n",
"\n",
"mpl.figure.prototype.send_draw_message = function () {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1], msg['forward']);\n",
" fig.send_message('refresh', {});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
" var x0 = msg['x0'] / fig.ratio;\n",
" var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
" var x1 = msg['x1'] / fig.ratio;\n",
" var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0,\n",
" 0,\n",
" fig.canvas.width / fig.ratio,\n",
" fig.canvas.height / fig.ratio\n",
" );\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch (cursor) {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_message = function (fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
" for (var key in msg) {\n",
" if (!(key in fig.buttons)) {\n",
" continue;\n",
" }\n",
" fig.buttons[key].disabled = !msg[key];\n",
" fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
" if (msg['mode'] === 'PAN') {\n",
" fig.buttons['Pan'].classList.add('active');\n",
" fig.buttons['Zoom'].classList.remove('active');\n",
" } else if (msg['mode'] === 'ZOOM') {\n",
" fig.buttons['Pan'].classList.remove('active');\n",
" fig.buttons['Zoom'].classList.add('active');\n",
" } else {\n",
" fig.buttons['Pan'].classList.remove('active');\n",
" fig.buttons['Zoom'].classList.remove('active');\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function () {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message('ack', {});\n",
"};\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function (fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = 'image/png';\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src\n",
" );\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data\n",
" );\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" } else if (\n",
" typeof evt.data === 'string' &&\n",
" evt.data.slice(0, 21) === 'data:image/png;base64'\n",
" ) {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig['handle_' + msg_type];\n",
" } catch (e) {\n",
" console.log(\n",
" \"No handler for the '\" + msg_type + \"' message type: \",\n",
" msg\n",
" );\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\n",
" \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
" e,\n",
" e.stack,\n",
" msg\n",
" );\n",
" }\n",
" }\n",
" };\n",
"};\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function (e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e) {\n",
" e = window.event;\n",
" }\n",
" if (e.target) {\n",
" targ = e.target;\n",
" } else if (e.srcElement) {\n",
" targ = e.srcElement;\n",
" }\n",
" if (targ.nodeType === 3) {\n",
" // defeat Safari bug\n",
" targ = targ.parentNode;\n",
" }\n",
"\n",
" // pageX,Y are the mouse positions relative to the document\n",
" var boundingRect = targ.getBoundingClientRect();\n",
" var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n",
" var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n",
"\n",
" return { x: x, y: y };\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys(original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object') {\n",
" obj[key] = original[key];\n",
" }\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function (event, name) {\n",
" var canvas_pos = mpl.findpos(event);\n",
"\n",
" if (name === 'button_press') {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x * this.ratio;\n",
" var y = canvas_pos.y * this.ratio;\n",
"\n",
" this.send_message(name, {\n",
" x: x,\n",
" y: y,\n",
" button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event),\n",
" });\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"};\n",
"\n",
"mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"};\n",
"\n",
"mpl.figure.prototype.key_event = function (event, name) {\n",
" // Prevent repeat events\n",
" if (name === 'key_press') {\n",
" if (event.which === this._key) {\n",
" return;\n",
" } else {\n",
" this._key = event.which;\n",
" }\n",
" }\n",
" if (name === 'key_release') {\n",
" this._key = null;\n",
" }\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which !== 17) {\n",
" value += 'ctrl+';\n",
" }\n",
" if (event.altKey && event.which !== 18) {\n",
" value += 'alt+';\n",
" }\n",
" if (event.shiftKey && event.which !== 16) {\n",
" value += 'shift+';\n",
" }\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
" return false;\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
" if (name === 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message('toolbar_button', { name: name });\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"\n",
"///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
"// prettier-ignore\n",
"var _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
"\n",
"mpl.default_extension = \"png\";/* global mpl */\n",
"\n",
"var comm_websocket_adapter = function (comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function () {\n",
" comm.close();\n",
" };\n",
" ws.send = function (m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function (msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data']);\n",
" });\n",
" return ws;\n",
"};\n",
"\n",
"mpl.mpl_figure_comm = function (comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = document.getElementById(id);\n",
" var ws_proxy = comm_websocket_adapter(comm);\n",
"\n",
" function ondownload(figure, _format) {\n",
" window.open(figure.canvas.toDataURL());\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element;\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error('Failed to find cell for figure', id, fig);\n",
" return;\n",
" }\n",
" fig.cell_info[0].output_area.element.on(\n",
" 'cleared',\n",
" { fig: fig },\n",
" fig._remove_fig_handler\n",
" );\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function (fig, msg) {\n",
" var width = fig.canvas.width / fig.ratio;\n",
" fig.cell_info[0].output_area.element.off(\n",
" 'cleared',\n",
" fig._remove_fig_handler\n",
" );\n",
" fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable();\n",
" fig.parent_element.innerHTML =\n",
" '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
" fig.close_ws(fig, msg);\n",
"};\n",
"\n",
"mpl.figure.prototype.close_ws = function (fig, msg) {\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"};\n",
"\n",
"mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var width = this.canvas.width / this.ratio;\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] =\n",
" '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
"};\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function () {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message('ack', {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () {\n",
" fig.push_to_output();\n",
" }, 1000);\n",
"};\n",
"\n",
"mpl.figure.prototype._init_toolbar = function () {\n",
" var fig = this;\n",
"\n",
" var toolbar = document.createElement('div');\n",
" toolbar.classList = 'btn-toolbar';\n",
" this.root.appendChild(toolbar);\n",
"\n",
" function on_click_closure(name) {\n",
" return function (_event) {\n",
" return fig.toolbar_button_onclick(name);\n",
" };\n",
" }\n",
"\n",
" function on_mouseover_closure(tooltip) {\n",
" return function (event) {\n",
" if (!event.currentTarget.disabled) {\n",
" return fig.toolbar_button_onmouseover(tooltip);\n",
" }\n",
" };\n",
" }\n",
"\n",
" fig.buttons = {};\n",
" var buttonGroup = document.createElement('div');\n",
" buttonGroup.classList = 'btn-group';\n",
" var button;\n",
" for (var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" /* Instead of a spacer, we start a new button group. */\n",
" if (buttonGroup.hasChildNodes()) {\n",
" toolbar.appendChild(buttonGroup);\n",
" }\n",
" buttonGroup = document.createElement('div');\n",
" buttonGroup.classList = 'btn-group';\n",
" continue;\n",
" }\n",
"\n",
" button = fig.buttons[name] = document.createElement('button');\n",
" button.classList = 'btn btn-default';\n",
" button.href = '#';\n",
" button.title = name;\n",
" button.innerHTML = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n",
" button.addEventListener('click', on_click_closure(method_name));\n",
" button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
" buttonGroup.appendChild(button);\n",
" }\n",
"\n",
" if (buttonGroup.hasChildNodes()) {\n",
" toolbar.appendChild(buttonGroup);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = document.createElement('span');\n",
" status_bar.classList = 'mpl-message pull-right';\n",
" toolbar.appendChild(status_bar);\n",
" this.message = status_bar;\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = document.createElement('div');\n",
" buttongrp.classList = 'btn-group inline pull-right';\n",
" button = document.createElement('button');\n",
" button.classList = 'btn btn-mini btn-primary';\n",
" button.href = '#';\n",
" button.title = 'Stop Interaction';\n",
" button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n",
" button.addEventListener('click', function (_evt) {\n",
" fig.handle_close(fig, {});\n",
" });\n",
" button.addEventListener(\n",
" 'mouseover',\n",
" on_mouseover_closure('Stop Interaction')\n",
" );\n",
" buttongrp.appendChild(button);\n",
" var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
" titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
"};\n",
"\n",
"mpl.figure.prototype._remove_fig_handler = function (event) {\n",
" var fig = event.data.fig;\n",
" if (event.target !== this) {\n",
" // Ignore bubbled events from children.\n",
" return;\n",
" }\n",
" fig.close_ws(fig, {});\n",
"};\n",
"\n",
"mpl.figure.prototype._root_extra_style = function (el) {\n",
" el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
"};\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function (el) {\n",
" // this is important to make the div 'focusable\n",
" el.setAttribute('tabindex', 0);\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" } else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager) {\n",
" manager = IPython.keyboard_manager;\n",
" }\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which === 13) {\n",
" this.canvas_div.blur();\n",
" // select the cell after this one\n",
" var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
" IPython.notebook.select(index + 1);\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
" fig.ondownload(fig, null);\n",
"};\n",
"\n",
"mpl.find_output_cell = function (html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i = 0; i < ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code') {\n",
" for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] === html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"};\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel !== null) {\n",
" IPython.notebook.kernel.comm_manager.register_target(\n",
" 'matplotlib',\n",
" mpl.mpl_figure_comm\n",
" );\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4nOzdeXhM5/sG8COpiSwmZKk1OailiKJLFG11sVNbf63Soi1RbbSKMihiV6Vo7RSp2moLNYlYIvZYQiKyyUYEsYVoFtlm7t8f+To1koyJmWRmMvfnut7rambOzHkynnpvZ3lHABERERFZFMHYBRARERFR+WIAJCIiIrIwDIBEREREFoYBkIiIiMjCMAASERERWRgGQCIiIiILwwBIREREZGEYAImIiIgsDAMgERERkYVhACQiIiKyMAyARERERBaGAZCIiIjIwjAAEhEREVkYBkAiIiIiC8MASERERGRhGACJiIiILAwDIBEREZGFYQAkIiIisjAMgEREREQWhgGQiIiIyMIwABIRERFZGAZAIiIiIgvDAEhERERkYRgAiYiIiCwMAyARERGRhWEAJCIiIrIwDIBEREREFoYBkIiIiMjCMAASERERWRgGQCIiIiILwwBIREREZGEYAImIiIgsDAMgERERkYVhACQiIiKyMAyARERERBaGAZCIiIjIwjAAEhEREVkYBkAiIiIiC8MASERERGRhGACJiIiILAwDIBEREZGFYQAkIiIisjAMgEREREQWhgGQiIiIyMIwABIRERFZGAZAIiIiIgvDAEhERERkYRgAiYiIiCwMAyARERGRhWEAJCIiIrIwDIBEREREFoYBkIiIiMjClHsAXL58OVq0aIGqVauiatWqePPNNxEQECA9/+jRI3z77bdwcnKCvb09+vXrh1u3bmm8R3JyMrp37w5bW1u4urrixx9/RH5+vsY2wcHBaN26NWQyGV566SWsX7++SC1Lly6FKIqwsbGBp6cnzpw5Uya/MxEREZEpKfcA+M8//8Df3x9xcXG4fPkyJk2ahMqVKyMyMhIAMGLECLi5uSEoKAihoaF488030a5dO+n1BQUF8PDwQMeOHREWFoaAgAC4uLhg4sSJ0jZJSUmws7PDmDFjEB0djSVLlsDa2hqBgYHSNlu3boVMJsO6desQFRUFLy8vVKtWDbdv3y6/D4OIiIjICEziFHD16tXxxx9/ID09HZUrV8b27dul52JiYiAIAkJCQgAAAQEBsLKy0jgquGLFCsjlcuTm5gIAxo8fj+bNm2vso3///ujSpYv0s6enJ7y9vaWfVSoVateujblz55bJ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\" width=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x7f208c50f630>"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"plt.close('all')\n",
"fig, ax = plt.subplots()\n",
"ax.plot(spectrumrange, sio2[:, 1], label='raw data')\n",
"\n",
"ax.plot(\n",
" spectrumrange_subtracted, \n",
" fitted_power(spectrumrange[fit_range[0]:]), \n",
" label='fitted power law',\n",
" linestyle='--',\n",
")\n",
"\n",
"ax.plot(\n",
" spectrumrange_subtracted, \n",
" sio2_subtracted_spectrum,\n",
" label='background-subtracted',\n",
")\n",
"\n",
"ax.set_ylabel('EELS intensity (a.u.)')\n",
"ax.set_xlabel('Energy loss (eV)')\n",
"ax.set_xlim([3, 15])\n",
"ax.set_ylim([-2000, 3e4])\n",
"ax.axhline(0, color='k', zorder=0.1, linewidth=0.5)\n",
"plt.legend()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Fit a line to the bandgap edge"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Fit a line function to the bandgap edge, following a similar procedure, but this time using Astropy's linear least-squares fitter.\n",
"- [Linear least squares](https://docs.astropy.org/en/stable/api/astropy.modeling.fitting.LinearLSQFitter.html#astropy.modeling.fitting.LinearLSQFitter)\n",
"- [Line 1D](https://docs.astropy.org/en/stable/api/astropy.modeling.functional_models.Linear1D.html)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First, plot the background-subtracted spectrum to find the fit range we want to use for the bandgap edge itself."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"/* global mpl */\n",
"window.mpl = {};\n",
"\n",
"mpl.get_websocket_type = function () {\n",
" if (typeof WebSocket !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof MozWebSocket !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert(\n",
" 'Your browser does not have WebSocket support. ' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.'\n",
" );\n",
" }\n",
"};\n",
"\n",
"mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = this.ws.binaryType !== undefined;\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById('mpl-warnings');\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent =\n",
" 'This browser does not support binary websocket messages. ' +\n",
" 'Performance may be slow.';\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = document.createElement('div');\n",
" this.root.setAttribute('style', 'display: inline-block');\n",
" this._root_extra_style(this.root);\n",
"\n",
" parent_element.appendChild(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message('supports_binary', { value: fig.supports_binary });\n",
" fig.send_message('send_image_mode', {});\n",
" if (fig.ratio !== 1) {\n",
" fig.send_message('set_dpi_ratio', { dpi_ratio: fig.ratio });\n",
" }\n",
" fig.send_message('refresh', {});\n",
" };\n",
"\n",
" this.imageObj.onload = function () {\n",
" if (fig.image_mode === 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function () {\n",
" fig.ws.close();\n",
" };\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"};\n",
"\n",
"mpl.figure.prototype._init_header = function () {\n",
" var titlebar = document.createElement('div');\n",
" titlebar.classList =\n",
" 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
" var titletext = document.createElement('div');\n",
" titletext.classList = 'ui-dialog-title';\n",
" titletext.setAttribute(\n",
" 'style',\n",
" 'width: 100%; text-align: center; padding: 3px;'\n",
" );\n",
" titlebar.appendChild(titletext);\n",
" this.root.appendChild(titlebar);\n",
" this.header = titletext;\n",
"};\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
"\n",
"mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
"\n",
"mpl.figure.prototype._init_canvas = function () {\n",
" var fig = this;\n",
"\n",
" var canvas_div = (this.canvas_div = document.createElement('div'));\n",
" canvas_div.setAttribute(\n",
" 'style',\n",
" 'border: 1px solid #ddd;' +\n",
" 'box-sizing: content-box;' +\n",
" 'clear: both;' +\n",
" 'min-height: 1px;' +\n",
" 'min-width: 1px;' +\n",
" 'outline: 0;' +\n",
" 'overflow: hidden;' +\n",
" 'position: relative;' +\n",
" 'resize: both;'\n",
" );\n",
"\n",
" function on_keyboard_event_closure(name) {\n",
" return function (event) {\n",
" return fig.key_event(event, name);\n",
" };\n",
" }\n",
"\n",
" canvas_div.addEventListener(\n",
" 'keydown',\n",
" on_keyboard_event_closure('key_press')\n",
" );\n",
" canvas_div.addEventListener(\n",
" 'keyup',\n",
" on_keyboard_event_closure('key_release')\n",
" );\n",
"\n",
" this._canvas_extra_style(canvas_div);\n",
" this.root.appendChild(canvas_div);\n",
"\n",
" var canvas = (this.canvas = document.createElement('canvas'));\n",
" canvas.classList.add('mpl-canvas');\n",
" canvas.setAttribute('style', 'box-sizing: content-box;');\n",
"\n",
" this.context = canvas.getContext('2d');\n",
"\n",
" var backingStore =\n",
" this.context.backingStorePixelRatio ||\n",
" this.context.webkitBackingStorePixelRatio ||\n",
" this.context.mozBackingStorePixelRatio ||\n",
" this.context.msBackingStorePixelRatio ||\n",
" this.context.oBackingStorePixelRatio ||\n",
" this.context.backingStorePixelRatio ||\n",
" 1;\n",
"\n",
" this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
"\n",
" var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
" 'canvas'\n",
" ));\n",
" rubberband_canvas.setAttribute(\n",
" 'style',\n",
" 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n",
" );\n",
"\n",
" // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
" if (this.ResizeObserver === undefined) {\n",
" if (window.ResizeObserver !== undefined) {\n",
" this.ResizeObserver = window.ResizeObserver;\n",
" } else {\n",
" var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
" this.ResizeObserver = obs.ResizeObserver;\n",
" }\n",
" }\n",
"\n",
" this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
" var nentries = entries.length;\n",
" for (var i = 0; i < nentries; i++) {\n",
" var entry = entries[i];\n",
" var width, height;\n",
" if (entry.contentBoxSize) {\n",
" if (entry.contentBoxSize instanceof Array) {\n",
" // Chrome 84 implements new version of spec.\n",
" width = entry.contentBoxSize[0].inlineSize;\n",
" height = entry.contentBoxSize[0].blockSize;\n",
" } else {\n",
" // Firefox implements old version of spec.\n",
" width = entry.contentBoxSize.inlineSize;\n",
" height = entry.contentBoxSize.blockSize;\n",
" }\n",
" } else {\n",
" // Chrome <84 implements even older version of spec.\n",
" width = entry.contentRect.width;\n",
" height = entry.contentRect.height;\n",
" }\n",
"\n",
" // Keep the size of the canvas and rubber band canvas in sync with\n",
" // the canvas container.\n",
" if (entry.devicePixelContentBoxSize) {\n",
" // Chrome 84 implements new version of spec.\n",
" canvas.setAttribute(\n",
" 'width',\n",
" entry.devicePixelContentBoxSize[0].inlineSize\n",
" );\n",
" canvas.setAttribute(\n",
" 'height',\n",
" entry.devicePixelContentBoxSize[0].blockSize\n",
" );\n",
" } else {\n",
" canvas.setAttribute('width', width * fig.ratio);\n",
" canvas.setAttribute('height', height * fig.ratio);\n",
" }\n",
" canvas.setAttribute(\n",
" 'style',\n",
" 'width: ' + width + 'px; height: ' + height + 'px;'\n",
" );\n",
"\n",
" rubberband_canvas.setAttribute('width', width);\n",
" rubberband_canvas.setAttribute('height', height);\n",
"\n",
" // And update the size in Python. We ignore the initial 0/0 size\n",
" // that occurs as the element is placed into the DOM, which should\n",
" // otherwise not happen due to the minimum size styling.\n",
" if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
" fig.request_resize(width, height);\n",
" }\n",
" }\n",
" });\n",
" this.resizeObserverInstance.observe(canvas_div);\n",
"\n",
" function on_mouse_event_closure(name) {\n",
" return function (event) {\n",
" return fig.mouse_event(event, name);\n",
" };\n",
" }\n",
"\n",
" rubberband_canvas.addEventListener(\n",
" 'mousedown',\n",
" on_mouse_event_closure('button_press')\n",
" );\n",
" rubberband_canvas.addEventListener(\n",
" 'mouseup',\n",
" on_mouse_event_closure('button_release')\n",
" );\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband_canvas.addEventListener(\n",
" 'mousemove',\n",
" on_mouse_event_closure('motion_notify')\n",
" );\n",
"\n",
" rubberband_canvas.addEventListener(\n",
" 'mouseenter',\n",
" on_mouse_event_closure('figure_enter')\n",
" );\n",
" rubberband_canvas.addEventListener(\n",
" 'mouseleave',\n",
" on_mouse_event_closure('figure_leave')\n",
" );\n",
"\n",
" canvas_div.addEventListener('wheel', function (event) {\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" on_mouse_event_closure('scroll')(event);\n",
" });\n",
"\n",
" canvas_div.appendChild(canvas);\n",
" canvas_div.appendChild(rubberband_canvas);\n",
"\n",
" this.rubberband_context = rubberband_canvas.getContext('2d');\n",
" this.rubberband_context.strokeStyle = '#000000';\n",
"\n",
" this._resize_canvas = function (width, height, forward) {\n",
" if (forward) {\n",
" canvas_div.style.width = width + 'px';\n",
" canvas_div.style.height = height + 'px';\n",
" }\n",
" };\n",
"\n",
" // Disable right mouse context menu.\n",
" this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n",
" event.preventDefault();\n",
" return false;\n",
" });\n",
"\n",
" function set_focus() {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"};\n",
"\n",
"mpl.figure.prototype._init_toolbar = function () {\n",
" var fig = this;\n",
"\n",
" var toolbar = document.createElement('div');\n",
" toolbar.classList = 'mpl-toolbar';\n",
" this.root.appendChild(toolbar);\n",
"\n",
" function on_click_closure(name) {\n",
" return function (_event) {\n",
" return fig.toolbar_button_onclick(name);\n",
" };\n",
" }\n",
"\n",
" function on_mouseover_closure(tooltip) {\n",
" return function (event) {\n",
" if (!event.currentTarget.disabled) {\n",
" return fig.toolbar_button_onmouseover(tooltip);\n",
" }\n",
" };\n",
" }\n",
"\n",
" fig.buttons = {};\n",
" var buttonGroup = document.createElement('div');\n",
" buttonGroup.classList = 'mpl-button-group';\n",
" for (var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" /* Instead of a spacer, we start a new button group. */\n",
" if (buttonGroup.hasChildNodes()) {\n",
" toolbar.appendChild(buttonGroup);\n",
" }\n",
" buttonGroup = document.createElement('div');\n",
" buttonGroup.classList = 'mpl-button-group';\n",
" continue;\n",
" }\n",
"\n",
" var button = (fig.buttons[name] = document.createElement('button'));\n",
" button.classList = 'mpl-widget';\n",
" button.setAttribute('role', 'button');\n",
" button.setAttribute('aria-disabled', 'false');\n",
" button.addEventListener('click', on_click_closure(method_name));\n",
" button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
"\n",
" var icon_img = document.createElement('img');\n",
" icon_img.src = '_images/' + image + '.png';\n",
" icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
" icon_img.alt = tooltip;\n",
" button.appendChild(icon_img);\n",
"\n",
" buttonGroup.appendChild(button);\n",
" }\n",
"\n",
" if (buttonGroup.hasChildNodes()) {\n",
" toolbar.appendChild(buttonGroup);\n",
" }\n",
"\n",
" var fmt_picker = document.createElement('select');\n",
" fmt_picker.classList = 'mpl-widget';\n",
" toolbar.appendChild(fmt_picker);\n",
" this.format_dropdown = fmt_picker;\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = document.createElement('option');\n",
" option.selected = fmt === mpl.default_extension;\n",
" option.innerHTML = fmt;\n",
" fmt_picker.appendChild(option);\n",
" }\n",
"\n",
" var status_bar = document.createElement('span');\n",
" status_bar.classList = 'mpl-message';\n",
" toolbar.appendChild(status_bar);\n",
" this.message = status_bar;\n",
"};\n",
"\n",
"mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
"};\n",
"\n",
"mpl.figure.prototype.send_message = function (type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"};\n",
"\n",
"mpl.figure.prototype.send_draw_message = function () {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1], msg['forward']);\n",
" fig.send_message('refresh', {});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
" var x0 = msg['x0'] / fig.ratio;\n",
" var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
" var x1 = msg['x1'] / fig.ratio;\n",
" var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0,\n",
" 0,\n",
" fig.canvas.width / fig.ratio,\n",
" fig.canvas.height / fig.ratio\n",
" );\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch (cursor) {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_message = function (fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
" for (var key in msg) {\n",
" if (!(key in fig.buttons)) {\n",
" continue;\n",
" }\n",
" fig.buttons[key].disabled = !msg[key];\n",
" fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
" if (msg['mode'] === 'PAN') {\n",
" fig.buttons['Pan'].classList.add('active');\n",
" fig.buttons['Zoom'].classList.remove('active');\n",
" } else if (msg['mode'] === 'ZOOM') {\n",
" fig.buttons['Pan'].classList.remove('active');\n",
" fig.buttons['Zoom'].classList.add('active');\n",
" } else {\n",
" fig.buttons['Pan'].classList.remove('active');\n",
" fig.buttons['Zoom'].classList.remove('active');\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function () {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message('ack', {});\n",
"};\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function (fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = 'image/png';\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src\n",
" );\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data\n",
" );\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" } else if (\n",
" typeof evt.data === 'string' &&\n",
" evt.data.slice(0, 21) === 'data:image/png;base64'\n",
" ) {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig['handle_' + msg_type];\n",
" } catch (e) {\n",
" console.log(\n",
" \"No handler for the '\" + msg_type + \"' message type: \",\n",
" msg\n",
" );\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\n",
" \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
" e,\n",
" e.stack,\n",
" msg\n",
" );\n",
" }\n",
" }\n",
" };\n",
"};\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function (e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e) {\n",
" e = window.event;\n",
" }\n",
" if (e.target) {\n",
" targ = e.target;\n",
" } else if (e.srcElement) {\n",
" targ = e.srcElement;\n",
" }\n",
" if (targ.nodeType === 3) {\n",
" // defeat Safari bug\n",
" targ = targ.parentNode;\n",
" }\n",
"\n",
" // pageX,Y are the mouse positions relative to the document\n",
" var boundingRect = targ.getBoundingClientRect();\n",
" var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n",
" var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n",
"\n",
" return { x: x, y: y };\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys(original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object') {\n",
" obj[key] = original[key];\n",
" }\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function (event, name) {\n",
" var canvas_pos = mpl.findpos(event);\n",
"\n",
" if (name === 'button_press') {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x * this.ratio;\n",
" var y = canvas_pos.y * this.ratio;\n",
"\n",
" this.send_message(name, {\n",
" x: x,\n",
" y: y,\n",
" button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event),\n",
" });\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"};\n",
"\n",
"mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"};\n",
"\n",
"mpl.figure.prototype.key_event = function (event, name) {\n",
" // Prevent repeat events\n",
" if (name === 'key_press') {\n",
" if (event.which === this._key) {\n",
" return;\n",
" } else {\n",
" this._key = event.which;\n",
" }\n",
" }\n",
" if (name === 'key_release') {\n",
" this._key = null;\n",
" }\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which !== 17) {\n",
" value += 'ctrl+';\n",
" }\n",
" if (event.altKey && event.which !== 18) {\n",
" value += 'alt+';\n",
" }\n",
" if (event.shiftKey && event.which !== 16) {\n",
" value += 'shift+';\n",
" }\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
" return false;\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
" if (name === 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message('toolbar_button', { name: name });\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"\n",
"///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
"// prettier-ignore\n",
"var _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
"\n",
"mpl.default_extension = \"png\";/* global mpl */\n",
"\n",
"var comm_websocket_adapter = function (comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function () {\n",
" comm.close();\n",
" };\n",
" ws.send = function (m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function (msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data']);\n",
" });\n",
" return ws;\n",
"};\n",
"\n",
"mpl.mpl_figure_comm = function (comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = document.getElementById(id);\n",
" var ws_proxy = comm_websocket_adapter(comm);\n",
"\n",
" function ondownload(figure, _format) {\n",
" window.open(figure.canvas.toDataURL());\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element;\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error('Failed to find cell for figure', id, fig);\n",
" return;\n",
" }\n",
" fig.cell_info[0].output_area.element.on(\n",
" 'cleared',\n",
" { fig: fig },\n",
" fig._remove_fig_handler\n",
" );\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function (fig, msg) {\n",
" var width = fig.canvas.width / fig.ratio;\n",
" fig.cell_info[0].output_area.element.off(\n",
" 'cleared',\n",
" fig._remove_fig_handler\n",
" );\n",
" fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable();\n",
" fig.parent_element.innerHTML =\n",
" '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
" fig.close_ws(fig, msg);\n",
"};\n",
"\n",
"mpl.figure.prototype.close_ws = function (fig, msg) {\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"};\n",
"\n",
"mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var width = this.canvas.width / this.ratio;\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] =\n",
" '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
"};\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function () {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message('ack', {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () {\n",
" fig.push_to_output();\n",
" }, 1000);\n",
"};\n",
"\n",
"mpl.figure.prototype._init_toolbar = function () {\n",
" var fig = this;\n",
"\n",
" var toolbar = document.createElement('div');\n",
" toolbar.classList = 'btn-toolbar';\n",
" this.root.appendChild(toolbar);\n",
"\n",
" function on_click_closure(name) {\n",
" return function (_event) {\n",
" return fig.toolbar_button_onclick(name);\n",
" };\n",
" }\n",
"\n",
" function on_mouseover_closure(tooltip) {\n",
" return function (event) {\n",
" if (!event.currentTarget.disabled) {\n",
" return fig.toolbar_button_onmouseover(tooltip);\n",
" }\n",
" };\n",
" }\n",
"\n",
" fig.buttons = {};\n",
" var buttonGroup = document.createElement('div');\n",
" buttonGroup.classList = 'btn-group';\n",
" var button;\n",
" for (var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" /* Instead of a spacer, we start a new button group. */\n",
" if (buttonGroup.hasChildNodes()) {\n",
" toolbar.appendChild(buttonGroup);\n",
" }\n",
" buttonGroup = document.createElement('div');\n",
" buttonGroup.classList = 'btn-group';\n",
" continue;\n",
" }\n",
"\n",
" button = fig.buttons[name] = document.createElement('button');\n",
" button.classList = 'btn btn-default';\n",
" button.href = '#';\n",
" button.title = name;\n",
" button.innerHTML = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n",
" button.addEventListener('click', on_click_closure(method_name));\n",
" button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
" buttonGroup.appendChild(button);\n",
" }\n",
"\n",
" if (buttonGroup.hasChildNodes()) {\n",
" toolbar.appendChild(buttonGroup);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = document.createElement('span');\n",
" status_bar.classList = 'mpl-message pull-right';\n",
" toolbar.appendChild(status_bar);\n",
" this.message = status_bar;\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = document.createElement('div');\n",
" buttongrp.classList = 'btn-group inline pull-right';\n",
" button = document.createElement('button');\n",
" button.classList = 'btn btn-mini btn-primary';\n",
" button.href = '#';\n",
" button.title = 'Stop Interaction';\n",
" button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n",
" button.addEventListener('click', function (_evt) {\n",
" fig.handle_close(fig, {});\n",
" });\n",
" button.addEventListener(\n",
" 'mouseover',\n",
" on_mouseover_closure('Stop Interaction')\n",
" );\n",
" buttongrp.appendChild(button);\n",
" var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
" titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
"};\n",
"\n",
"mpl.figure.prototype._remove_fig_handler = function (event) {\n",
" var fig = event.data.fig;\n",
" if (event.target !== this) {\n",
" // Ignore bubbled events from children.\n",
" return;\n",
" }\n",
" fig.close_ws(fig, {});\n",
"};\n",
"\n",
"mpl.figure.prototype._root_extra_style = function (el) {\n",
" el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
"};\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function (el) {\n",
" // this is important to make the div 'focusable\n",
" el.setAttribute('tabindex', 0);\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" } else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager) {\n",
" manager = IPython.keyboard_manager;\n",
" }\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which === 13) {\n",
" this.canvas_div.blur();\n",
" // select the cell after this one\n",
" var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
" IPython.notebook.select(index + 1);\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
" fig.ondownload(fig, null);\n",
"};\n",
"\n",
"mpl.find_output_cell = function (html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i = 0; i < ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code') {\n",
" for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] === html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"};\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel !== null) {\n",
" IPython.notebook.kernel.comm_manager.register_target(\n",
" 'matplotlib',\n",
" mpl.mpl_figure_comm\n",
" );\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4nOzdeVRUdf8H8AsICCIKgriCZmrGVbBMQ80lFVApl1LTHrMNNbV8tNT8pWJmbrlWalbqqLiXaAZiqWRppmKA4IALCKKCO8Q+MLx/f3i8T1e2wQvOXOb9Oud7zjMzd2Y+4KfzeT9zud8RQERERERmRTB2AURERET0eDEAEhEREZkZBkAiIiIiM8MASERERGRmGACJiIiIzAwDIBEREZGZYQAkIiIiMjMMgERERERmhgGQiIiIyMwwABIRERGZGQZAIiIiIjPDAEhERERkZhgAiYiIiMwMAyARERGRmWEAJCIiIjIzDIBEREREZoYBkIiIiMjMMAASERERmRkGQCIiIiIzwwBIREREZGYYAImIiIjMDAMgERERkZlhACQiIiIyMwyARERERGaGAZCIiIjIzDAAEhEREZkZBkAiIiIiM8MASERERGRmGACJiIiIzAwDIBEREZGZYQAkIiIiMjMMgERERERmhgGQiIiIyMwwABIRERGZGQZAIiIiIjPDAEhERERkZhgAiYiIiMwMAyARERGRmWEAJCIiIjIzDIBEREREZoYBkIiIiMjMMAASERERmRkGQCIiIiIzwwBIREREZGYYAImIiIjMDAMgERERkZlhACQiIiIyMwyARERERGaGAZCIiIjIzDAAEhEREZkZBkAiIiIiM8MASERERGRmHnsAXLBgATp16gQHBwe4urpi0KBBSEhIkB2Tl5eHCRMmwNnZGXXq1MHQoUORnp4uOyYlJQUDBgyAnZ0dXF1d8dFHH6GwsFB2TEREBDp27AgbGxu0atUKGzduLFHP119/DQ8PD9ja2qJz5844efJklf/MRERERKbksQdAPz8/bNy4EXFxcYiOjsaAAQPg7u6O7Oxs6Zjx48ejefPmOHz4MCIjI/H888+ja9eu0uNFRUUQRRF9+/ZFVFQUwsLC4OLigpkzZ0rHJCUlwd7eHlOnToVWq8VXX30FKysrhIeHS8fs2LEDNjY22LBhA86dO4fAwEDUr18fN27ceDy/DCIiIiIjMPop4Js3b0IQBBw9ehQAkJGRAWtra+zevVs6Jj4+HoIg4MSJEwCAsLAwWFpayj4VXLt2LRwdHVFQUAAAmD59Ojw9PWXvNWLECPj5+Um3O3fujIkTJ0q39Xo9mjRpgoULF1b9D0pERERkIoweAC9evAhBEBAbGwsAOHz4MARBwL1792THubu7Y/ny5QCA2bNnw8vLS/Z4UlISBEHA33//DQB44YUXMHnyZNkxGzZsgKOjIwCgoKAAVlZWCAkJkR3zxhtv4OWXX666H5CIiIjIxBg1AOr1egwcOBDdunWT7tu6dStsbGxKHPvcc89h+vTpAIDAwED4+vrKHs/JyYEgCAgLCwMAtG7dGgsWLJAdExoaCkEQkJubi2vXrkEQBPz555+yY6ZNm4bOnTuXWm9+fj4yMzOlde/ePSQmJiIjI0N2PxcXFxcXF5fproyMDKSmpkKv11c+vNQQRg2A48ePh4eHB1JTU6X7TDkABgUFQRAELi4uLi4urhqw/p0/zI3RAuDEiRPRrFkzJCUlye435VPAD38CeOXKFamBjP3/Zri4uLi4uLgMW6mpqRAEARkZGZVMLzXHYw+AxcXFmDhxIpo0aYILFy6UePzBRSA//PCDdF9CQgIEoeRFIP++WnfdunVwdHREfn4+gPsXgYiiKHvtkSNHlrgIZNKkSdJtvV6Ppk2bGnwRSGZmJgRBQGZmpkHHExERkfFxfhshAL733nuoV68efvvtN6SlpUkrNzdXOmb8+PFwd3fHkSNHEBkZCR8fH/j4+EiPP9gGxtfXF9HR0QgPD4erq2up28BMmzYN8fHxWL16danbwNja2kKj0UCr1WLs2LGoX79+iT0Hy8IGIiIiUh/ObyMEwLLOw/97k+YHG0E7OTnB3t4eQ4YMQVpamux1kpOT0b9/f9jZ2cHFxQUffvhhqRtBe3t7w8bGBk888USpG0F/9dVXcHd3h42NDTp37oy//vrL4J+FDURERKQ+nN8msA2MmrGBiIiI1IfzmwFQETYQUc1QVFSEvLw8Li6uGrJ0Oh2Ki4vL/G+e85sBUBE2EJH6ZWVlIT4+HlqtlouLqwat5ORk6dvBHsb5zQCoCBuISN2KiooQHx+PlJQU5ObmGv1TCy4uLuUrNzcXGRkZuHjxIhISEkrd7JnzmwFQETYQkbrl5eVBq9XKdiEgopohJycHWq0WeXl5JR7j/GYAVIQNRKRuDwJgaQOCiNStvP++Ob8ZABVhAxGpGwMgUc3FAFg+BkAF2EBE6qbWANizZ88SX3VZ1caMGYNBgwZV63s8bpcvX4YgCIiKiqq29wgKCirxVaU1xaP+/jw8PLBixYpqqqpsDIDlYwBUgA1EpG4MgGVjAHw0hgTAx/m7rcqf+XEFwI0bN6JevXqVLa8EBsDyMQAqwAYiUjcGwLJVR0gpa0uOx0VtAVCn0ymuhwGQAbAsDIAKsIGI1E3NAXDixImYOHEiHB0d0aBBA8yaNUu28e3mzZvx7LPPwsHBAW5ubhg5ciRu3Lghe524uDgMHDgQdevWhYODA7p3745Lly4BKBlSTp06BRcXFyxatEi677PPPoOrqyscHBzwzjvvYMaMGbLw8+A15s+fj8aNG6NFixYAgLNnz6J3796oXbs2nJ2dERgYiKysLNnP93DAHTRoEMaMGSPd9vDwwOeff4633noLDg4OaN68OdatWyd7zsmTJ+Ht7Q1bW1s8++yz2LNnT4UBJjk5GQEBAahfvz7s7e3x9NNPIzQ0FEDpwSQkJASC8L9R+iAAfvPNN2jWrBns7OwwbNgwZGRkSI8//FWoERERUrjasWMHevToAVtbW2zcuBG3b9/Ga6+9hiZNmsDOzg6iKGLbtm2yGvR6PRYvXoxWrVrBxsYGzZs3x/z58wGU/PrVnj17Ss/77rvv8NRTT8HW1hZt27bF6tWrFf/+bty4gYCAANSuXRstWrRAcHBwiQC4bNkyiKIIe3t7NGvWDO+995707x8REVGi5qCgIACG9fS/MQCWjwFQATYQkbo9PCCKi4uRo8sxyirvWwse1rNnTzg4OGDy5MlISEhAcHAw7O3t8e2330rHrF+/HmFhYUhMTMSJEyfg4+OD/v37S49fvXoVzs7OGDp0KE6fPo3z589jw4YNSEhIACAPgIcPH0a9evVkASs4OBi1a9fGhg0bcP78eXz66adwdHQsEQAdHBwwevRoxMXFIS4uDtnZ2WjcuDGGDh2K2NhYHD58GC1btpSFO0MDoLOzM1avXo2LFy9i4cKFsLS0lOrPysqCq6srRo0ahbi4OOzfvx9PPPFEhQFm4MCB6NevH86ePYvExETs378fR48eBWB4AKxTpw5efPFFREVF4ejRo3jyyScxatQoqa7hw4fD398faWlpSEtLQ0FBgRQAW7RogR9//BFJSUm4fv06rl69ii+++AJRUVFITEzEl19+CSsrK5w8eVJ6z+nTp8PJyQkajQaXLl3CH3/8ge+++w7A/eAuCAIOHTqEtLQ03LlzR/r3a9y4sfReP/74I5ydnaHRaBT9/vr37w8vLy+cOHECkZGR6Nq1K+zs7GQBcMWKFThy5AguX76Mw4cPo23btnjvvfcA3P+UeOXKlXB0dJR+Pw/CYUU9/TAGwPIxACrABiJSt4cHRI4uB6JGNMrK0eUYXHfPnj3Rrl07WWicMWMG2rVrV+ZzTp8+DUEQpGE6c+ZMtGzZsszTjA8C4J49e+Dg4IAdO3bIHu/SpQsmTpwou69bt24lAqCbm5vs1O+3334LJycnZGdnS/eFhobC0tIS6enp0s9nSAD8z3/+I90uLi5Gw4YNsXbtWgDAunXr0KBBA9nwX7t2bYUBpn379pg7d26pjxkaAK2srHD16lXpvgMHDsDS0hJpaWnS7+XhU8APAuDKlSvLrO2BgQMH4sMPPwQA/PPPP7C1tZUC38PKOm3bqlWrEp8kfvbZZ/Dx8QHwaL+/8+fPQxAEnDp1SrovPj4egiCUewp49+7daNCggXTb0FPAD/f0wxgAy8cAqAAbiEjd1BwA33rrLdl9e/fuRa1atVBUVAQAiIyMREBAAJo3bw4HBwfY29tDEAScO3cOwP1Pat54440y32PMmDFo1KgRrKysEBISUuLx+vXrY9OmTbL7pkyZUiIA9u3bt8QxvXr1kt2XkZEBQRCkT9oMDYBLliyRHdOhQwd8+umnAID//ve/6N27t+zx6OhoWYB5+umnUadOHdSpUwf+/v4A7p8WrVWrFrp27Yo5c+YgJiZGer6hAbBly5al/ny//fab9HspKwAeO3ZMdn9RURHmzZsHURTh5OSEOnXqoFatWhg2bBiA+6dpBUFAUlISSlNaAMzOzoYgCLCzs5N+/jp16sDW1hYNGzY0+Pf3sAc9+PA3b9SvX18WAH/99Ve8+OKLaNKkCRwcHFC7dm0IgoCcnPv/DZQVACvq6YcxAJaPAVABNhCRuqn5FHB5ATA7OxsNGjTAqFGj8PvvvyM+Ph4HDx6UDe+hQ4dWGAC7desGT09PvPTSSyU+KTQ0AD4cdAwJgL1798YHH3wgO2bAgAElAuDDnyp5eXlJfy9mSIBJTk7GxYsXcfHiRdkndleuXMHatWsxZMgQWFtb48svvwQAbNq0CY6OjrLX3LVrV5UGwIfD1cKFC9GgQQNs2bIF0dHRuHjxIgYOHCg9/+zZs5UOgOnp6RAEAcHBwdLP/2A9eJ3qCoCXL1+Gra0t/vvf/+LEiRM4f/481q9fD0EQcO/ePQClB0BDevphDIDlYwBUgA1EpG5qvgjk6aeflt338ccfS6eAIyMjIQgCrly5Ij2+ZcsW2bCcO3euQaeAb9y4gXbt2mHw4MGyY7t06YJJkybJntO9e/cKA6Ahp4CHDx8ufcIF3P8UzN3dvVIBsLRTmN98802lr2L9+OOP0b59ewBAWFgYLCwsZLX/3//9X6mngK9duybdFx4eLjsFHBgYiICAANn7lBUAAwIC8Pbbb0u39Xo9WrduLf1e8/LyYGdnV+Yp4GvXrkEQBERGRsrub9KkCebNm1fmz/0ov7+EhIQSp4Af3Pfg3+qHH36AtbW1LCR+9tlnsgC4detWODg4yF7bkJ5+GANg+RgAFWADEambmgOgg4MDpkyZgoSEBGzbtg116tTBN998AwC4efMmbGxsMG3aNCQmJmLfvn1o06aNbFjevn0bDRo0kC4CuXDhAjZv3lzqRSBpaWl46qmn8Morr6CwsBDA/YsI7OzsoNFocOHCBXz22WdwdHSEt7e3VGdpATAnJweNGzfGK6+8gtjYWBw5cgRPPPGELNx98803sLe3x88//4z4+HgEBgbC0dGxUgEwKysLLi4u+M9//oNz584hNDQUTz75ZIUBcPLkyQgPD0dSUhLOnDmDLl26YPjw4QCAO3fuoE6dOvjggw9w6dIlbN26FU2aNCn1IpC+ffsiOjoav//+O9q0aYPXXntNOubzzz+Hu7s7EhIScOvWLeh0ujID4JQpU9C8eXMcP34cWq0W7777LhwdHWW/17lz58LJyQmbNm3CpUuXcOLECXz//fcAgMLCQtjZ2WH+/PlIT0+Xrkb+7rvvYGdnh1WrVuH8+fM4e/YsNmzYgGXLlin6/fn7+6Njx47466+/EBkZie7du8suAnnwKeLKlSuRmJiIzZs3o2nTprIAePz4cenClVu3biEnJ8egnn4YA2D5GAAVYAMRqZuaA+CECRMwfvx4ODo6wsnJCf/3f/8nO428bds2tGjRAra2tvDx8cFPP/1UYljGxMTA19cX9vb2qFu3Ll544QUkJiYCKBnerl+/jjZt2mD48OHS3xnOmzcPLi4ucHBwwNtvv40PPvgAzz//vPScsva7q2gbGJ1Oh/feew/Ozs5o2LAhFi5cWOrfAJYXAAHgxIkT8PLygo2NDby9vfHjjz9WGGAmTZqEVq1awdbWFq6urhg9ejRu374tPR4SEoInn3wSdnZ2CAgIwLffflvqNjBr1qxBkyZNULt2bbz66qu4e/eudMzNmzfRr18/ODg4lNgG5uHa7ty5g0GDBsHBwQENGzbErFmz8MYbb8h+r3q9HvPnz4eHhwesra3h7u6OBQsWSI9/9913aN68OSwtLWXbwGzduhXe3t6wsbGBk5MTevTogT179ij6/aWlpWHgwIGwtbWFu7s7Nm/eXOLfavny5WjcuDHs7Ozg5+eHzZs3ywIgAIwfPx4NGjSQbQNjSE//GwNg+RgAFWADEambWgOgqerbt6/sylwiY2IALB8DoAJsICJ1YwB8dDk5OVi2bBni4uIQHx+POXPmQBAE/Prrr8YujQgAA2BFGAAVYAMRqRsD4KPLzc1Fnz594OzsDHt7e3Ts2BE//vijscsikjAAlo8BUAE2EJG6MQAS1VwMgOVjAFSADUSkbgyARDUXA2D5GAAVYAMRqRsDIFHNxQBYPgZABdhAROr2YEDk5uYauxQiqmK5ubkMgOVgAFSADUSkbjqdDlqtVtocl4hqjtu3b0Or1Ur7Vv4b5zcDoCJsICJ1Ky4ulr4PNicnB3l5eVxcXCpfubm5Uvi7fv16qf/tc34zACrCBiJSv4KCAiQkJECr1XJxcdWgdf36ddm34/wb5zcDoCJsIKKaQa/XG/1TCy4urqpbpZ32/TfObwZARdhARERE6sP5zQCoCBuIiIhIfTi/GQAVYQMRERGpD+e3EQLg0aNHERAQgMaNG0MQBISEhMgLEoRS15IlS6RjPDw8Sjy+cOFC2evExMSge/fusLW1RbNmzbB48eIStezatQtt27aFra0tRFFEaGhopX4WNhAREZH6cH4bIQCGhYXhk08+wZ49e0oNgGlpabK1YcMGWFhYIDExUTrGw8MD8+bNkx2XnZ0tPZ6ZmQk3Nze8/vrriIuLw/bt22FnZ4d169ZJxxw/fhxWVlZYsmQJtFotZs2aBWtra8TGxhr8s7CBiIiI1Ifz28ingEsLgA8bNGgQXnzxRdl9Hh4eWLFiRZnPWbNmDZycnFBQUCDdN2PGDLRt21a6PXz4cAwcOFD2vC5dumDcuHEG188GIiIiUh/ObxMPgOnp6ahVqxa2bt0qu9/DwwNubm5wdnaGt7c3lixZgsLCQunx0aNHY9CgQbLnHDlyBIIg4O7duwCA5s2blwiRc+bMQYcOHQyunw1ERESkPpzfJh4AFy9eDCcnJ+Tlyb/Hb9myZYiIiEBMTAzWrl2L+vXrY8qUKdLj/fr1w9ixY2XPOXfuHARBgFarBQBYW1tj27ZtsmNWr16Nhg0blllPfn4+MjMzpZWammr2DURERKQ2DIAmHgDbtm2LSZMmVfg669evR61atZCfnw+g+gJgUFBQqReomHMDERERqQ0DoAkHwN9//x2CICA6OrrC14mLi4MgCEhISABQfaeA+QkgERGR+jEAmnAAHDNmDJ599lmDXic4OBiWlpZSuHtwEYhOp5OOmTlzZomLQAICAmSv4+Pjw4tAiIiIajjObyMEwKysLERFRSEqKgqCIGD58uWIiopCSkqKdExmZibs7e2xdu3aEs//888/sWLFCkRHRyMxMRHBwcFwdXXFG2+8IR2TkZEBNzc3jB49GnFxcdixYwfs7e1LbANTq1YtLF26FPHx8QgKCuI2MERERGaA89sIATAiIqLUv6MbM2aMdMy6detgZ2eHjIyMEs8/c+YMunTpgnr16qF27dpo164dFixYIP393wP/3gi6adOmWLRoUYnX2rVrF9q0aQMbGxt4enpyI2giIiIzwPnNr4JThA1ERESkPpzfDICKsIGIiIjUh/ObAVARNhAREZH6cH4zACrCBiIiIlIfzm8GQEXYQEREROrD+c0AqAgbiIiISH04vxkAFWEDERERqQ/nNwOgImwgIiIi9eH8ZgBUhA1ERESkPpzfDICKsIGIiIjUh/ObAVARNhAREZH6cH4zACrCBiIiIlIfzm8GQEXYQEREROrD+c0AqAgbiIiISH04vxkAFWEDERERqQ/nNwOgImwgIiIi9eH8ZgBUhA1ERESkPpzfDICKsIGIiIjUh/ObAVARNhAREZH6cH4zACrCBiIiIlIfzm8GQEXYQEREROrD+c0AqAgbiIiISH04vxkAFWEDERERqQ/nNwOgImwgIiIi9eH8ZgBUhA1ERESkPpzfDICKsIGIiIjUh/ObAVARNhAREZH6cH4zACrCBiIiIlIfzm8GQEXYQEREROrD+c0AqAgbiIiISH04vxkAFWEDERERqQ/nNwOgImwgIiIi9eH8NkIAPHr0KAICAtC4cWMIgoCQkBDZ42PGjIEgCLLl5+cnO+bOnTsYNWoU6tati3r16uHtt99GVlaW7JiYmBh0794dtra2aNasGRYvXlyill27dqFt27awtbWFKIoIDQ2t1M/CBiIiIlIfzm8jBMCwsDB88skn2LNnT5kB0N/fH2lpadK6e/eu7Bh/f394eXnhr7/+wh9//IEnn3wSI0eOlB7PzMyEm5sbXn/9dcTFxWH79u2ws7PDunXrpGOOHz8OKysrLFmyBFqtFrNmzYK1tTViY2MN/lnYQEREROrD+W3kU8BlBcBBgwaV+RytVgtBEHD69GnpvgMHDsDCwgLXrl0DAKxZswZOTk4oKCiQjpkxYwbatm0r3R4+fDgGDhwoe+0uXbpg3LhxBtfPBiIiIlIfzm8TDYD16tWDq6sr2rRpg/Hjx+P27dvS4+vXr0f9+vVlzyksLISVlRX27NkDABg9enSJEHnkyBEIgiB9mti8eXOsWLFCdsycOXPQoUMHg+tnAxEREakP57cJBsDt27dj3759OHv2LEJCQtCuXTs899xzKCoqAgB8/vnnaNOmTYnXcnV1xZo1awAA/fr1w9ixY2WPnzt3DoIgQKvVAgCsra2xbds22TGrV69Gw4YNy6w3Pz8fmZmZ0kpNTTX7BiIiIlIbBkATDIAPS0xMhCAIOHToEADjBsCgoKASF6iYewMRERGpDQOgCgIgALi4uOCbb74BYNxTwPwEkIiISP0YAFUQAFNTU2FhYYF9+/YB+N9FIJGRkdIxBw8eLPUiEJ1OJx0zc+bMEheBBAQEyN7Lx8eHF4EQERHVcJzfRgiAWVlZiIqKQlRUFARBwPLlyxEVFYWUlBRkZWXho48+wokTJ3D58mUcOnQIzzzzDFq3bo38/HzpNfz9/dGxY0ecPHkSx44dQ+vWrWXbwGRkZMDNzQ2jR49GXFwcduzYAXt7+xLbwNSqVQtLly5FfHw8goKCuA0MERGRGeD8NkIAjIiIKPXv6MaMGYPc3Fz4+vrC1dUV1tbW8PDwQGBgINLT02WvcefOHYwcORIODg5wdHTEW2+9Ve5G0E2bNsWiRYtK1LJr1y60adMGNjY28PT05EbQREREZoDzm18FpwgbiIiISH04vxkAFWEDERERqQ/nNwOgImwgIiIi9eH8ZgBUhA1ERESkPpzfDICKsIGIiIjUh/ObAVARNhAREZH6cH4zACrCBiIiIlIfzm8GQEXYQEREROrD+c0AqAgbiIiISH04vxkAFWEDERERqQ/nNwOgImwgIiIi9eH8ZgBUhA1ERESkPpzfDICKsIGIiIjUh/ObAVARNhAREZH6cH4zACrCBiIiIlIfzm8GQEXYQEREROrD+c0AqAgbiIiISH04vxkAFWEDERERqQ/nNwOgImwgIiIi9eH8ZgBUhA1ERESkPpzfDICKsIGIiIjUh/ObAVARNhAREZH6cH4zACrCBiIiIlIfzm8GQEXYQEREROrD+c0AqAgbiIiISH04vxkAFWEDERERqQ/nNwOgImwgIiIi9eH8NiAA6vV6HDlyBJ9++inefvttvPbaa3j//fexYcMGXLly5XHUaLLYQEREROrD+V1OAMzNzcVnn32GJk2aoHbt2nj++ecxdOhQvP766+jfvz+aN28OKysr9O/fHydOnHicNZsMNhAREZH6cH6XEwCbNWuGYcOGITQ0FDqdrtRjkpOTsWDBAnh4eODbb7+ttiJNFRuIiIhIfTi/ywmAWq3W4BfR6XS4dOlSlRSkJmwgIiIi9eH85kUgirCBiIiI1Ifz2wgB8OjRowgICEDjxo0hCAJCQkKkx3Q6HaZPnw5RFGFvb4/GjRtj9OjRuHbtmuw1PDw8IAiCbC1cuFB2TExMDLp37w5bW1s0a9YMixcvLlHLrl270LZtW9ja2kIURYSGhlbqZ2EDERERqQ/nt8IA+NRTT8HS0rJSzwkLC8Mnn3yCPXv2lAiAGRkZ6Nu3L3bu3ImEhAScOHECnTt3xrPPPit7DQ8PD8ybNw9paWnSys7Olh7PzMyEm5sbXn/9dcTFxWH79u2ws7PDunXrpGOOHz8OKysrLFmyBFqtFrNmzYK1tTViY2MN/lnYQEREROrD+a0wAIaEhECj0Tz6mz8UAEtz6tQpCIKAlJQU6T4PDw+sWLGizOesWbMGTk5OKCgokO6bMWMG2rZtK90ePnw4Bg4cKHtely5dMG7cOIPrZwMRERGpD+e3kf8G0JAA+Ouvv8LCwkL2j+Th4QE3Nzc4OzvD29sbS5YsQWFhofT46NGjMWjQINnrHDlyBIIg4O7duwCA5s2blwiRc+bMQYcOHQyunw1ERESkPpzfJh4A8/Ly8Mwzz2DUqFGy+5ctW4aIiAjExMRg7dq1qF+/PqZMmSI93q9fP4wdO1b2nHPnzkEQBOnqZmtra2zbtk12zOrVq9GwYcMy68nPz0dmZqa0UlNTzb6BiIiI1IYB0MAA2KJFC7Rs2bLM9chvXk4A1Ol0eOmll9CxY8cK/4HWr1+PWrVqIT8/H0D1BcCgoKASF5+YewMRERGpDQOggQFw5cqVsvXFF19g1KhRcHZ2LnH1baXevIwAqNPpMHjwYHTo0AG3b9+u8HXi4uIgCAISEhIAVN8pYH4CSEREpH4MgApPAX/99dd48w1RTswAACAASURBVM03H/3NSwmAD8Kfp6cnbt68adDrBAcHw9LSUgp3Dy4C+fc3mMycObPERSABAQGy1/Hx8eFFIERERDUc57fCAJiYmIi6detW6jlZWVmIiopCVFQUBEHA8uXLERUVhZSUFOh0Orz88sto1qwZoqOjZdu8PLii988//8SKFSsQHR2NxMREBAcHw9XVFW+88Yb0HhkZGXBzc8Po0aMRFxeHHTt2wN7evsQ2MLVq1cLSpUsRHx+PoKAgbgNDRERkBji/FQbAxYsXw8PDo1LPiYiIKPXv6MaMGYPLly+X+pggCIiIiAAAnDlzBl26dEG9evVQu3ZttGvXDgsWLJD+/u+Bf28E3bRpUyxatKhELbt27UKbNm1gY2MDT09PbgRNRERkBji/DQyA3t7e6Nixo7S8vb3RqFEjWFlZyT5VMzdsICIiIvXh/DYwAM6dO1e25s2bh7Vr1yI+Pr666zNpbCAiIiL14fw28j6AascGIiIiUh/ObwZARdhARERE6sP5rTAA9unTR9FG0GrHBiIiIlIfzu8q2Adw7ty5VVWL6rCBiIiI1Ifzm6eAFWEDERERqQ/nNwOgImwgIiIi9eH8rkQAPH36NKZNm4YRI0ZgyJAhsmWu2EBERETqw/ltYADcvn07rK2tERAQABsbGwQEBKBNmzaoV6+eou8CVjs2EBERkfpwfhsYANu3b4+vv/4aAODg4IDExEQUFxcjMDAQc+bMqdYCTRkbiIiISH04vw0MgPb29rh8+TIAwNnZGWfPngUAaLVaNGrUqNqKM3VsICIiIvXh/DYwADZt2lQKfe3bt8e2bdsAAH/++SccHR2rrzoTxwYiIiJSH85vAwPgyJEjsWzZMgDAvHnz4OrqinfffRceHh68CMTMG4iIiEhtOL8NDIB37tzBtWvXAAB6vR4LFy7ESy+9hKlTp+Lu3bvVWqApYwMRERGpD+c39wFUhA1ERESkPpzf5QTA7OzsSr1QZY+vCdhARERE6sP5XU4AbNSoERYuXIjr16+X+eTi4mL88ssv8Pf3x4IFC6qlQFPGBiIiIlIfzu9yAmBCQgKGDh0KW1tbdO7cGRMmTMD8+fOxdOlSfPLJJxgyZAgaNWqEZs2aYfXq1SgqKnqcdZsENhAREZH6cH4b8DeAKSkpWLp0KQYNGgRvb2+0bdsW3bp1w6RJk7B//36zDH4PsIGIiIjUh/ObF4EowgYiIiJSH85vBkBF2EBERETqw/nNAKgIG4iIiEh9OL8ZABVhAxEREakP5zcDoCJsICIiIvXh/GYAVIQNREREpD6c3wYGQA8PD3z66adISUmp7npUhQ1ERESkPpzfBgbAFStWwMvLC1ZWVujbty+2b9+O/Pz86q7N5LGBiIiI1Ifzu5KngM+cOYP3338fLi4ucHJywsSJE3HmzJnqqs3ksYGIiIjUh/P7Ef8GUKfTYeXKlbC1tYWlpSW8vLywfv16FBcXV3V9Jo0NREREpD6c35UMgDqdDjt37oS/vz+srKzQrVs3bNiwAfPmzYObmxtGjhxZXXWaJDYQERGR+nB+GxgAz5w5g0mTJqFBgwZwdXXFhx9+iPj4eNkxsbGxqF27drUUaarYQEREROrzS/wvZj+/DQqAlpaW8PPzw65du6DT6Uo9Jjs7G2+++WaFr3X06FEEBASgcePGEAQBISEhsseLi4sxe/ZsNGrUCLVr10afPn1w4cIF2TF37tzBqFGjULduXdSrVw9vv/02srKyZMfExMSge/fusLW1RbNmzbB48eIStezatQtt27aFra0tRFFEaGhohfX/GwMgERGReuiKdFgRuQJPr33a7Oe3QQEwOTm5yt4wLCwMn3zyCfbs2VNqAFy0aBHq1auHvXv3IiYmBi+//DJatmyJvLw86Rh/f394eXnhr7/+wh9//IEnn3xSdvo5MzMTbm5ueP311xEXF4ft27fDzs4O69atk445fvw4rKyssGTJEmi1WsyaNQvW1taIjY01+GdhACQiIlKHxIxEDPtpGESNiHZr25n9/DYoALZs2RK3b98ucf+9e/fQsmXLR3/zhwJgcXExGjVqhC+++EK6LyMjA7a2tti+fTsAQKvVQhAEnD59WjrmwIEDsLCwwLVr1wAAa9asgZOTEwoKCqRjZsyYgbZt20q3hw8fjoEDB8rq6dKlC8aNG2dw/QyARERExnXlnyuY8fsMrI5ajagbUSjSF8keLy4uxo74Hei0pRNEjYhu27thb+xes5/fBgVACwsL3Lhxo8T96enpsLGxefQ3fygAJiYmQhAEREVFyY7r0aMHPvjgAwDA+vXrUb9+fdnjhYWFsLKywp49ewAAo0ePxqBBg2THHDlyBIIg4O7duwCA5s2bY8WKFbJj5syZgw4dOhhcPwMgERGR8WTkZyBgTwBEjSitrtu64sPfPsSeC3uQcCcBEw5NkB4LPBiIGzk3OL9RQQDct28f9u3bBwsLC2zevFm6vW/fPuzZswcTJ05EmzZtHv3NHwqAx48fhyAIuH79uuy4YcOGYfjw4QCAzz//vNT3dHV1xZo1awAA/fr1w9ixY2WPnzt3DoIgQKvVAgCsra2xbds22TGrV69Gw4YNy6w3Pz8fmZmZ0kpNTTX7BiIiIjIGXZEOb4e/DVEjou/uvpgaMRU+23xkYfDBembzM9hybgv0xXoA/AAHqCAAWlhYwMLCApaWltL/frBsbGzQpk0b7N+//9HfXGUBMCgoCIIglFjm3EBERESPW3FxMeYcnwNRI6JzcGck3EkAABTqCxF1IwpfR32NkT+PRHtNewz7aRjO3z0vez4DoIGngFu0aIFbt25V/Zur7BQwPwEkIiIyvvWx6yFqRHTY1AFHU4+WeZyuqPSdSxgAH/GbQKrszcu4CGTp0qXSfZmZmaVeBBIZGSkdc/DgwVIvAvn3ljUzZ84scRFIQECArB4fHx9eBEJERGTCDiUfQntNe4gaEcHa4Ed6Dc7vcgLgqlWrpK1XVq1aVe6qjKysLERFRSEqKgqCIGD58uWIiopCSkoKgPvbwNSvXx/79u3D2bNnMWjQoFK3genYsSNOnjyJY8eOoXXr1rJtYDIyMuDm5obRo0cjLi4OO3bsgL29fYltYGrVqoWlS5ciPj4eQUFB3AaGiIjIhMXdjpOu5v3sxGeP/BW0nN/lBMAWLVpIW7+0aNGizFXZbWAiIiJK/Tu6MWPGAPjfRtBubm6wtbVFnz59cP68/Nz9nTt3MHLkSDg4OMDR0RFvvfVWuRtBN23aFIsWLSpRy65du9CmTRvY2NjA09OTG0ETERGZqLTsNPTe2RuiRsS4X8ehUF/4yK/F+W3kU8BqxwYiIiKqfrdzb+PlkJchakQM3jsY/xT8o+j1OL8fMQAWFRUhKipKuqDCXLGBiIiIqtfdvLsYsm8IRI2IPrv64GrWVcWvyfltYACcPHkyvv/+ewD3w1/Xrl1hYWGBOnXqICIiojrrM2lsICIiouqTkZ+BV396FaJGRO+dvZGcWTVfTcv5bWAAbNq0qfTVayEhIWjSpAnOnz+PWbNmoWvXrtVaoCljAxEREVWPfwr+wWv7X4OoEdFjRw8k3kusstfm/DYwANra2iI1NRUAEBgYiMmTJwMAkpKSULdu3eqrzsSxgYiIiKpeti4b/wn9D0SNiO7bu+PC3QtV+vqc3wYGQHd3dxw8eBBFRUVo3rw5fv75ZwBAXFxciU2ZzQkbiIiIqGrl6HIw5sAYiBoRPtt8oL2trfL34Pw2MAAGBQWhXr16eOqpp+Du7o78/HwA97+V4/nnn6/WAk0ZG4iIiKjq3My5idFhoyFqRDy/9XnE3jJ8b97K4PyuxFXAu3fvxvLly6VTwQCg0Wiwd+/eailMDdhAREREVeN02mn02tkLokZEl61dEHUjquInPSLOb+4DqAgbiIiISJni4mJo4jTw2uQl7fN3OeNytb4n53clAuChQ4cwc+ZMvPPOO3jrrbdky1yxgYiIiB5dVkEWpkRMgagRIWpEzPh9BnJ0OdX+vpzfBgbAuXPnwtLSEp07d8agQYMwePBg2TJXbCAiIqJHc+HuBQTsCYCoEeG92Rs74nc88nf7Vhbnt4EBsFGjRti8eXN116I6bCAiIqLKuZd3D4tOLoL3Zm/p2z1ibsY81ho4vw0MgM7Ozrh06VJ116I6bCAiIiLD5BXm4fuz38Nnq490ynfCoQm4k3fnsdfC+W1gAJw+fTrmzZtX3bWoDhuIiIiofEX6Iuy9uBd9dvWRgt+rP72K49eOG60mzm8DA+AHH3yA+vXro0ePHpg0aRKmTJkiW+aKDURERAQkZSTh/cPvY+TPIzFi/wgM+2kYhu4bisF7B+PFXS9Kwa/v7r746dJP0BfrjVov57eBAbBXr15lrt69e1d3jSaLDUREROYuIz8DA34cIIW80pbPVh9siN2A/KJ8Y5cLgPMb4D6AirCBiIjInBXpizDu13EQNSJ8d/viUMohHE09ij+u/oHj147jxPUTOJV2CpkFpjUnOb8rGQAvXryI8PBw5ObmAsBju1zbVLGBiIjInK08sxKiRkSnLZ0Qfyfe2OUYjPPbwAB4+/ZtvPjii7CwsIClpSUSExMBAG+99RamTp1arQWaMjYQERGZq/DL4dIp3tDEUGOXUymc3wYGwNGjR8PPzw+pqalwcHCQAmB4eDiefvrpai3QlLGBiIjIHCXcScBzwc9B1IhYenqpscupNM5vAwOgm5sboqOjAUAWABMTE1GnTp3qq87EsYGIiMjcZORnwO8HP4gaEe8efBeF+kJjl1RpnN8GBkAHBwdcuHBB+t8PAuDp06fh7OxcfdWZODYQERGZk0J9IQIPBkLUiPD7wQ/38u4Zu6RHwvltYADs378/Zs2aBeB+AExKSoJer8ewYcPwyiuvVGuBpowNRERE5kCn1+Hg5YMYHTYaokbEc8HPIeFOgrHLemSc3wYGwNjYWDRs2BD+/v6wsbHBq6++inbt2sHNzc2svyKODURERDXZ7dzb+Cb6G9lmzt6bvXHw8kFjl6YI53cltoHJyMjA/PnzMWzYMPTv3x+ffPIJrl+/Xp21mTw2EBER1TTFxcX4+8bf+Pj3j9Fxc0cp+PXY0QNf/v0l0rLTjF2iYpzfBgbAlJSUMvf8S0lJqdKC1IQNRERENUVKZgq+jvoa/j/4y77FY9TPo7A/cT8KigqMXWKV4fw2MABaWlrixo0bJe6/ffs2LC0tq7wotWADERGRmmXkZ2BH/A68Hvq6LPR1Du6MT/74BLG3Yo1dYrXg/DYwAFpYWODmzZsl7k9OToa9vX2VF6UWbCAiIlKj4uJi/HjhR/hs9ZFCX4dNHTDu13H4OfFn5BbmGrvEasX5XUEAnDJlCqZMmQJLS0uMGzdOuj1lyhR88MEH6NKlC7p27fq4ajU5bCAiIlKb1H9S8e7Bd6XgN3jvYGjiNLiZU/KDnpqK87uCANirVy/06tULFhYW6Nq1q3S7V69e8PX1xdixY6X9Ac0RG4iIiNSiSF+EYG2w9A0ez255Fpo4DYr0RcYu7bHj/DbwFPCbb75p1r+ksrCBiIhIDRLvJeI/of+RPvV788CbSMnkRZzmPL8N3gaGSmIDERGRKfun4B8sO71M2s6ly9Yu2JmwE/pivbFLMyrObwMDYHZ2NmbNmgUfHx+0atUKLVu2lK2q5OHhAUEQSqwJEyYAAHr27FnisXHjxsleIyUlBQMGDICdnR1cXV3x0UcfobBQ/l2FERER6NixI2xsbNCqVSts3Lix0rWygYiIyBQV6guxI34HXtj+gvSp33u/vlcj9vCrCpzfBgbA1157DY0bN8b06dOxYsUKrFy5Uraq0s2bN5GWliatX3/9FYIgICIiAsD9ABgYGCg75t//gEVFRRBFEX379kVUVBTCwsLg4uKCmTNnSsckJSXB3t4eU6dOhVarxVdffQUrKyuEh4dXqlY2EBERmZpjV49h8N7BUvB7KeQlHE09WuZ+vuaI89vAAFivXj0cO3asumsp1eTJk9GqVSupcXv27InJkyeXeXxYWBgsLS2Rnp4u3bd27Vo4OjqioOD+JpbTp0+Hp6en7HkjRoyAn59fpWpjAxERkam4mXMT438dLwW/btu7Yat2K3R6nbFLMzmc3wYGwBYtWkCr1VZ3LSUUFBSgQYMG+Pzzz6X7evbsCRcXFzRo0ACenp74+OOPkZOTIz0+e/ZseHl5yV4nKSkJgiDg77//BgC88MILJULkhg0b4OjoWKn62EBERGQK0rPTMXDPwPvf1bvJG4tPLUZGfoaxyzJZnN8GBsAtW7bg1VdflQWtx2Hnzp2wsrLCtWvXpPvWrVuH8PBwnD17FsHBwWjatCmGDBkiPR4YGAhfX1/Z6+Tk5EAQBISFhQEAWrdujQULFsiOCQ0NhSAIyM0te/PL/Px8ZGZmSis1NdXsG4iIiB5dXmEeLt69iOPXjuPA5QPYmbAT38Z8iy9OfYFZx2ZhyakluJV7q9zXuJ51Hf1/7A9RI8J3ty8S7yU+purViwHQwADo7e2NunXrwsHBAaIoomPHjrJVXXx9fREQEFDuMYcPH4YgCLh06RKA6g2AQUFBpV6gYs4NREREhvn7xt/QxGkw7895eOfgO+i3ux/aa9rLvoKttNV9e3ccuHyg1Ne8mnUVfj/4QdSI8PvBD9eyrpV6HMkxABoYAOfOnVvuqg7JycmwtLTE3r17yz0uOzsbgiBIF3BU5ylgfgJIRESVVaQvwuJTi8sMeD5bfTB472C8eeBNTD4yGXOOz8Gy08vw3dnv8Mq+V6TjpkZMxZ28O9LrXvnnCvrt7gdRI6L/j/15hW8lMACa8D6AQUFBaNSoUYntWx527NgxCIKAmJgYAP+7COTGjRvSMevWrYOjoyPy8/MB3L8IRBRF2euMHDmSF4EQEVGVytHlYNKhSVKIe//w+1h1ZhVCLoYg6kYU7uTdKffqXF2RDl9HfQ2vTV4QNSJ67OiBX5J/QUpmCvrs6gNRIyJgTwDSs9PLfA0qifPbRAOgXq+Hu7s7ZsyYIbv/0qVLmDdvHiIjI3H58mXs27cPTzzxBHr06CEd82AbGF9fX0RHRyM8PByurq6lbgMzbdo0xMfHY/Xq1dwGhoiIqlRadpr0Cd4zm5/BgaTST+Ma4tztcxiyb4gUJB98ndtLIS+Z1Xf4VhXO73ICoJOTE27duv+Hp/Xr14eTk1OZq6odPHgQgiDg/PnzsvuvXLmCHj16wNnZGba2tnjyyScxbdq0Ev+AycnJ6N+/P+zs7ODi4oIPP/yw1I2gvb29YWNjgyeeeIIbQRMRUZWJuxWH3jt7S5/aRd+MVvyaBUUFWHVmlfRp4KCQQRVeIEKl4/wuJwBqNBrplKlGoyl3mSs2EBERPezX5F/RaUsniBoRg/cOxtWsq1X6+nG34/BN9DeyvwekyuH8NtFTwGrBBiIion8LvxwunaYd9+s4ZBVkGbskKgXnNwOgImwgIiJ6IC07DT7bfCBqRAQdD0KhvvyLGMl4OL8ZABVhAxEREQDoi/UIPBgIUSNixP4R/Po1E8f5zQCoCBuIiIgAIFgbDFEjotOWTkjKSDJ2OVQBzm8GQEXYQERElJiRiGe3PAtRI2KrdquxyyEDcH4/YgBMTk7GuXPnoNfrq7oeVWEDERGZN51eh+H7h0PUiBj7y1joi817LqoF53cFAXD9+vVYtmyZ7L7AwEBYWlrC0tIS7dq1w5UrV6q1QFPGBiIiMm9fR30NUSOi67au/DYOFeH8riAAdunSBRs2bJBuHzhwALVq1UJwcDDOnDkDHx8fvPPOO9VepKliAxERma+YmzHSpsxKvuWDHj/O7woCoLOzM86ePSvdHj9+PF555RXpdkREBFq0aFF91Zk4NhARkXnK0eVg4J6BEDUiph2dZuxyqJI4vysIgHZ2dkhOTpZud+jQAatWrZJup6SkoHbt2tVXnYljAxERmY/07HSEXAzBtKPT0GNHD4gaES/uehEZ+RnGLo0qifO7ggD41FNP4ccffwQA3Lp1C1ZWVoiMjJQeP3nyJNzc3Kq3QhPGBiIiqtlSMlOw+NRiDN47WPqGjwer2/ZuOJV2ytgl0iPg/K4gAC5cuBCNGjXCvHnz0KtXL3h6esoeX7FiBfr06VOtBZoyNhARUc2VkZ+Bnjt6SoGvvaY9Rv48El/+/SUi0yO52bOKcX5XEAD1ej1mz54Nb29v+Pv7Q6vVyh5/9dVX8f3331drgaaMDUREVHN9/PvHEDUiAvYEIPxyOO7l3TN2SVRFOL8VbgRdWFiIa9euVVUtqsMGIiKqmX678htEjYgOmzog5maMscuhKsb5rTAARkdHw9LSsqpqUR02EBFRzZNZkIkXd74IUSNi6emlxi6HqgHnNwOgImwgIqKaZ/ax2RA1IgbuGYi8wjxjl0PVgPObAVARNhARUc1y7Oox6YKPM+lnjF0OVRPObwZARdhAREQ1R1ZBFvru7gtRI2LhyYXGLoeqEed3BQEwJiam3LVz504GQDNvICKimuLTPz+FqBHh/4M/cnQ5xi6HqhHndwUB0MLCApaWlrCwsCixHtzPAGjeDUREVBP8df0vab8/bu5c83F+VxAAk5OTDVrmig1ERKR+t3JvwXe3L0SNiM9OfGbscugx4PxW+DeA5o4NRESkbtm6bAzfP1w69ZutyzZ2SfQYcH5XEAAXL16M3Nxc6faxY8eQn58v3f7nn3/w3nvvVV91Jo4NRESkXroiHQIPBkLUiHhh+wu4nHHZ2CXRY8L5XUEAtLS0xI0bN6TbdevWRWJionQ7PT2dfwNo5g1ERKRG+mI9Zvw+A6JGxHPBzyH2VqyxS6LHiPPbgItA/h0AHRwcGAD/hQ1ERKROX5z6AqJGhPcmb/xx9Q9jl0OPGec3A6AibCAiIvXRxGmkK35/uvSTscshI+D8ZgBUhA1ERKQu+xP3S+Fvfex6Y5dDRsL5bUAA/Pzzz7Fq1SqsWrUKtWvXxuzZs6Xb8+fPZwA08wYiIlKL41ePw3uTN0SNiEUnF6G4uNjYJZGRcH5XEAA9PDzQokWLCpe5YgMREalD3O04dA7uDFEjYtpv06Av1hu7JDIizm/uA6gIG4iIyPSlZKagx44eEDUi3jn4DgqKCoxdEhkZ5zcDoCJsICIi03Yr9xb8f/CHqBEx7KdhyCrIMnZJZAI4vysIgP3790dGRoZ0e+HChbh37550+/bt22jXrl2VFhQUFARBEGSrbdu20uN5eXmYMGECnJ2dUadOHQwdOhTp6emy10hJScGAAQNgZ2cHV1dXfPTRRygsLJQdExERgY4dO8LGxgatWrXCxo0bK10rG4iIyHRl67Ix7KdhEDUi/H7ww63cW8YuiUwE57cJbgQdFBQET09PpKWlSevWrf/9Rzt+/Hg0b94chw8fRmRkJJ5//nl07dpVeryoqAiiKKJv376IiopCWFgYXFxcMHPmTOmYpKQk2NvbY+rUqdBqtfjqq69gZWWF8PDwStXKBiIiMk26Ih3ePfiu9C0fyZnm+731VBLntwluAxMUFAQvL69SH8vIyIC1tTV2794t3RcfHw9BEHDixAkAQFhYGCwtLWWfCq5duxaOjo4oKLj/dx/Tp0+Hp6en7LVHjBgBPz+/StXKBiIiMj36Yj2mHZ3Gb/mgMnF+m2gAtLe3R+PGjdGyZUuMGjUKKSkpAIDDhw9DEATZaWgAcHd3x/LlywEAs2fPLhEgk5KSIAgC/v77bwDACy+8gMmTJ8uO2bBhAxwdHStVKxuIiMj0fHf2O37LB5WL89uAU8A3b96Ubjs4OCApKUm6XR0BMCwsDLt27UJMTAzCw8Ph4+MDd3d3/PPPP9i6dStsbGxKPOe5557D9OnTAQCBgYHw9fWVPZ6TkwNBEBAWFgYAaN26NRYsWCA7JjQ0FIIgIDc3t8za8vPzkZmZKa3U1FSzbyAiIlNy/u55eG++v9ff7vO7K34CmSUGQAM+ARwwYACGDBmCIUOGoFatWvD19ZVuDxgwoNo3gr537x4cHR3x/fffGz0AlnaBirk3EBGRqdAV6fDKvlcgakRMOjyJGz1TmRgAKwiAb775pkGrunXq1Akff/yx0U8B8xNAIiLT9eXfX0LUiOi+vTuv+KVyMQCqYB/ArKwsODk5YdWqVdJFID/88IP0eEJCQqkXgfz7bxfXrVsHR0dH5OfnA7h/EYgoirL3GTlyJC8CISJSqbM3z8JrkxdEjYiDlw8auxwycZzfJhgAP/zwQ/z222+4fPkyjh8/jr59+8LFxUX6W8Tx48fD3d0dR44cQWRkJHx8fODj4yM9/8E2ML6+voiOjkZ4eDhcXV1L3QZm2rRpiI+Px+rVq7kNDBGRSuUV5uGlkJfuf83b0WnGLodUgPPbBAPgiBEj0LhxY9jY2KBp06YYMWIELl26JD3+YCNoJycn2NvbY8iQIUhLS5O9RnJyMvr37w87Ozu4uLjgww8/LHUjaG9vb9jY2OCJJ57gRtBERCq1+NRiiBoRvXf2RkZ+RsVPILPH+W2CAVBN2EBERMZ1Ku0U2mvaQ9SIOJp61NjlkEpwfjMAKsIGIiIynmxdNvx+8IOoERF0PMjY5ZCKcH4zACrCBiIiMo7i4mLM+H2G9D2/2bpsY5dEKsL5zQCoCBuIiMg41sWsg6gR4bXJC6fTThu7HFIZzm8GQEXYQEREj9/BywchakSIGhE7E3YauxxSIc5vBkBF2EBERI9X7K1YdNrSCaJGxKKTi4xdDqkU5zcDoCJsICKixyctOw29dvaCqBEx4dAEFOmLjF0SqRTnNwOgImwgIqLHI0eXg1d/ehWiRsTgvYORVZBl7JJIxTi/GQAVYQMREVU/fbEe7x9+H6JGRI8dPXA166qxSyKV4/xmAFSEDUREVL2Ki4ux5NQSiBoRz2x+BlE3ooxdEtUAnN8MgIqwgYiIqtea6DXSFb8/J/5s7HKohuD8ZgBUTfsIdAAAIABJREFUhA1ERFR9NHEaKfxtittk7HKoBuH8ZgBUhA1ERFQ9tsdvl8Lfuph1xi6HahjObwZARdhARERVL+RiiBT+Vp5ZaexyqAbi/GYAVIQNRERUtQ4kHUCHTR0gakQsPLkQxcXFxi6JaiDObwZARdhARERV50jKEXhv8oaoERF0PIjhj6oN5zcDoCJsICKiqhF1IwrPbH4GokbEjN9n8Fs+qFpxfjMAKsIGIiJS7so/V9BjRw+IGhGTDk1Cob7Q2CVRDcf5zQCoCBuIiEiZzIJMvBTyEkSNiGE/DUOOLsfYJZEZ4PxmAFSEDURE9Oh0eh3eOfgORI2IF3e9iPTsdGOXRGaC85sBUBE2EBHRoykuLsac43MgakQ8F/wc4u/EG7skMiOc3wyAirCBiIgezfrY9RA1Ijps6oCjqUeNXQ6ZGc5vBkBF2EBERJX3S/Iv0kbPwdpgY5dDZojzmwFQETYQEVHlXLx7EZ22dIKoEfH5X58buxwyU5zfDICKsIGIiAxXqC/Ea/tfg6gRMfaXsdzuhYyG85sBUBE2EBGR4R783Z/PVh9e8UtGxfnNAKgIG4iIyDCJGYnSN33subDH2OWQmeP8ZgBUhA1ERFSxIn0RRoWOgqgRMe6XcfyOXzI6zm8GQEXYQEREFdPEaSBqRHTZ2gVp2WnGLoeI8xsMgIqwgYiIypecmYxntzwLUSNi9/ndxi6HCADnN8AAqAgbiIiobPpiPd4IewOiRsS7B9/lqV8yGZzfDICKsIGIiMoWrA2WvurtatZVY5dDJOH8NsEAuGDBAnTq1AkODg5wdXXFoEGDkJCQIDumZ8+eEARBtsaNGyc7JiUlBQMGDICdnR1cXV3x0UcfobBQvudUREQEOnbsCBsbG7Rq1QobN26sVK1sICKi0iVnJuO54OcgakRsj99u7HKIZDi/TTAA+vn5YePGjYiLi0N0dDQGDBgAd3d3ZGdnS8f07NkTgYGBSEtLk9a//xGLioogiiL69u2LqKgohIWFwcXFBTNnzpSOSUpKgr29PaZOnQqtVouvvvoKVlZWCA8PN7hWNhARUUm3cm/B/wd/iBoRb4W/BX2x3tglEclwfptgAHzYzZs3IQgCjh7935eF9+zZE5MnTy7zOWFhYbC0tER6+v82Gl27di0cHR1RUFAAAJg+fTo8PT1lzxsxYgT8/PwMro0NREQkl1mQiVf2vQJRI8LvBz/czLlp7JKISuD8VkEAvHjxIgRBQGxsrHRfz5494eLiggYNGsDT0xMff/wxcnJypMdnz54NLy8v2eskJSVBEAT8/fffAIAXXnihRIjcsGEDHB0dDa6NDURE9D+5hbnSRR89d/TElcwrxi6JqFSc3yYeAPV6PQYOHIhu3brJ7l+3bh3Cw8Nx9uxZBAcHo2nTphgyZIj0eGBgIHx9fWXPycnJgSAICAsLAwC0bt0aCxYskB0TGhoKQRCQm5tbaj35+fnIzMyUVmpqqtk3EBERAOj0Okw8NFH6qreEOwkVP4nISBgATTwAjh8/Hh4eHkhNTS33uMOHD0MQBFy6dAlA9QXAoKCgEhefmHsDERHpi/WY+ftMiBoRz255FpHpkcYuiahcDIAmHAAnTpyIZs2aISkpqcJjs7OzIQiCdAFHdZ0C5ieARERyxcXFWHRyEUSNCK9N/9/enUfXdC1+AD8acoMUNdTYpPXa1/b1xvCQ16hqiaHKQ/sMxasYfjRpqKFNUSoWFelrzapFJTeRURAJQhAZiAghcyKTVIJIFEkkMt7z/f1hOXVlkLjhTt/PWmctOefcY+97du7+Zp+zz+2NsJwwTReJ6IkYALUwAIqiCHt7e3Tr1g3p6ekNes2ZM2cgCALi4+MB/DUJJD8/X9pnx44daNOmDcrLywE8mAQil8tVjjNlyhROAiEiqkdldSWS/0zG3rS9WHV2FSYGToRcIYdcIUdgZqCmi0fUIOy/tTAA2tnZoW3btggLC1N5zMvDy7KZmZlYvXo1YmJikJ2djYCAAPTs2RODBw+WjvHwMTAjRoxAXFwcjh07hk6dOtX6GBgHBwekpqbil19+4WNgiIjqcCD9ACYdmoS+7n2lwPdw6eXWCx4pHpouIlGDsf/WwgBY2z12giBID2nOycnB4MGD0b59e8hkMrz++utwcHCocRL/+OMPjBo1Ci1btkTHjh3x9ddf1/og6D59+sDY2Bg9e/bkg6CJiGqxI36HSuAb6DUQc4LnYGPMRgRnByOvJE/TRSRqFPbfWhgAdQkbEBHpM1EUseXSFin4bb64GbnFufxOX9J57L8ZANXCBkRE+koURfx0/icp/CmSFJouElGTYf/NAKgWNiAi0kdKUYkfon6Qwp9Xqpemi0TUpNh/MwCqhQ2IiPRNtbIaKyNXQq6Qw0JhgX1p+zRdJKImx/6bAVAtbEBEpE9KK0vhEOYgzezlY11IX7H/ZgBUCxsQEemL2PxYjNo/CnKFHH3c+uBYdsMfiUWka9h/MwCqhQ2IiHRdpbISWy9tRS+3XpAr5BjmNwzn885rulhEzxT7bwZAtbABEZEuyy7MxmeHPpMmeyyJWIKiCn6ekf5j/80AqBY2ICLSRaIowveyLwZ4DIBcIYeVlxWOXjmq6WIRPTfsvxkA1cIGRES6aFvsNmnUb/ax2fwmDzI47L8ZANXCBkREuubXuF+l8LczfieUolLTRSJ67th/MwCqhQ2IiHTJroRdUvhzTXTVdHGINIb9NwOgWtiAiEhXuCa6SuFvV8IuTReHSKPYfzMAqoUNiIh0gXuyuxT+fo37VdPFIdI49t8MgGphAyIibeeZ4imFv62Xtmq6OERagf03A6Ba2ICISFspRSV+i/tNCn+bLm6CKIqaLhaRVmD/zQCoFjYgItJGJZUlWHhqoRT+1sesZ/gjegT7bwZAtbABEZG2uVp0FeMPjn/wnb7ufbAvbZ+mi0Skddh/MwCqhQ2IiLTJmWtnYOVlBblCjiG+QxCbH6vpIhFpJfbfDIBqYQMiIm0giiJ2J+5GL7dekCvkmHpkKvJL8zVdLCKtxf6bAVAtbEBEpCmF5YU4ln0MjpGOGO43XLrfb2XkSlRUV2i6eERajf03A6Ba2ICI6HlKvZ2KzRc3Y8rhKbBQWEihT66Qo/+e/vBO9eZkD6IGYP/NAKgWNiAietbKq8sRkBmAqYenqgQ+uUKO8QfH48fzP+L0tdMorSzVdFGJdAb7bwZAtbABEdGzcrXoKn46/xPe835PCnx93PtgUegiHMw4iJslNzVdRCKdxf6bAVAtbEBE1JQqqitw9MpRzAmeozLSN9xvOHYl7MKt+7c0XUQivcD+mwFQLWxARNQU0u6kwTnaGYO8B0mhz0JhAbsTdgjLCUO1slrTRSTSK+y/GQDVwgZERE/r1v1b8L3si88OfaYy2jd071BsubQFucW5mi4ikd5i/80AqBY2ICJqjJziHCiSFPg86HOVWbx93Ppg4amFCM8N52gf0XPA/psBUC1sQOrjIytIX1Upq5BdmI2TV09iy6Ut+CTgkxqzeCcfmgzXRFf8ef9PTReXyKCw/2YAVIs2NqDC8kKk3k7VdDGeSBRFKJIUsPSwxIJTC3Cl8Iqmi0SklrySPOyI3wGHMAd8EvAJ+rr3rRH4erv1xuxjs+GZ4om8kjxNF5nIYGlj//28MQCqQdsa0M2SmxjqOxRyhRx70/aqfbzc4lzcq7jXBCVTVVpZisWhi2t0jKvPruYsR9JJEbkRKo9rebgM8BiASYcmYVnEMhzMOIi7ZXc1XVQigvb135rAAKgGbWpApZWlmBg4UeWeoqgbUU99PK9UL8gVcrzn/R72pe2DUlQ2STmvFF7BOP9xUhl3xu/EvJB5Kh3mL7G/oKSypEn+P6JnqVpZjS2Xtkjtd2LgRLgkuiA8Nxy5xblN9ntDRE1Lm/pvTTH4ALht2zaYm5tDJpPB0tIS0dHRDX6ttjQgpajEwlMLIVfIMdhnsBSorLysGn1pVRRF7IzfWWMkY+qRqUj5M0Wtcp68ehL/8vwX5Ao5hvgOQWx+rLQt5maMyjcdDPYZjE0XNyE0J5T3RzWhy7cvwznaGQkFCZouylMTRRFRN6JwIP1Ak0yYuF91H5XKyka/7tb9W5h9bLbUZtdEreF38BLpCG3pvzXJoAOgj48PjI2N4eLiguTkZMyZMwft2rVDfn5+g16vLQ1o08VNkCvk6OveF5fyL6G8uhzTjkyDXCHHx/s/bvBlJ1EUsf7CeqlD23JpC9yT3WHpYQm5Qo5ebr3gdM4JxRXFjSrf/ar72Hxxs3Tc6UHTa73UK4oigrOD8fH+j2sE0I/2fYRvw7+FR4oH/ij6o1H/Pz0IKysjV0ozT//p/k8EXQnSdLEaRRRFnL1+Fv898l+pXSwOXYzK6saHt7KqMgRdCYLdCTv0duuNAR4DMCd4DnbE78DFmxefGOQu5F3AEN8h0qi1rr2XRIZOW/pvTTLoAGhpaQl7e3vpZ6VSiW7dumHdunUNen1TNKDiimJEXouEIkmBM9fOoLy6vFGvD8gMkDrDwMxAaf2t+7cwwm8E5Ao5Zh6b+cROslpZjVVnV0nHUiQppG35pflwCHOQtn3g8wG2x22HV6oX/DP8EZwdjIjcCMTcjMHZ62fhleoFp3NOmBM8B8P9hqsEOedo5yeOtlQqKxGYGYjvz3wvXS5+/H7B9THrcb/qfqPeK+BBiCitLMX1e9eRcSfjqUZ+HpVfmo8vT36Job5DsT1uu9r3eOUW56KwvFCtYzyqrKoMO+J3YIDHAOn9G3NgjPTvHfE7dGImdvSNaEwPmi6Vu9+efujj3gdyhRxfHP+iQd+DqxSViL4RjRVnVkgj0XUt/fb0w8xjM+EY6YjvTn8Hh3AHLApdhHkh8/DF8S/Q26035Ao5xvmPQ9bdrOfwDhBRU2IANOAAWFFRASMjI/j7+6usnz59OsaOHdugYzS2AYmiiMy7mdifvh8rI1dinP84lWeByRVy9N/TH7YnbOGR4oGrRVfrPd7FmxelTnDzxc01tqffSZc6upWRK+vs6CuVlVLAs1BYYF/avlr3i7oRpRIeGrMM9R2KI1lHGvQ+Pa6oogiR1yPxa9yvmHVslnTMkftGIvJaZJ2vu1lyEzvjd2LG0RkY5z8OH/p+WGNm5mCfwVgXvQ5JfyY1OgidunpK5ZsbHo4GOUc748a9G406liiK2J24GxYKC/Rx64Mvjn+BA+kHnjoMlleX43DWYQzzG/bXZfzDUxGbH4tqZTX+d/5/0vrlp5c/1ShaUyqvLkdeSR6yCrOQdCsJ5/POIzQnFIGZgZh5bKZU1n+6/xProtehoLQAkdcipWA77ci0Ot+rsqoyeKR41PhjZOS+kdhyaQuyCrOQdicNnimeWBy6GIN9BjeoTS+NWNqg4ElE2ocB0IAD4PXr1yEIAs6ePauy3sHBAZaWlrW+pry8HEVFRdKSm5v7xAakFJW4ePMifjz/ozQiV9vlzfkh8zF079Aa20btH4Vvwr7B+pj18E71RnhuONLvpCP9Tjre934fcoUci0IX1XmzeXhuOHq59YJcIYdLogsKywuRU5SDxFuJOH3tNA5nHYbtCdsHkzLc++Bo9tF637eK6gp4pHhg+enlWBS6CLYnbDE9aDomBk7EmANj8G//f2NeyDysv7AeB9IP4FL+Jdwpu/OEs9E4p66egvVea5WO+HbZbQBAZXUljv9xHHYn7KR617b0de+rMiomV8gx1n8sdiXseuLjOe5X3cfqs6ul100InIC9aXtrTMJZFrEM6XfSn1ifiuoKfHf6u1rL2cetD7448SAMZtzJQNqdNKT8mYKkW0mIL4jHpfxLCMsJg1uSG9ZErcH/Bf8fhvsNV/nDYrjfcBzJOlIj4Pqk+kjv0axjs1QCVHFFMUJzQvHj+R8x6dAkfB70ObxTvZt0dBIAMu9mwjHSEf329Ks3bPV174sfon7AzZKbKq+PzY/FQK+BkCvk+CTgExSUFkjbyqvL4ZHiIV2qlSvksPK0gmOkI2JuxtT5OyOKIq4UXoFfmh9+i/sNuxN3wy3JDV6pXtibthcH0g8g+ka0ToycElHtGAAZABsVAB0dHSEIQo3l8QZUpazC2etnsSZqDT70/bDGCN+MozOwMWYjTl09pTLBQRRFpN1Jg0uiC2YdmyWN7tW3TDo06YmXQvck73nicfrt6YeI3IinfDefv5LKEqyLXicFnUHeg7AycqUUih8uNkdt4Jfmh6gbUUi9nYq8kjyUVpZCFEVUKasQkRsBhzAHlQBiobDApEOT8EPUDziUdQg5RTlSZ5/yZwr+7f9vad+fzv8k3S8miiIir0WqTAyQK+T4KuSrOifQ/Hn/T3we9DnkigeXtr1SvZBdmI0d8Tvwn4D/PNVo68Plfe/3sTN+J8qqyup8HyNyI6R7PMccGIP1Mevx2aHP6gzPfd37YlHoIoTlhKFKWfVU504pKhGRG4G5x+fWCLsDvQZimN8wjPUfiymHp2D2sdlwjnauN5Sn3UmTfs8+2vcRsu5mwTPFU3okklwhxzC/YfC97NvoWyyISD8xABpwAHyaS8D1jQCKooj4gng4nXOqcQnJytMKyyKW4eTVk/V2xo8rqSxBaE4oFEkKOJ1zwvyQ+ZgQOEEa8RjhN6LGiEhtRFGE0zknqTyWHpYY7jccEwInYNaxWXAIc0BcQVyDy6VN4gvi8WnApyrv9xDfIdh0cVOjJosUVxRjf/p+zDg6o84wNff4XCmUD/EdgsjrdV9+TryViEWhi1RG4uadnIfEW4nSPml30qRRYStPq1qPd6XwCn6L+w0TAifgPe/3MNhnMIb4DoH1XmuM3DcSo/aPwn8C/oNFoYuw6eIm+Gf441L+Jdwuu93gEarLty+rjKg+XEYfGI1VZ1ch6EoQ3JPdawTSD3w+wPdnvofTOSf87/z/sCFmA7Zc2oLtcduxK2EXXBNdsSd5D7xTveGX5gf/DH+4JbmpBOhebr2w8NRCxNyMUWtELac4Bx/t+6hGHaz3WsP3si9n5xKRCgZAAw6AwINJIPPmzZN+ViqV6N69e6Mngfx8+ucaM1ff934fjpGOOH3t9DO5v6qksqRRxxVFEYXlhRq/1+tZqFRWYk/yHqw6uwrhueFPPTL1UF5JHo5mH4VztDOmHpla477B+SHzG3xZO+tuFpZELFEZUbM9YQvPFE9p5O3j/R8jq1CzEwnyS/PxTdg3WH56OQIzA+sccUu9nQrnaOcG3ydX1/Ivz3/hx/M/Irc4t8nqUFBagPEHx0vBzyfVh8GPiGrFAGjgAdDHxwcymQwKhQIpKSmYO3cu2rVrh5s3nzyqBvzVgN7+9W3IFQ8mAHwb/i0iciPUnl1K2qOiugLxBfHwSPFAyNWQpxqpyi7Mxnenv5Nmjz5cHr/3TldUKitx6uop/BL7CzZf3Iz1F9bDOdoZP0T9gFVnV2HFmRVYFrEMDmF/zZ61PWEL2xO22JO855l8wwzw4IHokdcjGfyIqF4MgAYeAAFg69atMDMzg7GxMSwtLXHu3LkGv/ZhA5p5cCYCMwM5I5CeKKcoBysjV6L/nv5YE7WGfygQEWkAAyADoFrYgOhpcQYpEZHmsP9mAFQLGxAREZHuYf/NAKgWNiAiIiLdw/6bAVAtbEBERES6h/03A6Ba2ICIiIh0D/tvBkC1sAERERHpHvbfDIBqYQMiIiLSPey/GQDVwgZERESke9h/MwCqhQ2IiIhI97D/ZgBUCxsQERGR7mH/zQCoFjYgIiIi3cP+mwFQLWxAREREuof9NwOgWtiAiIiIdA/7bwZAtbABERER6R723wyAamEDIiIi0j3svxkA1cIGREREpHvYfzMAqoUNiIiISPew/2YAVAsbEBERke5h/80AqBY2ICIiIt3D/psBUC1sQERERLqH/TcDoFrYgIiIiHQP+28GQLWwAREREeke9t8MgGphAyIiItI97L8ZANXCBkRERKR72H8zAKqFDYiIiEj3sP9mAFQLGxAREZHuYf/NAKgWNiAiIiLdw/6bAVAthYWFEAQBubm5KCoq4sKFCxcuXLjowJKbmwtBEFBYWKjpKKExDIBqyMrKgiAIXLhw4cKFCxcdXLKysjQdJTSGAVANd+/ehSAIyMnJ0fhfM5r4y8nQRj5Zb9bbEBbWm/U2hCUnJweCIODu3buajhIawwCohqIiw7yHgPVmvQ0B6816GwLW27Dq/SgGQDUYagNivVlvQ8B6s96GgPU2rHo/igFQDYbagFhv1tsQsN6styFgvQ2r3o9iAFRDeXk5HB0dUV5erumiPFesN+ttCFhv1tsQsN6GVe9HMQASERERGRgGQCIiIiIDwwBIREREZGAYAImIiIgMDAMgERERkYFhAHxK27Ztg7m5OWQyGSwtLREdHa3pIjW58PBwjBkzBl27doUgCPD391fZLooivv/+e3Tp0gUmJiawtrZGenq6hkrbNJycnNC/f3+YmpqiU6dOGDduHC5fvqyyT1lZGb788ku0b98erVu3xqeffoqbN29qqMRNY/v27bCwsMCLL76IF198Ee+++y6CgoKk7fpY59qsW7cOgiBgwYIF0jp9rLujo2ONr8R68803pe36WOeHrl27hmnTpqF9+/YwMTGBXC7HhQsXpO36+Llmbm5e69egffnllwD093xXV1djxYoVePXVV2FiYoKePXti9erVEEVR2kcfz3dDMQA+BR8fHxgbG8PFxQXJycmYM2cO2rVrh/z8fE0XrUkFBQVh+fLlOHDgQK0B0NnZGW3btsXBgwcRHx+PsWPH4rXXXkNZWZmGSqy+kSNHwtXVFUlJSYiLi8PHH38MMzMzlJSUSPvY2trilVdeQUhICGJiYvDuu+9i4MCBGiy1+gIDA3HkyBGkp6cjLS0N3333HVq0aIGkpCQA+lnnx50/fx6vvvoqevXqpRIA9bHujo6OeOedd5CXlyctt27dkrbrY50B4M6dOzA3N8eMGTMQHR2NK1euIDg4GJmZmdI++vi5VlBQoHKuT5w4AUEQEBoaCkB/z/fatWvRoUMHHD58GNnZ2fDz84OpqSk2b94s7aOP57uhGACfgqWlJezt7aWflUolunXrhnXr1mmwVM/W4wFQFEV06dIFP/30k7SusLAQMpkM3t7emijiM1FQUABBEBAeHg7gQR1btGgBPz8/aZ/U1FQIgoCoqChNFfOZeOmll/D7778bRJ3v3buHN954AydOnMAHH3wgBUB9rbujoyN69+5d6zZ9rTMALFmyBIMGDapzu6F8ri1YsAB/+9vfIIqiXp/v0aNHY9asWSrrPv30U0ybNg2A4ZzvujAANlJFRQWMjIxqjIZNnz4dY8eO1VCpnr3HA2BWVhYEQUBsbKzKfoMHD8ZXX331vIv3zGRkZEAQBCQmJgIAQkJCav0CcTMzM2zYsEETRWxy1dXV8Pb2hrGxMZKTkw2iztOnT8fChQsBQCUA6mvdHR0d0apVK3Tt2hWvvfYapk6diqtXrwLQ3zoDwNtvv42FCxdiwoQJ6NSpE/r06YOdO3dK2w3hc62iogIdOnTA2rVrAej3+V67di3Mzc2RlpYGAIiLi8PLL78MDw8PAIZxvuvDANhI169fhyAIOHv2rMp6BwcHWFpaaqhUz97jATAyMhKCIODGjRsq+02cOBGTJk163sV7JpRKJUaPHo333ntPWufp6QljY+Ma+w4YMADffvvt8yxek0tISEDr1q1hZGSEtm3b4siRIwD0u84A4O3tDblcLl3yeTQA6mvdg4KCsHfvXsTHx+PYsWOwsrKCmZkZiouL9bbOACCTySCTybBs2TJcunQJO3bsgImJCRQKBQDD+Fzz9fWFkZERrl+/DkB/2zjw4DN8yZIlaNasGZo3b45mzZrByclJ2m4I57s+DICNxAD4gCH84tja2sLc3By5ubnSOn3+sKyoqEBGRgZiYmKwdOlSdOzYEcnJyXpd55ycHLz88suIj4+X1hlCAHzc3bt30aZNG/z+++96XecWLVrAyspKZd38+fPx7rvvAjCMz7URI0ZgzJgx0s/6fL69vb3Ro0cPeHt7IyEhAe7u7mjfvr1BBf76MAA2Ei8BP6DvQ+f29vbo0aMHrly5orJeny+XPM7a2hpz587V6zr7+/tDEAQYGRlJiyAIaNasGYyMjHDy5Em9rfvj+vfvj6VLl+r1+TYzM8Ps2bNV1m3fvh3dunUDoP+fa3/88QdeeOEFHDx4UFqnz+e7R48e2LZtm8q6NWvWSDPe9f18PwkD4FOwtLTEvHnzpJ+VSiW6d+9ukJNAfv75Z2ldUVGRzt88K4oi7O3t0a1bt1ofBfDwhul9+/ZJ6y5fvqwXN0w/bsiQIbCxsdHrOhcXFyMxMVFl6d+/P/773/8iMTFRr+v+qHv37uGll17C5s2b9brOU6ZMqTEJZOHChdKooL5+rj3k6OiILl26oKqqSlqnz+e7ffv22L59u8o6JycnvPHGGwD0/3w/CQPgU/Dx8YFMJoNCoUBKSgrmzp2Ldu3a6cVzkx517949xMbGIjY2FoIgYMOGDYiNjZVuFnd2dka7du0QEBCAhIQEjBs3Tuenz9vZ2aFt27YICwtTeWzC/fv3pX1sbW1hZmaGU6dOISYmBlZWVjUuK+mapUuXIjw8HNnZ2UhISMDSpUvRrFkzHD9+HIB+1rkuj14CBvSz7l9//TXCwsKQnZ2NyMhIDBs2DB07dkRBQQEA/awz8OBRP82bN8fatWuRkZEBT09PtGrVSpoUAOjn5xrwYKDCzMwMS5YsqbFNX8+3jY0NunfvLj0G5sCBA+jYsaPKpW19Pd8NwQD4lLZu3QozMzMYGxvD0tIS586d03SRmlxoaGitDw+1sbEB8NcDNDt37gyZTAZra2tptpWuqq2+giDA1dVV2ufhQ1NfeukltGrVCp988gny8vI0V+gmMGvWLJibm8PY2BidOnWCtbW1FP4A/axzXR7x2BDPAAAF/0lEQVQPgPpY98mTJ6Nr164wNjZG9+7dMXnyZJVn4eljnR86dOgQ5HI5ZDIZ3nrrLZVZwIB+fq4BQHBwMARBqLUu+nq+i4uLsWDBApiZmUkPgl6+fDkqKiqkffT1fDcEAyARERGRgWEAJCIiIjIwDIBEREREBoYBkIiIiMjAMAASERERGRgGQCIiIiIDwwBIREREZGAYAImIiIgMDAMgEVE9zM3NsXHjRrWO8fCh6o9/3yoRkaYwABKRVrCxsZG+eaV58+Z4+eWXMWzYMOzevRtKpbJRx3J1dUXbtm2bpFwFBQUoLS1V6xgMgESkbRgAiUgr2NjY4KOPPkJeXh6uXbuGixcvYu3atTA1NcWoUaNUvsD+SZoyADYFBkAi0jYMgESkFWxsbDBu3Lga60NCQiAIAnbt2iWtW79+PeRyOVq1aoUePXrAzs4O9+7dA1D7d1g7OjoCANzd3dGvXz+Ympqic+fOmDJlCvLz8+st1+OXgB+WZfz48WjZsiVef/11BAQEqLzmyJEjeOONN2BiYoIPP/wQrq6uNQLg6dOnMWjQIJiYmKBHjx6YP38+SkpKAABubm5o3bo10tPTpf3t7Ozw5ptvqj0aSUQEMAASkZaoKwACQO/evTFq1Cjp540bN+LUqVPIzs5GSEgI3nzzTdjZ2QEAKioqsGnTJrRp0wZ5eXnIy8uTwuHu3bsRFBSErKwsREVFwcrKSuW4taktAPbo0QNeXl7IyMjAV199BVNTU9y+fRsAkJOTA5lMhsWLF+Py5cvw8PBA586dVQJgZmYmWrdujY0bNyI9PR2RkZHo27cvZsyYIf0/EydOxIABA1BVVYXDhw+jRYsWiImJeYp3loioJgZAItIK9QXAyZMn4+23367ztX5+fujQoYP0c0MvAV+4cAGCIEgBsTa1BcAVK1ZIP5eUlEAQBBw9ehQAsGzZMvzjH/9QOcaSJUtUAuDs2bMxd+5clX1Onz6NF154AWVlZQCAO3fuSKObnTt3xtq1a59YHyKihmIAJCKtUF8AnDRpkkqoOnHiBIYOHYpu3brB1NQUJiYmEARBujxaVwCMiYnBmDFj8Morr8DU1BStWrWCIAhITk6us1y1BcC9e/eq7NOmTRu4ubkBAMaPH4+ZM2eqbD948KBKAOzfvz+MjY3RunVraXlYlpSUFOl1wcHBEAQBAwcObPREGCKi+jAAEpFWqC8AWlhYYPTo0QCA7OxsyGQyLFy4EFFRUUhLS8Pu3btVAlZtAbCkpAQdOnTA1KlTERERgdTUVClgxcbG1lmu2gKgv7+/yj5t27aFq6srgIYFwLfeegvz589HRkZGjaWiokJ63fLly2FkZITXXnsNxcXF9b19RESNwgBIRFrhSZNAXFxcAAD79u1DixYtVEbE1qxZoxKwPD09YWpqqnKcmJgYCIKAnJwcad2ePXuaPAAuW7YM77zzjsr2pUuXqpRv6tSpsLa2rvP/BIDIyEg0b94cQUFBsLCwwPTp0+vdn4ioMRgAiUgr1PcYmDFjxqC6uhoAEBcXB0EQsGnTJmRlZcHd3R3du3dXCViRkZEQBAEnT57ErVu3UFpaioKCAhgbG8PBwQFZWVkICAjA3//+9yYPgFevXoWxsTG++eYbXL58GZ6enujSpYtK+eLj49GyZUvY29sjNjYW6enpOHjwIOzt7QEAxcXF6NmzJxYvXgwASEhIgEwmg5+fX9O82URk8BgAiUgrPP4g6E6dOmHYsGFwcXGpcf/bhg0b0LVrV7Rs2RIjR46Eu7t7jces2NraokOHDiqPgfHy8sKrr74KmUwGKysrBAYGNnkABIBDhw7h9ddfh0wmw/vvvw8XF5ca5Tt//jyGDx8OU1NTtG7dGr169ZImesycORMWFhYoLy+X9l+/fj3at2+Pa9euNfxNJSKqAwMgERERkYFhACQiIiIyMAyARERERAaGAZCIiIjIwDAAEhERERkYBkAiIiIiA8MASERERGRgGACJiIiIDAwDIBEREZGBYQAkIiIiMjAMgEREREQGhgGQiIiIyMAwABIREREZmP8HymFpbhoM/ooAAAAASUVORK5CYII=\" width=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x7f208c4ec128>"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"plt.close('all')\n",
"fig, ax = plt.subplots()\n",
"ax.plot(sio2_subtracted_spectrum, label='background-subtracted data', color='tab:green')\n",
"ax.set_ylabel('EELS intensity (a.u.)')\n",
"ax.set_xlabel('Data index')\n",
"ax.set_xlim([0, 80])\n",
"ax.set_ylim([-2000, 2e4])\n",
"plt.legend()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"From this plot, we identify a straight slope on the bandgap edge around index 50-60, so we'll try using this as our fit range. Select the fit range and plot it again to visualize where it is."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"/* global mpl */\n",
"window.mpl = {};\n",
"\n",
"mpl.get_websocket_type = function () {\n",
" if (typeof WebSocket !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof MozWebSocket !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert(\n",
" 'Your browser does not have WebSocket support. ' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.'\n",
" );\n",
" }\n",
"};\n",
"\n",
"mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = this.ws.binaryType !== undefined;\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById('mpl-warnings');\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent =\n",
" 'This browser does not support binary websocket messages. ' +\n",
" 'Performance may be slow.';\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = document.createElement('div');\n",
" this.root.setAttribute('style', 'display: inline-block');\n",
" this._root_extra_style(this.root);\n",
"\n",
" parent_element.appendChild(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message('supports_binary', { value: fig.supports_binary });\n",
" fig.send_message('send_image_mode', {});\n",
" if (fig.ratio !== 1) {\n",
" fig.send_message('set_dpi_ratio', { dpi_ratio: fig.ratio });\n",
" }\n",
" fig.send_message('refresh', {});\n",
" };\n",
"\n",
" this.imageObj.onload = function () {\n",
" if (fig.image_mode === 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function () {\n",
" fig.ws.close();\n",
" };\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"};\n",
"\n",
"mpl.figure.prototype._init_header = function () {\n",
" var titlebar = document.createElement('div');\n",
" titlebar.classList =\n",
" 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
" var titletext = document.createElement('div');\n",
" titletext.classList = 'ui-dialog-title';\n",
" titletext.setAttribute(\n",
" 'style',\n",
" 'width: 100%; text-align: center; padding: 3px;'\n",
" );\n",
" titlebar.appendChild(titletext);\n",
" this.root.appendChild(titlebar);\n",
" this.header = titletext;\n",
"};\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
"\n",
"mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
"\n",
"mpl.figure.prototype._init_canvas = function () {\n",
" var fig = this;\n",
"\n",
" var canvas_div = (this.canvas_div = document.createElement('div'));\n",
" canvas_div.setAttribute(\n",
" 'style',\n",
" 'border: 1px solid #ddd;' +\n",
" 'box-sizing: content-box;' +\n",
" 'clear: both;' +\n",
" 'min-height: 1px;' +\n",
" 'min-width: 1px;' +\n",
" 'outline: 0;' +\n",
" 'overflow: hidden;' +\n",
" 'position: relative;' +\n",
" 'resize: both;'\n",
" );\n",
"\n",
" function on_keyboard_event_closure(name) {\n",
" return function (event) {\n",
" return fig.key_event(event, name);\n",
" };\n",
" }\n",
"\n",
" canvas_div.addEventListener(\n",
" 'keydown',\n",
" on_keyboard_event_closure('key_press')\n",
" );\n",
" canvas_div.addEventListener(\n",
" 'keyup',\n",
" on_keyboard_event_closure('key_release')\n",
" );\n",
"\n",
" this._canvas_extra_style(canvas_div);\n",
" this.root.appendChild(canvas_div);\n",
"\n",
" var canvas = (this.canvas = document.createElement('canvas'));\n",
" canvas.classList.add('mpl-canvas');\n",
" canvas.setAttribute('style', 'box-sizing: content-box;');\n",
"\n",
" this.context = canvas.getContext('2d');\n",
"\n",
" var backingStore =\n",
" this.context.backingStorePixelRatio ||\n",
" this.context.webkitBackingStorePixelRatio ||\n",
" this.context.mozBackingStorePixelRatio ||\n",
" this.context.msBackingStorePixelRatio ||\n",
" this.context.oBackingStorePixelRatio ||\n",
" this.context.backingStorePixelRatio ||\n",
" 1;\n",
"\n",
" this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
"\n",
" var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
" 'canvas'\n",
" ));\n",
" rubberband_canvas.setAttribute(\n",
" 'style',\n",
" 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n",
" );\n",
"\n",
" // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
" if (this.ResizeObserver === undefined) {\n",
" if (window.ResizeObserver !== undefined) {\n",
" this.ResizeObserver = window.ResizeObserver;\n",
" } else {\n",
" var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
" this.ResizeObserver = obs.ResizeObserver;\n",
" }\n",
" }\n",
"\n",
" this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
" var nentries = entries.length;\n",
" for (var i = 0; i < nentries; i++) {\n",
" var entry = entries[i];\n",
" var width, height;\n",
" if (entry.contentBoxSize) {\n",
" if (entry.contentBoxSize instanceof Array) {\n",
" // Chrome 84 implements new version of spec.\n",
" width = entry.contentBoxSize[0].inlineSize;\n",
" height = entry.contentBoxSize[0].blockSize;\n",
" } else {\n",
" // Firefox implements old version of spec.\n",
" width = entry.contentBoxSize.inlineSize;\n",
" height = entry.contentBoxSize.blockSize;\n",
" }\n",
" } else {\n",
" // Chrome <84 implements even older version of spec.\n",
" width = entry.contentRect.width;\n",
" height = entry.contentRect.height;\n",
" }\n",
"\n",
" // Keep the size of the canvas and rubber band canvas in sync with\n",
" // the canvas container.\n",
" if (entry.devicePixelContentBoxSize) {\n",
" // Chrome 84 implements new version of spec.\n",
" canvas.setAttribute(\n",
" 'width',\n",
" entry.devicePixelContentBoxSize[0].inlineSize\n",
" );\n",
" canvas.setAttribute(\n",
" 'height',\n",
" entry.devicePixelContentBoxSize[0].blockSize\n",
" );\n",
" } else {\n",
" canvas.setAttribute('width', width * fig.ratio);\n",
" canvas.setAttribute('height', height * fig.ratio);\n",
" }\n",
" canvas.setAttribute(\n",
" 'style',\n",
" 'width: ' + width + 'px; height: ' + height + 'px;'\n",
" );\n",
"\n",
" rubberband_canvas.setAttribute('width', width);\n",
" rubberband_canvas.setAttribute('height', height);\n",
"\n",
" // And update the size in Python. We ignore the initial 0/0 size\n",
" // that occurs as the element is placed into the DOM, which should\n",
" // otherwise not happen due to the minimum size styling.\n",
" if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
" fig.request_resize(width, height);\n",
" }\n",
" }\n",
" });\n",
" this.resizeObserverInstance.observe(canvas_div);\n",
"\n",
" function on_mouse_event_closure(name) {\n",
" return function (event) {\n",
" return fig.mouse_event(event, name);\n",
" };\n",
" }\n",
"\n",
" rubberband_canvas.addEventListener(\n",
" 'mousedown',\n",
" on_mouse_event_closure('button_press')\n",
" );\n",
" rubberband_canvas.addEventListener(\n",
" 'mouseup',\n",
" on_mouse_event_closure('button_release')\n",
" );\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband_canvas.addEventListener(\n",
" 'mousemove',\n",
" on_mouse_event_closure('motion_notify')\n",
" );\n",
"\n",
" rubberband_canvas.addEventListener(\n",
" 'mouseenter',\n",
" on_mouse_event_closure('figure_enter')\n",
" );\n",
" rubberband_canvas.addEventListener(\n",
" 'mouseleave',\n",
" on_mouse_event_closure('figure_leave')\n",
" );\n",
"\n",
" canvas_div.addEventListener('wheel', function (event) {\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" on_mouse_event_closure('scroll')(event);\n",
" });\n",
"\n",
" canvas_div.appendChild(canvas);\n",
" canvas_div.appendChild(rubberband_canvas);\n",
"\n",
" this.rubberband_context = rubberband_canvas.getContext('2d');\n",
" this.rubberband_context.strokeStyle = '#000000';\n",
"\n",
" this._resize_canvas = function (width, height, forward) {\n",
" if (forward) {\n",
" canvas_div.style.width = width + 'px';\n",
" canvas_div.style.height = height + 'px';\n",
" }\n",
" };\n",
"\n",
" // Disable right mouse context menu.\n",
" this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n",
" event.preventDefault();\n",
" return false;\n",
" });\n",
"\n",
" function set_focus() {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"};\n",
"\n",
"mpl.figure.prototype._init_toolbar = function () {\n",
" var fig = this;\n",
"\n",
" var toolbar = document.createElement('div');\n",
" toolbar.classList = 'mpl-toolbar';\n",
" this.root.appendChild(toolbar);\n",
"\n",
" function on_click_closure(name) {\n",
" return function (_event) {\n",
" return fig.toolbar_button_onclick(name);\n",
" };\n",
" }\n",
"\n",
" function on_mouseover_closure(tooltip) {\n",
" return function (event) {\n",
" if (!event.currentTarget.disabled) {\n",
" return fig.toolbar_button_onmouseover(tooltip);\n",
" }\n",
" };\n",
" }\n",
"\n",
" fig.buttons = {};\n",
" var buttonGroup = document.createElement('div');\n",
" buttonGroup.classList = 'mpl-button-group';\n",
" for (var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" /* Instead of a spacer, we start a new button group. */\n",
" if (buttonGroup.hasChildNodes()) {\n",
" toolbar.appendChild(buttonGroup);\n",
" }\n",
" buttonGroup = document.createElement('div');\n",
" buttonGroup.classList = 'mpl-button-group';\n",
" continue;\n",
" }\n",
"\n",
" var button = (fig.buttons[name] = document.createElement('button'));\n",
" button.classList = 'mpl-widget';\n",
" button.setAttribute('role', 'button');\n",
" button.setAttribute('aria-disabled', 'false');\n",
" button.addEventListener('click', on_click_closure(method_name));\n",
" button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
"\n",
" var icon_img = document.createElement('img');\n",
" icon_img.src = '_images/' + image + '.png';\n",
" icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
" icon_img.alt = tooltip;\n",
" button.appendChild(icon_img);\n",
"\n",
" buttonGroup.appendChild(button);\n",
" }\n",
"\n",
" if (buttonGroup.hasChildNodes()) {\n",
" toolbar.appendChild(buttonGroup);\n",
" }\n",
"\n",
" var fmt_picker = document.createElement('select');\n",
" fmt_picker.classList = 'mpl-widget';\n",
" toolbar.appendChild(fmt_picker);\n",
" this.format_dropdown = fmt_picker;\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = document.createElement('option');\n",
" option.selected = fmt === mpl.default_extension;\n",
" option.innerHTML = fmt;\n",
" fmt_picker.appendChild(option);\n",
" }\n",
"\n",
" var status_bar = document.createElement('span');\n",
" status_bar.classList = 'mpl-message';\n",
" toolbar.appendChild(status_bar);\n",
" this.message = status_bar;\n",
"};\n",
"\n",
"mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
"};\n",
"\n",
"mpl.figure.prototype.send_message = function (type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"};\n",
"\n",
"mpl.figure.prototype.send_draw_message = function () {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1], msg['forward']);\n",
" fig.send_message('refresh', {});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
" var x0 = msg['x0'] / fig.ratio;\n",
" var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
" var x1 = msg['x1'] / fig.ratio;\n",
" var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0,\n",
" 0,\n",
" fig.canvas.width / fig.ratio,\n",
" fig.canvas.height / fig.ratio\n",
" );\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch (cursor) {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_message = function (fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
" for (var key in msg) {\n",
" if (!(key in fig.buttons)) {\n",
" continue;\n",
" }\n",
" fig.buttons[key].disabled = !msg[key];\n",
" fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
" if (msg['mode'] === 'PAN') {\n",
" fig.buttons['Pan'].classList.add('active');\n",
" fig.buttons['Zoom'].classList.remove('active');\n",
" } else if (msg['mode'] === 'ZOOM') {\n",
" fig.buttons['Pan'].classList.remove('active');\n",
" fig.buttons['Zoom'].classList.add('active');\n",
" } else {\n",
" fig.buttons['Pan'].classList.remove('active');\n",
" fig.buttons['Zoom'].classList.remove('active');\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function () {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message('ack', {});\n",
"};\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function (fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = 'image/png';\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src\n",
" );\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data\n",
" );\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" } else if (\n",
" typeof evt.data === 'string' &&\n",
" evt.data.slice(0, 21) === 'data:image/png;base64'\n",
" ) {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig['handle_' + msg_type];\n",
" } catch (e) {\n",
" console.log(\n",
" \"No handler for the '\" + msg_type + \"' message type: \",\n",
" msg\n",
" );\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\n",
" \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
" e,\n",
" e.stack,\n",
" msg\n",
" );\n",
" }\n",
" }\n",
" };\n",
"};\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function (e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e) {\n",
" e = window.event;\n",
" }\n",
" if (e.target) {\n",
" targ = e.target;\n",
" } else if (e.srcElement) {\n",
" targ = e.srcElement;\n",
" }\n",
" if (targ.nodeType === 3) {\n",
" // defeat Safari bug\n",
" targ = targ.parentNode;\n",
" }\n",
"\n",
" // pageX,Y are the mouse positions relative to the document\n",
" var boundingRect = targ.getBoundingClientRect();\n",
" var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n",
" var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n",
"\n",
" return { x: x, y: y };\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys(original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object') {\n",
" obj[key] = original[key];\n",
" }\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function (event, name) {\n",
" var canvas_pos = mpl.findpos(event);\n",
"\n",
" if (name === 'button_press') {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x * this.ratio;\n",
" var y = canvas_pos.y * this.ratio;\n",
"\n",
" this.send_message(name, {\n",
" x: x,\n",
" y: y,\n",
" button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event),\n",
" });\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"};\n",
"\n",
"mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"};\n",
"\n",
"mpl.figure.prototype.key_event = function (event, name) {\n",
" // Prevent repeat events\n",
" if (name === 'key_press') {\n",
" if (event.which === this._key) {\n",
" return;\n",
" } else {\n",
" this._key = event.which;\n",
" }\n",
" }\n",
" if (name === 'key_release') {\n",
" this._key = null;\n",
" }\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which !== 17) {\n",
" value += 'ctrl+';\n",
" }\n",
" if (event.altKey && event.which !== 18) {\n",
" value += 'alt+';\n",
" }\n",
" if (event.shiftKey && event.which !== 16) {\n",
" value += 'shift+';\n",
" }\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
" return false;\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
" if (name === 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message('toolbar_button', { name: name });\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"\n",
"///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
"// prettier-ignore\n",
"var _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
"\n",
"mpl.default_extension = \"png\";/* global mpl */\n",
"\n",
"var comm_websocket_adapter = function (comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function () {\n",
" comm.close();\n",
" };\n",
" ws.send = function (m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function (msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data']);\n",
" });\n",
" return ws;\n",
"};\n",
"\n",
"mpl.mpl_figure_comm = function (comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = document.getElementById(id);\n",
" var ws_proxy = comm_websocket_adapter(comm);\n",
"\n",
" function ondownload(figure, _format) {\n",
" window.open(figure.canvas.toDataURL());\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element;\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error('Failed to find cell for figure', id, fig);\n",
" return;\n",
" }\n",
" fig.cell_info[0].output_area.element.on(\n",
" 'cleared',\n",
" { fig: fig },\n",
" fig._remove_fig_handler\n",
" );\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function (fig, msg) {\n",
" var width = fig.canvas.width / fig.ratio;\n",
" fig.cell_info[0].output_area.element.off(\n",
" 'cleared',\n",
" fig._remove_fig_handler\n",
" );\n",
" fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable();\n",
" fig.parent_element.innerHTML =\n",
" '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
" fig.close_ws(fig, msg);\n",
"};\n",
"\n",
"mpl.figure.prototype.close_ws = function (fig, msg) {\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"};\n",
"\n",
"mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var width = this.canvas.width / this.ratio;\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] =\n",
" '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
"};\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function () {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message('ack', {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () {\n",
" fig.push_to_output();\n",
" }, 1000);\n",
"};\n",
"\n",
"mpl.figure.prototype._init_toolbar = function () {\n",
" var fig = this;\n",
"\n",
" var toolbar = document.createElement('div');\n",
" toolbar.classList = 'btn-toolbar';\n",
" this.root.appendChild(toolbar);\n",
"\n",
" function on_click_closure(name) {\n",
" return function (_event) {\n",
" return fig.toolbar_button_onclick(name);\n",
" };\n",
" }\n",
"\n",
" function on_mouseover_closure(tooltip) {\n",
" return function (event) {\n",
" if (!event.currentTarget.disabled) {\n",
" return fig.toolbar_button_onmouseover(tooltip);\n",
" }\n",
" };\n",
" }\n",
"\n",
" fig.buttons = {};\n",
" var buttonGroup = document.createElement('div');\n",
" buttonGroup.classList = 'btn-group';\n",
" var button;\n",
" for (var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" /* Instead of a spacer, we start a new button group. */\n",
" if (buttonGroup.hasChildNodes()) {\n",
" toolbar.appendChild(buttonGroup);\n",
" }\n",
" buttonGroup = document.createElement('div');\n",
" buttonGroup.classList = 'btn-group';\n",
" continue;\n",
" }\n",
"\n",
" button = fig.buttons[name] = document.createElement('button');\n",
" button.classList = 'btn btn-default';\n",
" button.href = '#';\n",
" button.title = name;\n",
" button.innerHTML = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n",
" button.addEventListener('click', on_click_closure(method_name));\n",
" button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
" buttonGroup.appendChild(button);\n",
" }\n",
"\n",
" if (buttonGroup.hasChildNodes()) {\n",
" toolbar.appendChild(buttonGroup);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = document.createElement('span');\n",
" status_bar.classList = 'mpl-message pull-right';\n",
" toolbar.appendChild(status_bar);\n",
" this.message = status_bar;\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = document.createElement('div');\n",
" buttongrp.classList = 'btn-group inline pull-right';\n",
" button = document.createElement('button');\n",
" button.classList = 'btn btn-mini btn-primary';\n",
" button.href = '#';\n",
" button.title = 'Stop Interaction';\n",
" button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n",
" button.addEventListener('click', function (_evt) {\n",
" fig.handle_close(fig, {});\n",
" });\n",
" button.addEventListener(\n",
" 'mouseover',\n",
" on_mouseover_closure('Stop Interaction')\n",
" );\n",
" buttongrp.appendChild(button);\n",
" var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
" titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
"};\n",
"\n",
"mpl.figure.prototype._remove_fig_handler = function (event) {\n",
" var fig = event.data.fig;\n",
" if (event.target !== this) {\n",
" // Ignore bubbled events from children.\n",
" return;\n",
" }\n",
" fig.close_ws(fig, {});\n",
"};\n",
"\n",
"mpl.figure.prototype._root_extra_style = function (el) {\n",
" el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
"};\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function (el) {\n",
" // this is important to make the div 'focusable\n",
" el.setAttribute('tabindex', 0);\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" } else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager) {\n",
" manager = IPython.keyboard_manager;\n",
" }\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which === 13) {\n",
" this.canvas_div.blur();\n",
" // select the cell after this one\n",
" var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
" IPython.notebook.select(index + 1);\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
" fig.ondownload(fig, null);\n",
"};\n",
"\n",
"mpl.find_output_cell = function (html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i = 0; i < ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code') {\n",
" for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] === html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"};\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel !== null) {\n",
" IPython.notebook.kernel.comm_manager.register_target(\n",
" 'matplotlib',\n",
" mpl.mpl_figure_comm\n",
" );\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4nOzdeXhMZ/8/8JN1JEZIImKL0JZUHQS1BEVba5M2RWlp0VJbaVVbVKmondr6tCiKQSzViq2CWmJfik4SMQmRSASxBMk3i0gy8/794ZdTx2SZmMTMZN6v67qv65k5Z2bumXw8n3fnzLmPACIiIiKyKoKpJ0BEREREzxcDIBEREZGVYQAkIiIisjIMgERERERWhgGQiIiIyMowABIRERFZGQZAIiIiIivDAEhERERkZRgAiYiIiKwMAyARERGRlWEAJCIiIrIyDIBEREREVoYBkIiIiMjKMAASERERWRkGQCIiIiIrwwBIREREZGUYAImIiIisDAMgERERkZVhACQiIiKyMgyARERERFaGAZCIiIjIyjAAEhEREVkZBkAiIiIiK8MASERERGRlGACJiIiIrAwDIBEREZGVYQAkIiIisjIMgERERERWhgGQiIiIyMowABIRERFZGQZAIiIiIivDAEhERERkZRgAiYiIiKwMAyARERGRlWEAJCIiIrIyDIBEREREVoYBkIiIiMjKMAASERERWRkGQCIiIiIrwwBIREREZGUYAImIiIisDAMgERERkZVhACQiIiKyMgyARERERFaGAZCIiIjIyjAAEhEREVkZBkAiIiIiK8MASERERGRlGACJiIiIrAwDIBEREZGVYQAkIiIisjIMgERERERW5rkHwFmzZuHVV1+FUqmEh4cHAgMDERMTI9vn4cOH+Oyzz+Dm5oaKFSuiV69euHXrlmyfxMREvPXWW3BycoKHhwe++eYb5ObmyvYJCwtDs2bN4OjoiBdffBFr1qzRm88vv/wCb29vKBQKtGrVCmfOnCn190xERERkTp57AOzWrRvWrFmDqKgohIeH46233kKdOnWQkZEh7TNixAh4eXnh4MGDOHfuHNq0aYO2bdtK2/Py8iCKIjp37gy1Wo3Q0FBUrVoVEydOlPaJj4+Hs7MzvvrqK2g0Gvz888+ws7PD3r17pX02b94MR0dHrF69GhcvXsTQoUNRpUoV3L59+/l8GEREREQmYPJDwHfu3IEgCDhy5AgAIDU1FQ4ODvjjjz+kfaKjoyEIAk6dOgUACA0Nha2trexbwWXLlsHFxQWPHj0CAIwfPx6NGjWSvdb777+Pbt26SbdbtWqFUaNG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\" width=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x7f208c484828>"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fit_range_bandgap = (50, 60)\n",
"\n",
"plt.close('all')\n",
"fig, ax = plt.subplots()\n",
"ax.plot(\n",
" spectrumrange_subtracted, \n",
" sio2_subtracted_spectrum, \n",
" label='background-subtracted data', \n",
" color='tab:green'\n",
")\n",
"\n",
"ax.plot(\n",
" spectrumrange_subtracted[fit_range_bandgap[0]:fit_range_bandgap[1]], \n",
" sio2_subtracted_spectrum[fit_range_bandgap[0]:fit_range_bandgap[1]], \n",
" label='bandgap fit range',\n",
" color='tab:purple',\n",
" linestyle='--',\n",
")\n",
"\n",
"ax.set_ylabel('EELS intensity (a.u.)')\n",
"ax.set_xlabel('Energy loss (eV)')\n",
"ax.set_xlim([4, 14])\n",
"ax.set_ylim([-2000, 2e4])\n",
"plt.legend()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Fit a line to the bandgap slope"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Model: Linear1D\n",
"Inputs: ('x',)\n",
"Outputs: ('y',)\n",
"Model set size: 1\n",
"Parameters:\n",
" slope intercept \n",
" ----------------- -----------------\n",
" 4115.702256898611 -36591.4695418933\n"
]
}
],
"source": [
"fit_bandgap = fitting.LinearLSQFitter()\n",
"linear_model = models.Linear1D()\n",
"fitted_line = fit_bandgap(\n",
" linear_model, \n",
" spectrumrange_subtracted[fit_range_bandgap[0]:fit_range_bandgap[1]], \n",
" sio2_subtracted_spectrum[fit_range_bandgap[0]:fit_range_bandgap[1]])\n",
"print(fitted_line)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Plot the final fit"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"/* global mpl */\n",
"window.mpl = {};\n",
"\n",
"mpl.get_websocket_type = function () {\n",
" if (typeof WebSocket !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof MozWebSocket !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert(\n",
" 'Your browser does not have WebSocket support. ' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.'\n",
" );\n",
" }\n",
"};\n",
"\n",
"mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = this.ws.binaryType !== undefined;\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById('mpl-warnings');\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent =\n",
" 'This browser does not support binary websocket messages. ' +\n",
" 'Performance may be slow.';\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = document.createElement('div');\n",
" this.root.setAttribute('style', 'display: inline-block');\n",
" this._root_extra_style(this.root);\n",
"\n",
" parent_element.appendChild(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message('supports_binary', { value: fig.supports_binary });\n",
" fig.send_message('send_image_mode', {});\n",
" if (fig.ratio !== 1) {\n",
" fig.send_message('set_dpi_ratio', { dpi_ratio: fig.ratio });\n",
" }\n",
" fig.send_message('refresh', {});\n",
" };\n",
"\n",
" this.imageObj.onload = function () {\n",
" if (fig.image_mode === 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function () {\n",
" fig.ws.close();\n",
" };\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"};\n",
"\n",
"mpl.figure.prototype._init_header = function () {\n",
" var titlebar = document.createElement('div');\n",
" titlebar.classList =\n",
" 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
" var titletext = document.createElement('div');\n",
" titletext.classList = 'ui-dialog-title';\n",
" titletext.setAttribute(\n",
" 'style',\n",
" 'width: 100%; text-align: center; padding: 3px;'\n",
" );\n",
" titlebar.appendChild(titletext);\n",
" this.root.appendChild(titlebar);\n",
" this.header = titletext;\n",
"};\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
"\n",
"mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
"\n",
"mpl.figure.prototype._init_canvas = function () {\n",
" var fig = this;\n",
"\n",
" var canvas_div = (this.canvas_div = document.createElement('div'));\n",
" canvas_div.setAttribute(\n",
" 'style',\n",
" 'border: 1px solid #ddd;' +\n",
" 'box-sizing: content-box;' +\n",
" 'clear: both;' +\n",
" 'min-height: 1px;' +\n",
" 'min-width: 1px;' +\n",
" 'outline: 0;' +\n",
" 'overflow: hidden;' +\n",
" 'position: relative;' +\n",
" 'resize: both;'\n",
" );\n",
"\n",
" function on_keyboard_event_closure(name) {\n",
" return function (event) {\n",
" return fig.key_event(event, name);\n",
" };\n",
" }\n",
"\n",
" canvas_div.addEventListener(\n",
" 'keydown',\n",
" on_keyboard_event_closure('key_press')\n",
" );\n",
" canvas_div.addEventListener(\n",
" 'keyup',\n",
" on_keyboard_event_closure('key_release')\n",
" );\n",
"\n",
" this._canvas_extra_style(canvas_div);\n",
" this.root.appendChild(canvas_div);\n",
"\n",
" var canvas = (this.canvas = document.createElement('canvas'));\n",
" canvas.classList.add('mpl-canvas');\n",
" canvas.setAttribute('style', 'box-sizing: content-box;');\n",
"\n",
" this.context = canvas.getContext('2d');\n",
"\n",
" var backingStore =\n",
" this.context.backingStorePixelRatio ||\n",
" this.context.webkitBackingStorePixelRatio ||\n",
" this.context.mozBackingStorePixelRatio ||\n",
" this.context.msBackingStorePixelRatio ||\n",
" this.context.oBackingStorePixelRatio ||\n",
" this.context.backingStorePixelRatio ||\n",
" 1;\n",
"\n",
" this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
"\n",
" var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
" 'canvas'\n",
" ));\n",
" rubberband_canvas.setAttribute(\n",
" 'style',\n",
" 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n",
" );\n",
"\n",
" // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
" if (this.ResizeObserver === undefined) {\n",
" if (window.ResizeObserver !== undefined) {\n",
" this.ResizeObserver = window.ResizeObserver;\n",
" } else {\n",
" var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
" this.ResizeObserver = obs.ResizeObserver;\n",
" }\n",
" }\n",
"\n",
" this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
" var nentries = entries.length;\n",
" for (var i = 0; i < nentries; i++) {\n",
" var entry = entries[i];\n",
" var width, height;\n",
" if (entry.contentBoxSize) {\n",
" if (entry.contentBoxSize instanceof Array) {\n",
" // Chrome 84 implements new version of spec.\n",
" width = entry.contentBoxSize[0].inlineSize;\n",
" height = entry.contentBoxSize[0].blockSize;\n",
" } else {\n",
" // Firefox implements old version of spec.\n",
" width = entry.contentBoxSize.inlineSize;\n",
" height = entry.contentBoxSize.blockSize;\n",
" }\n",
" } else {\n",
" // Chrome <84 implements even older version of spec.\n",
" width = entry.contentRect.width;\n",
" height = entry.contentRect.height;\n",
" }\n",
"\n",
" // Keep the size of the canvas and rubber band canvas in sync with\n",
" // the canvas container.\n",
" if (entry.devicePixelContentBoxSize) {\n",
" // Chrome 84 implements new version of spec.\n",
" canvas.setAttribute(\n",
" 'width',\n",
" entry.devicePixelContentBoxSize[0].inlineSize\n",
" );\n",
" canvas.setAttribute(\n",
" 'height',\n",
" entry.devicePixelContentBoxSize[0].blockSize\n",
" );\n",
" } else {\n",
" canvas.setAttribute('width', width * fig.ratio);\n",
" canvas.setAttribute('height', height * fig.ratio);\n",
" }\n",
" canvas.setAttribute(\n",
" 'style',\n",
" 'width: ' + width + 'px; height: ' + height + 'px;'\n",
" );\n",
"\n",
" rubberband_canvas.setAttribute('width', width);\n",
" rubberband_canvas.setAttribute('height', height);\n",
"\n",
" // And update the size in Python. We ignore the initial 0/0 size\n",
" // that occurs as the element is placed into the DOM, which should\n",
" // otherwise not happen due to the minimum size styling.\n",
" if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
" fig.request_resize(width, height);\n",
" }\n",
" }\n",
" });\n",
" this.resizeObserverInstance.observe(canvas_div);\n",
"\n",
" function on_mouse_event_closure(name) {\n",
" return function (event) {\n",
" return fig.mouse_event(event, name);\n",
" };\n",
" }\n",
"\n",
" rubberband_canvas.addEventListener(\n",
" 'mousedown',\n",
" on_mouse_event_closure('button_press')\n",
" );\n",
" rubberband_canvas.addEventListener(\n",
" 'mouseup',\n",
" on_mouse_event_closure('button_release')\n",
" );\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband_canvas.addEventListener(\n",
" 'mousemove',\n",
" on_mouse_event_closure('motion_notify')\n",
" );\n",
"\n",
" rubberband_canvas.addEventListener(\n",
" 'mouseenter',\n",
" on_mouse_event_closure('figure_enter')\n",
" );\n",
" rubberband_canvas.addEventListener(\n",
" 'mouseleave',\n",
" on_mouse_event_closure('figure_leave')\n",
" );\n",
"\n",
" canvas_div.addEventListener('wheel', function (event) {\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" on_mouse_event_closure('scroll')(event);\n",
" });\n",
"\n",
" canvas_div.appendChild(canvas);\n",
" canvas_div.appendChild(rubberband_canvas);\n",
"\n",
" this.rubberband_context = rubberband_canvas.getContext('2d');\n",
" this.rubberband_context.strokeStyle = '#000000';\n",
"\n",
" this._resize_canvas = function (width, height, forward) {\n",
" if (forward) {\n",
" canvas_div.style.width = width + 'px';\n",
" canvas_div.style.height = height + 'px';\n",
" }\n",
" };\n",
"\n",
" // Disable right mouse context menu.\n",
" this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n",
" event.preventDefault();\n",
" return false;\n",
" });\n",
"\n",
" function set_focus() {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"};\n",
"\n",
"mpl.figure.prototype._init_toolbar = function () {\n",
" var fig = this;\n",
"\n",
" var toolbar = document.createElement('div');\n",
" toolbar.classList = 'mpl-toolbar';\n",
" this.root.appendChild(toolbar);\n",
"\n",
" function on_click_closure(name) {\n",
" return function (_event) {\n",
" return fig.toolbar_button_onclick(name);\n",
" };\n",
" }\n",
"\n",
" function on_mouseover_closure(tooltip) {\n",
" return function (event) {\n",
" if (!event.currentTarget.disabled) {\n",
" return fig.toolbar_button_onmouseover(tooltip);\n",
" }\n",
" };\n",
" }\n",
"\n",
" fig.buttons = {};\n",
" var buttonGroup = document.createElement('div');\n",
" buttonGroup.classList = 'mpl-button-group';\n",
" for (var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" /* Instead of a spacer, we start a new button group. */\n",
" if (buttonGroup.hasChildNodes()) {\n",
" toolbar.appendChild(buttonGroup);\n",
" }\n",
" buttonGroup = document.createElement('div');\n",
" buttonGroup.classList = 'mpl-button-group';\n",
" continue;\n",
" }\n",
"\n",
" var button = (fig.buttons[name] = document.createElement('button'));\n",
" button.classList = 'mpl-widget';\n",
" button.setAttribute('role', 'button');\n",
" button.setAttribute('aria-disabled', 'false');\n",
" button.addEventListener('click', on_click_closure(method_name));\n",
" button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
"\n",
" var icon_img = document.createElement('img');\n",
" icon_img.src = '_images/' + image + '.png';\n",
" icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
" icon_img.alt = tooltip;\n",
" button.appendChild(icon_img);\n",
"\n",
" buttonGroup.appendChild(button);\n",
" }\n",
"\n",
" if (buttonGroup.hasChildNodes()) {\n",
" toolbar.appendChild(buttonGroup);\n",
" }\n",
"\n",
" var fmt_picker = document.createElement('select');\n",
" fmt_picker.classList = 'mpl-widget';\n",
" toolbar.appendChild(fmt_picker);\n",
" this.format_dropdown = fmt_picker;\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = document.createElement('option');\n",
" option.selected = fmt === mpl.default_extension;\n",
" option.innerHTML = fmt;\n",
" fmt_picker.appendChild(option);\n",
" }\n",
"\n",
" var status_bar = document.createElement('span');\n",
" status_bar.classList = 'mpl-message';\n",
" toolbar.appendChild(status_bar);\n",
" this.message = status_bar;\n",
"};\n",
"\n",
"mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
"};\n",
"\n",
"mpl.figure.prototype.send_message = function (type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"};\n",
"\n",
"mpl.figure.prototype.send_draw_message = function () {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1], msg['forward']);\n",
" fig.send_message('refresh', {});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
" var x0 = msg['x0'] / fig.ratio;\n",
" var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
" var x1 = msg['x1'] / fig.ratio;\n",
" var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0,\n",
" 0,\n",
" fig.canvas.width / fig.ratio,\n",
" fig.canvas.height / fig.ratio\n",
" );\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch (cursor) {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_message = function (fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
" for (var key in msg) {\n",
" if (!(key in fig.buttons)) {\n",
" continue;\n",
" }\n",
" fig.buttons[key].disabled = !msg[key];\n",
" fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
" if (msg['mode'] === 'PAN') {\n",
" fig.buttons['Pan'].classList.add('active');\n",
" fig.buttons['Zoom'].classList.remove('active');\n",
" } else if (msg['mode'] === 'ZOOM') {\n",
" fig.buttons['Pan'].classList.remove('active');\n",
" fig.buttons['Zoom'].classList.add('active');\n",
" } else {\n",
" fig.buttons['Pan'].classList.remove('active');\n",
" fig.buttons['Zoom'].classList.remove('active');\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function () {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message('ack', {});\n",
"};\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function (fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = 'image/png';\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src\n",
" );\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data\n",
" );\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" } else if (\n",
" typeof evt.data === 'string' &&\n",
" evt.data.slice(0, 21) === 'data:image/png;base64'\n",
" ) {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig['handle_' + msg_type];\n",
" } catch (e) {\n",
" console.log(\n",
" \"No handler for the '\" + msg_type + \"' message type: \",\n",
" msg\n",
" );\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\n",
" \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
" e,\n",
" e.stack,\n",
" msg\n",
" );\n",
" }\n",
" }\n",
" };\n",
"};\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function (e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e) {\n",
" e = window.event;\n",
" }\n",
" if (e.target) {\n",
" targ = e.target;\n",
" } else if (e.srcElement) {\n",
" targ = e.srcElement;\n",
" }\n",
" if (targ.nodeType === 3) {\n",
" // defeat Safari bug\n",
" targ = targ.parentNode;\n",
" }\n",
"\n",
" // pageX,Y are the mouse positions relative to the document\n",
" var boundingRect = targ.getBoundingClientRect();\n",
" var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n",
" var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n",
"\n",
" return { x: x, y: y };\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys(original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object') {\n",
" obj[key] = original[key];\n",
" }\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function (event, name) {\n",
" var canvas_pos = mpl.findpos(event);\n",
"\n",
" if (name === 'button_press') {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x * this.ratio;\n",
" var y = canvas_pos.y * this.ratio;\n",
"\n",
" this.send_message(name, {\n",
" x: x,\n",
" y: y,\n",
" button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event),\n",
" });\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"};\n",
"\n",
"mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"};\n",
"\n",
"mpl.figure.prototype.key_event = function (event, name) {\n",
" // Prevent repeat events\n",
" if (name === 'key_press') {\n",
" if (event.which === this._key) {\n",
" return;\n",
" } else {\n",
" this._key = event.which;\n",
" }\n",
" }\n",
" if (name === 'key_release') {\n",
" this._key = null;\n",
" }\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which !== 17) {\n",
" value += 'ctrl+';\n",
" }\n",
" if (event.altKey && event.which !== 18) {\n",
" value += 'alt+';\n",
" }\n",
" if (event.shiftKey && event.which !== 16) {\n",
" value += 'shift+';\n",
" }\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
" return false;\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
" if (name === 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message('toolbar_button', { name: name });\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"\n",
"///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
"// prettier-ignore\n",
"var _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
"\n",
"mpl.default_extension = \"png\";/* global mpl */\n",
"\n",
"var comm_websocket_adapter = function (comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function () {\n",
" comm.close();\n",
" };\n",
" ws.send = function (m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function (msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data']);\n",
" });\n",
" return ws;\n",
"};\n",
"\n",
"mpl.mpl_figure_comm = function (comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = document.getElementById(id);\n",
" var ws_proxy = comm_websocket_adapter(comm);\n",
"\n",
" function ondownload(figure, _format) {\n",
" window.open(figure.canvas.toDataURL());\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element;\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error('Failed to find cell for figure', id, fig);\n",
" return;\n",
" }\n",
" fig.cell_info[0].output_area.element.on(\n",
" 'cleared',\n",
" { fig: fig },\n",
" fig._remove_fig_handler\n",
" );\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function (fig, msg) {\n",
" var width = fig.canvas.width / fig.ratio;\n",
" fig.cell_info[0].output_area.element.off(\n",
" 'cleared',\n",
" fig._remove_fig_handler\n",
" );\n",
" fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable();\n",
" fig.parent_element.innerHTML =\n",
" '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
" fig.close_ws(fig, msg);\n",
"};\n",
"\n",
"mpl.figure.prototype.close_ws = function (fig, msg) {\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"};\n",
"\n",
"mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var width = this.canvas.width / this.ratio;\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] =\n",
" '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
"};\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function () {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message('ack', {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () {\n",
" fig.push_to_output();\n",
" }, 1000);\n",
"};\n",
"\n",
"mpl.figure.prototype._init_toolbar = function () {\n",
" var fig = this;\n",
"\n",
" var toolbar = document.createElement('div');\n",
" toolbar.classList = 'btn-toolbar';\n",
" this.root.appendChild(toolbar);\n",
"\n",
" function on_click_closure(name) {\n",
" return function (_event) {\n",
" return fig.toolbar_button_onclick(name);\n",
" };\n",
" }\n",
"\n",
" function on_mouseover_closure(tooltip) {\n",
" return function (event) {\n",
" if (!event.currentTarget.disabled) {\n",
" return fig.toolbar_button_onmouseover(tooltip);\n",
" }\n",
" };\n",
" }\n",
"\n",
" fig.buttons = {};\n",
" var buttonGroup = document.createElement('div');\n",
" buttonGroup.classList = 'btn-group';\n",
" var button;\n",
" for (var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" /* Instead of a spacer, we start a new button group. */\n",
" if (buttonGroup.hasChildNodes()) {\n",
" toolbar.appendChild(buttonGroup);\n",
" }\n",
" buttonGroup = document.createElement('div');\n",
" buttonGroup.classList = 'btn-group';\n",
" continue;\n",
" }\n",
"\n",
" button = fig.buttons[name] = document.createElement('button');\n",
" button.classList = 'btn btn-default';\n",
" button.href = '#';\n",
" button.title = name;\n",
" button.innerHTML = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n",
" button.addEventListener('click', on_click_closure(method_name));\n",
" button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
" buttonGroup.appendChild(button);\n",
" }\n",
"\n",
" if (buttonGroup.hasChildNodes()) {\n",
" toolbar.appendChild(buttonGroup);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = document.createElement('span');\n",
" status_bar.classList = 'mpl-message pull-right';\n",
" toolbar.appendChild(status_bar);\n",
" this.message = status_bar;\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = document.createElement('div');\n",
" buttongrp.classList = 'btn-group inline pull-right';\n",
" button = document.createElement('button');\n",
" button.classList = 'btn btn-mini btn-primary';\n",
" button.href = '#';\n",
" button.title = 'Stop Interaction';\n",
" button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n",
" button.addEventListener('click', function (_evt) {\n",
" fig.handle_close(fig, {});\n",
" });\n",
" button.addEventListener(\n",
" 'mouseover',\n",
" on_mouseover_closure('Stop Interaction')\n",
" );\n",
" buttongrp.appendChild(button);\n",
" var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
" titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
"};\n",
"\n",
"mpl.figure.prototype._remove_fig_handler = function (event) {\n",
" var fig = event.data.fig;\n",
" if (event.target !== this) {\n",
" // Ignore bubbled events from children.\n",
" return;\n",
" }\n",
" fig.close_ws(fig, {});\n",
"};\n",
"\n",
"mpl.figure.prototype._root_extra_style = function (el) {\n",
" el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
"};\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function (el) {\n",
" // this is important to make the div 'focusable\n",
" el.setAttribute('tabindex', 0);\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" } else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager) {\n",
" manager = IPython.keyboard_manager;\n",
" }\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which === 13) {\n",
" this.canvas_div.blur();\n",
" // select the cell after this one\n",
" var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
" IPython.notebook.select(index + 1);\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
" fig.ondownload(fig, null);\n",
"};\n",
"\n",
"mpl.find_output_cell = function (html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i = 0; i < ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code') {\n",
" for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] === html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"};\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel !== null) {\n",
" IPython.notebook.kernel.comm_manager.register_target(\n",
" 'matplotlib',\n",
" mpl.mpl_figure_comm\n",
" );\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\" width=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x7f208c3ffc88>"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"plt.close('all')\n",
"fig, ax = plt.subplots()\n",
"\n",
"ax.plot(spectrumrange, sio2[:, 1], label='raw data')\n",
"\n",
"ax.plot(\n",
" spectrumrange[fit_range[0]:], \n",
" fitted_power(spectrumrange[fit_range[0]:]), \n",
" label='fitted power law',\n",
" linestyle='--',\n",
")\n",
"\n",
"ax.plot(\n",
" spectrumrange_subtracted, \n",
" sio2_subtracted_spectrum, \n",
" label='background-subtracted data', \n",
")\n",
"\n",
"ax.plot(\n",
" spectrumrange_subtracted, \n",
" fitted_line(spectrumrange_subtracted), \n",
" label='bandgap linear fit',\n",
" color='tab:purple',\n",
" linestyle='--',\n",
")\n",
"\n",
"ax.set_ylabel('EELS intensity (a.u.)')\n",
"ax.set_xlabel('Energy loss (eV)')\n",
"ax.set_xlim([3, 15])\n",
"ax.set_ylim([-2000, 2e4])\n",
"\n",
"ax.axhline(0, color='k', zorder=0.1, linewidth=0.5)\n",
"plt.legend()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"From the plot, we can see that the bandgap line intersects the x-axis at around 8.9 eV, but we can also be more precise, knowing the equation of this line."
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Bandgap: 8.890698903342637 eV\n"
]
}
],
"source": [
"x_intercept = -fitted_line.intercept/fitted_line.slope\n",
"print('Bandgap: ', x_intercept, 'eV')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The equation gives us a bandgap value of around 8.89 eV, close to that found in the paper by Cheynet (8.8 eV) for the amorphous SiO2. Further improvements to the accuracy can be made with more careful attention to the fitting parameters used (*e.g*, the fit range). Applying this technique to other data may require different fitting functions or modelling of the low-loss spectrum, in order to account for excitons, plasmons, *etc*."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.6.9"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment