From 300875bb3e4d74a9eb72806b7c926efa68109763 Mon Sep 17 00:00:00 2001 From: Gao Date: Tue, 1 Aug 2023 18:52:06 +0200 Subject: [PATCH] regular backup --- 20230731_Data_Analysis_onlyFit.ipynb | 5681 ++++++++++++++++++++++++++ AccordionLattice.ipynb | 3810 +++++++++++++++++ 2 files changed, 9491 insertions(+) create mode 100644 20230731_Data_Analysis_onlyFit.ipynb create mode 100644 AccordionLattice.ipynb diff --git a/20230731_Data_Analysis_onlyFit.ipynb b/20230731_Data_Analysis_onlyFit.ipynb new file mode 100644 index 0000000..e58cfcc --- /dev/null +++ b/20230731_Data_Analysis_onlyFit.ipynb @@ -0,0 +1,5681 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Import supporting package" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import xarray as xr\n", + "import numpy as np\n", + "import copy\n", + "\n", + "from uncertainties import ufloat\n", + "from uncertainties import unumpy as unp\n", + "from uncertainties import umath\n", + "import random\n", + "import matplotlib.pyplot as plt\n", + "plt.rcParams['font.size'] = 12\n", + "\n", + "from DataContainer.ReadData import read_hdf5_file\n", + "from Analyser.ImagingAnalyser import ImageAnalyser\n", + "from Analyser.FitAnalyser import FitAnalyser\n", + "from Analyser.FitAnalyser import NewFitModel, DensityProfileBEC2dModel\n", + "from ToolFunction.ToolFunction import *\n", + "\n", + "from scipy.optimize import curve_fit\n", + "\n", + "from ToolFunction.HomeMadeXarrayFunction import errorbar, dataarray_plot_errorbar\n", + "xr.plot.dataarray_plot.errorbar = errorbar\n", + "xr.plot.accessor.DataArrayPlotAccessor.errorbar = dataarray_plot_errorbar\n", + "\n", + "imageAnalyser = ImageAnalyser()\n", + "\n", + "# %matplotlib notebook" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Start a client for parallel computing" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "
\n", + "
\n", + "

Client

\n", + "

Client-a5e5cea6-2fbd-11ee-8430-80e82ce2fa8e

\n", + " \n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "
Connection method: Cluster objectCluster type: distributed.LocalCluster
\n", + " Dashboard: http://127.0.0.1:8787/status\n", + "
\n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "

Cluster Info

\n", + "
\n", + "
\n", + "
\n", + "
\n", + "

LocalCluster

\n", + "

49266936

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "\n", + " \n", + "
\n", + " Dashboard: http://127.0.0.1:8787/status\n", + " \n", + " Workers: 8\n", + "
\n", + " Total threads: 128\n", + " \n", + " Total memory: 149.01 GiB\n", + "
Status: runningUsing processes: True
\n", + "\n", + "
\n", + " \n", + "

Scheduler Info

\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "

Scheduler

\n", + "

Scheduler-6db1fb2d-d8be-4f76-9fcf-6a7cc9ed86ee

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " Comm: tcp://127.0.0.1:63903\n", + " \n", + " Workers: 8\n", + "
\n", + " Dashboard: http://127.0.0.1:8787/status\n", + " \n", + " Total threads: 128\n", + "
\n", + " Started: Just now\n", + " \n", + " Total memory: 149.01 GiB\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "

Workers

\n", + "
\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "

Worker: 0

\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "
\n", + " Comm: tcp://127.0.0.1:63943\n", + " \n", + " Total threads: 16\n", + "
\n", + " Dashboard: http://127.0.0.1:63946/status\n", + " \n", + " Memory: 18.63 GiB\n", + "
\n", + " Nanny: tcp://127.0.0.1:63906\n", + "
\n", + " Local directory: C:\\Users\\data\\AppData\\Local\\Temp\\dask-worker-space\\worker-sctehcfb\n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "

Worker: 1

\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "
\n", + " Comm: tcp://127.0.0.1:63957\n", + " \n", + " Total threads: 16\n", + "
\n", + " Dashboard: http://127.0.0.1:63959/status\n", + " \n", + " Memory: 18.63 GiB\n", + "
\n", + " Nanny: tcp://127.0.0.1:63907\n", + "
\n", + " Local directory: C:\\Users\\data\\AppData\\Local\\Temp\\dask-worker-space\\worker-b1kdawd2\n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "

Worker: 2

\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "
\n", + " Comm: tcp://127.0.0.1:63948\n", + " \n", + " Total threads: 16\n", + "
\n", + " Dashboard: http://127.0.0.1:63951/status\n", + " \n", + " Memory: 18.63 GiB\n", + "
\n", + " Nanny: tcp://127.0.0.1:63908\n", + "
\n", + " Local directory: C:\\Users\\data\\AppData\\Local\\Temp\\dask-worker-space\\worker-845evwbp\n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "

Worker: 3

\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "
\n", + " Comm: tcp://127.0.0.1:63942\n", + " \n", + " Total threads: 16\n", + "
\n", + " Dashboard: http://127.0.0.1:63944/status\n", + " \n", + " Memory: 18.63 GiB\n", + "
\n", + " Nanny: tcp://127.0.0.1:63909\n", + "
\n", + " Local directory: C:\\Users\\data\\AppData\\Local\\Temp\\dask-worker-space\\worker-xneexydx\n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "

Worker: 4

\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "
\n", + " Comm: tcp://127.0.0.1:63949\n", + " \n", + " Total threads: 16\n", + "
\n", + " Dashboard: http://127.0.0.1:63953/status\n", + " \n", + " Memory: 18.63 GiB\n", + "
\n", + " Nanny: tcp://127.0.0.1:63910\n", + "
\n", + " Local directory: C:\\Users\\data\\AppData\\Local\\Temp\\dask-worker-space\\worker-zb64b79v\n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "

Worker: 5

\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "
\n", + " Comm: tcp://127.0.0.1:63950\n", + " \n", + " Total threads: 16\n", + "
\n", + " Dashboard: http://127.0.0.1:63954/status\n", + " \n", + " Memory: 18.63 GiB\n", + "
\n", + " Nanny: tcp://127.0.0.1:63911\n", + "
\n", + " Local directory: C:\\Users\\data\\AppData\\Local\\Temp\\dask-worker-space\\worker-q6lyanmx\n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "

Worker: 6

\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "
\n", + " Comm: tcp://127.0.0.1:63925\n", + " \n", + " Total threads: 16\n", + "
\n", + " Dashboard: http://127.0.0.1:63934/status\n", + " \n", + " Memory: 18.63 GiB\n", + "
\n", + " Nanny: tcp://127.0.0.1:63912\n", + "
\n", + " Local directory: C:\\Users\\data\\AppData\\Local\\Temp\\dask-worker-space\\worker-1cvfk3q5\n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "

Worker: 7

\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "
\n", + " Comm: tcp://127.0.0.1:63958\n", + " \n", + " Total threads: 16\n", + "
\n", + " Dashboard: http://127.0.0.1:63961/status\n", + " \n", + " Memory: 18.63 GiB\n", + "
\n", + " Nanny: tcp://127.0.0.1:63913\n", + "
\n", + " Local directory: C:\\Users\\data\\AppData\\Local\\Temp\\dask-worker-space\\worker-0agsu53e\n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "\n", + "
\n", + "
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from dask.distributed import Client\n", + "client = Client(n_workers=8, threads_per_worker=16, processes=True, memory_limit='20GB')\n", + "client" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Start a client for Mongo DB" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import pymongo\n", + "import xarray_mongodb\n", + "\n", + "from DataContainer.MongoDB import MongoDB\n", + "\n", + "mongoClient = pymongo.MongoClient('mongodb://control:DyLab2021@127.0.0.1:27017/?authMechanism=DEFAULT')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Set global path for experiment" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "groupList = [\n", + " \"images/MOT_3D_Camera/in_situ_absorption\",\n", + " \"images/ODT_1_Axis_Camera/in_situ_absorption\",\n", + " \"images/ODT_2_Axis_Camera/in_situ_absorption\",\n", + "]\n", + "\n", + "dskey = {\n", + " \"images/MOT_3D_Camera/in_situ_absorption\": \"camera_0\",\n", + " \"images/ODT_1_Axis_Camera/in_situ_absorption\": \"camera_1\",\n", + " \"images/ODT_2_Axis_Camera/in_situ_absorption\": \"camera_2\",\n", + "}\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "img_dir = 'C:/Users/control/DyLab/Experiments/DyBEC/'\n", + "SequenceName = \"Repetition_scan\"\n", + "folderPath = img_dir + SequenceName + \"/\" + get_date()\n", + "\n", + "mongoDB = mongoClient[SequenceName]\n", + "\n", + "DB = MongoDB(mongoClient, mongoDB, date=get_date())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Repetition Scans" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## scan MOT freq" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The detected scaning axes and values are: \n", + "\n", + "{'initial_horz_freq': array([102.75, 102.8 , 102.85, 102.9 , 102.95, 103. , 103.05]), 'initial_vert_freq': array([101.8 , 101.85, 101.9 , 101.95, 102. , 102.05, 102.1 , 102.15,\n", + " 102.2 , 102.25])}\n" + ] + }, + { + "data": { + "application/javascript": "/* Put everything inside the global mpl namespace */\n/* global mpl */\nwindow.mpl = {};\n\nmpl.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\nmpl.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_device_pixel_ratio', {\n device_pixel_ratio: fig.ratio,\n });\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\nmpl.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\nmpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n\nmpl.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 rubberband_canvas.addEventListener(\n 'dblclick',\n on_mouse_event_closure('dblclick')\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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.figure.prototype.handle_figure_label = function (fig, msg) {\n // Updates the figure title.\n fig.header.textContent = msg['label'];\n};\n\nmpl.figure.prototype.handle_cursor = function (fig, msg) {\n fig.rubberband_canvas.style.cursor = msg['cursor'];\n};\n\nmpl.figure.prototype.handle_message = function (fig, msg) {\n fig.message.textContent = msg['message'];\n};\n\nmpl.figure.prototype.handle_draw = function (fig, _msg) {\n // Request the server to send over a new figure.\n fig.send_draw_message();\n};\n\nmpl.figure.prototype.handle_image_mode = function (fig, msg) {\n fig.image_mode = msg['mode'];\n};\n\nmpl.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\nmpl.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\nmpl.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.\nmpl.figure.prototype._make_on_message_function = function (fig) {\n return function socket_on_message(evt) {\n if (evt.data instanceof Blob) {\n var img = evt.data;\n if (img.type !== 'image/png') {\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 img.type = 'image/png';\n }\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 img\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 https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\nmpl.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 * https://stackoverflow.com/a/24161582/3208463\n */\nfunction 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\nmpl.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\nmpl.figure.prototype._key_event_extra = function (_event, _name) {\n // Handle any extra behaviour associated with a key event\n};\n\nmpl.figure.prototype.key_event = function (event, name) {\n // Prevent repeat events\n if (name === 'key_press') {\n if (event.key === this._key) {\n return;\n } else {\n this._key = event.key;\n }\n }\n if (name === 'key_release') {\n this._key = null;\n }\n\n var value = '';\n if (event.ctrlKey && event.key !== 'Control') {\n value += 'ctrl+';\n }\n else if (event.altKey && event.key !== 'Alt') {\n value += 'alt+';\n }\n else if (event.shiftKey && event.key !== 'Shift') {\n value += 'shift+';\n }\n\n value += 'k' + event.key;\n\n this._key_event_extra(event, name);\n\n this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n return false;\n};\n\nmpl.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\nmpl.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\nvar _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\nmpl.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\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n\nmpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n\nmpl.default_extension = \"png\";/* global mpl */\n\nvar 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.binaryType = comm.kernel.ws.binaryType;\n ws.readyState = comm.kernel.ws.readyState;\n function updateReadyState(_event) {\n if (comm.kernel.ws) {\n ws.readyState = comm.kernel.ws.readyState;\n } else {\n ws.readyState = 3; // Closed state.\n }\n }\n comm.kernel.ws.addEventListener('open', updateReadyState);\n comm.kernel.ws.addEventListener('close', updateReadyState);\n comm.kernel.ws.addEventListener('error', updateReadyState);\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 var data = msg['content']['data'];\n if (data['blob'] !== undefined) {\n data = {\n data: new Blob(msg['buffers'], { type: data['blob'] }),\n };\n }\n // Pass the mpl event to the overridden (by mpl) onmessage function.\n ws.onmessage(data);\n });\n return ws;\n};\n\nmpl.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(\"
\");\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\nmpl.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 '';\n fig.close_ws(fig, msg);\n};\n\nmpl.figure.prototype.close_ws = function (fig, msg) {\n fig.send_message('closing', msg);\n // fig.ws.close()\n};\n\nmpl.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 '';\n};\n\nmpl.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\nmpl.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 = '';\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 = '';\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\nmpl.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\nmpl.figure.prototype._root_extra_style = function (el) {\n el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n};\n\nmpl.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\nmpl.figure.prototype._key_event_extra = function (event, _name) {\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\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n fig.ondownload(fig, null);\n};\n\nmpl.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.\nif (IPython.notebook.kernel !== null) {\n IPython.notebook.kernel.comm_manager.register_target(\n 'matplotlib',\n mpl.mpl_figure_comm\n );\n}\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%matplotlib notebook\n", + "shotNum = \"0014\"\n", + "filePath = folderPath + \"/\" + shotNum + \"/*.h5\"\n", + "\n", + "dataSetDict = {\n", + " dskey[groupList[i]]: read_hdf5_file(filePath, groupList[i])\n", + " for i in [0,1]\n", + "}\n", + "\n", + "dataSet = dataSetDict[\"camera_1\"]\n", + "\n", + "print_scanAxis(dataSet)\n", + "\n", + "scanAxis = get_scanAxis(dataSet)\n", + "\n", + "dataSet = auto_rechunk(dataSet)\n", + "\n", + "dataSet = imageAnalyser.get_absorption_images(dataSet)\n", + "\n", + "imageAnalyser.center = (310, 815)\n", + "imageAnalyser.span = (550, 1275)\n", + "imageAnalyser.fraction = (0.1, 0.1)\n", + "\n", + "dataSet_cropOD = imageAnalyser.crop_image(dataSet.OD)\n", + "dataSet_cropOD = imageAnalyser.substract_offset(dataSet_cropOD).load()\n", + "\n", + "Ncount = imageAnalyser.get_Ncount(dataSet_cropOD)\n", + "Ncount_mean = calculate_mean(Ncount)\n", + "Ncount_std = calculate_std(Ncount)\n", + "\n", + "fig = plt.figure()\n", + "ax = fig.gca()\n", + "Ncount_mean.plot.pcolormesh(ax=ax, vmin=0, cmap='jet', cbar_kwargs = dict(label='NCount'))\n", + "plt.xlabel('Vert AOM Frequency')\n", + "plt.ylabel('Horz AOM Frequency')\n", + "plt.tight_layout()\n", + "plt.show()\n", + "\n", + "# DB.create_global(shotNum, dataSet)\n", + "# DB.add_data(shotNum, dataSet_cropOD, engine='xarray')" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.DataArray 'OD' (initial_horz_freq: 1, initial_vert_freq: 1)>\n",
+       "array([[65351.30239154]])\n",
+       "Coordinates:\n",
+       "  * initial_horz_freq  (initial_horz_freq) float64 103.0\n",
+       "  * initial_vert_freq  (initial_vert_freq) float64 101.8
" + ], + "text/plain": [ + "\n", + "array([[65351.30239154]])\n", + "Coordinates:\n", + " * initial_horz_freq (initial_horz_freq) float64 103.0\n", + " * initial_vert_freq (initial_vert_freq) float64 101.8" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Ncount_mean.where(Ncount_mean==Ncount_mean.max(), drop=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## scan MOT amp" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The detected scaning axes and values are: \n", + "\n", + "{'initial_horz_amp': array([0.45, 0.49, 0.53, 0.57, 0.61, 0.65, 0.69, 0.73, 0.77, 0.81]), 'initial_vert_amp': array([0.35, 0.39, 0.43, 0.47, 0.51, 0.55, 0.59, 0.63, 0.67, 0.71])}\n" + ] + }, + { + "data": { + "application/javascript": "/* Put everything inside the global mpl namespace */\n/* global mpl */\nwindow.mpl = {};\n\nmpl.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\nmpl.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_device_pixel_ratio', {\n device_pixel_ratio: fig.ratio,\n });\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\nmpl.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\nmpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n\nmpl.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 rubberband_canvas.addEventListener(\n 'dblclick',\n on_mouse_event_closure('dblclick')\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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.figure.prototype.handle_figure_label = function (fig, msg) {\n // Updates the figure title.\n fig.header.textContent = msg['label'];\n};\n\nmpl.figure.prototype.handle_cursor = function (fig, msg) {\n fig.rubberband_canvas.style.cursor = msg['cursor'];\n};\n\nmpl.figure.prototype.handle_message = function (fig, msg) {\n fig.message.textContent = msg['message'];\n};\n\nmpl.figure.prototype.handle_draw = function (fig, _msg) {\n // Request the server to send over a new figure.\n fig.send_draw_message();\n};\n\nmpl.figure.prototype.handle_image_mode = function (fig, msg) {\n fig.image_mode = msg['mode'];\n};\n\nmpl.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\nmpl.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\nmpl.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.\nmpl.figure.prototype._make_on_message_function = function (fig) {\n return function socket_on_message(evt) {\n if (evt.data instanceof Blob) {\n var img = evt.data;\n if (img.type !== 'image/png') {\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 img.type = 'image/png';\n }\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 img\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 https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\nmpl.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 * https://stackoverflow.com/a/24161582/3208463\n */\nfunction 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\nmpl.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\nmpl.figure.prototype._key_event_extra = function (_event, _name) {\n // Handle any extra behaviour associated with a key event\n};\n\nmpl.figure.prototype.key_event = function (event, name) {\n // Prevent repeat events\n if (name === 'key_press') {\n if (event.key === this._key) {\n return;\n } else {\n this._key = event.key;\n }\n }\n if (name === 'key_release') {\n this._key = null;\n }\n\n var value = '';\n if (event.ctrlKey && event.key !== 'Control') {\n value += 'ctrl+';\n }\n else if (event.altKey && event.key !== 'Alt') {\n value += 'alt+';\n }\n else if (event.shiftKey && event.key !== 'Shift') {\n value += 'shift+';\n }\n\n value += 'k' + event.key;\n\n this._key_event_extra(event, name);\n\n this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n return false;\n};\n\nmpl.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\nmpl.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\nvar _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\nmpl.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\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n\nmpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n\nmpl.default_extension = \"png\";/* global mpl */\n\nvar 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.binaryType = comm.kernel.ws.binaryType;\n ws.readyState = comm.kernel.ws.readyState;\n function updateReadyState(_event) {\n if (comm.kernel.ws) {\n ws.readyState = comm.kernel.ws.readyState;\n } else {\n ws.readyState = 3; // Closed state.\n }\n }\n comm.kernel.ws.addEventListener('open', updateReadyState);\n comm.kernel.ws.addEventListener('close', updateReadyState);\n comm.kernel.ws.addEventListener('error', updateReadyState);\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 var data = msg['content']['data'];\n if (data['blob'] !== undefined) {\n data = {\n data: new Blob(msg['buffers'], { type: data['blob'] }),\n };\n }\n // Pass the mpl event to the overridden (by mpl) onmessage function.\n ws.onmessage(data);\n });\n return ws;\n};\n\nmpl.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(\"
\");\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\nmpl.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 '';\n fig.close_ws(fig, msg);\n};\n\nmpl.figure.prototype.close_ws = function (fig, msg) {\n fig.send_message('closing', msg);\n // fig.ws.close()\n};\n\nmpl.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 '';\n};\n\nmpl.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\nmpl.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 = '';\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 = '';\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\nmpl.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\nmpl.figure.prototype._root_extra_style = function (el) {\n el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n};\n\nmpl.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\nmpl.figure.prototype._key_event_extra = function (event, _name) {\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\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n fig.ondownload(fig, null);\n};\n\nmpl.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.\nif (IPython.notebook.kernel !== null) {\n IPython.notebook.kernel.comm_manager.register_target(\n 'matplotlib',\n mpl.mpl_figure_comm\n );\n}\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%matplotlib notebook\n", + "shotNum = \"0015\"\n", + "filePath = folderPath + \"/\" + shotNum + \"/*.h5\"\n", + "\n", + "dataSetDict = {\n", + " dskey[groupList[i]]: read_hdf5_file(filePath, groupList[i])\n", + " for i in [0,1]\n", + "}\n", + "\n", + "dataSet = dataSetDict[\"camera_1\"]\n", + "\n", + "print_scanAxis(dataSet)\n", + "\n", + "scanAxis = get_scanAxis(dataSet)\n", + "\n", + "dataSet = auto_rechunk(dataSet)\n", + "\n", + "dataSet = imageAnalyser.get_absorption_images(dataSet)\n", + "\n", + "imageAnalyser.center = (310, 815)\n", + "imageAnalyser.span = (550, 1275)\n", + "imageAnalyser.fraction = (0.1, 0.1)\n", + "\n", + "dataSet_cropOD = imageAnalyser.crop_image(dataSet.OD)\n", + "dataSet_cropOD = imageAnalyser.substract_offset(dataSet_cropOD).load()\n", + "\n", + "Ncount = imageAnalyser.get_Ncount(dataSet_cropOD)\n", + "Ncount_mean = calculate_mean(Ncount)\n", + "Ncount_std = calculate_std(Ncount)\n", + "\n", + "fig = plt.figure()\n", + "ax = fig.gca()\n", + "Ncount_mean.plot.pcolormesh(ax=ax, vmin=0, cmap='jet', cbar_kwargs = dict(label='NCount'))\n", + "plt.xlabel('Vert AOM Frequency')\n", + "plt.ylabel('Horz AOM Frequency')\n", + "plt.tight_layout()\n", + "plt.show()\n", + "\n", + "# DB.create_global(shotNum, dataSet)\n", + "# DB.add_data(shotNum, dataSet_cropOD, engine='xarray')" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.DataArray 'OD' (initial_horz_amp: 1, initial_vert_amp: 1)>\n",
+       "array([[70751.40524034]])\n",
+       "Coordinates:\n",
+       "  * initial_horz_amp  (initial_horz_amp) float64 0.81\n",
+       "  * initial_vert_amp  (initial_vert_amp) float64 0.59
" + ], + "text/plain": [ + "\n", + "array([[70751.40524034]])\n", + "Coordinates:\n", + " * initial_horz_amp (initial_horz_amp) float64 0.81\n", + " * initial_vert_amp (initial_vert_amp) float64 0.59" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Ncount_mean.where(Ncount_mean==Ncount_mean.max(), drop=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Scan final Z Comp Current" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The detected scaning axes and values are: \n", + "\n", + "{'compZ_final_current': array([0.233, 0.234, 0.235, 0.236, 0.237, 0.238, 0.239, 0.24 , 0.241,\n", + " 0.242]), 'runs': array([0., 1., 2.])}\n" + ] + }, + { + "data": { + "application/javascript": "/* Put everything inside the global mpl namespace */\n/* global mpl */\nwindow.mpl = {};\n\nmpl.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\nmpl.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_device_pixel_ratio', {\n device_pixel_ratio: fig.ratio,\n });\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\nmpl.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\nmpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n\nmpl.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 rubberband_canvas.addEventListener(\n 'dblclick',\n on_mouse_event_closure('dblclick')\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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.figure.prototype.handle_figure_label = function (fig, msg) {\n // Updates the figure title.\n fig.header.textContent = msg['label'];\n};\n\nmpl.figure.prototype.handle_cursor = function (fig, msg) {\n fig.rubberband_canvas.style.cursor = msg['cursor'];\n};\n\nmpl.figure.prototype.handle_message = function (fig, msg) {\n fig.message.textContent = msg['message'];\n};\n\nmpl.figure.prototype.handle_draw = function (fig, _msg) {\n // Request the server to send over a new figure.\n fig.send_draw_message();\n};\n\nmpl.figure.prototype.handle_image_mode = function (fig, msg) {\n fig.image_mode = msg['mode'];\n};\n\nmpl.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\nmpl.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\nmpl.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.\nmpl.figure.prototype._make_on_message_function = function (fig) {\n return function socket_on_message(evt) {\n if (evt.data instanceof Blob) {\n var img = evt.data;\n if (img.type !== 'image/png') {\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 img.type = 'image/png';\n }\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 img\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 https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\nmpl.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 * https://stackoverflow.com/a/24161582/3208463\n */\nfunction 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\nmpl.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\nmpl.figure.prototype._key_event_extra = function (_event, _name) {\n // Handle any extra behaviour associated with a key event\n};\n\nmpl.figure.prototype.key_event = function (event, name) {\n // Prevent repeat events\n if (name === 'key_press') {\n if (event.key === this._key) {\n return;\n } else {\n this._key = event.key;\n }\n }\n if (name === 'key_release') {\n this._key = null;\n }\n\n var value = '';\n if (event.ctrlKey && event.key !== 'Control') {\n value += 'ctrl+';\n }\n else if (event.altKey && event.key !== 'Alt') {\n value += 'alt+';\n }\n else if (event.shiftKey && event.key !== 'Shift') {\n value += 'shift+';\n }\n\n value += 'k' + event.key;\n\n this._key_event_extra(event, name);\n\n this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n return false;\n};\n\nmpl.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\nmpl.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\nvar _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\nmpl.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\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n\nmpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n\nmpl.default_extension = \"png\";/* global mpl */\n\nvar 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.binaryType = comm.kernel.ws.binaryType;\n ws.readyState = comm.kernel.ws.readyState;\n function updateReadyState(_event) {\n if (comm.kernel.ws) {\n ws.readyState = comm.kernel.ws.readyState;\n } else {\n ws.readyState = 3; // Closed state.\n }\n }\n comm.kernel.ws.addEventListener('open', updateReadyState);\n comm.kernel.ws.addEventListener('close', updateReadyState);\n comm.kernel.ws.addEventListener('error', updateReadyState);\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 var data = msg['content']['data'];\n if (data['blob'] !== undefined) {\n data = {\n data: new Blob(msg['buffers'], { type: data['blob'] }),\n };\n }\n // Pass the mpl event to the overridden (by mpl) onmessage function.\n ws.onmessage(data);\n });\n return ws;\n};\n\nmpl.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(\"
\");\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\nmpl.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 '';\n fig.close_ws(fig, msg);\n};\n\nmpl.figure.prototype.close_ws = function (fig, msg) {\n fig.send_message('closing', msg);\n // fig.ws.close()\n};\n\nmpl.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 '';\n};\n\nmpl.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\nmpl.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 = '';\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 = '';\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\nmpl.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\nmpl.figure.prototype._root_extra_style = function (el) {\n el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n};\n\nmpl.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\nmpl.figure.prototype._key_event_extra = function (event, _name) {\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\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n fig.ondownload(fig, null);\n};\n\nmpl.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.\nif (IPython.notebook.kernel !== null) {\n IPython.notebook.kernel.comm_manager.register_target(\n 'matplotlib',\n mpl.mpl_figure_comm\n );\n}\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%matplotlib notebook\n", + "shotNum = \"0018\"\n", + "filePath = folderPath + \"/\" + shotNum + \"/*.h5\"\n", + "\n", + "dataSetDict = {\n", + " dskey[groupList[i]]: read_hdf5_file(filePath, groupList[i])\n", + " for i in [0, 1]\n", + "}\n", + "\n", + "dataSet = dataSetDict[\"camera_1\"]\n", + "\n", + "print_scanAxis(dataSet)\n", + "\n", + "scanAxis = get_scanAxis(dataSet)\n", + "\n", + "dataSet = auto_rechunk(dataSet)\n", + "\n", + "dataSet = imageAnalyser.get_absorption_images(dataSet)\n", + "\n", + "imageAnalyser.center = (325, 875)\n", + "imageAnalyser.span = (500, 500)\n", + "imageAnalyser.fraction = (0.1, 0.1)\n", + "\n", + "dataSet_cropOD = imageAnalyser.crop_image(dataSet.OD)\n", + "dataSet_cropOD = imageAnalyser.substract_offset(dataSet_cropOD).load()\n", + "\n", + "Ncount = imageAnalyser.get_Ncount(dataSet_cropOD)\n", + "Ncount_mean = calculate_mean(Ncount)\n", + "Ncount_std = calculate_std(Ncount)\n", + "\n", + "fig = plt.figure()\n", + "ax = fig.gca()\n", + "Ncount_mean.plot.errorbar(ax=ax, yerr = Ncount_std, fmt='ob')\n", + "#plt.xlabel('')\n", + "plt.ylabel('NCount')\n", + "plt.tight_layout()\n", + "plt.grid(visible=1)\n", + "plt.show()\n", + "\n", + "# DB.create_global(shotNum, dataSet)\n", + "# DB.add_data(shotNum, dataSet_cropOD, engine='xarray')" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.DataArray 'OD' (compZ_final_current: 1)>\n",
+       "array([26642.0066982])\n",
+       "Coordinates:\n",
+       "  * compZ_final_current  (compZ_final_current) float64 0.238
" + ], + "text/plain": [ + "\n", + "array([26642.0066982])\n", + "Coordinates:\n", + " * compZ_final_current (compZ_final_current) float64 0.238" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Ncount_mean.where(Ncount_mean==Ncount_mean.max(), drop=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Scan final horz amp" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The detected scaning axes and values are: \n", + "\n", + "{'final_horz_amp': array([5.0e-05, 7.0e-05, 9.0e-05, 1.1e-04, 1.3e-04, 1.5e-04, 1.7e-04,\n", + " 1.9e-04, 2.1e-04, 2.3e-04, 2.5e-04]), 'runs': array([0., 1., 2.])}\n" + ] + }, + { + "data": { + "application/javascript": "/* Put everything inside the global mpl namespace */\n/* global mpl */\nwindow.mpl = {};\n\nmpl.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\nmpl.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_device_pixel_ratio', {\n device_pixel_ratio: fig.ratio,\n });\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\nmpl.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\nmpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n\nmpl.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 rubberband_canvas.addEventListener(\n 'dblclick',\n on_mouse_event_closure('dblclick')\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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.figure.prototype.handle_figure_label = function (fig, msg) {\n // Updates the figure title.\n fig.header.textContent = msg['label'];\n};\n\nmpl.figure.prototype.handle_cursor = function (fig, msg) {\n fig.rubberband_canvas.style.cursor = msg['cursor'];\n};\n\nmpl.figure.prototype.handle_message = function (fig, msg) {\n fig.message.textContent = msg['message'];\n};\n\nmpl.figure.prototype.handle_draw = function (fig, _msg) {\n // Request the server to send over a new figure.\n fig.send_draw_message();\n};\n\nmpl.figure.prototype.handle_image_mode = function (fig, msg) {\n fig.image_mode = msg['mode'];\n};\n\nmpl.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\nmpl.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\nmpl.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.\nmpl.figure.prototype._make_on_message_function = function (fig) {\n return function socket_on_message(evt) {\n if (evt.data instanceof Blob) {\n var img = evt.data;\n if (img.type !== 'image/png') {\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 img.type = 'image/png';\n }\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 img\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 https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\nmpl.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 * https://stackoverflow.com/a/24161582/3208463\n */\nfunction 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\nmpl.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\nmpl.figure.prototype._key_event_extra = function (_event, _name) {\n // Handle any extra behaviour associated with a key event\n};\n\nmpl.figure.prototype.key_event = function (event, name) {\n // Prevent repeat events\n if (name === 'key_press') {\n if (event.key === this._key) {\n return;\n } else {\n this._key = event.key;\n }\n }\n if (name === 'key_release') {\n this._key = null;\n }\n\n var value = '';\n if (event.ctrlKey && event.key !== 'Control') {\n value += 'ctrl+';\n }\n else if (event.altKey && event.key !== 'Alt') {\n value += 'alt+';\n }\n else if (event.shiftKey && event.key !== 'Shift') {\n value += 'shift+';\n }\n\n value += 'k' + event.key;\n\n this._key_event_extra(event, name);\n\n this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n return false;\n};\n\nmpl.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\nmpl.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\nvar _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\nmpl.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\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n\nmpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n\nmpl.default_extension = \"png\";/* global mpl */\n\nvar 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.binaryType = comm.kernel.ws.binaryType;\n ws.readyState = comm.kernel.ws.readyState;\n function updateReadyState(_event) {\n if (comm.kernel.ws) {\n ws.readyState = comm.kernel.ws.readyState;\n } else {\n ws.readyState = 3; // Closed state.\n }\n }\n comm.kernel.ws.addEventListener('open', updateReadyState);\n comm.kernel.ws.addEventListener('close', updateReadyState);\n comm.kernel.ws.addEventListener('error', updateReadyState);\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 var data = msg['content']['data'];\n if (data['blob'] !== undefined) {\n data = {\n data: new Blob(msg['buffers'], { type: data['blob'] }),\n };\n }\n // Pass the mpl event to the overridden (by mpl) onmessage function.\n ws.onmessage(data);\n });\n return ws;\n};\n\nmpl.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(\"
\");\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\nmpl.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 '';\n fig.close_ws(fig, msg);\n};\n\nmpl.figure.prototype.close_ws = function (fig, msg) {\n fig.send_message('closing', msg);\n // fig.ws.close()\n};\n\nmpl.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 '';\n};\n\nmpl.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\nmpl.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 = '';\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 = '';\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\nmpl.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\nmpl.figure.prototype._root_extra_style = function (el) {\n el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n};\n\nmpl.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\nmpl.figure.prototype._key_event_extra = function (event, _name) {\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\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n fig.ondownload(fig, null);\n};\n\nmpl.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.\nif (IPython.notebook.kernel !== null) {\n IPython.notebook.kernel.comm_manager.register_target(\n 'matplotlib',\n mpl.mpl_figure_comm\n );\n}\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%matplotlib notebook\n", + "shotNum = \"0019\"\n", + "filePath = folderPath + \"/\" + shotNum + \"/*.h5\"\n", + "\n", + "dataSetDict = {\n", + " dskey[groupList[i]]: read_hdf5_file(filePath, groupList[i])\n", + " for i in [0, 1]\n", + "}\n", + "\n", + "dataSet = dataSetDict[\"camera_1\"]\n", + "\n", + "print_scanAxis(dataSet)\n", + "\n", + "scanAxis = get_scanAxis(dataSet)\n", + "\n", + "dataSet = auto_rechunk(dataSet)\n", + "\n", + "dataSet = imageAnalyser.get_absorption_images(dataSet)\n", + "\n", + "imageAnalyser.center = (325, 875)\n", + "imageAnalyser.span = (500, 500)\n", + "imageAnalyser.fraction = (0.1, 0.1)\n", + "\n", + "dataSet_cropOD = imageAnalyser.crop_image(dataSet.OD)\n", + "dataSet_cropOD = imageAnalyser.substract_offset(dataSet_cropOD).load()\n", + "\n", + "Ncount = imageAnalyser.get_Ncount(dataSet_cropOD)\n", + "Ncount_mean = calculate_mean(Ncount)\n", + "Ncount_std = calculate_std(Ncount)\n", + "\n", + "fig = plt.figure()\n", + "ax = fig.gca()\n", + "Ncount_mean.plot.errorbar(ax=ax, yerr = Ncount_std, fmt='ob')\n", + "#plt.xlabel('')\n", + "plt.ylabel('NCount')\n", + "plt.tight_layout()\n", + "plt.grid(visible=1)\n", + "plt.show()\n", + "\n", + "# DB.create_global(shotNum, dataSet)\n", + "# DB.add_data(shotNum, dataSet_cropOD, engine='xarray')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "Ncount_mean.where(Ncount_mean==Ncount_mean.max(), drop=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Scan final horz freq" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The detected scaning axes and values are: \n", + "\n", + "{'final_horz_freq': array([104.05 , 104.055, 104.06 , 104.065, 104.07 , 104.075, 104.08 ,\n", + " 104.085, 104.09 , 104.095, 104.1 ]), 'runs': array([0., 1., 2.])}\n" + ] + }, + { + "data": { + "application/javascript": "/* Put everything inside the global mpl namespace */\n/* global mpl */\nwindow.mpl = {};\n\nmpl.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\nmpl.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_device_pixel_ratio', {\n device_pixel_ratio: fig.ratio,\n });\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\nmpl.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\nmpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n\nmpl.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 rubberband_canvas.addEventListener(\n 'dblclick',\n on_mouse_event_closure('dblclick')\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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.figure.prototype.handle_figure_label = function (fig, msg) {\n // Updates the figure title.\n fig.header.textContent = msg['label'];\n};\n\nmpl.figure.prototype.handle_cursor = function (fig, msg) {\n fig.rubberband_canvas.style.cursor = msg['cursor'];\n};\n\nmpl.figure.prototype.handle_message = function (fig, msg) {\n fig.message.textContent = msg['message'];\n};\n\nmpl.figure.prototype.handle_draw = function (fig, _msg) {\n // Request the server to send over a new figure.\n fig.send_draw_message();\n};\n\nmpl.figure.prototype.handle_image_mode = function (fig, msg) {\n fig.image_mode = msg['mode'];\n};\n\nmpl.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\nmpl.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\nmpl.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.\nmpl.figure.prototype._make_on_message_function = function (fig) {\n return function socket_on_message(evt) {\n if (evt.data instanceof Blob) {\n var img = evt.data;\n if (img.type !== 'image/png') {\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 img.type = 'image/png';\n }\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 img\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 https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\nmpl.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 * https://stackoverflow.com/a/24161582/3208463\n */\nfunction 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\nmpl.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\nmpl.figure.prototype._key_event_extra = function (_event, _name) {\n // Handle any extra behaviour associated with a key event\n};\n\nmpl.figure.prototype.key_event = function (event, name) {\n // Prevent repeat events\n if (name === 'key_press') {\n if (event.key === this._key) {\n return;\n } else {\n this._key = event.key;\n }\n }\n if (name === 'key_release') {\n this._key = null;\n }\n\n var value = '';\n if (event.ctrlKey && event.key !== 'Control') {\n value += 'ctrl+';\n }\n else if (event.altKey && event.key !== 'Alt') {\n value += 'alt+';\n }\n else if (event.shiftKey && event.key !== 'Shift') {\n value += 'shift+';\n }\n\n value += 'k' + event.key;\n\n this._key_event_extra(event, name);\n\n this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n return false;\n};\n\nmpl.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\nmpl.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\nvar _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\nmpl.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\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n\nmpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n\nmpl.default_extension = \"png\";/* global mpl */\n\nvar 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.binaryType = comm.kernel.ws.binaryType;\n ws.readyState = comm.kernel.ws.readyState;\n function updateReadyState(_event) {\n if (comm.kernel.ws) {\n ws.readyState = comm.kernel.ws.readyState;\n } else {\n ws.readyState = 3; // Closed state.\n }\n }\n comm.kernel.ws.addEventListener('open', updateReadyState);\n comm.kernel.ws.addEventListener('close', updateReadyState);\n comm.kernel.ws.addEventListener('error', updateReadyState);\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 var data = msg['content']['data'];\n if (data['blob'] !== undefined) {\n data = {\n data: new Blob(msg['buffers'], { type: data['blob'] }),\n };\n }\n // Pass the mpl event to the overridden (by mpl) onmessage function.\n ws.onmessage(data);\n });\n return ws;\n};\n\nmpl.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(\"
\");\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\nmpl.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 '';\n fig.close_ws(fig, msg);\n};\n\nmpl.figure.prototype.close_ws = function (fig, msg) {\n fig.send_message('closing', msg);\n // fig.ws.close()\n};\n\nmpl.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 '';\n};\n\nmpl.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\nmpl.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 = '';\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 = '';\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\nmpl.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\nmpl.figure.prototype._root_extra_style = function (el) {\n el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n};\n\nmpl.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\nmpl.figure.prototype._key_event_extra = function (event, _name) {\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\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n fig.ondownload(fig, null);\n};\n\nmpl.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.\nif (IPython.notebook.kernel !== null) {\n IPython.notebook.kernel.comm_manager.register_target(\n 'matplotlib',\n mpl.mpl_figure_comm\n );\n}\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%matplotlib notebook\n", + "shotNum = \"0020\"\n", + "filePath = folderPath + \"/\" + shotNum + \"/*.h5\"\n", + "\n", + "dataSetDict = {\n", + " dskey[groupList[i]]: read_hdf5_file(filePath, groupList[i])\n", + " for i in [0, 1]\n", + "}\n", + "\n", + "dataSet = dataSetDict[\"camera_1\"]\n", + "\n", + "print_scanAxis(dataSet)\n", + "\n", + "scanAxis = get_scanAxis(dataSet)\n", + "\n", + "dataSet = auto_rechunk(dataSet)\n", + "\n", + "dataSet = imageAnalyser.get_absorption_images(dataSet)\n", + "\n", + "imageAnalyser.center = (325, 875)\n", + "imageAnalyser.span = (500, 500)\n", + "imageAnalyser.fraction = (0.1, 0.1)\n", + "\n", + "dataSet_cropOD = imageAnalyser.crop_image(dataSet.OD)\n", + "dataSet_cropOD = imageAnalyser.substract_offset(dataSet_cropOD).load()\n", + "\n", + "Ncount = imageAnalyser.get_Ncount(dataSet_cropOD)\n", + "Ncount_mean = calculate_mean(Ncount)\n", + "Ncount_std = calculate_std(Ncount)\n", + "\n", + "fig = plt.figure()\n", + "ax = fig.gca()\n", + "Ncount_mean.plot.errorbar(ax=ax, yerr = Ncount_std, fmt='ob')\n", + "#plt.xlabel('')\n", + "plt.ylabel('NCount')\n", + "plt.tight_layout()\n", + "plt.grid(visible=1)\n", + "plt.show()\n", + "\n", + "# DB.create_global(shotNum, dataSet)\n", + "# DB.add_data(shotNum, dataSet_cropOD, engine='xarray')" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.DataArray 'OD' (final_horz_freq: 1)>\n",
+       "array([28952.76637914])\n",
+       "Coordinates:\n",
+       "  * final_horz_freq  (final_horz_freq) float64 104.1
" + ], + "text/plain": [ + "\n", + "array([28952.76637914])\n", + "Coordinates:\n", + " * final_horz_freq (final_horz_freq) float64 104.1" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Ncount_mean.where(Ncount_mean==Ncount_mean.max(), drop=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Scan final vert amp" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The detected scaning axes and values are: \n", + "\n", + "{'final_vert_amp': array([0.035, 0.037, 0.039, 0.041, 0.043, 0.045, 0.047, 0.049, 0.051,\n", + " 0.053, 0.055, 0.057, 0.059, 0.061, 0.063]), 'runs': array([0., 1., 2.])}\n" + ] + }, + { + "data": { + "application/javascript": "/* Put everything inside the global mpl namespace */\n/* global mpl */\nwindow.mpl = {};\n\nmpl.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\nmpl.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_device_pixel_ratio', {\n device_pixel_ratio: fig.ratio,\n });\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\nmpl.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\nmpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n\nmpl.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 rubberband_canvas.addEventListener(\n 'dblclick',\n on_mouse_event_closure('dblclick')\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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.figure.prototype.handle_figure_label = function (fig, msg) {\n // Updates the figure title.\n fig.header.textContent = msg['label'];\n};\n\nmpl.figure.prototype.handle_cursor = function (fig, msg) {\n fig.rubberband_canvas.style.cursor = msg['cursor'];\n};\n\nmpl.figure.prototype.handle_message = function (fig, msg) {\n fig.message.textContent = msg['message'];\n};\n\nmpl.figure.prototype.handle_draw = function (fig, _msg) {\n // Request the server to send over a new figure.\n fig.send_draw_message();\n};\n\nmpl.figure.prototype.handle_image_mode = function (fig, msg) {\n fig.image_mode = msg['mode'];\n};\n\nmpl.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\nmpl.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\nmpl.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.\nmpl.figure.prototype._make_on_message_function = function (fig) {\n return function socket_on_message(evt) {\n if (evt.data instanceof Blob) {\n var img = evt.data;\n if (img.type !== 'image/png') {\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 img.type = 'image/png';\n }\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 img\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 https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\nmpl.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 * https://stackoverflow.com/a/24161582/3208463\n */\nfunction 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\nmpl.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\nmpl.figure.prototype._key_event_extra = function (_event, _name) {\n // Handle any extra behaviour associated with a key event\n};\n\nmpl.figure.prototype.key_event = function (event, name) {\n // Prevent repeat events\n if (name === 'key_press') {\n if (event.key === this._key) {\n return;\n } else {\n this._key = event.key;\n }\n }\n if (name === 'key_release') {\n this._key = null;\n }\n\n var value = '';\n if (event.ctrlKey && event.key !== 'Control') {\n value += 'ctrl+';\n }\n else if (event.altKey && event.key !== 'Alt') {\n value += 'alt+';\n }\n else if (event.shiftKey && event.key !== 'Shift') {\n value += 'shift+';\n }\n\n value += 'k' + event.key;\n\n this._key_event_extra(event, name);\n\n this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n return false;\n};\n\nmpl.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\nmpl.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\nvar _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\nmpl.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\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n\nmpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n\nmpl.default_extension = \"png\";/* global mpl */\n\nvar 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.binaryType = comm.kernel.ws.binaryType;\n ws.readyState = comm.kernel.ws.readyState;\n function updateReadyState(_event) {\n if (comm.kernel.ws) {\n ws.readyState = comm.kernel.ws.readyState;\n } else {\n ws.readyState = 3; // Closed state.\n }\n }\n comm.kernel.ws.addEventListener('open', updateReadyState);\n comm.kernel.ws.addEventListener('close', updateReadyState);\n comm.kernel.ws.addEventListener('error', updateReadyState);\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 var data = msg['content']['data'];\n if (data['blob'] !== undefined) {\n data = {\n data: new Blob(msg['buffers'], { type: data['blob'] }),\n };\n }\n // Pass the mpl event to the overridden (by mpl) onmessage function.\n ws.onmessage(data);\n });\n return ws;\n};\n\nmpl.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(\"
\");\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\nmpl.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 '';\n fig.close_ws(fig, msg);\n};\n\nmpl.figure.prototype.close_ws = function (fig, msg) {\n fig.send_message('closing', msg);\n // fig.ws.close()\n};\n\nmpl.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 '';\n};\n\nmpl.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\nmpl.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 = '';\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 = '';\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\nmpl.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\nmpl.figure.prototype._root_extra_style = function (el) {\n el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n};\n\nmpl.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\nmpl.figure.prototype._key_event_extra = function (event, _name) {\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\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n fig.ondownload(fig, null);\n};\n\nmpl.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.\nif (IPython.notebook.kernel !== null) {\n IPython.notebook.kernel.comm_manager.register_target(\n 'matplotlib',\n mpl.mpl_figure_comm\n );\n}\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%matplotlib notebook\n", + "shotNum = \"0021\"\n", + "filePath = folderPath + \"/\" + shotNum + \"/*.h5\"\n", + "\n", + "dataSetDict = {\n", + " dskey[groupList[i]]: read_hdf5_file(filePath, groupList[i])\n", + " for i in [0, 1]\n", + "}\n", + "\n", + "dataSet = dataSetDict[\"camera_1\"]\n", + "\n", + "print_scanAxis(dataSet)\n", + "\n", + "scanAxis = get_scanAxis(dataSet)\n", + "\n", + "dataSet = auto_rechunk(dataSet)\n", + "\n", + "dataSet = imageAnalyser.get_absorption_images(dataSet)\n", + "\n", + "imageAnalyser.center = (325, 875)\n", + "imageAnalyser.span = (500, 500)\n", + "imageAnalyser.fraction = (0.1, 0.1)\n", + "\n", + "dataSet_cropOD = imageAnalyser.crop_image(dataSet.OD)\n", + "dataSet_cropOD = imageAnalyser.substract_offset(dataSet_cropOD).load()\n", + "\n", + "Ncount = imageAnalyser.get_Ncount(dataSet_cropOD)\n", + "Ncount_mean = calculate_mean(Ncount)\n", + "Ncount_std = calculate_std(Ncount)\n", + "\n", + "fig = plt.figure()\n", + "ax = fig.gca()\n", + "Ncount_mean.plot.errorbar(ax=ax, yerr = Ncount_std, fmt='ob')\n", + "#plt.xlabel('')\n", + "plt.ylabel('NCount')\n", + "plt.tight_layout()\n", + "plt.grid(visible=1)\n", + "plt.show()\n", + "\n", + "# DB.create_global(shotNum, dataSet)\n", + "# DB.add_data(shotNum, dataSet_cropOD, engine='xarray')" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.DataArray 'OD' (final_vert_amp: 1)>\n",
+       "array([29676.45060443])\n",
+       "Coordinates:\n",
+       "  * final_vert_amp  (final_vert_amp) float64 0.045
" + ], + "text/plain": [ + "\n", + "array([29676.45060443])\n", + "Coordinates:\n", + " * final_vert_amp (final_vert_amp) float64 0.045" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Ncount_mean.where(Ncount_mean==Ncount_mean.max(), drop=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Evaporative Cooling" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "img_dir = 'C:/Users/control/DyLab/Experiments/DyBEC/'\n", + "# img_dir = '//DyLabNAS/Data/'\n", + "SequenceName = \"Evaporative_Cooling\"\n", + "folderPath = img_dir + SequenceName + \"/\" + get_date()\n", + "\n", + "mongoDB = mongoClient[SequenceName]\n", + "\n", + "DB = MongoDB(mongoClient, mongoDB, date=get_date())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Measure trap frequency at various points of evap 2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Horz TF due to arm 1: blink on modulation = 0, blink_off_modulation = 0.35 in 700 µs, hold of 1 s" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Truncation: 0.5" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The detected scaning axes and values are: \n", + "\n", + "{'mod_blink_on_time': array([0.005, 0.006, 0.007, 0.008, 0.009, 0.01 , 0.011, 0.012, 0.013,\n", + " 0.014, 0.015, 0.016, 0.017, 0.018, 0.019]), 'runs': array([0., 1., 2., 3.])}\n" + ] + }, + { + "data": { + "application/javascript": "/* Put everything inside the global mpl namespace */\n/* global mpl */\nwindow.mpl = {};\n\nmpl.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\nmpl.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_device_pixel_ratio', {\n device_pixel_ratio: fig.ratio,\n });\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\nmpl.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\nmpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n\nmpl.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 rubberband_canvas.addEventListener(\n 'dblclick',\n on_mouse_event_closure('dblclick')\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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.figure.prototype.handle_figure_label = function (fig, msg) {\n // Updates the figure title.\n fig.header.textContent = msg['label'];\n};\n\nmpl.figure.prototype.handle_cursor = function (fig, msg) {\n fig.rubberband_canvas.style.cursor = msg['cursor'];\n};\n\nmpl.figure.prototype.handle_message = function (fig, msg) {\n fig.message.textContent = msg['message'];\n};\n\nmpl.figure.prototype.handle_draw = function (fig, _msg) {\n // Request the server to send over a new figure.\n fig.send_draw_message();\n};\n\nmpl.figure.prototype.handle_image_mode = function (fig, msg) {\n fig.image_mode = msg['mode'];\n};\n\nmpl.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\nmpl.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\nmpl.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.\nmpl.figure.prototype._make_on_message_function = function (fig) {\n return function socket_on_message(evt) {\n if (evt.data instanceof Blob) {\n var img = evt.data;\n if (img.type !== 'image/png') {\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 img.type = 'image/png';\n }\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 img\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 https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\nmpl.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 * https://stackoverflow.com/a/24161582/3208463\n */\nfunction 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\nmpl.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\nmpl.figure.prototype._key_event_extra = function (_event, _name) {\n // Handle any extra behaviour associated with a key event\n};\n\nmpl.figure.prototype.key_event = function (event, name) {\n // Prevent repeat events\n if (name === 'key_press') {\n if (event.key === this._key) {\n return;\n } else {\n this._key = event.key;\n }\n }\n if (name === 'key_release') {\n this._key = null;\n }\n\n var value = '';\n if (event.ctrlKey && event.key !== 'Control') {\n value += 'ctrl+';\n }\n else if (event.altKey && event.key !== 'Alt') {\n value += 'alt+';\n }\n else if (event.shiftKey && event.key !== 'Shift') {\n value += 'shift+';\n }\n\n value += 'k' + event.key;\n\n this._key_event_extra(event, name);\n\n this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n return false;\n};\n\nmpl.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\nmpl.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\nvar _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\nmpl.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\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n\nmpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n\nmpl.default_extension = \"png\";/* global mpl */\n\nvar 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.binaryType = comm.kernel.ws.binaryType;\n ws.readyState = comm.kernel.ws.readyState;\n function updateReadyState(_event) {\n if (comm.kernel.ws) {\n ws.readyState = comm.kernel.ws.readyState;\n } else {\n ws.readyState = 3; // Closed state.\n }\n }\n comm.kernel.ws.addEventListener('open', updateReadyState);\n comm.kernel.ws.addEventListener('close', updateReadyState);\n comm.kernel.ws.addEventListener('error', updateReadyState);\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 var data = msg['content']['data'];\n if (data['blob'] !== undefined) {\n data = {\n data: new Blob(msg['buffers'], { type: data['blob'] }),\n };\n }\n // Pass the mpl event to the overridden (by mpl) onmessage function.\n ws.onmessage(data);\n });\n return ws;\n};\n\nmpl.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(\"
\");\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\nmpl.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 '';\n fig.close_ws(fig, msg);\n};\n\nmpl.figure.prototype.close_ws = function (fig, msg) {\n fig.send_message('closing', msg);\n // fig.ws.close()\n};\n\nmpl.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 '';\n};\n\nmpl.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\nmpl.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 = '';\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 = '';\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\nmpl.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\nmpl.figure.prototype._root_extra_style = function (el) {\n el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n};\n\nmpl.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\nmpl.figure.prototype._key_event_extra = function (event, _name) {\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\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n fig.ondownload(fig, null);\n};\n\nmpl.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.\nif (IPython.notebook.kernel !== null) {\n IPython.notebook.kernel.comm_manager.register_target(\n 'matplotlib',\n mpl.mpl_figure_comm\n );\n}\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%matplotlib notebook\n", + "shotNum = \"0004\"\n", + "filePath = folderPath + \"/\" + shotNum + \"/*.h5\"\n", + "\n", + "dataSetDict = {\n", + " dskey[groupList[i]]: read_hdf5_file(filePath, groupList[i], excludeAxis = ['sweep_start_freq', 'sweep_stop_freq'])\n", + " for i in [0]\n", + "}\n", + "\n", + "dataSet = dataSetDict[\"camera_0\"]\n", + "\n", + "print_scanAxis(dataSet)\n", + "\n", + "scanAxis = get_scanAxis(dataSet)\n", + "\n", + "dataSet = auto_rechunk(dataSet)\n", + "\n", + "dataSet = imageAnalyser.get_absorption_images(dataSet)\n", + "\n", + "imageAnalyser.center = (800, 900)\n", + "imageAnalyser.span = (300, 300)\n", + "imageAnalyser.fraction = (0.1, 0.1)\n", + "\n", + "dataSet_cropOD = imageAnalyser.crop_image(dataSet.OD)\n", + "dataSet_cropOD = imageAnalyser.substract_offset(dataSet_cropOD).load()\n", + "\n", + "Ncount = imageAnalyser.get_Ncount(dataSet_cropOD)\n", + "Ncount_mean = calculate_mean(Ncount)\n", + "Ncount_std = calculate_std(Ncount)\n", + "\n", + "fig = plt.figure()\n", + "ax = fig.gca()\n", + "Ncount_mean.plot.errorbar(ax=ax, yerr = None, fmt='ob')\n", + "plt.ylabel('NCount')\n", + "plt.tight_layout()\n", + "plt.grid(visible=1)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": {}, + "outputs": [], + "source": [ + "dataSet_cropOD_chunk = dataSet_cropOD.chunk((1, 300, 300))\n", + "fitAnalyser = FitAnalyser(\"Gaussian-2D\", fitDim=2)\n", + "params = fitAnalyser.guess(dataSet_cropOD_chunk, dask=\"parallelized\")\n", + "fitResult = fitAnalyser.fit(dataSet_cropOD_chunk, params, dask=\"parallelized\").load()" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": "/* Put everything inside the global mpl namespace */\n/* global mpl */\nwindow.mpl = {};\n\nmpl.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\nmpl.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_device_pixel_ratio', {\n device_pixel_ratio: fig.ratio,\n });\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\nmpl.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\nmpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n\nmpl.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 rubberband_canvas.addEventListener(\n 'dblclick',\n on_mouse_event_closure('dblclick')\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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.figure.prototype.handle_figure_label = function (fig, msg) {\n // Updates the figure title.\n fig.header.textContent = msg['label'];\n};\n\nmpl.figure.prototype.handle_cursor = function (fig, msg) {\n fig.rubberband_canvas.style.cursor = msg['cursor'];\n};\n\nmpl.figure.prototype.handle_message = function (fig, msg) {\n fig.message.textContent = msg['message'];\n};\n\nmpl.figure.prototype.handle_draw = function (fig, _msg) {\n // Request the server to send over a new figure.\n fig.send_draw_message();\n};\n\nmpl.figure.prototype.handle_image_mode = function (fig, msg) {\n fig.image_mode = msg['mode'];\n};\n\nmpl.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\nmpl.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\nmpl.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.\nmpl.figure.prototype._make_on_message_function = function (fig) {\n return function socket_on_message(evt) {\n if (evt.data instanceof Blob) {\n var img = evt.data;\n if (img.type !== 'image/png') {\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 img.type = 'image/png';\n }\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 img\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 https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\nmpl.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 * https://stackoverflow.com/a/24161582/3208463\n */\nfunction 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\nmpl.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\nmpl.figure.prototype._key_event_extra = function (_event, _name) {\n // Handle any extra behaviour associated with a key event\n};\n\nmpl.figure.prototype.key_event = function (event, name) {\n // Prevent repeat events\n if (name === 'key_press') {\n if (event.key === this._key) {\n return;\n } else {\n this._key = event.key;\n }\n }\n if (name === 'key_release') {\n this._key = null;\n }\n\n var value = '';\n if (event.ctrlKey && event.key !== 'Control') {\n value += 'ctrl+';\n }\n else if (event.altKey && event.key !== 'Alt') {\n value += 'alt+';\n }\n else if (event.shiftKey && event.key !== 'Shift') {\n value += 'shift+';\n }\n\n value += 'k' + event.key;\n\n this._key_event_extra(event, name);\n\n this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n return false;\n};\n\nmpl.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\nmpl.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\nvar _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\nmpl.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\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n\nmpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n\nmpl.default_extension = \"png\";/* global mpl */\n\nvar 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.binaryType = comm.kernel.ws.binaryType;\n ws.readyState = comm.kernel.ws.readyState;\n function updateReadyState(_event) {\n if (comm.kernel.ws) {\n ws.readyState = comm.kernel.ws.readyState;\n } else {\n ws.readyState = 3; // Closed state.\n }\n }\n comm.kernel.ws.addEventListener('open', updateReadyState);\n comm.kernel.ws.addEventListener('close', updateReadyState);\n comm.kernel.ws.addEventListener('error', updateReadyState);\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 var data = msg['content']['data'];\n if (data['blob'] !== undefined) {\n data = {\n data: new Blob(msg['buffers'], { type: data['blob'] }),\n };\n }\n // Pass the mpl event to the overridden (by mpl) onmessage function.\n ws.onmessage(data);\n });\n return ws;\n};\n\nmpl.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(\"
\");\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\nmpl.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 '';\n fig.close_ws(fig, msg);\n};\n\nmpl.figure.prototype.close_ws = function (fig, msg) {\n fig.send_message('closing', msg);\n // fig.ws.close()\n};\n\nmpl.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 '';\n};\n\nmpl.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\nmpl.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 = '';\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 = '';\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\nmpl.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\nmpl.figure.prototype._root_extra_style = function (el) {\n el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n};\n\nmpl.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\nmpl.figure.prototype._key_event_extra = function (event, _name) {\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\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n fig.ondownload(fig, null);\n};\n\nmpl.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.\nif (IPython.notebook.kernel !== null) {\n IPython.notebook.kernel.comm_manager.register_target(\n 'matplotlib',\n mpl.mpl_figure_comm\n );\n}\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "val = fitAnalyser.get_fit_value(fitResult)\n", + "std = fitAnalyser.get_fit_std(fitResult)\n", + "\n", + "fitCurve = fitAnalyser.eval(fitResult, x=np.arange(300), y=np.arange(300), dask=\"parallelized\").load()\n", + "\n", + "# dataKey = 'sigmax'\n", + "# dataKey = 'centerx'\n", + "# dataKey = 'sigmay'\n", + "dataKey = 'centery'\n", + "\n", + "# val_mean = val[dataKey].mean(dim='runs')\n", + "# std_mean = val[dataKey].std(dim='runs')\n", + "\n", + "val_mean = calculate_mean(val[dataKey])\n", + "std_mean = calculate_std(val[dataKey])\n", + "\n", + "fig = plt.figure()\n", + "ax = fig.gca()\n", + "\n", + "val_mean.plot.errorbar(yerr=std_mean, fmt='--ob')\n", + "\n", + "plt.grid()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": "/* Put everything inside the global mpl namespace */\n/* global mpl */\nwindow.mpl = {};\n\nmpl.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\nmpl.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_device_pixel_ratio', {\n device_pixel_ratio: fig.ratio,\n });\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\nmpl.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\nmpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n\nmpl.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 rubberband_canvas.addEventListener(\n 'dblclick',\n on_mouse_event_closure('dblclick')\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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.figure.prototype.handle_figure_label = function (fig, msg) {\n // Updates the figure title.\n fig.header.textContent = msg['label'];\n};\n\nmpl.figure.prototype.handle_cursor = function (fig, msg) {\n fig.rubberband_canvas.style.cursor = msg['cursor'];\n};\n\nmpl.figure.prototype.handle_message = function (fig, msg) {\n fig.message.textContent = msg['message'];\n};\n\nmpl.figure.prototype.handle_draw = function (fig, _msg) {\n // Request the server to send over a new figure.\n fig.send_draw_message();\n};\n\nmpl.figure.prototype.handle_image_mode = function (fig, msg) {\n fig.image_mode = msg['mode'];\n};\n\nmpl.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\nmpl.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\nmpl.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.\nmpl.figure.prototype._make_on_message_function = function (fig) {\n return function socket_on_message(evt) {\n if (evt.data instanceof Blob) {\n var img = evt.data;\n if (img.type !== 'image/png') {\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 img.type = 'image/png';\n }\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 img\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 https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\nmpl.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 * https://stackoverflow.com/a/24161582/3208463\n */\nfunction 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\nmpl.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\nmpl.figure.prototype._key_event_extra = function (_event, _name) {\n // Handle any extra behaviour associated with a key event\n};\n\nmpl.figure.prototype.key_event = function (event, name) {\n // Prevent repeat events\n if (name === 'key_press') {\n if (event.key === this._key) {\n return;\n } else {\n this._key = event.key;\n }\n }\n if (name === 'key_release') {\n this._key = null;\n }\n\n var value = '';\n if (event.ctrlKey && event.key !== 'Control') {\n value += 'ctrl+';\n }\n else if (event.altKey && event.key !== 'Alt') {\n value += 'alt+';\n }\n else if (event.shiftKey && event.key !== 'Shift') {\n value += 'shift+';\n }\n\n value += 'k' + event.key;\n\n this._key_event_extra(event, name);\n\n this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n return false;\n};\n\nmpl.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\nmpl.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\nvar _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\nmpl.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\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n\nmpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n\nmpl.default_extension = \"png\";/* global mpl */\n\nvar 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.binaryType = comm.kernel.ws.binaryType;\n ws.readyState = comm.kernel.ws.readyState;\n function updateReadyState(_event) {\n if (comm.kernel.ws) {\n ws.readyState = comm.kernel.ws.readyState;\n } else {\n ws.readyState = 3; // Closed state.\n }\n }\n comm.kernel.ws.addEventListener('open', updateReadyState);\n comm.kernel.ws.addEventListener('close', updateReadyState);\n comm.kernel.ws.addEventListener('error', updateReadyState);\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 var data = msg['content']['data'];\n if (data['blob'] !== undefined) {\n data = {\n data: new Blob(msg['buffers'], { type: data['blob'] }),\n };\n }\n // Pass the mpl event to the overridden (by mpl) onmessage function.\n ws.onmessage(data);\n });\n return ws;\n};\n\nmpl.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(\"
\");\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\nmpl.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 '';\n fig.close_ws(fig, msg);\n};\n\nmpl.figure.prototype.close_ws = function (fig, msg) {\n fig.send_message('closing', msg);\n // fig.ws.close()\n};\n\nmpl.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 '';\n};\n\nmpl.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\nmpl.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 = '';\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 = '';\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\nmpl.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\nmpl.figure.prototype._root_extra_style = function (el) {\n el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n};\n\nmpl.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\nmpl.figure.prototype._key_event_extra = function (event, _name) {\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\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n fig.ondownload(fig, null);\n};\n\nmpl.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.\nif (IPython.notebook.kernel !== null) {\n IPython.notebook.kernel.comm_manager.register_target(\n 'matplotlib',\n mpl.mpl_figure_comm\n );\n}\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "f = 303.5930 ± 6.9704 Hz\n" + ] + } + ], + "source": [ + "def damp_osci(t, t0, A, B, nu, gamma):\n", + " return A * np.exp(-gamma*t)*np.sin(2*np.pi*nu*(t-t0)) + B\n", + "\n", + "#yvals = val_mean.sel(blink_on_time=slice(0.005, 0.025))\n", + "#yvals_std = std_mean.sel(blink_on_time=slice(0.005, 0.025))\n", + "#xvals = dataSet_cropOD[scanAxis[0]].sel(blink_on_time=slice(0.005, 0.025))\n", + "\n", + "fitted_qtys_1 = val_mean.to_numpy()\n", + "fitted_qtys_err_1 = std_mean.to_numpy()\n", + "scan_para = dataSet_cropOD[scanAxis[0]].to_numpy()\n", + "\n", + "plt.figure()\n", + "popt_x, pcov_x = curve_fit(damp_osci, scan_para, fitted_qtys_1, np.array([0, 1, 148, 1e2, 0.1]))\n", + "freqdata = np.linspace(0.005, 20e-3, 500)\n", + "plt.plot(freqdata, damp_osci(freqdata, *popt_x), 'g--',label='fit: t0=%5.3f, A=%5.3f, B=%5.3f, nu=%5.3f, Gamma=%5.3f' % tuple(popt_x))\n", + "plt.errorbar(scan_para, fitted_qtys_1, yerr=fitted_qtys_err_1, fmt='or')\n", + "plt.xlabel('hold time after switch on the trap (s)')\n", + "plt.ylabel('Center along gravity direction (pixels)')\n", + "plt.tight_layout()\n", + "plt.grid(visible=1)\n", + "#plt.ylim([0,750])\n", + "#plt.xlim([0.004, 0.025])\n", + "#plt.legend(prop={'size': 14})\n", + "plt.show()\n", + "\n", + "f_x = popt_x[3]\n", + "df_x = pcov_x[3][3]**0.5\n", + "\n", + "print('f = %.4f \\u00B1 %.4f Hz'% tuple([np.abs(f_x),df_x]))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Truncation: 0.55" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The detected scaning axes and values are: \n", + "\n", + "{'mod_blink_on_time': array([0.005, 0.006, 0.007, 0.008, 0.009, 0.01 , 0.011, 0.012, 0.013,\n", + " 0.014, 0.015, 0.016, 0.017, 0.018, 0.019]), 'runs': array([0., 1., 2., 3.])}\n" + ] + }, + { + "data": { + "application/javascript": "/* Put everything inside the global mpl namespace */\n/* global mpl */\nwindow.mpl = {};\n\nmpl.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\nmpl.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_device_pixel_ratio', {\n device_pixel_ratio: fig.ratio,\n });\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\nmpl.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\nmpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n\nmpl.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 rubberband_canvas.addEventListener(\n 'dblclick',\n on_mouse_event_closure('dblclick')\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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.figure.prototype.handle_figure_label = function (fig, msg) {\n // Updates the figure title.\n fig.header.textContent = msg['label'];\n};\n\nmpl.figure.prototype.handle_cursor = function (fig, msg) {\n fig.rubberband_canvas.style.cursor = msg['cursor'];\n};\n\nmpl.figure.prototype.handle_message = function (fig, msg) {\n fig.message.textContent = msg['message'];\n};\n\nmpl.figure.prototype.handle_draw = function (fig, _msg) {\n // Request the server to send over a new figure.\n fig.send_draw_message();\n};\n\nmpl.figure.prototype.handle_image_mode = function (fig, msg) {\n fig.image_mode = msg['mode'];\n};\n\nmpl.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\nmpl.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\nmpl.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.\nmpl.figure.prototype._make_on_message_function = function (fig) {\n return function socket_on_message(evt) {\n if (evt.data instanceof Blob) {\n var img = evt.data;\n if (img.type !== 'image/png') {\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 img.type = 'image/png';\n }\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 img\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 https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\nmpl.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 * https://stackoverflow.com/a/24161582/3208463\n */\nfunction 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\nmpl.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\nmpl.figure.prototype._key_event_extra = function (_event, _name) {\n // Handle any extra behaviour associated with a key event\n};\n\nmpl.figure.prototype.key_event = function (event, name) {\n // Prevent repeat events\n if (name === 'key_press') {\n if (event.key === this._key) {\n return;\n } else {\n this._key = event.key;\n }\n }\n if (name === 'key_release') {\n this._key = null;\n }\n\n var value = '';\n if (event.ctrlKey && event.key !== 'Control') {\n value += 'ctrl+';\n }\n else if (event.altKey && event.key !== 'Alt') {\n value += 'alt+';\n }\n else if (event.shiftKey && event.key !== 'Shift') {\n value += 'shift+';\n }\n\n value += 'k' + event.key;\n\n this._key_event_extra(event, name);\n\n this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n return false;\n};\n\nmpl.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\nmpl.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\nvar _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\nmpl.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\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n\nmpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n\nmpl.default_extension = \"png\";/* global mpl */\n\nvar 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.binaryType = comm.kernel.ws.binaryType;\n ws.readyState = comm.kernel.ws.readyState;\n function updateReadyState(_event) {\n if (comm.kernel.ws) {\n ws.readyState = comm.kernel.ws.readyState;\n } else {\n ws.readyState = 3; // Closed state.\n }\n }\n comm.kernel.ws.addEventListener('open', updateReadyState);\n comm.kernel.ws.addEventListener('close', updateReadyState);\n comm.kernel.ws.addEventListener('error', updateReadyState);\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 var data = msg['content']['data'];\n if (data['blob'] !== undefined) {\n data = {\n data: new Blob(msg['buffers'], { type: data['blob'] }),\n };\n }\n // Pass the mpl event to the overridden (by mpl) onmessage function.\n ws.onmessage(data);\n });\n return ws;\n};\n\nmpl.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(\"
\");\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\nmpl.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 '';\n fig.close_ws(fig, msg);\n};\n\nmpl.figure.prototype.close_ws = function (fig, msg) {\n fig.send_message('closing', msg);\n // fig.ws.close()\n};\n\nmpl.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 '';\n};\n\nmpl.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\nmpl.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 = '';\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 = '';\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\nmpl.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\nmpl.figure.prototype._root_extra_style = function (el) {\n el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n};\n\nmpl.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\nmpl.figure.prototype._key_event_extra = function (event, _name) {\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\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n fig.ondownload(fig, null);\n};\n\nmpl.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.\nif (IPython.notebook.kernel !== null) {\n IPython.notebook.kernel.comm_manager.register_target(\n 'matplotlib',\n mpl.mpl_figure_comm\n );\n}\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%matplotlib notebook\n", + "shotNum = \"0005\"\n", + "filePath = folderPath + \"/\" + shotNum + \"/*.h5\"\n", + "\n", + "dataSetDict = {\n", + " dskey[groupList[i]]: read_hdf5_file(filePath, groupList[i], excludeAxis = ['sweep_start_freq', 'sweep_stop_freq'])\n", + " for i in [0]\n", + "}\n", + "\n", + "dataSet = dataSetDict[\"camera_0\"]\n", + "\n", + "print_scanAxis(dataSet)\n", + "\n", + "scanAxis = get_scanAxis(dataSet)\n", + "\n", + "dataSet = auto_rechunk(dataSet)\n", + "\n", + "dataSet = imageAnalyser.get_absorption_images(dataSet)\n", + "\n", + "imageAnalyser.center = (800, 900)\n", + "imageAnalyser.span = (300, 300)\n", + "imageAnalyser.fraction = (0.1, 0.1)\n", + "\n", + "dataSet_cropOD = imageAnalyser.crop_image(dataSet.OD)\n", + "dataSet_cropOD = imageAnalyser.substract_offset(dataSet_cropOD).load()\n", + "\n", + "Ncount = imageAnalyser.get_Ncount(dataSet_cropOD)\n", + "Ncount_mean = calculate_mean(Ncount)\n", + "Ncount_std = calculate_std(Ncount)\n", + "\n", + "fig = plt.figure()\n", + "ax = fig.gca()\n", + "Ncount_mean.plot.errorbar(ax=ax, yerr = Ncount_std, fmt='ob')\n", + "plt.ylabel('NCount')\n", + "plt.tight_layout()\n", + "plt.grid(visible=1)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": {}, + "outputs": [], + "source": [ + "dataSet_cropOD_chunk = dataSet_cropOD.chunk((1, 1, 300, 300))\n", + "fitAnalyser = FitAnalyser(\"Gaussian-2D\", fitDim=2)\n", + "params = fitAnalyser.guess(dataSet_cropOD_chunk, dask=\"parallelized\")\n", + "fitResult = fitAnalyser.fit(dataSet_cropOD_chunk, params, dask=\"parallelized\").load()" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": "/* Put everything inside the global mpl namespace */\n/* global mpl */\nwindow.mpl = {};\n\nmpl.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\nmpl.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_device_pixel_ratio', {\n device_pixel_ratio: fig.ratio,\n });\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\nmpl.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\nmpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n\nmpl.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 rubberband_canvas.addEventListener(\n 'dblclick',\n on_mouse_event_closure('dblclick')\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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.figure.prototype.handle_figure_label = function (fig, msg) {\n // Updates the figure title.\n fig.header.textContent = msg['label'];\n};\n\nmpl.figure.prototype.handle_cursor = function (fig, msg) {\n fig.rubberband_canvas.style.cursor = msg['cursor'];\n};\n\nmpl.figure.prototype.handle_message = function (fig, msg) {\n fig.message.textContent = msg['message'];\n};\n\nmpl.figure.prototype.handle_draw = function (fig, _msg) {\n // Request the server to send over a new figure.\n fig.send_draw_message();\n};\n\nmpl.figure.prototype.handle_image_mode = function (fig, msg) {\n fig.image_mode = msg['mode'];\n};\n\nmpl.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\nmpl.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\nmpl.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.\nmpl.figure.prototype._make_on_message_function = function (fig) {\n return function socket_on_message(evt) {\n if (evt.data instanceof Blob) {\n var img = evt.data;\n if (img.type !== 'image/png') {\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 img.type = 'image/png';\n }\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 img\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 https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\nmpl.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 * https://stackoverflow.com/a/24161582/3208463\n */\nfunction 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\nmpl.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\nmpl.figure.prototype._key_event_extra = function (_event, _name) {\n // Handle any extra behaviour associated with a key event\n};\n\nmpl.figure.prototype.key_event = function (event, name) {\n // Prevent repeat events\n if (name === 'key_press') {\n if (event.key === this._key) {\n return;\n } else {\n this._key = event.key;\n }\n }\n if (name === 'key_release') {\n this._key = null;\n }\n\n var value = '';\n if (event.ctrlKey && event.key !== 'Control') {\n value += 'ctrl+';\n }\n else if (event.altKey && event.key !== 'Alt') {\n value += 'alt+';\n }\n else if (event.shiftKey && event.key !== 'Shift') {\n value += 'shift+';\n }\n\n value += 'k' + event.key;\n\n this._key_event_extra(event, name);\n\n this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n return false;\n};\n\nmpl.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\nmpl.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\nvar _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\nmpl.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\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n\nmpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n\nmpl.default_extension = \"png\";/* global mpl */\n\nvar 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.binaryType = comm.kernel.ws.binaryType;\n ws.readyState = comm.kernel.ws.readyState;\n function updateReadyState(_event) {\n if (comm.kernel.ws) {\n ws.readyState = comm.kernel.ws.readyState;\n } else {\n ws.readyState = 3; // Closed state.\n }\n }\n comm.kernel.ws.addEventListener('open', updateReadyState);\n comm.kernel.ws.addEventListener('close', updateReadyState);\n comm.kernel.ws.addEventListener('error', updateReadyState);\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 var data = msg['content']['data'];\n if (data['blob'] !== undefined) {\n data = {\n data: new Blob(msg['buffers'], { type: data['blob'] }),\n };\n }\n // Pass the mpl event to the overridden (by mpl) onmessage function.\n ws.onmessage(data);\n });\n return ws;\n};\n\nmpl.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(\"
\");\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\nmpl.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 '';\n fig.close_ws(fig, msg);\n};\n\nmpl.figure.prototype.close_ws = function (fig, msg) {\n fig.send_message('closing', msg);\n // fig.ws.close()\n};\n\nmpl.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 '';\n};\n\nmpl.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\nmpl.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 = '';\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 = '';\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\nmpl.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\nmpl.figure.prototype._root_extra_style = function (el) {\n el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n};\n\nmpl.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\nmpl.figure.prototype._key_event_extra = function (event, _name) {\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\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n fig.ondownload(fig, null);\n};\n\nmpl.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.\nif (IPython.notebook.kernel !== null) {\n IPython.notebook.kernel.comm_manager.register_target(\n 'matplotlib',\n mpl.mpl_figure_comm\n );\n}\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "val = fitAnalyser.get_fit_value(fitResult)\n", + "std = fitAnalyser.get_fit_std(fitResult)\n", + "\n", + "fitCurve = fitAnalyser.eval(fitResult, x=np.arange(300), y=np.arange(300), dask=\"parallelized\").load()\n", + "\n", + "# dataKey = 'sigmax'\n", + "# dataKey = 'centerx'\n", + "# dataKey = 'sigmay'\n", + "dataKey = 'centery'\n", + "\n", + "# val_mean = val[dataKey].mean(dim='runs')\n", + "# std_mean = val[dataKey].std(dim='runs')\n", + "\n", + "val_mean = calculate_mean(val[dataKey])\n", + "std_mean = calculate_std(val[dataKey])\n", + "\n", + "fig = plt.figure()\n", + "ax = fig.gca()\n", + "\n", + "val_mean.plot.errorbar(yerr=std_mean, fmt='--ob')\n", + "\n", + "plt.grid()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": "/* Put everything inside the global mpl namespace */\n/* global mpl */\nwindow.mpl = {};\n\nmpl.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\nmpl.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_device_pixel_ratio', {\n device_pixel_ratio: fig.ratio,\n });\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\nmpl.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\nmpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n\nmpl.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 rubberband_canvas.addEventListener(\n 'dblclick',\n on_mouse_event_closure('dblclick')\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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.figure.prototype.handle_figure_label = function (fig, msg) {\n // Updates the figure title.\n fig.header.textContent = msg['label'];\n};\n\nmpl.figure.prototype.handle_cursor = function (fig, msg) {\n fig.rubberband_canvas.style.cursor = msg['cursor'];\n};\n\nmpl.figure.prototype.handle_message = function (fig, msg) {\n fig.message.textContent = msg['message'];\n};\n\nmpl.figure.prototype.handle_draw = function (fig, _msg) {\n // Request the server to send over a new figure.\n fig.send_draw_message();\n};\n\nmpl.figure.prototype.handle_image_mode = function (fig, msg) {\n fig.image_mode = msg['mode'];\n};\n\nmpl.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\nmpl.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\nmpl.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.\nmpl.figure.prototype._make_on_message_function = function (fig) {\n return function socket_on_message(evt) {\n if (evt.data instanceof Blob) {\n var img = evt.data;\n if (img.type !== 'image/png') {\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 img.type = 'image/png';\n }\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 img\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 https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\nmpl.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 * https://stackoverflow.com/a/24161582/3208463\n */\nfunction 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\nmpl.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\nmpl.figure.prototype._key_event_extra = function (_event, _name) {\n // Handle any extra behaviour associated with a key event\n};\n\nmpl.figure.prototype.key_event = function (event, name) {\n // Prevent repeat events\n if (name === 'key_press') {\n if (event.key === this._key) {\n return;\n } else {\n this._key = event.key;\n }\n }\n if (name === 'key_release') {\n this._key = null;\n }\n\n var value = '';\n if (event.ctrlKey && event.key !== 'Control') {\n value += 'ctrl+';\n }\n else if (event.altKey && event.key !== 'Alt') {\n value += 'alt+';\n }\n else if (event.shiftKey && event.key !== 'Shift') {\n value += 'shift+';\n }\n\n value += 'k' + event.key;\n\n this._key_event_extra(event, name);\n\n this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n return false;\n};\n\nmpl.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\nmpl.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\nvar _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\nmpl.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\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n\nmpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n\nmpl.default_extension = \"png\";/* global mpl */\n\nvar 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.binaryType = comm.kernel.ws.binaryType;\n ws.readyState = comm.kernel.ws.readyState;\n function updateReadyState(_event) {\n if (comm.kernel.ws) {\n ws.readyState = comm.kernel.ws.readyState;\n } else {\n ws.readyState = 3; // Closed state.\n }\n }\n comm.kernel.ws.addEventListener('open', updateReadyState);\n comm.kernel.ws.addEventListener('close', updateReadyState);\n comm.kernel.ws.addEventListener('error', updateReadyState);\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 var data = msg['content']['data'];\n if (data['blob'] !== undefined) {\n data = {\n data: new Blob(msg['buffers'], { type: data['blob'] }),\n };\n }\n // Pass the mpl event to the overridden (by mpl) onmessage function.\n ws.onmessage(data);\n });\n return ws;\n};\n\nmpl.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(\"
\");\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\nmpl.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 '';\n fig.close_ws(fig, msg);\n};\n\nmpl.figure.prototype.close_ws = function (fig, msg) {\n fig.send_message('closing', msg);\n // fig.ws.close()\n};\n\nmpl.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 '';\n};\n\nmpl.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\nmpl.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 = '';\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 = '';\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\nmpl.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\nmpl.figure.prototype._root_extra_style = function (el) {\n el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n};\n\nmpl.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\nmpl.figure.prototype._key_event_extra = function (event, _name) {\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\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n fig.ondownload(fig, null);\n};\n\nmpl.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.\nif (IPython.notebook.kernel !== null) {\n IPython.notebook.kernel.comm_manager.register_target(\n 'matplotlib',\n mpl.mpl_figure_comm\n );\n}\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "f = 286.0152 ± 2.5433 Hz\n" + ] + } + ], + "source": [ + "def damp_osci(t, t0, A, B, nu, gamma):\n", + " return A * np.exp(-gamma*t)*np.sin(2*np.pi*nu*(t-t0)) + B\n", + "\n", + "yvals = val_mean#.sel(blink_on_time=slice(0.005, 0.025))\n", + "yvals_std = std_mean#.sel(blink_on_time=slice(0.005, 0.025))\n", + "xvals = dataSet_cropOD[scanAxis[0]]#.sel(blink_on_time=slice(0.005, 0.025))\n", + "\n", + "fitted_qtys_1 = yvals.to_numpy()\n", + "fitted_qtys_err_1 = yvals_std.to_numpy()\n", + "scan_para = xvals.to_numpy()\n", + "\n", + "plt.figure()\n", + "popt_x, pcov_x = curve_fit(damp_osci, scan_para, fitted_qtys_1, np.array([0, 3, 145, 1e2, 0.1]))\n", + "freqdata = np.linspace(0.005,19e-3, 500)\n", + "plt.plot(freqdata, damp_osci(freqdata, *popt_x), 'g--',label='fit: t0=%5.3f, A=%5.3f, B=%5.3f, nu=%5.3f, Gamma=%5.3f' % tuple(popt_x))\n", + "plt.errorbar(scan_para, fitted_qtys_1, yerr=fitted_qtys_err_1, fmt='or')\n", + "plt.xlabel('hold time after switch on the trap (s)')\n", + "plt.ylabel('Center along gravity direction (pixels)')\n", + "plt.tight_layout()\n", + "plt.grid(visible=1)\n", + "#plt.ylim([0,750])\n", + "#plt.xlim([0.004, 0.025])\n", + "#plt.legend(prop={'size': 14})\n", + "plt.show()\n", + "\n", + "f_x = popt_x[3]\n", + "df_x = pcov_x[3][3]**0.5\n", + "\n", + "print('f = %.4f \\u00B1 %.4f Hz'% tuple([np.abs(f_x),df_x]))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Truncation: 0.6" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The detected scaning axes and values are: \n", + "\n", + "{'mod_blink_on_time': array([0.005 , 0.0057, 0.0064, 0.0071, 0.0078, 0.0085, 0.0092, 0.0099,\n", + " 0.0106, 0.0113, 0.012 , 0.0127, 0.0134, 0.0141, 0.0148, 0.0155,\n", + " 0.0162, 0.0169, 0.0176, 0.0183, 0.019 , 0.0197]), 'runs': array([0., 1., 2., 3.])}\n" + ] + }, + { + "data": { + "application/javascript": "/* Put everything inside the global mpl namespace */\n/* global mpl */\nwindow.mpl = {};\n\nmpl.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\nmpl.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_device_pixel_ratio', {\n device_pixel_ratio: fig.ratio,\n });\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\nmpl.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\nmpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n\nmpl.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 rubberband_canvas.addEventListener(\n 'dblclick',\n on_mouse_event_closure('dblclick')\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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.figure.prototype.handle_figure_label = function (fig, msg) {\n // Updates the figure title.\n fig.header.textContent = msg['label'];\n};\n\nmpl.figure.prototype.handle_cursor = function (fig, msg) {\n fig.rubberband_canvas.style.cursor = msg['cursor'];\n};\n\nmpl.figure.prototype.handle_message = function (fig, msg) {\n fig.message.textContent = msg['message'];\n};\n\nmpl.figure.prototype.handle_draw = function (fig, _msg) {\n // Request the server to send over a new figure.\n fig.send_draw_message();\n};\n\nmpl.figure.prototype.handle_image_mode = function (fig, msg) {\n fig.image_mode = msg['mode'];\n};\n\nmpl.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\nmpl.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\nmpl.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.\nmpl.figure.prototype._make_on_message_function = function (fig) {\n return function socket_on_message(evt) {\n if (evt.data instanceof Blob) {\n var img = evt.data;\n if (img.type !== 'image/png') {\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 img.type = 'image/png';\n }\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 img\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 https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\nmpl.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 * https://stackoverflow.com/a/24161582/3208463\n */\nfunction 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\nmpl.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\nmpl.figure.prototype._key_event_extra = function (_event, _name) {\n // Handle any extra behaviour associated with a key event\n};\n\nmpl.figure.prototype.key_event = function (event, name) {\n // Prevent repeat events\n if (name === 'key_press') {\n if (event.key === this._key) {\n return;\n } else {\n this._key = event.key;\n }\n }\n if (name === 'key_release') {\n this._key = null;\n }\n\n var value = '';\n if (event.ctrlKey && event.key !== 'Control') {\n value += 'ctrl+';\n }\n else if (event.altKey && event.key !== 'Alt') {\n value += 'alt+';\n }\n else if (event.shiftKey && event.key !== 'Shift') {\n value += 'shift+';\n }\n\n value += 'k' + event.key;\n\n this._key_event_extra(event, name);\n\n this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n return false;\n};\n\nmpl.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\nmpl.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\nvar _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\nmpl.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\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n\nmpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n\nmpl.default_extension = \"png\";/* global mpl */\n\nvar 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.binaryType = comm.kernel.ws.binaryType;\n ws.readyState = comm.kernel.ws.readyState;\n function updateReadyState(_event) {\n if (comm.kernel.ws) {\n ws.readyState = comm.kernel.ws.readyState;\n } else {\n ws.readyState = 3; // Closed state.\n }\n }\n comm.kernel.ws.addEventListener('open', updateReadyState);\n comm.kernel.ws.addEventListener('close', updateReadyState);\n comm.kernel.ws.addEventListener('error', updateReadyState);\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 var data = msg['content']['data'];\n if (data['blob'] !== undefined) {\n data = {\n data: new Blob(msg['buffers'], { type: data['blob'] }),\n };\n }\n // Pass the mpl event to the overridden (by mpl) onmessage function.\n ws.onmessage(data);\n });\n return ws;\n};\n\nmpl.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(\"
\");\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\nmpl.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 '';\n fig.close_ws(fig, msg);\n};\n\nmpl.figure.prototype.close_ws = function (fig, msg) {\n fig.send_message('closing', msg);\n // fig.ws.close()\n};\n\nmpl.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 '';\n};\n\nmpl.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\nmpl.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 = '';\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 = '';\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\nmpl.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\nmpl.figure.prototype._root_extra_style = function (el) {\n el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n};\n\nmpl.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\nmpl.figure.prototype._key_event_extra = function (event, _name) {\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\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n fig.ondownload(fig, null);\n};\n\nmpl.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.\nif (IPython.notebook.kernel !== null) {\n IPython.notebook.kernel.comm_manager.register_target(\n 'matplotlib',\n mpl.mpl_figure_comm\n );\n}\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%matplotlib notebook\n", + "shotNum = \"0008\"\n", + "filePath = folderPath + \"/\" + shotNum + \"/*.h5\"\n", + "\n", + "dataSetDict = {\n", + " dskey[groupList[i]]: read_hdf5_file(filePath, groupList[i], excludeAxis = ['sweep_start_freq', 'sweep_stop_freq'])\n", + " for i in [0]\n", + "}\n", + "\n", + "dataSet = dataSetDict[\"camera_0\"]\n", + "\n", + "print_scanAxis(dataSet)\n", + "\n", + "scanAxis = get_scanAxis(dataSet)\n", + "\n", + "dataSet = auto_rechunk(dataSet)\n", + "\n", + "dataSet = imageAnalyser.get_absorption_images(dataSet)\n", + "\n", + "imageAnalyser.center = (800, 900)\n", + "imageAnalyser.span = (300, 300)\n", + "imageAnalyser.fraction = (0.1, 0.1)\n", + "\n", + "dataSet_cropOD = imageAnalyser.crop_image(dataSet.OD)\n", + "dataSet_cropOD = imageAnalyser.substract_offset(dataSet_cropOD).load()\n", + "\n", + "Ncount = imageAnalyser.get_Ncount(dataSet_cropOD)\n", + "Ncount_mean = calculate_mean(Ncount)\n", + "Ncount_std = calculate_std(Ncount)\n", + "\n", + "fig = plt.figure()\n", + "ax = fig.gca()\n", + "Ncount_mean.plot.errorbar(ax=ax, yerr = None, fmt='ob')\n", + "plt.ylabel('NCount')\n", + "plt.tight_layout()\n", + "plt.grid(visible=1)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "metadata": {}, + "outputs": [], + "source": [ + "dataSet_cropOD_chunk = dataSet_cropOD.chunk((1, 1, 300, 300))\n", + "fitAnalyser = FitAnalyser(\"Gaussian-2D\", fitDim=2)\n", + "params = fitAnalyser.guess(dataSet_cropOD_chunk, dask=\"parallelized\")\n", + "fitResult = fitAnalyser.fit(dataSet_cropOD_chunk, params, dask=\"parallelized\").load()" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": "/* Put everything inside the global mpl namespace */\n/* global mpl */\nwindow.mpl = {};\n\nmpl.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\nmpl.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_device_pixel_ratio', {\n device_pixel_ratio: fig.ratio,\n });\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\nmpl.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\nmpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n\nmpl.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 rubberband_canvas.addEventListener(\n 'dblclick',\n on_mouse_event_closure('dblclick')\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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.figure.prototype.handle_figure_label = function (fig, msg) {\n // Updates the figure title.\n fig.header.textContent = msg['label'];\n};\n\nmpl.figure.prototype.handle_cursor = function (fig, msg) {\n fig.rubberband_canvas.style.cursor = msg['cursor'];\n};\n\nmpl.figure.prototype.handle_message = function (fig, msg) {\n fig.message.textContent = msg['message'];\n};\n\nmpl.figure.prototype.handle_draw = function (fig, _msg) {\n // Request the server to send over a new figure.\n fig.send_draw_message();\n};\n\nmpl.figure.prototype.handle_image_mode = function (fig, msg) {\n fig.image_mode = msg['mode'];\n};\n\nmpl.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\nmpl.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\nmpl.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.\nmpl.figure.prototype._make_on_message_function = function (fig) {\n return function socket_on_message(evt) {\n if (evt.data instanceof Blob) {\n var img = evt.data;\n if (img.type !== 'image/png') {\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 img.type = 'image/png';\n }\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 img\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 https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\nmpl.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 * https://stackoverflow.com/a/24161582/3208463\n */\nfunction 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\nmpl.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\nmpl.figure.prototype._key_event_extra = function (_event, _name) {\n // Handle any extra behaviour associated with a key event\n};\n\nmpl.figure.prototype.key_event = function (event, name) {\n // Prevent repeat events\n if (name === 'key_press') {\n if (event.key === this._key) {\n return;\n } else {\n this._key = event.key;\n }\n }\n if (name === 'key_release') {\n this._key = null;\n }\n\n var value = '';\n if (event.ctrlKey && event.key !== 'Control') {\n value += 'ctrl+';\n }\n else if (event.altKey && event.key !== 'Alt') {\n value += 'alt+';\n }\n else if (event.shiftKey && event.key !== 'Shift') {\n value += 'shift+';\n }\n\n value += 'k' + event.key;\n\n this._key_event_extra(event, name);\n\n this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n return false;\n};\n\nmpl.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\nmpl.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\nvar _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\nmpl.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\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n\nmpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n\nmpl.default_extension = \"png\";/* global mpl */\n\nvar 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.binaryType = comm.kernel.ws.binaryType;\n ws.readyState = comm.kernel.ws.readyState;\n function updateReadyState(_event) {\n if (comm.kernel.ws) {\n ws.readyState = comm.kernel.ws.readyState;\n } else {\n ws.readyState = 3; // Closed state.\n }\n }\n comm.kernel.ws.addEventListener('open', updateReadyState);\n comm.kernel.ws.addEventListener('close', updateReadyState);\n comm.kernel.ws.addEventListener('error', updateReadyState);\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 var data = msg['content']['data'];\n if (data['blob'] !== undefined) {\n data = {\n data: new Blob(msg['buffers'], { type: data['blob'] }),\n };\n }\n // Pass the mpl event to the overridden (by mpl) onmessage function.\n ws.onmessage(data);\n });\n return ws;\n};\n\nmpl.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(\"
\");\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\nmpl.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 '';\n fig.close_ws(fig, msg);\n};\n\nmpl.figure.prototype.close_ws = function (fig, msg) {\n fig.send_message('closing', msg);\n // fig.ws.close()\n};\n\nmpl.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 '';\n};\n\nmpl.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\nmpl.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 = '';\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 = '';\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\nmpl.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\nmpl.figure.prototype._root_extra_style = function (el) {\n el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n};\n\nmpl.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\nmpl.figure.prototype._key_event_extra = function (event, _name) {\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\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n fig.ondownload(fig, null);\n};\n\nmpl.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.\nif (IPython.notebook.kernel !== null) {\n IPython.notebook.kernel.comm_manager.register_target(\n 'matplotlib',\n mpl.mpl_figure_comm\n );\n}\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "val = fitAnalyser.get_fit_value(fitResult)\n", + "std = fitAnalyser.get_fit_std(fitResult)\n", + "\n", + "fitCurve = fitAnalyser.eval(fitResult, x=np.arange(300), y=np.arange(300), dask=\"parallelized\").load()\n", + "\n", + "# dataKey = 'sigmax'\n", + "# dataKey = 'centerx'\n", + "# dataKey = 'sigmay'\n", + "dataKey = 'centery'\n", + "\n", + "# val_mean = val[dataKey].mean(dim='runs')\n", + "# std_mean = val[dataKey].std(dim='runs')\n", + "\n", + "val_mean = calculate_mean(val[dataKey])\n", + "std_mean = calculate_std(val[dataKey])\n", + "\n", + "fig = plt.figure()\n", + "ax = fig.gca()\n", + "\n", + "val_mean.plot.errorbar(yerr=std_mean, fmt='--ob')\n", + "\n", + "plt.grid()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": "/* Put everything inside the global mpl namespace */\n/* global mpl */\nwindow.mpl = {};\n\nmpl.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\nmpl.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_device_pixel_ratio', {\n device_pixel_ratio: fig.ratio,\n });\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\nmpl.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\nmpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n\nmpl.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 rubberband_canvas.addEventListener(\n 'dblclick',\n on_mouse_event_closure('dblclick')\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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.figure.prototype.handle_figure_label = function (fig, msg) {\n // Updates the figure title.\n fig.header.textContent = msg['label'];\n};\n\nmpl.figure.prototype.handle_cursor = function (fig, msg) {\n fig.rubberband_canvas.style.cursor = msg['cursor'];\n};\n\nmpl.figure.prototype.handle_message = function (fig, msg) {\n fig.message.textContent = msg['message'];\n};\n\nmpl.figure.prototype.handle_draw = function (fig, _msg) {\n // Request the server to send over a new figure.\n fig.send_draw_message();\n};\n\nmpl.figure.prototype.handle_image_mode = function (fig, msg) {\n fig.image_mode = msg['mode'];\n};\n\nmpl.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\nmpl.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\nmpl.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.\nmpl.figure.prototype._make_on_message_function = function (fig) {\n return function socket_on_message(evt) {\n if (evt.data instanceof Blob) {\n var img = evt.data;\n if (img.type !== 'image/png') {\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 img.type = 'image/png';\n }\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 img\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 https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\nmpl.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 * https://stackoverflow.com/a/24161582/3208463\n */\nfunction 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\nmpl.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\nmpl.figure.prototype._key_event_extra = function (_event, _name) {\n // Handle any extra behaviour associated with a key event\n};\n\nmpl.figure.prototype.key_event = function (event, name) {\n // Prevent repeat events\n if (name === 'key_press') {\n if (event.key === this._key) {\n return;\n } else {\n this._key = event.key;\n }\n }\n if (name === 'key_release') {\n this._key = null;\n }\n\n var value = '';\n if (event.ctrlKey && event.key !== 'Control') {\n value += 'ctrl+';\n }\n else if (event.altKey && event.key !== 'Alt') {\n value += 'alt+';\n }\n else if (event.shiftKey && event.key !== 'Shift') {\n value += 'shift+';\n }\n\n value += 'k' + event.key;\n\n this._key_event_extra(event, name);\n\n this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n return false;\n};\n\nmpl.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\nmpl.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\nvar _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\nmpl.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\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n\nmpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n\nmpl.default_extension = \"png\";/* global mpl */\n\nvar 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.binaryType = comm.kernel.ws.binaryType;\n ws.readyState = comm.kernel.ws.readyState;\n function updateReadyState(_event) {\n if (comm.kernel.ws) {\n ws.readyState = comm.kernel.ws.readyState;\n } else {\n ws.readyState = 3; // Closed state.\n }\n }\n comm.kernel.ws.addEventListener('open', updateReadyState);\n comm.kernel.ws.addEventListener('close', updateReadyState);\n comm.kernel.ws.addEventListener('error', updateReadyState);\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 var data = msg['content']['data'];\n if (data['blob'] !== undefined) {\n data = {\n data: new Blob(msg['buffers'], { type: data['blob'] }),\n };\n }\n // Pass the mpl event to the overridden (by mpl) onmessage function.\n ws.onmessage(data);\n });\n return ws;\n};\n\nmpl.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(\"
\");\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\nmpl.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 '';\n fig.close_ws(fig, msg);\n};\n\nmpl.figure.prototype.close_ws = function (fig, msg) {\n fig.send_message('closing', msg);\n // fig.ws.close()\n};\n\nmpl.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 '';\n};\n\nmpl.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\nmpl.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 = '';\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 = '';\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\nmpl.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\nmpl.figure.prototype._root_extra_style = function (el) {\n el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n};\n\nmpl.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\nmpl.figure.prototype._key_event_extra = function (event, _name) {\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\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n fig.ondownload(fig, null);\n};\n\nmpl.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.\nif (IPython.notebook.kernel !== null) {\n IPython.notebook.kernel.comm_manager.register_target(\n 'matplotlib',\n mpl.mpl_figure_comm\n );\n}\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "f = 272.6675 ± 0.6739 Hz\n" + ] + } + ], + "source": [ + "def damp_osci(t, t0, A, B, nu, gamma):\n", + " return A * np.exp(-gamma*t)*np.sin(2*np.pi*nu*(t-t0)) + B\n", + "\n", + "yvals = val_mean#.sel(blink_on_time=slice(0.005, 0.025))\n", + "yvals_std = std_mean#.sel(blink_on_time=slice(0.005, 0.025))\n", + "xvals = dataSet_cropOD[scanAxis[0]]#.sel(blink_on_time=slice(0.005, 0.025))\n", + "\n", + "fitted_qtys_1 = yvals.to_numpy()\n", + "fitted_qtys_err_1 = yvals_std.to_numpy()\n", + "scan_para = xvals.to_numpy()\n", + "\n", + "plt.figure()\n", + "popt_x, pcov_x = curve_fit(damp_osci, scan_para, fitted_qtys_1, np.array([0, 3, 145, 1e2, 0.1]))\n", + "freqdata = np.linspace(0.005, 20e-3, 500)\n", + "plt.plot(freqdata, damp_osci(freqdata, *popt_x), 'g--',label='fit: t0=%5.3f, A=%5.3f, B=%5.3f, nu=%5.3f, Gamma=%5.3f' % tuple(popt_x))\n", + "plt.errorbar(scan_para, fitted_qtys_1, yerr=fitted_qtys_err_1, fmt='or')\n", + "plt.xlabel('hold time after switch on the trap (s)')\n", + "plt.ylabel('Center along gravity direction (pixels)')\n", + "plt.tight_layout()\n", + "plt.grid(visible=1)\n", + "#plt.ylim([0,750])\n", + "#plt.xlim([0.004, 0.025])\n", + "#plt.legend(prop={'size': 14})\n", + "plt.show()\n", + "\n", + "f_x = popt_x[3]\n", + "df_x = pcov_x[3][3]**0.5\n", + "\n", + "print('f = %.4f \\u00B1 %.4f Hz'% tuple([np.abs(f_x),df_x]))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Truncation: 0.65" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The detected scaning axes and values are: \n", + "\n", + "{'mod_blink_on_time': array([0.005 , 0.0057, 0.0064, 0.0071, 0.0078, 0.0085, 0.0092, 0.0099,\n", + " 0.0106, 0.0113, 0.012 , 0.0127, 0.0134, 0.0141, 0.0148, 0.0155,\n", + " 0.0162, 0.0169, 0.0176, 0.0183, 0.019 , 0.0197]), 'runs': array([0., 1., 2., 3.])}\n" + ] + }, + { + "data": { + "application/javascript": "/* Put everything inside the global mpl namespace */\n/* global mpl */\nwindow.mpl = {};\n\nmpl.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\nmpl.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_device_pixel_ratio', {\n device_pixel_ratio: fig.ratio,\n });\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\nmpl.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\nmpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n\nmpl.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 rubberband_canvas.addEventListener(\n 'dblclick',\n on_mouse_event_closure('dblclick')\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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.figure.prototype.handle_figure_label = function (fig, msg) {\n // Updates the figure title.\n fig.header.textContent = msg['label'];\n};\n\nmpl.figure.prototype.handle_cursor = function (fig, msg) {\n fig.rubberband_canvas.style.cursor = msg['cursor'];\n};\n\nmpl.figure.prototype.handle_message = function (fig, msg) {\n fig.message.textContent = msg['message'];\n};\n\nmpl.figure.prototype.handle_draw = function (fig, _msg) {\n // Request the server to send over a new figure.\n fig.send_draw_message();\n};\n\nmpl.figure.prototype.handle_image_mode = function (fig, msg) {\n fig.image_mode = msg['mode'];\n};\n\nmpl.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\nmpl.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\nmpl.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.\nmpl.figure.prototype._make_on_message_function = function (fig) {\n return function socket_on_message(evt) {\n if (evt.data instanceof Blob) {\n var img = evt.data;\n if (img.type !== 'image/png') {\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 img.type = 'image/png';\n }\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 img\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 https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\nmpl.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 * https://stackoverflow.com/a/24161582/3208463\n */\nfunction 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\nmpl.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\nmpl.figure.prototype._key_event_extra = function (_event, _name) {\n // Handle any extra behaviour associated with a key event\n};\n\nmpl.figure.prototype.key_event = function (event, name) {\n // Prevent repeat events\n if (name === 'key_press') {\n if (event.key === this._key) {\n return;\n } else {\n this._key = event.key;\n }\n }\n if (name === 'key_release') {\n this._key = null;\n }\n\n var value = '';\n if (event.ctrlKey && event.key !== 'Control') {\n value += 'ctrl+';\n }\n else if (event.altKey && event.key !== 'Alt') {\n value += 'alt+';\n }\n else if (event.shiftKey && event.key !== 'Shift') {\n value += 'shift+';\n }\n\n value += 'k' + event.key;\n\n this._key_event_extra(event, name);\n\n this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n return false;\n};\n\nmpl.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\nmpl.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\nvar _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\nmpl.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\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n\nmpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n\nmpl.default_extension = \"png\";/* global mpl */\n\nvar 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.binaryType = comm.kernel.ws.binaryType;\n ws.readyState = comm.kernel.ws.readyState;\n function updateReadyState(_event) {\n if (comm.kernel.ws) {\n ws.readyState = comm.kernel.ws.readyState;\n } else {\n ws.readyState = 3; // Closed state.\n }\n }\n comm.kernel.ws.addEventListener('open', updateReadyState);\n comm.kernel.ws.addEventListener('close', updateReadyState);\n comm.kernel.ws.addEventListener('error', updateReadyState);\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 var data = msg['content']['data'];\n if (data['blob'] !== undefined) {\n data = {\n data: new Blob(msg['buffers'], { type: data['blob'] }),\n };\n }\n // Pass the mpl event to the overridden (by mpl) onmessage function.\n ws.onmessage(data);\n });\n return ws;\n};\n\nmpl.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(\"
\");\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\nmpl.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 '';\n fig.close_ws(fig, msg);\n};\n\nmpl.figure.prototype.close_ws = function (fig, msg) {\n fig.send_message('closing', msg);\n // fig.ws.close()\n};\n\nmpl.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 '';\n};\n\nmpl.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\nmpl.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 = '';\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 = '';\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\nmpl.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\nmpl.figure.prototype._root_extra_style = function (el) {\n el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n};\n\nmpl.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\nmpl.figure.prototype._key_event_extra = function (event, _name) {\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\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n fig.ondownload(fig, null);\n};\n\nmpl.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.\nif (IPython.notebook.kernel !== null) {\n IPython.notebook.kernel.comm_manager.register_target(\n 'matplotlib',\n mpl.mpl_figure_comm\n );\n}\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%matplotlib notebook\n", + "shotNum = \"0009\"\n", + "filePath = folderPath + \"/\" + shotNum + \"/*.h5\"\n", + "\n", + "dataSetDict = {\n", + " dskey[groupList[i]]: read_hdf5_file(filePath, groupList[i], excludeAxis = ['sweep_start_freq', 'sweep_stop_freq'])\n", + " for i in [0]\n", + "}\n", + "\n", + "dataSet = dataSetDict[\"camera_0\"]\n", + "\n", + "print_scanAxis(dataSet)\n", + "\n", + "scanAxis = get_scanAxis(dataSet)\n", + "\n", + "dataSet = auto_rechunk(dataSet)\n", + "\n", + "dataSet = imageAnalyser.get_absorption_images(dataSet)\n", + "\n", + "imageAnalyser.center = (800, 900)\n", + "imageAnalyser.span = (300, 300)\n", + "imageAnalyser.fraction = (0.1, 0.1)\n", + "\n", + "dataSet_cropOD = imageAnalyser.crop_image(dataSet.OD)\n", + "dataSet_cropOD = imageAnalyser.substract_offset(dataSet_cropOD).load()\n", + "\n", + "Ncount = imageAnalyser.get_Ncount(dataSet_cropOD)\n", + "Ncount_mean = calculate_mean(Ncount)\n", + "Ncount_std = calculate_std(Ncount)\n", + "\n", + "fig = plt.figure()\n", + "ax = fig.gca()\n", + "Ncount_mean.plot.errorbar(ax=ax, yerr = None, fmt='ob')\n", + "plt.ylabel('NCount')\n", + "plt.tight_layout()\n", + "plt.grid(visible=1)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "metadata": {}, + "outputs": [], + "source": [ + "dataSet_cropOD_chunk = dataSet_cropOD.chunk((1, 1, 300, 300))\n", + "fitAnalyser = FitAnalyser(\"Gaussian-2D\", fitDim=2)\n", + "params = fitAnalyser.guess(dataSet_cropOD_chunk, dask=\"parallelized\")\n", + "fitResult = fitAnalyser.fit(dataSet_cropOD_chunk, params, dask=\"parallelized\").load()" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": "/* Put everything inside the global mpl namespace */\n/* global mpl */\nwindow.mpl = {};\n\nmpl.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\nmpl.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_device_pixel_ratio', {\n device_pixel_ratio: fig.ratio,\n });\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\nmpl.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\nmpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n\nmpl.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 rubberband_canvas.addEventListener(\n 'dblclick',\n on_mouse_event_closure('dblclick')\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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.figure.prototype.handle_figure_label = function (fig, msg) {\n // Updates the figure title.\n fig.header.textContent = msg['label'];\n};\n\nmpl.figure.prototype.handle_cursor = function (fig, msg) {\n fig.rubberband_canvas.style.cursor = msg['cursor'];\n};\n\nmpl.figure.prototype.handle_message = function (fig, msg) {\n fig.message.textContent = msg['message'];\n};\n\nmpl.figure.prototype.handle_draw = function (fig, _msg) {\n // Request the server to send over a new figure.\n fig.send_draw_message();\n};\n\nmpl.figure.prototype.handle_image_mode = function (fig, msg) {\n fig.image_mode = msg['mode'];\n};\n\nmpl.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\nmpl.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\nmpl.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.\nmpl.figure.prototype._make_on_message_function = function (fig) {\n return function socket_on_message(evt) {\n if (evt.data instanceof Blob) {\n var img = evt.data;\n if (img.type !== 'image/png') {\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 img.type = 'image/png';\n }\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 img\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 https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\nmpl.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 * https://stackoverflow.com/a/24161582/3208463\n */\nfunction 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\nmpl.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\nmpl.figure.prototype._key_event_extra = function (_event, _name) {\n // Handle any extra behaviour associated with a key event\n};\n\nmpl.figure.prototype.key_event = function (event, name) {\n // Prevent repeat events\n if (name === 'key_press') {\n if (event.key === this._key) {\n return;\n } else {\n this._key = event.key;\n }\n }\n if (name === 'key_release') {\n this._key = null;\n }\n\n var value = '';\n if (event.ctrlKey && event.key !== 'Control') {\n value += 'ctrl+';\n }\n else if (event.altKey && event.key !== 'Alt') {\n value += 'alt+';\n }\n else if (event.shiftKey && event.key !== 'Shift') {\n value += 'shift+';\n }\n\n value += 'k' + event.key;\n\n this._key_event_extra(event, name);\n\n this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n return false;\n};\n\nmpl.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\nmpl.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\nvar _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\nmpl.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\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n\nmpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n\nmpl.default_extension = \"png\";/* global mpl */\n\nvar 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.binaryType = comm.kernel.ws.binaryType;\n ws.readyState = comm.kernel.ws.readyState;\n function updateReadyState(_event) {\n if (comm.kernel.ws) {\n ws.readyState = comm.kernel.ws.readyState;\n } else {\n ws.readyState = 3; // Closed state.\n }\n }\n comm.kernel.ws.addEventListener('open', updateReadyState);\n comm.kernel.ws.addEventListener('close', updateReadyState);\n comm.kernel.ws.addEventListener('error', updateReadyState);\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 var data = msg['content']['data'];\n if (data['blob'] !== undefined) {\n data = {\n data: new Blob(msg['buffers'], { type: data['blob'] }),\n };\n }\n // Pass the mpl event to the overridden (by mpl) onmessage function.\n ws.onmessage(data);\n });\n return ws;\n};\n\nmpl.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(\"
\");\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\nmpl.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 '';\n fig.close_ws(fig, msg);\n};\n\nmpl.figure.prototype.close_ws = function (fig, msg) {\n fig.send_message('closing', msg);\n // fig.ws.close()\n};\n\nmpl.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 '';\n};\n\nmpl.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\nmpl.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 = '';\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 = '';\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\nmpl.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\nmpl.figure.prototype._root_extra_style = function (el) {\n el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n};\n\nmpl.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\nmpl.figure.prototype._key_event_extra = function (event, _name) {\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\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n fig.ondownload(fig, null);\n};\n\nmpl.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.\nif (IPython.notebook.kernel !== null) {\n IPython.notebook.kernel.comm_manager.register_target(\n 'matplotlib',\n mpl.mpl_figure_comm\n );\n}\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "val = fitAnalyser.get_fit_value(fitResult)\n", + "std = fitAnalyser.get_fit_std(fitResult)\n", + "\n", + "fitCurve = fitAnalyser.eval(fitResult, x=np.arange(300), y=np.arange(300), dask=\"parallelized\").load()\n", + "\n", + "# dataKey = 'sigmax'\n", + "# dataKey = 'centerx'\n", + "# dataKey = 'sigmay'\n", + "dataKey = 'centery'\n", + "\n", + "# val_mean = val[dataKey].mean(dim='runs')\n", + "# std_mean = val[dataKey].std(dim='runs')\n", + "\n", + "val_mean = calculate_mean(val[dataKey])\n", + "std_mean = calculate_std(val[dataKey])\n", + "\n", + "fig = plt.figure()\n", + "ax = fig.gca()\n", + "\n", + "val_mean.plot.errorbar(yerr=std_mean, fmt='--ob')\n", + "\n", + "plt.grid()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": "/* Put everything inside the global mpl namespace */\n/* global mpl */\nwindow.mpl = {};\n\nmpl.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\nmpl.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_device_pixel_ratio', {\n device_pixel_ratio: fig.ratio,\n });\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\nmpl.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\nmpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n\nmpl.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 rubberband_canvas.addEventListener(\n 'dblclick',\n on_mouse_event_closure('dblclick')\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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.figure.prototype.handle_figure_label = function (fig, msg) {\n // Updates the figure title.\n fig.header.textContent = msg['label'];\n};\n\nmpl.figure.prototype.handle_cursor = function (fig, msg) {\n fig.rubberband_canvas.style.cursor = msg['cursor'];\n};\n\nmpl.figure.prototype.handle_message = function (fig, msg) {\n fig.message.textContent = msg['message'];\n};\n\nmpl.figure.prototype.handle_draw = function (fig, _msg) {\n // Request the server to send over a new figure.\n fig.send_draw_message();\n};\n\nmpl.figure.prototype.handle_image_mode = function (fig, msg) {\n fig.image_mode = msg['mode'];\n};\n\nmpl.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\nmpl.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\nmpl.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.\nmpl.figure.prototype._make_on_message_function = function (fig) {\n return function socket_on_message(evt) {\n if (evt.data instanceof Blob) {\n var img = evt.data;\n if (img.type !== 'image/png') {\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 img.type = 'image/png';\n }\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 img\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 https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\nmpl.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 * https://stackoverflow.com/a/24161582/3208463\n */\nfunction 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\nmpl.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\nmpl.figure.prototype._key_event_extra = function (_event, _name) {\n // Handle any extra behaviour associated with a key event\n};\n\nmpl.figure.prototype.key_event = function (event, name) {\n // Prevent repeat events\n if (name === 'key_press') {\n if (event.key === this._key) {\n return;\n } else {\n this._key = event.key;\n }\n }\n if (name === 'key_release') {\n this._key = null;\n }\n\n var value = '';\n if (event.ctrlKey && event.key !== 'Control') {\n value += 'ctrl+';\n }\n else if (event.altKey && event.key !== 'Alt') {\n value += 'alt+';\n }\n else if (event.shiftKey && event.key !== 'Shift') {\n value += 'shift+';\n }\n\n value += 'k' + event.key;\n\n this._key_event_extra(event, name);\n\n this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n return false;\n};\n\nmpl.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\nmpl.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\nvar _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\nmpl.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\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n\nmpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n\nmpl.default_extension = \"png\";/* global mpl */\n\nvar 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.binaryType = comm.kernel.ws.binaryType;\n ws.readyState = comm.kernel.ws.readyState;\n function updateReadyState(_event) {\n if (comm.kernel.ws) {\n ws.readyState = comm.kernel.ws.readyState;\n } else {\n ws.readyState = 3; // Closed state.\n }\n }\n comm.kernel.ws.addEventListener('open', updateReadyState);\n comm.kernel.ws.addEventListener('close', updateReadyState);\n comm.kernel.ws.addEventListener('error', updateReadyState);\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 var data = msg['content']['data'];\n if (data['blob'] !== undefined) {\n data = {\n data: new Blob(msg['buffers'], { type: data['blob'] }),\n };\n }\n // Pass the mpl event to the overridden (by mpl) onmessage function.\n ws.onmessage(data);\n });\n return ws;\n};\n\nmpl.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(\"
\");\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\nmpl.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 '';\n fig.close_ws(fig, msg);\n};\n\nmpl.figure.prototype.close_ws = function (fig, msg) {\n fig.send_message('closing', msg);\n // fig.ws.close()\n};\n\nmpl.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 '';\n};\n\nmpl.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\nmpl.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 = '';\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 = '';\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\nmpl.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\nmpl.figure.prototype._root_extra_style = function (el) {\n el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n};\n\nmpl.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\nmpl.figure.prototype._key_event_extra = function (event, _name) {\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\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n fig.ondownload(fig, null);\n};\n\nmpl.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.\nif (IPython.notebook.kernel !== null) {\n IPython.notebook.kernel.comm_manager.register_target(\n 'matplotlib',\n mpl.mpl_figure_comm\n );\n}\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "f = 253.6669 ± 0.5183 Hz\n" + ] + } + ], + "source": [ + "def damp_osci(t, t0, A, B, nu, gamma):\n", + " return A * np.exp(-gamma*t)*np.sin(2*np.pi*nu*(t-t0)) + B\n", + "\n", + "yvals = val_mean#.sel(blink_on_time=slice(0.005, 0.025))\n", + "yvals_std = std_mean#.sel(blink_on_time=slice(0.005, 0.025))\n", + "xvals = dataSet_cropOD[scanAxis[0]]#.sel(blink_on_time=slice(0.005, 0.025))\n", + "\n", + "fitted_qtys_1 = yvals.to_numpy()\n", + "fitted_qtys_err_1 = yvals_std.to_numpy()\n", + "scan_para = xvals.to_numpy()\n", + "\n", + "plt.figure()\n", + "popt_x, pcov_x = curve_fit(damp_osci, scan_para, fitted_qtys_1, np.array([0, 3, 145, 1e2, 0.1]))\n", + "freqdata = np.linspace(0.005, 20e-3, 500)\n", + "plt.plot(freqdata, damp_osci(freqdata, *popt_x), 'g--',label='fit: t0=%5.3f, A=%5.3f, B=%5.3f, nu=%5.3f, Gamma=%5.3f' % tuple(popt_x))\n", + "plt.errorbar(scan_para, fitted_qtys_1, yerr=fitted_qtys_err_1, fmt='or')\n", + "plt.xlabel('hold time after switch on the trap (s)')\n", + "plt.ylabel('Center along gravity direction (pixels)')\n", + "plt.tight_layout()\n", + "plt.grid(visible=1)\n", + "#plt.ylim([0,750])\n", + "#plt.xlim([0.004, 0.025])\n", + "#plt.legend(prop={'size': 14})\n", + "plt.show()\n", + "\n", + "f_x = popt_x[3]\n", + "df_x = pcov_x[3][3]**0.5\n", + "\n", + "print('f = %.4f \\u00B1 %.4f Hz'% tuple([np.abs(f_x),df_x]))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Truncation: 0.7" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The detected scaning axes and values are: \n", + "\n", + "{'mod_blink_on_time': array([0.005 , 0.0057, 0.0064, 0.0071, 0.0078, 0.0085, 0.0092, 0.0099,\n", + " 0.0106, 0.0113, 0.012 , 0.0127, 0.0134, 0.0141, 0.0148, 0.0155,\n", + " 0.0162, 0.0169, 0.0176, 0.0183, 0.019 , 0.0197]), 'runs': array([0., 1., 2., 3.])}\n" + ] + }, + { + "data": { + "application/javascript": "/* Put everything inside the global mpl namespace */\n/* global mpl */\nwindow.mpl = {};\n\nmpl.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\nmpl.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_device_pixel_ratio', {\n device_pixel_ratio: fig.ratio,\n });\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\nmpl.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\nmpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n\nmpl.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 rubberband_canvas.addEventListener(\n 'dblclick',\n on_mouse_event_closure('dblclick')\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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.figure.prototype.handle_figure_label = function (fig, msg) {\n // Updates the figure title.\n fig.header.textContent = msg['label'];\n};\n\nmpl.figure.prototype.handle_cursor = function (fig, msg) {\n fig.rubberband_canvas.style.cursor = msg['cursor'];\n};\n\nmpl.figure.prototype.handle_message = function (fig, msg) {\n fig.message.textContent = msg['message'];\n};\n\nmpl.figure.prototype.handle_draw = function (fig, _msg) {\n // Request the server to send over a new figure.\n fig.send_draw_message();\n};\n\nmpl.figure.prototype.handle_image_mode = function (fig, msg) {\n fig.image_mode = msg['mode'];\n};\n\nmpl.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\nmpl.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\nmpl.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.\nmpl.figure.prototype._make_on_message_function = function (fig) {\n return function socket_on_message(evt) {\n if (evt.data instanceof Blob) {\n var img = evt.data;\n if (img.type !== 'image/png') {\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 img.type = 'image/png';\n }\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 img\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 https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\nmpl.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 * https://stackoverflow.com/a/24161582/3208463\n */\nfunction 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\nmpl.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\nmpl.figure.prototype._key_event_extra = function (_event, _name) {\n // Handle any extra behaviour associated with a key event\n};\n\nmpl.figure.prototype.key_event = function (event, name) {\n // Prevent repeat events\n if (name === 'key_press') {\n if (event.key === this._key) {\n return;\n } else {\n this._key = event.key;\n }\n }\n if (name === 'key_release') {\n this._key = null;\n }\n\n var value = '';\n if (event.ctrlKey && event.key !== 'Control') {\n value += 'ctrl+';\n }\n else if (event.altKey && event.key !== 'Alt') {\n value += 'alt+';\n }\n else if (event.shiftKey && event.key !== 'Shift') {\n value += 'shift+';\n }\n\n value += 'k' + event.key;\n\n this._key_event_extra(event, name);\n\n this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n return false;\n};\n\nmpl.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\nmpl.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\nvar _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\nmpl.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\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n\nmpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n\nmpl.default_extension = \"png\";/* global mpl */\n\nvar 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.binaryType = comm.kernel.ws.binaryType;\n ws.readyState = comm.kernel.ws.readyState;\n function updateReadyState(_event) {\n if (comm.kernel.ws) {\n ws.readyState = comm.kernel.ws.readyState;\n } else {\n ws.readyState = 3; // Closed state.\n }\n }\n comm.kernel.ws.addEventListener('open', updateReadyState);\n comm.kernel.ws.addEventListener('close', updateReadyState);\n comm.kernel.ws.addEventListener('error', updateReadyState);\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 var data = msg['content']['data'];\n if (data['blob'] !== undefined) {\n data = {\n data: new Blob(msg['buffers'], { type: data['blob'] }),\n };\n }\n // Pass the mpl event to the overridden (by mpl) onmessage function.\n ws.onmessage(data);\n });\n return ws;\n};\n\nmpl.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(\"
\");\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\nmpl.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 '';\n fig.close_ws(fig, msg);\n};\n\nmpl.figure.prototype.close_ws = function (fig, msg) {\n fig.send_message('closing', msg);\n // fig.ws.close()\n};\n\nmpl.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 '';\n};\n\nmpl.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\nmpl.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 = '';\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 = '';\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\nmpl.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\nmpl.figure.prototype._root_extra_style = function (el) {\n el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n};\n\nmpl.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\nmpl.figure.prototype._key_event_extra = function (event, _name) {\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\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n fig.ondownload(fig, null);\n};\n\nmpl.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.\nif (IPython.notebook.kernel !== null) {\n IPython.notebook.kernel.comm_manager.register_target(\n 'matplotlib',\n mpl.mpl_figure_comm\n );\n}\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%matplotlib notebook\n", + "shotNum = \"0010\"\n", + "filePath = folderPath + \"/\" + shotNum + \"/*.h5\"\n", + "\n", + "dataSetDict = {\n", + " dskey[groupList[i]]: read_hdf5_file(filePath, groupList[i], excludeAxis = ['sweep_start_freq', 'sweep_stop_freq'])\n", + " for i in [0]\n", + "}\n", + "\n", + "dataSet = dataSetDict[\"camera_0\"]\n", + "\n", + "print_scanAxis(dataSet)\n", + "\n", + "scanAxis = get_scanAxis(dataSet)\n", + "\n", + "dataSet = auto_rechunk(dataSet)\n", + "\n", + "dataSet = imageAnalyser.get_absorption_images(dataSet)\n", + "\n", + "imageAnalyser.center = (800, 900)\n", + "imageAnalyser.span = (300, 300)\n", + "imageAnalyser.fraction = (0.1, 0.1)\n", + "\n", + "dataSet_cropOD = imageAnalyser.crop_image(dataSet.OD)\n", + "dataSet_cropOD = imageAnalyser.substract_offset(dataSet_cropOD).load()\n", + "\n", + "Ncount = imageAnalyser.get_Ncount(dataSet_cropOD)\n", + "Ncount_mean = calculate_mean(Ncount)\n", + "Ncount_std = calculate_std(Ncount)\n", + "\n", + "fig = plt.figure()\n", + "ax = fig.gca()\n", + "Ncount_mean.plot.errorbar(ax=ax, yerr = None, fmt='ob')\n", + "plt.ylabel('NCount')\n", + "plt.tight_layout()\n", + "plt.grid(visible=1)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "metadata": {}, + "outputs": [], + "source": [ + "dataSet_cropOD_chunk = dataSet_cropOD.chunk((1, 1, 300, 300))\n", + "fitAnalyser = FitAnalyser(\"Gaussian-2D\", fitDim=2)\n", + "params = fitAnalyser.guess(dataSet_cropOD_chunk, dask=\"parallelized\")\n", + "fitResult = fitAnalyser.fit(dataSet_cropOD_chunk, params, dask=\"parallelized\").load()" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": "/* Put everything inside the global mpl namespace */\n/* global mpl */\nwindow.mpl = {};\n\nmpl.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\nmpl.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_device_pixel_ratio', {\n device_pixel_ratio: fig.ratio,\n });\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\nmpl.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\nmpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n\nmpl.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 rubberband_canvas.addEventListener(\n 'dblclick',\n on_mouse_event_closure('dblclick')\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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.figure.prototype.handle_figure_label = function (fig, msg) {\n // Updates the figure title.\n fig.header.textContent = msg['label'];\n};\n\nmpl.figure.prototype.handle_cursor = function (fig, msg) {\n fig.rubberband_canvas.style.cursor = msg['cursor'];\n};\n\nmpl.figure.prototype.handle_message = function (fig, msg) {\n fig.message.textContent = msg['message'];\n};\n\nmpl.figure.prototype.handle_draw = function (fig, _msg) {\n // Request the server to send over a new figure.\n fig.send_draw_message();\n};\n\nmpl.figure.prototype.handle_image_mode = function (fig, msg) {\n fig.image_mode = msg['mode'];\n};\n\nmpl.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\nmpl.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\nmpl.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.\nmpl.figure.prototype._make_on_message_function = function (fig) {\n return function socket_on_message(evt) {\n if (evt.data instanceof Blob) {\n var img = evt.data;\n if (img.type !== 'image/png') {\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 img.type = 'image/png';\n }\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 img\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 https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\nmpl.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 * https://stackoverflow.com/a/24161582/3208463\n */\nfunction 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\nmpl.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\nmpl.figure.prototype._key_event_extra = function (_event, _name) {\n // Handle any extra behaviour associated with a key event\n};\n\nmpl.figure.prototype.key_event = function (event, name) {\n // Prevent repeat events\n if (name === 'key_press') {\n if (event.key === this._key) {\n return;\n } else {\n this._key = event.key;\n }\n }\n if (name === 'key_release') {\n this._key = null;\n }\n\n var value = '';\n if (event.ctrlKey && event.key !== 'Control') {\n value += 'ctrl+';\n }\n else if (event.altKey && event.key !== 'Alt') {\n value += 'alt+';\n }\n else if (event.shiftKey && event.key !== 'Shift') {\n value += 'shift+';\n }\n\n value += 'k' + event.key;\n\n this._key_event_extra(event, name);\n\n this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n return false;\n};\n\nmpl.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\nmpl.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\nvar _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\nmpl.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\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n\nmpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n\nmpl.default_extension = \"png\";/* global mpl */\n\nvar 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.binaryType = comm.kernel.ws.binaryType;\n ws.readyState = comm.kernel.ws.readyState;\n function updateReadyState(_event) {\n if (comm.kernel.ws) {\n ws.readyState = comm.kernel.ws.readyState;\n } else {\n ws.readyState = 3; // Closed state.\n }\n }\n comm.kernel.ws.addEventListener('open', updateReadyState);\n comm.kernel.ws.addEventListener('close', updateReadyState);\n comm.kernel.ws.addEventListener('error', updateReadyState);\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 var data = msg['content']['data'];\n if (data['blob'] !== undefined) {\n data = {\n data: new Blob(msg['buffers'], { type: data['blob'] }),\n };\n }\n // Pass the mpl event to the overridden (by mpl) onmessage function.\n ws.onmessage(data);\n });\n return ws;\n};\n\nmpl.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(\"
\");\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\nmpl.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 '';\n fig.close_ws(fig, msg);\n};\n\nmpl.figure.prototype.close_ws = function (fig, msg) {\n fig.send_message('closing', msg);\n // fig.ws.close()\n};\n\nmpl.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 '';\n};\n\nmpl.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\nmpl.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 = '';\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 = '';\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\nmpl.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\nmpl.figure.prototype._root_extra_style = function (el) {\n el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n};\n\nmpl.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\nmpl.figure.prototype._key_event_extra = function (event, _name) {\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\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n fig.ondownload(fig, null);\n};\n\nmpl.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.\nif (IPython.notebook.kernel !== null) {\n IPython.notebook.kernel.comm_manager.register_target(\n 'matplotlib',\n mpl.mpl_figure_comm\n );\n}\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "val = fitAnalyser.get_fit_value(fitResult)\n", + "std = fitAnalyser.get_fit_std(fitResult)\n", + "\n", + "fitCurve = fitAnalyser.eval(fitResult, x=np.arange(300), y=np.arange(300), dask=\"parallelized\").load()\n", + "\n", + "# dataKey = 'sigmax'\n", + "# dataKey = 'centerx'\n", + "# dataKey = 'sigmay'\n", + "dataKey = 'centery'\n", + "\n", + "# val_mean = val[dataKey].mean(dim='runs')\n", + "# std_mean = val[dataKey].std(dim='runs')\n", + "\n", + "val_mean = calculate_mean(val[dataKey])\n", + "std_mean = calculate_std(val[dataKey])\n", + "\n", + "fig = plt.figure()\n", + "ax = fig.gca()\n", + "\n", + "val_mean.plot.errorbar(yerr=std_mean, fmt='--ob')\n", + "\n", + "plt.grid()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": "/* Put everything inside the global mpl namespace */\n/* global mpl */\nwindow.mpl = {};\n\nmpl.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\nmpl.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_device_pixel_ratio', {\n device_pixel_ratio: fig.ratio,\n });\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\nmpl.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\nmpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n\nmpl.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 rubberband_canvas.addEventListener(\n 'dblclick',\n on_mouse_event_closure('dblclick')\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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.figure.prototype.handle_figure_label = function (fig, msg) {\n // Updates the figure title.\n fig.header.textContent = msg['label'];\n};\n\nmpl.figure.prototype.handle_cursor = function (fig, msg) {\n fig.rubberband_canvas.style.cursor = msg['cursor'];\n};\n\nmpl.figure.prototype.handle_message = function (fig, msg) {\n fig.message.textContent = msg['message'];\n};\n\nmpl.figure.prototype.handle_draw = function (fig, _msg) {\n // Request the server to send over a new figure.\n fig.send_draw_message();\n};\n\nmpl.figure.prototype.handle_image_mode = function (fig, msg) {\n fig.image_mode = msg['mode'];\n};\n\nmpl.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\nmpl.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\nmpl.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.\nmpl.figure.prototype._make_on_message_function = function (fig) {\n return function socket_on_message(evt) {\n if (evt.data instanceof Blob) {\n var img = evt.data;\n if (img.type !== 'image/png') {\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 img.type = 'image/png';\n }\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 img\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 https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\nmpl.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 * https://stackoverflow.com/a/24161582/3208463\n */\nfunction 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\nmpl.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\nmpl.figure.prototype._key_event_extra = function (_event, _name) {\n // Handle any extra behaviour associated with a key event\n};\n\nmpl.figure.prototype.key_event = function (event, name) {\n // Prevent repeat events\n if (name === 'key_press') {\n if (event.key === this._key) {\n return;\n } else {\n this._key = event.key;\n }\n }\n if (name === 'key_release') {\n this._key = null;\n }\n\n var value = '';\n if (event.ctrlKey && event.key !== 'Control') {\n value += 'ctrl+';\n }\n else if (event.altKey && event.key !== 'Alt') {\n value += 'alt+';\n }\n else if (event.shiftKey && event.key !== 'Shift') {\n value += 'shift+';\n }\n\n value += 'k' + event.key;\n\n this._key_event_extra(event, name);\n\n this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n return false;\n};\n\nmpl.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\nmpl.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\nvar _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\nmpl.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\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n\nmpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n\nmpl.default_extension = \"png\";/* global mpl */\n\nvar 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.binaryType = comm.kernel.ws.binaryType;\n ws.readyState = comm.kernel.ws.readyState;\n function updateReadyState(_event) {\n if (comm.kernel.ws) {\n ws.readyState = comm.kernel.ws.readyState;\n } else {\n ws.readyState = 3; // Closed state.\n }\n }\n comm.kernel.ws.addEventListener('open', updateReadyState);\n comm.kernel.ws.addEventListener('close', updateReadyState);\n comm.kernel.ws.addEventListener('error', updateReadyState);\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 var data = msg['content']['data'];\n if (data['blob'] !== undefined) {\n data = {\n data: new Blob(msg['buffers'], { type: data['blob'] }),\n };\n }\n // Pass the mpl event to the overridden (by mpl) onmessage function.\n ws.onmessage(data);\n });\n return ws;\n};\n\nmpl.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(\"
\");\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\nmpl.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 '';\n fig.close_ws(fig, msg);\n};\n\nmpl.figure.prototype.close_ws = function (fig, msg) {\n fig.send_message('closing', msg);\n // fig.ws.close()\n};\n\nmpl.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 '';\n};\n\nmpl.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\nmpl.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 = '';\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 = '';\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\nmpl.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\nmpl.figure.prototype._root_extra_style = function (el) {\n el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n};\n\nmpl.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\nmpl.figure.prototype._key_event_extra = function (event, _name) {\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\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n fig.ondownload(fig, null);\n};\n\nmpl.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.\nif (IPython.notebook.kernel !== null) {\n IPython.notebook.kernel.comm_manager.register_target(\n 'matplotlib',\n mpl.mpl_figure_comm\n );\n}\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "f = 238.8665 ± 0.3901 Hz\n" + ] + } + ], + "source": [ + "def damp_osci(t, t0, A, B, nu, gamma):\n", + " return A * np.exp(-gamma*t)*np.sin(2*np.pi*nu*(t-t0)) + B\n", + "\n", + "yvals = val_mean#.sel(blink_on_time=slice(0.005, 0.025))\n", + "yvals_std = std_mean#.sel(blink_on_time=slice(0.005, 0.025))\n", + "xvals = dataSet_cropOD[scanAxis[0]]#.sel(blink_on_time=slice(0.005, 0.025))\n", + "\n", + "fitted_qtys_1 = yvals.to_numpy()\n", + "scan_para = xvals.to_numpy()\n", + "fitted_qtys_err_1 = yvals_std.to_numpy()\n", + "\n", + "\n", + "plt.figure()\n", + "popt_x, pcov_x = curve_fit(damp_osci, scan_para, fitted_qtys_1, np.array([0, 3, 147, 3e2, 0.1]))\n", + "freqdata = np.linspace(0.005, 20e-3, 500)\n", + "plt.plot(freqdata, damp_osci(freqdata, *popt_x), 'g--',label='fit: t0=%5.3f, A=%5.3f, B=%5.3f, nu=%5.3f, Gamma=%5.3f' % tuple(popt_x))\n", + "plt.errorbar(scan_para, fitted_qtys_1, yerr=fitted_qtys_err_1, fmt='or')\n", + "plt.xlabel('hold time after switch on the trap (s)')\n", + "plt.ylabel('Center along gravity direction (pixels)')\n", + "plt.tight_layout()\n", + "plt.grid(visible=1)\n", + "#plt.ylim([0,750])\n", + "#plt.xlim([0.004, 0.025])\n", + "#plt.legend(prop={'size': 14})\n", + "plt.show()\n", + "\n", + "f_x = popt_x[3]\n", + "df_x = pcov_x[3][3]**0.5\n", + "\n", + "print('f = %.4f \\u00B1 %.4f Hz'% tuple([np.abs(f_x),df_x]))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Truncation: 0.725" + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The detected scaning axes and values are: \n", + "\n", + "{'mod_blink_on_time': array([0.005 , 0.0057, 0.0064, 0.0071, 0.0078, 0.0085, 0.0092, 0.0099,\n", + " 0.0106, 0.0113, 0.012 , 0.0127, 0.0134, 0.0141, 0.0148, 0.0155,\n", + " 0.0162, 0.0169, 0.0176, 0.0183, 0.019 , 0.0197]), 'runs': array([0., 1., 2., 3.])}\n" + ] + }, + { + "data": { + "application/javascript": "/* Put everything inside the global mpl namespace */\n/* global mpl */\nwindow.mpl = {};\n\nmpl.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\nmpl.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_device_pixel_ratio', {\n device_pixel_ratio: fig.ratio,\n });\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\nmpl.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\nmpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n\nmpl.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 rubberband_canvas.addEventListener(\n 'dblclick',\n on_mouse_event_closure('dblclick')\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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.figure.prototype.handle_figure_label = function (fig, msg) {\n // Updates the figure title.\n fig.header.textContent = msg['label'];\n};\n\nmpl.figure.prototype.handle_cursor = function (fig, msg) {\n fig.rubberband_canvas.style.cursor = msg['cursor'];\n};\n\nmpl.figure.prototype.handle_message = function (fig, msg) {\n fig.message.textContent = msg['message'];\n};\n\nmpl.figure.prototype.handle_draw = function (fig, _msg) {\n // Request the server to send over a new figure.\n fig.send_draw_message();\n};\n\nmpl.figure.prototype.handle_image_mode = function (fig, msg) {\n fig.image_mode = msg['mode'];\n};\n\nmpl.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\nmpl.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\nmpl.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.\nmpl.figure.prototype._make_on_message_function = function (fig) {\n return function socket_on_message(evt) {\n if (evt.data instanceof Blob) {\n var img = evt.data;\n if (img.type !== 'image/png') {\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 img.type = 'image/png';\n }\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 img\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 https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\nmpl.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 * https://stackoverflow.com/a/24161582/3208463\n */\nfunction 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\nmpl.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\nmpl.figure.prototype._key_event_extra = function (_event, _name) {\n // Handle any extra behaviour associated with a key event\n};\n\nmpl.figure.prototype.key_event = function (event, name) {\n // Prevent repeat events\n if (name === 'key_press') {\n if (event.key === this._key) {\n return;\n } else {\n this._key = event.key;\n }\n }\n if (name === 'key_release') {\n this._key = null;\n }\n\n var value = '';\n if (event.ctrlKey && event.key !== 'Control') {\n value += 'ctrl+';\n }\n else if (event.altKey && event.key !== 'Alt') {\n value += 'alt+';\n }\n else if (event.shiftKey && event.key !== 'Shift') {\n value += 'shift+';\n }\n\n value += 'k' + event.key;\n\n this._key_event_extra(event, name);\n\n this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n return false;\n};\n\nmpl.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\nmpl.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\nvar _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\nmpl.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\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n\nmpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n\nmpl.default_extension = \"png\";/* global mpl */\n\nvar 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.binaryType = comm.kernel.ws.binaryType;\n ws.readyState = comm.kernel.ws.readyState;\n function updateReadyState(_event) {\n if (comm.kernel.ws) {\n ws.readyState = comm.kernel.ws.readyState;\n } else {\n ws.readyState = 3; // Closed state.\n }\n }\n comm.kernel.ws.addEventListener('open', updateReadyState);\n comm.kernel.ws.addEventListener('close', updateReadyState);\n comm.kernel.ws.addEventListener('error', updateReadyState);\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 var data = msg['content']['data'];\n if (data['blob'] !== undefined) {\n data = {\n data: new Blob(msg['buffers'], { type: data['blob'] }),\n };\n }\n // Pass the mpl event to the overridden (by mpl) onmessage function.\n ws.onmessage(data);\n });\n return ws;\n};\n\nmpl.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(\"
\");\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\nmpl.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 '';\n fig.close_ws(fig, msg);\n};\n\nmpl.figure.prototype.close_ws = function (fig, msg) {\n fig.send_message('closing', msg);\n // fig.ws.close()\n};\n\nmpl.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 '';\n};\n\nmpl.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\nmpl.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 = '';\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 = '';\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\nmpl.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\nmpl.figure.prototype._root_extra_style = function (el) {\n el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n};\n\nmpl.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\nmpl.figure.prototype._key_event_extra = function (event, _name) {\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\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n fig.ondownload(fig, null);\n};\n\nmpl.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.\nif (IPython.notebook.kernel !== null) {\n IPython.notebook.kernel.comm_manager.register_target(\n 'matplotlib',\n mpl.mpl_figure_comm\n );\n}\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%matplotlib notebook\n", + "shotNum = \"0011\"\n", + "filePath = folderPath + \"/\" + shotNum + \"/*.h5\"\n", + "\n", + "dataSetDict = {\n", + " dskey[groupList[i]]: read_hdf5_file(filePath, groupList[i], excludeAxis = ['sweep_start_freq', 'sweep_stop_freq'])\n", + " for i in [0]\n", + "}\n", + "\n", + "dataSet = dataSetDict[\"camera_0\"]\n", + "\n", + "print_scanAxis(dataSet)\n", + "\n", + "scanAxis = get_scanAxis(dataSet)\n", + "\n", + "dataSet = auto_rechunk(dataSet)\n", + "\n", + "dataSet = imageAnalyser.get_absorption_images(dataSet)\n", + "\n", + "imageAnalyser.center = (800, 900)\n", + "imageAnalyser.span = (300, 300)\n", + "imageAnalyser.fraction = (0.1, 0.1)\n", + "\n", + "dataSet_cropOD = imageAnalyser.crop_image(dataSet.OD)\n", + "dataSet_cropOD = imageAnalyser.substract_offset(dataSet_cropOD).load()\n", + "\n", + "Ncount = imageAnalyser.get_Ncount(dataSet_cropOD)\n", + "Ncount_mean = calculate_mean(Ncount)\n", + "Ncount_std = calculate_std(Ncount)\n", + "\n", + "fig = plt.figure()\n", + "ax = fig.gca()\n", + "Ncount_mean.plot.errorbar(ax=ax, yerr = None, fmt='ob')\n", + "plt.ylabel('NCount')\n", + "plt.tight_layout()\n", + "plt.grid(visible=1)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 94, + "metadata": {}, + "outputs": [], + "source": [ + "dataSet_cropOD_chunk = dataSet_cropOD.chunk((1, 1, 300, 300))\n", + "fitAnalyser = FitAnalyser(\"Gaussian-2D\", fitDim=2)\n", + "params = fitAnalyser.guess(dataSet_cropOD_chunk, dask=\"parallelized\")\n", + "fitResult = fitAnalyser.fit(dataSet_cropOD_chunk, params, dask=\"parallelized\").load()" + ] + }, + { + "cell_type": "code", + "execution_count": 95, + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": "/* Put everything inside the global mpl namespace */\n/* global mpl */\nwindow.mpl = {};\n\nmpl.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\nmpl.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_device_pixel_ratio', {\n device_pixel_ratio: fig.ratio,\n });\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\nmpl.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\nmpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n\nmpl.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 rubberband_canvas.addEventListener(\n 'dblclick',\n on_mouse_event_closure('dblclick')\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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.figure.prototype.handle_figure_label = function (fig, msg) {\n // Updates the figure title.\n fig.header.textContent = msg['label'];\n};\n\nmpl.figure.prototype.handle_cursor = function (fig, msg) {\n fig.rubberband_canvas.style.cursor = msg['cursor'];\n};\n\nmpl.figure.prototype.handle_message = function (fig, msg) {\n fig.message.textContent = msg['message'];\n};\n\nmpl.figure.prototype.handle_draw = function (fig, _msg) {\n // Request the server to send over a new figure.\n fig.send_draw_message();\n};\n\nmpl.figure.prototype.handle_image_mode = function (fig, msg) {\n fig.image_mode = msg['mode'];\n};\n\nmpl.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\nmpl.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\nmpl.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.\nmpl.figure.prototype._make_on_message_function = function (fig) {\n return function socket_on_message(evt) {\n if (evt.data instanceof Blob) {\n var img = evt.data;\n if (img.type !== 'image/png') {\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 img.type = 'image/png';\n }\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 img\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 https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\nmpl.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 * https://stackoverflow.com/a/24161582/3208463\n */\nfunction 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\nmpl.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\nmpl.figure.prototype._key_event_extra = function (_event, _name) {\n // Handle any extra behaviour associated with a key event\n};\n\nmpl.figure.prototype.key_event = function (event, name) {\n // Prevent repeat events\n if (name === 'key_press') {\n if (event.key === this._key) {\n return;\n } else {\n this._key = event.key;\n }\n }\n if (name === 'key_release') {\n this._key = null;\n }\n\n var value = '';\n if (event.ctrlKey && event.key !== 'Control') {\n value += 'ctrl+';\n }\n else if (event.altKey && event.key !== 'Alt') {\n value += 'alt+';\n }\n else if (event.shiftKey && event.key !== 'Shift') {\n value += 'shift+';\n }\n\n value += 'k' + event.key;\n\n this._key_event_extra(event, name);\n\n this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n return false;\n};\n\nmpl.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\nmpl.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\nvar _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\nmpl.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\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n\nmpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n\nmpl.default_extension = \"png\";/* global mpl */\n\nvar 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.binaryType = comm.kernel.ws.binaryType;\n ws.readyState = comm.kernel.ws.readyState;\n function updateReadyState(_event) {\n if (comm.kernel.ws) {\n ws.readyState = comm.kernel.ws.readyState;\n } else {\n ws.readyState = 3; // Closed state.\n }\n }\n comm.kernel.ws.addEventListener('open', updateReadyState);\n comm.kernel.ws.addEventListener('close', updateReadyState);\n comm.kernel.ws.addEventListener('error', updateReadyState);\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 var data = msg['content']['data'];\n if (data['blob'] !== undefined) {\n data = {\n data: new Blob(msg['buffers'], { type: data['blob'] }),\n };\n }\n // Pass the mpl event to the overridden (by mpl) onmessage function.\n ws.onmessage(data);\n });\n return ws;\n};\n\nmpl.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(\"
\");\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\nmpl.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 '';\n fig.close_ws(fig, msg);\n};\n\nmpl.figure.prototype.close_ws = function (fig, msg) {\n fig.send_message('closing', msg);\n // fig.ws.close()\n};\n\nmpl.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 '';\n};\n\nmpl.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\nmpl.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 = '';\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 = '';\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\nmpl.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\nmpl.figure.prototype._root_extra_style = function (el) {\n el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n};\n\nmpl.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\nmpl.figure.prototype._key_event_extra = function (event, _name) {\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\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n fig.ondownload(fig, null);\n};\n\nmpl.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.\nif (IPython.notebook.kernel !== null) {\n IPython.notebook.kernel.comm_manager.register_target(\n 'matplotlib',\n mpl.mpl_figure_comm\n );\n}\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "val = fitAnalyser.get_fit_value(fitResult)\n", + "std = fitAnalyser.get_fit_std(fitResult)\n", + "\n", + "fitCurve = fitAnalyser.eval(fitResult, x=np.arange(300), y=np.arange(300), dask=\"parallelized\").load()\n", + "\n", + "# dataKey = 'sigmax'\n", + "# dataKey = 'centerx'\n", + "# dataKey = 'sigmay'\n", + "dataKey = 'centery'\n", + "\n", + "# val_mean = val[dataKey].mean(dim='runs')\n", + "# std_mean = val[dataKey].std(dim='runs')\n", + "\n", + "val_mean = calculate_mean(val[dataKey])\n", + "std_mean = calculate_std(val[dataKey])\n", + "\n", + "fig = plt.figure()\n", + "ax = fig.gca()\n", + "\n", + "val_mean.plot.errorbar(yerr=std_mean, fmt='--ob')\n", + "\n", + "plt.grid()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 98, + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": "/* Put everything inside the global mpl namespace */\n/* global mpl */\nwindow.mpl = {};\n\nmpl.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\nmpl.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_device_pixel_ratio', {\n device_pixel_ratio: fig.ratio,\n });\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\nmpl.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\nmpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n\nmpl.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 rubberband_canvas.addEventListener(\n 'dblclick',\n on_mouse_event_closure('dblclick')\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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.figure.prototype.handle_figure_label = function (fig, msg) {\n // Updates the figure title.\n fig.header.textContent = msg['label'];\n};\n\nmpl.figure.prototype.handle_cursor = function (fig, msg) {\n fig.rubberband_canvas.style.cursor = msg['cursor'];\n};\n\nmpl.figure.prototype.handle_message = function (fig, msg) {\n fig.message.textContent = msg['message'];\n};\n\nmpl.figure.prototype.handle_draw = function (fig, _msg) {\n // Request the server to send over a new figure.\n fig.send_draw_message();\n};\n\nmpl.figure.prototype.handle_image_mode = function (fig, msg) {\n fig.image_mode = msg['mode'];\n};\n\nmpl.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\nmpl.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\nmpl.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.\nmpl.figure.prototype._make_on_message_function = function (fig) {\n return function socket_on_message(evt) {\n if (evt.data instanceof Blob) {\n var img = evt.data;\n if (img.type !== 'image/png') {\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 img.type = 'image/png';\n }\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 img\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 https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\nmpl.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 * https://stackoverflow.com/a/24161582/3208463\n */\nfunction 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\nmpl.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\nmpl.figure.prototype._key_event_extra = function (_event, _name) {\n // Handle any extra behaviour associated with a key event\n};\n\nmpl.figure.prototype.key_event = function (event, name) {\n // Prevent repeat events\n if (name === 'key_press') {\n if (event.key === this._key) {\n return;\n } else {\n this._key = event.key;\n }\n }\n if (name === 'key_release') {\n this._key = null;\n }\n\n var value = '';\n if (event.ctrlKey && event.key !== 'Control') {\n value += 'ctrl+';\n }\n else if (event.altKey && event.key !== 'Alt') {\n value += 'alt+';\n }\n else if (event.shiftKey && event.key !== 'Shift') {\n value += 'shift+';\n }\n\n value += 'k' + event.key;\n\n this._key_event_extra(event, name);\n\n this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n return false;\n};\n\nmpl.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\nmpl.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\nvar _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\nmpl.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\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n\nmpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n\nmpl.default_extension = \"png\";/* global mpl */\n\nvar 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.binaryType = comm.kernel.ws.binaryType;\n ws.readyState = comm.kernel.ws.readyState;\n function updateReadyState(_event) {\n if (comm.kernel.ws) {\n ws.readyState = comm.kernel.ws.readyState;\n } else {\n ws.readyState = 3; // Closed state.\n }\n }\n comm.kernel.ws.addEventListener('open', updateReadyState);\n comm.kernel.ws.addEventListener('close', updateReadyState);\n comm.kernel.ws.addEventListener('error', updateReadyState);\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 var data = msg['content']['data'];\n if (data['blob'] !== undefined) {\n data = {\n data: new Blob(msg['buffers'], { type: data['blob'] }),\n };\n }\n // Pass the mpl event to the overridden (by mpl) onmessage function.\n ws.onmessage(data);\n });\n return ws;\n};\n\nmpl.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(\"
\");\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\nmpl.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 '';\n fig.close_ws(fig, msg);\n};\n\nmpl.figure.prototype.close_ws = function (fig, msg) {\n fig.send_message('closing', msg);\n // fig.ws.close()\n};\n\nmpl.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 '';\n};\n\nmpl.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\nmpl.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 = '';\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 = '';\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\nmpl.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\nmpl.figure.prototype._root_extra_style = function (el) {\n el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n};\n\nmpl.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\nmpl.figure.prototype._key_event_extra = function (event, _name) {\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\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n fig.ondownload(fig, null);\n};\n\nmpl.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.\nif (IPython.notebook.kernel !== null) {\n IPython.notebook.kernel.comm_manager.register_target(\n 'matplotlib',\n mpl.mpl_figure_comm\n );\n}\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "f = 232.4375 ± 0.3994 Hz\n" + ] + } + ], + "source": [ + "def damp_osci(t, t0, A, B, nu, gamma):\n", + " return A * np.exp(-gamma*t)*np.sin(2*np.pi*nu*(t-t0)) + B\n", + "\n", + "yvals = val_mean#.sel(blink_on_time=slice(0.005, 0.025))\n", + "yvals_std = std_mean#.sel(blink_on_time=slice(0.005, 0.025))\n", + "xvals = dataSet_cropOD[scanAxis[0]]#.sel(blink_on_time=slice(0.005, 0.025))\n", + "\n", + "fitted_qtys_1 = yvals.to_numpy()\n", + "scan_para = xvals.to_numpy()\n", + "fitted_qtys_err_1 = yvals_std.to_numpy()\n", + "\n", + "\n", + "plt.figure()\n", + "popt_x, pcov_x = curve_fit(damp_osci, scan_para, fitted_qtys_1, np.array([0, 3, 147, 3e2, 0.1]))\n", + "freqdata = np.linspace(0.005, 20e-3, 500)\n", + "plt.plot(freqdata, damp_osci(freqdata, *popt_x), 'g--',label='fit: t0=%5.3f, A=%5.3f, B=%5.3f, nu=%5.3f, Gamma=%5.3f' % tuple(popt_x))\n", + "plt.errorbar(scan_para, fitted_qtys_1, yerr=fitted_qtys_err_1, fmt='or')\n", + "plt.xlabel('hold time after switch on the trap (s)')\n", + "plt.ylabel('Center along gravity direction (pixels)')\n", + "plt.tight_layout()\n", + "plt.grid(visible=1)\n", + "#plt.ylim([0,750])\n", + "#plt.xlim([0.004, 0.025])\n", + "#plt.legend(prop={'size': 14})\n", + "plt.show()\n", + "\n", + "f_x = popt_x[3]\n", + "df_x = pcov_x[3][3]**0.5\n", + "\n", + "print('f = %.4f \\u00B1 %.4f Hz'% tuple([np.abs(f_x),df_x]))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Truncation: 0.75" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The detected scaning axes and values are: \n", + "\n", + "{'mod_blink_on_time': array([0.005 , 0.0057, 0.0064, 0.0071, 0.0078, 0.0085, 0.0092, 0.0099,\n", + " 0.0106, 0.0113, 0.012 , 0.0127, 0.0134, 0.0141, 0.0148, 0.0155,\n", + " 0.0162, 0.0169, 0.0176, 0.0183, 0.019 , 0.0197]), 'runs': array([0., 1., 2., 3.])}\n" + ] + }, + { + "data": { + "application/javascript": "/* Put everything inside the global mpl namespace */\n/* global mpl */\nwindow.mpl = {};\n\nmpl.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\nmpl.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_device_pixel_ratio', {\n device_pixel_ratio: fig.ratio,\n });\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\nmpl.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\nmpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n\nmpl.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 rubberband_canvas.addEventListener(\n 'dblclick',\n on_mouse_event_closure('dblclick')\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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.figure.prototype.handle_figure_label = function (fig, msg) {\n // Updates the figure title.\n fig.header.textContent = msg['label'];\n};\n\nmpl.figure.prototype.handle_cursor = function (fig, msg) {\n fig.rubberband_canvas.style.cursor = msg['cursor'];\n};\n\nmpl.figure.prototype.handle_message = function (fig, msg) {\n fig.message.textContent = msg['message'];\n};\n\nmpl.figure.prototype.handle_draw = function (fig, _msg) {\n // Request the server to send over a new figure.\n fig.send_draw_message();\n};\n\nmpl.figure.prototype.handle_image_mode = function (fig, msg) {\n fig.image_mode = msg['mode'];\n};\n\nmpl.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\nmpl.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\nmpl.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.\nmpl.figure.prototype._make_on_message_function = function (fig) {\n return function socket_on_message(evt) {\n if (evt.data instanceof Blob) {\n var img = evt.data;\n if (img.type !== 'image/png') {\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 img.type = 'image/png';\n }\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 img\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 https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\nmpl.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 * https://stackoverflow.com/a/24161582/3208463\n */\nfunction 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\nmpl.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\nmpl.figure.prototype._key_event_extra = function (_event, _name) {\n // Handle any extra behaviour associated with a key event\n};\n\nmpl.figure.prototype.key_event = function (event, name) {\n // Prevent repeat events\n if (name === 'key_press') {\n if (event.key === this._key) {\n return;\n } else {\n this._key = event.key;\n }\n }\n if (name === 'key_release') {\n this._key = null;\n }\n\n var value = '';\n if (event.ctrlKey && event.key !== 'Control') {\n value += 'ctrl+';\n }\n else if (event.altKey && event.key !== 'Alt') {\n value += 'alt+';\n }\n else if (event.shiftKey && event.key !== 'Shift') {\n value += 'shift+';\n }\n\n value += 'k' + event.key;\n\n this._key_event_extra(event, name);\n\n this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n return false;\n};\n\nmpl.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\nmpl.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\nvar _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\nmpl.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\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n\nmpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n\nmpl.default_extension = \"png\";/* global mpl */\n\nvar 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.binaryType = comm.kernel.ws.binaryType;\n ws.readyState = comm.kernel.ws.readyState;\n function updateReadyState(_event) {\n if (comm.kernel.ws) {\n ws.readyState = comm.kernel.ws.readyState;\n } else {\n ws.readyState = 3; // Closed state.\n }\n }\n comm.kernel.ws.addEventListener('open', updateReadyState);\n comm.kernel.ws.addEventListener('close', updateReadyState);\n comm.kernel.ws.addEventListener('error', updateReadyState);\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 var data = msg['content']['data'];\n if (data['blob'] !== undefined) {\n data = {\n data: new Blob(msg['buffers'], { type: data['blob'] }),\n };\n }\n // Pass the mpl event to the overridden (by mpl) onmessage function.\n ws.onmessage(data);\n });\n return ws;\n};\n\nmpl.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(\"
\");\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\nmpl.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 '';\n fig.close_ws(fig, msg);\n};\n\nmpl.figure.prototype.close_ws = function (fig, msg) {\n fig.send_message('closing', msg);\n // fig.ws.close()\n};\n\nmpl.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 '';\n};\n\nmpl.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\nmpl.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 = '';\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 = '';\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\nmpl.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\nmpl.figure.prototype._root_extra_style = function (el) {\n el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n};\n\nmpl.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\nmpl.figure.prototype._key_event_extra = function (event, _name) {\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\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n fig.ondownload(fig, null);\n};\n\nmpl.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.\nif (IPython.notebook.kernel !== null) {\n IPython.notebook.kernel.comm_manager.register_target(\n 'matplotlib',\n mpl.mpl_figure_comm\n );\n}\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "%matplotlib notebook\n", + "shotNum = \"0012\"\n", + "filePath = folderPath + \"/\" + shotNum + \"/*.h5\"\n", + "\n", + "dataSetDict = {\n", + " dskey[groupList[i]]: read_hdf5_file(filePath, groupList[i], excludeAxis = ['sweep_start_freq', 'sweep_stop_freq'])\n", + " for i in [0]\n", + "}\n", + "\n", + "dataSet = dataSetDict[\"camera_0\"]\n", + "\n", + "print_scanAxis(dataSet)\n", + "\n", + "scanAxis = get_scanAxis(dataSet)\n", + "\n", + "dataSet = auto_rechunk(dataSet)\n", + "\n", + "dataSet = imageAnalyser.get_absorption_images(dataSet)\n", + "\n", + "imageAnalyser.center = (800, 900)\n", + "imageAnalyser.span = (300, 300)\n", + "imageAnalyser.fraction = (0.1, 0.1)\n", + "\n", + "dataSet_cropOD = imageAnalyser.crop_image(dataSet.OD)\n", + "dataSet_cropOD = imageAnalyser.substract_offset(dataSet_cropOD).load()\n", + "\n", + "Ncount = imageAnalyser.get_Ncount(dataSet_cropOD)\n", + "Ncount_mean = calculate_mean(Ncount)\n", + "Ncount_std = calculate_std(Ncount)\n", + "\n", + "fig = plt.figure()\n", + "ax = fig.gca()\n", + "Ncount_mean.plot.errorbar(ax=ax, yerr = None, fmt='ob')\n", + "plt.ylabel('NCount')\n", + "plt.tight_layout()\n", + "plt.grid(visible=1)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 100, + "metadata": {}, + "outputs": [], + "source": [ + "dataSet_cropOD_chunk = dataSet_cropOD.chunk((1, 1, 300, 300))\n", + "fitAnalyser = FitAnalyser(\"Gaussian-2D\", fitDim=2)\n", + "params = fitAnalyser.guess(dataSet_cropOD_chunk, dask=\"parallelized\")\n", + "fitResult = fitAnalyser.fit(dataSet_cropOD_chunk, params, dask=\"parallelized\").load()" + ] + }, + { + "cell_type": "code", + "execution_count": 101, + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": "/* Put everything inside the global mpl namespace */\n/* global mpl */\nwindow.mpl = {};\n\nmpl.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\nmpl.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_device_pixel_ratio', {\n device_pixel_ratio: fig.ratio,\n });\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\nmpl.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\nmpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n\nmpl.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 rubberband_canvas.addEventListener(\n 'dblclick',\n on_mouse_event_closure('dblclick')\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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.figure.prototype.handle_figure_label = function (fig, msg) {\n // Updates the figure title.\n fig.header.textContent = msg['label'];\n};\n\nmpl.figure.prototype.handle_cursor = function (fig, msg) {\n fig.rubberband_canvas.style.cursor = msg['cursor'];\n};\n\nmpl.figure.prototype.handle_message = function (fig, msg) {\n fig.message.textContent = msg['message'];\n};\n\nmpl.figure.prototype.handle_draw = function (fig, _msg) {\n // Request the server to send over a new figure.\n fig.send_draw_message();\n};\n\nmpl.figure.prototype.handle_image_mode = function (fig, msg) {\n fig.image_mode = msg['mode'];\n};\n\nmpl.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\nmpl.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\nmpl.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.\nmpl.figure.prototype._make_on_message_function = function (fig) {\n return function socket_on_message(evt) {\n if (evt.data instanceof Blob) {\n var img = evt.data;\n if (img.type !== 'image/png') {\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 img.type = 'image/png';\n }\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 img\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 https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\nmpl.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 * https://stackoverflow.com/a/24161582/3208463\n */\nfunction 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\nmpl.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\nmpl.figure.prototype._key_event_extra = function (_event, _name) {\n // Handle any extra behaviour associated with a key event\n};\n\nmpl.figure.prototype.key_event = function (event, name) {\n // Prevent repeat events\n if (name === 'key_press') {\n if (event.key === this._key) {\n return;\n } else {\n this._key = event.key;\n }\n }\n if (name === 'key_release') {\n this._key = null;\n }\n\n var value = '';\n if (event.ctrlKey && event.key !== 'Control') {\n value += 'ctrl+';\n }\n else if (event.altKey && event.key !== 'Alt') {\n value += 'alt+';\n }\n else if (event.shiftKey && event.key !== 'Shift') {\n value += 'shift+';\n }\n\n value += 'k' + event.key;\n\n this._key_event_extra(event, name);\n\n this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n return false;\n};\n\nmpl.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\nmpl.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\nvar _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\nmpl.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\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n\nmpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n\nmpl.default_extension = \"png\";/* global mpl */\n\nvar 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.binaryType = comm.kernel.ws.binaryType;\n ws.readyState = comm.kernel.ws.readyState;\n function updateReadyState(_event) {\n if (comm.kernel.ws) {\n ws.readyState = comm.kernel.ws.readyState;\n } else {\n ws.readyState = 3; // Closed state.\n }\n }\n comm.kernel.ws.addEventListener('open', updateReadyState);\n comm.kernel.ws.addEventListener('close', updateReadyState);\n comm.kernel.ws.addEventListener('error', updateReadyState);\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 var data = msg['content']['data'];\n if (data['blob'] !== undefined) {\n data = {\n data: new Blob(msg['buffers'], { type: data['blob'] }),\n };\n }\n // Pass the mpl event to the overridden (by mpl) onmessage function.\n ws.onmessage(data);\n });\n return ws;\n};\n\nmpl.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(\"
\");\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\nmpl.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 '';\n fig.close_ws(fig, msg);\n};\n\nmpl.figure.prototype.close_ws = function (fig, msg) {\n fig.send_message('closing', msg);\n // fig.ws.close()\n};\n\nmpl.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 '';\n};\n\nmpl.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\nmpl.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 = '';\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 = '';\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\nmpl.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\nmpl.figure.prototype._root_extra_style = function (el) {\n el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n};\n\nmpl.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\nmpl.figure.prototype._key_event_extra = function (event, _name) {\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\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n fig.ondownload(fig, null);\n};\n\nmpl.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.\nif (IPython.notebook.kernel !== null) {\n IPython.notebook.kernel.comm_manager.register_target(\n 'matplotlib',\n mpl.mpl_figure_comm\n );\n}\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "val = fitAnalyser.get_fit_value(fitResult)\n", + "std = fitAnalyser.get_fit_std(fitResult)\n", + "\n", + "fitCurve = fitAnalyser.eval(fitResult, x=np.arange(300), y=np.arange(300), dask=\"parallelized\").load()\n", + "\n", + "# dataKey = 'sigmax'\n", + "# dataKey = 'centerx'\n", + "# dataKey = 'sigmay'\n", + "dataKey = 'centery'\n", + "\n", + "# val_mean = val[dataKey].mean(dim='runs')\n", + "# std_mean = val[dataKey].std(dim='runs')\n", + "\n", + "val_mean = calculate_mean(val[dataKey])\n", + "std_mean = calculate_std(val[dataKey])\n", + "\n", + "fig = plt.figure()\n", + "ax = fig.gca()\n", + "\n", + "val_mean.plot.errorbar(yerr=std_mean, fmt='--ob')\n", + "\n", + "plt.grid()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 103, + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": "/* Put everything inside the global mpl namespace */\n/* global mpl */\nwindow.mpl = {};\n\nmpl.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\nmpl.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_device_pixel_ratio', {\n device_pixel_ratio: fig.ratio,\n });\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\nmpl.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\nmpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n\nmpl.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 rubberband_canvas.addEventListener(\n 'dblclick',\n on_mouse_event_closure('dblclick')\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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.figure.prototype.handle_figure_label = function (fig, msg) {\n // Updates the figure title.\n fig.header.textContent = msg['label'];\n};\n\nmpl.figure.prototype.handle_cursor = function (fig, msg) {\n fig.rubberband_canvas.style.cursor = msg['cursor'];\n};\n\nmpl.figure.prototype.handle_message = function (fig, msg) {\n fig.message.textContent = msg['message'];\n};\n\nmpl.figure.prototype.handle_draw = function (fig, _msg) {\n // Request the server to send over a new figure.\n fig.send_draw_message();\n};\n\nmpl.figure.prototype.handle_image_mode = function (fig, msg) {\n fig.image_mode = msg['mode'];\n};\n\nmpl.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\nmpl.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\nmpl.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.\nmpl.figure.prototype._make_on_message_function = function (fig) {\n return function socket_on_message(evt) {\n if (evt.data instanceof Blob) {\n var img = evt.data;\n if (img.type !== 'image/png') {\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 img.type = 'image/png';\n }\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 img\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 https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\nmpl.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 * https://stackoverflow.com/a/24161582/3208463\n */\nfunction 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\nmpl.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\nmpl.figure.prototype._key_event_extra = function (_event, _name) {\n // Handle any extra behaviour associated with a key event\n};\n\nmpl.figure.prototype.key_event = function (event, name) {\n // Prevent repeat events\n if (name === 'key_press') {\n if (event.key === this._key) {\n return;\n } else {\n this._key = event.key;\n }\n }\n if (name === 'key_release') {\n this._key = null;\n }\n\n var value = '';\n if (event.ctrlKey && event.key !== 'Control') {\n value += 'ctrl+';\n }\n else if (event.altKey && event.key !== 'Alt') {\n value += 'alt+';\n }\n else if (event.shiftKey && event.key !== 'Shift') {\n value += 'shift+';\n }\n\n value += 'k' + event.key;\n\n this._key_event_extra(event, name);\n\n this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n return false;\n};\n\nmpl.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\nmpl.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\nvar _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\nmpl.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\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n\nmpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n\nmpl.default_extension = \"png\";/* global mpl */\n\nvar 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.binaryType = comm.kernel.ws.binaryType;\n ws.readyState = comm.kernel.ws.readyState;\n function updateReadyState(_event) {\n if (comm.kernel.ws) {\n ws.readyState = comm.kernel.ws.readyState;\n } else {\n ws.readyState = 3; // Closed state.\n }\n }\n comm.kernel.ws.addEventListener('open', updateReadyState);\n comm.kernel.ws.addEventListener('close', updateReadyState);\n comm.kernel.ws.addEventListener('error', updateReadyState);\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 var data = msg['content']['data'];\n if (data['blob'] !== undefined) {\n data = {\n data: new Blob(msg['buffers'], { type: data['blob'] }),\n };\n }\n // Pass the mpl event to the overridden (by mpl) onmessage function.\n ws.onmessage(data);\n });\n return ws;\n};\n\nmpl.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(\"
\");\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\nmpl.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 '';\n fig.close_ws(fig, msg);\n};\n\nmpl.figure.prototype.close_ws = function (fig, msg) {\n fig.send_message('closing', msg);\n // fig.ws.close()\n};\n\nmpl.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 '';\n};\n\nmpl.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\nmpl.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 = '';\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 = '';\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\nmpl.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\nmpl.figure.prototype._root_extra_style = function (el) {\n el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n};\n\nmpl.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\nmpl.figure.prototype._key_event_extra = function (event, _name) {\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\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n fig.ondownload(fig, null);\n};\n\nmpl.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.\nif (IPython.notebook.kernel !== null) {\n IPython.notebook.kernel.comm_manager.register_target(\n 'matplotlib',\n mpl.mpl_figure_comm\n );\n}\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "f = 224.9906 ± 0.4995 Hz\n" + ] + } + ], + "source": [ + "def damp_osci(t, t0, A, B, nu, gamma):\n", + " return A * np.exp(-gamma*t)*np.sin(2*np.pi*nu*(t-t0)) + B\n", + "\n", + "yvals = val_mean#.sel(blink_on_time=slice(0.005, 0.025))\n", + "yvals_std = std_mean#.sel(blink_on_time=slice(0.005, 0.025))\n", + "xvals = dataSet_cropOD[scanAxis[0]]#.sel(blink_on_time=slice(0.005, 0.025))\n", + "\n", + "fitted_qtys_1 = yvals.to_numpy()\n", + "scan_para = xvals.to_numpy()\n", + "fitted_qtys_err_1 = yvals_std.to_numpy()\n", + "\n", + "\n", + "plt.figure()\n", + "popt_x, pcov_x = curve_fit(damp_osci, scan_para, fitted_qtys_1, np.array([0, 3, 147, 3e2, 0.1]))\n", + "freqdata = np.linspace(0.005, 20e-3, 500)\n", + "plt.plot(freqdata, damp_osci(freqdata, *popt_x), 'g--',label='fit: t0=%5.3f, A=%5.3f, B=%5.3f, nu=%5.3f, Gamma=%5.3f' % tuple(popt_x))\n", + "plt.errorbar(scan_para, fitted_qtys_1, yerr=fitted_qtys_err_1, fmt='or')\n", + "plt.xlabel('hold time after switch on the trap (s)')\n", + "plt.ylabel('Center along gravity direction (pixels)')\n", + "plt.tight_layout()\n", + "plt.grid(visible=1)\n", + "#plt.ylim([0,750])\n", + "#plt.xlim([0.004, 0.025])\n", + "#plt.legend(prop={'size': 14})\n", + "plt.show()\n", + "\n", + "f_x = popt_x[3]\n", + "df_x = pcov_x[3][3]**0.5\n", + "\n", + "print('f = %.4f \\u00B1 %.4f Hz'% tuple([np.abs(f_x),df_x]))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Truncation: 0.775" + ] + }, + { + "cell_type": "code", + "execution_count": 128, + "metadata": {}, + "outputs": [ + { + "ename": "OSError", + "evalue": "[Errno group not found: images] 'images'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mOSError\u001b[0m Traceback (most recent call last)", + "Input \u001b[1;32mIn [128]\u001b[0m, in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 2\u001b[0m shotNum \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m0013\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 3\u001b[0m filePath \u001b[38;5;241m=\u001b[39m folderPath \u001b[38;5;241m+\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m/\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;241m+\u001b[39m shotNum \u001b[38;5;241m+\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m/*.h5\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m----> 5\u001b[0m dataSetDict \u001b[38;5;241m=\u001b[39m {\n\u001b[0;32m 6\u001b[0m dskey[groupList[i]]: read_hdf5_file(filePath, groupList[i], excludeAxis \u001b[38;5;241m=\u001b[39m [\u001b[38;5;124m'\u001b[39m\u001b[38;5;124msweep_start_freq\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124msweep_stop_freq\u001b[39m\u001b[38;5;124m'\u001b[39m])\n\u001b[0;32m 7\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i \u001b[38;5;129;01min\u001b[39;00m [\u001b[38;5;241m0\u001b[39m]\n\u001b[0;32m 8\u001b[0m }\n\u001b[0;32m 10\u001b[0m dataSet \u001b[38;5;241m=\u001b[39m dataSetDict[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcamera_0\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n\u001b[0;32m 12\u001b[0m print_scanAxis(dataSet)\n", + "Input \u001b[1;32mIn [128]\u001b[0m, in \u001b[0;36m\u001b[1;34m(.0)\u001b[0m\n\u001b[0;32m 2\u001b[0m shotNum \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m0013\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 3\u001b[0m filePath \u001b[38;5;241m=\u001b[39m folderPath \u001b[38;5;241m+\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m/\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;241m+\u001b[39m shotNum \u001b[38;5;241m+\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m/*.h5\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m 5\u001b[0m dataSetDict \u001b[38;5;241m=\u001b[39m {\n\u001b[1;32m----> 6\u001b[0m dskey[groupList[i]]: \u001b[43mread_hdf5_file\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfilePath\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mgroupList\u001b[49m\u001b[43m[\u001b[49m\u001b[43mi\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexcludeAxis\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m \u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43msweep_start_freq\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43msweep_stop_freq\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 7\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i \u001b[38;5;129;01min\u001b[39;00m [\u001b[38;5;241m0\u001b[39m]\n\u001b[0;32m 8\u001b[0m }\n\u001b[0;32m 10\u001b[0m dataSet \u001b[38;5;241m=\u001b[39m dataSetDict[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcamera_0\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n\u001b[0;32m 12\u001b[0m print_scanAxis(dataSet)\n", + "File \u001b[1;32mZ:\\Dy_Lab\\Data\\Analysis\\2023\\07\\31\\DataContainer\\ReadData.py:170\u001b[0m, in \u001b[0;36mread_hdf5_file\u001b[1;34m(filePath, group, datesetOfGlobal, preprocess, join, parallel, engine, phony_dims, excludeAxis, maxFileNum, **kwargs)\u001b[0m\n\u001b[0;32m 167\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 168\u001b[0m kwargs\u001b[38;5;241m.\u001b[39mupdate({\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mpreprocess\u001b[39m\u001b[38;5;124m'\u001b[39m:preprocess})\n\u001b[1;32m--> 170\u001b[0m ds \u001b[38;5;241m=\u001b[39m xr\u001b[38;5;241m.\u001b[39mopen_mfdataset(fullFilePath, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[0;32m 172\u001b[0m newDimKey \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39mappend([\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mx\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124my\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mz\u001b[39m\u001b[38;5;124m'\u001b[39m], [ \u001b[38;5;28mchr\u001b[39m(i) \u001b[38;5;28;01mfor\u001b[39;00m i \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mrange\u001b[39m(\u001b[38;5;241m97\u001b[39m, \u001b[38;5;241m97\u001b[39m\u001b[38;5;241m+\u001b[39m\u001b[38;5;241m23\u001b[39m)])\n\u001b[0;32m 174\u001b[0m oldDimKey \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39msort(\n\u001b[0;32m 175\u001b[0m [\n\u001b[0;32m 176\u001b[0m key \n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 179\u001b[0m ]\n\u001b[0;32m 180\u001b[0m )\n", + "File \u001b[1;32m~\\anaconda3\\envs\\py39\\lib\\site-packages\\xarray\\backends\\api.py:990\u001b[0m, in \u001b[0;36mopen_mfdataset\u001b[1;34m(paths, chunks, concat_dim, compat, preprocess, engine, data_vars, coords, combine, parallel, join, attrs_file, combine_attrs, **kwargs)\u001b[0m\n\u001b[0;32m 985\u001b[0m datasets \u001b[38;5;241m=\u001b[39m [preprocess(ds) \u001b[38;5;28;01mfor\u001b[39;00m ds \u001b[38;5;129;01min\u001b[39;00m datasets]\n\u001b[0;32m 987\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m parallel:\n\u001b[0;32m 988\u001b[0m \u001b[38;5;66;03m# calling compute here will return the datasets/file_objs lists,\u001b[39;00m\n\u001b[0;32m 989\u001b[0m \u001b[38;5;66;03m# the underlying datasets will still be stored as dask arrays\u001b[39;00m\n\u001b[1;32m--> 990\u001b[0m datasets, closers \u001b[38;5;241m=\u001b[39m \u001b[43mdask\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcompute\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdatasets\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mclosers\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 992\u001b[0m \u001b[38;5;66;03m# Combine all datasets, closing them in case of a ValueError\u001b[39;00m\n\u001b[0;32m 993\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n", + "File \u001b[1;32m~\\anaconda3\\envs\\py39\\lib\\site-packages\\dask\\base.py:599\u001b[0m, in \u001b[0;36mcompute\u001b[1;34m(traverse, optimize_graph, scheduler, get, *args, **kwargs)\u001b[0m\n\u001b[0;32m 596\u001b[0m keys\u001b[38;5;241m.\u001b[39mappend(x\u001b[38;5;241m.\u001b[39m__dask_keys__())\n\u001b[0;32m 597\u001b[0m postcomputes\u001b[38;5;241m.\u001b[39mappend(x\u001b[38;5;241m.\u001b[39m__dask_postcompute__())\n\u001b[1;32m--> 599\u001b[0m results \u001b[38;5;241m=\u001b[39m schedule(dsk, keys, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[0;32m 600\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m repack([f(r, \u001b[38;5;241m*\u001b[39ma) \u001b[38;5;28;01mfor\u001b[39;00m r, (f, a) \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mzip\u001b[39m(results, postcomputes)])\n", + "File \u001b[1;32m~\\anaconda3\\envs\\py39\\lib\\site-packages\\distributed\\client.py:3224\u001b[0m, in \u001b[0;36mClient.get\u001b[1;34m(self, dsk, keys, workers, allow_other_workers, resources, sync, asynchronous, direct, retries, priority, fifo_timeout, actors, **kwargs)\u001b[0m\n\u001b[0;32m 3222\u001b[0m should_rejoin \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m\n\u001b[0;32m 3223\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m-> 3224\u001b[0m results \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgather\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpacked\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43masynchronous\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43masynchronous\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdirect\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdirect\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 3225\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[0;32m 3226\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m f \u001b[38;5;129;01min\u001b[39;00m futures\u001b[38;5;241m.\u001b[39mvalues():\n", + "File \u001b[1;32m~\\anaconda3\\envs\\py39\\lib\\site-packages\\distributed\\client.py:2359\u001b[0m, in \u001b[0;36mClient.gather\u001b[1;34m(self, futures, errors, direct, asynchronous)\u001b[0m\n\u001b[0;32m 2357\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 2358\u001b[0m local_worker \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m-> 2359\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msync\u001b[49m\u001b[43m(\u001b[49m\n\u001b[0;32m 2360\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_gather\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 2361\u001b[0m \u001b[43m \u001b[49m\u001b[43mfutures\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 2362\u001b[0m \u001b[43m \u001b[49m\u001b[43merrors\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43merrors\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 2363\u001b[0m \u001b[43m \u001b[49m\u001b[43mdirect\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdirect\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 2364\u001b[0m \u001b[43m \u001b[49m\u001b[43mlocal_worker\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlocal_worker\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 2365\u001b[0m \u001b[43m \u001b[49m\u001b[43masynchronous\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43masynchronous\u001b[49m\u001b[43m,\u001b[49m\n\u001b[0;32m 2366\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[1;32m~\\anaconda3\\envs\\py39\\lib\\site-packages\\distributed\\utils.py:351\u001b[0m, in \u001b[0;36mSyncMethodMixin.sync\u001b[1;34m(self, func, asynchronous, callback_timeout, *args, **kwargs)\u001b[0m\n\u001b[0;32m 349\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m future\n\u001b[0;32m 350\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m--> 351\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m sync(\n\u001b[0;32m 352\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mloop, func, \u001b[38;5;241m*\u001b[39margs, callback_timeout\u001b[38;5;241m=\u001b[39mcallback_timeout, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs\n\u001b[0;32m 353\u001b[0m )\n", + "File \u001b[1;32m~\\anaconda3\\envs\\py39\\lib\\site-packages\\distributed\\utils.py:418\u001b[0m, in \u001b[0;36msync\u001b[1;34m(loop, func, callback_timeout, *args, **kwargs)\u001b[0m\n\u001b[0;32m 416\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m error:\n\u001b[0;32m 417\u001b[0m typ, exc, tb \u001b[38;5;241m=\u001b[39m error\n\u001b[1;32m--> 418\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m exc\u001b[38;5;241m.\u001b[39mwith_traceback(tb)\n\u001b[0;32m 419\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 420\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m result\n", + "File \u001b[1;32m~\\anaconda3\\envs\\py39\\lib\\site-packages\\distributed\\utils.py:391\u001b[0m, in \u001b[0;36msync..f\u001b[1;34m()\u001b[0m\n\u001b[0;32m 389\u001b[0m future \u001b[38;5;241m=\u001b[39m wait_for(future, callback_timeout)\n\u001b[0;32m 390\u001b[0m future \u001b[38;5;241m=\u001b[39m asyncio\u001b[38;5;241m.\u001b[39mensure_future(future)\n\u001b[1;32m--> 391\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01myield\u001b[39;00m future\n\u001b[0;32m 392\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m:\n\u001b[0;32m 393\u001b[0m error \u001b[38;5;241m=\u001b[39m sys\u001b[38;5;241m.\u001b[39mexc_info()\n", + "File \u001b[1;32m~\\anaconda3\\envs\\py39\\lib\\site-packages\\tornado\\gen.py:762\u001b[0m, in \u001b[0;36mRunner.run\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 759\u001b[0m exc_info \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m 761\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[1;32m--> 762\u001b[0m value \u001b[38;5;241m=\u001b[39m \u001b[43mfuture\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mresult\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 763\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m:\n\u001b[0;32m 764\u001b[0m exc_info \u001b[38;5;241m=\u001b[39m sys\u001b[38;5;241m.\u001b[39mexc_info()\n", + "File \u001b[1;32m~\\anaconda3\\envs\\py39\\lib\\site-packages\\distributed\\client.py:2222\u001b[0m, in \u001b[0;36mClient._gather\u001b[1;34m(self, futures, errors, direct, local_worker)\u001b[0m\n\u001b[0;32m 2220\u001b[0m exc \u001b[38;5;241m=\u001b[39m CancelledError(key)\n\u001b[0;32m 2221\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m-> 2222\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m exception\u001b[38;5;241m.\u001b[39mwith_traceback(traceback)\n\u001b[0;32m 2223\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m exc\n\u001b[0;32m 2224\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m errors \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mskip\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n", + "File \u001b[1;32m~\\anaconda3\\envs\\py39\\lib\\site-packages\\dask\\utils.py:73\u001b[0m, in \u001b[0;36mapply\u001b[1;34m()\u001b[0m\n\u001b[0;32m 42\u001b[0m \u001b[38;5;124;03m\"\"\"Apply a function given its positional and keyword arguments.\u001b[39;00m\n\u001b[0;32m 43\u001b[0m \n\u001b[0;32m 44\u001b[0m \u001b[38;5;124;03mEquivalent to ``func(*args, **kwargs)``\u001b[39;00m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 70\u001b[0m \u001b[38;5;124;03m>>> dsk = {'task-name': task} # adds the task to a low level Dask task graph\u001b[39;00m\n\u001b[0;32m 71\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[0;32m 72\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m kwargs:\n\u001b[1;32m---> 73\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m func(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[0;32m 74\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 75\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m func(\u001b[38;5;241m*\u001b[39margs)\n", + "File \u001b[1;32m~\\anaconda3\\envs\\py39\\lib\\site-packages\\xarray\\backends\\api.py:525\u001b[0m, in \u001b[0;36mopen_dataset\u001b[1;34m()\u001b[0m\n\u001b[0;32m 513\u001b[0m decoders \u001b[38;5;241m=\u001b[39m _resolve_decoders_kwargs(\n\u001b[0;32m 514\u001b[0m decode_cf,\n\u001b[0;32m 515\u001b[0m open_backend_dataset_parameters\u001b[38;5;241m=\u001b[39mbackend\u001b[38;5;241m.\u001b[39mopen_dataset_parameters,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 521\u001b[0m decode_coords\u001b[38;5;241m=\u001b[39mdecode_coords,\n\u001b[0;32m 522\u001b[0m )\n\u001b[0;32m 524\u001b[0m overwrite_encoded_chunks \u001b[38;5;241m=\u001b[39m kwargs\u001b[38;5;241m.\u001b[39mpop(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moverwrite_encoded_chunks\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m)\n\u001b[1;32m--> 525\u001b[0m backend_ds \u001b[38;5;241m=\u001b[39m backend\u001b[38;5;241m.\u001b[39mopen_dataset(\n\u001b[0;32m 526\u001b[0m filename_or_obj,\n\u001b[0;32m 527\u001b[0m drop_variables\u001b[38;5;241m=\u001b[39mdrop_variables,\n\u001b[0;32m 528\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mdecoders,\n\u001b[0;32m 529\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs,\n\u001b[0;32m 530\u001b[0m )\n\u001b[0;32m 531\u001b[0m ds \u001b[38;5;241m=\u001b[39m _dataset_from_backend_dataset(\n\u001b[0;32m 532\u001b[0m backend_ds,\n\u001b[0;32m 533\u001b[0m filename_or_obj,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 541\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs,\n\u001b[0;32m 542\u001b[0m )\n\u001b[0;32m 543\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m ds\n", + "File \u001b[1;32m~\\anaconda3\\envs\\py39\\lib\\site-packages\\xarray\\backends\\h5netcdf_.py:413\u001b[0m, in \u001b[0;36mopen_dataset\u001b[1;34m()\u001b[0m\n\u001b[0;32m 394\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mopen_dataset\u001b[39m( \u001b[38;5;66;03m# type: ignore[override] # allow LSP violation, not supporting **kwargs\u001b[39;00m\n\u001b[0;32m 395\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[0;32m 396\u001b[0m filename_or_obj: \u001b[38;5;28mstr\u001b[39m \u001b[38;5;241m|\u001b[39m os\u001b[38;5;241m.\u001b[39mPathLike[Any] \u001b[38;5;241m|\u001b[39m BufferedIOBase \u001b[38;5;241m|\u001b[39m AbstractDataStore,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 410\u001b[0m decode_vlen_strings\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m,\n\u001b[0;32m 411\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Dataset:\n\u001b[0;32m 412\u001b[0m filename_or_obj \u001b[38;5;241m=\u001b[39m _normalize_path(filename_or_obj)\n\u001b[1;32m--> 413\u001b[0m store \u001b[38;5;241m=\u001b[39m H5NetCDFStore\u001b[38;5;241m.\u001b[39mopen(\n\u001b[0;32m 414\u001b[0m filename_or_obj,\n\u001b[0;32m 415\u001b[0m \u001b[38;5;28mformat\u001b[39m\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mformat\u001b[39m,\n\u001b[0;32m 416\u001b[0m group\u001b[38;5;241m=\u001b[39mgroup,\n\u001b[0;32m 417\u001b[0m lock\u001b[38;5;241m=\u001b[39mlock,\n\u001b[0;32m 418\u001b[0m invalid_netcdf\u001b[38;5;241m=\u001b[39minvalid_netcdf,\n\u001b[0;32m 419\u001b[0m phony_dims\u001b[38;5;241m=\u001b[39mphony_dims,\n\u001b[0;32m 420\u001b[0m decode_vlen_strings\u001b[38;5;241m=\u001b[39mdecode_vlen_strings,\n\u001b[0;32m 421\u001b[0m )\n\u001b[0;32m 423\u001b[0m store_entrypoint \u001b[38;5;241m=\u001b[39m StoreBackendEntrypoint()\n\u001b[0;32m 425\u001b[0m ds \u001b[38;5;241m=\u001b[39m store_entrypoint\u001b[38;5;241m.\u001b[39mopen_dataset(\n\u001b[0;32m 426\u001b[0m store,\n\u001b[0;32m 427\u001b[0m mask_and_scale\u001b[38;5;241m=\u001b[39mmask_and_scale,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 433\u001b[0m decode_timedelta\u001b[38;5;241m=\u001b[39mdecode_timedelta,\n\u001b[0;32m 434\u001b[0m )\n", + "File \u001b[1;32m~\\anaconda3\\envs\\py39\\lib\\site-packages\\xarray\\backends\\h5netcdf_.py:176\u001b[0m, in \u001b[0;36mopen\u001b[1;34m()\u001b[0m\n\u001b[0;32m 173\u001b[0m lock \u001b[38;5;241m=\u001b[39m combine_locks([HDF5_LOCK, get_write_lock(filename)])\n\u001b[0;32m 175\u001b[0m manager \u001b[38;5;241m=\u001b[39m CachingFileManager(h5netcdf\u001b[38;5;241m.\u001b[39mFile, filename, mode\u001b[38;5;241m=\u001b[39mmode, kwargs\u001b[38;5;241m=\u001b[39mkwargs)\n\u001b[1;32m--> 176\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mcls\u001b[39m(manager, group\u001b[38;5;241m=\u001b[39mgroup, mode\u001b[38;5;241m=\u001b[39mmode, lock\u001b[38;5;241m=\u001b[39mlock, autoclose\u001b[38;5;241m=\u001b[39mautoclose)\n", + "File \u001b[1;32m~\\anaconda3\\envs\\py39\\lib\\site-packages\\xarray\\backends\\h5netcdf_.py:127\u001b[0m, in \u001b[0;36m__init__\u001b[1;34m()\u001b[0m\n\u001b[0;32m 124\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mformat \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m 125\u001b[0m \u001b[38;5;66;03m# todo: utilizing find_root_and_group seems a bit clunky\u001b[39;00m\n\u001b[0;32m 126\u001b[0m \u001b[38;5;66;03m# making filename available on h5netcdf.Group seems better\u001b[39;00m\n\u001b[1;32m--> 127\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_filename \u001b[38;5;241m=\u001b[39m find_root_and_group(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mds)[\u001b[38;5;241m0\u001b[39m]\u001b[38;5;241m.\u001b[39mfilename\n\u001b[0;32m 128\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mis_remote \u001b[38;5;241m=\u001b[39m is_remote_uri(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_filename)\n\u001b[0;32m 129\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mlock \u001b[38;5;241m=\u001b[39m ensure_lock(lock)\n", + "File \u001b[1;32m~\\anaconda3\\envs\\py39\\lib\\site-packages\\xarray\\backends\\h5netcdf_.py:187\u001b[0m, in \u001b[0;36mds\u001b[1;34m()\u001b[0m\n\u001b[0;32m 185\u001b[0m \u001b[38;5;129m@property\u001b[39m\n\u001b[0;32m 186\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mds\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[1;32m--> 187\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_acquire()\n", + "File \u001b[1;32m~\\anaconda3\\envs\\py39\\lib\\site-packages\\xarray\\backends\\h5netcdf_.py:180\u001b[0m, in \u001b[0;36m_acquire\u001b[1;34m()\u001b[0m\n\u001b[0;32m 178\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_acquire\u001b[39m(\u001b[38;5;28mself\u001b[39m, needs_lock\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m):\n\u001b[0;32m 179\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_manager\u001b[38;5;241m.\u001b[39macquire_context(needs_lock) \u001b[38;5;28;01mas\u001b[39;00m root:\n\u001b[1;32m--> 180\u001b[0m ds \u001b[38;5;241m=\u001b[39m _nc4_require_group(\n\u001b[0;32m 181\u001b[0m root, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_group, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_mode, create_group\u001b[38;5;241m=\u001b[39m_h5netcdf_create_group\n\u001b[0;32m 182\u001b[0m )\n\u001b[0;32m 183\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m ds\n", + "File \u001b[1;32m~\\anaconda3\\envs\\py39\\lib\\site-packages\\xarray\\backends\\netCDF4_.py:191\u001b[0m, in \u001b[0;36m_nc4_require_group\u001b[1;34m()\u001b[0m\n\u001b[0;32m 188\u001b[0m ds \u001b[38;5;241m=\u001b[39m create_group(ds, key)\n\u001b[0;32m 189\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 190\u001b[0m \u001b[38;5;66;03m# wrap error to provide slightly more helpful message\u001b[39;00m\n\u001b[1;32m--> 191\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mOSError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mgroup not found: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mkey\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m, e)\n\u001b[0;32m 192\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m ds\n", + "\u001b[1;31mOSError\u001b[0m: [Errno group not found: images] 'images'" + ] + } + ], + "source": [ + "%matplotlib notebook\n", + "shotNum = \"0013\"\n", + "filePath = folderPath + \"/\" + shotNum + \"/*.h5\"\n", + "\n", + "dataSetDict = {\n", + " dskey[groupList[i]]: read_hdf5_file(filePath, groupList[i], excludeAxis = ['sweep_start_freq', 'sweep_stop_freq'])\n", + " for i in [0]\n", + "}\n", + "\n", + "dataSet = dataSetDict[\"camera_0\"]\n", + "\n", + "print_scanAxis(dataSet)\n", + "\n", + "scanAxis = get_scanAxis(dataSet)\n", + "\n", + "dataSet = auto_rechunk(dataSet)\n", + "\n", + "dataSet = imageAnalyser.get_absorption_images(dataSet)\n", + "\n", + "imageAnalyser.center = (800, 900)\n", + "imageAnalyser.span = (300, 300)\n", + "imageAnalyser.fraction = (0.1, 0.1)\n", + "\n", + "dataSet_cropOD = imageAnalyser.crop_image(dataSet.OD)\n", + "dataSet_cropOD = imageAnalyser.substract_offset(dataSet_cropOD).load()\n", + "\n", + "Ncount = imageAnalyser.get_Ncount(dataSet_cropOD)\n", + "Ncount_mean = calculate_mean(Ncount)\n", + "Ncount_std = calculate_std(Ncount)\n", + "\n", + "fig = plt.figure()\n", + "ax = fig.gca()\n", + "Ncount_mean.plot.errorbar(ax=ax, yerr = None, fmt='ob')\n", + "plt.ylabel('NCount')\n", + "plt.tight_layout()\n", + "plt.grid(visible=1)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dataSet_cropOD_chunk = dataSet_cropOD.chunk((1, 1, 300, 300))\n", + "fitAnalyser = FitAnalyser(\"Gaussian-2D\", fitDim=2)\n", + "params = fitAnalyser.guess(dataSet_cropOD_chunk, dask=\"parallelized\")\n", + "fitResult = fitAnalyser.fit(dataSet_cropOD_chunk, params, dask=\"parallelized\").load()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "val = fitAnalyser.get_fit_value(fitResult)\n", + "std = fitAnalyser.get_fit_std(fitResult)\n", + "\n", + "fitCurve = fitAnalyser.eval(fitResult, x=np.arange(300), y=np.arange(300), dask=\"parallelized\").load()\n", + "\n", + "# dataKey = 'sigmax'\n", + "# dataKey = 'centerx'\n", + "# dataKey = 'sigmay'\n", + "dataKey = 'centery'\n", + "\n", + "# val_mean = val[dataKey].mean(dim='runs')\n", + "# std_mean = val[dataKey].std(dim='runs')\n", + "\n", + "val_mean = calculate_mean(val[dataKey])\n", + "std_mean = calculate_std(val[dataKey])\n", + "\n", + "fig = plt.figure()\n", + "ax = fig.gca()\n", + "\n", + "val_mean.plot.errorbar(yerr=std_mean, fmt='--ob')\n", + "\n", + "plt.grid()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 129, + "metadata": {}, + "outputs": [ + { + "data": { + "application/javascript": "/* Put everything inside the global mpl namespace */\n/* global mpl */\nwindow.mpl = {};\n\nmpl.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\nmpl.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_device_pixel_ratio', {\n device_pixel_ratio: fig.ratio,\n });\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\nmpl.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\nmpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n\nmpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n\nmpl.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 rubberband_canvas.addEventListener(\n 'dblclick',\n on_mouse_event_closure('dblclick')\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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.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\nmpl.figure.prototype.handle_figure_label = function (fig, msg) {\n // Updates the figure title.\n fig.header.textContent = msg['label'];\n};\n\nmpl.figure.prototype.handle_cursor = function (fig, msg) {\n fig.rubberband_canvas.style.cursor = msg['cursor'];\n};\n\nmpl.figure.prototype.handle_message = function (fig, msg) {\n fig.message.textContent = msg['message'];\n};\n\nmpl.figure.prototype.handle_draw = function (fig, _msg) {\n // Request the server to send over a new figure.\n fig.send_draw_message();\n};\n\nmpl.figure.prototype.handle_image_mode = function (fig, msg) {\n fig.image_mode = msg['mode'];\n};\n\nmpl.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\nmpl.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\nmpl.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.\nmpl.figure.prototype._make_on_message_function = function (fig) {\n return function socket_on_message(evt) {\n if (evt.data instanceof Blob) {\n var img = evt.data;\n if (img.type !== 'image/png') {\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 img.type = 'image/png';\n }\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 img\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 https://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\nmpl.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 * https://stackoverflow.com/a/24161582/3208463\n */\nfunction 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\nmpl.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\nmpl.figure.prototype._key_event_extra = function (_event, _name) {\n // Handle any extra behaviour associated with a key event\n};\n\nmpl.figure.prototype.key_event = function (event, name) {\n // Prevent repeat events\n if (name === 'key_press') {\n if (event.key === this._key) {\n return;\n } else {\n this._key = event.key;\n }\n }\n if (name === 'key_release') {\n this._key = null;\n }\n\n var value = '';\n if (event.ctrlKey && event.key !== 'Control') {\n value += 'ctrl+';\n }\n else if (event.altKey && event.key !== 'Alt') {\n value += 'alt+';\n }\n else if (event.shiftKey && event.key !== 'Shift') {\n value += 'shift+';\n }\n\n value += 'k' + event.key;\n\n this._key_event_extra(event, name);\n\n this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n return false;\n};\n\nmpl.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\nmpl.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\nvar _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\nmpl.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\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n\nmpl.extensions = [\"eps\", \"jpeg\", \"pgf\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n\nmpl.default_extension = \"png\";/* global mpl */\n\nvar 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.binaryType = comm.kernel.ws.binaryType;\n ws.readyState = comm.kernel.ws.readyState;\n function updateReadyState(_event) {\n if (comm.kernel.ws) {\n ws.readyState = comm.kernel.ws.readyState;\n } else {\n ws.readyState = 3; // Closed state.\n }\n }\n comm.kernel.ws.addEventListener('open', updateReadyState);\n comm.kernel.ws.addEventListener('close', updateReadyState);\n comm.kernel.ws.addEventListener('error', updateReadyState);\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 var data = msg['content']['data'];\n if (data['blob'] !== undefined) {\n data = {\n data: new Blob(msg['buffers'], { type: data['blob'] }),\n };\n }\n // Pass the mpl event to the overridden (by mpl) onmessage function.\n ws.onmessage(data);\n });\n return ws;\n};\n\nmpl.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(\"
\");\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\nmpl.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 '';\n fig.close_ws(fig, msg);\n};\n\nmpl.figure.prototype.close_ws = function (fig, msg) {\n fig.send_message('closing', msg);\n // fig.ws.close()\n};\n\nmpl.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 '';\n};\n\nmpl.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\nmpl.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 = '';\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 = '';\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\nmpl.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\nmpl.figure.prototype._root_extra_style = function (el) {\n el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n};\n\nmpl.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\nmpl.figure.prototype._key_event_extra = function (event, _name) {\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\nmpl.figure.prototype.handle_save = function (fig, _msg) {\n fig.ondownload(fig, null);\n};\n\nmpl.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.\nif (IPython.notebook.kernel !== null) {\n IPython.notebook.kernel.comm_manager.register_target(\n 'matplotlib',\n mpl.mpl_figure_comm\n );\n}\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "f = 224.9906 ± 0.4995 Hz\n" + ] + } + ], + "source": [ + "def damp_osci(t, t0, A, B, nu, gamma):\n", + " return A * np.exp(-gamma*t)*np.sin(2*np.pi*nu*(t-t0)) + B\n", + "\n", + "yvals = val_mean#.sel(blink_on_time=slice(0.005, 0.025))\n", + "yvals_std = std_mean#.sel(blink_on_time=slice(0.005, 0.025))\n", + "xvals = dataSet_cropOD[scanAxis[0]]#.sel(blink_on_time=slice(0.005, 0.025))\n", + "\n", + "fitted_qtys_1 = yvals.to_numpy()\n", + "scan_para = xvals.to_numpy()\n", + "fitted_qtys_err_1 = yvals_std.to_numpy()\n", + "\n", + "\n", + "plt.figure()\n", + "popt_x, pcov_x = curve_fit(damp_osci, scan_para, fitted_qtys_1, np.array([0, 3, 147, 3e2, 0.1]))\n", + "freqdata = np.linspace(0.005, 19e-3, 500)\n", + "plt.plot(freqdata, damp_osci(freqdata, *popt_x), 'g--',label='fit: t0=%5.3f, A=%5.3f, B=%5.3f, nu=%5.3f, Gamma=%5.3f' % tuple(popt_x))\n", + "plt.errorbar(scan_para, fitted_qtys_1, yerr=fitted_qtys_err_1, fmt='or')\n", + "plt.xlabel('hold time after switch on the trap (s)')\n", + "plt.ylabel('Center along gravity direction (pixels)')\n", + "plt.tight_layout()\n", + "plt.grid(visible=1)\n", + "#plt.ylim([0,750])\n", + "#plt.xlim([0.004, 0.025])\n", + "#plt.legend(prop={'size': 14})\n", + "plt.show()\n", + "\n", + "f_x = popt_x[3]\n", + "df_x = pcov_x[3][3]**0.5\n", + "\n", + "print('f = %.4f \\u00B1 %.4f Hz'% tuple([np.abs(f_x),df_x]))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Truncation: 0.8" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib notebook\n", + "shotNum = \"0036\"\n", + "filePath = folderPath + \"/\" + shotNum + \"/*.h5\"\n", + "\n", + "dataSetDict = {\n", + " dskey[groupList[i]]: read_hdf5_file(filePath, groupList[i], excludeAxis = ['sweep_start_freq', 'sweep_stop_freq'])\n", + " for i in [0]\n", + "}\n", + "\n", + "dataSet = dataSetDict[\"camera_0\"]\n", + "\n", + "print_scanAxis(dataSet)\n", + "\n", + "scanAxis = get_scanAxis(dataSet)\n", + "\n", + "dataSet = auto_rechunk(dataSet)\n", + "\n", + "dataSet = imageAnalyser.get_absorption_images(dataSet)\n", + "\n", + "imageAnalyser.center = (800, 900)\n", + "imageAnalyser.span = (300, 300)\n", + "imageAnalyser.fraction = (0.1, 0.1)\n", + "\n", + "dataSet_cropOD = imageAnalyser.crop_image(dataSet.OD)\n", + "dataSet_cropOD = imageAnalyser.substract_offset(dataSet_cropOD).load()\n", + "\n", + "Ncount = imageAnalyser.get_Ncount(dataSet_cropOD)\n", + "Ncount_mean = calculate_mean(Ncount)\n", + "Ncount_std = calculate_std(Ncount)\n", + "\n", + "fig = plt.figure()\n", + "ax = fig.gca()\n", + "Ncount_mean.plot.errorbar(ax=ax, yerr = None, fmt='ob')\n", + "plt.ylabel('NCount')\n", + "plt.tight_layout()\n", + "plt.grid(visible=1)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dataSet_cropOD_chunk = dataSet_cropOD.chunk((1, 1, 300, 300))\n", + "fitAnalyser = FitAnalyser(\"Gaussian-2D\", fitDim=2)\n", + "params = fitAnalyser.guess(dataSet_cropOD_chunk, dask=\"parallelized\")\n", + "fitResult = fitAnalyser.fit(dataSet_cropOD_chunk, params, dask=\"parallelized\").load()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "val = fitAnalyser.get_fit_value(fitResult)\n", + "std = fitAnalyser.get_fit_std(fitResult)\n", + "\n", + "fitCurve = fitAnalyser.eval(fitResult, x=np.arange(300), y=np.arange(300), dask=\"parallelized\").load()\n", + "\n", + "# dataKey = 'sigmax'\n", + "# dataKey = 'centerx'\n", + "# dataKey = 'sigmay'\n", + "dataKey = 'centery'\n", + "\n", + "# val_mean = val[dataKey].mean(dim='runs')\n", + "# std_mean = val[dataKey].std(dim='runs')\n", + "\n", + "val_mean = calculate_mean(val[dataKey])\n", + "std_mean = calculate_std(val[dataKey])\n", + "\n", + "fig = plt.figure()\n", + "ax = fig.gca()\n", + "\n", + "val_mean.plot.errorbar(yerr=std_mean, fmt='--ob')\n", + "\n", + "plt.grid()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def damp_osci(t, t0, A, B, nu, gamma):\n", + " return A * np.exp(-gamma*t)*np.sin(2*np.pi*nu*(t-t0)) + B\n", + "\n", + "yvals = val_mean#.sel(blink_on_time=slice(0.005, 0.025))\n", + "yvals_std = std_mean#.sel(blink_on_time=slice(0.005, 0.025))\n", + "xvals = dataSet_cropOD[scanAxis[0]]#.sel(blink_on_time=slice(0.005, 0.025))\n", + "\n", + "fitted_qtys_1 = yvals.to_numpy()\n", + "scan_para = xvals.to_numpy()\n", + "fitted_qtys_err_1 = yvals_std.to_numpy()\n", + "\n", + "\n", + "plt.figure()\n", + "popt_x, pcov_x = curve_fit(damp_osci, scan_para, fitted_qtys_1, np.array([0, 3, 147, 2e2, 0.1]))\n", + "freqdata = np.linspace(0.005, 19e-3, 500)\n", + "plt.plot(freqdata, damp_osci(freqdata, *popt_x), 'g--',label='fit: t0=%5.3f, A=%5.3f, B=%5.3f, nu=%5.3f, Gamma=%5.3f' % tuple(popt_x))\n", + "plt.errorbar(scan_para, fitted_qtys_1, yerr=fitted_qtys_err_1, fmt='or')\n", + "plt.xlabel('hold time after switch on the trap (s)')\n", + "plt.ylabel('Center along gravity direction (pixels)')\n", + "plt.tight_layout()\n", + "plt.grid(visible=1)\n", + "#plt.ylim([0,750])\n", + "#plt.xlim([0.004, 0.025])\n", + "#plt.legend(prop={'size': 14})\n", + "plt.show()\n", + "\n", + "f_x = popt_x[3]\n", + "df_x = pcov_x[3][3]**0.5\n", + "\n", + "print('f = %.4f \\u00B1 %.4f Hz'% tuple([np.abs(f_x),df_x]))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Truncation: 0.85" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib notebook\n", + "shotNum = \"0038\"\n", + "filePath = folderPath + \"/\" + shotNum + \"/*.h5\"\n", + "\n", + "dataSetDict = {\n", + " dskey[groupList[i]]: read_hdf5_file(filePath, groupList[i], excludeAxis = ['sweep_start_freq', 'sweep_stop_freq'])\n", + " for i in [0]\n", + "}\n", + "\n", + "dataSet = dataSetDict[\"camera_0\"]\n", + "\n", + "print_scanAxis(dataSet)\n", + "\n", + "scanAxis = get_scanAxis(dataSet)\n", + "\n", + "dataSet = auto_rechunk(dataSet)\n", + "\n", + "dataSet = imageAnalyser.get_absorption_images(dataSet)\n", + "\n", + "imageAnalyser.center = (800, 900)\n", + "imageAnalyser.span = (300, 300)\n", + "imageAnalyser.fraction = (0.1, 0.1)\n", + "\n", + "dataSet_cropOD = imageAnalyser.crop_image(dataSet.OD)\n", + "dataSet_cropOD = imageAnalyser.substract_offset(dataSet_cropOD).load()\n", + "\n", + "Ncount = imageAnalyser.get_Ncount(dataSet_cropOD)\n", + "Ncount_mean = calculate_mean(Ncount)\n", + "Ncount_std = calculate_std(Ncount)\n", + "\n", + "fig = plt.figure()\n", + "ax = fig.gca()\n", + "Ncount_mean.plot.errorbar(ax=ax, yerr = None, fmt='ob')\n", + "plt.ylabel('NCount')\n", + "plt.tight_layout()\n", + "plt.grid(visible=1)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dataSet_cropOD_chunk = dataSet_cropOD.chunk((1, 1, 300, 300))\n", + "fitAnalyser = FitAnalyser(\"Gaussian-2D\", fitDim=2)\n", + "params = fitAnalyser.guess(dataSet_cropOD_chunk, dask=\"parallelized\")\n", + "fitResult = fitAnalyser.fit(dataSet_cropOD_chunk, params, dask=\"parallelized\").load()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "val = fitAnalyser.get_fit_value(fitResult)\n", + "std = fitAnalyser.get_fit_std(fitResult)\n", + "\n", + "fitCurve = fitAnalyser.eval(fitResult, x=np.arange(300), y=np.arange(300), dask=\"parallelized\").load()\n", + "\n", + "# dataKey = 'sigmax'\n", + "# dataKey = 'centerx'\n", + "# dataKey = 'sigmay'\n", + "dataKey = 'centery'\n", + "\n", + "# val_mean = val[dataKey].mean(dim='runs')\n", + "# std_mean = val[dataKey].std(dim='runs')\n", + "\n", + "val_mean = calculate_mean(val[dataKey])\n", + "std_mean = calculate_std(val[dataKey])\n", + "\n", + "fig = plt.figure()\n", + "ax = fig.gca()\n", + "\n", + "val_mean.plot.errorbar(yerr=std_mean, fmt='--ob')\n", + "\n", + "plt.grid()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def damp_osci(t, t0, A, B, nu, gamma):\n", + " return A * np.exp(-gamma*t)*np.sin(2*np.pi*nu*(t-t0)) + B\n", + "\n", + "yvals = val_mean#.sel(blink_on_time=slice(0.005, 0.025))\n", + "yvals_std = std_mean#.sel(blink_on_time=slice(0.005, 0.025))\n", + "xvals = dataSet_cropOD[scanAxis[0]]#.sel(blink_on_time=slice(0.005, 0.025))\n", + "\n", + "fitted_qtys_1 = yvals.to_numpy()\n", + "scan_para = xvals.to_numpy()\n", + "fitted_qtys_err_1 = yvals_std.to_numpy()\n", + "\n", + "\n", + "plt.figure()\n", + "popt_x, pcov_x = curve_fit(damp_osci, scan_para, fitted_qtys_1, np.array([0, 3, 147, 2e2, 0.1]))\n", + "freqdata = np.linspace(0.005, 19e-3, 500)\n", + "plt.plot(freqdata, damp_osci(freqdata, *popt_x), 'g--',label='fit: t0=%5.3f, A=%5.3f, B=%5.3f, nu=%5.3f, Gamma=%5.3f' % tuple(popt_x))\n", + "plt.errorbar(scan_para, fitted_qtys_1, yerr=fitted_qtys_err_1, fmt='or')\n", + "plt.xlabel('hold time after switch on the trap (s)')\n", + "plt.ylabel('Center along gravity direction (pixels)')\n", + "plt.tight_layout()\n", + "plt.grid(visible=1)\n", + "#plt.ylim([0,750])\n", + "#plt.xlim([0.004, 0.025])\n", + "#plt.legend(prop={'size': 14})\n", + "plt.show()\n", + "\n", + "f_x = popt_x[3]\n", + "df_x = pcov_x[3][3]**0.5\n", + "\n", + "print('f = %.4f \\u00B1 %.4f Hz'% tuple([np.abs(f_x),df_x]))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Truncation: 0.9" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib notebook\n", + "shotNum = \"0040\"\n", + "filePath = folderPath + \"/\" + shotNum + \"/*.h5\"\n", + "\n", + "dataSetDict = {\n", + " dskey[groupList[i]]: read_hdf5_file(filePath, groupList[i], excludeAxis = ['sweep_start_freq', 'sweep_stop_freq'])\n", + " for i in [0]\n", + "}\n", + "\n", + "dataSet = dataSetDict[\"camera_0\"]\n", + "\n", + "print_scanAxis(dataSet)\n", + "\n", + "scanAxis = get_scanAxis(dataSet)\n", + "\n", + "dataSet = auto_rechunk(dataSet)\n", + "\n", + "dataSet = imageAnalyser.get_absorption_images(dataSet)\n", + "\n", + "imageAnalyser.center = (800, 900)\n", + "imageAnalyser.span = (300, 300)\n", + "imageAnalyser.fraction = (0.1, 0.1)\n", + "\n", + "dataSet_cropOD = imageAnalyser.crop_image(dataSet.OD)\n", + "dataSet_cropOD = imageAnalyser.substract_offset(dataSet_cropOD).load()\n", + "\n", + "Ncount = imageAnalyser.get_Ncount(dataSet_cropOD)\n", + "Ncount_mean = calculate_mean(Ncount)\n", + "Ncount_std = calculate_std(Ncount)\n", + "\n", + "fig = plt.figure()\n", + "ax = fig.gca()\n", + "Ncount_mean.plot.errorbar(ax=ax, yerr = None, fmt='ob')\n", + "plt.ylabel('NCount')\n", + "plt.tight_layout()\n", + "plt.grid(visible=1)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dataSet_cropOD_chunk = dataSet_cropOD.chunk((1, 1, 300, 300))\n", + "fitAnalyser = FitAnalyser(\"Gaussian-2D\", fitDim=2)\n", + "params = fitAnalyser.guess(dataSet_cropOD_chunk, dask=\"parallelized\")\n", + "fitResult = fitAnalyser.fit(dataSet_cropOD_chunk, params, dask=\"parallelized\").load()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "val = fitAnalyser.get_fit_value(fitResult)\n", + "std = fitAnalyser.get_fit_std(fitResult)\n", + "\n", + "fitCurve = fitAnalyser.eval(fitResult, x=np.arange(300), y=np.arange(300), dask=\"parallelized\").load()\n", + "\n", + "# dataKey = 'sigmax'\n", + "# dataKey = 'centerx'\n", + "# dataKey = 'sigmay'\n", + "dataKey = 'centery'\n", + "\n", + "# val_mean = val[dataKey].mean(dim='runs')\n", + "# std_mean = val[dataKey].std(dim='runs')\n", + "\n", + "val_mean = calculate_mean(val[dataKey])\n", + "std_mean = calculate_std(val[dataKey])\n", + "\n", + "fig = plt.figure()\n", + "ax = fig.gca()\n", + "\n", + "val_mean.plot.errorbar(yerr=std_mean, fmt='--ob')\n", + "\n", + "plt.grid()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def damp_osci(t, t0, A, B, nu, gamma):\n", + " return A * np.exp(-gamma*t)*np.sin(2*np.pi*nu*(t-t0)) + B\n", + "\n", + "yvals = val_mean#.sel(blink_on_time=slice(0.005, 0.025))\n", + "yvals_std = std_mean#.sel(blink_on_time=slice(0.005, 0.025))\n", + "xvals = dataSet_cropOD[scanAxis[0]]#.sel(blink_on_time=slice(0.005, 0.025))\n", + "\n", + "fitted_qtys_1 = yvals.to_numpy()\n", + "scan_para = xvals.to_numpy()\n", + "fitted_qtys_err_1 = yvals_std.to_numpy()\n", + "\n", + "\n", + "plt.figure()\n", + "popt_x, pcov_x = curve_fit(damp_osci, scan_para, fitted_qtys_1, np.array([0, 3, 147, 2e2, 0.1]))\n", + "freqdata = np.linspace(0.005, 19e-3, 500)\n", + "plt.plot(freqdata, damp_osci(freqdata, *popt_x), 'g--',label='fit: t0=%5.3f, A=%5.3f, B=%5.3f, nu=%5.3f, Gamma=%5.3f' % tuple(popt_x))\n", + "plt.errorbar(scan_para, fitted_qtys_1, yerr=fitted_qtys_err_1, fmt='or')\n", + "plt.xlabel('hold time after switch on the trap (s)')\n", + "plt.ylabel('Center along gravity direction (pixels)')\n", + "plt.tight_layout()\n", + "plt.grid(visible=1)\n", + "#plt.ylim([0,750])\n", + "#plt.xlim([0.004, 0.025])\n", + "#plt.legend(prop={'size': 14})\n", + "plt.show()\n", + "\n", + "f_x = popt_x[3]\n", + "df_x = pcov_x[3][3]**0.5\n", + "\n", + "print('f = %.4f \\u00B1 %.4f Hz'% tuple([np.abs(f_x),df_x]))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAm8AAAHPCAYAAAAFwj37AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAA9hAAAPYQGoP6dpAABMqElEQVR4nO3de1yUdd7/8fcl4OCJFNBEQDFrM1J3W8ulLZJMCNHSyLrbtoPnNnXBrL3zAAoesDbr1szb1krRtNMqWpaimLrZwdafdd+r22E76KaopXigVHDE6/fH3EyOAzowAzMXvJ6PB4+c7/Wd73yvj5f29jp8xzBN0xQAAAAsoYm/JwAAAADPEd4AAAAshPAGAABgIYQ3AAAACyG8AQAAWAjhDQAAwEIIbwAAABYS7O8JBLKzZ89q//79atWqlQzD8Pd0AABAA2aapn788Ud16NBBTZpUf36N8HYB+/fvV2xsrL+nAQAAGpG9e/cqJiam2u2Etwto1aqVJEcRw8LCaj2O3W7Xhg0blJKSopCQEF9Nr9Ghjt6jht6jht6jhr5BHb0XaDUsLS1VbGysM39Uh/B2AZWXSsPCwrwOb82bN1dYWFhAHBxWRR29Rw29Rw29Rw19gzp6L1BreLFbtXhgAQAAwEIIbwAAABZCeAMAALAQwhsAAICFEN4AAAAshPAGAABgIYQ3AAAACyG8AQAAWAjhDQAAwEIIbwAAABZCeAMAALAQwhsAAICFEN4AAAAshPAGAABgIYQ3AAAACyG8AQAAXMCJE5JhOH5OnPD3bAhvAAAAlkJ4AwAAsBDCGwAAgIUQ3gAAACzE7+Htf/7nf9S/f3917NhRzZo1U3h4uK6//notW7bMre8nn3yivn37qmXLlmrdurXS09P17bffVjnuvHnz1LVrV9lsNnXu3Fm5ubmy2+11vTsAAAB1yu/h7dixY4qNjVVeXp7Wrl2rpUuXKi4uTvfff79mzJjh7PfFF18oKSlJp0+f1htvvKFFixbpX//6lxITE3Xo0CGXMWfOnKnMzEylp6dr/fr1Gj16tPLy8jRmzJj63j0AAACfCvb3BJKSkpSUlOTSNmDAAO3evVsLFy5UVlaWJGnKlCmy2Wx6++23FRYWJknq2bOnrrjiCs2ePVtPPvmkJKmkpEQzZszQyJEjlZeX5/wMu92urKwsjRs3TvHx8fW3gwAAwNIqKn7+9XvvSSkpUlCQ/+bj9zNv1YmMjFRwsCNbnjlzRm+//bbuvPNOZ3CTpE6dOunmm2/WqlWrnG2FhYUqKyvT0KFDXcYbOnSoTNPU6tWr62X+AADA+goKpHPP+aSlSXFxjnZ/8fuZt0pnz57V2bNndfToUf31r3/V+vXr9dxzz0mSvvnmG506dUo9evRwe1+PHj1UVFSksrIyhYaGateuXZKk7t27u/SLiopSZGSkc3tVysvLVV5e7nxdWloqSbLb7V7dL1f5Xu658w519B419B419B419A3q6L2L1XDVKkP33BMk05Qkw9leXGxq8GDptdcqdMcdps/nczEBE95Gjx6tv/zlL5Kkpk2b6tlnn9VDDz0kyXEpVJLCw8Pd3hceHi7TNHX06FFFRUWppKRENptNLVq0qLJv5VhVmTVrlnJzc93aN2zYoObNm9dqv85VVFTk9Rigjr5ADb1HDb1HDX2DOnqvqhpWVEijR6fININ0bnCTJNM0JJkaM+a0goOLfHYJ9eTJkx71C5jwNmnSJI0YMUI//PCD1qxZo7Fjx+rEiRN67LHHnH0Mw6j2/edu87Tf+SZOnKjx48c7X5eWlio2NlYpKSkul2trym63q6ioSMnJyQoJCan1OI0ddfQeNfQeNfQeNfQN6ui9C9Xwb38zVFJyoZhk6PDh5goL66/evX1z9q3yit/FBEx469ixozp27ChJSktLk+QIUw8++KAiIiIkqcqzZkeOHJFhGGrdurUkKSIiQmVlZTp58qTb2bIjR46oZ8+e1c7BZrPJZrO5tYeEhPjkD4avxmnsqKP3qKH3qKH3qKFvUEfvVVXD8xayqNahQ8HyVfk9/X0M2AcWevXqpTNnzujbb79Vly5d1KxZM+3cudOt386dO3X55ZcrNDRU0s/3up3f9+DBgzp8+LC6detW95MHAACWFhXl236+FLDhbfPmzWrSpIkuu+wyBQcH67bbblNBQYF+/PFHZ5/vvvtOmzdvVnp6urMtNTVVoaGhys/PdxkvPz9fhmFo0KBB9bQHAADAqhITpZgYqbq7rQxDio119Ktvfr9sOmrUKIWFhalXr1669NJLdfjwYf31r3/V66+/rj/96U9q27atJCk3N1fXXXedBgwYoAkTJqisrExTpkxRZGSkHn30Ued44eHhysrKUnZ2tsLDw5WSkqLt27crJydHI0aMYI03AABwUUFB0ty50uDBjqBmnnNbW2WgmzPHP+u9+T28XX/99Vq8eLGWLFmiY8eOqWXLlvrlL3+pl19+Wffdd5+zX9euXbVlyxY9/vjjGjx4sIKDg9WnTx/Nnj3bGfAqTZ48Wa1atdL8+fM1e/ZstW/fXhMmTNDkyZPre/cAAIBFpadLK1ZIGRlScfHP7TExjuB2zoW/euX38DZ06FC3BXWr07NnT23cuNGjvhkZGcrIyPBmagAAoJFLT5f69pUuucTxeu1avmEBAAAgoJ0b1G66yb/BTSK8AQAAWArhDQAAwEIIbwAAABZCeAMAALAQvz9tCgAAEMhatHBd583fOPMGAABgIYQ3AAAACyG8AQAAWAjhDQAAwEIIbwAAABZCeAMAALAQwhsAAICFEN4AAAAshPAGAABgIYQ3AAAACyG8AQAAWAjhDQAAizhxQjIMx8+JE/6eDfyF8AYAAGAhhDcAAAALIbwBAABYCOENAADAQghvAAAAFkJ4AwDAIioqfv71++8bLq/ReBDeAACwgIICKT7+59e33RasUaNStGqV4b9JwS+C/T0BAABwYQUF0uDBkmm6tpeUhOqee6TgYCk93T9zQ/3jzBsAAAGsokLKzHQPbg6Os27jxolLqI0I4Q0AgAC2dau0b1/1203T0N69jn5oHAhvAAAEsAMHfNsP1kd4AwAggEVF+bYfrI/wBgBAAEtMlGJiHF9GXxXDMBUb6+iHxoHwBgBAAAsKkubOdfzaPcA5nmKYM8fRD40D4Q0AgACXni6tWCF16ODaHhl5Sq+9VsEyIY0M67wBAGAB6elS377SJZc4Xq9Zc0anTxfpttvS/Dsx1DvOvAEAYBHnXhq98UaTS6WNFOENAADAQghvAAAAFkJ4AwAAsBAeWAAAwCJatPj5O07tdv/OBf7DmTcAAAALIbwBAABYCOENAADAQghvAAAAFkJ4AwAAsBDCGwAAgIUQ3gAAACyE8AYAAGAhfg9vmzZt0rBhw9S1a1e1aNFC0dHRGjhwoHbs2OHSzzRNvfDCC+rZs6fCwsIUERGh3r1765133qly3Hnz5qlr166y2Wzq3LmzcnNzZWdFQwAAYHF+D28LFizQnj17lJmZqbVr12ru3Ln64YcflJCQoE2bNjn7TZ06VaNGjVKvXr20cuVK5efny2azacCAASooKHAZc+bMmcrMzFR6errWr1+v0aNHKy8vT2PGjKnv3QMAAPApv3891vz589WuXTuXttTUVF1++eXKy8tTnz59JEmLFi3SjTfeqAULFjj7JScnq3379lqyZInS09MlSSUlJZoxY4ZGjhypvLw8SVJSUpLsdruysrI0btw4xcfH19PeAQAA+Jbfz7ydH9wkqWXLloqPj9fevXudbSEhIbrkkktc+oWGhjp/KhUWFqqsrExDhw516Tt06FCZpqnVq1f7dgcAAADqkd/PvFXl+PHj+uSTT5xn3SQpMzNTjz32mF566SWlp6errKxMTz31lI4fP66MjAxnv127dkmSunfv7jJmVFSUIiMjndurUl5ervLycufr0tJSSZLdbvfqfrnK93LPnXeoo/eoofeoofeooW9QR+8FWg09nYdhmqZZx3Opsfvuu0+vv/66tm3bpp49ezrb//KXvygzM9MZsMLDw/X666+rb9++zj6jRo3S0qVLVVZW5jbulVdeqbi4OK1fv77Kz83JyVFubq5b+yuvvKLmzZt7u1sAAADVOnnypO69914dP35cYWFh1fYLuDNv2dnZWr58uebNm+cS3BYvXqzMzEyNHTtW/fr10+nTp7V06VINHDhQBQUFuvXWW519DcOodvwLbZs4caLGjx/vfF1aWqrY2FilpKRcsIgXY7fbVVRUpOTkZIWEhNR6nMaOOnqPGnqPGnqPGvoGdfReoNWw8orfxQRUeMvNzdWMGTM0c+ZMjR071tl+9OhRjRkzRiNGjNDs2bOd7f369VNSUpL+8Ic/aPfu3ZKkiIgIlZWV6eTJk25ny44cOeISCM9ns9lks9nc2kNCQnzym+qrcRo76ug9aug9aug9augb1NF7gVJDT+fg9wcWKuXm5ionJ0c5OTmaNGmSy7Yvv/xSp06d0nXXXef2vmuvvVZ79uzRTz/9JOnne9127tzp0u/gwYM6fPiwunXrVkd7AAAAUPcCIrxNnz5dOTk5ysrK0tSpU922d+jQQZK0bds2l3bTNLVt2za1adNGLVq0kORYZiQ0NFT5+fkuffPz82UYhgYNGlQn+wAAAFAf/H7Z9Omnn9aUKVOUmpqq/v37uwW0hIQEdezYUenp6Vq4cKFsNpvS0tJUXl6uJUuW6IMPPtD06dOd97KFh4crKytL2dnZCg8PV0pKirZv366cnByNGDGCNd4AAICl+T28rVmzRpJjfbbCwkK37ZUPwy5fvlzPPfecXn75ZS1atEghISH6xS9+oWXLlunee+91ec/kyZPVqlUrzZ8/X7Nnz1b79u01YcIETZ48ue53CAAAoA75Pbxt2bLFo36hoaF67LHH9Nhjj3nUPyMjw2X9NwAAgIYgIO55AwAAgGcIbwAAABZCeAMAALAQwhsAAICFEN4AAAAshPAGAABgIYQ3AAAACyG8AQAAWAjhDQAAwEIIbwAAABbi96/HAgA0bBUV0tat0oEDUlSUlJDg7xkB1kZ4AwDUmYICKTNT2rfv57bo6GDdd1+U0tL8Ny/AyrhsCgCoEwUF0uDBrsFNkvbvl5588jqtWmX4Z2KAxRHeAAA+V1HhOONmmu7bTNMR2h59NEgVFfU8MaABILwBAHxu61b3M26uDO3bZ2jr1vqaEdBwEN4AAD534IBv+wH4GeENAOBzUVG+7QfgZ4Q3AIDPJSZKMTGSUe0zCaZiYkwlJtbnrICGgfAGAPC5oCBp7lzHr88PcIbheIrh6acrFBRUzxMDGgDCGwCgTqSnSytWSNHRru3R0dLjj2/XHXdU8SgqgItikV4AQJ1JT5cGDjz/GxbOaP36A5Ku8ff0AEsivAEA6lRQkJSU9PNru91vUwEaBC6bAgAAWAjhDQAAwEIIbwAAABZCeAMAALAQwhsAAICFEN4AAAAshPAGAABgIYQ3AAAACyG8AQAAWAjhDQAAwEIIbwAAABZCeAMAALAQwhsAAICFEN4AAAAshPAGAABgIYQ3AAAACyG8AQAAWAjhDQAAwEIIbwAAABZCeAMAALAQwhsAAICFBNfmTbt379batWv1wQcfqLi4WKdOnVJkZKTi4+PVp08fJScnKyQkxNdzBQAAaPRqdOZty5YtSk1N1RVXXKE//vGP2rp1q3766SeFhIRo9+7dev755zVgwADFxMRoypQpKi0trat5AwAANEoeh7c77rhDKSkpatq0qV599VV9//332rt3r3bs2KEPPvhAn3/+uY4fP64dO3booYce0rJly3TFFVdo48aNdTl/AACARsXjy6atWrXSF198ocsuu6zaPkFBQbrmmmt0zTXXKCcnRy+//LKKi4t9MlEAAADUILwtXbq0RgM3adJEDz74YI0nBAAAgOr5/WnTTZs2adiwYeratatatGih6OhoDRw4UDt27HDra7fb9cwzz6h79+5q1qyZWrdurd/+9rf68MMP3frOmzdPXbt2lc1mU+fOnZWbmyu73V4fuwQAAFBnahXegoKC1L17d+3bt89t28cff6ygoCCPx1qwYIH27NmjzMxMrV27VnPnztUPP/yghIQEbdq0ydmvoqJCd9xxh6ZNm6bf/e53WrdunZYvX67U1FSdOHHCZcyZM2cqMzNT6enpWr9+vUaPHq28vDyNGTOmNrsLAAAQMGq1VIhpmtq7d68SEhK0bt06de/evdYTmD9/vtq1a+fSlpqaqssvv1x5eXnq06ePJMeZtHXr1umDDz5QQkKCs2///v1d3ltSUqIZM2Zo5MiRysvLkyQlJSXJbrcrKytL48aNU3x8fK3nCwBVqaiQtm6VDhyQoqKkxESpBv+OBQCP1fqy6bJlyxQdHa3ExES9++67tZ7A+cFNklq2bKn4+Hjt3bvX2TZ37lzddNNNLsGtKoWFhSorK9PQoUNd2ocOHSrTNLV69epazxUAqlJQIMXFSTffLN17r+O/cXGOdgDwtVqdeZMcoWvLli26++67lZaWphdffFH333+/TyZ1/PhxffLJJ86zbnv37tWePXt02223adKkSXrppZdUUlKiK6+8Uv/5n//p8mDErl27JMntbGBUVJQiIyOd26tSXl6u8vJy5+vKdersdrtX98tVvpd77rxDHb1HDb13fg1XrTJ0zz1BMk1JMpz9iotNDR4svfZahe64w/TDTAMXx6FvUEfvBVoNPZ1HrcObJDVr1kxvvvmmHnroIQ0ZMkR79+7VLbfc4s2QkqQxY8boxIkTmjx5siQ5lxtZsmSJYmJi9Nxzz+mSSy7RCy+8oCFDhuj06dMaOXKkJMdlU5vNphYtWriNGx4erpKSkmo/d9asWcrNzXVr37Bhg5o3b+71fhUVFXk9BqijL1BD7xUVFamiQho9OkWmGaRzg5skmaYhydSYMacVHFzEJdQqcBz6BnX0XqDU8OTJkx718yq8SY4lQV544QVFR0crKytLhYWFXo2XnZ2t5cuXa968eerZs6ck6ezZs5KksrIyrV27Vp06dZIkJScn69prr9W0adOc4U2SDMNwH9iDbRMnTtT48eOdr0tLSxUbG6uUlBSFhYXVep/sdruKior42jAvUUfvUUPvnVvDDz9sqpKSC/01aujw4eYKC+uv3r05+1aJ49A3qKP3Aq2Gnn4zldfhrVJOTo5iY2P18MMP13qM3NxczZgxQzNnztTYsWOd7REREZKkrl27OoOb5Ahit956q2bNmqUffvhB7dq1U0REhMrKynTy5Em3s2VHjhxxBsKq2Gw22Ww2t/aQkBCf/Kb6apzGjjp6jxp6LyQkRIcOefZX6KFDwaLc7jgOfYM6ei9QaujpHGr9xfRRUVFu7cOHD9fVV1+tL7/8ssZj5ubmKicnRzk5OZo0aZLLti5dulR72dJ03GiiJk0cz15U3uu2c+dO/eY3v3H2O3jwoA4fPqxu3brVeG4AUJUq/hr0qh8AeKJWT5t26tRJTZs2rXJbQkJCjb9ZYfr06crJyVFWVpamTp3qtj04OFgDBw7U559/rj179jjbTdNUYWGhunTposjISEmOZUZCQ0OVn5/vMkZ+fr4Mw9CgQYNqNDcAqE5iohQTI1V3N4ZhSLGxjn4A4Csen3l77733ajTwTTfd5FG/p59+WlOmTFFqaqr69++vbdu2uWyvXBpk+vTpWrdunVJTU5WTk6OwsDC9+OKL+t///V+98cYbzv7h4eHKyspSdna2wsPDlZKSou3btysnJ0cjRoxgjTcAPhMUJM2dKw0e7Ahq5jm3tVUGujlzWO8NgG95HN6SkpIueLN/JdM0ZRiGKioqPBp3zZo1khzrs1X1sEPlZdEuXbpo69atmjBhgkaNGiW73a5f/epXeuuttzRgwACX90yePFmtWrXS/PnzNXv2bLVv314TJkxwPr0KAL6Sni6tWCFlZkrnfulMTIwjuKWn+21qABooj8PbX//6V5fXFRUVuueee/Tkk0/qsssuq/UEtmzZ4nHfbt266e233/aob0ZGhjIyMmo5KwDwXHq6NHAg37AAoH54HN7uvPNOl9eVZ9ZuueUW/frXv/btrADAYoKCpKQkf88CQGNQ66/HAgAAQP0jvAEAAFgI4Q0AAMBCCG8AAAAW4vEDC+c/uVm5JMhTTz2ltm3bumwzDENz5871zQwBAADg5HF4e+6556psf/31193aCG8AAAB1w+Pwdvbs2bqcBwAAADzAPW8AAAAWQngDAACwEI/DW7du3bRq1SqPBz5w4IAyMjL0xBNP1GpiAAAAcOdxeLv77rv1wAMPqGPHjpo4caLWr1+vQ4cOOb84/tSpU9q1a5defPFF3XbbberUqZN27Nih22+/vc4mDwAA0Nh4/MDClClTNHLkSM2ZM0cvvviinnzySRmGIcMwFBISotOnT0tyLCGSmJio1157Tenp6XU2cQAAgMbI4/AmSVFRUXryySc1Y8YMffzxx/roo4+0f/9+nTp1SpGRkeratauSkpIUExNTV/MFAABo1GoU3iqFhIToxhtv1I033ujr+QAAAOACeNoUAADAQghvAAAAFkJ4AwAAsBDCGwAAgIUQ3gAAACyE8AYAAGAhHoe3Xr166bPPPnNp27Rpk06cOOHzSQEAAKBqHoe3//f//p9++ukn5+uKigolJyfryy+/rJOJAQAAwJ1Xl00rv9cUAAAA9YN73gAAACyE8AYAAGAhNfpu01dffVXvv/++JOns2bMyDEPLly/Xli1bXPoZhqFHHnnEZ5MEAACAQ43C29y5c93a/uu//sutjfAGAABQNzwOb7t3767LeQAAAMADHoe3f//73/r1r3+tli1b1uV8AAAAcAEeP7Bw8803uy3SCwAAgPrlcXhjTTcAAAD/Y6kQAAAAC6lReDMMo67mAQAAAA/UaKmQm2++WU2aXDzvGYah48eP13pSAAAAqFqNwltSUpLatm1bV3MBAADARdQovE2ZMkW9evWqq7kAAADgInhgAQAAwEIIbwAAABZCeAMAALAQj+95O3v2bF3OAwAAAB7gzBsAAICFEN4A+ERpqWQYjp9166SKCn/PCAAaJsIbAK8VFEjx8T+/TkuT4uIc7QAA3yK8AfBKQYE0eLBUXOzaXlzsaCfAAYBvEd4A1FpFhZSZKZmm+7bKtnHjuIQKAL7k8dOm3333XY0G7tixY40nA8Batm6V9u2rfrtpSnv3OvolJdXbtACgQfM4vMXFxckwDI8HruCf2kCDd+CAb/sBAC7O4/C2aNGiGoU3T23atEnLli3Thx9+qL1796p169a69tprNWXKFPXs2bPK95imqd69e2vr1q0aM2aMnnvuObc+8+bN0/z587V792516NBBQ4YM0aRJkxQSEuLzfQAaq6go3/YDAFycx+FtyJAhdTKBBQsWqKSkRJmZmYqPj9ehQ4f09NNPKyEhQevXr1efPn3c3jN//nx9/fXX1Y45c+ZMZWdna8KECUpJSdH27duVlZWl4uJiLVy4sE72A2iMEhOlmBjHwwlV3fdmGI7tiYn1PzcAaKg8Dm91Zf78+WrXrp1LW2pqqi6//HLl5eW5hbc9e/Zo4sSJWrp0qdLT093GKykp0YwZMzRy5Ejl5eVJkpKSkmS325WVlaVx48Yp/tw1DQDUWlCQNHeu46lSw3ANcJUn6ufMcfQDAPhGrcNbRUWF1q1bp88//1ynTp1y2WYYhrKzsz0a5/zgJkktW7ZUfHy89u7d67Zt1KhRSk5O1h133FHleIWFhSorK9PQoUNd2ocOHarJkydr9erVhDfAh9LTpRUrpIwM1+VCYmIcwa2Kf2MBALxQq/BWUlKixMREffHFFzIMQ+b//XP73HviPA1vVTl+/Lg++eQTt7NuL774ov7+97/rs88+q/a9u3btkiR1797dpT0qKkqRkZHO7VUpLy9XeXm583VpaakkyW63y26313g/KlW+15sxQB19oa5qeNttUu/eUmSk457SNWvOqG9fU0FBUkP77eI49B419A3q6L1Aq6Gn86hVeJs8ebJCQ0P173//W506ddLHH3+s8PBwPf/883r77be1cePG2gzrNGbMGJ04cUKTJ092thUXF+uxxx7Tn//8Z3Xo0KHa95aUlMhms6lFixZu28LDw1VSUlLte2fNmqXc3Fy39g0bNqh58+Y13At3RUVFXo8B6ugLdVXD1asd/62okNavr5OPCBgch96jhr5BHb0XKDU8efKkR/1qFd7effddTZ061RmimjRpoi5duuipp55SWVmZHnvsMb366qu1GVrZ2dlavny55s2b5/K06R/+8Af98pe/1MiRIy86xoWeir3QtokTJ2r8+PHO16WlpYqNjVVKSorCwsI83AN3drtdRUVFSk5O5mlXL1BH71FD71FD71FD36CO3gu0GlZe8buYWoW3ffv2KS4uTkFBQWrSpIlOnDjh3Hbbbbfp3nvvrc2wys3N1YwZMzRz5kyNHTvW2b5ixQoVFhbq/fff1/Hjx13ec/r0aR07dkwtWrRQSEiIIiIiVFZWppMnT7qdLTty5Ei1y49Iks1mk81mc2sPCQnxyW+qr8Zp7Kij96ih96ih96ihb1BH7wVKDT2dQ62+HisyMtIZojp06OByH9mRI0d05syZGo+Zm5urnJwc5eTkaNKkSS7bdu3apTNnzighIUFt2rRx/kjSCy+8oDZt2uidd96R9PO9bjt37nQZ4+DBgzp8+LC6detW47kBAAAEilqdeevZs6f++c9/qn///kpLS9O0adMUFhampk2batKkSUpISKjReNOnT1dOTo6ysrI0depU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BALwi6+//lqS1LZtW5mmqUGDBmn27Nm6//779c4772j8+PFasmSJ+vTpo/LycklS3759VVpaqr///e/OcTZu3KhmzZqpqKjI2fbuu+/KNE317dtXknTy5En17t1bS5YsUUZGhtatW6fHH39c+fn5uv32290C0erVq7VgwQJNmTJF69evV2JiYrX78fDDD+vxxx9XcnKy3nrrLU2fPl2FhYX67W9/q8OHD0uSVq1apeHDh0tyXP786KOPNGLEiAvWZ9++fdqwYYMGDhyotm3b6sEHH9TXX3+t9957r8r+EydO1Hfffafnn39ea9ascZ7ds9vtSk9PV//+/fXmm2+qX79+mjhxoiZNmqQHH3xQw4YN06pVq3TllVdqyJAh2rFjxwXnBSAAmABQhxYvXmxKMrdt22ba7Xbzxx9/NN9++22zbdu2ZqtWrcyDBw+ahYWFpiTzz3/+s8t7X3/9dVOSuXDhQtM0TfPEiRNm06ZNzWnTppmmaZr79u0zJZmPP/642axZM7OsrMw0TdMcOXKk2aFDB+c4s2bNMps0aWJu377dZfwVK1aYksy1a9c62ySZl1xyiXnkyJGL7tvnn39uSjJHjx7t0v7xxx+bksxJkyY526ZOnWpKMg8dOuRJ2cxp06aZkszCwkLTNE3z22+/NQ3DMO+//36Xfps3bzYlmTfddJPbGA8++KApyVy5cqWzzW63m23btjUlmZ988omzvaSkxAwKCjLHjx/v0fwq9e/f3+zUqVON3gPAO5x5A1AvEhISFBISolatWmnAgAFq37691q1bp0svvVSbNm2SJA0ZMsTlPXfddZdatGihd999V5LUvHlzXX/99dq4caMkqaioSK1bt9af/vQnnT59Wu+//74kx9m4yrNukvT222+rW7du+tWvfqUzZ844f2699VYZhqEtW7a4fG6fPn3Upk2bi+7T5s2bq5x3r169dNVVVznnXVOmaTovlSYnJ0uSOnfurKSkJK1cuVKlpaVu77nzzjurHMswDKWlpTlfBwcH6/LLL1dUVJSuueYaZ3t4eLjatWvnvIwNIHAR3gDUi6VLl2r79u369NNPtX//fv3jH//QDTfcIMlxj1pwcLDatm3r8h7DMNS+fXuVlJQ42/r27att27bpxIkT2rhxo/r06aOIiAj17NlTGzdu1O7du7V7926X8Pb999/rH//4h0JCQlx+WrVqJdM0nZc3K0VFRXm0T5Xzqqp/hw4dXOZdE5s2bdLu3bt11113qbS0VMeOHdOxY8d099136+TJk3r11Vfd3lPdnJs3b67Q0FCXtqZNmyo8PNytb9OmTVVWVlarOQOoPzxtCqBeXHXVVc6nTc8XERGhM2fO6NChQy4BzjRNHTx4UNddd52z7ZZbblF2drbee+89vfvuu5o6daqzfcOGDercubPzdaXIyEg1a9ZMixYtqvLzIyMjXV4bhuHRPkVEREiSDhw4oJiYGJdt+/fvdxvXUy+99JIk6ZlnntEzzzxT5faHHnrIpc3TOQOwPs68AfC7yqBVuaZZpZUrV+rEiRMuQaxXr14KCwvTnDlzdPDgQedlxb59++rTTz/VG2+8ofj4eHXo0MH5ngEDBuibb75RRESErr32Wref2i4y26dPnyrnvX37dn3++ecu8/bU0aNHtWrVKt1www3avHmz28/vf/97bd++neU5gEaMM28A/C45OVm33nqrHn/8cZWWluqGG27QP/7xD02dOlXXXHON7r//fmffoKAg9e7dW2vWrFHnzp3VpUsXSdINN9wgm82md999VxkZGS7jjxs3TitXrtRNN92kRx55RD169NDZs2f13XffacOGDXr00Uf1m9/8psbzvvLKKzVq1CjNmzdPTZo0Ub9+/bRnzx5lZ2crNjZWjzzySI3HXL58ucrKypSRkaGkpCS37REREVq+fLleeukl/dd//VeNx/eFzz77TJ999pkk6eDBgzp58qRWrFghSYqPj1d8fLxf5gU0Fpx5A+B3hmFo9erVGj9+vBYvXqy0tDTnsiGbNm1y+zaCyvvZzr2vzWaz6cYbb3Rrl6QWLVpo69atGjJkiBYuXKj+/fvr7rvv1rPPPquYmBivvt5pwYIFeuKJJ7R27VoNGDBAkydPVkpKij788EPnZdWaeOmll9SuXTsNGjSoyu3du3dXQkKCli1bptOnT9d63t544403dNddd+muu+7Sjh07dOjQIefrN954wy9zAhoTwzTPW+AIAAAAAYszbwAAABZCeAMAALAQwhsAAICFEN4AAAAshPAGAABgIYQ3AAAACyG8AQAAWAjhDQAAwEIIbwAAABZCeAMAALAQwhsAAICF/H9VNfHfWP5qLAAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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PuntXd6w4TwVFR2lXbveDGJVAIKN8AYArZDLla/i4hyVl2+pMe7xbNGXX16miIiPg1QZgGAjvAFAK2NMpUpKxkkyda2VJEVHz+USKhCiCG8A0Mq43avl8fzQwAyjsLCdKi39sMVqAtB6EN4AoJUpL98W0HkA2hbCGwC0MlFRyQGdB6BtIbwBQCsTFzdQDkd3SVY9MyxVVSUpNvbMliwLQCtBeAOAVsaywpWePqd66fC1kqT9+6+VZYW3aF0AWocmh7eqqirt27cvELUAAP7H6cxWRkaeoqJSaow7HN3Vq9dfdPDggCBVBiDYGh3eDhw4oPnz5+uSSy5RSkqKoqKi1LFjR7Vv316nnnqq/vjHP+qzzz5rjloBIKQ4ndnq3//f3uU+fd5WZuZGJSZeFMSqAASbz+Ft//79ys3NVUpKiq699lr9+9//1tlnn61x48Zp4sSJGj16tBITE/V///d/OuWUUzRw4EB9/HHjHyL5wgsvyLIsdejQoda6tWvXaujQoerQoYPi4uKUnZ2tb7/9ttF/AwDsIiIiVllZRllZRomJv+VSKQBF+Drx2GOPVUxMjCZPnqzLL79cXbp0qXOeMUYrV67UvHnzNHjwYD355JO67rrrfPobW7Zs0Z133qmUlBTt2bOnxrovv/xSWVlZOumkk/TGG2/owIEDmjp1qgYOHKj169fL6XT6+lEAAABsy+fwNn36dI0ePVrh4Q3/q8+yLA0ZMkRDhgxRbm6uNm3a5HMxN954o8466ywlJCQoLy+vxrqpU6fK4XBo6dKlio2NlST169dPxx57rB599FE9/PDDPv8dAAAAu/L5suk111xzxOB2uGOOOUZZWVk+zV2wYIFWrVqlp59+uta6gwcPaunSpbr44ou9wU2SevToocGDB+vNN3lJMwAACA0+n3n7tQ8++EBpaWk66qijaq3bu3ev1q1bp7POOsvn/e3YsUPjx4/XjBkz1L1791rrv/nmG+3fv199+/atta5v374qKCjQgQMH1K5duzr37/F45PF4vMulpaWSpIqKClVUVPhcZ6io7gm98R098w998w998w99azx65p/6+haoPvoV3rKystSxY0ctWrRI55xzTo11//73vzV48GBVVvr+wuSbb75Zxx13nG666aY61+/atUuSlJCQUGtdQkKCjDHavXu3kpPrftr4Qw89pNzc3Frjy5cvV/v27X2uM9QUFBQEuwTboWf+oW/+oW/+oW+NR8/8c3jfAvVoNb/CmyQdddRROv/88/Xcc89pzJgxfhewePFiLVmyROvWrZNl1fc08UMaWt/QunvuuUe33367d7m0tFSpqak655xzalyGxSEVFRUqKCjQsGHDFBkZGexybIGe+Ye++Ye++Ye+NR498099fau+8tdUfoe35557TgsXLtS1116rTZs2aerUqY3ex88//6xbbrlFt912m1JSUuR2uyVJ5eXlkiS3263IyEglJiZK+uUM3K/99NNPsixLcXFx9f4dh8Mhh8NRazwyMpKDsQH0p/HomX/om3/om3/oW+PRM/8c3rdA9dDv8BYWFqYnnnhC3bp107333qvNmzfrueeea9Q+du7cqe3bt2vmzJmaOXNmrfXx8fG64IILlJeXp+joaG3YsKHWnA0bNig9Pb3e77sBAAC0JX6Ht2oTJ05U9+7dde2112rr1q264447fN62a9euWrlyZa3xGTNmaNWqVXrnnXeUlJSkiIgInX/++crPz9cjjzyijh07SpI2bdqklStXasKECU39GAAAALbQ5PAmSVdccYW6dOminJwcrV271uft2rVrV+ejRObPn6/w8PAa63Jzc3Xaaadp5MiRmjhxovchvUlJSY0KjAAAAHbm14vpe/ToUes7ZMOGDdOqVauOeNOBv3r16qXCwkJFRkYqJydHY8aMUXp6uj744APergAAAEKGX2feNm7cWOf4SSedpK+++ko//fRTk4qaP3++5s+fX2u8X79+WrFiRZP2DQAAYGcBuWz6ax07dvR+Jw0AAACB1ah3m/rKsixNmTLFr4IAAABQP5/D27Rp02qNWZYlY0yd44Q3AACAwPM5vLlcrhrLBw8eVHJyst5777063zkKAACAwPM5vFW/5aBa9btLO3XqVGsdAAAAmodfjwoBAABAcBDeAAAAbITwBgAAYCNNDm/N9UYFAAAA1ObzDQv13VF66aWXql27djXGLMvSZ5991rTKAAAAUIvP4S0hIaHWWbZBgwYFvCAAAADUz+fwVlhY2IxlAAAAwBfcsAAAAGAjPoe3zZs3+/UHtmzZ4td2AAAAqM3n8Hbsscdq3LhxKikpOeLciooKLVq0SCeddJJefPHFJhUIAACAX/j8nbeCggJNmDBBTz75pE477TQNHjxYp5xyijp37qx27drpp59+0jfffKOioiK9++67Kisr07hx4zRhwoTmrB8AACCk+BzeBg4cqH/9619655139Oyzz+rxxx/X/v37vXegGmMkScccc4xuueUW3XjjjUpOTm6eqgEAAEKUz+Gt2m9/+1v99re/VUVFhdavX6+tW7dq//79SkpK0vHHH69u3bo1R50AAACQH+GtWmRkpE477bRA1gIAAIAj4FEhAAAANkJ4AwAAsBHCGwAAgI0Q3gC0apWVZSostFRYaKmysizY5QBA0BHeAAAAbMTn8LZv377mrAMAAAA+8Dm8dezYUZ988ol32RijqVOn6scff2yWwgAAAFCbz+Gt+g0K1aqqqvTAAw9o69atAS8KAAAAdWvSd94OD3QAAABoXtywAKBVM6bS+7vb/UGNZQAIRY0Kb9UvoT/SGAAEgsuVr08+6e1d3rDhPBUVHSWXKz+IVQFAcDXq3aZ33HGH4uLiJP1yyXT8+PHq1KlTjXmWZemtt94KTIUAQpLLla/i4hxJNb+e4fFsUXFxjjIy8uR0ZgenOAAIIp/DW1pamjZv3qzNmzd7x3r06KFNmzbVmsvZOABNYUylSkrG6fDg9r+1kiyVlIxXUtIFsqzwFq4OAILL5/D23XffNWMZAPALt3u1PJ4fGphh5PFsltu9WvHxWS1UFQC0Dj5/52369Ok8FgRAiygv3xbQeQDQlvgc3nJzc/XDDw39SxgAAiMqKjmg8wCgLfH7Ib0A0Fzi4gbK4eguqb7vz1pyOFIVFzewJcsCgFaB57wBaHUsK1zp6XOqlw5fK0lKT5/NzQoAQlKjHhXy1VdfKSLCt01OOeUUvwoC0DpVVpZp9eoOkqSBA39WeHhMs/49pzNbGRl5+vrrsSov3+Iddzi6Kz19No8JARCyGhXexowZc8Q5xhhZlqXKSp6CDqBpnM5sxccP1YcfHnqWZJ8+bysh4RzOuAEIaY0Kb/fee6969uzZXLUAQC2/DmpxcWcR3ACEvEaFt5EjR6p///7NVQsAAACOgBsWAAAAbITwBsAnxvzyPVa3+4MaywCAluNzeBs0aJBiY2ObsxYArZTLla9PPuntXd6w4TwVFR0llys/iFUBQGjyObytXLlSvXr1as5aALRCLle+iotzajyuQ5I8ni0qLs4hwAFAC2vUDQsAQosxlSopGSeprjesGEmWSkrGKynpgma7CzQ8PEZZWbzhBQCq8Z03APVyu1fL42noncZGHs9mud2rW6wmAAh1hDcA9Sov3xbQeQCApiO8AahXVFRyQOcBAJou6OFt/fr1GjFihNLS0hQdHa2EhAQNGDBACxYsqDFvzJgxsiyr1g83UQDNJy5uoByO7qr9cvhqlhyOVMXFDWzJsgAgpPl8w8LLL7/cqB1fddVVPs1zu91KTU3V73//e3Xr1k1lZWVauHChrrzySn333XeaPHmyd250dLTef//9GttHR0c3qi4AvrOscKWnz1FxcY4OBbhf3zhwKNClp8/mlVUA0IJ8Dm++vJS+mmVZPoe3rKwsZWVl1RgbOXKkNm7cqOeff75GeAsLC1NmZqbPdQBoOqczWxkZefr667E1HhficHRXevpsOZ3ZQawOAEKPz+Ft48aNzVlHLUlJSdqxY0eL/k0AdXM6sxUfP1QffthJktSnz9tKSDiHM24AEAQ+h7cePXo0Zx2qqqpSVVWVdu/erUWLFmnZsmV68skna8zZv3+/unbtKpfLpeTkZF144YWaPn26EhISGty3x+ORx+PxLpeWlkqSKioqVFFREfgPY3PVPaE3vguFnlVWVnl/j4kZoIMHqyRV1b+BD0Khb82BvvmHvjUePfNPfX0LVB8tY0yrePrljTfeqOeee06SFBUVpdmzZ+umm27yrn/sscckSSeccIIkadWqVXrssceUlpamNWvWqEOHDvXue9q0acrNza01/uqrr6p9+/aB/BhAG3ZAnTpdJknas+cvktoFtxwAsJl9+/Zp1KhR2rNnT5NeOep3ePv666/13HPP6T//+Y/2799fc6eWpffee69R+9u0aZN27NihHTt2aMmSJXr++ef18MMP684776x3m8WLFysnJ0ezZs3ShAkT6p1X15m31NRU7dy5k/e11qGiokIFBQUaNmyYIiMjg12OLYRCzyory1RUFC9JyszcrfDwmCbvMxT61hzom3/oW+PRM//U17fS0lIlJSU1Obz59XqsL774QpmZmerWrZtKSkrUt29f7dy5U1u2bFFqaqp69uzZ6H2mpaUpLS1NknTeeedJku655x6NHj1aTqezzm0uuugixcTEqKioqMF9OxwOORyOWuORkZEcjA2gP43XlnsWGRnXbK+past9a070zT/0rfHomX8O71ugeujXc94mTZqkc889V8XFxTLGaO7cudq8ebOWLFmiAwcO6P77729yYf3799fBgwf17bffNjjPGKOwsKA/rg5oUcZUavfuQm3f/pp27y6UMZXBLgkA0EL8OvO2du1aPf30097QVFV16EvLI0aM0J133ql77rlHq1atalJhK1euVFhYmI455ph65+Tl5Wnfvn08PgQhxeXKr+exHXN4bAcAhAC/wtvu3buVkJCgsLAwRUZGavfu3d51p556qqZPn+7zvm644QbFxsaqf//+6tKli3bu3KlFixbp9ddf11133SWn06nvv/9eo0aN0mWXXab09HRZlqVVq1Zp9uzZysjI0HXXXefPxwBsx+XK/98Dc2tevvR4tqi4OEcZGXkEOABo4/wKb926ddPOnTslSenp6frggw80bNgwSdLnn3/e4J2fhxswYIDmzZunl156SW63Wx06dNCJJ56oV155RVdccYUkKTY2Vl26dNGsWbO0fft2VVZWqkePHho7dqwmTZqkmJimf3EaaO2MqVRJyTgdHtz+t1aSpZKS8UpKuoDnrwFAG+ZXeDvzzDP10Ucf6cILL9Tll1+u++67T9u2bVNUVJTmz5/vDV2+uPrqq3X11Vc3OCc+Pl75+fn+lAq0GW73ank8PzQww8jj2Sy3e7Xi47NaqCoAQEvzK7zde++92rp1qyTp7rvv1o8//qiFCxfKsiz97ne/06OPPhrQIgFI5eXbAjoPAGBPfoW3nj17eh8HEh4erscff1yPP/54QAsDUFNUVHJA5wEA7IlnbAA2ERc3UA5Hd0lWPTMsORypiosb2JJlAQBamM9n3l5++WWNGDFCiYmJevnll484/6qrrmpSYQBqsqxwpafP+d/dppZq3rhwKNClp8/mZgUAaON8Dm9jxoxRUVGREhMTNWbMmAbnWpZFeAOagdOZrYyMPJWUjKtx88Kh57zN5jEhABACfA5vGzduVHJysvd3AMHhdGYrKekCud2rVV6+TVFRyYqLG8gZNwAIET6Htx49etT5O4CWZ1nhPA4EAEKUXzcsFBcXN7j+b3/7m1/FAAAAoGF+hbfTTz9d8+fPrzV+8OBBTZgwQRdddFFT6wIAAEAd/ApvOTk5uuaaazRmzBjt379fkvTdd9/pjDPO0NNPP61HHnkkoEUCAADgEL8e0jt//nwNGjRIt912m/71r3/pxhtv1JQpU9SpUyd98MEHOv300wNdJwAAANSEh/ReffXV+vDDD/Xt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0zRt2jRNmjTJp2041vzrW31C5VirS//+/XXw4EF9++239c7heKvJl57VJxSOtZ07d2r79u2aOXOm4uPjvT+vvfaaysrKFB8fr8svv7ze7QN5vLXtTiMgLrroIn355Zf65z//6R07ePCgFixYoNNPP10pKSlBrM5eNm7cqH/84x/KzMwMdinN6k9/+pOmTZumyZMn67777vN5u1A/1vztW11C5Virz8qVKxUWFqZjjjmm3jmhfrwdzpee1SVUjrWuXbtq5cqVtX7OPfdctWvXTitXrtT9999f7/YBPd4a91QT2Nnbb79tFi1aZF588UUjyVxyySVm0aJFZtGiRaasrMwYY8w111xjwsPDzXfffefd7sCBAyYjI8OkpqaahQsXmoKCAnPRRReZiIgIU1hYGKyP02L87dvZZ59tcnNzzZtvvmnee+89M3v2bJOSkmI6duxoNmzYEKyP0+weffRRI8kMHz7cfPzxx7V+qnGs1dSUvoXqsWaMMddff7254447zOuvv24KCwtNXl6eufTSS40kc9ddd3nncbz9oik9C+VjrT51PeetuY83wlsI6dGjh5FU58/GjRuNMYcOwl8vV/vxxx/NVVddZRISEky7du1MZmamKSgoaPkPEQT+9m38+PGmd+/epmPHjiYiIsKkpKSYK664wnz11VfB+SAtZNCgQfX269f/XuRYq6kpfQvVY80YY1588UUzcOBAk5SUZCIiIkxcXJwZNGiQeeWVV2rM43j7RVN6FsrHWn3qCm/NfbxZxhjj+3k6AAAABBPfeQMAALARwhsAAICNEN4AAABshPAGAABgI4Q3AAAAGyG8AQAA2AjhDQAAwEYIbwAAADZCeAPgl/nz58uyLO9PRESEunfvrquvvlpbtmwJdnktavLkyUpLS1NERITi4uJ82ub222+XZVkaOXJk8xbno23btmny5MkaMGCAkpKSFBsbq379+un5559XZWVlsMsD8CuENwBNMm/ePH388ccqKCjQ9ddfr9dee00DBw5UWVlZsEtrEW+99ZYeeOABXXXVVVq1apVWrFhxxG0qKiq0YMECSdK7777bKsLup59+qpdffllnn322Xn75ZS1evFiDBg3STTfdpOuvvz7Y5QH4lYhgFwDA3k444QSdeuqpkqTBgwersrJSf/rTn/TXv/5Vl19+eZCrq58xRgcOHFB0dHST9vPFF19IksaOHavOnTv7tM1bb70ll8ulESNG6O9//7teeuklTZo06YjbVVRUeM9yBtoZZ5yhb775RpGRkd6xYcOGqby8XE899ZRyc3OVmpoa8L8LoPE48wYgoDIzMyVJ33//vSTpwIEDuueee3T00UcrKipK3bp10y233CK32+3d5q677lKnTp1qXJ677bbbZFmW/vznP3vHdu3apbCwMD3xxBPesdLSUt1555019j9+/PhaZ/4sy9Ktt96qZ599Vscff7wcDodeeumlej9HVVWVHnnkEfXq1UsOh0OdO3fWVVddpR9++ME756ijjtLkyZMlSV26dJFlWZo2bdoRezR37lxFRUVp3rx5Sk1N1bx583T4a6YLCwtlWZZeeeUV3XHHHerWrZscDodKSko0ZswYdejQQV9++aXOPfdcxcTEKDk5WTNmzJAkFRUV6cwzz1RMTIx+85vfNPg5q8XHx9cIbtX69+8vSTU+N4Aga/Sr7AHAGDNv3jwjyaxZs6bG+Jw5c4wk8/zzz5uqqipz7rnnmoiICDNlyhSzfPly8+ijj5qYmBhz8sknmwMHDhhjjHn33XeNJPPRRx9599OrVy8THR1thg0b5h17/fXXjSTz73//2xhjTFlZmTnppJNMUlKSmTVrllmxYoWZM2eO6dSpkxkyZIipqqrybivJdOvWzfTt29e8+uqr5v333zdffPFFvZ/vhhtuMJLMrbfeat59913z7LPPGqfTaVJTU43L5TLGGLN27Vpz7bXXGknm3XffNR9//LHZvHlzg33bvHmzCQsLM5dccokxxpjJkycbSaawsLDGvJUrV3przsnJMX/729/M0qVLza5du8zo0aNNVFSUOf74482cOXNMQUGBufrqq40kc88995jf/OY3Zu7cuWbZsmVm5MiRRpL517/+1WBd9Rk9erSJiIgwO3fu9Gt7AIFHeAPgl+rwVlRUZCoqKszevXvN0qVLjdPpNB07djQ//vijN5Q98sgjNbatDmHPP/+8MeZQCIuKijLTp083xhjzww8/GEnm7rvvNtHR0d6Qd/3115uUlBTvfh566CETFhZWK0Dm5eUZSebtt9/2jkkynTp1Mj/99NMRP9t//vMfI8ncfPPNNcb/+c9/Gklm0qRJ3rH77rvPSPIGuiOZPn26N+wZY8y3335rLMsyV155ZY151eHtrLPOqrWP0aNHG0lm8eLF3rGKigrjdDqNJLN27Vrv+K5du0x4eLi5/fbbfarv15YtW2bCwsLMhAkTGr0tgObDZVMATZKZmanIyEh17NhRI0eOVNeuXfXOO++oS5cuev/99yVJY8aMqbHNJZdcopiYGL333nuSpPbt22vAgAHeL/sXFBQoLi5Od911l8rLy/Xhhx9KklasWKGhQ4d697N06VKdcMIJOumkk3Tw4EHvz7nnnivLslRYWFjj7w4ZMkTx8fFH/EwrV66ss+7+/fvr+OOP99bdWMYY76XSYcOGSZKOPvpoZWVlafHixSotLa21zcUXX1znvizL0nnnneddjoiIUHp6upKTk3XyySd7xxMSEtS5c2fvZWxfrV27Vr/73e+UmZmphx56qFHbAmhehDcATfLyyy9rzZo1WrdunbZu3arPP/9cZ5xxhqRD31GLiIiQ0+mssY1lWeratat27drlHRs6dKiKiopUVlamFStWaMiQIUpMTFS/fv20YsUKbdy4URs3bqwR3rZv367PP/9ckZGRNX46duwoY4x27txZ4+8mJyf79Jmq66prfkpKSo26G+P999/Xxo0bdckll6i0tFRut1tut1u/+93vtG/fPr322mu1tqmv5vbt26tdu3Y1xqKiopSQkFBrblRUlA4cOOBznevWrdOwYcN07LHH6u2335bD4fB5WwDNj7tNATTJ8ccf773b9HCJiYk6ePCgXC5XjQBnjNGPP/6o0047zTt29tlna8qUKfrggw/03nvv6b777vOOL1++XEcffbR3uVpSUpKio6P14osv1vn3k5KSaixbluXTZ0pMTJR06Nln3bt3r7Fu69attfbrq7lz50qSZs2apVmzZtW5/g9/+EONMV9rDpR169Zp6NCh6tGjh5YvX65OnTq16N8HcGSceQPQbKqDVvUzzaotXrxYZWVlNYJY//79FRsbq9mzZ+vHH3/0XlYcOnSo1q1bpzfeeEO9e/dWSkqKd5uRI0fqm2++UWJiok499dRaP0cddZRfdQ8ZMqTOutesWaP//Oc/Ner21e7du/Xmm2/qjDPO0MqVK2v9XH755VqzZo330SPBsH79eg0dOlTdu3dXQUGBT5eYAbQ8zrwBaDbDhg3Tueeeq7vvvlulpaU644wz9Pnnn+u+++7TySefrCuvvNI7Nzw8XIMGDdKSJUt09NFHq2fPnpIOPX/M4XDovffe09ixY2vsf/z48Vq8eLHOOussTZgwQX379lVVVZU2bdqk5cuX64477tDpp5/e6LqPO+443XDDDXriiScUFham3/72t/ruu+80ZcoUpaamasKECY3e58KFC3XgwAGNHTtWWVlZtdYnJiZq4cKFmjt3rh577LFG77+pvvrqK+8l6QceeEBff/21vv76a+/6nj171rr8DSA4CG8Amo1lWfrrX/+qadOmad68eXrggQeUlJSkK6+8Ug8++GCt71INHTpUS5YsqfG9NofDoTPPPFMFBQU1xiUpJiZGq1ev1owZM/T8889r48aNio6OVlpamoYOHer3mTdJeuaZZ9SzZ0/NnTtXTz31lDp16qThw4froYce8l5WbYy5c+eqc+fOuvDCC+tc36dPH2VmZmrBggV6+OGH/a7bXx9//LH3u3znn39+rfXz5s2rdQMHgOCwjDnsyZAAAABotfjOGwAAgI0Q3gAAAGyE8AYAAGAjhDcAAAAbIbwBAADYCOENAADARghvAAAANkJ4AwAAsBHCGwAAgI0Q3gAAAGyE8AYAAGAj/x97w0I1urVWMQAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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8DbhMmZdfFmv3W73czXwF868AQAAmAjhDQAAwEQIbwAAACZCeAMAADARv4e3rVu3avTo0UpMTFR4eLhiY2OVmZmpTz75xGmeYRj605/+pN69eysyMlLR0dG677779N577zW63YULFyoxMVFWq1XdunVTQUEBN3cCAADT83t4W7x4sQ4cOKDs7Gxt3LhRCxYs0DfffKOUlBRt3brVMW/WrFkaN26c+vTpo7Vr16qoqEhWq1VDhw5VcXGx0zbnzp2r7Oxs2Ww2bdq0SePHj1dhYaEmTJjg690DAADwKr+/KmTRokXq1KmT01hGRoZuv/12FRYWqn///pKkpUuXql+/flq8eLFjXnp6ujp37qzly5fLZrv4dumKigrNmTNHY8eOVWFhoSQpLS1NdrtdeXl5ysnJUXJyso/2DgAAwLv8fubt8uAmSe3bt1dycrIOHTrkGAsNDdUNN9zgNC8sLMzxp0FJSYlqamo0atQop7mjRo2SYRhav369d3cAAADAh/x+5q0xZ86c0a5duxxn3SQpOztbkydP1quvviqbzaaamhr97ne/05kzZ5SVleWYt2fPHklSz549nbYZExOjjh07OpY3pra2VrW1tY7PlZWVki6+CNGT++Ua1uWeO8/QR8/RQ8/RQ8/RQ++gj54LtB66W4fFMAyjhWu5ZiNGjNCbb76p8vJy9e7d2zH+P//zP8rOznYErKioKL355psaMGCAY864ceO0YsUK1dTUuGy3e/fuSkhI0KZNmxr93vz8fBUUFLiMv/7662rXrp2nuwUAANCk6upqPf744zpz5owiIyObnBdwZ95mzJihVatWaeHChU7BbdmyZcrOztbEiRP14IMP6vz581qxYoUyMzNVXFysQYMGOeZaLJYmt3+lZdOmTdOkSZMcnysrKxUfH6+BAwdesYlXY7fbVVpaqvT0dIWGhjZ7O9c7+ug5eug5eug5eugd9NFzgdbDhit+VxNQ4a2goEBz5szR3LlzNXHiRMf4qVOnNGHCBI0ZM0bz5s1zjD/44INKS0vT008/rf3790uSoqOjVVNTo+rqapezZSdPnnQKhJezWq2yWq0u46GhoV75S/XWdq539NFz9NBz9NBz9NA76KPnAqWH7tbg9wcWGhQUFCg/P1/5+fmaPn2607LPP/9c586d01133eWy3p133qkDBw7oP//5j6Rv73XbvXu3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TITwBgAAYCKENwAAABMhvAEAAJgI4Q1AiyoqKpLFYnH8CQkJUVxcnEaNGqUjR474uzyfysvLU9euXRUSEqIOHTq4tc6kSZNksVg0dOjQli3uGqxYsUI//elP1b17dwUFBSkhIcHfJQHXlRB/FwDg+rBs2TIlJibq3Llz+vDDD/Xcc8/p//7f/6vdu3crPDzc3+W1uLfffltz585Vbm6uHnzwQVmt1quuY7fbtXLlSklSSUmJjhw5otjY2JYu9apee+01HTt2TH369FF9fb3sdru/SwKuK4Q3AD7Ro0cP3XnnnZKk+++/X3V1dZo9e7bWr1+vn//8536urmmGYaimpkZt27b1aDt79uyRJGVlZalTp05urfP222/r+PHjGjJkiN577z0tX75c06dPv+p6drvdcZazJWzatElBQRcv3AwdOtSxbwB8g8umAPwiJSVFkvTVV19JkmpqajRt2jR169ZNbdq0UWxsrCZMmKDTp0871vnVr36lG264QXV1dY6x//7v/5bFYtHvfvc7x1hFRYWCgoK0cOFCx1hlZaUmT57stP2cnBydPXvWqS6LxaKJEyfq5ZdfVlJSkqxWq5YvX97kftTX1+uFF15QYmKirFarOnXqpF/84hc6fPiwY05CQoLy8vIkSTfffLMsFovy8/Ov2qNXX31Vbdq00bJlyxQfH69ly5bp8p+j3r59uywWi1577TU9++yzio2NldVq1b/+9S89+eSTat++vT777DMNGjRI4eHhiomJ0W9/+1tJUnl5ufr166fw8HB997vfveJ+XqohuAHwD/4FAvCLf/3rX5Kkm266SYZhaNiwYZo3b56eeOIJvffee5o0aZKWL1+u/v37q7a2VpI0YMAAVVZW6n//938d29myZYvatm2r0tJSx9gHH3wgwzA0YMAASVJ1dbXuu+8+LV++XFlZWXr//fc1ZcoUFRUV6cc//rFLIFq/fr0WL16smTNnatOmTUpNTW1yP375y19qypQpSk9P1zvvvKPZs2erpKREd999t06cOCFJWrdunZ566ilJFy9/fvzxxxozZswV+3P48GFt3rxZmZmZuummmzRy5Ej961//0ocfftjo/GnTpungwYN6+eWXtWHDBsfZPbvdLpvNpiFDhujtt9/Wgw8+qGnTpmn69OkaOXKkRo8erXXr1ql79+568skn9cknn1yxLgABwACAFrRs2TJDklFeXm7Y7XajqqrKePfdd42bbrrJiIiIMI4dO2aUlJQYkowXXnjBad0333zTkGQsWbLEMAzDOHv2rNGmTRvjN7/5jWEYhnH48GFDkjFlyhSjbdu2Rk1NjWEYhjF27FijS5cuju0899xzRlBQkLFz506n7a9Zs8aQZGzcuNExJsm44YYbjJMnT1513/bu3WtIMsaPH+80/te//tWQZEyfPt0xNmvWLEOScfz4cXfaZvzmN78xJBklJSWGYRjGvn37DIvFYjzxxBNO87Zt22ZIMu69916XbYwcOdKQZKxdu9YxZrfbjZtuusmQZOzatcsxXlFRYQQHBxuTJk1yq74GQ4YMMW655ZZrWgeAZzjzBsAnUlJSFBoaqoiICA0dOlSdO3fW+++/r5tvvllbt26VJD355JNO6zz66KMKDw/XBx98IElq166d+vbtqy1btkiSSktL1aFDB/3qV7/S+fPn9dFHH0m6eDau4aybJL377rvq0aOHvv/97+vChQuOP4MGDZLFYtH27dudvrd///668cYbr7pP27Zta7TuPn36KCkpyVH3tTIMw3GpND09XZLUrVs3paWlae3ataqsrHRZ55FHHml0WxaLRYMHD3Z8DgkJ0e23366YmBj94Ac/cIxHRUWpU6dOjsvYAAIX4Q2AT6xYsUI7d+7U3/72N3399df6xz/+oXvuuUfSxXvUQkJCdNNNNzmtY7FY1LlzZ1VUVDjGBgwYoPLycp09e1ZbtmxR//79FR0drd69e2vLli3av3+/9u/f7xTe/v3vf+sf//iHQkNDnf5ERETIMAzH5c0GMTExbu1TQ12Nze/SpYtT3ddi69at2r9/vx599FFVVlbq9OnTOn36tB577DFVV1frz3/+s8s6TdXcrl07hYWFOY21adNGUVFRLnPbtGmjmpqaZtUMwHd42hSATyQlJTmeNr1cdHS0Lly4oOPHjzsFOMMwdOzYMd11112OsQceeEAzZszQhx9+qA8++ECzZs1yjG/evFndunVzfG7QsWNHtW3bVkuXLm30+zt27Oj02WKxuLVP0dHRkqSjR48qLi7OadnXX3/tsl13vfrqq5Kkl156SS+99FKjy//rv/7LaczdmgGYH2feAPhdQ9BqeKdZg7Vr1+rs2bNOQaxPnz6KjIzU/PnzdezYMcdlxQEDBuhvf/ubVq9ereTkZHXp0sWxztChQ/Xll18qOjpad955p8uf5r5ktn///o3WvXPnTu3du9epbnedOnVK69at0z333KNt27a5/Pn5z3+unTt38noO4DrGmTcAfpeenq5BgwZpypQpqqys1D333KN//OMfmjVrln7wgx/oiSeecMwNDg7Wfffdpw0bNqhbt2667bbbJEn33HOPrFarPvjgA2VlZTltPycnR2vXrtW9996rZ555Rr169VJ9fb0OHjyozZs369lnn9WPfvSja667e/fuGjdunBYuXKigoCA9+OCDOnDggGbMmKH4+Hg988wz17zNVatWqaamRllZWUpLS3NZHh0drVWrVunVV1/V//k//+eat+8Nn376qT799FNJ0rFjx1RdXa01a9ZIkpKTk5WcnOyXuoDrBWfeAPidxWLR+vXrNWnSJC1btkyDBw92vDZk69atLr9G0HA/26X3tVmtVvXr189lXJLCw8NVVlamJ598UkuWLNGQIUP02GOP6fe//73i4uI8+nmnxYsX67e//a02btyooUOHKjc3VwMHDtRf/vIXx2XVa/Hqq6+qU6dOGjZsWKPLe/bsqZSUFK1cuVLnz59vdt2eWL16tR599FE9+uij+uSTT3T8+HHH59WrV/ulJuB6YjGMy15wBAAAgIDFmTcAAAATIbwBAACYCOENAADARAhvAAAAJkJ4AwAAMBHCGwAAgIkQ3gAAAEyE8AYAAGAihDcAAAATIbwBAACYCOENAADARP4/JWQrKclnrv0AAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "tf_z = [299.3777, 288.1736, 272.4744, 259.5129, 241.8841, 233.8030, 229.2665, 219.5115, 211.4388, 199.3276, 184.9726]\n", + "dtf_z = [3.7588, 3.5503,1.2193, 0.7946, 1.7848, 1.4811, 0.7289, 1.0038, 0.7646, 1.0321, 1.0431]\n", + "trunc = [0.5, 0.55, 0.6, 0.65, 0.7, 0.725, 0.75, 0.775, 0.8, 0.85, 0.9]\n", + "p_1 = [0.507, 0.449, 0.398, 0.354, 0.315, 0.298, 0.282, 0.266, 0.252, 0.226, 0.204]\n", + "p_2 = [3.88, 3.38, 2.911, 2.474, 2.066, 1.873, 1.687, 1.507, 1.33, 1.003, 0.696]\n", + " \n", + "plt.figure()\n", + "plt.errorbar(p_1, tf_z, yerr = dtf_z, fmt = 'ob')\n", + "plt.xlabel('Power of Arm 1')\n", + "plt.ylabel('Vertical TF (Hz)')\n", + "plt.tight_layout()\n", + "plt.grid(visible=1)\n", + "\n", + "tf_y = [49.3970, 47.4535, 43.9127, 40.8258, 36.6638, 35.6111, 34.3650, 32.0196, 29.9294, 26.5413, 22.4257]\n", + "dtf_y = [1.5574, 0.5536, 0.3721, 0.4734, 0.9428, 0.7725, 0.3264, 0.2862, 0.1988, 0.2477, 0.3690]\n", + "trunc = [0.5, 0.55, 0.6, 0.65, 0.7, 0.725, 0.75, 0.775, 0.8, 0.85, 0.9]\n", + " \n", + "plt.figure()\n", + "plt.errorbar(p_2, tf_y, yerr = dtf_y, fmt = 'oy')\n", + "plt.xlabel('Power of Arm 2')\n", + "plt.ylabel('Axial TF (Hz)')\n", + "plt.tight_layout()\n", + "plt.grid(visible=1)\n", + "\n", + "tf_x = [303.5930, 286.0152, 272.6675, 253.6669, 238.8665, 232.4375, 224.9906, 218.7975, 210.9468, 196.7401, 180.0950]\n", + "dtf_x = [6.9704, 2.5433, 0.6739, 0.5183, 0.3901, 0.3994, 0.4995, 0.3777, 0.3864, 0.3636, 0.4790]\n", + "trunc = [0.5, 0.55, 0.6, 0.65, 0.7, 0.725, 0.75, 0.775, 0.8, 0.85, 0.9]\n", + " \n", + "plt.figure()\n", + "plt.errorbar(p_1, tf_x, yerr = dtf_x, fmt = 'og')\n", + "plt.xlabel('Power of Arm 1')\n", + "plt.ylabel('Horz TF (Hz)')\n", + "plt.tight_layout()\n", + "plt.grid(visible=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "v_x = 27451.697 Hz\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "from astropy import units as u, constants as ac\n", + "\n", + "DY_POLARIZABILITY = 184.4 # in a.u, most precise measured value of Dy polarizability\n", + "DY_MASS = 164*u.u\n", + "\n", + "def horz_tf(x, w_x, w_z):\n", + " w_x = w_x*u.um\n", + " w_z = w_z*u.um\n", + " x = x * u.W\n", + " alpha = DY_POLARIZABILITY\n", + " m = DY_MASS\n", + " TrapDepth = 2*x/(np.pi*w_x*w_z) * (1 / (2 * ac.eps0 * ac.c)) * alpha * (4 * np.pi * ac.eps0 * ac.a0**3)\n", + " ret = ((1/(2 * np.pi)) * np.sqrt(4 * TrapDepth / (m*w_x**2))).decompose()\n", + " return ret.value\n", + " \n", + "def vert_tf(x, w_x, w_z):\n", + " w_x = w_x*u.um\n", + " w_z = w_z*u.um\n", + " x = x * u.W\n", + " alpha = DY_POLARIZABILITY\n", + " m = DY_MASS\n", + " TrapDepth = 2*x/(np.pi*w_x*w_z) * (1 / (2 * ac.eps0 * ac.c)) * alpha * (4 * np.pi * ac.eps0 * ac.a0**3)\n", + " ret = ((1/(2 * np.pi)) * np.sqrt(4 * TrapDepth / (m*w_z**2))).decompose()\n", + " return ret.value\n", + "\n", + "\n", + "v = horz_tf(30, 30, 0.2)\n", + "print('v_x = %.3f Hz' %(v))" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "

Model

Model(horz_tf)

Fit Statistics

fitting methodleastsq
# function evals26
# data points9
# variables2
chi-square 79.9011718
reduced chi-square 11.4144531
Akaike info crit. 23.6520935
Bayesian info crit. 24.0465426

Variables

name value standard error relative error initial value min max vary
w_x 24.1519450 292150.064 (1209633.69%) 25 0.00000000 100.000000 True
w_z 52.4613985 1903772.36 (3628901.28%) 35 0.00000000 100.000000 True

Correlations (unreported correlations are < 0.100)

w_xw_z-1.0000
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAm8AAAHPCAYAAAAFwj37AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAA9hAAAPYQGoP6dpAABjnklEQVR4nO3dfXzO9f///9uxmWNONmzIbISUbU56i0RRzs1J0ZLSmSakyJbIyYZNM50gcxIpjUrFm1GkOfdpnay3Nyl+VAphJszJFjbHttfvD1/H29GGbce2Y8d2v14uu1w6nq/n63k8Xg+v6eH5er2eL5NhGAYiIiIi4hRcHB2AiIiIiOSfijcRERERJ6LiTURERMSJqHgTERERcSIq3kRERESciIo3ERERESei4k1ERETEiVRwdAClWU5ODsePH8fDwwOTyeTocERERKQMMwyD9PR06tati4vL9efXVLzdwPHjx6lXr56jwxAREZFy5OjRo/j5+V13u4q3G/Dw8ACuJNHT07PQ41gsFjZu3Ej37t1xc3MrqvDKHeXRfsqh/ZRD+ymHRUN5tF9py2FaWhr16tWz1h/Xo+LtBq5eKvX09LS7eKtcuTKenp6l4uRwVsqj/ZRD+ymH9lMOi4byaL/SmsOb3aqlBxZEREREnIiKNxEREREnouJNRERExImoeBMRERFxIireRERERJyIijcRERERJ6LiTURERMSJqHgTERERcSIq3kRERESciIo3ERERESei4k1ERETEiah4ExEREXEiKt5EREREnIiKNxEREREnouJNRERExImoeBMRERG5gQuXL2CKMmGKMnHh8gVHh6PiTURERMSZqHgTERERcSIq3kRERESciIo3ERERESei4k1ERETEiah4ExEREXEiKt5EREREnIiKNxEREREnouJNRERExImoeBMRERFxIireRERERJyIijcRERERJ6LiTURERMSJqHgTERERuYGs7Cz4FciCr//8muycbIfGo+JNRERE5DoiP4ikVpNa8CmwC3p90osGsQ2I3x/vsJhUvImIiIj8w3/+8x9atGtB1HNRWI5awA3IurItOS2Z/iv6O6yAU/EmIiIi8v/s27eP4OBg7rnnHvYk7QFX4B4gFLj3Sh8DA4CwhDCHXEJV8SYiIiLy/4wdO5bVq1fj4uIC/wJeAnoCVW37GRgcTTtK4pHEEo+x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IlI2qXgTp/bXX3/x7LPPWu+XfPDBB1m8eDG1atVycGQiIiLFQ8WbOK3//ve/9OrVi1OnTuHu7s6sWbMYPnz4Dd+iISIi4uxUvInTaty4MZUrV6ZFixZ88sknNG3a1NEhiYiIFDsVb+K0qlevzsaNG6lfvz7u7u6ODkdERKREqHgTp3bHHXc4OgQREZESVSpejyUiIiIi+aPiTURERMSJqHgTERERcSIq3kRERESciIo3ERERESeip03F6WTnZPPt4W/1/lERESmXVLyJU/n+3PeMmD+C5PRka5ufpx+xQbEEBwQ7MDIREZGSocum4jRW/7KaNw6/YVO4ASSnJdN/RX/i98c7KDIREZGSo+JNnEJ2TjajN43Oc5uBAUBYQhjZOdklGZaIiEiJU/EmTiHxSGKuGbdrGRgcTTtK4pHEEoxKRESk5Kl4E6eQkp5SpP1ERESclYo3cQo+Hj5F2k9ERMRZqXgTp9Chfgd8PXyvu92EiXqe9ehQv0MJRiUiIlLyVLyJU3B1cWVWt1nAlULtWlc/zw6arfXeRESkzFPxJk7jYf+HGddgHHU96tq0+3n6sXLASq3zJiIi5YIW6RWn0q56OyIfjyQpJUlvWBARkXJJxZs4HVcXVzo26OjoMERERBxCl01FREREnIiKNxEREREnouJNRERExImoeBMRERFxIireRERERJyIijcRERERJ6LiTURERMSJqHgTERERcSIq3kRERESciIo3ERERESei4k1ERETEiah4ExEREXEiKt5EREREnIiKNxEREREnouJNRERExImoeBMRERFxIireRERERJyIijcRERERJ+Lw4m3r1q0MHjwYf39/qlSpgq+vL3379mXnzp25+u7atYuuXbtStWpVqlevTnBwMAcPHsxz3Llz5+Lv74/ZbKZhw4ZERUVhsViK+3BEREREipXDi7cFCxZw+PBhQkNDWb9+PbGxsZw8eZK2bduydetWa79ffvmFjh07cvnyZVasWMEHH3zAb7/9RocOHTh16pTNmNOmTSM0NJTg4GA2bNjAiy++SExMDCNGjCjpwxMREREpUhUcHcD8+fOpXbu2TVtQUBCNGzcmJiaGzp07AzB58mTMZjPr1q3D09MTgFatWnH77bczY8YM3njjDQBSU1OJjo5m6NChxMTEANCxY0csFgsRERGEhYURGBhYgkcoIiIiUnQcPvP2z8INoGrVqgQGBnL06FEAsrKyWLduHY888oi1cAO49dZb6dSpE6tXr7a2JSQkkJGRQUhIiM2YISEhGIbBmjVriudAREREREqAw2fe8nL+/Hl27dplnXX7448/uHTpEi1atMjVt0WLFmzatImMjAzc3d3Zu3cvAM2bN7fp5+PjQ82aNa3b85KZmUlmZqb1c1paGgAWi8Wu++Wu7qt77uyjPNpPObSfcmg/5bBoKI/2K205zG8cpbJ4GzFiBBcuXCA8PBy4cikUwMvLK1dfLy8vDMPg7Nmz+Pj4kJqaitlspkqVKnn2vTpWXqZPn05UVFSu9o0bN1K5cuXCHo7Vpk2b7B5DlMeioBzaTzm0n3JYNJRH+5WWHF68eDFf/Upd8TZp0iSWLVvG3LlzadWqlc02k8l03f2u3Zbffv80YcIERo8ebf2clpZGvXr16N69u83l2oKyWCxs2rSJbt264ebmVuhxyjvl0X7Kof2UQ/sph0VDebRfacvh1St+N1OqireoqCiio6OZNm0aI0eOtLZ7e3sD5DlrdubMGUwmE9WrV7f2zcjI4OLFi7lmy86cOZOrILyW2WzGbDbnandzcyuSP9SiGqe8Ux7tpxzaTzm0n3JYNJRH+5WWHOY3Boc/sHBVVFQUkZGRREZGMnHiRJttt912G5UqVWLPnj259tuzZw+NGzfG3d0d+N+9bv/se+LECU6fPk2zZs2K6QhEREREil+pKN5ee+01IiMjiYiIYMqUKbm2V6hQgQcffJD4+HjS09Ot7UeOHGHbtm0EBwdb24KCgnB3d2fJkiU2YyxZsgSTyUS/fv2K6zCcXnZONtsPb+fTPZ+y/fB2snOyHR2SiIiI/IPDL5vOnDmTyZMnExQURO/evUlKSrLZ3rZtW+DKzNzdd99Nnz59GD9+PBkZGUyePJmaNWvyyiuvWPt7eXkRERHBpEmT8PLyonv37uzYsYPIyEiGDBmiNd6uI35/PKEJoRxLO2Zt8/P0IzYoluCA4BvsKSIiIiXJ4cXb2rVrgSvrsyUkJOTabhgGAP7+/mzfvp1x48bRv39/KlSoQOfOnZkxYwa1atWy2Sc8PBwPDw/mz5/PjBkzqFOnDuPHj7c+vSq24vfH039FfwwMm/bktGT6r+jPygErVcCJiIiUEg4v3rZv357vvq1atWLz5s356jtq1ChGjRpVyKjKj+ycbEITQnMVbgAGBiZMhCWE0bdJX1xdXB0QoYiIiFyrVNzzJo6TeCTR5lLpPxkYHE07SuKRxBKMSkRERK5HxVs5l5KeUqT9REREpHipeCvnfDx8irSfiIiIFC8Vb+Vch/od8PP0w0Teb54wYaKeZz061O9QwpGJiIhIXlS8lXOuLq7EBsUC5Crgrn6eHTRbDyuIiIiUEirehOCAYFYOWImvp69Nu5+nn5YJERERKWUcvlSIlA7BAcH0bdKXxCOJpKSn4OPhQ4f6HTTjJiIiUsqoeBMrVxdXOjbo6OgwRERE5AZ02VRERETEiah4ExEREXEiKt5EREREnIiKNxEREREnouJNRERExImoeBMRERFxIireRERERJyIijcRERERJ6LiTURERMSJqHgTERERcSIq3kRERESciIo3ERERESei4k1ERETEiah4ExEREXEiKt5EREREnIiKNxEREREnouJNRERExImoeBMRERFxIireRERERJyIijcRERERJ6LiTURERMSJqHgTERERcSIq3kRERESciIo3ERERESei4k1ERETEiah4ExEREXEiKt5EREREnIiKNxEREREnouJNRERExImoeBMRERFxIireRERERJyIijcRERERJ6LiTURERMSJqHgTERERcSIVHB1AeZadk03ikURS0lPw8fChQ/0OuLq4OjosERERKcUcPvOWnp7Oq6++Svfu3alVqxYmk4nIyMhc/QzD4L333qNVq1Z4enri7e3NAw88wJdffpnnuHPnzsXf3x+z2UzDhg2JiorCYrEU89HkX/z+eBrENqDT0k48Ef8EnZZ2okFsA+L3xzs6NBERESnFHF68paamsmjRIjIzM+nXr991+02ZMoVhw4bRpk0bVq1axZIlSzCbzfTp04f4eNuCZ9q0aYSGhhIcHMyGDRt48cUXiYmJYcSIEcV8NPkTvz+e/iv6cyztmE17cloy/Vf0VwEnIiIi1+Xwy6a33norZ8+exWQycfr0ad5///08+33wwQe0b9+eBQsWWNu6detGnTp1WLp0KcHBwcCVYjA6OpqhQ4cSExMDQMeOHbFYLERERBAWFkZgYGDxH9h1ZOdkE5oQioGRa5uBgQkTYQlh9G3SV5dQRUREJBeHz7yZTCZMJtNN+7m5uVGtWjWbNnd3d+vPVQkJCWRkZBASEmLTNyQkBMMwWLNmTZHEXViJRxJzzbhdy8DgaNpREo8klmBUIiIi4iwcPvOWX6GhoYwZM4bFixcTHBxMRkYGb731FufPn2fUqFHWfnv37gWgefPmNvv7+PhQs2ZN6/a8ZGZmkpmZaf2clpYGgMViset+uav7WiwWjp47mq99jp47Wqru0SsNrs2jFI5yaD/l0H7KYdFQHu1X2nKY3zicpngLCwujUqVKjBgxgiFDhgDg5eXF2rVrue+++6z9UlNTMZvNVKlSJdcYXl5epKamXvc7pk+fTlRUVK72jRs3UrlyZbuPYdOmTfyZ/me++v6590/W/7ne7u8sizZt2uToEJyecmg/5dB+ymHRUB7tV1pyePHixXz1c5riLS4ujtDQUEaOHEnPnj25fPkyH374IX379iU+Pp4ePXpY+97oMuyNtk2YMIHRo0dbP6elpVGvXj26d++Op6dnoWO3WCxs2rSJbt260cO1BwvnL+R4+vE873szYcLX05cxj47RPW//cG0e3dzcHB2OU1IO7acc2k85LBrKo/1KWw6vXvG7Gaco3s6ePWudcZsxY4a1vWfPnnTs2JHhw4dz6NAhALy9vcnIyODixYu5ZsvOnDlDq1atrvs9ZrMZs9mcq93Nza1I/lCvjjOn5xz6r+iPCZNNAWfiSmEZGxSLu9n9esOUe0X151GeKYf2Uw7tpxwWDeXRfqUlh/mNweEPLOTHr7/+yqVLl7j77rtzbWvdujWHDx/m77//Bv53r9uePXts+p04cYLTp0/TrFmz4g/4JoIDglk5YCW+nr427X6efqwcsJLggGAHRSYiIiKlnVPMvNWtWxeApKQkBg0aZG03DIOkpCRq1KhhvcctKCgId3d3lixZwj333GPtu2TJEkwm0w3XkitJwQHB9G3SV29YEBERkQIpFcXbV199xYULF0hPTwdg3759rFy5EoBevXpRv359goODWbRoEWazmV69epGZmcnSpUv59ttvee2116z3snl5eREREcGkSZPw8vKie/fu7Nixg8jISIYMGeLQNd7+ydXFlY4NOjo6DBEREXEipaJ4e+GFF/jzz/89hfnvf/+bf//73wAcOnSIBg0asGzZMubNm8dHH33EBx98gJubG3fccQcff/wxTzzxhM144eHheHh4MH/+fGbMmEGdOnUYP3484eHhJXpcIiIiIkWtVBRvhw8fvmkfd3d3xowZw5gxY/I15qhR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APfddx9ms5ktW7YwatQom/HDwsJYtWoV999/Py+//DItWrQgJyeHI0eOsHHjRl555RXuueeeAsfdpEkThg0bxty5c3FxcaFnz54cPnyYSZMmUa9ePV5++eUCj7ls2TIyMjIYNWoUHTt2zLXd29ubZcuWsXjxYt5+++0Cj18U9u3bx759+wA4ceIEFy9eZOXKlQAEBgYSGBjokLhEygvNvImIw5lMJtasWcPo0aOJi4ujV69e1mVDtm7dmuttBFfvZ7v2vjaz2Uz79u1ztQNUqVKFxMREnn32WRYtWkTv3r0ZMGAAc+bMwc/Pz67XOy1YsIDXX3+d9evX06dPH8LDw+nevTvfffed9bJqQSxevJjatWvTr1+/PLc3b96ctm3b8vHHH3P58uVCx22PFStW8Oijj/Loo4+yc+dOTp06Zf28YsUKh8QkUp6YDOMfCxyJiIiISKmlmTcRERERJ6LiTURERMSJqHgTERERcSIq3kRERESciIo3ERERESei4k1ERETEiah4ExEREXEiKt5EREREnIiKNxEREREnouJNRERExImoeBMRERFxIv8/jRSoYwp8xmcAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from lmfit import Model\n", + "\n", + "fitModel = Model(horz_tf, independent_vars=['x'], param_names=['w_x', 'w_z'], nan_policy='raise')\n", + "params = fitModel.make_params()\n", + "params['w_x'].set(value=25, min=0, max=100)\n", + "params['w_z'].set(value=35, min=0, max=100)\n", + "fitResult = fitModel.fit(data=np.array(tf_z[:-2]), params=params, x=np.array(p_1[:-2]))\n", + "\n", + "plt.figure()\n", + "plt.errorbar(p_1, tf_x, yerr = dtf_x, fmt = 'og')\n", + "plt.errorbar(p_1[:-2], fitResult.best_fit, fmt = 'k--')\n", + "plt.xlabel('Power of Arm 1')\n", + "plt.ylabel('Horz TF (Hz)')\n", + "plt.tight_layout()\n", + "plt.grid(visible=1)\n", + "\n", + "fitResult" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 68, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0.005, 0.0057, 0.0064, 0.0071, 0.0078, 0.0085, 0.0092, 0.0099, 0.0106, 0.0113, 0.012, 0.0127, 0.0134, 0.0141, 0.0148, 0.0155, 0.0162, 0.0169, 0.0176, 0.0183, 0.019, 0.0197]\n", + "22\n" + ] + }, + { + "data": { + "text/plain": [ + "0.01235" + ] + }, + "execution_count": 68, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "l = list(np.arange(0.005, 0.02, 7e-4))\n", + "# l = np.logspace(np.log10(250e-6), np.log10(500e-3), num=15)\n", + "\n", + "l = [round(item, 7) for item in l]\n", + "#random.shuffle(l)\n", + "\n", + "print(l)\n", + "print(len(l))\n", + "np.mean(l)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "pixel = 5.86e-6\n", + "M = 0.6827\n", + "F = (1/(0.3725*8.4743e-14)) * (pixel / M)**2\n", + "NCount = 85000\n", + "AtomNumber = NCount * F / 1e8\n", + "print(AtomNumber)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "muB = 9.274e-24\n", + "hbar = 6.626e-34 / (2 * np.pi)\n", + "gJ = 1.24\n", + "\n", + "f = ufloat(10108.46982, 0.26282) \n", + "Delta = 2 * np.pi * f * 1e3\n", + "\n", + "Bz = (Delta*hbar) / (muB*gJ)\n", + "print(Bz * 1e4)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "muB = 9.274e-24\n", + "hbar = 6.626e-34 / (2 * np.pi)\n", + "gJ = 1.24\n", + "Bz = 5.8854 * 1e-4\n", + "(Bz*muB*gJ/hbar) / (2 * np.pi * 1e6)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## ODT 1 Calibration" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "v_high = 2.7\n", + "\"\"\"High Power\"\"\"\n", + "P_arm1_high = 5.776 * v_high - 0.683\n", + "\n", + "v_mid = 0.2076\n", + "\"\"\"Intermediate Power\"\"\"\n", + "P_arm1_mid = 5.815 * v_mid - 0.03651\n", + "\n", + "v_low = 0.062\n", + "\"\"\"Low Power\"\"\"\n", + "P_arm1_low = 5271 * v_low - 27.5\n", + "\n", + "print(round(P_arm1_high, 3))\n", + "print(round(P_arm1_mid, 3))\n", + "print(round(P_arm1_low, 3))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## ODT 2 Power Calibration" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "v = 0.842\n", + "P_arm2 = 2.302 * v - 0.06452\n", + "print(round(P_arm2, 3))" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + }, + "vscode": { + "interpreter": { + "hash": "c05913ad4f24fdc6b2418069394dc5835b1981849b107c9ba6df693aafd66650" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/AccordionLattice.ipynb b/AccordionLattice.ipynb new file mode 100644 index 0000000..34f82cb --- /dev/null +++ b/AccordionLattice.ipynb @@ -0,0 +1,3810 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Import supporting package" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import copy\n", + "import glob\n", + "from datetime import datetime\n", + "\n", + "# The package for data structure\n", + "import xarray as xr\n", + "import pandas as pd\n", + "import numpy as np\n", + "\n", + "# The packages for working with uncertainties\n", + "from uncertainties import ufloat\n", + "from uncertainties import unumpy as unp\n", + "from uncertainties import umath\n", + "\n", + "# The package for plotting\n", + "import matplotlib.pyplot as plt\n", + "plt.rcParams['font.size'] = 18 # Set the global font size\n", + "\n", + "# -------------- The modules written by us --------------\n", + "\n", + "# The packages for read data\n", + "from DataContainer.ReadData import read_hdf5_file, read_hdf5_global, read_hdf5_run_time, read_csv_file\n", + "\n", + "# The packages for data analysis\n", + "from Analyser.ImagingAnalyser import ImageAnalyser\n", + "from Analyser.FitAnalyser import FitAnalyser\n", + "from Analyser.FitAnalyser import ThomasFermi2dModel, DensityProfileBEC2dModel, Polylog22dModel\n", + "from Analyser.FFTAnalyser import fft, ifft, fft_nutou\n", + "from ToolFunction.ToolFunction import *\n", + "\n", + "# Add errorbar plot to xarray package\n", + "from ToolFunction.HomeMadeXarrayFunction import errorbar, dataarray_plot_errorbar\n", + "xr.plot.dataarray_plot.errorbar = errorbar\n", + "xr.plot.accessor.DataArrayPlotAccessor.errorbar = dataarray_plot_errorbar" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Start a client for parallel computing" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "
\n", + "
\n", + "

Client

\n", + "

Client-ec6398b9-3081-11ee-8bf4-80e82ce2fa8e

\n", + " \n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "
Connection method: Cluster objectCluster type: distributed.LocalCluster
\n", + " Dashboard: http://127.0.0.1:8787/status\n", + "
\n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "

Cluster Info

\n", + "
\n", + "
\n", + "
\n", + "
\n", + "

LocalCluster

\n", + "

4ce5b94f

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + "\n", + " \n", + "
\n", + " Dashboard: http://127.0.0.1:8787/status\n", + " \n", + " Workers: 6\n", + "
\n", + " Total threads: 60\n", + " \n", + " Total memory: 55.88 GiB\n", + "
Status: runningUsing processes: True
\n", + "\n", + "
\n", + " \n", + "

Scheduler Info

\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "

Scheduler

\n", + "

Scheduler-2d9a562e-40d2-429e-8c28-884f969028f1

\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " Comm: tcp://127.0.0.1:54459\n", + " \n", + " Workers: 6\n", + "
\n", + " Dashboard: http://127.0.0.1:8787/status\n", + " \n", + " Total threads: 60\n", + "
\n", + " Started: Just now\n", + " \n", + " Total memory: 55.88 GiB\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "

Workers

\n", + "
\n", + "\n", + " \n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "

Worker: 0

\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "
\n", + " Comm: tcp://127.0.0.1:54486\n", + " \n", + " Total threads: 10\n", + "
\n", + " Dashboard: http://127.0.0.1:54488/status\n", + " \n", + " Memory: 9.31 GiB\n", + "
\n", + " Nanny: tcp://127.0.0.1:54462\n", + "
\n", + " Local directory: C:\\Users\\data\\AppData\\Local\\Temp\\dask-worker-space\\worker-2_6ukeb3\n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "

Worker: 1

\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "
\n", + " Comm: tcp://127.0.0.1:54487\n", + " \n", + " Total threads: 10\n", + "
\n", + " Dashboard: http://127.0.0.1:54489/status\n", + " \n", + " Memory: 9.31 GiB\n", + "
\n", + " Nanny: tcp://127.0.0.1:54463\n", + "
\n", + " Local directory: C:\\Users\\data\\AppData\\Local\\Temp\\dask-worker-space\\worker-9_dt1qef\n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "

Worker: 2

\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "
\n", + " Comm: tcp://127.0.0.1:54499\n", + " \n", + " Total threads: 10\n", + "
\n", + " Dashboard: http://127.0.0.1:54500/status\n", + " \n", + " Memory: 9.31 GiB\n", + "
\n", + " Nanny: tcp://127.0.0.1:54464\n", + "
\n", + " Local directory: C:\\Users\\data\\AppData\\Local\\Temp\\dask-worker-space\\worker-hz73j2wk\n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "

Worker: 3

\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "
\n", + " Comm: tcp://127.0.0.1:54492\n", + " \n", + " Total threads: 10\n", + "
\n", + " Dashboard: http://127.0.0.1:54494/status\n", + " \n", + " Memory: 9.31 GiB\n", + "
\n", + " Nanny: tcp://127.0.0.1:54465\n", + "
\n", + " Local directory: C:\\Users\\data\\AppData\\Local\\Temp\\dask-worker-space\\worker-mw_4y2aj\n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "

Worker: 4

\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "
\n", + " Comm: tcp://127.0.0.1:54493\n", + " \n", + " Total threads: 10\n", + "
\n", + " Dashboard: http://127.0.0.1:54496/status\n", + " \n", + " Memory: 9.31 GiB\n", + "
\n", + " Nanny: tcp://127.0.0.1:54466\n", + "
\n", + " Local directory: C:\\Users\\data\\AppData\\Local\\Temp\\dask-worker-space\\worker-31bidd3h\n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "

Worker: 5

\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n", + " \n", + "\n", + " \n", + "\n", + "
\n", + " Comm: tcp://127.0.0.1:54498\n", + " \n", + " Total threads: 10\n", + "
\n", + " Dashboard: http://127.0.0.1:54502/status\n", + " \n", + " Memory: 9.31 GiB\n", + "
\n", + " Nanny: tcp://127.0.0.1:54467\n", + "
\n", + " Local directory: C:\\Users\\data\\AppData\\Local\\Temp\\dask-worker-space\\worker-2un23e6e\n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + " \n", + "\n", + "
\n", + "
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from dask.distributed import Client\n", + "client = Client(n_workers=6, threads_per_worker=10, processes=True, memory_limit='10GB')\n", + "client" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Data analyse" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## With 10 Hz Modulation" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.DataArray 'CH1' (x: 1200)>\n",
+       "array([0.59 , 0.648, 0.62 , ..., 0.612, 0.576, 0.638])\n",
+       "Coordinates:\n",
+       "  * x        (x) float64 0.0 0.002 0.004 0.006 0.008 ... 2.392 2.394 2.396 2.398
" + ], + "text/plain": [ + "\n", + "array([0.59 , 0.648, 0.62 , ..., 0.612, 0.576, 0.638])\n", + "Coordinates:\n", + " * x (x) float64 0.0 0.002 0.004 0.006 0.008 ... 2.392 2.394 2.396 2.398" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "filePath = r'F:\\Jianshun\\AccordionLatticeShorTermStability\\withModulation.csv'\n", + "\n", + "data = read_csv_file(filePath, csvEngine='pandas', csvKwargs=dict(header=[0], skiprows=[1], encoding = \"ISO-8859-1\",))\n", + "dataWithModulation = xr.DataArray(\n", + " data=data.CH1[0,:],\n", + " dims=['x'],\n", + " coords=dict(\n", + " x=data.X[0,:].to_numpy() * 2e-3\n", + " )\n", + ")\n", + "dataWithModulation" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnMAAAHECAYAAABSl6xeAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAA9hAAAPYQGoP6dpAADHKElEQVR4nO2deXxWxfX/P09IyJ6wKIQ9iCAgEZCiILggiGilWqliXUBRtFprtS6tS2mwX1zB/my1LtWKVhRF3GoVUIoVF0AUZBFBgbAjaxYSkpDk+f0R8uSuc2fmnrsl8369ePE8uXPPzDN37txzz5xzJhaPx+NQKBQKhUKhUESSpKAboFAoFAqFQqGQRylzCoVCoVAoFBFGKXMKhUKhUCgUEUYpcwqFQqFQKBQRRilzCoVCoVAoFBFGKXMKhUKhUCgUEUYpcwqFQqFQKBQRJjnoBijY1NXVYefOncjOzkYsFgu6OQqFQqFQKDiIx+MoKytDx44dkZTkre1MKXMhZ+fOnejSpUvQzVAoFAqFQiHBtm3b0LlzZ0/rUMpcyMnOzgZQPxhycnICbo1CoVAoFAoeSktL0aVLl8Rz3EuUMhdyGpZWc3JylDKnUCgUCkXE8MNFSgVAKBQKhUKhUEQYpcwpFAqFQqFQRBilzCkUCoVCoVBEGKXMKRQKhUKhUEQYpcwpFAqFQqFQRBilzCkUCoVCoVBEGKXMKRQKhUKhUEQYpcwpFAqFQqFQRBilzCkUCoVCoVBEGKXMKRQKhUKhUEQYpcwpFAqFQqFQRBilzCkUCoVCoVBEGKXMKRQKhaJZE4/HUXmkNuhmKBTSKGVOoVAoFM2ae99egxP/NB8b9x4KuikKhRRKmVMoFApFs+aVpVtRWxfHYx9uCLopCoUUSplTKBQKhQLA1v0VQTch9Bwor8ary7airPJI0E1RaEgOugEKhUKhUISB7QeVMufEpJlfYuW2Ynz6/T48ecXJQTdHcRRlmVMoFAqFAkBtXTzoJoSelduKAQD/Wb0r2IYodChlTqGQ4NlPNmLCP5ehqkZFwCnCSeG7a3HB3xa7dup/eN53OO/xxfh2ZylRy8LF11sPJj4rVS66VB6pxVXPL8U/PtkUdFMCQSlzCoUED7z/HT7ZsBfvrtwZdFMUChM1tXWY+XkR1uwoxTsux+hTH2/Eul2lmLV0C1HrwsXFf/886CYoCHh35U4s/n4fpr2/LuimBIJS5hQKF6hlmehyoLwaB8urg26GJ2iHZW1dHYnMqhoaOWGmrLKmSVrb95RWhjJg4cfSShyqqnEt50htHVbtKHbfoAijlDmFwgWpKeoWiiLVNXU4+c8fYuCfP8SR2qanpMTVgqE0Fz3ZtCx1+w9V4ZQHFqKgcAG5bDdL73vKKnHqAwsxYKr7dk385zK8vGSrazlRJnJPorKyMhQWFqKgoABZWVnIzc3F4MGDMWPGDFRXi79lFxUVIRaLcf+75pprbGVt3LgRN9xwA7p37460tDS0a9cO5557LubOnevmJytCRjze+KBs2aJFgC1RyLL3UFXi8+EmmPk/rnQ5adbtalq+gWs89HX89yr5JfyvtxQDAGoIVjc+37hf9726GViRjURKmduyZQtOOukkTJ06FWvWrEE8HkdVVRWWL1+OO+64A0OGDMHBgwedBWlo0aIF2rdvz/yXm5ubKD948GBLOe+//z5OOukkPPvssygqKkJqair279+PBQsW4Be/+AUmTZqkUwLCyLc7SzFjwXqUE5i9mzLVGktOanKkbiHFUZ5c9EPic4tYzJWson3leHT+dzhAsGS7bPMB/PHtNfhhj7ughZBPNQof0T53Xl1Ga72qOuJGaWps15zl29w3RsPh6qb3guZEZJ5EtbW1GDt2LIqKitChQwd8+OGHKC8vR0VFBWbPno3s7GysWLECV1xxhZDcLl26YPfu3cx/V111FQAgPT0dl19+uUnG5s2bcemll6KiogLDhg3D+vXrUVJSgpKSEkyZMgUA8MILL+DRRx913xEecv5fF+Nv//0Bj85fH3RTQk2lZgJTy6zRY9nmA3hlaeNDrc6l5jP2iU/x5KKNuOuNb9w2Dde9+CX+tWQLpv57rSs5bn+Tomly95urUVJB5ztXXUujNN35xirs01jL3XKouvkZJCLzJJo5cyZWr14NAJg7dy5GjRoFAEhKSsL48ePxzDPPAAA++OADLFy4kKzeyspKzJo1CwAwbtw4tGrVylRmypQpKC8vR15eHt577z306tULAJCVlYWpU6fi+uuvBwBMmzZN2HIYBCu2hr+NQVKlWZZrkeTOqqPwn10lh3Xf3ao9ZZX1D47lW9zfN6VHZbld6vNClVMjvWlQS6jou7PM6UfUnlI6Za6iGa4uRUaZe/HFFwEAI0aMwNChQ03HL7vsMnTv3h0A8NJLL5HV++abbyYUsOuuu850vLy8POETd+ONN1oqe3fffTcAoLS0FG+//TZZ27yiOUStuUFrmVN+5tEn3gSH+9MfbySRo12ia05DPSxBMTMWrMcZjywiWcJvwI3V9oXPNuu+V7vqJ307Sg7TWQzL1TJrOKmoqMBnn30GADjvvPMsy8RiMYwZMwYAsGABXdTO888/DwDo2bMnzjzzTNPxTz/9FIcPH2a2LT8/H3369CFvm1c0R+dRESo1qQua0wOuqdIUIz+f0PgEuqG5Zt6pCIky8Lf//oCtByrwCmGOPzeGuan//lb33Z1lTg+lMlfVBIOanIiEMrdu3TrUHc2V1K9fP9tyDcd2796NAwcOuK5306ZNWLRoEQDg2muvtSyzZs2axOcTTzzRsW1r17rzhfGDsFnmvt1Zis37yoNuRgLtEhjFisX63WWuHd7DSm1dHIu/30uW42p50QF8WeT+3tbiRmGpI9R2KkP4ANJa5soqj+CzH/a5+s21dXF8+v0+kgf35n3lWLOjxLUcK2SDwOrq4vjsh32u/dLi8Ti+0ERopqXIR83vKqnUff+xtNKmpDhucvJtP6h3dyglzIPXHN9BIqHM7dzZGP7cqVMn23LaY9pzZPnnP/+JeDyO5ORkTJw4kdm21q1bIyMjw7FtTu2qqqpCaWmp7p/fhClp5sHyapz/18UYMf3joJuS4LezVyY+u3U0L6+qwbn/7xOMeux/qAnJ0g4l/1i8CVc9vww3zfratayifeX4xdNf4JKnvyBV7t1Emb/6ZWMghVufstvnuA+gsMLNENWeOn/tj7jiuaWY5SIics7ybbjy+aX45bNL5BuFeqVpxPSPccHfPiV16G+gQtKB/tUvt+KK55bi0me+cFX/B2t245f/aOyj3PQUaVl3v7la9/2Cv30qJcdKAXfz4v9//9Hv1FBKaJlrjgFAkVDmysrKEp9ZCpP2mPYcGWprazFz5kwAwE9/+lPk5eUx28Zql/a4U7sefPBB5ObmJv516dJFsOXuCZNl7seyxrfIMCg7xge/2ylD6wtzpLbpTUBP/rd+uW/x9/tcy9LmhttbRucs7ca49u9v6LZz+8+q8G1cbvVQfOvr7dLy5q3dDQD41mWAxx7N9ae06DQgO9W88VV936z/0d3z58Nvf9R9z3GhzFFh9ZIv+6ywUpYpFbBmqMtFQ5kLgnnz5mHHjh0ArAMfvOLuu+9OpDUpKSnBtm20+XfseE+T/JHCZ27j3kO45dUV2OBiUquprUPhu43L0pWS7YrH4yh8dy1e+9J9jqWP1+/VfXc7Ac1bs9vV+V7y2IL1rjetLtMsV7ld3tEu71HmbDQ+OGU5WHEkFC8clFh1s5uXjvy2mRrZ8nK0ltkkFxHldvnIZP0otfJOf+S/uHX2ChJl8643VmE/YeoOGawul+yzomhfhcvWsFHKXEjJzs5OfK6osB8E2mPac2R47rnnANQvj9oFNmjrYbVLe9ypXampqcjJydH984ObX1mR+Exhmbvk6S/w7jc7XS2vvbJsK5ZsavSPkvUpWrR+D2Z+XoTfz13tXNiBa2Z+qf+Dy0kjrJtC7yw+jL/+9wdMe38d2f6zv5+7ytX52lZQOubf85b8uIgZFldfI05+SoGbrrJW5uTnh7zctMRnN3ty7tFY7N0ohc98Yh31KytSGzix7cBhvL1yJ2YQ5O0sOXwEf3xnjXNBD7F6cZUdC9rr5wVqmTWkdOzYMfG5wVpmhfaY9hxR9uzZg//85z8AgKuvvhotGFs2NdRz8OBBpkLX0DY37fIKasfrmtq6xPLhDoOTqwgrtxbrvstm9dbmL6KMmAJoIyHdyqqti6PySC3J9WzInQbQRTcXufRz0y7NuFEwvZzoV23zxiHfDW6y4VuNSTfKnNaI5kYh117/OhfDc3eJtVIhO0Sstobb5mIO1BJ0kBTlbWN1D3otv6kTCWWuT58+SEqqb6o2etRIw7G8vDy0adNGur4XX3wRR44cQSwWw6RJk5hltdG1rEjVhraxIl6DYvtBOpN3bV0cI2Z8nPjetQ3bl5DFlgP6dskGZmgtjYP+/CGWE0ZDunmQGHEz/9TVxTHqsf+h9x/nofcf57nKS/Xi50U49/99kvgehlQ1q7YXY9LM5YnvVz6/VFrWba95E2gAAFsOBB91/fYK/QvvzM+LpJfoqJdZtZbMm1+Rt9pr23X1zGXScuyQVQasFGcqy3bQvsyUCpLVvCkrfd4as69pM9TloqHMZWRkYNiwYQDqfdmsiMfjmD9/PgBg9OjRrupryC03YsQIHHfcccyyw4cPR3p6OrNtW7Zswbp160ja5gVaK4xbivaXY9uBxjfR3Ax5x11jeoBKyZxGWiWwpi6OFQaLnxso5ww3k+Wu0kqdH9H8tfK+eH96V/9SUkW0ZY8b/vLhhqCbwEUY8pPd+tpK098WSPoFUi6tAXpLn5ugGG27Nu0NXoFuoJzIsd/KC5Ayp5sMlAqSlSjZ+U+bXaBRfvPT5iKhzAFIpAZZtGgRli41v5XPmTMHmzbVO2tPmDBBup5PP/0U69fX+zjwBD5kZmZi3LhxAICnnnoKJSXmZZaHH34YQL2/3EUXXSTdNq+gHPZb93vn2Cq7fGi0LM1zoegYWb5F3spnbJebF/gtHubho3qIFHk4NqIOlfXGDqPLAi9WrZK1zJUcPoLZy2h8CqkUi5hN7ISsfKvzZJSUT77fa/pb0CmjSC1zHi+zLt1Et/oSFSKlzBUUFCAej2PcuHGJ/Vfr6uowZ84cTJ48GUD9LgwjR47UnVtYWIhYLIZYLIaioiJmPQ2BD23atMHFF1/M1bb7778fmZmZ2LVrF8aOHYvvv/8eQP1WX/fffz+efvppAMB9992H1q1bc/9mv6CMDNxRrPcPodzPUd4ypz/vqy0HXe992cAz/5OP9jQtybi4DMZ+p5wY3W3Zo+ebbcVS58UsnrqU41YWO2VAlNe+9DZwQjYww2qrM1nL3G9eXYFNRC8dXlteKOWLumIcLK/GvkNmN4mgl1lJLXOWypxcBVZnPeMyCj+KJAfdAF6Sk5Px7rvvYsSIESgqKsKoUaOQkZGBuro6VFbWO7EOHDgQs2bNkq6jrKwMc+bMAQBceeWVSE1N5Tqve/fueP3113HJJZdg8eLF6NWrF3Jzc3Ho0CHUHl2iuvrqq3HnnXdKt81LKI0ClBYG471t5VzMg9UkWLSvHH06+BMpbIdxScbNm2+Nod8pH0aUPnMb9x5C/y6tSGTF43TKVNCYd7UIxw+jDID4ZIPZ2iSL19uMBemMv7/c2r8xaN9VWssc398U/ETGMgfU73G6atUqTJkyBf369UMsFkNKSgoGDRqE6dOnY8mSJa4sX6+++moiIlU0t9z555+PVatWYfLkycjPz8fhw4fRqlUrnHPOOXjjjTfwwgsvWFoXwoCXb1yUP1l2mTWs+/QZfQJfd5HWwjjRTidIh9CArEXAygpHOdbeXGEf2e4XXt3S+w5VYdxTn2PV9mJvKuDkPYtExpSb0H8l4aYQj8dNuxpQ4/WSIgu77jW+sLlh2WbxfqdUtqy6RLbL7W7BMFju/SRSyhxQ73c2depUrF69GocOHUJpaSmWL1+O22+/HS1btrQ8p7CwEPF4HPF4HPn5+bayr7/++kS5goIC4bb16NEDzz77LDZv3oyqqirs27cPCxYsSPjUhRXSzNtkkszIvplaKSNh0KuN7Xrwg++kZRkv4cGKI2STmWy/u93SyIk7PNr+SgQvnxdfbTmI8c+42/bKLfe9bc4eQLlTybinxMfI2p2UWxxaTwS0gU1i5WsoQ+RtkLs3vVVwZZ9Ddmc1M10uesqcgh7aPfHIRJmQFR308oQd1k7AkhOaxXlUkZWUSrTsNfRa95bp93g8bsqdt+0AbZCHrGtBU8bKMlhHPPEEuczqdTCMLFbN2io53q1SJ+0qocnH10BzyzWnlDkFrv/XV2SyTMusLh7DRn8d2ZszaMdhO6wmx78u/EFKllXPHKyQzzWnJegoOj+YsUA89cnT/9uEnYakswcrjmDR+j1UzVJYYOWucq+FBdEdlAEQTUWZs35h/GC12J7CR2rrTOmPAOD15dtNgVxuCGcveodS5hSkePoyJCnb68lR1ppmNTn+5SO5fGpWD4ziChqLaxgsm14viz+xSFyJfnie9bL4rCXu9wBWiPHqMto+p7XMiZUPrTJnMw3887PNQnIOMfKaLt20X0gWC2WZUyhcQHUDHa6uxYYf9dvXUN6ci74LPrLOTWJfIzM/LzL9TWbrMqsgE8rUJAprmpuzdliwzTMnIWtvmXUUqui8RRnoQMkXRIqWX/7Kze2WUsqcghTj/SN74/71v9+b/kY5x1FuiC77IHaTo07Lmh0llgl5ZXwhn/6feeNxymXqoJWWoOsPkqby2/3QBWR88H7zqvX2ZKKWtrBa5v783reWfw/rsApru7xCKXMKUqisZ99aRKzJ5k7zOsFo0HPvXpt9N2XaZZVMORxKAM0jPBQ/xQI/0hYFPU6jhExXLbHZdUB0zIVVmbNDtLUsP2rK20AtsyqaFS99UUQm65MNe/HIPPf5zWrr4vifRYLRsM5xMz8X8xnxC7k9Ic2z6e/nrkYN0VLrnW+sIpEjQzwex+XPBZvqw4p4PI63fMiZJ6qUr9h60KOWuMOPZbpAo1kJK39rxXYyWVFDKXOKZsWUd8xRRbJM+OcyEjlrdpj3twXCYiEy88D78vnhvESmt+ysmDJJRsPGzpJKW+tJkMimdxBF9GVo8kt0Ue5hxTbhrMTdY6dkiipntYR5/G57LfhcjEa8XilpIKwv/16hlDmFpyzbfEBYCbN7o7JT8hTWhFX5lYFiL13KhyQL0bb6dZlELRWUOz0cqrKPYAyS7w1BVgk83u2ARVgDIKig/nm20fZNuxtNKGVO4Sk1dXHhqE07/6HXl2+3jRhTmKFaZg2aPWWVJPmnKJevWOwoPmyZFLU5c+VzS8lkUY3Rw9W1WGbaE7ceGYXDrlWiPnCUSnQYoXzJ/JrhCqCWWRUKYj5aR5dEVWZJqpnd0wlkfrftEkiAOt763WUkcvx0LN9JmPyUiiAfbist9ukNmuLD9go35VKg6LjzYzsvSsRXXujqXspwm1DKnEIBmLYpUgBb9tP1iR9LoE1ltUYmX54VTn1+mGj7M1EoHfpZu3V8/oNYnrAw7F/sJSwLH+XtKXqvU+59y6Kskm4bRxEoFWXWGG0q8x8vSplTWDLpxS/JZDWVZ8J1Ly4nk+XHS2NT8ZkrPUzjb+W0zPr8pzR5/4DgFKGXGbtPXPcS3fhtCrCuEeWdI6pU1PikzP3tv3JbBxoRbi3jBEo3D78CLcKCUuYUlmzaG07LXJDWgu/32DhLS0C6BGAjirKKIH3pqCxzTstdP5bS+WMG1V97yiqdCykAsF8yKV+ERH01/fKZo3IFEN3uj3UbUs6LTeRdlhulzCls2X6QJmWCqALWVCx5LFgTmuhy7jUzra2ofi1neE0pYznoP6v4N/l2ckWi/I0issIYdAKw78N3VnqfF8+Oa2Zap0Ci9MuTuXPsArdEd5NgKXNzv6LLG0eVqHrtzlJUVPNbz1nz0u9eF0ulwvoFymdOoTjKa1/SbXml0MOaaP71xRaiOkjEBA7rzf+3s1dwy/ErmrWpwHrY/3b2Sv8aYmDfIevAhRkLBBOWs5ZZAxwrrLnh9jl0eeMoXyFWbi3mLks5LymfuUaUMqewJSh7AbUVyO6eppywywXzaG0/aL/EQfX7aZdZxWBZIyj7XaSvah1Mc0GNd1ILakitfCwC276KUW2Qer9fdZPOswKy/FKUKQPWooBS5hSeQ/mAoZx/RJ8hrMnvT++K7aRxzl/+J1a5BEEuM/x71U7bY8L97rItDfgVJQiIPSj9slSElTnLg1kBYHV7kMpcFC1KInO8X317+T/ochtGAaXMKeyJ4pNBANE3RFZviCZGZlVN5csS5DNhBWPZJSgl008LkMjDrbn59hj5akswe8Cy+l3KZ06+KTr8Gg+khjkhyxxhvRG0RHuFUuYUnkOpE/5jsXj6CLvJI6xvwFTdJbOcYXcKlYIJiD+sWKVFJnOnKEHK3xjUw42Spv6YZPX74ws30NVDJokWkfH+xUZ2jsIkAVnN/eXFK5Qyp7AlMJ85Rs3vrxazgLEQnVRYk18YH3ykb8CEP5B0LhfymQvnQySs+QCbuGGeef+v2SG+FzBVf4lGv8oi0txf/mMJW5bIy4tAvQp+lDKnsKWpT+aiG1qzuoPSqkOlGcq8Afuxp2hQb+Z++syJ/MSQ6phMgkrjQgnlMKyri5ONL9/GQ0BTFmuXEuF6m/gzSgSlzCmaLTe/8nXQTfAU0YdVeVUNlhP5L4UxZYCfljmRCFVK5davZxttIGQwT2RKZe73c1eRyYrizgUiStXPnvjMu4Y0Y5Qyp7AlqEmW3nJjLe/j9XuFpLAmLFrDHI0w0X7cesA+STSpFYMw8EQEPzcwF6kqrMvhfqmGgVnmCJWmOYTJfP165yDNMiBwEUV3jFDwoZQ5hee8ITjRUc5l1TV1+GjdHhJZrMmvKVj72dY0UQXMXth3u8qEZLEDIPhxWgYj9QsMyDLnF0EFi7BY/P0+ofJh7Xa/fCgpx/ungn3PQuT3v7+avQPM3jK6LfrCjlLmFJ5TUxcX8sWifLj9awnNbgpOhPHhRqmAiV4S1m+49JkvhGRRDQenpMGUiLQ5rEoF0xJNWxOZpI17+fdP9kuJFlXOfEsaTCjrsQ/pon9FLJNfO+w8cetr/DvERB2lzClsoXxzE9q7j3Ay+2GPmBWIiW8PNxooFbCwbm8kMkbDGwARUm0ughRX8L80hrXXfcszF8ZJC7S/f9nmA2Sywo5S5hS+IGK5olUcouf3QyXqwQ++E0pzwKpXdIcLSljjofJIHUoOH+GS4xQAQelDJPJACqtSwY7e5pfz3W52mo/golnD1/MV1TX4+8cbfakrrAl3X1m6lUxWWH+jFyhlTmFLcHtV0hFGJctPNu3j35+Q1Vff7+FfvgJo+8ppPMxayreU7mc0q4gyF0XLnMhD8s45dJGezoRvWykR3l1pvw0eNWG1zPG+OHIp4yH9jV6glLlmjHNGfJ8aYoAyaaZ/W9aEz2dOomY6SYS/4csidroU3oeyk9JEGwAhUNahXSIWpM0CyrsTe1jO40LL2w7zDL8oR3eNPaWV3LLCmN/PzzZ9t5vQBSUAePqqGelySplrzvyF0GnVCZGbKoRzrCNhfcsVIYy/4astB7Ful3g2fiv8tMSIKGBORXlF1dTWke2Qsnp7CYkcHkTG3Y0vs3ND3jiLP3ekX/ncwjqfrdxWzO2iEEZ47rEwzmleoZS5ZszLDpGepLsaCECaRDWE+d8o63Ga0ER+fxjnvSWb2HtCAvy/0enhLfTC4WhN45flZGHgvR+qHSxgIizfwnYcF+krynnkfxvEckOycApuDsKnzu8pN8qpO/gsc2Gc1bxBKXPNGMpJlnLiI02iSnQzV9fU4fAR+21o/FvO1UPZV7S+ijQ9wrOBN+81dpr8KftdZLnsP6vYflK8okiTwDodJ3xJCGwHCIeepVryLK44gu0H7RNye8W+Q86KWpQtVzwvOVH+faIoZa4Z4+fm6WI+RK6aoiOJ6De+tnwb83hg/oVOljkBWbRKNJEcDkG8fU9p8XWSJVLXi1+wLeRBBEgkOdw4IgqY0/UJ696svC+oPOV+zbn8S9kVU//9LaG0aNKMdDmlzDVnKN++nR44Ipa7WtJlVprbeZ/DcoSfVhEtztamoFLC+AfvL3T6eSJ9RbU0ygNVgIcIflqag3rgOivkvHKcy2zcSxeYwgtre74Goqzs8FnmovwLxVDKXDOGdJnV6bjAc+aaF5a5aosXhHVOIPUDc9cUT+CxrHL7zFEqWA69de3M5XR1ESpzH337I58wh04VW2YN583zm1fZuwNMX7CeSw6XIz6XJL5+3bKfTzHku3fCeW14UJlJ9ChlrhlD6ctCuewUxpQBTn1BOicKWdMcjgtUS7qcR9QfPGOQymdOBKeuYvlXisJ7XXhK/eFNvpxvvlrmAlIotuxnW66e/WQTlxyefuf9iTxj+V8Oy/IN8PmbRheu+yLKP1AQpcw1Yyjn0N0l7PxOQSlon29kbwBdyfnQpVwqEtnazAmnfqdMkSGCn9YYfsucgxyBOv30Y9vlcI0biHMFs/L9SidFoKK6lntsOdW4+Hu6CNUg8Hu5z8mfMVGuiSsyXEq0560ID0qZa9bQDfWxf/uUeTwIf6yyyiPY8CN754IZnEspzv6F/H057T/rXNWl5eKnPmceF1Giw7gTAeULRxB+bBT8/MnPuMrx/D7eBzxPv89fS7Nku3FvOUoqopzvzLkM9zjmWRrlFcVjmYuwtsPz8hLlZWRRlDLXjKGMMiutZFubgrDMHapytoAtWs9nFaCcEz7k9Vvi4EA5e2PxwCxzPs6hvBO2Y18QBvxQUsYxjgHq5T5n1uzgSyzMo0CWVjZtZY5nyZMbTlFcPnMRtl3xJH1uRrqcUuaaM84+c3TQ5qHzP2rPSWHYUXyYbsmWMmWMQNl/fraZrmIHNu3l2+uVy7rAWadTXzzzPz4fKQD4ZAN7+T4I+CxzNMusAK1iGOWHLpdSwSmLpxzlNfRrFwwvUNt56VHKXDPGT6WC0jLHK4vLeZ5w2emNr7bzyfJxihGxIL359Q6yep1+4W9nrySRIwJPXzhZOhv49Sv820b5BZfvFq8wwuU+ruoirM1RLrNSvrzw1BnGYDNe+Lbziu64EkUpc80YP5UKyjdAXgWFK+EsZx/wlOO1zDktf1Dul3i4mi6qUoSDDj5QvEoTzzXk9QPjeXBFNdceAC4zLO/Djc+axilLRVWC8hfy6if7ypzvsSiPd2WZ06OUuWaMny8tTvsgisA7/1Au7/DtREDzcHvhsyLUEr0y//zv7AAJLzhSW4dXl21llqFdouP1maOTFUYorSw8/cC73Ee5dBhG/PZV5OmrfYeqsP7HMsdykbbMKZ85HUqZU9hCabnzcyslESgf3pTLH7xWvjByyCEYBqBdduKFxwoR5XQOXD5znDM+ZbLmpv5A5YmqpBxXPKJWbS/mlBZdbY7vMdDEB58Gpcw1Y/wc5qQbwnPKolz8IJ2MCR+UfrKRM2iBL1kprxWTpz4uUaFMvUKJ8dc9ftkAUxnefp+/drdjGX6n/qbtiM8XAEE33nkK8dYX5VuCL4rY+3aEBaXMNWOcrB6UE2wQskgdkzkmR+4cXhF9Wzzv8cV8BSmtOlyF6B5cUV52qjM03ur38o5RnhxylJa5KCsVXL5blO4cXIL46ov0eOcKgPChISEhcspcWVkZCgsLUVBQgKysLOTm5mLw4MGYMWMGqqv5nKpZ7N69G3/84x8xaNAgtGnTBunp6ejWrRvGjBmDhx56CEeOmB27r776asRiMcd/NTV0mf/9IIgIVEpZlDc7rc+cc5kwPtyqazgdHynbTjgbN/UACL99AinHe5StppR7s/LAY/nm9UGUecn+6y8HYsLQbsLnUcO38tJ8tLnkoBsgwpYtW3DWWWehqKgIAJCRkYGqqiosX74cy5cvx6xZs7Bw4UK0bt1aSv5rr72G66+/HqWlpQCAli1bIj09HVu3bsXWrVsxf/58/OpXv0KrVq0sz09LS0Nubq6t/LA5Vzs156EPvsOvzuxBUhflZP3vb3bil6d0JalT9mZPipmVA97Ly5f/KbpQpsjgWnXilMXTrihbKowPZqsHNW06Ec5yPMuske53Z/ijiGnSKXHfExKBaT/r3xF9O+TgJcMesfF43NdnnNESbUXIHrmeEhnLXG1tLcaOHYuioiJ06NABH374IcrLy1FRUYHZs2cjOzsbK1aswBVXXCElf86cObj88stRWlqK8ePHY8WKFaiqqkJxcTHKysqwePFi3HbbbUhJSbGVMX78eOzevdv2X4sWLWR/vifwDPQjtTRhqJQWj7vfXM1Zp3MZWUf8Z6/6iWMZW1kcZaJsqaDcq5LPZ05uxk62WHOMsu+W8dlmeRkIH27c0awRtUTz4vdyH2WUPqn7S4SvYVMgMsrczJkzsXp1/UN87ty5GDVqFAAgKSkJ48ePxzPPPAMA+OCDD7Bw4UIh2bt27cINN9yAuro63HbbbZg9ezYGDBiQOJ6VlYXhw4fjscceQ2ZmJs0PCgF+mqD3llX5VleizkPOdcpaiEb1bS8vq8k/3JzL8PbVlv0VzrIkAyDW/XmMqUy0+53HZ87/6G0eovzyYqcPjerTLvF5+8HDXKK2HXAe70kcjo9BBEDwXEPKKH2e+naVVJLVF3Yio8y9+OKLAIARI0Zg6NChpuOXXXYZunfvDgB46aWXhGT/9a9/xcGDB9G5c2c89NBD7hsbEfz0ZfnVy/5nzL+YI8capYWIF546o+27RafNPfsJ/xZbThjHckoL8/QX4W63bHuv9lm674Ess/K8vLhrSqDYvbxkpeq9mFZuK3aUNePDDQQt4oc0ywBHmfveXkNXH2fbvyw6QFZnmImEMldRUYHPPvsMAHDeeedZlonFYhgzpv5Ne8GCBULyG5S/K6+8Ei1btnTR0mgz7Pi2uOJUvS9alB9uPPidzJNXVpT73d98+PwRmnzRrHIdn5eTJnWekUsGdZY+16hExwE8P3Gw7m8yLyX5bTPw05M6mJQTyt1TZPu9f5dWUudRYrdUaZwPlhMpFZSpjSgtojyieLc85MGq7a9OHoJnrxqk+9uSjfvJ6gwzkVDm1q1bh7qjnpr9+vWzLddwbPfu3ThwgO/G2bx5M3bu3AkAOPPMM7FixQqMHz8eeXl5SE1NRZcuXXDZZZfhiy++cJS1cOFC9OrVC2lpacjJyUFBQQFuvfVWfP/991xtAYCqqiqUlpbq/nmF8X6fdd0Q9O2Yo/ub30rFmh0lvtbHnWeOZ2mD0FIR5WUnSp85HniVCp7lX9l+f2x8f6nzjEz7eYH0uVa/r0ubDN13vmAEvaArh3TDk5efjDVTz9XLIhzvH6ze5VimxGKLuIfHyfcXFXbjyqtgAL48jnzIzzLmM/2esz7ZsNf0t6E92mJIj7a6vzWXIIhIKHMNyhYAdOrUybac9pj2HBYbNjSatZctW4ZTTz0Vr7/+OkpKSpCeno7t27fjtddew7Bhw/Dggw8yZW3fvh2bNm1CRkYGKioqsGbNGjz++OPo168fnnrqKa72PPjgg8jNzU3869KlC9d5MnAt9/m8AHLB3z71tT7SvSp569SU/OUp1tc3uqpceCNCtUqKnW4u+zzq1T5b7kQDbpKc2t2rKS0ahVL6a1LuzTp9gfPy4sPzvzP9LQzvPHZuBWkp+scrlXLHFwChL2U3rmQVsPZElmg3FP77W8u/R3lrODdEQpkrK2vcYy4jI8O2nPaY9hwWBw8eTHyeOnUq2rdvj3nz5qG8vBzFxcVYt24dRo4ciXg8jnvuuQdvv/22ScbJJ5+MJ554AkVFRaiqqsKBAwdQWlqKuXPnokePHqiursZNN92EN954w7E9d999N0pKShL/tm3bxvU7ZOBxRg3rg5kK7tteM0HcNeYEyyIy0X2/OrMH5vxqKB68WG9hCMNDShaelAE8Sgu136B2vCcf9ZcrHNvXUKe43M/+cDaOyUrFh7ed4ap9gLsHvjHNREP/ffDbxnbxyGcFUvzxgsb+4lU8q2vM88wDEhZI3iACv7EbM93aGq2iNMgssy647Qy8edNp+PLeUTg2OzXx98pquYCE7LQULLz9TN3f3NyuFw7oKH/yUT77w9kAzOMybCnBvCISypyX1GlmwLq6OsyZMwfnnnsuko5uYti7d2+888476NixfrAVFhaaZNxyyy349a9/jW7duiXSj2RkZODiiy/G0qVLkZ+fDwC44447HB9QqampyMnJ0f3zgj1llVyRPlFe7uNBxmeuQ67NW6lEmpMWSTEMzm+D1GT9rcijyCzdFE5fkFtfW+lYhjL3GI/1uLiiGm+vbLTWN6QlaWewMPDI+mqL3oWjU6t0AEBPAuucG8uc8V5teLnITW9Mp8Tlr2n63vgXrW8gj6zSyiNYssns8tKhFY1lJwzTk12qpO7H6INPZK5tO43i1ShHfJk1KzUFJ3dtjWOzU9G3Q+Mz5fLnljpmGrBzfelxrP73uVnFMfpjLlq/R+j8nLTkxH1o7J9mostFQ5nLzm6cJCsq7EO3tce05/DKHj58OIYMGWIqk5mZiZtuugkA8M033+DHH523ummgbdu2uPfeewHUJz1esWIF97le8u5K/TL0787pZVlOZrK02hPSDdlp3uW2lknP0tAn9194okEWH9pJ3W5i5un2ae+v46zRX77actC5EAe8Q4/Herxwnf7h0MLmycoj66EPzMt9VFBaEX56UoejMhv/lsQx4xvveW2faB/YPG1dvGGf6W9XDumK4ccf49wQA14+k/t3zsXVp+VLnfvpD+bfOOz4thic31r3N5lr++r1QzDihGOFzzPWpVX0jUP8fQd/xccX8vl8y6zi3Ht+H/Q4NhO3jtI/f+57SyzqVVu1sZubyy4QkVDmGqxiALBjxw7bctpj2nNYaP3s+vTpY1tOe2zLli225azQplLZtIku1YIbjErERJuJTGap68IBnfDcBHNSXRlG9m6H1YXnOheUhHd+Xba50brQMGlNGJqvWy6SSXPScB3MD1B/twjaz5GTT5ZjLawLlEEgMsmhrdKS1Mvy19RzoNz9FoQNbNx7KPE5v20G0lLqVwm09/qaHc4BVaadJOLWn3ksTcYyS+4eif+7qAApLZIw7Pi21idxygLkrS7FFfp+f+fm4Sj82Yk2pcWYdd2pmHXdkMRSviy3jeqFHsdm4YVrTtH9nWeeMRap1WhaxjFe66CF8XbxnlLxnG6TzzgOC28/yzRHuHmnadFcTHEGIqHM9enTJ7HsuWaNvcbecCwvLw9t2rThkt23b9/E0ijrJtHeAE1hDd7sV1D/f1dD9Jvssy3PbilSkH6dcknk2MHnEB7Hu99YB9ToLBW8dWpK2tXv9/LRxBeWeSZbxrIA0C6zGl9eGixzxiVzvoTHdPf/5JeWk8n67eyVic/an2G8152W5439ru1f3SEJpULbFtExbpx3O+amSd8nv3r5K7kTOWhopbHfRZdZ7ca1zOjLTLVf3XB6aeL1Bf7F084ZH3gRDmLQvWTwBX80NSKhzGVkZGDYsGEAgHnz5lmWicfjmD9/PgBg9OjR3LLT0tJwxhn1DsLffmsdHQPUp0cB6ieUBh84XpYsWZL43JDYOGjM0U71343LH7I+c1RK2I1n0ewNCwC/H9Pb9De+HFj671rFXmep4LybtF1vN2dx9bvh5AlDu+HOc08wRdHxwGOxkeXBi0/C3ef1xiPjTkr8TTaSemDXVrj9nF44vl2jvw6PAmZMLdPgMzewa2tDSbqExzxWPqolaXPdjZ+NY3zDj+zgMJMyp7PMOUcEs9Bed9G5xVjd678yJ48H+Prdyo+PiobfaFJIqKJZeQIgNJ9z01PQJrMxf6roKoDWJeGWkT1ty1FamV3ocuZlVqXMhYuJEycCABYtWoSlS5eajs+ZMyexhDlhwgQh2ddccw0A4NNPP7XMJ1dRUZFILXLqqafi2GMbLQ1OE8eBAwfwwAMPAAA6d+6MgQMHCrXNK8x+BQ1/j6F/50ZFzE2SxwEECT0blorcMqhba0vFkNcyp/+u+az5+4Pv8/lSaR9oiWVWU50ccgzf77+wH3494ngM7GJUUILj5K6t0CIphhvO7IGBXVsl/s7liG/RB63SU/CbkT0xYWg3dkEDRsUjWZOuY1C3xv6i3IosSOd8ncXYOMs7DHrzMqv1ywvfpvD2zujiljn9986tMywV/qAj8BvaaTfH8mLXP1wBEJoiP+vPdjly6i+trCHH8a14uUXUMtfUVs5kiJQyV1BQgHg8jnHjxiX2X22IQJ08eTKA+h0iRo4cqTu3sLAQsVgMsVgMRUVFJtlXXHEFTjml3i9h/PjxmD9/fiLK9bvvvsPPfvYz7Ny5E0lJSZg2bZru3JdffhkXX3wx5s6diz17Gp2sDx8+jLfffhtDhgxJKJnTp09PLBcHjZ1lDtDf3A+6cPYOQaBZgoab/XZDoAef75azXADYI7H/rJ1FlAfbJdoQ9bz+jdl5edmJScPNlm2eX2t8OCRr7kM7ZcUtopanhoAFCvS+bQaFSuBcADivoLFdomPLWJcfj9mgt8Jr6G+jsuvG2iQqh9UFxmvo5DOnHT9+BROI1nL3+fb+7s0l75x3YYLEJCcn491338WIESNQVFSEUaNGISMjA3V1daisrHe8HDhwIGbNmiUsOykpCe+88w5GjhyJb7/9FmPGjEF6ejpatmyJkpISAEBKSgqefPJJnH322bpza2tr8dZbb+Gtt94CUB/5mpaWhuLiYtTW1ufwSU1NxWOPPYbx48e76QJSTJOs5g9NOR3JzWcfj1OPa4tLn6m3wHKlyDBaKuDu4b+7pDFfVkPteblp6Nw6PZFLy00ABMXlW/HHc1BZU4uhD/7XlZw6nVLR+PnHUmfF1/g7rj/jOJze81jTsWKLnQGMGPsqOcn65YVv9wrHIia5PDxwEd1uBnoLmh6n9hubrU1BoZV7sMJ5Wc1smWv8Lj5MzQ23ulxBz14NP9HsM+dgEeW8cQ+WO493kT5wqlcfsCUg2A2C9Vw5pJtzoSZOOMxEnOTn52PVqlWYMmUK+vXrh1gshpSUFAwaNAjTp0/HkiVL0Lq13BJTXl4evv76a0yfPh2DBw9Gy5YtcfjwYeTn52PSpEn4+uuvE9Y/LSNGjMC0adNwwQUXoEePHkhJSUFJSQlycnIwePBg/P73v8e6desSqU3CAsuvwOlNjZsQKYUNLYnFYujUOj3xd5m3XDsfIh62HajQKTLaCZ7l12KF3XICRa+3zmyJDrnpzgUdsFv+2HeoCtsO2KcZAsxKtFXOLQB4jGNzcmNfaQN0tLXQbjwuJoxltH9npX0UvxXtchr7ymyZ41cqMlq2MBxr/Pzo/PWOCaKNNemtoIL9Y9FsY37GerlCYpnIuJkkJZQ5MYso77T7l482oKa2jlmGaZkzHHMQpbfM+WTlai7WNEoiY5lrIDs7G1OnTsXUqVO5zyksLLRM9mskNTUVt99+O26//XZu2d26dcM999zDXT4smJYANN+pJkNKVe6NXw0li5bS/nIuR3xTdJ/1Zx4Wf6/PSaX1Z9LW48o6Stjxc288DeOe+ly+KTaWOQD4YtN+096hdueaj7lTBB7SBGNoZfFZRPkeNG6jNbU8+8kmXDjAfitDI/9v/ACNXGM97HNZzTYeq43HkcToD6OC6kZxtmr38e2yMKpPe3y0rjH3J6WbwdP/24hfDOoseNbRZVbRfme8NfbpkIN1uxqDlCqO1CKHkfpEpzQzUs0AzmM+CMuc22o6tUrHjuL6VY7mohhGyjKnoIMVNi+qSJRWOpv93fKTfHeOt3Y+RFyO+Jx5t3gwp2rQLjtpJ2AOWWJVS6ENDpBB+5vELRX2vWAOGOH3+ykc2zeRLb7+XIeGSFK0v1yoPOtBKfo86tY20/ZcpwdyXGOpMRYVj0C1r0y0261kxWIxPDdRn9Ny8z6xfmfXKU5D/7KWmK1g9YcxeMvR75F5zD7AxQq9Zc6hYiLcKmDaJPjNRJdTylxzxbzlidaHSGya/bPNhschWmW1zbsltcwqqHRpYTmEiyqJdm0/UzKvmxcY9wvVIvpwO7Fjrn1Zh/7SWoiMy1l1opY5zofDuL+LWTRZDzA3DzfhZVaBUS06V2iXbb0KVBj7t0/JZMl0u93uIqKBJywc7x3GXGJaZnVU5nQ1OzeOk7YatxIjbhWw5qLAaVHKXHOF8bYuOsd+s73YdXM8x8Z3i+eeZ208bk5bwr9kARgsc4K+eHYP5evPOM7xXL/Q9p0x15ujhcjQBUN72O8Y4LxUZO94T6VEGymX3MTcsk4X55rznbHLM/vAQTEwoq36zF7HIqNlo2eP8IuQRpZxKz0tR2rplEQZJVq7F+74n3ThPs8caKX5bOhoZ8WQvw9EfOYol1nf/c1w3fd/Xk2zaxBgbHPz0OyUMtdMMUe4yVvm7PcX1ctZuI5/T1sn3CylaCekRev3ovII+6FrevhrP5usPOy6mXm3NH9/YtEPbEGA7Yxut1VV0NjtOmKLpkO0G7wDbD9GK/QWUPuHJqXPnCjMh46LBxLLGmyFtgdYe3xy1a0537hXqRsXBeMm72GiVUajxemkLo3WZBFrmvG76Hhn+fWKuijok5zTjX1jQJN29yEnBezLInbSZ57E7A1c/9Jy5P/hP3hl6VZ2wZATzllf4Tmsm0U0mNXuBr//wn6679e+KLZ1UeHYvrbHprwjthGzFuNv//BbtpJpnOvGnmSfd8txYmS0RXvuOyuttw9jyQoj2oc/K+jGCtZy30UD9cEAjsusjJcVvbO4GK0yUnTfWWPWCZbVw41FhGUNtkIXgWw8ZvjuaBHVyWXLcoJnGzy3PH7ZAN13GatOtmbrLFYAkBuc5hkR66qIVdv4Gx75xUmQxdy3/Nd34j/Z2w+yUvMYaXjeRd2Ap5S5Zop24D54sT6/ldttdho42bRVkhhXMHIHiaZPcbXwojn5uGMzdW/ewhYiDzPi+4FTKgojbh5mrP5ok9kS+W0b3+Sd/LxY/ewm1cxjl/bXfXeT78o4NrI0SoGbSx2LxXRKpqtoVhfLrKaiwgNe+9GbwX/hgE6Ye+Npie8yOd6N7gQNOPW76SVD55sbN5Rly2LdD+akwWxZSYx+v1RgGdmI+cVW+5ndWdU1DqlZxDLtWbYnaihlrpnCulfColSwxApnU2f8JqeJQzvJphhmd5b/lXVd+u86y0Xg6U6deXnpFqHyxx2rjaq0V2StcOqN5BbaXRzYZfWJgfXHerRrbKOozxxrJxVR2JY5dzeZ1ilfRKkwdkfbLL3TuvPytrVPKAAcJ7hUqm22lykytLnr3CqNuiVrx/x++u9a14LWGYZgASdljnG8+zGZuu9OL+9eRbOaU7fw1+Oc5sVaLqussswpIgnr4SBq9fLKwZQlV3SSZUWgOjria+s1lGVFulqhPT+/bYaQQsLCr6CHdzmWf7VM+3mj1VdcAefvEKeirFxyf9a4A4i6GJijwsXO159rL4vyHnO8dxiWynP6tNd9F8lRZrw3plwgtiStf9h79+QV8bcy8sxVg/R/0AVesc819uRlp3RNfD6z17GGsg7LrNZNAADce76+34NT5owvQppjTucKKMa8/e7XVmVeoZQ5hXASSSNevSV75A9ujgwT8CEywop0tUI7YRj3GXXjQzTK8JD1CtF+PyaLsROBo0WUvx6Rh5uRtlmp6Hx0V5D5a3c71sWKhqZUMmK2X8RhvZCwyhpJSorhxI45jWUdx7tGrqFsa0ZqCidZXlpR9L55YhWde2Ke7jsrmMSIdp5JiukDmWKxGE7R5Np06vc5y7fZtALIzUjBKd0bZYklDfZQiRbpd5dWfV3Zo79fWeYUkcQuWS0ATDwtX0yYR3cB5YNRO19lpek3PnFedrKWAwDDjz/Gth4rdG/9pnoEfRVdWBBkcfP2ykpUbQXLZ8hUVsQyZ6ElNuyJ+/ynm9mCDHiqVAim0GEhMrR0PoSOhfkPu3Ui0CsVLoVpGNClle671pOC8vI6yXJU/Fj+hwbeW7WLeVyfJJ4ty6+kwSLzmUgznN1oGuqMtjanlLlmCssh/Fdn6rONO8oiaA8P037ez7kQB6nJLXCVxlHdeZK1Vyr6Gx4EzsusjBnLha8i6+FGmZy12slbmoFoNCsYSnT93+yXTs1lGz+73Xq4uqYxlY2nlgpCZV1oyVo73i1Oi+kUAf5+dzsOjaOHipnXDDZIbpRNqTSK+Hk5R6u67cvGxjgFNWndbvwa7071OPelZnnbod7GZdZoo5S5ZoreMVl/M9tlMLfDr/362mY2LtmJvkUZN+Tu1pY/p5GTUqFNTyGy7MSohgu9MmQveebnRYKS7Vm5rRjlVTVS58YMs43Icp9T3zgd11lXXdiIKqprsGRTY44rL4e+Vrbbh6j2F/929kpmWZG+cu53b4J6KOecdM2uFEbZbq01QgmpnZz2RSymNm1oQGt9ZPlIV9XU6uYPN5dz095DzOMiyYmd0xrxo5ZZFZGGmTJAWJY/dwFridIJVj4kp/QDdQKTqNNxu7xyVt+d4LXcTLXZbk2W5VsOSp0nqpA4PQh1uzoIBUAINUPHiq3Ftm2gRp/fi06pcC7LX9jRMifZBiv0y32UvolGX07tMXeI5DAUUXzdKsk6yxxD1Pc/6hUwN/U6uTDo+92dZU6vGDuUFSwXVpQy10wR3cKIhV+WOTcO0Me3y7aX6+SYrFt2MneW9myh6D5DUTeXwc8ta2RrMgULOJSPO9jmdNfCofP0fo901iJvHfH9qceI09wgMnfolRmX/e6Rz5x5ZxI6JVqL49Kp0/mypjkL9POQvTCn6H3ZOi2Pg1+LFps7HMo2+MxFfKFVKXPNFF0uKbdveT49aXRv5i5l6ZPZOihzIpY5gWVWY78P1kSr8cBykE9p4Y9vi5vzxHyI2GWdLQZsPzBejE32y4fILbI/2eo8/f0g4jMn2Yij6KIdCR+8ppQwtl/EkVnus0NkhUAv1/w37W+uZSlzhg5wY5lzumYiqUmcEPGRbRjDyjKniCQi/khOaO+BRw3LmW/ddBqooH248TvI1glpc+zDrOXtKYJbQbF8qt75tX4T6zBgnsz5/V4ofeZcLVEJKqRUuPfdErdUUJTV3mduA0+8it42R1nTBUAIWTEl5TqWtZDMG81q7GdXypxTXwoFQAjMHU4vgnV8MsOOUuaaKbrlD8JJdmDXVrpjxmzjVPW4RTuBCVmILI7rfLcEolmN/Z6TlgJZjL9BG+ARFox945iaRMB6LLJXpVulQoubIbn/UBW3dKe+WrW92EVL9Dgt54k8KEWseCJ4mbyWMq+a/oVExIrJditw25c61xDGDUG5zOrUl5QpUISsxw2WOXdVBo5S5hSup1iWYzKpozKhA7TIMqv+PIdJVmSZlbtWG1mMZvuVVFWEtGR91CDvNjsAhWWOxq3A7Cwv39EzPtzArktAqfjls0uYx0V+slM0q4hSUafXZlyh8yH08NHrVV41ESum5fK2gCwneF9AKZdZHduk/ezSZ04L7wtHxA1zSplrrlD6zLF82UjfoG0+y6D9/W4tc3ZyrdBb5ujerk27KxA+7F6dPIRETlJSDDePOD7x3dGJ2WGJSvsnkahKyqUiN+O79PARdl02n60or65lHhex5NRocgk6+yqyj4tEczqhW/706cnlem9WkRUQj5ZkreBVjM3LrC4rZqCP9Hco7DRnOwSt6cs2iIy2NqeUuWYK5QsWy4IgYvX68Nsfmcc92yPQ4SbWPvytFAH9Wy4b2khK+/6g7J+WyfbLUKJkpLZwLnQUpwlZ9ycBpcLNcrYRN8twTlY92qTB/GWvfuHLxOe83DTTcaHktrrzXL686BzkPbTMJXkzz4j4dVqer3UVENCqKAN+WraQVxkcrW0CfS30IugkTFnmFFGGNMqMoVSIOBC/6JDcVi/bR4dw3XlsWSJv1JQKNeWG70ZLnFeOwW4toiJWH60s4564IoiFcIjJMh+ns0WLDLUdxYcTn/959WDTcacdInRlSeeZxs/GeeWNXw11J1xbj65OurHvbD125xfqBcaf369TjnVBHlmanj2hvTlVlEhfkwZAHC3gV4otr1DKXDOFatkJYC/3iVguhPIQuUQk79g324o1Zc3HxZyc+f2NdpdUMo+zfEzc9NXQHm1t67H6LoK2/xyVOQdZIhGqDVbf03seg8zUZGZZFixneSsOM5Y/RSwVlFGVIvSyeOjK55lzi/1L408E0vpU17C3pBOJZt1Txr5HxazH7OPSZfmLWtDYARcP7ORKudWeetMI85aRQpY5AdMcvwtGtLU5pcw1U+oIJ1m/zNP6bXbcyRIxw9/62kpuWSITttOEfO2LXzKP65ed9NAmVTVpiiSIKAIXnNTRfFzAQvSf1fUbj6/dWcrfQA6cXlb+9t/vbY85W+b463HC+OLgxsoj9PKiq1O6SrNcF7Jmfr6ZeZx1Xxm5edYK5nHWvs7mso38rL/VeLeW68Sp3cXyV2rxyufZCqEXf4fjIuNObeeliDaEyx96x2R5y5xjWYFJ1gl9AAj/ee6zuPOXdVY8tJYKo8WIbmaitPrJLklPucCcg0/IL+YoB8qrOUvS8N3uMttjzj5zcr5bs683B6wY+9rNPS+yNRplahKqIW3coopVj9M1WlZ0gHlci8jLy4MXFzDPF7l+407ubPqb7mcxfqL2EOVLv1W/yl7eVyafavqbTCR8xHU5pcw1V0TeGJ1gZe4WsRCJLLM6lV303R7mcdm3XCffLSeTvtbK51UQCiA2MW07UME8TrulkeazQ1ntXo7GzdBNsgg7c9F6+7Fj9gl1UMgoGsRRj5a8HHPQghE3vaW3erAlyb40WUGlWIjMM6RJgznLpqUkWboCOKUuscP4gi2CyLV2Qr9Nmvm4SDSrVlbH3HRm2T+/x96bujE1SbTVOaXMNVMoHZOhm/zkLUTOZnhtWXbpa2aylyghbZmz+JvDcS1afx3Xvoo6nyr5AIgH3l8nXa8bnB4Oryzdyn0+pWJ8zQsOY0eDmwg9oXNdvhQZ+9rVg1nC6kGBUOoKV/Vov9EFnvC22U5x9+rlhQWlz6N+OFtY5kTGuOazVX/JBLipAAhFJCHNgs/wZROzzHmz7GSF9udvO8i2TOnPY2tz/kyx9azdUZL4bApSEOigI7XsVpNa5jSf3Y5Br/yxWJj7WfQM7ZHGY3+/4mTzcUm3AuuHm+G7gDyTLJ1cB7cDgXyWlUfYufK0P8sxWbGLwUVpoRFZZm54ubOrXZeaxKfxLnpf1TL3BtN8tHzhaPz8jcOOJk5pe4ytYI095TOniDTaieXYrFRXsliBCZSWOcqbTWsVu/etNQLnmf8muxTh5u1624EK7NREu7rpG1HrkjeqnTj6IB5/nm7Cy6ycljmrl54Yw+Itivnh5kKWiN+jwIvO7XO+EWgD+/jsL7fZHhPa8N2F5RUA2mU3zq28fWU3Z8YZ38ThG0+iL0wvL9nCqNFhmVWjjVRU1+K73SyfYfaL/TGGZxqr7Yl+j7jXnFLmminawX3xyZ1cyaJ66Did6lU0q1tkl/vctGG9wbHeTb87WU9lZT9lYW2iXN6ndRWQw80wjDG+AfLjnaesG+U3bvPZqR7HiONVu5jHRfr6vVU77eU4Kmj8y7lO98ZFAxvnVkpHfL/Gu2g976zcYXvMKU9oanILnRKmTQnFkmWl/J5f0EH3neXSkhij0dbllDLXXGkY2mNOzEOyi6zegPxykFmOo21O88ndnSe7TOHWZ87uPFFoUwbIW5esSGlRf8KArq1Mx2SduK3QL9n6pc2J+YSyjjpa5nQO4/wXgWuZ1ZVlrvGzU7+/uqzRQubWevriF41WH2cHeblj5uPsipyuSoukGM4vyAMAvKAJ6LHii437AQBlVTWWx7UvjR+tYwd4USF6v7ZgvBnq/dysy1yrSejNurec3ElbJMXQO68xRyKr7fGmocspZa654pWfgCvLnNNxwrbKPlgmDu1mliXgF2N3niim5T4X3rsCGWGOlmefwFq2oLXM0SmGvJjdCMTK644xUssA+t8ncnWtfYjoekjE2rZsc2PqjlF92kvXyV5yM8N+QeEbv1z1cFyYH/bUp0LZtK+cWe6et1Zz1/vwvO+4y7pBNOiCd59XuzlExjDA88zhWmaNuNOcUuaaKQ0DmNK5HfDWiTSJygQISD/9b9JsFN8oSnKZ1cUD1jhpurOIOh03WqPY5VnRYfolOncKRliXWR/4eYHmON/DzamvqmrZuxawIpuB4CxzWs46oZ10neUGa5Wre8fpZtGIrnLYLYJnhaC8ih3YwQvlGOd99xNNLs/98mJbRiuLVzF0bhd7mbUeFc2qiCRxQtsy1UNVxELkttmyy3JWywgZLRtzQk15dy23LFeTs6CFiC1KbJnVqao6zrHl2jLH+KbloQ+8s2JYPXDaZrXUHGeda/25AW1k4H9W7UJZ5RF7WTafG2hY+m7Alc9cIEq02ABnKxX8LP5+H0oq7Pvdz7U5Susq73ux6PVlGQd0Lxw2mgfvPCaSc9SJxCpVxBdalTLXTBFxtpWRK4NzlJlca/984Ymmv1E+hJ6f+JPE50827OU+j/I56GoicjhVtN+Z0WECCZadqNPJsi/39P82uqpHC0+T9dYFvpJOS9JAo0+VpSSHp/OE0/KZsoNi6s/M96YVxneoPnnsDd95l8za55gj+XPS9Ql7P97ASCLNVQsNpEnGZVpuU/+IE45NfLZT0urrdK6fx3rHOscOvmVWzgpDilLmmil1iQHsfgTP/3a3Rq78jMOaCAA+nwsrftbfHK1LmadpYNfWcie66Cvjr/cyNYfZZ47zPI8nx2AsRM4VaZVffh8ii5oMP4rXIdxK+c5JS9FZ59x0l7ZdLD+w3SXsTegB4IKTOjiWAfS//eYRxzv6iDI95jQH/zTWrEzGYjHcee4Jie+81iav4b1mXL5tnO3mua9uGdkz8Zn54sdhDhRdPq2v07kMTzRrxHU5pcw1VxpueLd+At/uLNXd8KnJ8kNK5G1RqNkeO4TzYpxkjzs2S1oW6d6rDsdFLHNOTvuykb9WnNajrUauP9fT+BJg9eDUdRe34msumGbYwozfUmH3d40y56LztWfe8uoK23IX/G2xoyzecawt5XqPVx7fLU6lgs/5Pm752Su4rMeaZjMjPTm2feSdH5xeOOrbFXMswzrHDp5o1qhrc0qZa+a4Hb9F+xvfzHu1z0J2WgpJY34/prfpsM7iIdBwa6uHSMNoMNb5s/4dpWWZLHOufBUbpd14Vg+L4/yytO2wmowpE/1qNyMPKu+WVbV6y5w92hcpq5eqnLQUdD8ms1EWt6XCzuzR+NGdZY6v3L5D1Y5luBVUTUEeq7obX0XAqPDxWURfuc684bsRqmTNzHIcZWKc2pyoYshrxbR/4bAuz4LHIMHcASIhJ9ranFLmmiki4dirt5fYHtOePfYkeeXEKGtwvnnpUjaYNSy3qHY6icXcpROhRNuKU7u3MR83NJM1wa/YdtD2PCPT52/gaJ09rTJaJibyt1bYJyulhOuByukOwKMwaBV+Vn8ax5YTrpQKjxzxmeV0VkWe8rzHrEs6KdqJszU/oGf7bPuCR/FDieZLIaIpz2gVjyU9SWdNY9XpfLG5l381LeORa/cCsHlfeSJ1TDhmY3mUMtdMSewDyDGCr3x+qe0xfYSSu9vBae9V2RcnqzeuXwzqLCfMBbJ5w6wwKVhEsqyUD+PfWHWNe+qLxvMcnPp3FB/mbqMdDZP0s59sciVn2PFtnQuB0+ph89lUzsFCFLf5u3P9PNqcuNwG7hh9gnMhTnhdK/SGJO+VSd5lVh5Lkvb+8SO5tahljtUknSWdQzCvZc5OlMy8GLPRYnTttanwt7Mb3QRUnjlFJGl0E3AewCWHGaH5hO8z+onRLFe/zMpfr1XRfp1yuc6l9HHRW09cKr6GfnfTTr0vi/m4UTZ3VRGaGx/9RX+ucqIPNNeKAOdyn+4cu7QPms9uFKJLftJF+lwjdm01ldMqAlxLfyylwtkvK8atkjfiNnmt47m85QQtlzyRnvX1WxeUUXzt5qsY5xyvPZ3n6tgp0fs1rgAR1+WUMtdcoQrHlok+skO3F6VVXTafnXCTtuPvH9OltfDyrTzZKRSYgW4C5UiRwYtTItwwwdqGSIvxgWbVN7zuAE79jnhcLpjCtj6d6FDAe2eKBm/wy7X5O+cyq2id7vL78frM8URc85YXjN52a5mTcKXhUqIJ6wsrSplrplCFY+ufNZTLrFbLfTYVO8qVb9Oj89fLn2xA9G2ShfE35eWmyctiyLWC96FivUUVZ6N8hvt6mNpv/kEyFmQ7hUFmyLt5uPkNdzSrsGWOt367v4tfQ699FXkRtVxyW+ZsyvEqvqKrEaxxLO4jyvECEHFtTilzzRSq7bx4nV95cH5wNf71za/9cXgPK9r+ueVs8xZjRiqPMLYUcng75YngdBCrOTcsaoQe3geNqM8cu052/UafOfayk8Yfk1Ah9xqZvnLbctHVBLsitXVxlGm2GfPa54ryiumX3O35XJOo2q6c9hkwf+2PfA2wEaZ74WV0p3b82j3DtHONXQAE7/0VBZQy10xJbGHi4zJrhiFvlllY40frG1R/RzZEITkRlnuU9Pkp+HB75n98AQLWSoWcz5xVv58sm2DZY7ij6Ay/vU2meQcBJ+W48ZjW+tP492OObgd2du92UmOGJ7t+OFQ5uX7nc1dgLPfp+t1GEeBQjo0R1F5b5s49MY+rnGj3sMo/9uEGx3LGn712Z4l1OY6lXe6lZI5iWgXO1t+PI+dgVFDKXDPFyWfu3zcP55LDM4E1ZAjnDTqwk2u8gQ9WOOexAtwv/1KhC6d3bcXkWyZpYMOPZVyyePqd17pm1e+j+7bnOtdveC3U2t/epU062mS2NJXRyWIuO2nPafz8/i2n4/+NH4Cbzjpev5zEbJe1XH0ZschEP+C9N0V3+2A64nNcHqd8iQCweZ/+ZZLnl7jxm/3dOb24yvHcn/p+5w6tsJZl6B+7/II8c5ZWAZOx2upl6bQ5S3R+2mF565dEKXPNFI1aYXlcu2eh29xBvfPq8y8t23wAu0rs01GIKl1ub3Ytr325VahuGfQ+c279C102xkaWsz3U6g/Ochv/Fs4Jk7dV2ms49DjrdCZ6dwGWhcj6W7ucNFw0sBNaJidxLzvpJPFYiEJim+O2zAm2l20R1dbvvERnJ8x4bd3uROBEWorDykZDHVwR12LlWRh/tl0v8Pg98vrCacvZvojprLl2bVKWucAoKytDYWEhCgoKkJWVhdzcXAwePBgzZsxAdTWfpYbF7t278cc//hGDBg1CmzZtkJ6ejm7dumHMmDF46KGHcOSIfZqOjRs34oYbbkD37t2RlpaGdu3a4dxzz8XcuXNdt4uahrcWW0WN942F4wbVnj1jgX2iWH2iTmsfIp1c3ocbR5nfz13NJ8wFPHPm1YYN0e3Qv1e7c+51erh1aZ2u+87tMxeh2ZHXMsdjWdHmW3SrgIkmRwUYPkTapodDl+NGb5mzbrz2BZQFj2VOxkJkN5f6vp0XRxkZH0SepMHMOjnrET3D1rqq+2y3zKr5HKH5yopIKXNbtmzBSSedhKlTp2LNmjWIx+OoqqrC8uXLcccdd2DIkCE4ePCgtPzXXnsNJ5xwAv7v//4PX3/9NcrLy5GamoqtW7di/vz5uPvuu1Febr2x9Pvvv4+TTjoJzz77LIqKipCamor9+/djwYIF+MUvfoFJkyaFxukYcF5m5d2SiMdYr62jjrEXj5P/nbn73D3c/IZHEfj1COdgBiPu8241frZ6ICW3SMKFAxp3IuD2mYvSuy63hUhM1He7S+3LCVpH2A7h1vXbluco4wdyPnPWZf4yfoCwXB7F134fUcN3O19FbeQoX7NcwZe6Rbvk6a5Vxl9t1/cbfmxclrarUR/YYF8nTwCEdr61fezoFPsIzVcWREaZq62txdixY1FUVIQOHTrgww8/RHl5OSoqKjB79mxkZ2djxYoVuOKKK6Tkz5kzB5dffjlKS0sxfvx4rFixAlVVVSguLkZZWRkWL16M2267DSkp5r1HN2/ejEsvvRQVFRUYNmwY1q9fj5KSEpSUlGDKlCkAgBdeeAGPPvqoqz6gpGFs2ztLaz4z/U+c/SB4w/ydfLfMcp3LiJTzGl3/2C3dSCgVbiMsefq9he6BxOkzF5J+54E7EpvDd0v7u9fsKMX+Q1U2dTq/CvEoaf/bsNdQP8dyX0i0OW6fOa2/H5czO+vlxXm8y/i3hiY1CUcZKcuczd95XpYrj9Ri7tfbG2VxpQrhtMzZWkS1n5VlLjTMnDkTq1fXL4XNnTsXo0aNAgAkJSVh/PjxeOaZZwAAH3zwARYuXCgke9euXbjhhhtQV1eH2267DbNnz8aAAQMSx7OysjB8+HA89thjyMzMNJ0/ZcoUlJeXIy8vD++99x569eqVOG/q1Km4/vrrAQDTpk1zZTmkpGFw2+a34sxDxLPcx68Yas+xWmbVy+c274flLuWxvvCK4lAqePf11B+j66uwWER5kAmAsMM43rYftPET5Xn4c7Tpf+v1ypztcp/uczi0OUrLHG9kfczms119PC+8TnU2yvVhmVXQUk/vM2fuiLLKGtPfrODef1ZXv7Nljs/QwFd3WImMMvfiiy8CAEaMGIGhQ4eajl922WXo3r07AOCll14Skv3Xv/4VBw8eROfOnfHQQw8JnVteXp7wibvxxhvRqlUrU5m7774bAFBaWoq3335bSL5XNC6z8k1UdvAsFfE6mTot95nKOxdxDeUNzpeZnc5SMVarzDFkiaSXAeyv8+FqfS47O1H6MRNdpcJWFqdsbboYW7kcpjnTw5TDIdyuvu0HK2wa4g28txfPg5n75YFDm+Mal4b6eKyMdmJ3EuxT3FiJcxE5nzm7aFb2d6u/2dWpvc6s3uS5PNoyHxus11Z1qGVWH6ioqMBnn30GADjvvPMsy8RiMYwZMwYAsGDBAiH5DcrflVdeiZYtzakGWHz66ac4fPgws235+fno06ePVNu8wkmx4H3AJ+ne8NyastlvSUbxfrxJUVbBs2TG/Zs41ln1/c5pxRSsWsvzn+pz2YVl2YkHbiVaqxC5kMWrNOlX5ulGo13bf/3KCrI6eJBL1uysVPDrddYFefYkZdVvh52kW19byVUHD6JWV/5twqzhuYbGe4KnTlYJrvM1Zf749hrLMjJjJqxEQplbt24d6urqAAD9+vWzLddwbPfu3Thw4ACX7M2bN2Pnzp0AgDPPPBMrVqzA+PHjkZeXh9TUVHTp0gWXXXYZvvjiC8vz16xpHCQnnniiY9vWrl3L1S6vcQqAkHn48233Yi9Xb42zWGY1KnM+vElRLtHqlwZs6uP2IbL+rEW7XStbauNRvs3CrWvcXVqpl+pxqoYg4Fu6MXy36P3KI3W671yGOdsxI47dNdzImYibCkq3Al4rS22ts5O97v7iqK9elvy9s2mvdWCdDKKpSdzKNVmiOcrY1qGrz/6HVNbU2R6zkmWHqJ92mImEMtegbAFAp06dbMtpj2nPYbFhQ2OqjGXLluHUU0/F66+/jpKSEqSnp2P79u147bXXMGzYMDz44IO2bWvdujUyMjIc2+bUrqqqKpSWlur+eUGD3wlPpBZrYuRRKrh9WRxuJuNe8lG7+fiWbnhlOcvVXTfOfndjXZAhLMusvJa56//1lWMZc/4xizLGZSfBZSMn+ZbncyQN9vuW4r+HBZVoG7k1tXV47tPNjrXpIyE5LXMcZaa86/3LvKgS48ctyDveeSzfu0sqUc2hzPFcN15DQxSIhDJXVtaYvZ6lMGmPac9hoQ1ImDp1Ktq3b4958+ahvLwcxcXFWLduHUaOHIl4PI577rnH5PPWUA+rXdrjTu168MEHkZubm/jXpUsXrt8hSsPEbrvcZ1HWUo7OMdlu+SNm+dlcJ/tm6tUu2yCXWZwEyioYWVkS8L4xcz1gOBVyYb8Rwsk/HKoc7VjiisQ2fLdTavUKWFh6iw7uZVaOeUbnpmFTYleJ3nrMYxHleUm1+t6Atr3/WbXLRhodPONElzSY8y607SvjHzhcZOxlOY/3N77aZnM2u04noq3K+ajMFRcXo3v37ujRo4dfVXLRsHzb8HnOnDk499xzkXTUDNS7d2+888476Nix3pm8sLDQ0/bcfffdibQmJSUl2LaNb+AKQ7TMyrd1jPVnc516yUaSkmKYfHp3jaxo3X5clhEJHyIeh3DuKGKeZSeO1BAseJbm/Ubmrdy2H2SWsOz+zqVUSLTd436vPFLrXEiAb3c1rlDY+yo2fpZREnV/t/1ij/0+rzzn8tXBw4+l1qlw9PXRWeaMuUOtMxHwwbWcrmn79Ev627dLVJmL1uPEhG/KXG1tLbZs2YKioiLhc7OzGy0yFRX2jsPaY9pzeGUPHz4cQ4YMMZXJzMzETTfdBAD45ptv8OOPP5rOZ7VLe9ypXampqcjJydH984KGcc4TzcpcZhW8+VjwPOT9fviT3uB0q6z6rPIcsphKtKDfCOU1cLNXpQyD81tb/p3yMvMts9Ip7VJ+ZzxRMy6YPn89jaCjTHmncXnSbdQ8FxzLrDI58vzgoic/EyrPewuexLm3tnXwmr6SvNw0Rzn2SjvvdeZZZuWdJcNPJJZZG6xiALBjxw7bctpj2nNYaP3sGiJOrdAe27Jli6megwcPMhW6hrbxtstrGt6m7C1znHJ0DuF2k14jLAuI9saye6sSfdtyi1cRhDwTFa8sO2R8Fd2kV4jCm+3frxhk+XeptttadcSs1QCvDxHd4PfaZ+6/3+0hkmTGTT5Lc4oMa1naecbt+wahqywX1bXO/mT61CR8P/Dms613p+F5ITOWOLmr9UuVfusza1m885pov0dh/mIRCWWuT58+iWVPbfSokYZjeXl5aNOmDZfsvn37okWL+g2MWW/L2kGmLaeNrmVFqja0jRXx6icJy5zNNCKjVLgNgOCrL2752TMIb/A4R2fJpCbhWmbl9JnzG78trcdmW+/fKbVUafd3wwGrvudVKlhyNRUIQ7lk6zduXiZMv49DIef1mbND9MXLD2QCINJSWlj+3Tze2WVG9WlnWwfPywuvAiYaABH+kc8mWaTw2WefLV0Ra4N6JzIyMjBs2DAsXrwY8+bNw5133mkqE4/HMX/+fADA6NGjuWWnpaXhjDPOwKJFi/Dtt9/allu3bh2A+skgPz8/8ffhw4cjPT0dhw8fxrx58zB48GDTuVu2bEmcL9I2L3FKTcIvyCzTCPc+r4Jvi2Hxt+JF+5vcLi/ybW+k+cy0zGkmdp5+t5PjeKaVrIhdRCJMCh6HUuF+uU/zmTMBrDQePhl5orftqjdZRG3raPzs+l4N4RCXSRpsB9+SqbPFzdgWt6mu/nBeb/x+7mpmu5pSNKuQMvfxxx8jFosFElU1ceJELF68GIsWLcLSpUtx6qmn6o7PmTMHmzbVJy2dMGGCkOxrrrkGixYtwqeffoovvvjCtMNERUUFnnrqKQDAqaeeimOPPTZxLDMzE+PGjcPLL7+Mp556Crfccgtyc/W+BQ8//DCAen+5iy66SKhtXuEYzSqzzMqlVLAsRM5vi777zBHKonSE5vFV1EWzkloY3V2EWCyWaHQYH3TUcKUmsTlXJqqShyh3O992Xja+wNzzWuNn90vS4ettXdtdNi8tpQUuHNAR76ysT7tl2fcc4xjQ9/XanaU4r18eklvoFxB5la7xg7s6K3NNKM+ckDLXokUL1NXV4dxzz0VeXp5QRVVVVZg9e7bQOVomTpyIxx9/HKtXr8a4cePw4osvYuTIkairq8PcuXMxefJkAPW7MIwcOVJ3bmFhIaZOnQqgPkmw1rIGAFdccQWeeOIJLFu2DOPHj8c//vEPnHPOOUhKSsJ3332Hm2++GTt37kRSUhKmTZtmatv999+Pt956C7t27cLYsWPx/PPPo2fPnigvL8eMGTPw9NNPAwDuu+8+tG5t7SvgNw03jW2eOd63fUKlQve2aKvM8b3hUUF5g+sVX2uM12PF1oMYaOFfwpfmhM+5V7jfbeXQLVUGzZdFBzA4n+2qQflSm5ps7fES59HmOOHyR3JXBbkcK7jcOezKGI7YR7PyOJDwwXOv+h2Zn6QJ/aWwjmensVUJvXJsX5+2LU//byM2/FiGf16tX+3iTXXFg6i/cJgRUuZ69+6Nb7/9FpdccgkmTZokVNH+/ftdKXPJycl49913MWLECBQVFWHUqFHIyMhAXV0dKivrcwcNHDgQs2bNEpadlJSEd955ByNHjsS3336LMWPGID09HS1btkRJSQkAICUlBU8++aTlUnP37t3x+uuv45JLLsHixYvRq1cv5Obm4tChQ6itrQ/Rv/rqqy2Xh4Oi4YbichRmOZnafNbJ0i1/uPPd0tfnvSpAGgDBMaEZa3tn5U5LZU7/YHa5zCr4G6MczcrL3K+2Oypzdph8iDi6d1A3O4dwzWcOy/dxx2Y6V3ZUmqUsTWN/O7Inpyx/4UqSzSvLfn1bU591EX4revjGuLbp1M2zNsw5vwxatcUqkIbz0cRFsw2AGDSoPhLsq6+cs6B7QX5+PlatWoUpU6agX79+iMViSElJwaBBgzB9+nQsWbJE2vKVl5eHr7/+GtOnT8fgwYPRsmVLHD58GPn5+Zg0aRK+/vrrhPXPivPPPx+rVq3C5MmTkZ+fj8OHD6NVq1Y455xz8MYbb+CFF14IlXNxwz1j1yJeU/bCdY1pWvh8HLjE2k6yPJZAnuzgYcU4RvjyvjnLYnX77C+3NsqyvYa66Z8hTYzvdvEl9+ZhT1mlcyFOSJMIW+Xd0nThRQM62ucoszlHJ19z6s0jrCMOuWVpPv/0pA62srTsKaXrdx64lpsl3BW06HeA4JNlWwdHGd8fDYQ+czzwKoyifeW238L0THaLkGXu5JNPxksvvYQVK1Z41R5HsrOzMXXq1MSyKQ+FhYVcyX5TU1Nx++234/bbb5dqW48ePfDss89Knes3jQEQdsusfMz+sjGpsVtHfO3ZdlGHPNvsvPDZZvtKBKH1NdN8tqvP9N3mIc+1zKqRY/M7th2oQEW1c4JXr5a3L33mCxQ99FMSWb95ZQVeu2Goc0EunC+8rZ+b4YiTpYIXruU67pclDll8ovCrl7/CmzcNY5YZ2ds+glEUnuAN2/uGs9+5LKKcnW1Mqmspi0uSOKf3PMamPq1/Mq06Z/VbeF4knA+a5btdOaFUDINGWJkDgFWrViEejwtptWlpaZgwYUKT0oSjTIMi5DbPnA6b+1Drn8FO/1L/f//OuWiXLZ9Ucv2PdNYeSvh2gNB/t7dkismym/RKDuujzF1FswZ8ay8rOhBsA47C82zkdYXjW5rnc2PgS/Bt/ZnF11uLLeToT/7LZQP4hHFgb1XkUMAlLEQ851w1pBufYJ954vKTLf+u387LPU59FOd4Cedti/55wnECA+3pUY9mFVpmHT58OOrq6nDo0CFhpSwzMxMzZ87ECy+8IHSewhsal1ntor4a/15dU4cD5dWOMu1TJzTy7CebbB9KDYrEsOOt3ybry2g+u5jUeaG8vf/1xRbn+jiXWe97uzHfor0CJj7piSoiXvGlhGJGea14+stNPzwy/zsuOaL5zniv80tfFHGUouvRnLQUMln2KZAaP/O4J1h9t6qDx6+zgLE7At/SoTeKRG66db9rq1uxtRjbDrB3MBLB0hLNq0RzBYtYf5ZBH0zhUljARCJpsIIe0Txzzy3exC3TiLGOrTYTB0+b9HX4EAChacwvBnV2Jeu5T8WXf+0m+X2HGpVrrocbZ308PepH4MnEfy4TPofygSgajMP6u9X1eX/1bkc5xnPdKtH/mPCTxOdZS7falGr85bz+rWwp9PDsiWtXv/FF0unFkhfm0Atf/IPphfehed/ZlBTH2UrHOMbTWR4pYM0qmlXRdLj3p31w++heSLfJ6m2Ex1/HvojYTcJeKhJfqnSDVtRt5/SiEyxRvx08ARDf7bZeejblO3OhMfBOhjyljnBsSeQlpL6SDg8o/j7n8Um1b/g5fds71sCTqy1o7LvL+SFvPJfHMmdnteLtqzBGbBuby+PXx4uVJMo+0L9kuPSZ034O53DnRlnmmilZqck4JisVmal0+jyvcmXv1M/24zPWwRtEQIUbS4U0Lpb7tKcu3XwAxRXmpXKpdA5+RPdJtIt0mZVDWpfW6ZZ/zzLcU46WCtYxnqhKzqhlHiiXsLyiS5sMy79TPow7tmr02Z2+YINj+YgZ5tAhVz923fadk/sLT0CJ3blGKBP98lhzo4JS5hRk8PjMsc93Ls+7LQwZHEEE3lYvb5szTnS7LVJI8O5EwFNGK+uU7vY52ngsUTKTNKlFlkPWr23SgBzfLkv33fHnUvoTUT7cGLIeurjA03awuHWUc/477ihwmz6deFq+UB38riE2sjTn33N+b+cTXHLJTzqjq0Ypdju3OQXq8AaUiEZsu30G6K9htNU53/ZmbSAWi2HhwoWu5Sj8xc04N95vdrL+tWSLY2Xam/etFdstlQavllmDuNfdOOIbJ2iuDd+5AiCcC/3iZHv/Qj6HcI5CxnN8VrZZVu2LBnTE20e3N3JcZmVZKjjK6a1p8n1QU1uHH0uruGT9JL+1dD0syqtqHFcLsjmCKV5bvg0P/+Ik09+NfWjXp6nJzu4n/9D4EbPGq+gS4/Djj3UuBOCHPYdMLw68pLRIwtQLT8Q1L3xZ/wdStwKLv3FHszr3lX6FxLU21/gx2roc3d6sDVqtfQ6gmHA6E0V4cHPVeOay73aXctWlFfXqsm148GLzhE0Jb+JdUa4d3p2vfo4yvM8Kq1vP+MDOb2u9hMW3NGr3xSBLcP5NS+FcQPBIiZdB5CcyHcI5AiBkknJb8e43O23lWtQqXxGDJxf9gLvG0Fim1uwoQT9DlKmxD3vn5UjJPlKrj/BnKb7Xnd4dTy7ayJQnE5F85XNLseSekc4F7eq0+ewWy2VWh+MNjDihHZ75HzvYTtvXbl39ouBWwIuQMnfGGWfYKmOff/45ampqcOaZZ5I0TBE97N+4nO+48qqaxGe3SxZa7vtpH7ETDMhklefhD+fxPbDcWUT1neUkashxbdA2yzpZsxYeS4N7361GCW85JKSlqrNwbF8U/vvbelmEL51U0X1c/e6i2TzphyjqYbG7RH43CWP3aOeURBnN506t0tGxlbXfoxMi1rbbRvVyVOa08PatlduECNox7nWONd68ikOOa+soi3KZVS832uqcsGXOjg4dOmDPnj1YtGiR2zYpQgjPOE9OsragGN+eLC1EOgsYY5lV0KzeLsc5+TAvvBPeB6t34bwC9lZIKS34rE1ciVA5tj4D7Pq98XOPY/mWbG577Rv8fKB5GZUyElJrYTIGFNjhdi6mHCsi8DqE/3b2Slw4oJOpTMwj+0ISw8zndC8Ek+bBeW7Qrhz1ai+3RAmI/b5kznu9Ab+S1zq5kPCko2pE48tsvdDKLSkpxra4afuHMko22qqcCoBQcMIzed00oofl381KhYXvlu64fR3C0U7OxR1kWX9m8bvXv3FZq6ZOFz5zFs4QzL9QxpO4jfzlTeZ5/RnHuatIW6eufjKxngfqeLUlEUuUZw8+N5ZojnkmbvNZuC7iGFXKOYu7ToeK/u8/6+QEW3RNHVXHQ99uUmUu4tqcUuYUXPAM9GNsluh4HOa9ehulDLkPwgzvzlfRsMzqYJlzHRnmVTJPhrBfntK1sZzbnFNapYgyus8xzxzjmGC9lCOUdQ2drq/s9ffaokeVhJlaQdcmUvdrmvFKgbQOgNAed9d5lP2zdHPjTjNRX2ZVypzCc0zRrBZleN+2RNNaUD6UeSWRzgkcwnp3sHbi5ul39hmN9LWpww5KxYpl5ePZwkmgVkJZjbjLM+csX98HdA1nXUOvlC7vn6dxi08UUuWlLd203/AXn5ZZPRo31gEQ/CmlnNqiD4CQ7/cVWw8a6pUWFQqUMqewZcyJeYnP7ixEhu8WZbQ3qNs8RDq5pBYi+2OPazYSJ9XlOMpMGNrN8u8881wdp6XimmHdHWVRLlPql7f5lAq3/U6ZFFpkVYl9nXheXmj6gHdfYOOxsDwEeVIgUVnUKC1z63/U787in2XO+rMMTpY30b1umXUR5Rr9fs8h3feQDGNplDKnsOWsEzT5jlzMMDz7IeqX+/jybtlBldW7vKoGJYePaGTZS9OmOCC1jnCIsg+m4HEIt/5spGWyv1MF75ItpXXBSSn634a9UnKdrcl8ARBcdYkVZ8JtiSas0w0mnzmLMolcluCz8tvWZcxX56Ljje1043Jit/WYU8WeW+YE+sepJVRL5cZ61DKroslCNbaN95vVDahfZmXIErx73fyGF78o0sti3C1ebQtDuZxl7RDujXe+Wx9Imf5021NO50/85zJuWbo9hCXbAwDjB3dxcbYYpt/vkxLNWSUJL32xxbkQB6Q+c0aLqAtRd7+5mr9ar9wKLP9Gt7ytfT64sfKZLNHSksKBUuYUtlAtYfHlJdMss3JmxGdJs/4shjFPFUsS5UTw5OUnJz67WfrjsVRQOiYXV2ismITLrKzO1aXPcFunR0uHbvLMDeza2lG+1nrsxtpkhKWQO6YmEehA7Xj3yy3CLV4GKLtp90GL/Zd56iENgLAYg1U1dZrjdPI91Kkjh1CeuZdeesn22OHDhwEA//rXvxwnlAkTJohUqwgKh4cb74PD5DPnwjLHc/dSPZRN22ExhFFOBOktG9+xWLm+nDD2o2OUmYuZsbqmDq8t35b4zrIotsls6ZigljfvIKkVlNDaJNKVbh5INbV1ePaTxnxgbmQZfzLz5YVQEUjVLOG7sUSntDAtnDHLu4tm9S6/mV85+mgVOM1ni+MX//1z5nGhunT1urDMmb5HW5sTUuauvvpqx0nu6quvZh6PxWJKmYsIIr4LzHKm704+cyxZgsusQqXdyCK0EHk0qVhvgE3zlltssAiwpomXrz0V5/91MVOe9nSWPkupVHiX68spNYl8z1ccqZU+1wnmywvhEh3Vi1D3YzKFyruxRPO4jvBiUqIZ/TH9kv64Y8438pXp6vFmmdVlxI+QfMp+jzrCy6zxeNz1P0U0cLKOGKOw7DAHQIiVFzkXMCyy+hSM4KRUHBTYKsnJIsqLsR+/MKVAoLPMGWEpYH07CqY54Vzuc32tNafP/Xq7O1ka3KQmoa6LhYhdS9vVR2rjqHWxSSaZJT0Ww+TTu5PIcoInQl8WVrtHaIPSCOtx6+Oqfyl0eHlxkMVqyqrtxbhr7qrEdzd7sxrr8cp/2C+ELHObN2/2qh2KEOKUw+u8x9nWlQa6tdW/MVvdMnV1ms+MJ9Jpxx+DD9bs5qoXYD+QzunbHh9++6OALL7lPiulQjsBOdfDV6cTnVrr95289601uOJUfRoTMp85Ee95t6JtjlH66e07VI2SiiPIzUhxJxQe+1d5KZv18mL4/sZX2zB+cFfb48x6CK18InkhXb28EF5UMXcOJ19FkXrlznPCjY8o0NAf1oV+9sRnuu+uAiAM/c67xWJYEVLmunXr5lxI0WTwavnD6gbkzR10+Sld8ce31zDr433Tf+zS/igoXMCUZSfXfIz9QPpqy0GBemgebp1bZyA7LRllleYNxxvQKXCudDnjA0lelkk2pzbnepnVUNHhI7XIhaQyJ2DxDMtihTm6j1+b27Sv3CBLpGKGYA8R6fd4PK7rH3NqEhrLJMD/8uKWmEf97myJphvwVJLOL8iLvDIn3PqamhqUlpaitLSU+5yG8rW13vl3KOih9CE6s1fj8oBTHiLWDdpCMCCA9VDJTmM/qEV8WZxaJdt/bvv9jJ7sZRnefndC5IEkLJshjXKZ1bTMSPQjnB707vrd2EhSkxHjkIDiJ1CNa8ucThZbmIhSwRPERQVryZN26dgbn7kp77Bftin7zo0Sfdcbjaslg7q1oWhOoAgrc5dddhlat27tGOigZdKkScLnKIKHMlVDnPEN0N/gbjOE65VQyuU+fyZZ7QTlvt/5FQnSCD3KaFAXSrQItLm2+ANLXCWvFfRHFYF3GzW3eJWw1kufflIfOeN3ASVa9LhdPW77StvvO0squctaItAYVxH4tY2+Pf7Zg71DSJlbu3Yt3nzzTeTk5OCf//wn93n/+Mc/kJOTg1dffRXff/+9cCMVTQu3e/cFBe8ka1VM5Hmlsy5YSDtUZb9sapIlEGziykLk4lwrtKlL2NGsmqUvix9bo5mwnTBbm2jwcjy7EW1c+jdbouV9t0TQSvqeM6jKb4wvmLQvPobvzMJk1YZWgRFpF9V1aAqRrULK3KxZswAAN910E1q1asV9XuvWrfGb3/wGdXV1ePnll4UaqAiOGOESlhbnfGcuLXP6CAIymL4sOismnRnTStRVzy/lF+XQlbx7s/rJl0UHdN/ZKTLY/P3jjdz1euUE7mgdddHvbqIqxz31OVZtL7Y9LuK75S4KtfHzl0UHUVZ5RHdcZD5ws3QqUtZLSx3TEu3Qz0IBEJrCbqNZRXC0VAvIapuV6qYpCZqALiemzC1evBixWAzjxo0Trujiiy8GAHz88cfC5yqCgXSZQmsBsrTMWX92C+Vv4J3wrEvxt8TpgbRiazG3LJ7azJ8IpLrQUL7YqE+hwuo5p2vy2pfbmMd19XgV0eelkuzSl2t5UaN1Tmi5j7CvjNdw3yF9Gh83ShezLH9RT9NWiPgf0s5nGrmkbjQOZQlz9Zxf0EGgZnuivi8rIKjMbdiwAUlJSRg4cKBwRSeddBKSkpLw3XffCZ+rCAavxrfVxKhdxnDvM6f5HESeObcTo84y5+0kI2sRXbFVv0QXlA+RtvDBiiM4IrCsKtwQjxBRFL7aorda+qlk8B4DBC1EDt9X7SjhF6bBsWfcWOYoTXOGH8zrVsAhyqEs2zXEK6iiXfPbZggHxDVlhJS54uJitGrVSuoBk5SUhFatWqGkRO7GVPiPZxsxO0SzukkEacRNs81KhbwPkZDPHKETt1AAhIDcn2u25wFol2jNPkT8gSdGS1xQL9xiARD8csc99QXzXOEdUhihpLxKtMVXscAjh6IXPfkZu4ANzlHELgJPvFSiXbgViNXDVycPImN4/OAururygqawmYGQMpeRkYGyMnkH1UOHDiE9Pd25oCIU6KOdvIk40/zV4Tg/NRpt0K+HuVeRc26tlI51ES0Hevtwsz9mXqKrsj331clD2BV59BOcrqGbS2x2zJeXJQJpHkHCHIUiAT2ulm9dKtFanCyTumNOfSPZeaQWbQeuPi2feTwIvSr6qpygMteuXTscOXIEGzfyOxU3sHHjRlRXV6Ndu3bC5yqCgdZnTvPZITWJm7ekmto6zFq6NfHdt02rddWY65SN0Pq//6xDnQtTpXMAhPbh50qbY31l8t/v9LtwiFgJRPo1N52dV9DUZqLAhGte+NKhXjcWIjqMfcnyR6R0mPfMnYOwc0xJgulEm5M1s5ZZKVMtaUTNWroVVTX+5IFNclga5e1bUWviu9/stK+zCWhzQsrckCH1b7ZvvvmmcEVz584FAJx66qnC5yqCx+tlVqqoyl2GHEf+WebolqSNP7/k8BHLcjKyTMeJ+t3NXHj3m6uZx0WSqLKcyZ2ui1f7bdZQ+g0YCGqPUNJoVtN3eWFeqVzGS+jlw5/tzkFYj6GfNxt28dDyxOXifvKyUC553nDmcYnPt7y6wr5OshqDQ0iZu+CCCxCPx/Hoo49i165d3Oft3LkT06dPRywWwwUXXCDcSEUwaAe4175b63Y17ihCubTol8uUUwJOWZ85t4g4G5OmyHAhS2TnDaOixzrXUZkzbdHELi+LNoee23oC21bKoS9lU2SInmtE5OVEpKd2FR82nCs/Vox5It0oxm6s9iKce2Ie83gQW3TxdNMvtfsFN/FYCSFlbty4cejZsyf279+Pc889l2u59YcffsCYMWOwb98+HH/88bjkkkukG6vwF68eZlZy//Tu2sbjlJW5ioCQW+5zP2n4+J7osPzNL8aNzxBlhJ79d6d63AYT8HLNTP2y64AureSFkQYLGZUq/mhWV9t5UVr9Pdp547zHFxvOFWmVnvveYluiRZRo49KhkDuHoYf8SoniJ7y7XDS7AIikpCS8+OKLaNmyJdauXYuTTjoJN9xwAz744APs3r0b1dXVqK6uxu7du/HBBx/g+uuvx4ABA7BmzRqkpqZi5syZTSKfS3PEqwnX8riHDyjPcAgWEWmH8fe763v+aFZXtbhos+NSqYtlJ33ia/42Ad4tO3+zrVj3/dZRvTyphwfWS4gry5xkG9zilWXOuFTuEA/B5IM1u3XfhXbeMPSWMUWQCCL3rJ/Pba/m/6aueySLnjBkyBC8/vrruOqqq1BaWornnnsOzz33nG35eDyOrKws/Otf/8LQoUNdNVbhL1qly61SJDTJUi4VBeAzZ3k8oHnEqSuf/3Qzd1lmPYL1shBRKhyXWTnlAO4e0G5Ib9lC+ly3Dz6//LPYbbA/ttthn08juuBsD6OIvZyj2HnmjN8JAyKO/h+Px/Hb2SstjwXBD3sO4fh2WeYDHI3i7Z4mYJgTs8w1MHbsWCxfvhyXXHIJYrEY4vG45b9YLIZLLrkEX331FS688ELqtis8Rp+8lk6W033jxmfO5H8jLUm0XofjArKMv57OIdzMf7/bw12WWY+ba+Z0XMAR3w3mTevtf9NNZ/VwkEXSJEcCy3dG+tJkr5AXatwvRPHyErjxEXV2K5Bf7hTyt7Np9NqdpeblW9E3IUJ+wwhcEIGlJHt5H/mFsGWugeOPPx6vvfYa9uzZg0WLFmHt2rXYv38/4vE4jjnmGJx44okYMWKESkXSRHATUWnEOZknHX6Z1r1aKvKToOp1UsBFkjWbygoFQBi+M/rjznNPYAvzCdLAE4GyjqlJRPxNGUWLD1fbH7RA+/sPV/uTasMtInn2vAoW0cqyyjknOo/W1sXJdmc4WC42BrTY5Uo1v7hJVxEapJW5Btq1a4fx48dTtEURMrTj+2///QG3jupFcoM6W+ZcV+E7lEqjOaeVi8AEoVnKTT3Sp5pwsxUU+7igNseSG6SpwvdazFC+vBhl6XdAEa2p8eRrZn6Jood+ylFSnKDGu3H6NQei8GP+CXRX9fbXV+L/XTaQTJ4sMb02l6ApKG9GpJZZFc0TN1nC9SkwnHxZCMPciZb/urbJ4C5rpXyJKHuU1hYhVY50gvMuulVXljAAwq/UJJSYLAxu+l3TP9lp7Pf8oNwZSHFxgan62Qp2XkX+nh7/E/a2WXZzI8WL6dsr7RP0+omdz2xQ/rFeopQ5he8s3XyAeVxkjjUmujS95fOLQkmF/VLyLSN7Ms+lzIhvbLPXW3rZ1St0LmHAg9i5dAEQRtxZRKVPdVUPVb13jGYvI5O6FRi/uwpMkK/XTT2UPldu7oevtxYnPl86uDOzLOUQ9XK42/YHR6V25zbFZValzCls8Sr3ziPz1jOPiygvP/3rYudCnBT+W97ZmtKEb7a2+IOb6x0Fq5aoxSGMv8GJXu2zpc8ltYgK1GvsZzcvLyKnnt2b7c89um97+3oM3/t0yOGu18knVCiti6awOU0JWxJlCqShx7WVP1kSnktttwOM2TIXwZvdgFLmFL7galNrBhUGJ2c3b/krDfm/tFBGkYkSRUuFCH6lk3H0cjNZW8KPUfHp1ymXWf7pKwfpvvNaLoyYA03cXLRgXl5uOut45vEZl/a3PWbsn5O7tuau1+mlQnZv4h9LqwxynM7W/wY3V/AXg9hWQDfYGuY4Jh37AAijLImGhQylzCm48WvAu3sz96aRbi0RbrbzCstG7F7VQ7p5uEbW4epafL/nUOMxJ5850wQf/hle28T+HDtJdG6dbnvsrrmrpNvx14Xf6/rL1XiXlAOI3Sstk9mPv+y0FEY9jRx3bCZ3nVaYLHUi5zKitZ1cP4yBZm585ZIYgXEfr99je8xr7PqnKVjijChlTmGLiFLx+GUD2LIE6r3dwV+HWY8LRci8/GH92fJcgYnwtB7sJYmRfQzLP64sc/wnB5VElRLtZXhvlZgTNqVTdFiVaO4kqsItAQ4fsU4F4jTeRfp92s/7sWUF4asoWCdrnrH6zpTF3C2CjV8vL1e/8KVzIQ1PX3kyVznhZVbtueGYrkhRypzCFhE/qAsHdCKr94Q8eb8fypt0497G4AqR/UP3lFWZj2sK3PfTvkxZ2WkpGNStcdlm3yH5PEsiUCovIrJYWe0furhAuk1GC6+oBXCfxXUMA7Uak4ruAcyz7ORh3GmD7MojtVihccSf9nP2NRRZ8rr8lK72B+GfEn2wgu6e1P7eP5zXW3qZ1UlJNNcbzPK2E2P6ddB9t+sPnrlee2o5I+9gWF5G3aCUOQU3URjuJkuckFbR+LG2Lo5/f8Nv2THON19tMToj25e1IlmzbHE+I8jjmKxUZ2GcdHNIv8KCMlmt9jtllLDow238s0uk63JKZeOG5xZvSnz2zDIncT0b7r2732RvJG+uy/5VwOykH44kKJc8/QWZLO1PdJPG0xxIwRZmXEaOmj7Ds+pi7IElm/bXn6t85oKnrKwMhYWFKCgoQFZWFnJzczF48GDMmDED1dVyb0uFhYWIxWKO/3744QfL86+++mqu82tqatz8dN8hNcMHsfwhWK32xq+p0+fUc/aZ0xdYZki/YhdVZQdvu1+7YQhbjkAH3DnGza4G3qRm4OmrwfmNVkw6N3x3/G50L0Jpet78ekfis8g2eQA7dQsVb63YofvuuNxn/O5TwA8VPFU+PE5jnTR0iHZeFW4/o3Od7p2+HfURuE3BOmXEqOB+vvGoMhdQ0I2XuN4Bwk+2bNmCs846C0VFRQCAjIwMVFVVYfny5Vi+fDlmzZqFhQsXonVr/sgiLSkpKWjTpo3t8eRkdnelpaUhN9c+miwsb5WyuFuGsz979fYSF5KN9cizcW856uriTGdeO4yX9oXPNuNGm/07uZa6OH9Ij2MtNqCWJIfh8O3E/LU/Sp9rvC+e/3Sz7TErLhvcFV8W1VtCn/t0M244s77fRbZJAmgVAWNfrtlR4hhpKoeYImAaez7MScKBJwLnmmSF9LE8RJO6w/iTXvy8KPHZXSCROGP7d0ysQPx71S787hx5Fxe/4Rvv1t+VZS5AamtrMXbsWBQVFaFDhw748MMPUV5ejoqKCsyePRvZ2dlYsWIFrrjiCuk6TjvtNOzevdv2X35+PvP88ePHM89v0aKFdNvCgFcDfuwTn5LJcpsM8uMN1pFXooq40W9O1NpEhV8Pt0fn63MHim08rmf7wcO2xyzP1xTaW1Ylndn+xI78ucJEueBv8mPcmMlfF5Un6nwvmYqEBzsRTi8vpDkKg7DMufRV1Cb6FYUll2sFQNP2vy78/qjMcGE/Zl2ca/oefW0uMsrczJkzsXp1vS/G3LlzMWrUKABAUlISxo8fj2eeeQYA8MEHH2DhwoWBtbMpwXBlCS1um1h8dBcIqodkA1VHGpdteSZLqsklCm+cVTX228TJLB3aKxVsurTJQI7DNlZB8OeL7CM49UGV4j5EiXMJxomdCNFtbKOQikcU/cucfYeIXgdtkI95CV1OLYv4ApIOO+u82gEiQF588UUAwIgRIzB06FDT8csuuwzdu3cHALz00ku+tq2pwnp7Wfz9XjFZgfnMiVVsN5E55pFjlNh3qAq7Sys1dfg3WwY1SbUQmFl2FB/G/kP1lkzzJOv8A4xBEtJKBYDeed5Z52Rh5UP73esrhWTxWyrEkbXu0frM2Z/88pIt8oJDyrOfbEKdMWHcUSh9c8MI13jjHO9NgUgocxUVFfjss88AAOedd55lmVgshjFjxgAAFixY4FvbmhPae+dP77jY+spDqJx4Rbe6YR1/f/UuIVlW9UeNs3vbb4VkxYJv633uSCxEUe88AdbsKE185lt2skvzQLDMalunoByPLt99b6/xRK6M9ZiSksNHLOvgqjMCt4q7vZsN349qd1Hc7cWJSChz69atQ93R6MJ+/eyXHBqO7d69GwcOsDdzt2Lt2rXo168f0tPTkZWVhRNOOAGTJ0/GihUruM5fuHAhevXqhbS0NOTk5KCgoAC33norvv/+e+G2hAHKPER+3SxUb/lGi55InjknwrKKse+QN3nUBnVr7Zhd3w43u380YKtUcPS8nSW3qsY+R5XfuLHs2i6zGr9LXAfb5W2H9hrP+35PmeZcwTaIFfcNbR+wfhOl75ab8R4FuJRo3pObwAtgJJS5nTsb83116mSfnFZ7THsOL/v27cO6desSUbIbNmzAc889h0GDBuG+++5zPH/79u3YtGkTMjIyUFFRgTVr1uDxxx9Hv3798NRTT3G1oaqqCqWlpbp/QUExwfsNVRPFfebM04asIz4lrC2ernp+mZCsHpzbFsmMk0SUmVGWsCTNtSMM3Hxy0Ub5k33CnWWOogE2dTqepj/xt7NXyjchkAAI5zK8Q89dvkax6O2oYKeUyoz3hM9cE0xNEgllrqys8U0tI8M+Gaf2mPYcJ3r27IlHHnkE69evR2VlJfbv34/y8nLMnz8fgwYNQjwex7Rp0zBjxgzL808++WQ88cQTKCoqQlVVFQ4cOIDS0lLMnTsXPXr0QHV1NW666Sa88cYbjm158MEHkZubm/jXpUsXx3P8QjfgQzpRuL1JE2Z4B7nm8yzaErc+5ufqx29H9rQ9tm6X2IvCy9ed6rY5CYzbvzU6JhsKcnQEr58kV7/b1CfqI+olbm4921QNEiNu3Mn6zdVt+93HlDBRgHrqtOtfNwmIowCPFd/LgJ+wEQllzmuuuOIK3HnnnejVqxdSUurzQ7Vs2RKjR4/Gp59+isGDBwOoTy5cUmLOiXbLLbfg17/+Nbp165ZIP5KRkYGLL74YS5cuTaQ0ueOOOxytFnfffTdKSkoS/7Zt20b4SwUhzMXjl1WPKtGx6HKf1YRK5UPkhvSWdOlwOuTqN2nffrDCshxPz9nlXDMr43TLfW6eolF4Lrrx3ZK5Tc484VguGc6pSegwyvpkA50SPmnmlzhSax95zYI3mtUVJrEcy6wRVmp4mm4Mjmr4Nm/tbr2sCPdDA5FQ5rKzGxMZVlRYP0CMx7TnuCEtLQ0PPPAAAODQoUPCaU/atm2Le++9F0B90mMn/7vU1FTk5OTo/oUFrWIkOh355jMn6NjaJrMllxwnmMusgtvs6M4NMfe8Je9QbrdNl5ttpIyYrVAufM1CtGblyiHcQ7VU9uWlf2drxV6qDYYBNOGfYq4ELP773R58+K05OTZfShi+fqe875tKoBVlAEQDxi3nouw72EAklLmOHTsmPu/YscO2nPaY9hy3aFOhbNq0iVHSm/PDQhSGu+hN+dr1+u2wEjc/RVSlzd9DpBe4osRms3G5zOx0ndJQv7EZblI1ROGScSWvtfkhJIEnkjJaZbRE7zzrl28vlU8ZZANhdJY5zd9l+uxvvxxoXYfD96hCuVRKaZkOG5FQ5vr06YOkpPqmrlljbw1oOJaXl8fclkvBR0aqfonOzYCn3BCehajPVQsbxxKKrPT20X3ispoavJMqT79T+szZEaZr5kVb5Pqdzz+Vp7l2FnJRgngmuwmAkJlX0lOs52Wzs3/w0azLi8SzShix/x3yLy/iksJPJJS5jIwMDBs2DAAwb948yzLxeBzz588HAIwePZq0/iVLliQ+NyQm9vP8oBhzYp7uu/bGF112+vOF9illKKFYHrWSIxVVefQs0xsz1yQbXfhSBnAq0TL12wWe8PS7XQRyE7Fz2O07TBLM6kKbI7OMeHzjSLeT0yIqs0VVmK3Jb3y13TPZMnsRexrNHTCRUOYAYOLEiQCARYsWYenSpabjc+bMSSxhTpgwgVuuk5m7qqoq4fOWmZmJkSNHCp1/4MCBhM9d586dMXCgtYk8jCS3SEKBxlHdzYDPy00jaJEzog708u98HG2RTNUQGdzkO7NZE6KwgH6zrRhVNbX4fx+5z++4o/joPrERuGhSy9uJficIPLG1iEag8wTYo9nNhRdtH+j21jWUkwliaVAI7a4tiygpMXvLxPNi8lvmItQRNkRKmSsoKEA8Hse4ceMSgQh1dXWYM2cOJk+eDKB+hwijwlVYWIhYLIZYLIaioiLdsU8++QSjRo3Cyy+/jO3bG98ijhw5goULF+L0009PKI9TpkxBq1atdOe//PLLuPjiizF37lzs2dO4Sfvhw4fx9ttvY8iQIQklc/r06Ynl4qigHeTa4R7W6dk4OXVry86NFsjG401skjXhovFyFlA9lz+3FM8t3tyoiB1FZsxe9bz5xTHK2GbEpxDuZrwTPUz9eCjf8PJX+jolrGki5zohG0UsKi8oGn7Fb179Wvd3vhUAPk7u2lqkSaEkfLtK25CcnIx3330XI0aMQFFREUaNGoWMjAzU1dWhsrL+TWngwIGYNWuWkNx4PI6FCxcmlMP09HRkZmaipKQER47Ub5OSlJSEP/zhD7jrrrtM59fW1uKtt97CW2+9BaDeepeWlobi4mLU1tY7y6ampuKxxx7D+PHjpX9/UGhv7ChEWBpb2OPYLGZ5++U+cSYO7YYXv9iikdE8LBUy8CrRMr5bAPCtRQ49mQCITXvL6891PjVw3ERVkigVtnX6h9dTVCwGrNhaLH6ezd9JfHMb3DmMirpkwE9YZ/klm/T+d3wBP3yjb3Rfse0Hw0ikzET5+flYtWoVpkyZgn79+iEWiyElJQWDBg3C9OnTsWTJErRuLaZhFxQUYPr06Rg3bhx69eqF9PR0FBcXIz09Hf3798fNN9+MlStXYtq0aZbnjxgxAtOmTcMFF1yAHj16ICUlBSUlJcjJycHgwYPx+9//HuvWrcNNN91E0QW+o1fm6OR+dDTEf9PeQ2QyD1fX4qInP0t8H378MY7n8DviO/94424LrixzzkUCx80StclZ2+ZcWUtLba35PHepSaRPJceL3/HCZ5uFZfEGTbjafkzw1LC+b/L75jr/AJnE2tyyQPvSTnLfxKxlyVjmHp2/3rpcmG5wSSJjmWsgOzsbU6dOxdSpU7nPKSwsRGFhoeWxtm3b4vbbb5duT7du3XDPPfdInx9V3I79615ajqKHfoo/vbtW+NyHxxXg93NXm/7+72/Et3Az0nBTyygRdpON3AbY3jyV4vF4KCYuW0VQLieriVqr/gtpfjYq3ERVUvgXerHzhii3j+5lSggbBvTpSKw/82IXnCW3nVdItV8OZJe36+qi+5tZRMoyp/Af7bD3Qr+Qyag+fnBXy79XGWRxLTt5GAHhRWRkrcuJKCyWC7OCK69EW51h1U9udNg1O0vkTybGlS7O6xBOoGQkqvRRD+7ZniZZPDXaPthf3pifkWK82+UItEvMLSo/aDbtLcfhatn8fuY+CNvvo0IpcwomWoVEl5okhJaKWsmtdqxwkxLDKEPmjdmufpnlML+RSRlgdy6XUmFRxlKZ4xBlxY7iwyirrJE82z/4lp3o7lveNDJcO54QtCcouHy3DH3w9daDR881yhKvj1qJDssLn5bbXltp+tsJkop7FHy/ZVDKnIKbsN8DNXV8k5wWW98tiuUP2ygzedzmbaK8hF5ss0PlDmRlreDLM2f+24YfyyRb4Q1+JD+We5kJ+QRBgLQybDht6VFnfpKdNxL/62XxbRvIkkiBvg2vTD5VSsq8tbtNv+bxXw6QktVUR2nkfOYUwZGYNOJxrA/ZAw4wW2NkfIjufOMbjOzTTiqZp6nI0T/YLSnK4Nbfrf6B661VlS+q0vq7SSHg6Hir+mosAiCaGhsNwUM8ypRp43HCofDf7/ZgwtB809/dpAtZ/P0+Fy3yB76AH/P3HcWHMeVt/Y5GMj017KH/YmDXVmibqd9lRzqalfDWMbZhYBe6FCAdctOlzmuq7xzKMqfgpuFh8fGGvWQyKZd9jJY5rvoN1VceqcOTi34gsUyEwSHcJNcbseJwWuZ4sOorqwAIrn63+FvoHAqODtornxPPgcf7W2S2UZvyjngwU6Mw85/W7AiPn6JbrPr9lldXYOF3e3R/O7OXcwS+1aVZsbUYH6370bFOHrycI9xZ82nuxKaQINgKZZlTcNNwC5RUHAm0HXaYLHOSebd2HDwslRHftER49A9GK1+QwaSkb90u6rBzzpbLs2WGOgCCgng8jqoaOr/OXSX6nQhkLES1dXHpzeO9Jgp+ioDcmI3BbFkFgEHdnPcU566PKzm5WRjlHFFD6MdMhbLMKZol2oF/55xvAAT/UDTy1ZZ6/xMKyxwA1MYlb3ibAIh739IvpQS5AfY/PQigmL1sq/A5pmXWo3+45y19yhnZXrAOgJAbuFQWgckvLUfvP1rvLS2CbWskAk/ue3sNBv35I1O5ZJs9XGWQfXhO+Gf4dt/YfrBC6jyrMWT8S+uMFCnZbrBeZqWZez7/YR9eX6738Q3bs6MpoZQ5BROtUvH10cznYXuzeXhefSJIY/4g2bxbtXVyb5PmbO42y6yu8p2546EPvnMpwcwf3jQoYDKBJ0e/fvitfqlIdqxJW+Y8HNwfrdvjXMhrLPrgUJXZAvbLU63T/2jxeh44EkK/x1lLxV9cAOuXF89/nWQFxtNO7e5sLbTiVosIVN50KdcO7y5VJw9he35RoZQ5RZPhSJ0xz5wctXVxbN5Xrpcl4UM0+8ttlg/KgHUKMlwFchi+v/7ldmmrh6XPXBNNDMpCZpnVirycNGSl+uuB47Ufk5fjwVU+S10Zbo9GznJyGO+nu8acICXH6ufw/sJJXipzymdO0RyxTKRPaCqnlGW1hZNzAyzk1AET/rlMWJSx9kfnr8d3u81Rv2HYgcFLZJSKLzbtxzmPfSJZn7lGWcuc39N8brr40prXll3qh13LZGebgdcvL699uc0z2ad0b+tYxpRr0oWNnbKvLLfzMl1/uvmKd+6zKkXViii8KMugLHMKJlEY9w03uclnTsKHCHCxzGpR3werd1nUqbDq98NHzI74sv47NRbXUHYSN7Z02s/7yQmy4N83DyeTRbnxOBWn9zwGmT5b+az4suiAcyEOrHrv/y5yHg9cLxKcA5R3GPOU40kzR/ryzluOsM7z+uXpvkfhmSaDUuYUTQaZBJxWk8Y3280pEfjyzFnkO5O1EBlOW7mt2PkkAfaUVjoXcsA+mlXSWdFKFk8Zi0Ib95ab/0jEyV3pcmV1bZshfI6b5xxPXAOl5eKCkzrQCQsBVsqwjHV12vvrUBzCrABfbNxPZpezemHjVdLcnGtkRO92uu9NNbm1UuYUTKIw8BtucqloVou/HdDsnSgCb1fJLLH84qnPhc9h8aAHgRAiUL558171li3klvusEr6GEa7lbdLtvBS8UC7x0y6z6oX98h9LTPIprbncy6we3mNN1Z1WKXMKJlEY9w2TjzGnEZ9jMt+sQdkPMhN7g6JKNckVV8gprFT4rQ9NPr07kojSbQS9L/HanaUuUmQ4lyEd65x9ZazTGJnuvh3BIr+1lv+YtwXzH6s6paObTQlA5cSEHaXMKZoMVJY5WbhzeRL6zwSJH9ncM1vS+FtlcMqxegEwOa8HrBlU1dRh+MOLTH8/NivVorQ4pENPsq9+P3cVYSPk20FWPaklmu8C8aYBMckn8pkL+j6xY9ayLUE3wROUMqdgY7nspL9Lr/MwjJyHhubI5JkjhbNCN5YdqgnSeA1nXjOYRjBv/ZzlLhrYybmQzxeaMJ8uKY9dOsCxDN/44XTE5wm44JJkZs5X250LRQi+dES04/jYbBrlnne+euum0wznuarUM/7fR997JzxAlDKnYGI1vSw07AE4blBnfxrDoKqmFm+v3Cl8Hq9yxDPRUlrm7Fizo1T+ZAZDjnNOr8ALX9Jg5zKdWqXzpbXgaJMb5nxlTGsRTm2OJ5jC6yXi6fPX6+vjdWPwUCHfUXwYb369g0yWDHy7vvDB01VXn5YvLeuzjft033nnq4GGwKCdJfJBVkG7MkQRpcwphHnHoDRRmtMHdROPFIwhhucWm7ep8t0hnDsAQo4VWw9KnukNdn03qm87y7/znCtD3w45jmXcqApejne/kYmkti1n8bcnFv2gr49PlKcMe+i/pr8dd0ymr20Iwp2DT5ZZ2jP/20RYgxyeLkuH34NFCqXMKZjwLaXQLRs+P/EnUnI2/GhOzut/igzOZVaet3QLUT+WVnHJl0HWv8aKW0b2dCxD6Tf4k3y57YZkCYOCIgtf0mD/8bvO13811Nf6+LaS45NFacWksqJTQ6r8mnS5pqnNBZ/NURFqjMP+sx/2mcrI3uxWSxatMloKy1m9owSHNpm3zeIhiBQZ0nmbPJxUKWWnJrfwtT6gfklWdglMi8y+slGCUmnnIaxddQxRsAgvlMusfhPEkqeX91gY9/ylQFnmFEJc8dxS099kbzujf40sVvufArzLrP4TxgecVJPcRLNG2L4V3ZYTR1ITWnUKx57oWKabRILlpsjZvZ3dGHiv4T3n93EsE3XLXHNBKXMKJl6a4WVSiVBD+QbI01f3nt+H8y3dLOyHPYdkmsWFbD+UVYYjiz3V0lNYl52o8NuqyKu09+/SyrHM/xs/wF1jQg7vGM5OS0Gv9lkkdfbrlEsih5oo32NBoZQ5BRM+/4Jw3nmkAXJc23k542aSepTIkgmYr5hss8Y/s0Su/nAOGfRo5/yQjLJVkQe/E2Tzy1L93kByEvvRTTr1BfDOrXYqEUcpcwomXloqYgj+wchbO49S67dj8q2jnAMNeJG9ht/ukkuVktIiCcdksf0jRXrTsSzntZn6M+flviB0iikX9CWT1TZT3C/VCr8dyYOYKf5I2O+UOPV8BHKOs2naersnKGVO4RrZ+87r+Sbq85kTI3u3lzrPOohF/Cou23xAqv4GeHNh8UD18GrDoegEocwZNwt3w5VDujGPh1URCKLfz+x1jG91hbXfm2r0Z1NDKXMKJlGO7ruEI5kx5TRVx5NYmLBC2W63CmIJAqe+COvDjXe8jzkxj65OMkl08OSEJN2kPTS7hHoDpdIUdQUspI+UUKOUOYVrpFNtAKiuqaNsio7LT+nqWMbvpVFuWXSiLFGTpTy8Xff/LhtAV6eP14v3nji+XbZjGcpmBxJVSVjn787pRSbLz72bg/GZoyOsL4XUKGVO4RrZCe/wkVosK3K3VGfHoG6tkUS4iSbPhJDcgmfrKbqZRSlk/AQxn6elOOfb44XSKkU5bro77KQQ9TFK2fwOuWnM46QvgxFXYMK62hNmlDKnYEK5A8TjBkvFN9uKJVpES3ZaClc5nrnxssFd3DVGWx9hvz995clum+MJjk7cAiqYn8tKPMvp1PhqmSOUFVYllBfKJMsR1698xc9L/dr1Q3yszTuUMqdgQplu44KTOrpqi1dcf8ZxJHIyU5ORncreVCUIn7kx/TqY/rZo/V66hoQAP/WrQJad/Hy6hVTrCGYnAkJhTj6i/lUlJquJj/dTj2vrX2UeopQ5BZNTu9PtexlWwzmPFaxLa77s81Tzntc562pDkLDZzwAItezkDU73Dm2eOb5ylDtF0OY781Gbizi+9nsTQSlzCiZTL+znWIZ3kg3p84iLYcf7/PbGE0UcWvW4aRN1h3AnaJdZCWVxCnt1Mt2yGenezRHVKaiUoWuHd+cuq/pdHKXMKZjkpjv7lPFaDYzl9pRVSbWJB8por86t08ksI2HNrq/gJ4g3fVILl4+qYRDt7tgqna5SQih9RKPI8OP9y9nXHFHKnMI1Sqeg57ccuzsE0e8tKCOEHR5elDtARP1B6acCJvIixBOmQ0XUU5NQuhU0dRcFp36ndP9pKihlTuGapm4hCmJivHBAJ7pKCXnn18OCboIlKgAinES13Q2E1VexqeP08vLMVYN8akl0UMqcwjXKdysYgnjOpHDk0qMirL4ulNZJXqKamiTq0AazUlqinW3RVNAFddG1SSSHaHMZz0qZU7hGvbwGRdNWKiihVAy7tKGLluQlrNF9Tv0a0eGSwN9l1uaidjjj1O9RH1deoJQ5hWvUjcVP1HeAaO7XevxP6BJDi+Dvdl50siiXKYPQdSiTBvsJrWtI+JRMtfxtRilzCvdE/L6K6htzxLudA8oQiGhDmuLDz2hW32ryBh9zBpOO4FMIAwQ65PofHdzCQVmL+rjyAqXMKVwTRp+5oB7tTopfWK0e/HXSyYpixF3Uo2J5iLr1mBQfd3ynHMMXEQVQJSfFkOewpywvIr8vKSmGy0/tantcaFyF9GWcGqXMKVwT+QnbgbBOBcF0u58pMghl0YkKBD/bL5QiI/I9y4bWV5EOp2skEiDAYliAueFO7tra9lgYDQhBo5Q5hWvUbdWIn9ayqOfdUtBxA9H+wgDw1JUnk8mK+nhxav8NZ9L1+7NNPN2G6MsZq+tFxlXTft1oRClzCtc0dWfUsFrpA9l4nFCWU7fS7h7QtPn12ceTyTq7d3syWVG3oDi1/rZRvbhlOc0jo0/M45fFXdIdQU7tTfyxQo5S5hSuUfdcI34GSwRjmQvnMmuv9tlsWS7bEnZEoi599XukrCuQbdQoo3Gb+iikhdX1Ipfl2KxU942JAEqZU7gmCKXiN4SWCCdo83JFe0InvdSEffH/LhtAJosF5eX71Zk9yOoN6wtVcgAJlilxar1a7tPzh/N62x4T/f1UVt1zBSyeUUYpcwrXBLGUMrov3Q0a1Um2qfvMiVyX9jk0EXd+csFJHchkhXVJKjkp2o8Yp34VsYg29dxvADCqTzsyWUzLnMAzJykpho5EEblhJtp3miIchFCpoJzrJgzN5y7b1P0Ho+oDJTIeTsn3ZxNvkaGSnZbMlhXQdXHq1+QWdO0KxEeUMN9ZONUvavy5Rk18mpUicspcWVkZCgsLUVBQgKysLOTm5mLw4MGYMWMGqqurpWQWFhYiFos5/vvhhx+YcjZu3IgbbrgB3bt3R1paGtq1a4dzzz0Xc+fOlWpXVGjqN5bIcpgTKs9cI45JVAOyPrxwzWBf6hFRTtJSWjAjVoWW+3zs1jAusz5x+UDuso7bSglZ5pq+OufXlBS+URU87Ne9kLFlyxacddZZKCoqAgBkZGSgqqoKy5cvx/LlyzFr1iwsXLgQrVvb56dhkZKSgjZt7N/Kk5Ptu+v999/HJZdcgoqKCgBATk4O9u/fjwULFmDBggW45ppr8Pzzzzd5y41f+NmNIhurOyYNdtsYDWokeUN6SgvbY6TXT/AC5h+TSVJvSrJ/I4dymZXKd1XEId7RZ85dU5ocrP4QVWZZz0rR52jTV6MjZJmrra3F2LFjUVRUhA4dOuDDDz9EeXk5KioqMHv2bGRnZ2PFihW44oorpOs47bTTsHv3btt/+fn5ludt3rwZl156KSoqKjBs2DCsX78eJSUlKCkpwZQpUwAAL7zwAh599FHptoWZIF44nawaITQIAKC2zNHJCnOdfkP5G8/odSxZPVR5t64a0k2sYhdQLrNSIXILOi6zBvTzfEtNIlqesEOY452slqZDZJS5mTNnYvXq1QCAuXPnYtSoUQCApKQkjB8/Hs888wwA4IMPPsDChQt9bduUKVNQXl6OvLw8vPfee+jVqz73UFZWFqZOnYrrr78eADBt2jQcPHjQ17Y1VSgdk6NKGH2IRHDcE5esJjGrDuVvvGO0fR4y0etH5RCenZaCVhkpQnXLEsZlVkrUSosepmVOVBZRapLmQmSUuRdffBEAMGLECAwdOtR0/LLLLkP37t0BAC+99JJv7SovL0/4xN14441o1aqVqczdd98NACgtLcXbb7/tW9uaMkqZC8gy52NdQ7q3JZN1/LFZZLJEYClZ4pY5OllUOG3ontyC/xHjFOSRm+6PAqqF0s+tW1uaZXJq2ma2tD1GqYCJwh7vgsuszWCdNRLKXEVFBT777DMAwHnnnWdZJhaLYcyYMQCABQsW+Na2Tz/9FIcPH2a2LT8/H3369PG9bb5BdKPcf+GJ3GUdl1kDGtlOk4yIhej9W05n18UtiQ4/lYaHxhWQyRp3cmcSOcJbEjGtaYIwThB9eaF6uBX+jH3Piljm/vMb9njvkJvOLYuF2N6zdFCm7aBs2Nu/HkYmi3K1wI+5piltoRYJZW7dunWoq6sDAPTr18+2XMOx3bt348CBA8L1rF27Fv369UN6ejqysrJwwgknYPLkyVixYoXtOWvWrEl8PvFE+4mtoW1r165ltqGqqgqlpaW6f82FQd34A1eaQ/6n4451eJMPQJvz8w23VYa9xUCEa4d3J9t4nBJSnzlXLZHHyVom4jPXtW2G7bGf9e/ILSesxGIxXH1aftDNMNGljX2/ixK1Lfj6dcr1oRZ/iIQyt3PnzsTnTp062ZbTHtOew8u+ffuwbt26RJTshg0b8Nxzz2HQoEG47777mG1r3bo1MjLsb4qGtjm168EHH0Rubm7iX5cuXYR/h99kptpH/4kg8lbnVDKsy6w/LeBPFOuYFiGAR7iTLkdlAaMkyCUW9jUU9ZmjW2b1K00GVTRrUP6TmS1pEz5QTUu/HdWTRpCPUFq1heu2ueYhfUxIEQllrqysLPGZpTBpj2nPcaJnz5545JFHsH79elRWVmL//v0oLy/H/PnzMWjQIMTjcUybNg0zZsywbRurXdrjTu26++67E5GwJSUl2LZtG/fvCIJfntJVyC+GhciN5WiZC6ElBgB6OuwhqsVJWQvjRDT9kpOCbkKooPWZYxwLaaoGqgCIoHK0tUiKYfxP6F6oqV4yLxxgb9QIEto5yfsJLqwv/TJEKs+cV1ilM2nZsiVGjx6NM844A2eccQa+/PJLFBYW4rrrrkNurnem2dTUVKSmRmdjYCenZRHE7iu61CR+3c8tBZXeKM4zIkoF5dhhEWQ/sgxT4mkfXDVFj0+6URhTk4iSRTnHkUnyB8rUJOktxVZw/Lhvo3Y9WETCMped3WjNaEjKa4X2mPYcN6SlpeGBBx4AABw6dMiU9qShHla7tMep2hUWRN+Yz+5t7wQstMzqULRFQD5zlDj9Aqp2i1geKC0kItukhQXRxLWUEXlRVO6DWmZl+qYFeL+HdcWACtavO/34Y8hkiWI7bTWhyxEJZa5jx0bn1x07dtiW0x7TnuMWbSqUTZs2Wbbt4MGDTIWuoW2U7Yoi1w7vbntMaJnV6XgIn3zCigBhZCyLCaf5l0RWS3rLFszdFpoClNGslD6Svi2zBmSZu+LUroHU60T4ZiVa7MZ7QadcYUXWjzk8qntNWxEJZa5Pnz5IOvqGp40eNdJwLC8vj7ktFyXa6FpWpGpD21gRr80Bqog8pxtdZN74ST5/FK2f+DXNBDmhUSmkYYXt5yYoK4LPHbKkwYTO88K50wTLM2VF7CIO72m/g4kVpKlJyCQx6ojW5WASCWUuIyMDw4bV58KZN2+eZZl4PI758+cDAEaPHk1a/5IlSxKfGxITNzB8+HCkp6cz27ZlyxasW7fOk7YFjfCqG9HN4yRGZD/V8/rlIUPQn8MPHCcagb6f6pAPjJewLkmHFVZ3BapE+3QhqZQXcaU/nFbMqCkPE4eKWe3trpPMS5vymRMjEsocAEycOBEAsGjRIixdutR0fM6cOYkl0AkTJnDLdZrUqqqqcO+99wIAMjMzMXLkSN3xzMxMjBs3DgDw1FNPoaSkxCTj4YcfBlDvL3fRRRdxt60pQvUAc5oaRKKUYrEYzuvHnzJEFvHQfLqppmf7YHZAcCJyymGAe+tGzaoTJEzLXJCpaoKrWgqqTAUy0KYmsasjalfEnkgpcwUFBYjH4xg3blwiEKGurg5z5szB5MmTAdTvwmBUuAoLCxGLxRCLxVBUVKQ79sknn2DUqFF4+eWXsX379sTfjxw5goULF+L0009PKI9Tpkyx3K7r/vvvR2ZmJnbt2oWxY8fi+++/B1C/1df999+Pp59+GgBw3333oXXrcC7p+YVf905Q9+gTl5/sW11CG4ZH7jFCR5C/nKU4iPoQUfrOR06HFn0R8qYZrrF7yWwKSZEBWkXZjzmrKcWjRCY1SXJyMt59912MGDECRUVFGDVqFDIyMlBXV4fKykoAwMCBAzFr1iwhufF4HAsXLkwoh+np6cjMzERJSQmOHDkCAEhKSsIf/vAH3HXXXZYyunfvjtdffx2XXHIJFi9ejF69eiE3NxeHDh1CbW0tAODqq6/GnXfeKfvzmwyse0dkHnCyqIoss1IyghGtG+QDNKwvoH70CeVYEG0va3kpRTA4gDQAImranCCUFhc7SY/+Qjynol2z7v1pH2FZTR6bvnrg5+Lb/Nldw6b0khsZyxxQv8fpqlWrMGXKFPTr1w+xWAwpKSkYNGgQpk+fjiVLlghbvgoKCjB9+nSMGzcOvXr1Qnp6OoqLi5Geno7+/fvj5ptvxsqVKzFt2jSmnPPPPx+rVq3C5MmTkZ+fj8OHD6NVq1Y455xz8MYbb+CFF15oUibdBsQ3YvanD5pSMkg7RPLWsZVo/quYmhKpKQNAeNNBpAim7fAjI35YEd1yimq815e3qUPigtidE84RKo5dX8m8PPiSVrGpdDwiZJlrIDs7G1OnTsXUqVO5zyksLERhYaHlsbZt2+L2228naVuPHj3w7LPPksgKE69cdyouf87spxhmwqjLUTepdSb/3qVUSnS77DQSOQl80CnIIiolYD3ERNN2+JJ3i5C/jO9PJuuWkeHbvkomiMTWQiRxf77xq6H4xdNfCJ8XBFLKnB+pSUL4nJAleq/ZCt85uZs/fn4i95XT3CCSNNgvKJ+fVw4Ry6NF6RAexs3CWYTVSpvSxHcE+flAun16s1Lp7A5BLjHbW/nEZQ3sGj7/a8ooabsuobQqR+yWYqKUOYUjrIeh6L3rV0qEoHzmwkpYe8OP5T7KsTCmX55QedZwF1Xm/Ei30bl1OlkdTQVKa5poHdTneA1pAASlW4FNu5qS65NS5hSO+DXexQIg2MfDeJNSKrLiaU7IqibFD92eSpnLSk3G6L7thc5hKaui7fJjb9Z/3zycsJLgYA0rqiEX9DJrWO9pKuyCE2gjZpsOSplTOOKLIyoxyjBnhDISMlrO81QPvQFdWgX6kkB7H1pfQ8pN5cOK6NyQkuz9Y1LKMhdCbc6uSTKBU378vLC6YMiglDmFI6xJI7ioOH9Sk9x/Id32a0GqQKzuEF4qd9cUz2TZEaT/JO2ykw8O4Z7X4A+sF46hx7UVknX96ce5bU4Cu3mJUql4+dpTyWSJ0qmV9TK9TBoXPwKXmpAup5Q5hTNhtHI5PSSpJsdLf9KFRE7QhPEt3i+oFPug03n4Ec3a1MfJH87rLbyrQevMlvjFIJpgDls/ScJuH97zGDphgsRiMVxi0VfHt8sWlpWWQrnFYrRWE2RQypzCEcoJnqWEUVoxmpL53IogNwunvE5+LNk2lbEgmJaOybDjrR/4YXxxk8E2atTXVpixSxQdxiGal0OchkiQdJv9smVmjFNtrLFh7HdZlDKniCTOe7PS1EOpCAS6JyRrmVU4iap1+VtH0eUCe+um08hkkVnmJK4f5TVPttHmLhssbj3+y/gBln+XeXH74LenC58TFEEr9i1t/O/CqFO8cePQQOtPS6azzD1wkfiuEVFDKXMKX/FrqUo0679du5rKm5sf29YMt7H2sLAbDSfkiS/L2BHWHSBEsVuiO73nscKy2ggknHaiZ7ssMllU2C8j08mTmcnsrmEYl7c7txbbdYOaNLugCYk3pNyMFJetCT9KmVNEki4OE83PB3YiqYdyip1yQV8yWUGmJqF+UFrKIuz5IAMgjjs2k0xWy2SbVA1B+/KFUBEJK3bKXBN53yAlldRnzhrRLfXCTNP5JYrII/JQSm/ZAqP6WG9qP/2S/ujTIYekTZQPqknDu5PJChL7qyTeV34ohsK5eQG8OnkISd2Zqck4Jb8NiSzxJMP+ECU9JOhlVlufuYB78ZXJwUXA2pHusTL3l/H9m4zVHlDKnMIlOWmC5mvCjPh2dR+bnSokh0VYb/XcdLF+Zz3DqJSEsM6LMg9w2yUeCXIEr5Uddv5WQaf9C6NhrqXtcqacPKsXzcyW4jn5qNtFRSphLj2q4Win+FKRldq0ll6VMqdwxeQz6HIwHXeM2JKUH88wmUn2icsH0jfEwE0jegiVZ7359xb0T/MjrYWMqGevGmT5d5kACKvfErTS5LVlTvaBHsZl1q5trd0wKFt67oliu4EA4bWuhhGvx1X4Rq071MhSuIJqA+yx/TuG8qEg06YxJ4rt3ymDqEXU7meM6tNO4jfaBIsISmEhs+w02qbfpZQ54TO8x86qQ8Udo0/wVL7fXDSgo+lv0nOMYch3bp0unK8OsN9NIujl36BfVESgamoTcpcDoJQ5RYQhzVEWsUz9ovjxsKCsgnLJVua3W51CGWgg01fN1aozOL81mSyqcSU79UQpz5wsQww53brZWEll6UvlDx3KVzZ5mufsoAgMuzlQRjEL68tkGH3HfIlmJZwcKRViOcuctxfx09+fLXyOnSIQ1vtAhscvG2D623MTBtNVEHSeOTufOZ/b4SUXGzIJzL1RPmfkgtvOMP3tJ0QBRU2q06GUOYWCnDBa5uxaRJkIlzY1CR1UljlK7PawZOHHhu9BY5VfkDJHmOxlpVKYbZMGh3DOkCUpKYbTejRa547Jkg9I69VePx6OyaLLjxj00jY1TX92UESCoK0LVLsEUEMV0RW1eYs2NUnEfrwNXvvMhQFKi6jVnCI7rqg2fe+dZ71EGPQILeicG3AL/CfoPqem6c8OilBBu68nnaxUwlQUlLw0iSr/E90SnZ3vGOWbLu0yq0z95r8F7SRO7TMXRiXX6ybJjtEMm31CRWmZnISze5vzY8oOd2PkvGxKndTkFhh2vPX+peGCboAoy5xC4QUBPyhTCfcBpIRqvonaDhCUtM4QX5oJo3O0nfLVWnIZ0pirMOidJADvx6ms+HSJnHJ2WF1H2ZcX4zh1Y72NhnITbBBSmFHKnIILrQ+EGygfGJSPHsqkmZRQzTd+zFthmBx/eUpX3ffrhnfHgC6thOVYR7OGE5k9cQHxxNP+4O0gSpe0sFFZ5gCzkmm3k40MfmyB1VTITqNT0MNAOJ9gitDxi0GdPZUvo+RRpiYJq2WOarsZuzd/yijiMFizLhvcRff9zjEnSFk9wqCY8nDcsZnSVh2jMheG6+f1MmuGpIWNUpkzMmFoPpmssL6UusGrMdEqnS6YIgw0vSuv8AQqvckYndTATwvMCT79JKw+c15b5i4c0MnmiD12SZFldIpJw2j3q00zWCZkFRSr84z5s3gZ27+D1Hlec+WQbrrvQ4ms74D8A9jrqM7MVDmlzDiurhjS1aakM8afSLm8OdGFYkjZ96d2rx9Lxx0rtquPFVQW5AsNSaRbZYbRMi1POJ9giiZL+5w0Sx+f8wvEd00I8zLrdcNplBSq+dXugWGc4HgYabMsJNPUe87vLXGWPV3a6FN+yPaf1Xk3jzheStbP+ndE1zY0iVOX3jNS993N8Bh3sl6R79eJLqJx0R1nSZ1HqcpZzQ8y+6kCZiXwhjPEttNjQam/Xuti3qFc6bjxrB544erBmD15iGtZVMrcAz8v0Fnus4l2LwoLSplT+E5PC+uczFshpQJGvczaUSKPmDXepiaRW4Kky2IvsyUSC+MymuzzyfhTOrVKt80R5igrFiNzU2ifk6b77mbcaq+jm1xgVsg+gL12wpe1zBk3ZaeMBHYjydgOKrcMt2lwWiYnYUTvdmhnGK8yaGW4Ge+ZqckYpvEvbUq5/QClzClc8MpkybQZRC+Ad55Lt5eklWLYq30WmXxZwjrfvDTpFNPfwuJ3eMvIngCA03se40IB0393a7W4Zlh+4vPTV57sSpaWv4wf4Or8Z64ahG5tM/D8xJ/QNOgossvbaS29fSTJ+syddcKxxC3R4OIeP7t3u8T+2H8Z35+oQcDsG9xb1Kh4eNxJic9PXznIlaxz+rbHiR1zyFZOwkTTsjMqPMPqUXZaD7koOio65FJZv6x95h74eYG0PLKUIjRiyJXCM3qZH25eOomL8LtzeuF35/RyKYW2w7LTUlD00E9JZaYmJ1numCDCuSfm4VwbH0hXSHaf107psmM0pUUSCjrlYvWOEtdtML4XuAk8aZmchDVTz3XZIjMnd6XbD9ct3Y/JJLt30lJa4D+3nE4iK2woy5xCAaBbG7OjrhszPJX7CdVSQHKS97d6ZhPyQTFm/D+lO9F+kAomspZUXmQtcwAwqJs3Ck5Ycjc3tWXH5oZS5hQK1G9nc/d5emd8yrnt3zcPlzqPqgmUexraIevDaNyI2ypDvt/k5Tb66XTMTcP9F/ULsDXh59ZRPXXfqe6dh8fJW8eNS+NPXXGyK2XxznNPwJ3nnoCPfnemtAwrckKS748yAELhP0qZUyiOcoUhVQPle2rfjtZ7MjpB9VCkDjSwQvbN/kRD34RBmdOmohjbvyNy0sLxwA0rZ53gzTWjtIadV+AuRUxmajJ+PeJ4HN+O1pe2leQOHgqFFqXMKbiQzTJvhdfbBp0kmWLBqIpQLjvISrLyp7ltlJw/2AgvnbhdYAo2CKYZJoYcV7+0+jOJ9C3NDcoXH+1c06mVfEqXsIwjJ2S2m1MojDQdJxeFp+TlpiErNRmHqmqCbgqT353TC60zaSZHygcUZb6zW0bK5Tv7x4SfYOCfP0RZZbiuYRh2HrDiX9eeigPl1aZ0IAozlC4JM68ZjC0HKnBMZqr09ltRwpiQWKGQQVnmFNy0IVKSqHNaaaFS5ADaBxSplU9SVnKLpFAqJmH1u04JaX810CE3PG0z5odzky8uuUUSehybhVyXy49tQmrxatPEdh5QhAOlzCmkcLNJceHPTtR9n3vjUGlZRud5UmsakbQbz5LPFu+lojPnV/L9buT+C090LmRDSHW50DLjkv7o1ynHdB+Fhe7HZCZynwWJ+/Q03vD7Mb0x9OjWcH8a2zfg1iiaCsHfcYpI4maLlfY5aeiYm4adJZUAgEHd5NM+GB2k3Sg/xnOpFKnfj5HfssrLJcjB+XTpNi4aKL7HawMqJYIY4wZ1xjiiHSWo0F7CP17QJ7iGaGid2RL9O+fim+3uc8NR0jYrFa9eH56kvIqmgbLMKaS4SGKDdj9wo/ykGCI+3SisxghNWZqDnmPMs9W3g7tEuAr/0W7/FFYfSAWbM48mAk9XPnyRRFnmFFI0bJkUNtwoPyktkjD3xqF4a8UOnNmrHbq42Bz91OPa4pmrBqHHseZkxCI0B2UuFovhzZtOw3vf7MKArq1cWWoVwaDdi7i08kiALVHIcvVp+Tg2O1UlyI4oSplTSOF1pnZZ3Oo+g7q1IVMmKLZJai5WjpO7tg7VFkIKMbS7f+wsrgywJXqikp4kDCS3SMKFIV1xUTgTzieyIpQ0bHh8z/nyPmBeoM1LZVwqjTpd2qSjfQ5d9C+lY/olR/22Mlq2QJaLbZIUTYNfntIF2WnJuDBEefkOVlQH3QSFwhea1pNP4SlDe7TF99POw/VnyEdnesGMS/snPjel/UGB+r0kF991Npm8bm3ll46NPHpJf3z35zFYXXguksKywaQiMB68+CR8/cdzdEuuQbPtwOGgm6BQ+IJS5hRCUFm+uhIqFVo1IjO16TnvtkxOSmz8fnpPdztxUG8WnpbSAi2UIqc4Stgs48cd9Vnt0iY8CqZC4QVNy4yhiAz3/bQvnlz0A37uIqVFAo0ukdFEl/veuPE0vLJ0i6s0JwBw+SldsWlvOU5VTs6KZsAzVw7Cs59sCm3AlkJBRSwejysf0RBTWlqK3NxclJSUICeHJt1FU2NvWRUGT/sIADDv1tPRO0/1k0KhUCiCxc/nd7hs4gqFBNr0HZlN1DKnUCgUCoUdSplTRB6tbTmjGWzMrVAoFAqFFqXMKSJPdW1d4nO6UuYUCoVC0cyInDJXVlaGwsJCFBQUICsrC7m5uRg8eDBmzJiB6mranEK/+tWvEIvFEIvFkJ+fb1vu6quvTpRj/aupqSFtn6KejrlpOKPXsfhpQYcmGwChUCgUCoUdkXrybdmyBWeddRaKiooAABkZGaiqqsLy5cuxfPlyzJo1CwsXLkTr1u7TL3z88cd49tlnhc5JS0tDbm6u7XG1obg3xGIxvDTplKCboVAoFApFIETGMldbW4uxY8eiqKgIHTp0wIcffojy8nJUVFRg9uzZyM7OxooVK3DFFVe4rquiogLXXXcdkpOT8ZOf/IT7vPHjx2P37t22/1q0UEuACoVCoVAoaImMMjdz5kysXr0aADB37lyMGjUKAJCUlITx48fjmWeeAQB88MEHWLhwoau67r33XmzcuBF33XUXTjzxRHcNVygUCoVCofCQyChzL774IgBgxIgRGDp0qOn4ZZddhu7duwMAXnrpJel6lixZgr/+9a/o1asX7rvvPmk5CoVCoVAoFH4QCWWuoqICn332GQDgvPPOsywTi8UwZswYAMCCBQuk6qmqqsKkSZMQj8fxzDPPIC0tTa7BCoVCoVAoFD4RCWVu3bp1qKurTz/Rr18/23INx3bv3o0DBw4I13P//fdj3bp1uPbaa3HWWWcJn79w4UL06tULaWlpyMnJQUFBAW699VZ8//33wrIUCoVCoVAoeIiEMrdz587E506d7Pfy1B7TnsPDihUr8Mgjj6B9+/Z45JFHxBsJYPv27di0aRMyMjJQUVGBNWvW4PHHH0e/fv3w1FNPccmoqqpCaWmp7p9CoVAoFAqFHZFQ5srKyhKfMzIybMtpj2nPcaKmpgaTJk1CTU0N/vrXvwqnNjn55JPxxBNPoKioCFVVVThw4ABKS0sxd+5c9OjRA9XV1bjpppvwxhtvOMp68MEHkZubm/jXpUsXobYoFAqFQqFoXkRCmfOahx56CCtXrsQFF1yASy+9VPj8W265Bb/+9a/RrVu3RPqRjIwMXHzxxVi6dGki4fAdd9yBuHbvKQvuvvtulJSUJP5t27ZNuD0KhUKhUCiaD5FQ5rKzsxOfKyoqbMtpj2nPYfHtt9/iz3/+M7KysvD3v/9dvpE2tG3bFvfeey+A+qTHK1asYJZPTU1FTk6O7p9CoVAoFAqFHZFQ5jp27Jj4vGPHDtty2mPac1j8+te/RnV1Ne699160bt0ahw4d0v1r2IIrHo8n/nbkyBGh9mtTqWzatEnoXIVCoVAoFAoWkVDm+vTpg6Sk+qauWbPGtlzDsby8PLRp04ZL9ubNmwHUL29mZ2eb/s2aNQsAsHXr1sTfnnzySTc/R6FQKBQKhYKMSChzGRkZGDZsGABg3rx5lmXi8Tjmz58PABg9erRvbeNhyZIlic8NiY0VCoVCoVAoKIiEMgcAEydOBAAsWrQIS5cuNR2fM2dOYglzwoQJ3HKLiooQj8dt/zXU261bt8Tfbr311sT5TgENBw4cwAMPPAAA6Ny5MwYOHMjdNoVCoVAoFAonIqXMFRQUIB6PY9y4cYn9V+vq6jBnzhxMnjwZQP0OESNHjtSdW1hYiFgshlgshqKiItJ2vfzyy7j44osxd+5c7NmzJ/H3w4cP4+2338aQIUMSSub06dMTy8UKhUKhUCgUFCQH3QBekpOT8e6772LEiBEoKirCqFGjkJGRgbq6OlRWVgIABg4cmPBx84va2lq89dZbeOuttwAAmZmZSEtLQ3FxMWprawHUR6g+9thjGD9+vLD8BsufSh6sUCgUCkV0aHhuO63gURAZZQ4A8vPzsWrVKkyfPh1vvvkmNm/ejJSUFJx44on45S9/id/85jdo2bKlr20aMWIEpk2bhi+++ALr1q3D/v37UVJSgpycHBx//PE4++yzccMNN0j7yjUkP1bJgxUKhUKhiB5lZWXIzc31tI5Y3A+VUSFNXV0ddu7ciezsbMRiMTK5paWl6NKlC7Zt26Zy2fmI6vdgUP0eHKrvg0H1ezBo+z07OxtlZWXo2LGj5y5WkbLMNUeSkpLQuXNnz+SrxMTBoPo9GFS/B4fq+2BQ/R4MDf3utUWuAeWNr1AoFAqFQhFhlDKnUCgUCoVCEWGUMtdMSU1NxZ/+9CekpqYG3ZRmher3YFD9Hhyq74NB9XswBNXvKgBCoVAoFAqFIsIoy5xCoVAoFApFhFHKnEKhUCgUCkWEUcqcQqFQKBQKRYRRypxCoVAoFApFhFHKXMQpKytDYWEhCgoKkJWVhdzcXAwePBgzZsxAdXW1K9k//vgjbr/9dpxwwglIT09HmzZtcPrpp+O5557zZa+5MONFvxcWFiIWizn+++GHH4h/TfipqKjABx98gP/7v//DxRdfjG7duiX6o7CwkKQONd7NeNnvaryz2b9/P1544QVceeWV6Nu3LzIzM5GamorOnTvjoosuSuwH7gY15s142e+ejvm4IrIUFRXF8/Pz4wDiAOIZGRnx1NTUxPeBAwfGDxw4ICV7+fLl8bZt2yZkZWVlxZOTkxPfR48eHa+srCT+RdHAq37/05/+FAcQT0lJibdv39723+bNm+l/VMhZtGhRon+N//70pz+5lq/GuzVe9rsa72y04w9APC0tLZ6Zman723nnnRcvLy+Xkq/GvDVe9ruXY14pcxGlpqYmXlBQEAcQ79ChQ/zDDz+Mx+PxeG1tbXz27Nnx7OzsxKATpbi4OJ6XlxcHEO/du3f8yy+/jMfj8XhVVVX8iSeeiKekpMQBxG+88UbS3xQFvOz3hhv9zDPPJG519Fm0aFG8devW8ZEjR8bvvPPO+KuvvpoYo26VCjXe7fGy39V4ZwMgfsopp8T//ve/xzdu3Jj4++bNm+PXXnttQrG48sorhWWrMW+Pl/3u5ZhXylxEee655xKD6vPPPzcdf+WVVxLHP/roIyHZ9913XxxAPD09Pb5p0ybT8QceeCAOIN6iRYv4+vXrpX9DFPGy39XDzZ6amhrT37p160aiVKjxbo+X/a7GO5v//ve/zOM33HBDYq7ZunWrkGw15u3xst+9HPPKZy6ivPjiiwCAESNGYOjQoabjl112Gbp37w4AeOmll4RkN5TXytDym9/8BllZWaitrcWsWbNEmx5pvOx3hT0tWrTwTLYa7/Z42e8KNiNGjGAev/baaxOfly9fLiRbjXl7vOx3L1HKXASpqKjAZ599BgA477zzLMvEYjGMGTMGALBgwQJu2evXr8fWrVuZsrOysnD66acLy446Xva7IhjUeFdElbS0tMTn2tpa7vPUmHeHbL97jVLmIsi6detQV1cHAOjXr59tuYZju3fvxoEDB7hkr1mzxnQ+S/a3337LJbcp4GW/a1m7di369euH9PR0ZGVl4YQTTsDkyZOxYsUKuYYrbFHjPXjUeJfj448/TnwuKCjgPk+NeXfI9rsWL8a8UuYiyM6dOxOfO3XqZFtOe0x7DqXs0tJSHDp0iEt21PGy37Xs27cP69atQ0ZGBqqqqrBhwwY899xzGDRoEO677z5heQp71HgPHjXexSkuLsaDDz4IADj99NNxwgkncJ+rxrw8bvpdixdjXilzEaSsrCzxOSMjw7ac9pj2nKBkRx2v+6Znz5545JFHsH79elRWVmL//v0oLy/H/PnzMWjQIMTjcUybNg0zZsyQ+wEKE2q8B4ca73LU1dXhqquuwq5du5Camoq//e1vQuerMS+H234HvB3zSplTKELCFVdcgTvvvBO9evVCSkoKAKBly5YYPXo0Pv30UwwePBhAfeLJkpKSIJuqULhGjXc5fvvb3+K9994DAPz9739H//79A25R84Ci370c80qZiyDZ2dmJzxUVFbbltMe05wQlO+oE2TdpaWl44IEHAACHDh3CwoULSeQ2d9R4DydqvFtzxx134IknngAA/OUvf8GkSZOEZagxLw5FvzvhdswrZS6CdOzYMfF5x44dtuW0x7TnUMrOyclBVlYWl+yo42W/86BNhbJp0yYyuc0ZNd7Dixrveu66667E8tujjz6KW2+9VUqOGvNiUPU7D27GvFLmIkifPn2QlFR/6bSRSUYajuXl5aFNmzZcsrXRTTyy+/btyyW3KeBlvyuCQY13RRS488478eijjwIAHnnkEdxxxx3SstSY54ey371GKXMRJCMjA8OGDQMAzJs3z7JMPB7H/PnzAQCj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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "dataWithModulation.plot.errorbar()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.DataArray (freq_x: 1200)>\n",
+       "array([0.000488  , 0.00151406, 0.00056002, ..., 0.00175156, 0.00056002,\n",
+       "       0.00151406])\n",
+       "Coordinates:\n",
+       "  * freq_x   (freq_x) float64 -250.0 -249.6 -249.2 -248.8 ... 248.8 249.2 249.6
" + ], + "text/plain": [ + "\n", + "array([0.000488 , 0.00151406, 0.00056002, ..., 0.00175156, 0.00056002,\n", + " 0.00151406])\n", + "Coordinates:\n", + " * freq_x (freq_x) float64 -250.0 -249.6 -249.2 -248.8 ... 248.8 249.2 249.6" + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dataWithModulationFFT = fft(dataWithModulation)" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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azVr1iylpKTE1WZ4+RtJamho0KFDh9rdvq6urtn3BQUFevjhh/Xxxx+ruLhYZWVlqqysVEZGhgYPHqyLL75YM2fOZCwVAACwXNyTf35XVVVVKTMzMxLSAACA/XXl5zeDigAAACxAqAIAALAAoQoAAMAChCoAAAALEKoAAAAsQKgCAACwAKEKAADAAoQqAAAACxCqAAAALECoAgAAsAChCgAAwAKEKgAAAAsQqgAAACxAqAIAALAAoQoAAMAChCoAAAALEKoAAAAsQKgCAACwAKEKAADAAoQqAAAACxCqAAAALECoAgAAsAChCgAAwAKEKgAAAAsQqgAAACxAqAIAALAAoQoAAMAChCoAAAALEKoAAAAsQKgCAACwAKEKAADAAoQqAAAACxCqAAAALECoAgAAsAChCgAAwAKEKgAAAAsQqgAAACxAqAIAALAAoQoAAMAChCoAAAALEKoAAAAsQKgCAACwAKEKAADAAoQqAAAACxCqAAAALECoAgAAsAChCgAAwAKEKgAAAAsQqgAAACxAqAIAALAAoQoAAMAChCoAAAALEKoAAAAsQKgCAACwAKEKAADAAicVqqqrq1VYWKgRI0bI6/UqMzNTo0eP1vz58xUIBBJqc9++fXrmmWd09dVXa/DgwUpNTVVqaqry8/N17bXX6sMPP+xQOzt37tTMmTOVn58vt9ut3r1765JLLtHy5csT6hcAAEB7DNM0zUQq7t69WxdddJFKS0slSR6PR8FgUH6/X5I0cuRIFRUVKSsrq8Nt7t27V4MGDVJ0lzwej0zTVF1dXeSxW265Rc8//7ycTmeb7bz33nu6+uqr5fP5JEkZGRmqqalRKBSSJN1888166aWXZBhGh/tWVVWlzMxMVVZWKiMjo8P1AABA9+nKz++EjlQFg0FNnjxZpaWl6tu3r95//33V1tbK5/Np6dKlSk9P1+bNmzVt2rS42zVNU+PHj9fixYu1b98+1dbWqqamRtu2bdPll18uSXr55ZdVWFjYZhslJSW65ppr5PP5NHbsWG3fvl2VlZWqrKzUnDlzJEkLFy7U448/nshLBwAAaFNCR6peeukl/fM//7Mk6aOPPtKYMWOalb/++uu67rrrJEkffPCBxo8f36F2KysrtXPnTp133nltlpumqZ/+9KdatWqVvF6vjhw5Irfb3WybG264Qa+++qpyc3NVXFys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dOmll0qS1qxZcxLdAwAAODXEHaqKi4sVCoUkScOHD4+5Xbjs4MGDKi8vT7B7iSsqKtKQIUPkdruVkZGhESNG6I477tCOHTu6vC8AAODbL+5QtX///sj9/v37x9wuuiy6Tlf5+uuvtWvXLnk8Hvl8Pm3dulW//e1vNXz4cC1YsOCE9f1+v6qqqprdAAAAYok7VFVXV0fuezyemNtFl0XX6WznnXeenn76aZWWlsrv96u8vFxVVVVavny5zjjjDAUCAd12221666232m1n7ty5yszMjNwGDhzYRa8AAACcir51M6r/8pe/1O23365BgwZFpk3weDy68sortXHjRuXl5UmS7r77bpmmGbOde++9V5WVlZHb3r17u6L7AADgFBV3qEpPT4/c9/l8MbeLLouu051ycnJ03333SWqavHTz5s0xt3W5XMrIyGh2AwAAiCXuUNWvX7/I/X379sXcLrosuk53i54CYteuXd3YEwAA8G0Sd6gaNmyYHI6malu3bo25XbgsNzdX2dnZCXYPAADg1BB3qPJ4PBo7dqwkadWqVW1uY5qmVq9eLUmaOHHiSXTPehs2bIjcD09QCgAAcLISGqh+0003SZLWrl2rjRs3tipftmxZ5NTajTfeeBLdi097A88lqby8XI888ogkacCAARo5cmRXdAsAAHwHJByqRowYIdM0ddVVV6moqEiSFAqFtGzZMs2YMUNS04zrLdf9KywslGEYMgxDpaWlbbZ/9OjRZrewmpqaZo+3HCj/6quv6sorr9Ty5ct1+PDhyON1dXVasWKFfvjDH0bC3rx58yKnMQEAAE5WQgvtJSUl6Z133lFBQYFKS0s1YcIEeTwehUIh1dfXS5JGjhypJUuWJNSpXr16tfn4rFmzNGvWrMj3DzzwgAoLCyPfB4NBvf3223r77bclSWlpaXK73aqoqFAwGJTUdFXfE088oSlTpiTUNwAAgLYkvHpxXl6etmzZonnz5un3v/+9SkpKlJycrHPOOUfXXnutZs2apZSUFCv7ekIFBQV6+OGH9fHHH6u4uFhlZWWqrKxURkaGBg8erIsvvlgzZ85kLBUAALCcYZ5oIBIkSVVVVcrMzIyENAAAYH9d+fnNoCIAAAALEKoAAAAsQKgCAACwAKEKAADAAoQqAAAACxCqAAAALECoAgAAsAChCgAAwAKEKgAAAAsQqgAAACxA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rLPMTz75xDTNpqtDn376aTM5Obndq0PRNknmBRdcYD7zzDPmzp07I4+XlJSY//RP/xR5s7n++utb1WWfWG/x4sXm448/bn788cfmsWPHIo9XV1ebixYtMnv16mVKMnv37t1q6hj2R+cLBoPm2LFjTUnmmDFj2g1V7A/rhUPVoEGD4q7b2fuDUIUu19jY2OqxQYMGdShUhecxS01NNXft2tWq/JFHHml3HjO07cMPP2y3fObMmZEPjj179jQrY590vdWrV0f2x6uvvtqsjP3R+Z566ilTkjlt2rRm0wS1hf1hvZMJVZ29PxhThS7ndDoTrvvKK69IkqZOnar8/PxW5bNmzZLX61UwGNSSJUsSfp7vmoKCgnbL/+mf/ilyf9OmTc3K2Cdd74c//GHk/tdff92sjP3RuUpKSnTfffcpJydHTz755Am3Z3/YS2fvD0IVThnbt2/Xnj17JEmTJk1qcxuv16sLL7xQkrRmzZou69u3ndvtjtwPz/cmsU+6S3ipLkk644wzIvfZH51vxowZqq2t1RNPPKFevXq1uy37w166Yn8QqnDKiF5kO3rx7JbCZV988UWn9+m74k9/+lPk/ogRIyL32Sddx+/3q7S0VE8//bRuuOEGSdLgwYM1efLkyDbsj871wgsvqKioSBMmTNCNN954wu3ZH53ryJEjGjVqlLxer1JTU3X66afr+uuvb/Z+Fa0r9gehCqeM/fv3R+73798/5nbhsqqqKtXU1HR6v77tKioqNHfuXEnShRdeqKFDh0bK2Cedz+12yzAMud1u5efna9asWTp27JjGjh2roqKiZhMhsz86z759+zR79mylpqbqueee61Ad9kfn8vl8+uyzz5SSkqJQKKSSkhItWbJEBQUFuuWWW9TY2Nhs+67YH4QqnDKqq6sj9z0eT8ztosui6yB+oVBIN9xwgw4cOCCXy6Xf/e53zcrZJ50vNzdXffr0UVpaWuSxgoICPfXUUzrttNOabcv+6DwzZ85UZWWlCgsLdfrpp3eoDvujc/Tr108PPPCA/va3v6m+vl7l5eXy+Xxav369JkyYIElauHCh7rzzzmb1umJ/EKoAxPSv//qvevfddyVJzzzzjM4999xu7tF3T2lpqQ4ePKiamhodOnRI8+bN03//93/rggsu0Jw5c7q7e98Jr776qv74xz/q+9//vv7t3/6tu7vznTdx4kQVFhbqe9/7XuRIrdPp1I9+9COtXr1al19+uaSm96wdO3Z0ad8IVThlpKenR+6HF8tuS3RZdB3E5+6779bTTz8tSXryySd1yy23tNqGfdK1evfurbvuukurVq2SYRj69a9/HQm9EvujMxw+fFh33HGHnE6nXnjhBSUlJXW4Lvuj6zkcDs2bN09S05H2//qv/4qUdcX+IFThlNGvX7/I/X379sXcLlyWkZEhr9fb6f36Nrrnnns0f/58SdLjjz+uO+64o83t2Cfd44ILLtC4ceMkSc8//3zkcfaH9X71q1+prKxMv/jFL3TWWWeppqam2S0QCES2bfkY+6N7DB48WD179pQk7dq1K/J4V+wPQhVOGdFXa0RfxdFSuOzss8/u9D59G82ePVuPP/64JOmxxx7T3XffHXNb9kn3CQ+m/fvf/x55jP1hvZKSEknSggULlJ6e3uoWvohDUuSxe+65RxL7w266Yn8QqnDKGDp0aGRg7qpVq9rcpra2NjKHz8SJE7usb98Wd999d+TQ+WOPPabZs2e3uz37pPuE/wOPPj3B/rAX9kf32Llzp44ePSpJzSb47JL9Efcc7EAniHeZGo/HY5aUlLQqf/TRR1nyIUF33XVXZLmNefPmdbge+8RajY2NZigUanebDz74wDQMw5Rk3nPPPc3K2B9dq6PL1LA/rHGiv41QKGT+4z/+Y2TB5S+//LJZeWfvD0IVukV5ebl55MiRyG3gwIGmJHP27NnNHq+urm5WL3oxzLPPPtvctGmTaZpNi2E+88wzZkpKCouTJuCee+6JfDA88cQTcdVln1irpKTEPPfcc81nn33W3LlzZ7MPkT179phz584109LSTElmdna2eeDAgWb12R9d60Shiv1hrZKSEnP06NGt/j6CwaD58ccfm5dccklkf7T1M+3s/UGoQrcIH5k60e2mm25qVXfTpk1mTk5OZJv09PTIyuKSzIkTJ5r19fVd/6JOUbt374787BwOh9mnT592b48//nirNtgn1ikpKWn2N5CSkmL27NkzEqTCt/z8fPOzzz5rsw32R9c5UagyTfaHlVr+fbhcLrNnz56my+Vq9vjNN99sNjQ0tNlGZ+4PxlThlDNq1Cht27ZNd955p84880w1NDQoLS1N48aN0wsvvKCVK1c2m2Ua7QuFQs3uHzp0qN1bWzMMs0+s069fP7355pu67bbbNGrUKPXs2VNVVVUKhUI67bTTNHnyZL344ovatm2bRo4c2WYb7A97YX9Yp0+fPvrd736n6667TmeffbYyMjJUUVGh5ORknXXWWbrlllu0bt06vfzyyzGnv+jM/WGYpmmezAsEAAAAV/8BAABYglAFAABgAUIVAACABQhVAAAAFiBUAQAAWIBQBQAAYAFCFQAAgAUIVQAAABYgVAEAAFiAUAWg2wSDQT3xxBMaOXKk0tLSZBiGDMPQihUrurtrABC3thfGAYAucMcdd+jpp5+WJKWkpKhPnz6SJLfb3Z3dAoCEsPYfgG5RXV2tnJwcNTQ06LHHHtPdd98twzC6u1sAkDBCFYBu8cknn+iCCy6Q1BSwvF5vN/cIAE4OY6oAdAufzxe5T6AC8G1AqALQpRYtWiTDMHTRRRdFHgsPUI9+PC8vT4ZhaNGiRaqpqdGcOXM0YsQIpaenyzAMlZaWNmt38+bNuuWWW3TGGWfI4/HI6/Xq3HPP1f3336+jR4+226cNGzboiiuuUM+ePZWamqqhQ4fqvvvuU01NTaS/eXl5J/W6/X6/Ro4cKcMwdMEFF6ihoaHN7aZMmSLDMNSvX78T9huAvRCqAHSp1NRU9enTR1lZWZHH+vTpE7llZ2c3276srEyjRo3Sr3/9a3311VdKSmp9fc0DDzygUaNGaeHChdq1a5cMw1BDQ4O2bNmihx9+WN/73ve0efPmNvvz8ssva+zYsfrDH/6gsrIyuVwulZaW6pFHHtHo0aN17NgxS163y+XS0qVLlZaWpk8++UT/+3//71bbvPjii3rzzTflcDj0n//5n+rZs6clzw2gi5gA0A3Wrl1rSjJjvQ0NGjTIlGR6vV4zNzfX/P3vf28GAgHTNE1z7969Zm1trWmapvnkk0+aksz09HRz7ty55oEDB0zTNM3GxkZz06ZN5sUXX2xKMgcMGGBWV1c3e45PP/3UTEpKMiWZF110kVlcXGyapmkGAgHz9ddfN3v06GH26NHDlGQOGjTIktf90ksvmZJMwzDM1atXRx4vLi42PR6PKcn8X//rf1nyXAC6FqEKQLfoaKhyOp3mZ5991uY2R44cMT0ej2kYhvnBBx+0uU1DQ4M5atQoU5L55JNPNiubNGmSKckcMmSI6fP5WtVdtWpVpI9WhSrTNM2pU6eaksw+ffqYhw4dMuvr681zzz3XlGRecMEFkfAI4NTC6T8AtnbppZdq5MiRbZYtWbJEPp9P559/vsaPH9/mNklJSbr22mslSatXr448XlFREfl+9uzZSk1NbVX3kksu0ZgxY072JbTy3HPPKT8/X4cOHdJNN92ku+++W3/729+Unp6u119/XcnJyZY/J4DOx+SfAGxt7NixMcvWrVsnSdq6datyc3NjbldXVydJ2r17d+Sxzz77TKFQSJJ08cUXx6x78cUX6+OPP46rzyeSkZGh119/XePGjdOqVasijy9YsECnn366pc8FoOsQqgDYWu/evWOW7d+/X1JTaAoHp/ZET+Nw+PDhyP3+/fvHrDNgwICOdDNuP/jBD/Sv//qvmj9/vqSmq/6mTZvWKc8FoGtw+g+ArTmdzphlwWBQkvQv//IvMpvGiLZ7azkNQ3eqqKjQsmXLIt9/9tlnqqmp6cYeAThZhCoAp6zwKb/PP/887rrRR8D27dsXc7v2yk7GjBkztGfPHvXv3185OTnasWOH/uf//J+d8lwAugahCsApKzzeasOGDc3GS3XEeeedJ4ej6S1w7dq1Mbf78MMPE+9gDC+88ILeeuutyHxUL730kiRp8eLFev311y1/PgBdg1AF4JR1ww03KDU1VcFgULfffnvkdGBbQqGQKioqIt/36NFDEydOlCTNmzdP9fX1rep88MEH+uijjyzt85dffqk77rhDkvSrX/1KBQUFuvzyy3XbbbdJajqVWVJSYulzAugahCoAp6zc3Fz95je/kST98Y9/1E9+8hOtX78+Eq5M09SXX36pJ554QsOHD9e7777brP6vf/1rOZ1Offnll/rZz36m7du3S5IaGxv15ptv6pprrlGPHj0s66/f79fUqVPl8/n0gx/8QA899FCkbP78+Ro+fLiqqqp07bXXqrGx0bLnBdA1CFUATmm//OUv9dhjj8npdGrt2rUaN26cPB6PevbsKZfLpWHDhumuu+5ScXGxDMNoVvf888/XM888I8Mw9OGHH+qss85Sjx495PV6NWXKFPXp00dz5syxrK+zZ8+OzEf12muvNVtyx+12a+nSpUpNTdXGjRv1wAMPWPa8ALoGoQrAKW/27Nn68ssvdeedd+p73/ue3G63Kioq5PV6NXr0aN1zzz366KOPdN1117Wq+4tf/ELr16/X5MmTlZ2dLb/fr0GDBunee+/VX//612ZrFJ6MP/7xj/rd734nSXrmmWfanI/qnHPOiUyx8Jvf/KbdsV4A7McwTdPs7k4AgF0tWrRIN998swYNGmSrKRkA2A9HqgAAACxAqAIAALAAoQoAAMACrP0HAHHYu3evRo8eHVedgQMH6pNPPumkHgGwCwaqA0AcSktLlZ+fH1cdBrkD3w2EKgAAAAswpgoAAMAChCoAAAALEKoAAAAsQKgCAACwAKEKAADAAoQqAAAACxCqAAAALECoAgAAsAChCgAAwAL/H7SO4i/HbIxLAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig = plt.figure()\n", + "ax = fig.gca()\n", + "\n", + "abs(dataWithModulationFFT).plot.errorbar(ax=ax, x='freq_x')\n", + "ax.set_xlim([0.5, 50])\n", + "ax.set_ylim([0, 0.25])\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Without Modulation" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.DataArray 'CH1' (x: 1200)>\n",
+       "array([0.59 , 0.74 , 0.75 , ..., 0.744, 0.738, 0.586])\n",
+       "Coordinates:\n",
+       "  * x        (x) float64 0.0 0.002 0.004 0.006 0.008 ... 2.392 2.394 2.396 2.398
" + ], + "text/plain": [ + "\n", + "array([0.59 , 0.74 , 0.75 , ..., 0.744, 0.738, 0.586])\n", + "Coordinates:\n", + " * x (x) float64 0.0 0.002 0.004 0.006 0.008 ... 2.392 2.394 2.396 2.398" + ] + }, + "execution_count": 63, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "filePath = r'F:\\Jianshun\\AccordionLatticeShorTermStability\\withoutModulation.csv'\n", + "\n", + "data = read_csv_file(filePath, csvEngine='pandas', csvKwargs=dict(header=[0], skiprows=[1], encoding = \"ISO-8859-1\",))\n", + "dataWithoutModulation = xr.DataArray(\n", + " data=data.CH1[0,:],\n", + " dims=['x'],\n", + " coords=dict(\n", + " x=data.X[0,:].to_numpy() * 2e-3\n", + " )\n", + ")\n", + "dataWithoutModulation" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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6qsCACE0NFTIzs42W/7WW28JAAR/f3/h+PHjdn8GNXLleefNzbK6ujqz99q2beuUoILXu2WuPO+83q375ZdfrC6fMWOG4bvm7NmzivbNa94yV553V17zbDOnUsuWLQOgm4FiwIABZsvHjx9vmHXi888/V7Rv/frifYg9/fTTiIiIQH19veLp09TOleedLPP393fZvnm9W+bK807WJScnW13+yCOPGF6np6cr2jevectced5dicGcClVUVGDnzp0AgFGjRkmuo9FoMHLkSADApk2bZO/7+PHjOHv2rNV9R0REYPDgwYr3rXauPO/kGbzeSa1CQkIMr/XzgMvBa94x9p53V2Mwp0JZWVnQarUAgISEBIvr6ZcVFBSgqKhI1r4zMjLMtre276NHj8rab0PgyvMulpmZiYSEBISGhiIiIgJdunTBtGnTcPDgQfsKThbxevc8Xu/22bZtm+G1pbnDpfCad4y9513MFdc8gzkVys/PN7xu3bq1xfXEy8TbOHPfpaWluHbtmqx9q50rz7vY5cuXkZWVhbCwMFRXV+PEiRNYsmQJ+vbti1dffVXx/sgyXu+ex+tdueLiYsybNw8AMHjwYHTp0kX2trzm7efIeRdzxTXPYE6FysrKDK/DwsIsrideJt7GU/tWO1efm06dOuHdd9/F8ePHUVVVhStXrqC8vBwbN25E3759IQgC5s6diwULFtj3AcgMr3fP4fVuH61Wi4cffhgXLlxAcHAwPvjgA0Xb85q3j6PnHXDtNc9gjshLTJgwATNnzkTnzp0RGBgIAAgKCsKIESOwY8cOJCUlAdANPFlSUuLJohI5jNe7ff72t7/hxx9/BAB89NFH6NWrl4dL5Buccd5dec0zmFOhyMhIw+uKigqL64mXibfx1L7VzpPnJiQkBG+99RYA4Nq1a0hLS3PKfn0dr3fvxOtd2gsvvIAPP/wQAPDPf/4TU6dOVbwPXvPKOeO82+LoNc9gToVatWpleH3+/HmL64mXibdx5r6joqIQEREha99q58rzLod4KJTs7Gyn7deX8Xr3Xrzejb344ouG6rf33nsPzzzzjF374TWvjLPOuxyOXPMM5lSoW7du8PPT/erEPZNM6ZfFxsaicePGsvYt7t0kZ9/du3eXtd+GwJXnnTyD1zupwcyZM/Hee+8BAN5991288MILdu+L17x8zjzvrsZgToXCwsIwcOBAAMCGDRsk1xEEARs3bgQAjBgxQva+u3TpgptuusnqvsvLy7F9+3bF+1Y7V553Ofbs2WN4LTXQJynH69178XrXeeGFFzB//nwAuoBi5syZDu2P17w8zj7vcjh0zTt9TglyC/20UhqNRtizZ4/Z8lWrVjk8nVdYWJjkhL/vvPOOz0714qrzrtVqrS6vqqoS+vXrJwAQwsPDhatXryoteoPj7Om8eL3L44zzzutdnueff97wfTJ//nyn7ZfXvHWuOO+uvuYZzKlUbW2tYcL31q1bGwKH+vp6YfXq1UJUVJTFCd/188MBkPxDFk/C3L17dyE9PV0QBN0kzB999JEQFBTks5Mwu+q8b9u2TRg2bJjwxRdfCOfOnTO8X1NTI2zZskVISkoybPvOO++49DN6q6KiIuHSpUuGn7i4OAGAMHPmTKP3y8rKjLbj9e4YV5x3Xu+2vfjii4ZzsHDhQkXb8pq3n6vOu6uveQZzKnbmzBkhPj7ecAGEhYUJISEhhv/37t1bKCoqMtvO1h+6IAhCenq60KRJE8N6kZGRQmBgoOH/I0aMEKqqqlz8Cb2TK8771q1bDctwfQLspk2bGp1zPz8/4eWXX3bTp/Q++oyQrZ9JkyYZbcfr3TGuOO+83q3Lzc01Og8tWrSw+vPee+8Zbc9r3j6uPO+uvuYDQKoVHx+Pw4cPY/78+Vi3bh3OnDmDwMBA9OjRA3/5y1/w9NNPIygoyK599+3bF5mZmXjnnXfw448/4ty5cwgPD0dCQgImTZqEqVOnGjoD+BpXnPfExETMnz8fu3fvxpEjR3D58mUUFxcjLCwM3bt3x+DBgzF9+nS7p48h63i9uxevd+v00wbqX1+8eNHq+vbM0MBr3pwrz7urr3mNIAiCXVsSERERkcf5VthNRERE1MAwmCMiIiJSMQZzRERERCrGYI6IiIhIxRjMEREREakYgzkiIiIiFWMwR0RERKRiDOaIiIiIVIzBHBEREZGKMZgjIiIiUjEGc0REREQqxmCOiIiISMUYzBERERGpGIM5IiIiIhVjMEdERESkYgzmiIjc4J133oFGo0FQUBD27dsnuc7PP/8MPz8/aDQarFixws0lJCK10giCIHi6EEREDZ0gCBgxYgS2bNmC9u3b448//kBkZKRh+YULF9CrVy9cunQJEydOxLJlyzxYWiJSEwZzRERuUlBQgF69eqGwsBAPPvggli9fDsA40OvYsSMOHjyIiIgID5eWiNSC1axERG4SGxuLpUuXGqpR9dm3d955B1u2bEFgYCC++uorBnJEpAgzc0REbvb8889j4cKFiIiIwKJFizB16lTU1tbivffewwsvvODp4hGRyjCYIyJys5qaGtx2223Yv3+/4b0RI0Zgw4YN0Gg0HiwZEakRgzkiIg/IyMhAYmIiACA6OhrHjh1DbGysh0tFRGrENnNERB7w8ccfG16Xlpbijz/+8FxhiEjVmJkjInKzH3/8EaNHjwYA9OzZE4cPH0bz5s1x+PBhtGjRwsOlIyK1YWaOiMiNLly4gClTpgAApkyZgt9++w3x8fEoLCzEpEmTwOdrIlKKwRwRkZtotVo8/PDDuHz5Mjp16oQPPvgA0dHRWLFiBQICArBx40YsXLjQ08UkIpVhMEdE5Cbvvvsu0tLSDOPJhYeHAwAGDBiA119/HQDw8ssv48CBA54sJhGpDNvMERG5wb59+zBo0CCL48lptVoMGzYM27ZtQ+fOnXHgwAFDsEdEZA2DOSIiFysrK8PNN9+M7Oxs3Hnnndi4caPkeHJ5eXno1asXioqKMHnyZHz22WceKC0RqQ2DOSIiIiIVY5s5IiIiIhVjMEdERESkYgzmiIiIiFSMwRwRERGRijGYIyIiIlIxBnNEREREKsZgjoiIiEjFGMwRERERqRiDOSIiIiIVYzBHREREpGIM5oiIiIhUjMEcERERkYoxmCMiIiJSsf8H0W98JlwTM54AAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "dataWithoutModulation.plot.errorbar()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": {}, + "outputs": [], + "source": [ + "dataWithoutModulationFFT = fft(dataWithoutModulation)" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAl0AAAHPCAYAAABpxG/+AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAA9hAAAPYQGoP6dpAACaUUlEQVR4nO3deXwU9fkH8M/uZnNsNgnhDDeoEEAQMYAiUEAQpGi1WgWPelatWg8EbbEeWKu2Ctr+ijdW0aJUvIrIJYgKKDdyH3IEEAhHQs7Nscf8/tjM5DuzM7Mzm2QT4PN+vXwZdndmZ8959vk+3+frkCRJAhERERHVK2dDHwARERHRmYBBFxEREVEcMOgiIiIiigMGXURERERxwKCLiIiIKA4YdBERERHFAYMuIiIiojhg0EVEREQUBwy6iIiIiOKAQRcRERFRHNQq6CopKcHkyZPRq1cveL1eZGRkoF+/fpg6dSqqqqpqdWBHjx7FhAkTkJ2djZSUFDRt2hSDBw/G9OnTYbZy0a233gqHwxH1v0AgUKvjIyIiIrLDEevai/v378fQoUORm5sLAPB4PAgGg6isrAQA9OnTB0uWLEFmZqbtfa9btw6jRo1Cfn4+AMDr9aKiokIJlEaOHIk5c+YgKSkpYttbb70VM2bMQHJyMjIyMgzv49ChQ3C5XLaPjYiIiCgWMWW6gsEgrrjiCuTm5qJ169b46quvUFZWBp/Ph1mzZiEtLQ0bNmzAjTfeaHvfRUVFuPzyy5Gfn49u3bphzZo1KCkpQVlZGaZNmwa3241FixZh/PjxpvsZO3Ys8vLyDP9jwEVERETxFFPQ9e6772Lz5s0AgE8++QQjRowI78zpxNixY/HGG28AAObPn48lS5bY2veUKVOQl5eHlJQUzJs3D3379gUAJCYm4r777sPTTz8NAHjzzTexa9euWA6fiIiIKO5iCrpmzJgBABg2bBgGDBgQcf24cePQuXNnAMB7771na9/y7cV9iO6//354vV4Eg0HMnDnT7qETERERNQjbQZfP58OKFSsAAKNHj9a9jcPhwGWXXQYAWLRokeV979y5EwcOHDDdt9frxeDBg23vm4iIiKgh2Q66tm/fjlAoBADo2bOn4e3k6/Ly8lBQUGBp31u2bInY3mzf27ZtM7zNkiVL0LVrVyQnJyM9PR29evXCQw89hJ9++snSsRARERHVpQS7Gxw+fFj5u23btoa3E687fPgwmjZtWuf7Li4uRmlpKbxeb8Rtfv75Z7hcLqSnp6O4uBhbtmzBli1b8Nprr+Ef//gH7rnnHtNjqaysVGZiAkAoFEJBQQGaNWsGh8MR9bEQERFRw5MkCSUlJWjTpg2czoZtT2o76CopKVH+9ng8hrcTrxO3qY99i0HXBRdcgH79+uHyyy9Hu3bt4HK54PP5sGDBAjz66KPYs2cP7r33XrRo0QK/+c1vDO/j+eefV4r2iYiI6NR28OBBtGvXrkGPwXbQ1dg98MADEZd5PB5cffXVGDJkCPr27Yvc3FxMnDgR11xzjWHWatKkSXj44YeVfxcVFaFDhw44ePAg0tPT6+34iYiIqO4UFxejffv2SEtLa+hDsR90iQft8/kMbydeZ/WBavdtFNzEsm8AaNasGf785z/jzjvvxP79+7FhwwZccMEFurdNSkrSbb6anp7OoIuIiOgU0xhKg2wPbrZp00b5+9ChQ4a3E68Tt6nLfaenp+vWc5kRW1zs3bvX1rZEREREsbIddHXv3l0pRBNnG2rJ12VlZVkqogfUMxat7LtHjx6W9ktERETU0GwHXR6PBwMHDgQALFiwQPc2kiRh4cKFAMLrJFqVnZ2NDh06mO67rKwMy5Yts71v2cqVK5W/9ZqvEhEREdWHmOZO3nLLLQCApUuXYtWqVRHXz549Wxm6u/nmm23tW779rFmzlMW0Ra+88gpKS0vhcrki1naMtnZ3QUEBnnvuOQBAu3bt0KdPH1vHRkRERBSrmIOuXr16QZIkXHPNNcr6iqFQCLNnz8add94JINxVfvjw4aptJ0+eDIfDAYfDoRtUTZw4EVlZWfD5fBgzZgzWrVsHAKiqqsJrr72GJ554AgBw1113oWvXrqpt//Of/+Dqq6/GJ598gmPHjimXl5eX4/PPP8dFF12kBINTpkxp8H4dREREdOaIqWVEQkIC5syZg2HDhiE3NxcjRoyAx+NBKBRCRUUFAKBPnz4xrY2YkZGBuXPnYtSoUdi2bRv69u2LtLQ0VFRUwO/3AwgPK7788ssR2waDQXz22Wf47LPPAACpqalITk5GYWEhgsEggPCsxJdeegljx46N5aETERERxSTmVE+nTp2wadMmPPnkk+jZsyccDgfcbjdycnIwZcoUrFy5EpmZmTHtOycnB1u3bsX48ePRpUsX+P1+pKamYtCgQXjrrbcwf/583XYOw4YNw7PPPovLL78cZ599NtxuN4qKipCeno5+/frhj3/8I7Zv345777031odNREREFBOHFK0QigCEm6tlZGQoQRwRERE1fo3p/M2iJiIiIqI4YNBFREREFAcMuoiIiIjigEEXERERURww6CIiIiKKAwZdRERERHHAoIuIiIgoDhh0EREREcUBgy4iIiKiOGDQRURERBQHDLqIiIiI4oBBFxEREVEcMOgiIiIiigMGXURERERxwKCLiIiIKA4YdBERERHFAYMuIiIiojhg0EVEREQUBwy6iIiIiOKAQRcRERFRHDDoIiIiIooDBl1EREREccCgi4iIiCgOGHQRERERxQGDLiIiIqI4YNBFREREFAcMuoiIiIjigEEXERERURww6CIiIiKKAwZdRERERHHAoIuIiIgoDhh0EREREcUBgy4iIiKiOGDQRURERBQHDLqIiIiI4oBBFxEREVEcMOgiIiIiigMGXURERERxwKCLiIiIKA4YdBERERHFAYMuIiIiojhg0EVEREQUBwy6iIiIiOKAQRcRERFRHDDoIiIiIooDBl1EREREccCgi4iIiCgOGHQRERERxQGDLiIiIqI4YNBFREREFAcMuoiIiIjigEEXERERURww6CIiIiKKAwZdRERERHHAoIuIiIgoDmoVdJWUlGDy5Mno1asXvF4vMjIy0K9fP0ydOhVVVVW1OrCjR49iwoQJyM7ORkpKCpo2bYrBgwdj+vTpkCTJ9v5Gjx4Nh8MBh8OBoUOH1urYiIiIiOxySLFEMAD279+PoUOHIjc3FwDg8XgQDAZRWVkJAOjTpw+WLFmCzMxM2/tet24dRo0ahfz8fACA1+tFRUUFAoEAAGDkyJGYM2cOkpKSLO3v3XffxW233ab8e8iQIfjmm29sHVNxcTEyMjJQVFSE9PR0W9sSERFRw2hM5++YMl3BYBBXXHEFcnNz0bp1a3z11VcoKyuDz+fDrFmzkJaWhg0bNuDGG2+0ve+ioiJcfvnlyM/PR7du3bBmzRqUlJSgrKwM06ZNg9vtxqJFizB+/HhL+8vLy8PDDz+MJk2aoHv37raPh4iIiKguxBR0vfvuu9i8eTMA4JNPPsGIESPCO3M6MXbsWLzxxhsAgPnz52PJkiW29j1lyhTk5eUhJSUF8+bNQ9++fQEAiYmJuO+++/D0008DAN58803s2rUr6v7uvfdenDx5Ei+++CJatmxp61iIiIiI6kpMQdeMGTMAAMOGDcOAAQMirh83bhw6d+4MAHjvvfds7Vu+vbgP0f333w+v14tgMIiZM2ea7uujjz7CZ599hiFDhuCOO+6wdRxEREREdcl20OXz+bBixQoA4eJ0PQ6HA5dddhkAYNGiRZb3vXPnThw4cMB0316vF4MHD4667/z8fNx///1ISkrCm2++CYfDYfk4iIiIiOqa7aBr+/btCIVCAICePXsa3k6+Li8vDwUFBZb2vWXLlojtzfa9bds2w9s88MADOHbsGJ544gl07drV0v0TERER1ZcEuxscPnxY+btt27aGtxOvO3z4MJo2bVrn+y4uLkZpaSm8Xq/q+i+++AIffPABevbsiUcffTTq/eqprKxUZmLK90VEREQUK9uZrpKSEuVvj8djeDvxOnGb+t53UVER7rnnHjidTrz11ltwu92W7lvr+eefR0ZGhvJf+/btY9oPEREREXAadqSfMGECDh06hHvvvRcXXXRRzPuZNGkSioqKlP8OHjxYh0dJREREZxrbw4tpaWnK3z6fz/B24nXiNnb2bdTEzGjfixcvxttvv4127drhueees3SfRpKSkiw3XyUiIiKKxnamq02bNsrfhw4dMrydeJ24TV3uOz09XVXPdeeddwIAXnjhBTgcDpSWlqr+CwaDAMLNXbWXEREREdUn20FX9+7d4XSGNxNnG2rJ12VlZVkqogfUMxat7LtHjx6qy+UliW644QakpaVF/Ld8+XIAwPLly5XLvvjiC0vHRkRERFQbtoMuj8eDgQMHAgAWLFigextJkrBw4UIA4XUSrcrOzkaHDh1M911WVoZly5bZ3jcRERFRQ4qpkP6WW24BACxduhSrVq2KuH727NnYu3cvAODmm2+2tW/59rNmzVIyV6JXXnkFpaWlcLlcEWs7SpJk+t+QIUMAhBe8li+76qqrbB0fERERUSxiDrp69eoFSZJwzTXXKOsrhkIhzJ49W6mtGj16NIYPH67advLkyXA4HHA4HLpB1cSJE5GVlQWfz4cxY8Zg3bp1AICqqiq89tpreOKJJwAAd911F5ueEhER0SnD9uxFAEhISMCcOXMwbNgw5ObmYsSIEfB4PAiFQqioqAAA9OnTJ+raiHoyMjIwd+5cjBo1Ctu2bUPfvn2RlpaGiooK+P1+AOFhxZdffjmWQyciIiJqEDH36erUqRM2bdqEJ598Ej179oTD4YDb7UZOTg6mTJmClStXIjMzM6Z95+TkYOvWrRg/fjy6dOkCv9+P1NRUDBo0CG+99Rbmz5/Pdg5ERER0SnFIkiQ19EGcCoqLi5GRkYGioiLD/mFERETUuDSm8/dp15GeiIiIqDFi0EVEREQUBwy6iIiIiOKAQRcRERFRHDDoIiIiIooDBl1EREREccCgi4iIiCgOGHQRERERxQGDLiIiIqI4YNBFREREFAcMuoiIiIjigEEXERERURww6CIiIiKKAwZdRERERHHAoIuIiIgoDhh0EREREcUBgy4iIiKiOGDQRURERBQHDLqIiIiI4oBBFxEREVEcMOgiIiIiigMGXURERERxwKCLiIiIKA4YdBERERHFAYMuIiIiojhg0EVEREQUBwy6iIiIiOKAQRcRERFRHDDoIiIiIooDBl1EREREccCgi4iIiCgOGHQRERERxQGDLiIiIqI4YNBFREREFAcMuoiIiIjigEEXERERURww6CIiIiKKAwZdRERERHHAoIuIiIgoDhh0EREREcUBgy4iIiKiOGDQRURERBQHDLqIiIiI4oBBFxEREVEcMOgiIiIiigMGXURERERxwKCLiIiIKA4YdBERERHFAYMuIiIiojhg0EVEREQUBwy6iIiIiOKAQRcRERFRHDDoIiIiIooDBl1EREREccCgi4iIiCgOahV0lZSUYPLkyejVqxe8Xi8yMjLQr18/TJ06FVVVVbU6sKNHj2LChAnIzs5GSkoKmjZtisGDB2P69OmQJMlwuy+++AITJ07EsGHDcPbZZyM9PR2JiYlo06YNRo8ejXfeeQeBQKBWx0ZERERkl0Myi2BM7N+/H0OHDkVubi4AwOPxIBgMorKyEgDQp08fLFmyBJmZmbb3vW7dOowaNQr5+fkAAK/Xi4qKCiVYGjlyJObMmYOkpKSIbXv27ImtW7cq/05LS4Pf70dFRYVy2QUXXIB58+ahVatWlo+puLgYGRkZKCoqQnp6uu3HRERERPHXmM7fMWW6gsEgrrjiCuTm5qJ169b46quvUFZWBp/Ph1mzZiEtLQ0bNmzAjTfeaHvfRUVFuPzyy5Gfn49u3bphzZo1KCkpQVlZGaZNmwa3241FixZh/Pjxutv/5je/wZtvvomtW7fC5/OhuLgY5eXlOHToEJ5++mk4nU6sX78et9xySywPnYiIiCg2UgymT58uAZAASN9//33E9R988IFy/eLFi23t+/HHH5cASCkpKdLevXsjrn/uueckAJLL5ZJ27txp+9gnTZqkHNvBgwctb1dUVCQBkIqKimzfJxERETWMxnT+jinTNWPGDADAsGHDMGDAgIjrx40bh86dOwMA3nvvPVv7lm8v7kN0//33w+v1IhgMYubMmXYPHRdddJHy96FDh2xvT0RERBQL20GXz+fDihUrAACjR4/WvY3D4cBll10GAFi0aJHlfe/cuRMHDhww3bfX68XgwYNt71u2bNky5e+zzjrL9vZEREREsbAddG3fvh2hUAhAuGjdiHxdXl4eCgoKLO17y5YtEdub7Xvbtm2W9ltaWootW7bg0UcfxdSpUwEAN998M1q0aGFpeyIiIqLaSrC7weHDh5W/27Zta3g78brDhw+jadOmdb7v4uJilJaWwuv1Rtxm5cqVukOfLpcLt9xyC6ZNm2Z6LJWVlcpMTPm+iIiIiGJlO9NVUlKi/O3xeAxvJ14nbhOvfScmJqJVq1Zo1aoV3G63cvndd9+Np556CikpKabH8vzzzyMjI0P5r3379pYeAxEREZGe07Yj/QUXXIC8vDzk5eWhoqICP/30E+699168/vrrOPfcczFnzhzT7SdNmoSioiLlv4MHD8bpyImIiOh0ZDvoSktLU/72+XyGtxOvE7dpiH07nU6cc845eOWVV/Diiy+itLQUN954I44cOWK4TVJSEtLT01X/EREREcXKdtDVpk0b5W+zlgvideI2dbnv9PR03XouM/feey+SkpJQWlqKDz/80Na2RERERLGyHXR1794dTmd4M3G2oZZ8XVZWlqUiekA9Y9HKvnv06GFpv6Lk5GTleHbv3m17eyIiIqJY2A66PB4PBg4cCABYsGCB7m0kScLChQsBhNdJtCo7OxsdOnQw3XdZWZnSa8vOvmUlJSU4fvw4AOvDnkRERES1FVMhvbxu4dKlS7Fq1aqI62fPno29e/cCCPfDskO+/axZs5TFtEWvvPIKSktL4XK5ItZ2lBfENvPiiy8qtxs6dKitYyMiIiKKVcxBV69evSBJEq655hosWbIEABAKhTB79mzceeedAMJd5YcPH67advLkyXA4HHA4HLpB1cSJE5GVlQWfz4cxY8Zg3bp1AICqqiq89tpreOKJJwAAd911F7p27aradubMmfjVr36FTz/9FMeOHVMuD4VC2LRpE+666y4888wzAICBAwcqXfOJiIiI6pvt5qgAkJCQgDlz5mDYsGHIzc3FiBEj4PF4EAqFUFFRAQDo06dPTGsjZmRkYO7cuRg1ahS2bduGvn37Ii0tDRUVFfD7/QDCw4ovv/xyxLaSJOGLL77AF198AQBITU1FSkoKiouLUVVVpdzukksuwezZs+FwOGJ5+ERERES2xdynq1OnTti0aROefPJJ9OzZEw6HA263Gzk5OZgyZQpWrlyJzMzMmPadk5ODrVu3Yvz48ejSpQv8fj9SU1MxaNAgvPXWW5g/fz6SkpIithszZgzefPNN3HDDDTj33HORkpKCkydPIjExEd26dcNvf/tbfPnll1iyZInl4n4iIiKiuuCQJElq6IM4FRQXFyMjIwNFRUXs2UVERHSKaEzn79O2Iz0RERFRY8Kgi4iIiCgOGHQRERERxQGDLiIiIqI4YNBFREREFAcMuoiIiIjigEEXERERURww6CIiIiKKAwZdRERERHHAoIuIiIgoDhh0EREREcUBgy4iIiKiOGDQRURERBQHDLqIiIiI4oBBFxEREVEcMOgiIiIiigMGXURERERxwKCLiIiIKA4YdBERERHFAYMuIiIiojhg0EVEREQUBwy6iIiIiOKAQRcRERFRHDDoIiIiIooDBl1EREREccCgi4iIiCgOGHQRERERxQGDLiIiIqI4YNBFREREFAcMuoiIiIjigEEXERERURww6CIiIiKKAwZdRERERHHAoIuIiIgoDhh0EREREcUBgy4iIiKiOGDQRURERBQHDLqIiIiI4oBBFxEREVEcMOgiIiIiigMGXURERERxwKCLiIiIKA4YdBERERHFAYMuIiIiojhg0EVEREQUBwy6iIiIiOKAQRcRERFRHDDoIiIiIooDBl1EREREccCgi4iIiCgOGHQRERERxQGDLiIiIqI4YNBFREREFAcMuoiIiIjigEEXERERURzUKugqKSnB5MmT0atXL3i9XmRkZKBfv36YOnUqqqqqanVgR48exYQJE5CdnY2UlBQ0bdoUgwcPxvTp0yFJkuF2u3fvxksvvYQrrrgCHTt2RFJSElJTU9G1a1fccccdWLduXa2Oi4iIiCgWDsksgjGxf/9+DB06FLm5uQAAj8eDYDCIyspKAECfPn2wZMkSZGZm2t73unXrMGrUKOTn5wMAvF4vKioqEAgEAAAjR47EnDlzkJSUpNpuxYoVGDRokOqytLQ0VFZWKkGg0+nEn//8Z/zlL3+xdUzFxcXIyMhAUVER0tPTbT8mIiIiir/GdP6OKdMVDAZxxRVXIDc3F61bt8ZXX32FsrIy+Hw+zJo1C2lpadiwYQNuvPFG2/suKirC5Zdfjvz8fHTr1g1r1qxBSUkJysrKMG3aNLjdbixatAjjx4+P2Nbv98PlcuGqq67C7NmzceLECRQXF8Pn82H16tUYNGgQQqEQnnnmGbz99tuxPHQiIiKi2EgxmD59ugRAAiB9//33Edd/8MEHyvWLFy+2te/HH39cAiClpKRIe/fujbj+ueeekwBILpdL2rlzp+q6gwcPSrt27TLcd2VlpXTeeedJAKSzzz7b1nEVFRVJAKSioiJb2xEREVHDaUzn75gyXTNmzAAADBs2DAMGDIi4fty4cejcuTMA4L333rO1b/n24j5E999/P7xeL4LBIGbOnKm6rl27dujSpYvhvhMTE3HTTTcBAPbs2YOTJ0/aOjYiIiKiWNkOunw+H1asWAEAGD16tO5tHA4HLrvsMgDAokWLLO97586dOHDggOm+vV4vBg8ebHvfsuTkZOXvYDBoe3siIiKiWNgOurZv345QKAQA6Nmzp+Ht5Ovy8vJQUFBgad9btmyJ2N5s39u2bbO0X9E333wDAGjdujWaNWtme3siIiKiWCTY3eDw4cPK323btjW8nXjd4cOH0bRp0zrfd3FxMUpLS+H1eqPuGwB++OEHfP755wCA3/3ud3A4HIa3raysVGZiyvdFREREFCvbma6SkhLlb4/HY3g78Tpxm4ba9/Hjx3H99dcjFAqhS5cuePTRR01v//zzzyMjI0P5r3379pbuh4iIiEjPGdGRvrS0FL/61a+wf/9+pKWlYfbs2VGzY5MmTUJRUZHy38GDB+N0tERERHQ6sj28mJaWpvzt8/kMbydeJ25jZ99GTczs7LusrAxjxozBypUr4fV6MW/ePPTu3TvqsSQlJUU0XyUiIiKKle1MV5s2bZS/Dx06ZHg78Tpxm7rcd3p6umnGSg64vvvuO6SmpuLLL7+M6FhPREREFA+2g67u3bvD6QxvJs421JKvy8rKslRED6hnLFrZd48ePQxvIwdc3377LTweD7788kv84he/sHQcRERERHXNdtDl8XgwcOBAAMCCBQt0byNJEhYuXAggvE6iVdnZ2ejQoYPpvsvKyrBs2TLTfZeVleGXv/wlvv32W6SmpmLevHkYMmSI5eMgIiIiqmsxFdLfcsstAIClS5di1apVEdfPnj0be/fuBQDcfPPNtvYt337WrFnKYtqiV155BaWlpXC5XLprO8oBlzykyICLiIiIGoOYg65evXpBkiRcc801WLJkCQAgFAph9uzZuPPOOwGEu8oPHz5cte3kyZPhcDjgcDh0g6qJEyciKysLPp8PY8aMwbp16wAAVVVVeO211/DEE08AAO666y507dpVta3P58Pll1+O7777Dl6vF/Pnz+eQIhERURRrcgtwsMB4chzVDduzFwEgISEBc+bMwbBhw5Cbm4sRI0bA4/EgFAqhoqICANCnT5+ItRGtyMjIwNy5czFq1Chs27YNffv2RVpaGioqKuD3+wGEhxVffvnliG0//vhjpeN8IBDAtddea3pfn376KS6++GLbx0hERHS62H6kGNe+/gMAIPdvYxr4aE5vMQVdANCpUyds2rQJU6ZMwaeffop9+/bB7Xbj3HPPxfXXX4/7778fiYmJMe07JycHW7duxd///nfMnTsXBw8eRGpqKnr27IlbbrkFt99+u1LML5KXJwKAiooKJQA0UlVVFdPxERERnS42/VzY0IdwxnBIkiQ19EGcCoqLi5GRkYGioiLD/mFERESnmv+uOYA/frIZwOmZ6WpM5+8zoiM9ERERUUNj0EVERHQGc8DR0IdwxmDQRURERBQHDLqIiIiI4oBBFxEREVEcMOgiIiIiigMGXURERERxwKCLiIjoTMbJi3HDoIuIiIgoDhh0EREREQCAi9TULwZdREREBAAIMeaqVwy6iIiICAAQ1ERd/mCogY7k9MSgi4iIiAAAIWF48ceDhch+fD6mff1TAx7R6YVBFxEREQFQB11P/m8LQhIwZdGuBjyi0wuDLiIiojOY2DGCNV31i0EXERERAYis6aK6xaCLiIiIALBlRH1j0EVEREQAmOmqbwy6iIiIzmBimMWYq34x6CIiIjqDhYRIK8ThxXrFoIuIiOgMJma3GHTVLwZdREREZzAx0GJNV/1i0EVERHQGE4MuJrrqF4MuIiKiM5hY08VMV/1i0EVERHQGY01X/DDoIiIiOoOJgRaDrvrFoIuIiCiOGlvXd3XQ1YAHcgZg0EVERHHnqwrg213HURUINfSh1IlCXxWe/mIrthwqMr3dwq15yPnrYvzvx0NxOrLoOLwYPwy6iIgo7h6c9SNu+fdqPDdve0MfSp34yxfb8M6KXFz+r+WGtykoq8Ld769DQVkV3vthf70ez/oDJ/GvJT/BH4we1Bq1jHDUy5Gd2Rh0ERFR3H217SgA4N3vcxv2QOrI9rySqLf58eBJ5e82TVLq83Bw9avfY+pXu/Dh6gNRbyvOXhQTXcx51T0GXURERLXktJAW8gfjn0X66Whp1NuIw4unasuIYEhqdLVyehh0ERER1ZLDQhQVSz+sHXnFmLf5SKyHZcmpPnuxwh/EL15Yit/NWNvQhxJVQkMfABER0anOaSHqCsaw3M5l/1gGAPjvXRfhwrOaxXZwURgV0p8qNV0rdp/AocJyHCosb+hDiYqZLiIiOiUUlfvx4KwNWLrjWEMfSgQrAYoYaAVtZpR2Ho1eMxYrMQMXOgVrupxWxnYbCQZdRESnofzSStz6zmos2FK/Q1Px9OrS3fjfj4dx27trGvpQIjgsZLpqs7C0lUxarE71Ba9d9fjc1DUGXUREp6G/zd+Bb3Yex+//s76hD6XOnCitauhDMGQl2SJ2b4hX0GWp1uwU79PlEp78UCMPGhl0ERE1MH8whKJyf53uM7+s8QYosUpNcjX0IRiylOkKxV6wXp8jaKpCeiEwPFXyR2JA6g817ma7DLqIiBrYL/+5DL2fXoSjxRV1ts9T5YRphyex4eZ+SZKEIp9xYGyppksIbgJBm0FXPUZdRsFg484Z1RCfGrvPa7wx6CIiamA/HQv3UqrLAvFTqMzFMk9iTaYr3j2Znv5iG3r/ZRGW/3RCuay4wo/V+wogSZK12Ys2C+nFx1ifdUuqPl2n+PAigy4iIrKkbk8Xp1/UJQZdvqpgXO9b7pz/wsIdymVXv/o9rnvjB3yy/pClp1s9jBf91RaDNGc9nq1V2a1GFHSFQhJunL4SD3y4wfA22w4X44NVNV33qywse9SQ2KeLiOg01NgzXU6HOsNiRVJCTeRRUhFAalL8T2FigLK7OkM5Z+Nhi4X0wvCihQcv3iZ+sxdrLm/ot9CuYyVYsTsfAPDPcefr1s398v+Wqf4dYE0XERFZUZdJhoY+YUaTEEPqRgxaSirqduKB9WMAXv1mN77ddVy5zOUAHBae8aDNQnoxa+Oqz5oug470DZ3zEocKrQSp2m0aI2a6iIgaCUlzmtv0cyFS3C50aZVme1/1mRmpCwkuB+yOEIrn05LKQN0ekEXbjxRj+5Fi1WVOh8NSZjFocxkgMYCIuWWEhduoWkY00pYLgaAEt4XJqxxeJCIi206WVeFX01YAAHL/Nsb29o085oopcxNSZboaJujS43A46mUZoIAQQNRnqZVRR/qGfguJWTd/KIQURI+6Gnumi8OLRESNhHhizRPaR8SzS7gkSfjfj4ew53hpvd5PQgxBlxi0NNTwoh6no34WvPbXoq+XHY11wWvxKZKDqfUHTmLh1jzDbfyNPNPFoIuIqBEST+KxnEjEzMsXGw/jqf9tsXSiX7AlDw/O+hHDp35r+z7tcNW6pqvxZLrCw4tWarqEvy0EN/5AzQb1G3SJfzeemi71xIPwc3H1q9/j7vfX4UC+T3empdXar4bCoIuIqJEQTxdiYXZMmS4hBrj/ww2Y8cN+zLewDuOGg4X27ysGsWS6Qo2gkF6Py2mljD6G4UVhJp729v5gCJM+3YS5mw5bPk4jtemUX5/EHxuBoARfVU2gfdJXhcpA5I8RZrqIiMiQUeGymDiJpU5FLwgoNOmoLotXn6ZY1ssTg5bSRpTpcjisLdNje3gxKAZD6us+XvczPlx9EH/4wLiHlVWNtWWENug6UVKztFVighPlOjMxGHQREZEh1TCT8Ld4wotlPTm94a7EhMbzlZ/gqjk+ecbZ1zuO4pf/XBYxO1AmBi3FjSjocsZQSG8l0BSDbe3tj5dU2jhCc1YWvG6IpqliAOUPhXC8tKbOMRCUUO6PDLpYSE9EZKK8KogvNx1BcSMaLqoLu4+V4MWFO6IuZC1mPMTThWpplhiGF/VCgERX9K98K7VJdUEcXpSDrtvfXYttR4px38z1utuo1i5sRE0wYymkt1J7JAbb9bk8j1GnfKP3Y7xUBdRrVYqBpj8UQoVO0NXYM11sGUFEDWrynK3479qDGHROc/zndxc29OHUmV/+czmqgiEcOlmOf4zrY3g79RIsNZeLQUUsJxK9IMBtIeiKF3F4sUpTm3PSV6W9OQBNIXojOrdaL6S3VzslFtLHOoPVynGpZy8a38YV5wFHVaYrGFIHXYGQbqbLz0wXEZGx/649CABYvvtElFueWuTszap9Baa3MzqZiomcuqrpakzDi2LMoQ26jB6tuvbIetT1vx8PYfG2o3YOT32/UQIeh0NdSG90e/uF9MZrIpqFP3aHAkMGsypVj6mBhxcDIQnHS6tU/9bLdAVCIcz4Phe3/Hs1yhqoga6ZxvMJJCI6DenNsBKJJzzxZFnboTS9DIfTAew7UYZJn27GgXyf7X3WJfHxaYMuw21UhejW7udocQUenPUjfvfe2pjrkqJ1OXc5NRMfDANpm8OLwdgyXXYfppUFr+M5mrv7WAn++PEm7D1eplwW0GS6qoIhlFfpz158as5WfLvrOF7/dk9cjtcODi8SEdWjaAGFGHyIpzsxkxNL7yG9TEggJOGGt1biSFEFVu/Lx5IJQ23vN1bBkIQTpZVolZ4MQB2AWF26RR10WdtGHKoMhiRVAb9V0YZ3tYX0Rlmh2hTS20l22s1KhSxk4OKZ6fr1K99HLPMUCKlrugJBCcGg+fDij3Fqf2IHM11EdMqYt/kIfvv2qjqduVXfKgPmCwyq63zEy2v+jmlGlk5sEQpJOFIUngG2R8gixMPd76/Fhc8twYrqYWTxsVrNdKmCA4tPiTjwF2vjzGjHp10GyOh+7DZHFTOc2iDNrFTLbtG9evai0W3UPdLmbz6iO7xXF/TW1QwEJRSUiUGXfk2X+Fn56Wj9rqoQi1oFXSUlJZg8eTJ69eoFr9eLjIwM9OvXD1OnTkVVlX4hpFVHjx7FhAkTkJ2djZSUFDRt2hSDBw/G9OnTTVPEeXl5+Oijj/CnP/0Jl156KZo1axYeb3c48M0339TqmIioYd07cz2W/XQCLy7c0dCHYlm0wl6jmWO1LqTXibrqcwZcNIu3HwMA/Hv5vvCxmGS6jA4zlkyXlWG/aKK9hk4HVEFu0OD2dvt0Van6dMVneNEoAydePOGjjbhn5no8/cU2e3dUC/5QCD6hL1eVUdAlvC/EpbQai5iHF/fv34+hQ4ciNzcXAODxeFBZWYm1a9di7dq1mDlzJpYsWYLMzEzb+163bh1GjRqF/Px8AIDX60VJSQmWL1+O5cuXY/bs2ZgzZw6SkpIitn399dfx9NNPx/qwiOgUYKXJ56kiaFDnoypujiFY0GvWGc81HI3ItWahKDVdC7fmobk3CTkda84hVobBzARinPIYPdOlTiwa1eDVZsFrs4BZkiTleS0q91tq1Cqy0qdLDMYWVU9K+HD1ATx/dS97d2ZCfBxaRworVPWRgaB+IX1VIASX06E8v6WNrJg+pkxXMBjEFVdcgdzcXLRu3RpfffUVysrK4PP5MGvWLKSlpWHDhg248cYbbe+7qKgIl19+OfLz89GtWzesWbMGJSUlKCsrw7Rp0+B2u7Fo0SKMHz9ed3uHw4H27dvjyiuvxNNPP4233norlodIRI1YY2p9UFtG2Rt1piuGmq5GGnTJL51Z0FVU7sfd76/DNa99r7o8aDNTpBXz8GKUYC0Y0tTjWQhcQlL0WYZmzVFV+62+avexUvR+ehFu+fdq0/2aHZfhsddzlvSxzzbjkqnfGs44fOyzzdh3omZI3B/U79MVCEnwuF3KvxvTygVAjEHXu+++i82bNwMAPvnkE4wYMSK8M6cTY8eOxRtvvAEAmD9/PpYsWWJr31OmTEFeXh5SUlIwb9489O3bFwCQmJiI++67T8livfnmm9i1a1fE9o8//jgOHDiAzz//HE8++aRybER0+nDHUAxtx6vf7I7bzCfDTJfF2YuGywjpDS82gqBLPi4xjrE+e1H829pjqW2gBkQf3g2GQuqZpxZaRlg5HrE5qtlN5eP775oDAID1BwpN96tl1CvOqNaricdta/9WfLDqAPadKLO8lqQ/JOnOXgwEQ6rnTW8IsiHFFHTNmDEDADBs2DAMGDAg4vpx48ahc+fOAID33nvP1r7l24v7EN1///3wer0IBoOYOXNmxPUulyviMiI6vSTUcaZLPPkVlFXhhQU78bf5O+LS58doRpuY5TAqpH/2y23o++xiHNWpXdHLdIkn1xjWm64TTp1Ml8/iiVEdiNoPumLtVh51BmrIWl81bZAVrcbOrDmqOAwnXxfragJGw7bqpqk1f7fwRpb21BWfznqKeoyao1YFJdVjqK9i/1jZ/uby+XxYsWIFAGD06NG6t3E4HLjssssAAIsWLbK87507d+LAgQOm+/Z6vRg8eLDtfRPR6aMuM10lFX4M+vvXeGjWBgDqE2w81nEz6t1kJcB4a9k+FJRV4Y1v91q6L3E/rgaKuuRMl/j4igw60APGxedWh7sCNjJdBWVVMS0tE5IkwwBFezvVv6PEgEbvB6PbxbqCk3gcRt3pVUFXWk3QVdcziU+WWZuEFzBYBigQDKmG40/5TNf27dsRqn6FevbsaXg7+bq8vDwUFJh3ZJZt2bIlYnuzfW/bFr+ZE0TUsMThmwRn7JmuQDCED1cfUOpD5m46giNFFfj8x/CwhqrWqBZrzVg9ARoVVwdUWa/oJ/2I/eoEGGIAY2WBZqteWbobV7+6wlJmUL5b8fhOmkyMMFp/0GpAHLRYG1fk8+OCZ77C4BeWRlwXLdMVCEmWgmTtayIPGxtlY8TjNQsY5feH3pCylYawRoGWZHC5N6lmDl6/ZxfXulhdfH+fsBh0+Q0K6bXNiCssZs7ixfY31+HDNeOtbdu2NbydeJ24TV3uu7i4GKWl9dOHo7KyEsXFxar/iKjhiAFQbQrp/7NyPyZ9uhnDpnwDIPIEqV3vLVbi4tJmJz6jQEs1LBYlQ6O3f72hq6DNTJfVDu4vLtyJ9QcK8d81B6Pe1ulwYH9+mSpAM5uN6jcoJrec6bIYuGw+VAQgnLnRBrnRgu9QSLK0QLl2N6EQsCOvGN2eWIDHPtusc+zGNV16tWr6Q8qmh159G/3nWJVZNHnu9Ya37agQAqWCUqtBV0h3tQft8GRFlD558Wb7m6ukpET52+PxGN5OvE7cpqH2bdfzzz+PjIwM5b/27dvXy/0QkTXlwpdpLF3FZWtyT6r+HdSeYIUvcqsF3nqShHUOK/xmhfDCsRic8KL1pNI7serFJGKix2WQ6RIvtVt4brTkkRi87cwrwZAXv1Edc6HJ8KIceKzam4/F22vWT7Rc02VxQkJKYk09cIEm2xJt9mhQk+kyDrrU9x+UJEz7ejeAcCG5lt8k0AnoBOu6bUIsZbrEv6PXdGmf+9pO0BAzVvll1oYrA0FJ9z2gzX7pFds3pNNn3nUdmzRpEoqKipT/Dh6M/guOiOqPWJsR6xp6AODUnJnE8+nOvBJV4FCb4UVxcemyKuPhF6PhRXUBuPnjtTq8KJ70jUYXxa3sNlM1Sp6Jx7/zaOQP5cJy80xXeVUQY99caZj1MqPKJAYlrNqbj+fmbY84OYsB9vHSSsPr9ASsZro0FwdCIcPFvQHztRdV7UWCctBV++FF1bJUqmBMvG/joOtIUTn2HLc3AiW+FvKKCdH4gyHdHyPl2kxXI6vpst0cNS0tTfnb5zNeMFW8TtzGzr7T09PrbN92JSUl6TZfJTqTvfTVLoRCEiaOyo77fYvDBrH0rZKJgYEkSaplekb94zsMOKuZ8m+7ma7n52/HoZPl+Nf1fVQnKV9lEPDqb2OpZUTUoEvvMr2gq+ZvbfCpu1+bMadRnVi0pZBOmmS6/MEQNv5cGHG51UyXNiM09atdWL2vAAPOaoZh3Voq14knZ21xuJVCeskkE6TcTnN5KASYRV3q4UWzTJdc06V3n8b719u3OtDSfz+aBV0Dnv8aALD+iUvRNDUx+p1DnQnOtzy8KOl+D2hnwp7yhfRt2rRR/j506JDh7cTrxG3qct/p6enweg2+yYioTpVWBvB/S37CtKW7I4ZfrPBVBfCHD9Zj3uYjMd2/+AvWbJgoGnFY7dGPN+GFBTtV1/+wN1/5226m641v92LupiPYcqhYdcI0y3QZLwNkbVgM0M9m6AVd4mVGw4uiqkAIeRYzD4Bx9ixa8GpW0xUISli3/2TE5Zb7dKlab4RQUt0sU3syFv/9w958WwtyB0KSYZbS7Jijtowwyezp1arptYyQ7+ODVQdwwTNfYZNOAGs4xK0KxsyHF1fvK8Bv316lXHagwDgpoyUGvFaDpHCmS2d4sZFnumwHXd27d4ezeuaQONtQS74uKysLTZs2tbRvccailX336NHD0n6JqPbEnkGxBD0r9+Zj7qYjePM7a+0NtMQv49q0chAzPLPX/Wx6WzuZLjEbUhUMqU5MPrPhRaNMl0HPLj26AZbOoYv7sZLpuvaN73HR80uw4UBk0KPHONMVLeiqMhwG84dCtQq6tJMT5KybNnAQT85vfLsXr39X0xw32vsgZLWmS9scNShBMkl1BQxmbmrvw28yvBiqzuY+9tlmFJRV4f+W7Na9je7fqmBM/77Dxynhujd+wLKfTiiXJdhoSRItE6onEArp13QFTrOgy+PxYODAgQCABQsW6N5GkiQsXLgQADBy5EjL+87OzkaHDh1M911WVoZly5bZ3jcR1Y7qSz+GmEceHox2AjZSXg/Di9HYmb0ofrk7HOqTenlVOGP03LztOKjJAKhni4mBrfVMl95h6s5etJnp2nU0XJtjFpyq21Do3ybaa15U7je8jT8YinjOAOv1ZtqgtrJ6KEubOdJmWMQMaPSO9OqaLqPXS3ufQUmKmPAQErJm6myW+naqgMxk9qIkAV9tq5mAUKxTP2eUbZUMgjErhfR2ssRmE02M+IOSpZquU354EQBuueUWAMDSpUuxatWqiOtnz56NvXvDv2ZvvvlmW/uWbz9r1ixlMW3RK6+8gtLSUrhcrpjWdiSi2IgnnljWsJO/WKPNxDOirumqxfCijajLTqZLXeivrsfxh0K4+z/r8OZ3ezHuzZWq7YIGJzM7hfR6WSLdIUcLLSP0tjN7ysQ+WkbZs6iZIsm4rstolpr1TJc6Q2uU6dKerC/o0ET5O3pHenVNl9FbXC9bpfotI0m4YtpyDJ/6DQLBkCpw0b4u6pYiJjVdkoQ9x2rWLNyeVxyxL/XsRaO/jYc6dYf5bAQ72ufeCn8wpJsB1raMOC1mL95yyy3o1asXJEnCNddco6yvGAqFMHv2bNx5550Awl3lhw8frtp28uTJcDgccDgcukHVxIkTkZWVBZ/PhzFjxmDdunUAgKqqKrz22mt44oknAAB33XUXunbtGrF9KBTCiRMnlP9OnqxJSxcVFamuq6ys2066RKczq/2OjCgnuxizVOKXeG1quuwslWIn6KoUfq1X+oPqzEdQwsaDhQCAQ4Xlqu2MuqzbWTNQ3k6SJBRVZzKinQiN+svqJZDMGqmKz5HRrawMH50o0Q+6qoIh3SA7lrUXA0HJMPjXBgkdmta0Joqa6ZJizHSF1MOLlYEQth4uRm6+D4cKy00/c1Y/j8GQpDqekooADhao34NGC14HDQJJK5kuO0FXLL20Aprlfozut7H16bI9exEAEhISMGfOHAwbNgy5ubkYMWIEPB4PQqEQKirCRZd9+vTRXRsxmoyMDMydOxejRo3Ctm3b0LdvX6SlpaGiogJ+f/jLZOTIkXj55Zd1tz9w4IDumo0AcNVVV6n+/c477+DWW2+1fYxEZyLxV3csmSY5KIklSwaoM0m1GV60MqwmszdEUnN82l/bZh3ltUGBcrlq9qK1Pl3PzduOt5btw7u39YtoTwCon0Oj50Fv2M4s6BJfC6OA1mx4MTXRhbKqIEoq9IvpA0FJN1CPKegSarq0T6l2iEt8n1ZFeb8FQpKl/mbRFrz+ZL16GNdqTZf8/Oi9dpIU+T7OzS9Dh2Y1QaV69mL04UW9fmNadjJMsQwvausmlfvVBl2nekd6WadOnbBp0yY8+eST6NmzJxwOB9xuN3JycjBlyhSsXLkSmZmZMe07JycHW7duxfjx49GlSxf4/X6kpqZi0KBBeOuttzB//ny2cyCKI78m2xDT8KKS6ar98GKs+wCsdzIH7GW6xBOHdraiXvAmn9AMG6IKJ/poHenlk95by/YBAJ6ft0N3mLBclely4FBheUQ3cb3+V+ZBl/EQmMzsefRULylTXKE/2SBgcHKNJeiqCtSsy6cNHOTnJq36eMRAL2rLiJC1lhERHek1NV1//qxmApkDDlVAq31q9Wr+dJd+kiKDVu3rYdSDy2h40axnmMxWpiuGuquAwezFxt6RPqZMlywtLQ1PP/00nn76acvbTJ48GZMnT456u1atWuGll17CSy+9ZOuYOnXqVKvGiUSktmhrHv7wwQbceFEH5bKGyHSphxdj/4zbGd60lekSvty1a9Fp77O0MoBRL3+HQec0x7BuLZTLjYZ2ogUY2u+8BJdDdxuxdqbSH8LAv4V7Ku3862VISnBF3K/MrKZLPIEbZSDNhhc91Z3gjdbvC2c0Yh9eFN8r4n1E1HTJQVdyAkoqA7bWvgyGJNWTFAxJ+P3769AiLQnPXNUTkiShrCoY2fYhZDx3UYKkul+z3ljysep9LkKSFPF51b6vrSxybRSYhf8defx2CthjCbr8BrV+EcdxumS6iOjMcNf761AVDOGdFbnKZbHUZclDTHYCJn8wpCwRI7ZdqM3yPHYCKb+tTFfNl7t24Wdt0PDFxsM4VFiO/649aDgVX11IH61Pl/rfCS6nbkZPPBGKXde3Ha5ZW1bvrszaS1SZBAaySpPhI09i+Ld/qd3hxRhmL4qvi/ZY5WEob3J1pstgJqnRfYjP944jxViwNQ/vr9yPQDCEB2b9iJ5PLYzoxq8tpBdpgwrt41UNPSrZO72MYGQwLAfB8vOhWlfR4D2oN3vRXb0cV20zXbHMaDbqSK91WsxeJKJT26KteVi9r8DSbRN1FpeOpZC9MobhxSv+tRzn/+UrHCosV9WI1CbTZSfoinXae1mlZokZzUlPjGHUtVv6Jzy9oMPo5AgAbqdDdwadeCIUA9f1Bwp19yszK4NTLRBu8L4wex6jZboCIYNCeouBv/heKROyHsUVAfxuxhp8Wl1HJWcqvdXDi9Gef9WxaArpxSCirDKILzYe1t0uHMjo7zsQUg+fmTVHDYRC2PxzERZuzYvYj6SX6QqE8PmGQzj3qYX49/J9htktVXd6nfeb/N1gZQ1EMzENL4asZbpiqRerTwy6iM4wBwt8uOv9dbjujR8s3d6T5Iq4LJZMV0UMw4s78sKZga+25qlryqr/PlxYbnkNPpmdLJnRbTceLMS0r39SDZupC+m1w4vq/Yg1UkbBk3r4SCfoMBj6AcLDi/qZLv3Hs15ofmq3kF58jowCIbNMV7I7fBoqMajpqjKYpWaW6dpw4CSOVdeqidkQMdM17eufsHj7MTz80UYANcNQ3mQ3AG2LFAt9uoRjFLMrJZXm3fbNrtMOjb701S7syCuuPiZ15umKacuxPz+yn5nu8GIghIf++yMA4C9zt2nWXlRvW/N3zeXy65Hkdin/1rYgqf/hRf2arrrYd31i0EV0htEWTkfjcesEXQ3QMkJbOzRv8xFc/Lev8adPN9naj516NKNZa1e+sgJTFu3CFxtrljQSTzKlmkyX9jG7NPU/yt8GdVzRZu9pa7rcLqfBjDL9wGbHkZrhRb1gzbRPl4UJFpUmz3lydS1ZiUGmyx/QL6Q3uq9NPxfi169+j/7PLYm4XakQ2Gk3F2u6AJuZLs3wotiA1CiYDB+D2fCiOqhY9tMJ/N+Sn3DZP5ZFHJ9Z8BGSIo9fO5xn2JE+ytqLcqZL+/gBexmmWJujWvku4fAiETUaViadpCRGBl0xFdIrNV2xpftVw1jBEF76ahcA4KO15kv5aNU20yUOg4kn10qTTJd22M0o6DKq4Yk2e097wnO7nLoZQKMTkHjSs585NM/IAernRiu5OqgvNQhOjGafVQVC+ElTIwWEl5sSidm3UpPlmOQsoDx70R+MfP4TE/RPmRFBl/BYjIZN5e2Mnu1ow2fic23WQiUkSRHDu5FBV83fX246gq2HiyIu16vpkp+Pcn8wInisr0yX3D8tWqZLfh21Q/0NjUEX0RnMSr+r1KTISc5GvzDNAhr5xBuSak7sdmYaV1nIqFhhK9Ol83jEdQibeROVv9U1XZqgK6A+XjHoEocoxaGwaIX0Qc2QkPhcJjgdEZkcwLh3knjS03tpzZ5vK6+LWaF0UvXw4hyDuiez2WeXvvydahIAEG61IBKfJ+3rojpGv0lNV/XfHp0fIPJtxbeyGIzrBZPyaK1Z0BDuuG6tv5vZ7NBwy4jwfuSh3MiWEerjGF899KgqsNcZXpSDLp9OYGOvOaq1z+Tfru6FZ64Kr9Fs1EpE1rF5ODg7UVpp2AOuITDoIjqDGWUmduaV4JN1P0OSJKToDi9GbvffNQfQ9fH5WLAlspgXUJ945S9LO7GTenixNrMX1XfasZkHg7s0172t3v2sza0JusTgs0I1vGg+e1GskTJayDva8JGYwZEkSRX0BUI1nelFRsOL4rHrZbrMhnFUC6HHEIwn67y/RH/9crvp9d/uOq76t7b8THzu9IIDmfw6yLMX9WoI9T4LgFxIL2a6/Lp/y8RhOaMfHsGQfi2bckxiDZlJYBoSZi+mVs8Ujch0ae4nryhcghBteDGpOujSy+bVxzJA4/p3QEaKXHOnv/airLk3Ca3Sw/08dx+LzIg2FAZdRI3IybIqbDhwMm695ox+KY76x3eYMHsjFm07qp/p0tnuj59sBgD8/j/rdPdZqQoK9IcazR63+iRofLsD+T68tGin7iLJQGQAkJacoJw8ot0WAA4I+xWPXxwGW7lXPTNUm1EUgy7V0J5BTZdeRlJb/yUOaX6945jqOGVGQz7iSVjvRG+WcRFfF8OWEWZBV4J50GWXtiu+UZ8uLfnEn1ZdSK/3/OsNtQPVi1SrarrMhxflDFFQMhlejNKHShVMmgVdwvCi/Fk2a44KAJ2ap0Zcrjt7sfpx/HPJTwDCQekLvzkPgL3+WOV+49dFS25T4Y+S6UpwOtEtKx0AsOtYqeX91zcGXUSNyKUvf4tfv/o91gjZlPoUrRB148FC3YDEbDujiW5iUKI0c9Tsx3y4JXrtEAC8uWwP/u/r3Rj8wlKcKI1cX1WbvUpKcBlm3PQyXfllNWsEil/6ZsXAkfsRshQGTV+jzV4UT4KBoGR64lW2MXicgVDNEJReAb5ZR3z18KJBTZfJ8Jc8vBgrbdiiLfpX9ekyrenSdKRXvRbmma5ASFK16BCHs/QyjupMl/7xRKtZEj87Zo9LHF5Ugq5gUPU51Q4vZqS4dRfFljvvy6+ztp1MstupZC4Lyqowe+1BFJTpr6kp0nuOjLiFNhVmz4/b5UC3rDQAwO6jjSfoqlVHeiKqO5Ik4URp+Atq5d589O/ctF7uR/yestJpW++LzWx4z2hNP1Wmq/qEEbFwriTBJUlwOByqL32Hw6H6dW42XHWyrOYLfG3uSVzWM0t1vXbbRINGooD+rLuTYtBlMLyopX2ejYaGDFtGRMl0+UMhS0GXmYpACF6DAnyz90mVheFFs6xHbTNd2pdOfPcFgiF1cGKQ6arwB5XnLz3FuDmqUU2XdhkgsR9Yfmlk0KFkuqIW0lur6TIdXpRqfrB4q9u/aFt4aN//ZZWBiM/9ne+tRbPURHRtlaZ8hyRpgtBkt0sJTDf+XISNH29C7/ZN8N+7LsLYN1fi/HYZePrKnhHHGEvQZTSrVZbgciK7Ouja1YiCLma6iBoJMYPStklKvd1PwEZBut+gR5LZdkbdyytVma5QxLEA4aLjIS9+gwkfbYy431gK6fWGLSIyXW6nYQZIL7griCXTpQ0urQRdqtlikftWNccMShEzJu36ZN3PuOXfq1HgiwwSTGu6dGb5aZWZBV21zHRpicOLVZqu5UbDiyv35iMYktAqPQltm4QLsLXPLwCkJOrnKQIhyfA9pJfpkQMHs3VA/cGQaQNYv6r/mPnwoj8i0xVSBafyrs5v3wRA+HnSezz5ZVX4QZgdqtc4Wft6bjxYiDk/HsbGg4WY8cN+3WMs9IWDLr3Zoee09OLuIWfhvdv7A6gZXqyKkgl0Ox1C0FVseLt4Y9BFVE8kybhIVs8eoe7AWY+fTH+UDIooGArpDi2ZZT6MMl0VOpku7ZfmFxsP40CBD5+s/1l1Atd21dYet3g84u30sj/aQCopwWn4Oull9FRBV/X1Bwt8pnUp2udLfNwVAf2gKxDldRJP2P5gqNZrzD01Zyu+3XUcG4Tu9Mr+zYYXxWDa4H1hVMAPRC+kj0b72okxf5UmG2IUGH+94xgAYOA5zZFQfVLXW1Bar2cdEA6QjZq16g1xy4FDIGj8HWGnpsvsvRcK6QRdgZAqOJXfS/cMPRtAOIizsjC8tvSgpCKgOwSbm19muI9AMKT0MpML30WpSQmYNLo7ftE1vEapPLu0MmAedLmcDpzT0guX04GSisbTNoJBF1E9CIUkjH1zJca9udJy4LX3RM0Xk7bFQF0Sf/nrLdsiqYat9GcImbWa0HamlqkyXQbDi2ZZE9XwYjCE3UKQ6jOoi9ILRLQ9ixITXOjdronuMWsDtPKqYEQN1qzVBzD4haWYt1l/1iYAHC1Wn3iNjlG8XBzm0wt6tC0laju8aMZsDUrxNSutDOCvc7ep2moA5oXetc10aT9e4lNVFeXELFux+wQAYODZzZHglAOi2IcXRSd0hxdrFhc3Cm60ywDJ5KBGPWxqPrwoH79XmL2oynRVH0N69SSCQ4XlSiBqRpuZKq0M6AbRhwrLlb+1nymxp1kLb2TQlaJ5f8gTHaJJcDmRlODCWdWTAhoLBl02/WwwI4pIdKiwHKv3FWDVvgLDTttaYqbLzpp/doknyWhDh8GgpD9zzuREZlRIr24ZIQ8vGg8haodWzOrIxFYA4u30TkZ6ma77hp2DB4d3iXpb7dBbMCThhYU7DY9Lpm1rYLRkjGGjVL1lgDSz63z12HnbrLZIfM0Wbz+G6cv34devfq+qnzIfXqxdpkv7VhRf/2jZENmxknBQ3KZJChJ01hOU36fJBkGX2fDi9iORQ1uJ1ZmuUMi4q3ogFLl8DxDOjC7dcUyT0TUvpJeDZnWmS7xN+P9yPRsA3DtzveE+ZXqTbPRez80/Fxkeq7ygfVpSgrL4udn+XE6HMtnBjJxNlIcYGwsGXTYdL7W3hAqdmU4KJ2erC/PKX/xA7fpQRROt6aYYHPkNfm0bLWwM6Ge6wn2kdGYvavZjtt6dWXatrCqgBDLiScxnpaYrwYmURBceGtElImDU3vakpj4nEAxZGobREk/oYlGz0QLHeplP9ULZIdMhvNrSPvf/+/EQ3v8hF4DxpIYPVx9Q/jY7tiSdQvpdfx2Nh0ZEBsF65IB06Y5juPO9tUqPKcB60CUPb3kSXUKmK/JzYjS8GL699c+slRl4AYN6SkkCbnt3jer7wrxlRE1vOrmQvioQimgiC9RkuqzSq8HSa6shZvG1AXhhdRF9hsetG8Rd0CEz8jhToh9nQnWNRrdGFnRx9qJNFf76G/ah04c4Y0mdeQng5n+vxsgerXD3kLNV24hNFMVtKvzBWmcDRNH6XVVqmnXqrntXXYtSVO5HE0+i6jq9xZG1mQDj4UWDAEQy7/V0+7tr4ACw4KFfqII17fBiUCcjIZ84HA4HEl1O1f2If3++4RDeWbEv8nFZLOoXiYGalUyXXuYzqLreWsuIWKlm8gVDeHDWjwCA89o1MfyBoDrRmgx/aYcXW6YlITHBqQQm0civ0W3vrom4TlvTFU1Kokup6dKbSWo0vAioh8mikd9zIcm4bitaHyqReXPUmlmQHqUeSv/2XgsZJJHea5Rs0PNO5hMyoMdLKjHuzZUAgCYetyqI+8fY83GgwIe7h5wVsQ95fUzzYwu/jlf1aYvzs5Iw+B9RN4kLZrpsamyLZ1LjdFz4FSqeuGeu2o91+0/i+fk7IrYRlw6RMwvTl+1Fz6cW4oc9+RG3j5XRiV3veH1VQd1f8IFgCH/+fAvO/8tXEWvd6QVd2oDJaHjRKNAIGgy1yPbn+5Cb78N3u46rsjJHiyvwuxlr8b8fD4X3qRO4JQiZOe1sLPkYinx+PPzRj9goDJPIxxtLH1vxcW8+VLNPMbgRAzO9tQu1fbzqtaZLOF5xIsGqffmGr8sHqw7gsc82IxiSTL83xR8Ug7s0x6y7LgJQc9KMxiwYjzbDTSvF7VIytX6dlhFGsxeN3DGos+7lbqFPl9HQbbQ+VKJofbq0w4uVgRB0El1KwGlFgtOhm9U2aiBbc6w174UZ3+cqn8kmKYmqTFfv9k3wwPAuuplQo0yXuL38WNplenCeQc1mQ2DQZZPZwq1EsuOl+kOFRmvfAepfyvIX0ZrcAgRCEtZrCpNrQz0V3nx40VcV2a8HCBd2f7AqPHwkLzwt00tQaHtYyScx7b7Vfa/Uw5xWhlxDkvoktnDrUSzeflTJzOhljMQ2Am7Nr3T5dSgq9+vW7ASCxoXQZoxOpkZ9uvTWplMNEwdCpsFHbYnvE/G9vWJ3vmnPtA9WHcCCLXlKHY9evZ8YdE3+1bk4q4UXgH7wrses8Wo402X9eUl2u+CuHpaSJOCjtQdVzUDNMl169GbjAcLwYtCkpstGpitaR3p5IoYyvKhpGSGzk1F36QRd79/RP2rfNZ9BjWtVIKTKdCUYTMgBoCwFpCVm6lz1OQW8FhrnUTVizHSRFceKa+pKrntjJb7adhSA+qSzYMsR/P79dcqwYonO8KL8ZRqteaCdIa6AQaarMhDE8/O3Y3n1TC4gPByqF+wENMOfIr2WERGZruoTjbY2TDusKvt0/SFLmZxASDKd+akXIIjPrfZELwd+ciYhNTG8zMm4fu2r7y9ka/1ImVF7AaMspN6PvZBmlqmdmiK7xGMRs7ibDxVFrGWpdaK0Unke9WanidlFcdjIahCpbfQpsjp7UeZJdMElZHse/XgTvtp2tKZPl81h/pZpybqXy9kgs0ycnSDabHhRkmo+V8rai/5QRACc4HRYHtKVby8GRjcP6IjBXVrA6XTo1nrJxEyXeLtNhwpVWS2zfRjVnnmSarZ3mwRtDYlBl01mv6qIZGI24ERpJe58by0AdUb/9/9ZjwVb8/Cv6nXLxPXa5C9J+cu0UKdhpWzR1jz0mrwQC7catywQ6XXaBoCXv/oJb3y7F098vkW5rFSnM7V2O23QpV37DogMGuRj0O5bO/NMttvi2mnBkGRa5C/vXzzRi0FXaaU6uJWPW87UNPMm4bq+7dGmunltuFZN/Rj+c8eFlo5TT0iqCaBDUTNdNX8HgtYygXqsDOOJw4tiC4RKfzDq/YrfmS3SIoMu8bkQT6aWgy7T4cWgrZouMdMl2/hzoTC8aC/oaq4TZAI1BfmVJjVndhaMNnuMVcGQMgTuVTVHVb/udutGnU6H6kdKgvC8mQWn4uxFcVh0/IiuqqDPLNMlzrIUnV2dJQWgzEJtbBrnUTVitW1ASNbFa9Hn+nCsOLIhIqDfrf1wUQWqAiFVFlU+yZVZyHTd9f46lFUFcff7+gtNaxkNL3624eeI2/qqgrqzBsV9aLO/enUe2qaUSqYrYnZgzeOMZSg/vM5c9EyX+CtazL5oj1N+bHIhuDy85BJ6OWnfplkZ+tkNkemaesrMTvVQY+RSQmL9l/EswrF92+Of4843vD/tRAjdYxKHF1WzbM1r7YCa967DEQ5atcTnSzzxW/2BG2140WqmKzHBqTtkFh4CDD9Gu5mu5mn6z60cvFUGgobDn2YrHNghBqVGLSMA+/3StJkuMXg325c4qUJuKzK4S3PcMaizqrGtWdBklOn6RZcWEftubBh02VRXHwQy98jsjbj05e9wrMS8Rcf/LfkJj3++udEFaHpdqAH9mpZgUFINLQI1tUfyVHt5mYy6IH7JywGVJEkRDTwBs0yXuk5NPCnrBV3aE6NRpmuBkK2riCGrHAwZT92vCtRkg9wuBz6480KM6dUaj/2yu+H+5IWg5V/n8klLaSugk+nSWxpFb7/Gj6E606XZrzbbpT1XGw2/3jfsHCUzp8eoPkYkBlbie7sqGDKt6QKAI9UtHDxul1JTJGqRloRP7hmAhQ/9QnW52bCh6nYm9z930xHLJ185oNJmWPxC3ZXdmi7DTFdiTesGox8JdjJdZsQfL6kmsxfloT2zAF3kcjpVPyLFLJVZcPr455txsLrfpdxfb3CX5khwqfdn9jkyKqRvLQTwh4WGrI0Jgy6byjm8GBez1/2M3cdKcc9/jBv0SZKEl77ahf+sPICfLA4/xaLCH8Tjn2+OaHBpxs5MskBIUvoEyeTZRlZruuzQW97k55P6X1C+Kv1f4n5VwXtQVaCuF1ga1XSZBR9GP3AeGN4Fzb36GQSjZYuAcAAp7zPZ7cLFZzfHKzdegJbp5pmpikDNzED5ZJkgzD6LCLqiTJkHzGvw5OdSezLWZv60dWFG9aZOp3lRulGxt0h8vcVMF2C8nqHsSGF10GXQ/BIAcjo2jWhiaTXTZRaczN10BOt1ljXSIwcK4WGzmssDoZohQKPmqEYydbKIDkdNRs90eLGOJkaIn81UVZ8uNTk7deX5bTFas0i8HpdTHaAmqDJdxs9TSAL+8OEGADXvHfl9oRquNBn2Nvqh4HA48OyveyIrPRl3DNafOdrQGHTZVMVMV1yt23/SMIulauJZj0XEby/fh/+sPIBb/r3a8jZGJwK9X7XBUEjVowuILKSvi0xXXlEF3vh2j6qHmJxVMQrqgiFJt8eStpBezHboFdIbzV40Gwo0eg4fvrQr1j5+KRY//Atc17ddxH6NMl0lFX4lMIlWvyJ2vK7wB5VhXrkQWWygqT1nWqmRMgs25eOPlunSdqk3Kn1wOvSn9staZ0RfXF0MvLVBV7T+VEeKwgG9J9Flqw/UDf07WrpdZSCEfSeM1/azyiiL5Q/WzF7Ua95pRB6u1HI5HMp+Kv3Gw591lumqft84HTWBZUiKDNrFejUrBfUJTvXjE7eJ9vnaeLAQQM33m/y+UA0vmtV0GfTpcjkduPHCjlj52HCc2ybD9BgaCoMum1jTVf+0X0JGS+KIr0VCPU4PPhjD0k96Qx5VgZDur/dASFIV0QPhL3pJkpRhrcJy40J6q26YvhLPz9+Bt5fXNPiUMxhm2Qq9DIp2BqT4ePVOIZF9uuSWEcbBcrSh/HNapqFpqjpLU+k3Hq4pqQgoJ7JoJ88mqTWNGiv8QWWauzw7qmZR5MhjTExwIqdjZBdt0X9W7je8zh+UsOyn49iRV6K6PCLTpblro15NLk3tjZbREJhIfE4LNF35tUPjWvLwYorbpWRarOjVLgPLHh0W9Xabfi7CsCnfWN6vETFQUDfyrclGpSVZ79hu9B5zOoWgK2A8EcFq0NWjdbrp9XJs5a5ei1CmHRYWWz1YCbq09W/ij41otW/NUsMZwJpMV3WWUfjBpjchR2YUvDfSCYsqDLpsqqtfH2RMG5gY1YyIwUAsvZKssrtrSZJ0g66SCr9uIBEM6dd0VQZq2hFU+EO1fu/tPR6ZDQgoGTV7RaeRQ1/CjMgovb/E25i1G7DyeBM1WaWKQNBw9qIYdEX7JZ6R4lY6a1f4Q6aZLi23y4lXbrgANw/oaFgfYxbk+oMh/PbtyKyq9r2j/XGizUDJnA6H6fCilQJqMTDQZmW1Q+Na8mufmpSg1BRZZVaLVteMZiaW+4M1s/+SE/B/1/extD+9pp5AuJWBvOC12TJF0WraBndpjmtz2qFfJ/MAX7lfl1M19K29W/EzkZgQPXrRBvPiD1+995RYoyVPnpDr7fQyXWaM3kdWe7s1JAZdNrGmq/5pTy5GhbJi3VR9Di9KurkbY0aZueKKgHGmS2d4UVsXVlyHdV3ifQNAqckyLfrb6c/yA/TXSIxsGRG+jVkRtpVCeu0v8kp/yHCNxpIKvzJEZxRojO0b7r81cWS2chLWzXQ5IxdFliW6nMjKSMZfruwZNQuhx+i9rH3vaE/WBwv06/KcDv3JDTIrrQLEx6kNsqJlumSeRJcStFpldtx1zSg7Iw69J7gc+FXvNpZqnowyXUlul5DpMq7pWp1bYLr/N3/bFy9e2xvtMj1RjwUIZ6JcTofh8Lf4mbCS6QqEQupCelU3+Mjtxe9FuR+bUitZHUSZZbdERhlTvdnhjQ2DLps4e7H+aTMcRifmCs2J/kC+D29+t6fOpwrbzXQZBYklFX7dX6+BYCiykF6YMScrrIega+vhIjzx+RYcyLdXE7N4+zHVv/OFGW16Q27aeiSjlhGqbSx81rQd5Cv8wYhgRD7JhAvpw+8ZoxPs81f3wurHhmNodkslGNGt6TIYXkxwOlRf/LH0CjIKGuXnIxgKDz1ra3KMgv3wMJDx/VmpU5Jfr1BIisjSWf1OTHa7bGe64sko0yUuXi9ndqyc3JMMAvtEl1O57rtdx6PO/jQiZ61aN4neogSoCaSMXoMkt73hxfKqkLplhPB3tKdHfs+UKpmuyOFFM+KEDHGTUyDm4oLXdlWwpqveWQ261NmVEP655Cd8sv5neJPc+HrHMZzfPgN/uKRLTMeQe6IMH609iDsGdbaZ5zIeFiguD+jOSCr312S1mnjcKPT5sWJ3Pp6Zu011u7psGyH7cPXBOtnPMWFoK9oi2kBNsGJ2wrHSp0t7chADguv7d0BReRVCoXAripKKgPKlbJTdcTodymxGucalwl8TAEf26dIGeOrjMaulMmKW6TpY4MP1b61E+0wPxlZ3xY/G4XAYLoniSXShU/PU6MdU/XqVCj8EPIkuW7N0kw1aRjQWRoG42DtOznBaCQ6MhheT3E7D6+yQ34NWJkIANe9Nb1KC7neJ3ZquSn9Q9TyI22gbrwLAg8O74NVvdsMflJR6XG0rltoOL+pN4mlsmOmyKZbeQWRPrMOL8i/S/649iMXbj2LKol2621nxm9e/x6vf7MHE2RtjyHTpv0eKK/y6gURZZUB5LGLTv4Vbj6puV+irQlUghBW7T6gC03j9unt5bG90bKY/lHHCYK1JmeEyQKaZLgs1XZosjZjlfHxMd7x6Y44yvVysqbMypCYPt1T4g8oMzpo+XfrDi9rhMCvtI7S0758kobbsnpnr8PPJcvywNx+7jpbobR7B5XQYnowyUty4sHPTqPuQJLn2MPz8JrqcpjMRp17bG5/cM0B1WXKC07BlRGNgFHQV6mW6hKfz498P0B2yk1+3f2lqwBJdTluzIKNpYzHTJX8/Gr1u4vCitlZST7k/qGrrIP4tvt3+Oe58XHV+G9w77Gz89+7we8LnD1RPIpD7n1UHXRa/zMSZpuL3s9XhyYbEoMsmFtLXP21ga5jp0gRd8muTb9CY1A55qZMf9ubbrukyChKLy/2614nDXmaNKgvL/Xhx4Q7cOH0VHvt0s3J5vIpHLzu3NSaN1m8kKrYN0KtRMcp0mTW2nPGD8Qw/mfbkoFq8uvqXt1w/UlIpFtJH/+pThhcDwYhMl3zyjTY0FEumS8ysADXP55Gicmw5VKxcvkQzxGvE6Qj36tKTkeK2HAj5gyGlfistOcE0G5KalIDz2jVRXZYs1DI1RkbDi/LQcvh5DL+eYhDbKj0ZPXTaE8iP9YrebfD6TRfUXO62F3RFewsZre+opW3PoJVic3gxEJIMM13i5Vee3xb/GNcHSQku5fNTXhVUGqMC4TVNAfUyPmaMji+eNYCxaryfgEaKNV31Tzs8VxXUD3TL/TUn2KpAzYxBMRizsxC0nlBI/UvKyv6MhhdLDArpC8qqlF+hRmuKAUCRz4+3loXbPXy64ZByufjrsLaP10yCy7gIVyzy1w26DFpG1HYChNnwonysXjnoqggoAb2V4Z2ami6d2YvV+9bW3WmfnVhqusSWDDkdM3Hx2c0AAGv3n1Tdbmd1pita7yunw6GaWSbG6E2rp+6/csMFaJGWhG6aBqWiQp8f/1e9TmhacoJpFi8xIbx4snZpmCSby+iIurdOx3V922HyFT1i3oeZaNlP8bUUMypGLTnU6wiKWSR7z0O0bKndQMNoaE58/NpaSSPi41J9Fg0OyeOuKaCXP6tJCU7luR11bis8PqY7Prp7gP4OojgFYi4GXXYx01X/tJkuoyCmvErdHFV+bcRaL6uL5hoJhEKq5qxGxcoioyHoonL9lhEA8L8fDwMwXlNM3l6P+Ku7Poe/XQ6HYRAhzr601jIi+uxFK4yCLpfToZwY06qf09KKgPKesTu8aDR7Ua9xrPr47J8FTpSFM7Xh5XEuVoKqtdWz2VpqFo1uHWWtR5fTocp0JSU48fiY7mjuTcIzV/UEAIw5rzXW/HkEhma3NNzP459vwbzN4WWa0pLdpo9Nfl3E5zkpofaZrhd+0xu3Dqy7TuPiSTraEj8JBoXiCTrrNQLq4NYlPFdJCS5LS0XJ7NzWCq9BY1Ersxe1zYjFxy0OLxpl35MTw/st9weFInqxKN6B3w0+C/0tDHnr4ezF05DRUhtkbuPBQvxq2nKs3Jsf9bbaoahKg0BHzDIEQvpB166jJXjru70xZ1RCkrrZp5UgzihILK0MRN3eLOjSNki98721Ea0m7BQ26zFqlCkPrbgNvtTE5q4hKTLjZtSRvs4zXdXDnOIJUhlerPArQamt4UV/UHletZmuvGLN2qCapyfaMM0zV56Ld27th1HntkKHpuF6uYLqoW2567Z8HPLamAPPaa7ah9FJVOZ0qGu6khJc+N3gs7Dmz8MjhnPMgqLF22tqDKMNL+oFXcluZ0TfLTuLLNdmfdU0g+dI7FoebaFycdKE00KmS8yGucVMV4LTcGajnkQLWdmFD/0Cl5/X2vQ29ww9GwDgNRhOVvXpEgKoxAQnHhzeBav/PBwv/Ka3ahsx6EpUFdLrk4eyJammxsxoWDcW7NN1Gqrwhxrd4sqnggVb87Dp5yLM2Xg46m212SBLLSOE4UXx5bnylRV4dt52vGehPsiI2ILASmbGqJD+55M+bD9SrHudLMNjEnT5/Kpf2F9tO4rn5+1QBS7lVUFsP1KM/s8uxozvc6Meq9av+7RRTrxNhGNR1ho0eO9H9BmrrtnaergIE2dvxF7NMi1Kc9RaZrq0QYL861kMCOQlfUorrTdHBWpmc5VVBnG8uk5QHo6zWqsV7XYupxPDurXEG7/ti6zqWZPy8KKcodM+xj4dmqj+rc3Q3HBhB9W/nQ7tMFD4mPSKjq08L+FjsxZ0paiCLhcyUtxY+NAvMPf+QfjjZd2w4MFfGO0igt0GyD1ap+Ojuwdg/ROXYtVjw3Vv88terfHFHwZVF3u3Nd2fmOUW6zy1y+HIxEvE65MS7NV0WSlqz85Kwx2DjDOAg7s0xx8v6wbAOEg3ahlxdgsvxl/aVbd2TN0cNXrLCPH9IDfztfqes+IUSHQx6IpFbYeszkTlNhZu1mZFjJ5vMaNVFQyZ1ttt+rlQ9e8decVYvO0ock+UoShKKwYxMLAyvGh0vNreVnr0CunlX5BF5f6I5Y4+XH1AVUNV4Q/in4t/wrGSSjw1Z6tyuVHXa60LOzfD2sdH4H/3DcSv+9SchOQvVHHdRpG2G7qcFRjzf8vx8bqfsXpfeGhMzmy8+k24n5qV51P0wjXnqf5tNLwoDnXIwUtJRUDJQkZbpgSo+QW+82gxqgIhpLhdaFudqTEaZtV+5zscDnw9YYhh8KW3YHB+mVzfFz5u7UmprSZblOJWn0SvzWmHR0Zlq45BfNu0NWmmqRcM6HYX1wyRaZ/PRJ2gSz6pZ2eloWfbDNwz9GxL7Spk4lvYyvDT/13fB/07N0XT1ER4EhN0F2J3uxzo1S4DV57fVrd2KtUgCyMei8tllOmq+TtBkzkyqyl8YHhsbW7OaWlchC4G5oY1XQliYB75o0UmvkeMetI10VnoGwgHn/L2D876MWJ/taXXqqKxYdAVA7FZ3pkmFJKw53ip7WyfHHRZ6aputU+XtmWEWV8n7T4u+8cy/O69tRg65RvcPmON6fGIQZSVzIyVwFI5jnOzlHXIAP2FXLu0Cn+ZFvr8hrPQZL6qoOrLXp5tZpR9A9R1R6lJCUhLdqN3+yaqL2r5pNLXYMmRQyfV3dCN1j8U6zdeXLgTVQHr76M//7I7rtP0ptLWFcmBtxicqgrpbcxelIeANh4sAgB0beVVTjJ2ZiWe1cKLbq31C9RVHb2rT1r51TVd8ntBe1JqmZas+kWv7c7tdkVmXsST6N2/OMvwWPWGvfS6yBf6quAWlorRZk/k65ITxZqu2p1uxEzXjNv647N7L1ayg3q07w29zFy0InWj4Fr8+jOq6dIOQcqSElymw4sDzmpmekxG0pLdWP/Epdg8eWTEdWLgrg2iZKoFrxMiPz96+0owGF58YHgX5HTMxPNX9zK9H+3+zgQMumKQV1QR/UanEDsB1F/mbsPwqd+qFk22Qs5KWcp0BWIYXqxeq9DI/nzjRavX7T9pOutPDFiMjuWBDzfgdzPW4IuNh/Hox5sM96WVkuhSfaml62S6elbXnRSWV0Vt/lfuD6o6mv94sDB8uUmtV5/2NYGUeAIXsxTyyaddpkd3EWJtxqoqGML0ZXsjbid+4W45VGQr06VXuG00yypRlenSq+myPrx4qDAcUHZtVRM42Z0xZlRrkqATdMk1XcrwouZYvckJqvdJUoIzoqBZ+z5JdrvwwCXn4M7BnU2XsNELTPRqbk76qlS3TU10qQJqpaZLeH1qe3IVv6ZSEl3o0yHTtB5I+1j0CtKj1dwZTRYQvzOdDoNCeuFvVXASZXhR+5lwJzjxz3HnG67jKWqamqi8b0Ti/RlnuvRrurSzY8XvBfF9LWbzmqYm4pN7Lsb1/dVD3UDkj2o7dX3R2G3v0xAYdMXgqLZ49hRWVhnA8Je+xSSh75OZd6vrhP42f4et+7EVdEUML+oHDGKmq9IfMj2BHyjwKV+UekHm0RLj1zRapqu8Kog5Gw9j8fZjuP/DDYb70ZPsVq9Hpxd0nds2vH5fkc8Pf5RhwnJ/EEeKarJOPx4oBBAZyIrEGiHxCzlFOC7xpNK+afS13r7ecRR//XJ7xOXi+oDNvUnw2xiq1wuwjGZ2JRjUdMnBp52WEbJsoZ2C0cnYqDmjUYimznSF/z5c/aPOKNOVmuRSDUOLQzaAcY3RwyOz8ecxPUwbSOo9n3pDsd2z0lUBi1yvpd2PGBQl12GmS2YWvGgDKr3XLFrGMsHp1H1OJNVt9Gf1qmYvamq6xH120QwL+jTLLAWCEq48vy2ujFJzZkZ8vxvPXtSv6dLeXh7aDT9u/T5dZrRlIMl10J3/VMKgKwZzNh7GZf/4DqsszMRrTFbvK8DSHeq6oi83HcHe42X4cPUBW/uy+3uiwlbQZS3TJWZvtOvBaZVWBnCyunZLLzjbV13o/d2u41i3X73QrDgbUa9nWG3aiFQGgupMl86vVHmGVXFFIOrwZkVVEIcLawIbeXad2TF2bZWGVulJSExwooXQjkDVLNFmZuf7PfqfDbFGJr+sUnktnv11T0y/ua/pPvVOfkbDQ3o1XSEJynvAyq/rFM1t+nSoyQgaLatjxCjQ0ct0yfp2alp9HJpMV1KC6n2iDboSdYYXrUrQCUzEYeYuLb24Y1BnTPpld9XrkeR2qSZeGBXSx0KelXfPkLMjrjPrd2VleDFaoJDgcuhm01SZLguzF8Xh7iS3U3Vd99bpqmNtranZ01vL1C7x/WG0FFPztJoyB1XQpcl0PXNlT/x+yNmY9+BgTXPU2N5zdmZyimK9v4bGoCsG8zbnYUdeCT5dfyj6jRsJSZJw3Rs/4LZ31+CYkNUxascQjd2ZRGJNV7QGnrGsvVhiYZHrgwU+1bGI9uf7UFBWhZv/vRrXvPaD6jox06Y3hFmbNiKbfy5S1Vhk6DRH7W5QD6Qnv6xKCSyAmsJ3s+HFzFQ3Zt99Mf5330DVyTwlsebrwWXzC25DdYZN689jeijDfUeLK5WZl55EF3q3b2K6T70Ay+ikKb49k91O5aRoZ8ZUcyEAzUhx4wIhIyieZMU6PKMkklEM5DIIui7o0AQjuod7ZonZT4cjHMioMl0Oh7rOxuWIeRaX3vMp7rt3+yZ44vIeaJqaqG58muBUvXfk10pVSB9jpusfY8/HkglDdNeaNNunNvuk99ii9XVyu5y6xfTarzBbsxe163NqPlvnt2+CqdfWtGYwqo+0Q3wNvUmRP+yyW6Uhu5WYyTUOujI8bvxpdDd0bZWmmQgS2+sba6arhUF7m8aOQVct7Dle2tCHYJmYPRJnoAWFoMtON3OjmOvVb3bjfz9GBqNyYBKSwovm+qoCeHHhDmw5VBRxW+1wouHsRSGQKKmIHnQVVmfZynQCkEmfbsa2w/rtHMTnTg4Av9t1HDvywrc3CrrMyq/kLuNX9Wmr+iWtl+nyJCZE7Touk49JJhdlmxXSZ6S40aGZB91bp6suV2e67H1VHKgOcLXT2LOz0jDvgcEAwsP08mub6HJF7dejn6nQf5LFHm4Oh0PJJsoZUStB18geWehXPXHgtxd1VGcuhPsdea5xjZR4DHpcBpmCzs29yjaZQgYpNTEBDodDFXQ5tcOLLuMFrqPRyyaKmS7xb+3wolgPKD+WpDrIdCW4nDi7hVf3OTQLurSP5eWx5yMxwYmHL+2qXGb0Ef3LleciNdGFl67rDY/OZ0/79adXa6mqdxKDLs3zoPfZuianpglpbXvZAdqarpr7dzkdeOqKHvjsvotVz2+iOEnC5LvHpTM8bvvYYnxfvHlzX5zT0qtaYulU0HhXHz0F7K6exXcqLLJpNPwmthso9wcNiyyt2HDgJF5YsBMAIuoPxACpyOfHez/k4q1l+/DK0j2YOLIrfjf4LNWyK0A4OxCSjNs0+FRBl/GwpSfRBV9VUBnaLK8+IWekuPHHy7rhsc/C9Wz/XKK/QLY4JFoVCGHX0RLc/O/VAIDcv40xzCK5XU7dLN3jY7pjXP8O+H73Cfyiawv88ZOawnttEaycRclIcUcdQgWAXXnqHwJrck9i+U8nTLfJSNGf3m1U02Um0+NWMm1ulwPna7JXScIQZmUgpCyUnZjgjNrGQXd4UbhsbN/2+O/agwCgWtcNCBfTFwoZQCvDi4kJTrx7W398s/M4hndXd2oXh4vETIhh7ZZRpsugJkY8MYrDdnLQk67JdIlZBrfTiVibmOsNL6aogi6hWF5VJK9ug1CXw4tm9Grz3r2tH1xOR0RmtH/nptgyeRSCIQkvfRX+rBtNcLh5QCfceGFHuJwO3U712ky/3vNmVNOlfR8nuByGP2IB/WW17BKH8MQZn1npybhNp8O/WU2XSHyMVn+YPXDJOfi/r3fXHFuMGdCebTOw+OEhqqHeU6GFJjNdtVDo8ys9dRq7MuGELWaOxJluZVXRT+qiHw8WYvexEuXfh4RaIm3WTMwGFZX7sU5YR27Kol2YJnwI5eFF+cRiNLwoBkOlJpmu9tV9ieR2FXKw5kl04dd92ionNe3adsq+heeuKhhSHXsoJBnWS+mdaHM6ZuJ3g8+CNykBI8/NQrLbpfpCFoOBCZd2xVcPDwGgPvEC4Wn/er2K9heEa9PEDtw3vb3KdCUAo0W29WYvmsn0uFUn1lbpyRETA5LdLiQL9T8/V7eacLvCM8CWPToMA8/RnzKvW0iv6hlUc7n2vawdUrHSpwsITywYc17riIBBzFwkR8nQAcb9g9SZrpoHIAY6Ys8jOeugGl7UzFasTaZLd/ai0AdMDEASNZkuvSyYOERdl7PUZHr1QEOzW2Jwlxa6t0/UzPQ0e1vLt9MLurSTcbT98wD1ayQGZdpjdrucpjWydTG8KAanzYRhOfE7W3tMMqMWE4A6yLG6XuP4S7vi6gtqfpTXNhg/FZIeIgZdtbTnWCmCIQnf7z4R0ZW7MRFPQuoC9Jpj1mYHornqlRUY8dJ3yheQmHnSrgEoBl3F5X5VsAcA05buxn0z12PG97nYfSycrZG/tMShsaJyP26cvhLv/5Cr6vlllgVq3zRcmCq/PmLQlZLowrNXhXvJWPmV9IcPNmBjdRsGeZ9Gw4t6zVr1hiHEE7jD4cDjY7rjtoGd8IdLzkGr6l+lYtCV0zETk37ZXblOJC8Vc5am6eTH6342fEyWgi4Lma5m3iTVCS0rPTkiuJGDiVbV3a3lgFoOnto39aBLS/0aNt2WEQZnTW1yQLsMTG2XHlGdRIUTmuHsRYOnL8FgeEac0dpEbA9R/XyK7weXwxHR7+uSbuHM3Hntapa5sULvORYDJ3VgJdZ0uVRZMPl9INbrWJkxalcsWRL1ezn6+1ovgNN+V4jv+xd/cx5yOmZiwshs3eu1ma4ebdJN2/b4Yyik/+SeizGieyvl33afJ3XW1TjoEjN+VnvXORwOVXf7ugzGjZZ7akwa/xE2cruPlyKvuAIPzvoRF3Rogk/vHdjQh6RLXJi33F8ToIi1UEbr9hX6qlBSETBsFVBcEQgPfwn7KqsMwpOYgMpAEJKkGV4s9+vWKXy5+Qi+3HxE+bdc3yRm5matPoAVu/OxYrc6c2NW09WuOtNVpGS6qhcvrj5JyEGZVbPWHFT+3n2s1NZ6h3oJCO3Q3e8GnxVxmybCEKC8FI1Rt2wg/Jg3/lxTLxexRqDAaAZg6yY1X4zadR/1ZHrcOFFa8yWclZEckSWQA4gOzTzYebQmS6pat83gu1vvxCGeHMyCZvHXek7HzFoX4YqZDSsnDaNhLKNCevF5E4PiYPUJuL3QVV679p/b5UTTVBe2/WWU7UCnhVcdyI/o3lIVTKmGFzUnZm2TVkCdIa2XTFcMgZwYoFqJE+76xVlITXRhkBB8RQwvCju6tm97XNu3veZ6Yfi3+jn57N6LsXpfAX5zQTtViYGWeFf9OzXF6twC/KKrfiZPltMxE9Nv6YtOf/oSQGQ2qbk3EScMVpcA1J9Hs+FF8ceN1ZYRgHaCRe2D8Rd+cx7yS6twVgvjrvyNBYMumzyJToinr93HSpUhkvUHChttjZc601UTxIjZIrH4uKjcj38s3oUxvVrj7vfXobQygOV/vER338eKK5CR4laKtoHwcGZzbyJ+9a8VKCyvUgVOReV+S00xW6UnY/OhItXw4hGDxrRmNV1ykCIvyiwHSXK2o73JsijR/Ob1H6LfSBCtc7URcZiudfXCvB6DhWu1t4+VuPi12F8LAO4dejZe/WYPOjdPVdptNPEkquqmstKTNYvoOpVgQpuJEwM/oyWLohXSmwVd8g+G1EQXplzbu9afUW2H8WiM7k7b1FQmZhfEwEXOEHdqrg66nKohM3lYzP7Xe4dmHvz1qp5IT3GjUzMPsrPS8MrSPcr1RoX0LdOTdGc0i4+7fmq6ahfIWalVdLucuFVT92SW6Yp2P/LffTpkqtqQWPHaTRdg7qYjuPL8Nra20z5PHZulmgZd4moDZsOL4mtup01JXQ87X6cJchszDi/apJ3JsftYKc4WoutdRxvnjEaxpkvVasEg0/Xq0t14Z0UufvP6D8gvCwdN+zSLFss+Xv8zyioDOFFS8yH++WQ5SioD2Hm0RBnykhllurTaVmdaKgMh+KoCmLPxsNKcVavYJNMlF6MXl/tR4Q/is+pWH/IJpInHbXl2oB1Ds1vg8vNa469X9VQu06u1sZKWF4eTspSgS6jTSFUXw6drWk809ybG1Eagayv9X44TR2Zj8cND8Kiwxl+mx60KELIykjW1SW4l2OmsCbrEE7hR0KWXkRODJ7M2Jo9elo0Zt/fH2scvjbjvWKhmownHZVxIH3umSyT/AOnYrOYxlFUGUJcti266qCN+1bsNzmvXBEkJ6lot8fUUX4+WaUm6ywWJh1WXa+wp+6zlCdvKDx49EbMXozZZjQy6VPuzWLbVzJuEWy7uZLi2oRHt8/TnMd0BhGfl6lFNFDH5buzULLbPUnI9T7BozJjpsik1KQEnhB8Ie4+XqWpQVu7NV3WulvmqAvjTJ5txWc8s/LJX63gcqvr+VcOLRkFXzd878mqGfmQFZZURlwHAG9/uxdGiClXgc9Pbq/AbYdqzqKjcb6k4VG4S+NW2o+jx5MKotzciZ320w5fyycThcKBdZoruY45V2yYpeHxMD2UR2sc/3wJA/8QzuldrzPhhv5LB0iPW9cizjzzCcE631mmqIdf0ZDeu6N0GX2w8jPfv6I8BZzWDPyjh+rdWKksDdctKw73DzjF9HK/flIPr31qJ3w1SD3k6nQ6c09Kr9D4DwpkuMfOUlZEMj7jmmzBMoQ18Ys10ackzVSMvT8CQKEMydjg1QdeQri3w7a7j+O0A/ZOYlUxXoiro0v9qln+siD8SDhaUx9wM1QpxKChVNbxYc58t05LRpWVkdlV83PUxAlDroakYDymykN5+pkv0z3Hn48FZP+Lx6mCormmfpws6ZOLHJy81rOcUXyqzSSdNUxOx+OEhhj8SjCSrhhfPrNwPgy6bzmnpxf6SmmzWocJyrNpXc7I7UKC/xt9b3+3DnI2HMWfjYeT+bUydHEuhrwqfbTiE6/q2j9rqQSw0r6gKosIfxPYjxaoZgGLdl944vtHQHgB8/uPhiKJdo+LtonK/pYWjzRaztcPoi0U8sQ04u5nloGv1Y8MxYfZGLDNoxTDwnGaY+buLVJf98bJumL5sLyaN7hZx+4vOaoa59w8yXV5HN9MlfHH1bJOhDrpS3Jh6bW88fGlXJcBJcAFj+7XHjwcLkehy4r93DUCGx3wY8qwWXqx6bITh9eIXZhOPWxVMt9ZkusQv/s4tNEGXEHAYTZE3WvJHJiGcAdp+RL/fWn1Jcrvw+k052HDwJPp3ipxRCljLdKmGFw1OYnoZ4oMnffWSqZWlGGS6tMOLXVul4d3b+qFdZk2NpNGszboS69DUqHNbYdfR0pgXl9a+RaPN7k1Q1ZFFPidXnt8WI7q3qlXLHj1tm6TgUGG57oQKs2xZs9RE/KJrC7idjoiZ01rntLRfR1XfrUQaMwZdNv3psu4onbcHt17cCU/8bwtOlFZhq9BUM79UPxtUH41Ub3hrFbYdKUbuiTI8fWVP09uKw4u+qiD+MncbPlh1QHUbn5ABO6ZTeH3YYHqx7ESJ/mPXKir3W1oOyGiGmbbPi5nJV/QwrG8Sf53dM+RsvLMi19I+W6Yn46zmqYZBV3OdIu17hp6N3w85y/DXfs+25rPMxF5aNZmumo9vl+ru0HLAkp6cgMQEZ0RG6fr+HTAsuyUq/MGoAZcVYmPDTE8imnlrjjM7K10VlIlDHC28SaqsVF1kuiQJeOWGPvjTJ5tx3yXmGby6lJzgREqiCxef3dzwNlYyXarhRYOTr3j7Ed1bYfH2o7jhwg6YJ2Rw65p4ghQ/M+LL1LK699rQbHU/s/oub7XbtFf2+k05kKToHemNaDNdZ7UwH2ZTBdcG96kNuLq28mLX0dJaDYcvnTgU/mDIdjDncDjw3u39Y77faNRB15mV6TqzHm0daJWRjP/ePQCje7XGi7/pHXG92LeroKwK76zYh/KqoCqzY2etPkmS8P7K/Vi9ryDi8m3Vv+gXbTsadT9iF/ZyfzBif4B6odXDhTpBl0mmCwCOWQy6DheWW2r4p1fDc9X5bSyfUN++pS9uHdjZuCWCcAJpmZ6M2b8fgGk39LG0b7OhEr2gK9o20ahaMejUdLVtkqL65arX2V7cvlMd1DUB6kxXpseNR0Zl4/5LzsHKScPhTUpQPeZkTWsFMZPptpDpinZ+lCDhrBZefPT7AXU6lGhE7hSf0zF6MbRRpivBYHhRm+l6eWxvpCcn4F/X13TfnnZDH/zvvoG4oX+HmGuTrDDqSF/kq/muM/qMiYup1wftwzbKNEZu54g54AIiM12/7Nkaj4zKxgd3Xmh4fzKrQ8H/vrUfbr24E2bcFnvwk5jgrPPsWV0wyoCfCRrfq3EKGdatJZp43KoZW+KMkL9+uQ2frj+EYEhSTbk/VlyJ177djaPFlXjr5r4RH8KqQAgbDpxETsdMLN99Ak9U1wOJw5I/HavJnLWprn3adbQEj8zeiCFdW+CB4V0gAfjX17sx6JzmmkxXQFWLU3N5ODALhiSlxcAbv83BnuOleGHBzqiZLqudk9cbrMunpTdkEl7yxNqHVA7ajAIQ7XBVv+ov7D98sEG5rGsrL/KKKuAPSqpaOJ9JI1lx0ei60jRV7EqeUP3/muehXWYKzm6RqnR41xbS1xfxV2oTTyLOa9cE57VrontbbTFvi7Qk7K2enKHOdOkPPUcNWuPcjfr7Pw2HryqgajZpxOjIxYkV4vCiNsv76z7tcNX5bdVBrLtmvcr6rOlKVmW6at5X4hqfRq9NTsemeOe2fjEXXEcjBpuPjMrWXZ+xPmgnbTidDtwXpT5SZvW1apfpweRfnWv72E4F4vcGM11kS1PNuLg8vChJkjL8tO9EmWrK/c6jJfhw9UF8veMYzn5sHqYv26vax/sr92PsmysxdMo3+ERYVLvTn77E1zvCWa1VQodx+T4Xbc3Dxp+L8H9f78YHqw/gq21H8X9LfsJ1b/yATT8XKrffc7wUlYEQnA6oMgJyIHGspALBkIQEpwMjurdC89TwSSVa0AXUbVGkHEyKbujfwXQbcSq1HFSJNQkf3T1A+bvYYIhT/FKc/fuLsXjCEPTtpM5mZGUY9/YyynTVxgUdMvHoZdl4/aYc5TKx9Uer9GTVkjtmma66JAbAmVFmVGnfG2JwqqrpEurCdv71Mgw6pzkGndMczb3m+4/3CiApiS5LARdgbe1FMYDQnQloEnTqNd2tK+KuxUDf6vt8WHbLOpkxqkc8tnuHnl0vn726dm6b9Og3Os0l13GfrlMJM121lJmaCAitFArKqhAKSdhzvBTHq4fbDhT4cLioJmD5btdx1T7++uV2VUPM5T+Fr//5ZLnSA0x2z3/WY+dfR6saSx4uqkAoJKmG95buOIauwqrxYqPMLYfCw5LntPRixu398Y/Fu/CPxT+hrCqIo8UV+HJTuD4kKyMZLqcj/BiBiNYPAPDlA4Pw17nb8cPefLRMS8Koc7Pw/sr9ps+ZVa00GaO59w+KqH1yuxxK76J3b+sHh8OB//14GEBN9iTZ7cI7t/YDHFAtnSP+UhclupwoD4WzWuFhEzf+ds15mLpoJ26v7tdz1y/Ows8nfejSMg1/X7BDtX19ZLocDgfuHar+JZ0lzHZMTHCqMkx10afLCnFYMDNKjZj2y1U8QYoz4cSarqQEF96/o7+loVmzrt4NrXe7DCzeHlkGIK69KBbJe3QajZqpzVCZHWItzh2DO+NIUXmDzMaWiYFqPPsjxvJW2/jUSJRXBS0H6qcz1nTFqKSkBJMnT0avXr3g9XqRkZGBfv36YerUqaiqqt2ahEePHsWECROQnZ2NlJQUNG3aFIMHD8b06dMtfbnu2bMHd999Nzp37ozk5GS0bNkSo0aNwieffFKr49JqqumPFAhJKK7w4/s9NZmotbknVR/SbzVBF6D+wjVrHFoZCCEUklT9wKoCIRwqLMdRofh9be5JbDlcpLcLpYhdnnUi/3rNL63E1a9+j79+uR1AzRIi4tCWVsdmqcovt1sHdtJdhuHK89sg0eXEVUIWqq9JHUyiy4k3f5sTMSNIDLg+vPMiDM1ugRd+c55yWbPUJNWQpDhkNaxbSwyrLvKV62guMKg30ev907ZJCl667nzlGLxJCXjpuvNxVZ/IJoXRMjJ1JadjJl645jx8ck84e9ezbc0v6HhlusRhsGiBXqdm6tmZYnAqnjDF2W/a605Vdw05C49elo259w/CB7+rqfsRM1Ti5z7aTE2t+sx0icGxGNx5kxLwt2vOi9odvT7FKdaMIMWQV81Icat+KJ3JWNMVg/3792Po0KHIzc0FAHg8HlRWVmLt2rVYu3YtZs6ciSVLliAz017HXQBYt24dRo0ahfz8cODi9XpRUlKC5cuXY/ny5Zg9ezbmzJmDpCT9Xwzz5s3DtddeC58vXLeUnp6O/Px8LFq0CIsWLcJtt92Gt99+u06+zPV+3Z8orcKK3TUz27Rr8+m1ldif71OCILk1w60Xd9JtBrr7eKmyPqFs8AtLVf8uqQwoLQQeGZWNFxfujNiPPLQo12ks3Kr+JS7XOBkNG53T0gtvUgIeHNEFg7u2wOBzmquyPlf3aYuvth/FpNHd8fdrzoMkhVtLAOEp5lovXHMefn1BW0hSTcAkzsgTDTi7GQac3Uw1bNrUm6iqXTMa6vx6wlB8v+cErr5Av49YTodMLNlxzNLMK3F5Hll9ZLqMXCfUsHRsloqJI7vC6XTUem1BqzJS3Hj9phwkJTgNp36/+dsczN+Sh98PPVt1udFSPA9fmo3SyiB+3aet7vV6x1BU7sewbi2j37iBJCW4lEzlsZKaH0fi5Du/MNnG7neTqy67o2p0bZWGJy/vYdpHrsE0UEAew3KIJBAn1dhZPuh0ENOjDQaDuOKKK5Cbm4vWrVvjq6++QllZGXw+H2bNmoW0tDRs2LABN954o+19FxUV4fLLL0d+fj66deuGNWvWoKSkBGVlZZg2bRrcbjcWLVqE8ePH626/b98+XHfddfD5fBg4cCB27tyJoqIiFBUV4cknnwQAvPPOO3jxxRdjeegRxMJSedr0sZIKrBRqrqwY8dK3uPj5JXhk9kb8XF3/dX3/DujcPBUpbhd6C31WHpz1IwrKquBw6C9o20b4cnQ5HcqQmGjQOc2VpRNaGgQJctCVlZEckQI+r10G3r2tHwAgLdmNIV1bwOl0qJb7eWns+Vj3+KXV27tU+9AGcr8b1Bm/yWkHt8upylBFCx7ERaWbpSaqZuokuvS37dDMg3H9OxiuOfj335yHmy7qgLn3DzK9b0A/Na6t84unP1zSJWIYsr5d1jPLNOAZeW4WXh57fkTDz0Fdwi0WtNnRDI8bU6/rrVwfzeKHh2DG7f3xq972lkZpKGK3b7GPlXYReDtqu5ZkNLcP6ozRDTiMaKShMl1mqx9QdKreb2dYn66Ygq53330XmzdvBgB88sknGDEi3DzR6XRi7NixeOONNwAA8+fPx5IlS2zte8qUKcjLy0NKSgrmzZuHvn37AgASExNx33334emnnwYAvPnmm9i1a1fE9k8++STKysqQlZWFuXPnomvXrgDC2bKnn34ad911FwDg2WefxcmTJ2N49Griibtj9fDJ9GX7UFwRQFpSguqkHG068+GiCsxe97MyzNCxmQfzHxyMjU+NxP/+MAhTrw23qJCbP3ZqlopnruyJBy45R/XlI/bsGtevPVISXVjxp0tUwdeAs5spv6Yv6dZSGZrq36kpumWl4dw26ehW3Vnfk5iAL/6gDkDm/GGQspC0qFLT9FR8fsRf701TE3HfsHDm475hZ+Pxy3vo1qVol7fREgt7k90uw+FFO5p7k/DXq3rh3DbmvbMA/YxEtEaJFNamSQqWPToMyx4dVqv9tEhLwpCuLU6ZYUhxKFA8eV94lrV2B3oeGtEFv+jaAv8cd35tDu2UM+rcLADAhZ1jf+5iMbL6flvpZOwpumS3C/8cdz6mXtu7TvoFnkpiOjvMmDEDADBs2DAMGDAg4vpx48ahc+fwCf69996ztW/59uI+RPfffz+8Xi+CwSBmzpypuq6srEyp2brnnnvQpEmTiO0nTZoEACguLsbnn39u69j0iLUXvzo/PBzy9Y5jAIDLe7dW9SIa1TPL8n6dDlRnh1xK8DDmvNZKP5ycjpn429W90Lt9Ezw8MhsXCZ2VB53THH+7uhceuOQcPF095bhtkxRcJtx/j9Y19T8JLifeurkvfj/kbPzz+vMx/8HB+PKBwargoUurNCWrZrbkhbxeohG5/uO6vu0x4dJsLHzoF5hwabbh7V8eez6aeNx47te9dK/v2TYDfxrdDa/dGO5f5K0OdF1OB1JtFiPHSs4sjujeCq/ccEGUW5OofVOP7XXkTnVpyQlo3zQFbTKSVfVS57Vrgk/vvRirHxtue59NPIl47/b+uPJ8a0Oyp4vm3iRs+8sofHjnRdFvXIduGdARb/w2B18+MDiu93s6ufL8trjGYKm405ntmi6fz4cVK1YAAEaPHq17G4fDgcsuuwyvvfYaFi1aZHnfO3fuxIEDB0z37fV6MXjwYMyfPx+LFi1SMl8AsHz5cpSXl5tu36lTJ3Tv3h3bt29X6rtqQxyPvqF/ByzamodlP51AVnoy/nhZN/z5sy3IzQ/XcBktl/DJPQPQu10TOB0OnPXYPACRzfeAcBD271v7IfdEGa6+QN2zRxyuS0l0YZxOawUxEaCdttw6IwV/0lmiRvT6TTl4/PMt+N2gyGBYdsegs3CosFz5Bar19i19UVoRUGZE6q1TKerTIRMbnrjUNIvx+yE1tUIupwOv3ZiDcn8QaXEqJl/08BCcKKmss4ajdHpzOh1YOmEoJET2bLqgg/0a2DOd0TqV9SnB5TT8jiMyY/vdun37doSqqwh79jReeka+Li8vDwUFBWjaNHr6d8uWLRHbG+17/vz52LZtm+H2555r3FSuZ8+e2L59O7Zu3Rr1mKK5vHdrvLx4F3q0TofL6cCM2/pjf4EPTVMTkZHixsMjuyqLLJ/dIhV//mV3PDd/O967vT8q/SG0Sk9GL6Eu69+39sWd763DjRfq96PK6Zip2wE72jIUQDjbJYul2LtNkxT8+9Z+prdJSXTh+avPM7ze7XIqAZdVdoeN4l1Q7U1KqNe17+j0wyFoojOT7TPF4cOHlb/btjVOZYvXHT582FLQZXffxcXFKC0thdfrVW2fmZkJj8d48WB5e/H+tCorK1FZWdOXqqioSLlPUYsk4Kv7+iHD41aua5YIwF+OYn85WiQB08edi8LyKqS7AriudzP8qsfFqkJCcZ9926Rg0X19kelJjLgvM2PPb44ftv+Mkee2NNzO6wRm3twLmZ5ElJRYW9yZiIjoVCafExtDLz/bQZd4sjYLbMTrrJ7gY923HHTJ25ttK15vdlzPP/+8auhS1r59fJaZiNUnAO5u6IMgIiJqZPLz85GREX2CVH3imIiBSZMm4eGHH1b+HQqFUFBQgGbNmp0ys6ROV8XFxWjfvj0OHjyI9HQuqdGQ+Fo0Lnw9Gg++Fo1HUVEROnToYGnErb7ZDrrS0moKn+Xmo3rE68Rt7Ozb6I1qtG/5b7PjEq83O66kpKSI5qt6syGp4aSnp/PLrJHga9G48PVoPPhaNB5OZ8PXUto+gjZtahoQHjp0yPB24nXiNnW57/T0dGVoUdz+5MmTpoGXvL3V4yIiIiKqLdtBV/fu3ZVoUZwtqCVfl5WVZTmlJ85YtLLvHj16GG5vNjNR3t5shiMRERFRXbIddHk8HgwcOBAAsGDBAt3bSJKEhQsXAgBGjhxped/Z2dno0KGD6b7LysqwbNky3X0PGjQIKSkpptvv378f27dvt31s1HgkJSXhqaeeMlx7k+KHr0Xjwtej8eBr0Xg0qtdCisH06dMlAJLD4ZBWrlwZcf1///tfCYAEQFq8eLGtfT/++OMSAMnj8Uj79u2LuP7vf/+7BEByuVzSzp07I66/6aabJABS69atpcLCwojr77nnHgmAlJaWJhUUFNg6NiIiIqJYxRR0+f1+qVevXhIAqW3btkpgFQwGpY8++khKT0+XAEijR4+O2Papp55SAjK9oKqwsFDKysqSAEg9evSQ1q5dK0mSJFVWVkqvvvqqlJiYKAGQ7rnnHt1j27t3r5SamioBkAYPHizt2rVLkiRJKi0tlZ5++mnJ4XBIAKS///3vsTx0IiIiopg4JCm2bmG5ubkYNmwYcnNzAYSHHUOhECoqKgAAffr0wZIlS5CZqe6ePnnyZKX/1b59+9CpU6eIfa9btw6jRo1Cfn4+gPAsw4qKCvj9fgDhYcE5c+YYpgrnzZuHa6+9Vimmz8jIQGlpKYLBIADg1ltvxb///W+2fiAiIqK4iXn+ZKdOnbBp0yY8+eST6NmzJxwOB9xuN3JycjBlyhSsXLkyIuCyKicnB1u3bsX48ePRpUsX+P1+pKamYtCgQXjrrbcwf/5807HZX/7yl9i0aRPuvPNOdOrUCeXl5WjSpAkuvfRSfPzxx3jnnXcYcBEREVFcxZzpIiIiIiLrGr5TGJ3x3n33XTgcjqj/LV682HAfR48exYQJE5CdnY2UlBQ0bdoUgwcPxvTp0xvFeluNhc/nw/z58/HXv/4VV199NTp27Kg8v5MnT7a0j9o+13v27MHdd9+Nzp07Izk5GS1btsSoUaPwySef1PLRnVpq81pMnjzZ0mdm9+7dpvvha1EjPz8f77zzDm666Sb06NEDqampSEpKQrt27XDVVVfhs88+i7oPfjbqRm1ei0b/2WjAejIiSZIk6Z133pEASE6nU2rVqpXhf999953u9mvXrpWaNWumTNDwer1SQkKC8u+RI0dKFRUVcX5UjdPSpUuV50X731NPPRV1+9o+119++aXk8XiU26enp0tOp1P592233SaFQqE6fMSNV21eC3lCktvtNv3M6E1WkvG1UBPfxwCk5ORkZVKW/N/o0aOlsrIy3e352ag7tXktGvtng0EXNTg56OrYsaPtbcXZrt26dZPWrFkjSVJ4tuu0adMkt9ttOtv1TLN06VIpMzNTGj58uPTII49IH374ofL8RTvR1/a5FmcWDxw4UGn5UlJSIj355JPKF9qZMrO4Nq+FfGIZMmRITPfN1yISAKl///7Sq6++Ku3Zs0e5fN++fdIdd9yhPCc33XRTxLb8bNSt2rwWjf2zwaCLGlxtgi65r1tKSoq0d+/eiOufe+45075uZ5pAIBBxWceOHS2d6Gv7XMs99LKysqSTJ09GXH/XXXcpvyrPhB56tXktanti4WsR6euvvza9/u6771ZOuAcOHFBdx89G3arNa9HYPxus6aJT2nvvvQcAGDduHDp37hxx/f333w+v14tgMIiZM2fG+/AaHZfLFfO2tXmuy8rKlFqIe+65R3fx+EmTJgEAiouL8fnnn8d8nKeK2rwWtcHXQt+wYcNMr7/jjjuUv9euXau6jp+NulWb16I24vFaMOiiU9bOnTtx4MABAMDo0aN1b+P1ejF48GAAwKJFi+J2bKeb2j7Xy5cvR3l5uen2nTp1Qvfu3XW3p7rD1yI2ycnJyt9yz0eAn42GYPRa1FY8XgsGXdRoHD9+HDk5OfB6vUhJScFZZ52Fm266Cd98843u7cVF0cXFzrXk67Zt21anx3smqe1zLW5vttC8vL3ZgvVUY+vWrejZsydSUlLg9XqRnZ2NO++8Exs2bDDchq9FbMTvoV69eil/87MRf0avhaixfjYYdFGj4fP5sH79eiQmJiIUCmHfvn2YOXMmhg0bhttvvx2BQEB1+8OHDyt/t23b1nC/8nXFxcUoLS2tn4M/zdX2uZa3z8zMhMfjibq9eH9k7MSJE9i+fTs8Hg8qKyuxa9cuTJ8+HTk5OXj88cd1t+FrYV9hYSGef/55AMDgwYORnZ2tXMfPRnyZvRaixvrZYNBFDa5NmzZ46qmnsHHjRlRUVKCgoAA+nw8rVqzAiBEjAADvvPMOxo8fr9qupKRE+dvsAyJeJ25D1tX2uZb/NttWvJ6vk7kuXbrghRdewM6dO1FRUYH8/HyUlZVh4cKFyMnJgSRJePbZZzF16tSIbfla2BMKhfDb3/4WR44cQVJSEv71r3+prudnI36ivRZA4/9sMOiiBjdy5EhMnjwZ5513nrK8k8vlwsUXX4yFCxfiyiuvBAC8+uqr+OmnnxryUIkahRtvvBGPPPIIunbtCrfbDQBITEzEyJEjsXz5cvTr1w9AuFFkUVFRQx7qKe/BBx/E3LlzAYS/g3r37t3AR3TmsvJaNPbPBoMuatScTiemTJkCIPwr54svvlCuS0tLU/6WFzfXI14nbkPW1fa5lv8221a8nq9T7JKTk/Hcc88BAEpLS7FkyRLV9XwtrJs4cSKmTZsGAHj55Zdx++23R9yGn434sPJaRNMYPhsMuqjRO+ecc9C8eXMAwN69e5XL27Rpo/x96NAhw+3l69LT0+H1euvpKE9vtX2u5e1Pnjxp+oUmby/eH9k3YMAA5W/xMwPwtbDq0UcfVYagXnzxRTz00EO6t+Nno/5ZfS2saOjPBoMuOmWJM4XEWSda8nU9evSo92M6XdX2uRa3N5vxI29vNnOIaoevRXSPPPIIXnzxRQDACy+8gIkTJxrelp+N+mXntaiteLwWDLqo0duzZw9OnDgBAKrGg9nZ2ejQoQMAYMGCBbrblpWVYdmyZQDCtWMUm9o+14MGDUJKSorp9vv378f27dt1tyd7Vq5cqfytbdbJ18LcxIkTlZKGF154AY888ojp7fnZqD92XwsrGvyzEVOffKI6Em3R0FAoJP36179WFsTesWOH6np5+Q2Px6O7gOnf//53LgMUhd1lgGJ9ruXlNVq3bi0VFhZGXH/PPfdIAKS0tLQzYqkTPVZei2ifmYqKCunCCy+UAEipqam6S5nwtdA3YcIEZXmZKVOmWN6On426F8trcSp8Nhh0UYPat2+f1K9fP+n111+X9uzZo3xogsGg9MMPP0ijRo1SPnh6i8WKC8326NFDWrt2rSRJ4YVmX331VSkxMZELXmsUFBRIx48fV/5r3769BEB65JFHVJeXlJSotqvtcy0uJDt48GBp165dkiRJUmlpqfT0009LDofjjFrUV5Jiey2++eYbafjw4dL7778vHTx4ULm8qqpKWrx4sdSvX7+oi/LytYj06KOPKs/bSy+9ZGtbfjbqVqyvxanw2WDQRQ1q3759yocAgJSUlCQ1b95cSkpKUl1+2223SX6/X3cfa9eulZo1a6bcNi0tTXK73cq/R44cKVVUVMT5kTVecjYl2n+33HJLxLa1fa6//PJLyePxKLfPyMiQXC6X8u9bb7016q/V00ksr8XSpUtV16WkpEjNmzdXvQ5Op1N67LHHTO+br0WN/fv3q567Vq1amf734osvRuyDn426UZvX4lT4bDDoogbl8/mkf/3rX9INN9wg9ejRQ2rRooWUkJAgeb1eqVu3btLtt98uLV++POp+8vLypPHjx0tdunSRkpOTpSZNmkiDBg2S3nrrLSkYDMbhkZw6ahN0SVLtn+vdu3dLd955p9SpUycpMTFRatasmXTppZdKH3/8cR0/0sYvltfixIkT0pQpU6RrrrlG6tq1q9S0aVMpISFBSk9Pl3r37i394Q9/kDZt2mTp/vlahGl//EX7z2j4l5+N2qvNa3EqfDYckiRJICIiIqJ6xdmLRERERHHAoIuIiIgoDhh0EREREcUBgy4iIiKiOGDQRURERBQHDLqIiIiI4oBBFxEREVEcMOgiIiIiigMGXURERERxwKCLiBpMMBjESy+9hD59+iA1NRUOhwMOhwOff/55Qx8aEVGdS2joAyCiM9dDDz2EadOmAQASExPRqlUrAEBycnJDHhYRUb3g2otE1CBKSkrQrFkz+P1+vPDCC5g4cSIcDkdDHxYRUb1h0EVEDWLNmjXo378/gHAA5vV6G/iIiIjqF2u6iKhB+Hw+5W8GXER0JmDQRURx9e6778LhcGDo0KHKZXIBvXh5p06d4HA48O6776K0tBRPPvkkevXqhbS0NDgcDuTm5qr2u2HDBtx+++04++yz4fF44PV60bt3bzz++OM4ceKE6TGtXLkSV111FZo3b46UlBRkZ2fjz3/+M0pLS5Xj7dSpU60ed2VlJfr06QOHw4H+/fvD7/fr3m7s2LFwOBxo06ZN1OMmolMLgy4iiquUlBS0atUKmZmZymWtWrVS/mvatKnq9vn5+cjJycEzzzyDXbt2ISEhcv7PU089hZycHLzzzjvYu3cvHA4H/H4/Nm3ahGeffRbnnXceNmzYoHs8//73vzFw4ED873//Q35+PpKSkpCbm4vnnnsO/fr1w8mTJ+vkcSclJWHWrFlITU3FmjVr8Nhjj0XcZvr06fjoo4/gdDrx/vvvo3nz5nVy30TUSEhERA1g6dKlEgDJ6GuoY8eOEgDJ6/VKWVlZ0qeffipVVVVJkiRJBw8elMrKyiRJkqSXX35ZAiClpaVJzz//vHTkyBFJkiQpEAhIa9eulS655BIJgNSuXTuppKREdR/r1q2TEhISJADS0KFDpe3bt0uSJElVVVXShx9+KDVp0kRq0qSJBEDq2LFjnTzut99+WwIgORwOaeHChcrl27dvlzwejwRA+tOf/lQn90VEjQuDLiJqEFaDLpfLJa1fv173NsePH5c8Ho/kcDikxYsX697G7/dLOTk5EgDp5ZdfVl03evRoCYDUtWtXyefzRWy7YMEC5RjrKuiSJEkaN26cBEBq1aqVdPToUamiokLq3bu3BEDq37+/ElwS0emFw4tE1Khddtll6NOnj+51M2fOhM/nQ9++fTF8+HDd2yQkJOD6668HACxcuFC5vLCwUPn3I488gpSUlIhtR40ahQEDBtT2IUR444030LlzZxw9ehS33HILJk6ciI0bNyItLQ0ffvgh3G53nd8nETU8NkclokZt4MCBhtctX74cALBlyxZkZWUZ3q68vBwAsH//fuWy9evXIxQKAQAuueQSw20vueQS/PDDD7aOOZr09HR8+OGHGDRoEBYsWKBc/tprr+Gss86q0/siosaDQRcRNWotW7Y0vO7w4cMAwkGVHFiZEdtUHDt2TPm7bdu2htu0a9fOymHaduGFF+LBBx/E1KlTAYRnLd544431cl9E1DhweJGIGjWXy2V4XTAYBAD8/ve/hxSuUTX9T9tmoiEVFhZi9uzZyr/Xr1+P0tLSBjwiIqpvDLqI6JQlDylu3rzZ9rZiBu3QoUOGtzO7rjbuvPNOHDhwAG3btkWzZs3w008/4Q9/+EO93BcRNQ4MuojolCXXe61cuVJVr2XFBRdcAKcz/BW4dOlSw9t9/fXXsR+ggbfeegsff/yx0o/r7bffBgDMmDEDH374YZ3fHxE1Dgy6iOiU9dvf/hYpKSkIBoO47777lOFGPaFQCIWFhcq/mzRpgpEjRwIApkyZgoqKiohtFi9ejO+//75Oj3nHjh146KGHAAB//OMfMWzYMFx55ZW49957AYSHSvft21en90lEjQODLiI6ZWVlZeFvf/sbAODLL7/EpZdeihUrVijBlyRJ2LFjB1566SX07NkTc+fOVW3/zDPPwOVyYceOHRgzZgx27twJAAgEAvjoo49w3XXXoUmTJnV2vJWVlRg3bhx8Ph8uvPBC/OUvf1Gumzp1Knr27Ini4mJcf/31CAQCdXa/RNQ4MOgiolPaAw88gBdeeAEulwtLly7FoEGD4PF40Lx5cyQlJaF79+6YMGECtm/fDofDodq2b9++ePXVV+FwOPD111+jW7duaNKkCbxeL8aOHYtWrVrhySefrLNjfeSRR5R+XB988IFqSaPk5GTMmjULKSkpWLVqFZ566qk6u18iahwYdBHRKe+RRx7Bjh07MH78eJx33nlITk5GYWEhvF4v+vXrh0cffRTff/89brjhhoht77rrLqxYsQJXXHEFmjZtisrKSnTs2BGTJk3C6tWrVWtE1saXX36Jf/3rXwCAV199Vbcf17nnnqu0kPjb3/5mWmtGRKcehyRJUkMfBBFRY/Xuu+/itttuQ8eOHRtVywkiOvUw00VEREQUBwy6iIiIiOKAQRcRERFRHHDtRSIiGw4ePIh+/frZ2qZ9+/ZYs2ZNPR0REZ0qWEhPRGRDbm4uOnfubGsbFuETEcCgi4iIiCguWNNFREREFAcMuoiIiIjigEEXERERURww6CIiIiKKAwZdRERERHHAoIuIiIgoDhh0EREREcUBgy4iIiKiOGDQRURERBQH/w/ChoQfFw47IAAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig = plt.figure()\n", + "ax = fig.gca()\n", + "\n", + "abs(dataWithoutModulationFFT).plot.errorbar(ax=ax, x='freq_x')\n", + "ax.set_xlim([0.5, 250])\n", + "ax.set_ylim([0, 0.05])\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Dark" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.DataArray 'CH1' (x: 1200)>\n",
+       "array([-0.0376, -0.0336, -0.0328, ..., -0.0328, -0.0336, -0.0388])\n",
+       "Coordinates:\n",
+       "  * x        (x) float64 0.0 0.002 0.004 0.006 0.008 ... 2.392 2.394 2.396 2.398
" + ], + "text/plain": [ + "\n", + "array([-0.0376, -0.0336, -0.0328, ..., -0.0328, -0.0336, -0.0388])\n", + "Coordinates:\n", + " * x (x) float64 0.0 0.002 0.004 0.006 0.008 ... 2.392 2.394 2.396 2.398" + ] + }, + "execution_count": 71, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "filePath = r'F:\\Jianshun\\AccordionLatticeShorTermStability\\dark.csv'\n", + "\n", + "data = read_csv_file(filePath, csvEngine='pandas', csvKwargs=dict(header=[0], skiprows=[1], encoding = \"ISO-8859-1\",))\n", + "dataDark = xr.DataArray(\n", + " data=data.CH1[0,:],\n", + " dims=['x'],\n", + " coords=dict(\n", + " x=data.X[0,:].to_numpy() * 2e-3\n", + " )\n", + ")\n", + "dataDark" + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "dataDark.plot.errorbar()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "metadata": {}, + "outputs": [], + "source": [ + "dataDarkFFT = fft(dataDark)" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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xhjT3pM4H5SWlsrlcsntdjd5/jAAANCxdKT373+7M9IDAAB0RIQuAAAACxC6AAAALEDoAgAAsAChCwAAwAKELgAAAAsQugAAACxA6AIAALAAoQsAAMAChC4AAAALELoAAAAsQOgCAACwAKELAADAAoQuAAAACxC6AAAALEDoAgAAsAChCwAAwAKELgAAAAsQugAAACxA6AIAALAAoQsAAMAChC4AAAALELoAAAAsQOgCAACwAKELAADAAoQuAAAACxC6AAAALEDoAgAAsAChCwAAwAKELgAAAAsQugAAACxA6AIAALAAoQsAAMAChC4AAAALELoAAAAsQOgCAACwAKELAADAAoQuAAAACxC6AAAALEDoAgAAsAChCwAAwAKELgAAAAsQugAAACxA6AIAALAAoQsAAMAChC4AAAALELoAAAAsQOgCAACwAKELAADAAoQuAAAACxC6AAAALEDoAgAAsAChCwAAwAKELgAAAAsQugAAACzQqtBVVlam+fPnKy0tTQ6HQy6XSyNGjNCiRYtUVVXVqokdP35cs2bNUmpqquLj45WcnKyMjAwtXbpUxpgmx7355puaPXu2MjMzddFFFykxMVExMTHq0aOHJkyYoOeee041NTWtmhsAAECobKa5BNOMvLw8jRkzRrm5uZIku90un8+nyspKSdKwYcO0YcMGJSUlhVw7KytL48aNU1FRkSTJ4XDI6/UGwtLYsWO1cuVKxcbGNhg7dOhQ7d69O/Cz0+lUdXW1vF5v4L7LLrtMb7/9trp169biOZWWlsrlcsntdisxMTHk5wQAAKzXkd6/w/qky+fz6frrr1dubq66d++ud955RxUVFfJ4PFq+fLmcTqd27NihKVOmhFzb7XZr0qRJKioq0qBBg7Rt2zaVlZWpoqJCixcvVnR0tNatW6eZM2c2Ov4HP/iBnnnmGe3evVsej0elpaU6c+aMjh49qoceekgRERH69NNPNXXq1HCeOgAAQHhMGJYuXWokGUnmo48+atD+0ksvBdrXr18fUu377rvPSDLx8fEmJyenQfuCBQuMJBMZGWmys7NDnvu8efMCc8vPz2/xOLfbbSQZt9sd8mMCAID20ZHev8P6pOuFF16QJGVmZmrkyJEN2idPnqz+/ftLkl588cWQatf1D64RbMaMGXI4HPL5fFq2bFmoU9eVV14ZWD569GjI4wEAAMIRcujyeDzavHmzJGnChAmN9rHZbBo/frwkad26dS2unZ2drSNHjjRb2+FwKCMjI+TadTZt2hRYvvDCC0MeDwAAEI6QQ9fevXvl9/sl1e603pS6tsLCQhUXF7eo9q5duxqMb672nj17WlS3vLxcu3bt0ty5c7Vo0SJJ0m233aYLLrigReMBAABaKyrUAQUFBYHlnj17NtkvuK2goEDJycltXru0tFTl5eVyOBwN+mzZsqXRrz4jIyM1depULV68uNm5VFZWBo7ErHssAACAcIX8SVdZWVlg2W63N9kvuC14jFW1Y2Ji1K1bN3Xr1k3R0dGB+3/2s5/pwQcfVHx8fLNzeeSRR+RyuQK33r17t+g5AAAANObf9oz0l112mQoLC1VYWCiv16sDBw7o7rvv1p///GddfPHFWrlyZbPj582bJ7fbHbjl5+dbNHMAAPDvKOTQ5XQ6A8sej6fJfsFtwWPao3ZERIS+8Y1v6Mknn9Rjjz2m8vJyTZkyRceOHWtyTGxsrBITE+vdAAAAwhVy6OrRo0dgublTLgS3BY9py9qJiYmN7s/VnLvvvluxsbEqLy/Xyy+/HNJYAACAcIUcugYPHqyIiNphwUcbflVdW0pKSot2opfqH7HYktpDhgxpUd1gcXFxgfkcPHgw5PEAAADhCDl02e12jRo1SpK0Zs2aRvsYY7R27VpJtddJbKnU1FT16dOn2doVFRWBc22FUrtOWVmZTp48KanlX3sCAAC0Vlg70tddt3Djxo3aunVrg/YVK1YoJydHUu35sEJR13/58uWBi2kHe/LJJ1VeXq7IyMgG13asuyB2cx577LFAvzFjxoQ0NwAAgHCFHbrS0tJkjNGNN96oDRs2SJL8fr9WrFihadOmSao9q/w111xTb+z8+fNls9lks9kaDVWzZ89WSkqKPB6PJk6cqKysLElSVVWVnn76ad1///2SpOnTp2vgwIH1xi5btkzf+c539Prrr+vEiROB+/1+v3bu3Knp06frd7/7nSRp1KhRgbPmAwAAnGshnxxVkqKiorRy5UplZmYqNzdX1157rex2u/x+v7xeryRp2LBhYV0b0eVyadWqVRo3bpz27Nmj4cOHy+l0yuv1qrq6WlLt14pPPPFEg7HGGL355pt68803JUkJCQmKj49XaWmpqqqqAv2uvvpqrVixQjabLZynDwAAELKwz9PVr18/7dy5Uw888ICGDh0qm82m6Ohopaena+HChdqyZYuSkpLCqp2enq7du3dr5syZGjBggKqrq5WQkKDRo0dryZIlWr16tWJjYxuMmzhxop555hndcsstuvjiixUfH6+SkhLFxMRo0KBB+vGPf6y33npLGzZsaPHO/QAAAG3BZowx7T2J80FpaalcLpfcbjfn7AIA4DzRkd6//23PSA8AANCRELoAAAAsQOgCAACwAKELAADAAoQuAAAACxC6AAAALEDoAgAAsAChCwAAwAKELgAAAAsQugAAACxA6AIAALAAoQsAAMAChC4AAAALELoAAAAsQOgCAACwAKELAADAAoQuAAAACxC6AAAALEDoAgAAsAChCwAAwAKELgAAAAsQugAAACxA6AIAALAAoQsAAMAChC4AAAALELoAAAAsQOgCAACwAKELAADAAoQuAAAACxC6AAAALEDoAgAAsAChCwAAwAKELgAAAAsQugAAACxA6AIAALAAoQsAAMAChC4AAAALELoAAAAsQOgCAACwAKELAADAAoQuAAAACxC6AAAALEDoAgAAsAChCwAAwAKELgAAAAsQugAAACxA6AIAALAAoQsAAMAChC4AAAALELoAAAAsQOgCAACwAKELAADAAoQuAAAACxC6AAAALEDoAgAAsECrQldZWZnmz5+vtLQ0ORwOuVwujRgxQosWLVJVVVWrJnb8+HHNmjVLqampio+PV3JysjIyMrR06VIZY5ocd/DgQT3++OO6/vrr1bdvX8XGxiohIUEDBw7UT37yE2VlZbVqXgAAAOGwmeYSTDPy8vI0ZswY5ebmSpLsdrt8Pp8qKyslScOGDdOGDRuUlJQUcu2srCyNGzdORUVFkiSHwyGv16uamhpJ0tixY7Vy5UrFxsbWG7d582aNHj263n1Op1OVlZWBEBgREaHf/OY3+u1vfxvSnEpLS+VyueR2u5WYmBjycwIAANbrSO/fYX3S5fP5dP311ys3N1fdu3fXO++8o4qKCnk8Hi1fvlxOp1M7duzQlClTQq7tdrs1adIkFRUVadCgQdq2bZvKyspUUVGhxYsXKzo6WuvWrdPMmTMbjK2urlZkZKRuuOEGrVixQqdOnVJpaak8Ho8++eQTjR49Wn6/X7/73e/07LPPhvPUAQAAwmPCsHTpUiPJSDIfffRRg/aXXnop0L5+/fqQat93331GkomPjzc5OTkN2hcsWGAkmcjISJOdnV2vLT8/3+zfv7/J2pWVleaSSy4xksxFF10U0rzcbreRZNxud0jjAABA++lI799hfdL1wgsvSJIyMzM1cuTIBu2TJ09W//79JUkvvvhiSLXr+gfXCDZjxgw5HA75fD4tW7asXluvXr00YMCAJmvHxMTo1ltvlSQdOnRIJSUlIc0NAAAgXCGHLo/Ho82bN0uSJkyY0Ggfm82m8ePHS5LWrVvX4trZ2dk6cuRIs7UdDocyMjJCrl0nLi4usOzz+UIeDwAAEI6QQ9fevXvl9/slSUOHDm2yX11bYWGhiouLW1R7165dDcY3V3vPnj0tqhvsvffekyR1795dnTt3Dnk8AABAOKJCHVBQUBBY7tmzZ5P9gtsKCgqUnJzc5rVLS0tVXl4uh8Nx1tqS9PHHH+uNN96QJP30pz+VzWZrsm9lZWXgSMy6xwIAAAhXyJ90lZWVBZbtdnuT/YLbgse0V+2TJ0/qRz/6kfx+vwYMGKC5c+c22/+RRx6Ry+UK3Hr37t2ixwEAAGjM1+KM9OXl5frOd76jvLw8OZ1OrVix4qyfjs2bN09utztwy8/Pt2i2AADg31HIXy86nc7AssfjabJfcFvwmFBqN3USs1BqV1RUaOLEidqyZYscDofefvttXXrppWedS2xsbIOTrwIAAIQr5E+6evToEVg+evRok/2C24LHtGXtxMTEZj+xqgtcH3zwgRISEvTWW281OGM9AACAFUIOXYMHD1ZERO2w4KMNv6quLSUlpUU70Uv1j1hsSe0hQ4Y02acucL3//vuy2+1666239K1vfatF8wAAAGhrIYcuu92uUaNGSZLWrFnTaB9jjNauXSup9jqJLZWamqo+ffo0W7uiokKbNm1qtnZFRYW+/e1v6/3331dCQoLefvttXXXVVS2eBwAAQFsLa0f6qVOnSpI2btyorVu3NmhfsWKFcnJyJEm33XZbSLXr+i9fvjxwMe1gTz75pMrLyxUZGdnotR3rAlfdV4oELgAA0BGEHbrS0tJkjNGNN96oDRs2SJL8fr9WrFihadOmSao9q/w111xTb+z8+fNls9lks9kaDVWzZ89WSkqKPB6PJk6cqKysLElSVVWVnn76ad1///2SpOnTp2vgwIH1xno8Hk2aNEkffPCBHA6HVq9ezVeKAACgQwj56EVJioqK0sqVK5WZmanc3Fxde+21stvt8vv98nq9kqRhw4Y1uDZiS7hcLq1atUrjxo3Tnj17NHz4cDmdTnm9XlVXV0uq/VrxiSeeaDD21VdfDZxxvqamRjfddFOzj/X666/rm9/8ZshzBAAACFVYoUuS+vXrp507d2rhwoV6/fXXdfjwYUVHR+viiy/Wj370I82YMUMxMTFh1U5PT9fu3bv1hz/8QatWrVJ+fr4SEhI0dOhQTZ06VXfeeWdgZ/5gdZcnkiSv1xsIgE2pqqoKa34AAAChshljTHtP4nxQWloql8slt9vd5PnDAABAx9KR3r+/FmekBwAAaG+ELgAAAAsQugAAACxA6AIAALAAoQsAAMAChC4AAAALELoAAAAsQOgCAACwAKELAADAAoQuAAAACxC6AAAALEDoAgAAsAChCwAAwAKELgAAAAsQugAAACxA6AIAALAAoQsAAMAChC4AAAALELoAAAAsQOgCAACwAKELAADAAoQuAAAACxC6AAAALEDoAgAAsAChCwAAwAKELgAAAAsQugAAACxA6AIAALAAoQsAAMAChC4AAAALELoAAAAsQOgCAACwAKELAADAAoQuAAAACxC6AAAALEDoAgAAsAChCwAAwAKELgAAAAsQugAAACxA6AIAALAAoQsAAMAChC4AAAALELoAAAAsQOgCAACwAKELAADAAoQuAAAACxC6AAAALEDoAgAAsAChCwAAwAKELgAAAAsQugAAACxA6AIAALAAoQsAAMAChC4AAAALELoAAAAs0KrQVVZWpvnz5ystLU0Oh0Mul0sjRozQokWLVFVV1aqJHT9+XLNmzVJqaqri4+OVnJysjIwMLV26VMaYJscVFhbqlVde0X/913/puuuuU+fOnWWz2WSz2fTee++1ak4AAADhspnmEkwz8vLyNGbMGOXm5kqS7Ha7fD6fKisrJUnDhg3Thg0blJSUFHLtrKwsjRs3TkVFRZIkh8Mhr9ermpoaSdLYsWO1cuVKxcbGNhg7f/58PfTQQ43W3bhxo8aMGRPyfCSptLRULpdLbrdbiYmJYdUAAADW6kjv32F90uXz+XT99dcrNzdX3bt31zvvvKOKigp5PB4tX75cTqdTO3bs0JQpU0Ku7Xa7NWnSJBUVFWnQoEHatm2bysrKVFFRocWLFys6Olrr1q3TzJkzGx1vs9nUu3dvffe739VD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p3re+8///E+tWrVKUu3foEsvvbSdZ/T11ZJ10dG3DUIXOrSIiAgtXLhQUu1/OW+++Wagzel0BpbrLm7emOC24DFouda+1nXLzY0Nbmc9hS8uLk4LFiyQJJWXl2vDhg312lkXLTd79mwtXrxYkvTEE0/ozjvvbNCHbcMaLVkXZ9MRtg1CFzq8b3zjG+rSpYskKScnJ3B/jx49AstHjx5tcnxdW2JiohwOxzma5b+31r7WdeNLSkqa/YNWNz748RC6kSNHBpaDtxmJddFSc+fODXwF9dhjj+nee+9ttB/bxrnX0nXREu29bRC6cN4KPlIo+KiTr6prGzJkyDmf07+r1r7WweObO+KnbnxzRw6hdVgXZzdnzhw99thjkqRHH31Us2fPbrIv28a5Fcq6aC0r1gWhCx3eoUOHdOrUKUmqd+LB1NRU9enTR5K0Zs2aRsdWVFRo06ZNkmr3HUN4Wvtajx49WvHx8c2Oz8vL0969exsdj9Bs2bIlsPzVk3WyLpo3e/bswC4Njz76qObMmdNsf7aNcyfUddES7b5thHWefKCNnO2ioX6/33zve98LXBB737599drrLr9ht9sbvYDpH/7wBy4DdBahXgYo3Ne67vIa3bt3N6dPn27QftdddxlJxul0fi0uddKYlqyLs20zXq/XXHHFFUaSSUhIaPRSJqyLxs2aNStweZmFCxe2eBzbRtsLZ12cD9sGoQvt6vDhw2bEiBHmz3/+szl06FBgo/H5fObjjz8248aNC2x4jV0sNvhCs0OGDDHbt283xtReaPapp54yMTExXPD6K4qLi83JkycDt969extJZs6cOfXuLysrqzeuta918IVkMzIyzP79+40xxpSXl5uHHnrI2Gy2r9VFfY0Jb12899575pprrjF/+9vfTH5+fuD+qqoqs379ejNixIizXpSXddHQ3LlzA6/b448/HtJYto22Fe66OB+2DUIX2tXhw4cDG4EkExsba7p06WJiY2Pr3X/HHXeY6urqRmts377ddO7cOdDX6XSa6OjowM9jx441Xq/X4mfWcdV9mnK229SpUxuMbe1r/dZbbxm73R7o73K5TGRkZODn22+//az/rf47CWddbNy4sV5bfHy86dKlS731EBERYX796183+9isi3/Jy8ur99p169at2dtjjz3WoAbbRttozbo4H7YNQhfalcfjMX/605/MLbfcYoYMGWIuuOACExUVZRwOhxk0aJC58847zYcffnjWOoWFhWbmzJlmwIABJi4uznTq1MmMHj3aLFmyxPh8PgueyfmjNaHLmNa/1gcPHjTTpk0z/fr1MzExMaZz587muuuuM6+++mobP9OOL5x1cerUKbNw4UJz4403moEDB5rk5GQTFRVlEhMTzaWXXmp+/vOfm507d7bo8VkXtb76z9/Zbk19/cu20XqtWRfnw7ZhM8YYAQAA4Jzi6EUAAAALELoAAAAsQOgCAACwAKELAADAAoQuAAAACxC6AAAALEDoAgAAsAChCwAAwAKELgAAAAsQugC0G5/Pp8cff1zDhg1TQkKCbDabbDab3njjjfaeGgC0uaj2ngCAr697771XixcvliTFxMSoW7dukqS4uLj2nBYAnBNcexFAuygrK1Pnzp1VXV2tRx99VLNnz5bNZmvvaQHAOUPoAtAutm3bpssvv1xSbQBzOBztPCMAOLfYpwtAu/B4PIFlAheArwNCFwBLPf/887LZbBozZkzgvrod6IPv79evn2w2m55//nmVl5frgQceUFpampxOp2w2m3Jzc+vV3bFjh+68805ddNFFstvtcjgcuvTSS3Xffffp1KlTzc5py5YtuuGGG9SlSxfFx8crNTVVv/nNb1ReXh6Yb79+/Vr1vCsrKzVs2DDZbDZdfvnlqq6ubrTfzTffLJvNph49epx13gDOL4QuAJaKj49Xt27dlJSUFLivW7dugVtycnK9/kVFRUpPT9fvfvc77d+/X1FRDY//efDBB5Wenq7nnntOOTk5stlsqq6u1s6dO/Xwww/rkksu0Y4dOxqdz1//+leNGjVK//u//6uioiLFxsYqNzdXCxYs0IgRI1RSUtImzzs2NlbLly9XQkKCtm3bpl//+tcN+ixdulSvvPKKIiIi9Le//U1dunRpk8cG0EEYAGgHGzduNJJMU3+G+vbtayQZh8NhUlJSzOuvv26qqqqMMcbk5+ebiooKY4wxTzzxhJFknE6neeSRR8yxY8eMMcbU1NSY7du3m6uvvtpIMr169TJlZWX1HiMrK8tERUUZSWbMmDFm7969xhhjqqqqzMsvv2w6depkOnXqZCSZvn37tsnzfvbZZ40kY7PZzNq1awP3792719jtdiPJ/Nd//VebPBaAjoXQBaBdtDR0RUZGmk8//bTRPidPnjR2u93YbDazfv36RvtUV1eb9PR0I8k88cQT9domTJhgJJmBAwcaj8fTYOyaNWsCc2yr0GWMMZMnTzaSTLdu3czx48eN1+s1l156qZFkLr/88kC4BPDvha8XAXRo48eP17BhwxptW7ZsmTwej4YPH65rrrmm0T5RUVH60Y9+JElau3Zt4P7Tp08Hfp4zZ47i4+MbjB03bpxGjhzZ2qfQwF/+8hf1799fx48f19SpUzV79mx9/vnncjqdevnllxUdHd3mjwmg/XFyVAAd2qhRo5ps+/DDDyVJu3btUkpKSpP9zpw5I0nKy8sL3Pfpp5/K7/dLkq6++uomx1599dX6+OOPQ5rz2SQmJurll1/W6NGjtWbNmsD9Tz/9tC688MI2fSwAHQehC0CH1rVr1ybbCgoKJNWGqrpg1Zzg01ScOHEisNyzZ88mx/Tq1asl0wzZFVdcof/8z//UokWLJNUetThlypRz8lgAOga+XgTQoUVGRjbZ5vP5JEn/8R//IVO7j2qzt6+eZqI9nT59WitWrAj8/Omnn6q8vLwdZwTgXCN0AThv1X2l+MUXX4Q8NvgTtKNHjzbZr7m21pg2bZqOHDminj17qnPnzjpw4IB+/vOfn5PHAtAxELoAnLfq9vfasmVLvf21WuKyyy5TRETtn8CNGzc22e/dd98Nf4JNWLJkiV599dXA+bieffZZSdILL7ygl19+uc0fD0DHQOgCcN768Y9/rPj4ePl8Pt1zzz2Brxsb4/f7dfr06cDPnTp10tixYyVJCxculNfrbTBm/fr1+uijj9p0zvv27dO9994rSfrVr36lzMxMffe739Xdd98tqfar0sOHD7fpYwLoGAhdAM5bKSkp+v3vfy9Jeuutt3Tddddp8+bNgfBljNG+ffv0+OOPa+jQoVq1alW98b/73e8UGRmpffv2aeLEicrOzpYk1dTU6JVXXtEPf/hDderUqc3mW1lZqcmTJ8vj8eiKK67Qb3/720DbokWLNHToUJWWlupHP/qRampq2uxxAXQMhC4A57Vf/OIXevTRRxUZGamNGzdq9OjRstvt6tKli2JjYzV48GDNmjVLe/fulc1mqzd2+PDheuqpp2Sz2fTuu+9q0KBB6tSpkxwOh26++WZ169ZNDzzwQJvNdc6cOYHzcb300kv1LmkUFxen5cuXKz4+Xlu3btWDDz7YZo8LoGMgdAE4782ZM0f79u3TzJkzdckllyguLk6nT5+Ww+HQiBEjNHfuXH300Ue65ZZbGoydPn26Nm/erOuvv17JycmqrKxU3759NW/ePH3yySf1rhHZGm+99Zb+9Kc/SZKeeuqpRs/HdfHFFwdOIfH73/++2X3NAJx/bMYY096TAICO6vnnn9cdd9yhvn37dqhTTgA4//BJFwAAgAUIXQAAABYgdAEAAFiAay8CQAjy8/M1YsSIkMb07t1b27ZtO0czAnC+YEd6AAhBbm6u+vfvH9IYdsIHIBG6AAAALME+XQAAABYgdAEAAFiA0AUAAGABQhcAAIAFCF0AAAAWIHQBAABYgNAFAABgAUIXAACABQhdAAAAFvj/OPjGm8YtUd4AAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig = plt.figure()\n", + "ax = fig.gca()\n", + "\n", + "abs(dataDarkFFT).plot.errorbar(ax=ax, x='freq_x')\n", + "ax.set_xlim([0.5, 250])\n", + "ax.set_ylim([0, 0.05])\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Only One Beam" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.DataArray 'CH1' (x: 1200)>\n",
+       "array([0.229, 0.242, 0.241, ..., 0.225, 0.225, 0.235])\n",
+       "Coordinates:\n",
+       "  * x        (x) float64 0.0 0.002 0.004 0.006 0.008 ... 2.392 2.394 2.396 2.398
" + ], + "text/plain": [ + "\n", + "array([0.229, 0.242, 0.241, ..., 0.225, 0.225, 0.235])\n", + "Coordinates:\n", + " * x (x) float64 0.0 0.002 0.004 0.006 0.008 ... 2.392 2.394 2.396 2.398" + ] + }, + "execution_count": 75, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "filePath = r'F:\\Jianshun\\AccordionLatticeShorTermStability\\onlyOneBeam.csv'\n", + "\n", + "data = read_csv_file(filePath, csvEngine='pandas', csvKwargs=dict(header=[0], skiprows=[1], encoding = \"ISO-8859-1\",))\n", + "dataOnlyOneBeam = xr.DataArray(\n", + " data=data.CH1[0,:],\n", + " dims=['x'],\n", + " coords=dict(\n", + " x=data.X[0,:].to_numpy() * 2e-3\n", + " )\n", + ")\n", + "dataOnlyOneBeam" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "dataOnlyOneBeam.plot.errorbar()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "metadata": {}, + "outputs": [], + "source": [ + "dataOnlyOneBeamFFT = fft(dataOnlyOneBeam)" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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r8YBAABwIXkduhwOh9avXy+p5OD0ilgsFt14442SpFWrVlW778TERB09erTKvm02m/r27XvevtPT0zV69GgFBgZq5syZslgs1R4HAADAheZ16Nq7d69cLpckKSYmptJ6pWVpaWnKyMioVt+7du0q176qvvfs2VNpnaeeekqnTp3Sc889pw4dOlTr9QEAAC4WP28bpKamuqebN29eaT3PstTUVEVGRl7wvrOyspSTkyObzVam/IsvvtDHH3+smJgYTZgw4byvW5GCggL3mZilrwUAAFBTXm/pys7Odk9brdZK63mWeba52H3b7XY98cQT8vHx0axZs+Tv71+t1/65V155ReHh4e5Hy5Yta9QPAACA9D94RfqxY8fq+PHjGjVqlK655poa9zNx4kTZ7Xb3IyUl5QKOEgAA/NJ4vXsxNDTUPe1wOCqt51nm2cabviu7iFllfa9evVrvvfeeWrRooZdffrlar1mZwMDAal98FQAA4Hy83tLVrFkz9/Tx48crredZ5tnmQvYdFhZW5niuESNGSJJee+01WSwW5eTklHk4nU5JJRd3/flzAAAAF5PXoatTp07y8Slp5nm24c+VlkVFRVXrIHqp7BmL1em7c+fOZZ4vvSXRfffdp9DQ0HKPdevWSZLWrVvnfu6LL76o1tgAAABqw+vQZbVa1bt3b0nSihUrKqxjGIZWrlwpqeQ+idUVHR2tVq1aVdl3bm6u1q5d63XfAAAAdalGB9I/9NBDkqQ1a9Zo06ZN5coXLVqkw4cPS5IefPBBr/ourb9gwQL3litPb731lnJycuTr61vu3o6GYVT5uO666ySV3PC69Lnbb7/dq/EBAADURI1DV2xsrAzD0J133um+v6LL5dKiRYvcx1YNGTJEAwYMKNN28uTJslgsslgsFYaqcePGKSoqSg6HQ0OHDlVCQoIkqbCwUO+8846ee+45SdLIkSO56CkAALhkeH32oiT5+flpyZIl6t+/v5KSkjRw4EBZrVa5XC7l5+dLkrp163beeyNWJDw8XEuXLtXgwYO1Z88ede/eXaGhocrPz1dRUZGkkt2K06dPr8nQAQAA6kSNr9PVpk0b7dixQ5MmTVJMTIwsFov8/f0VFxenqVOnauPGjYqIiKhR33Fxcdq9e7fGjBmj9u3bq6ioSCEhIerTp49mzZql5cuXczkHAABwSbEYhmHU9SAuBVlZWQoPD5fdbq/0+mEAAKB+qU/r7/+5K9IDAADUR4QuAAAAExC6AAAATEDoAgAAMAGhCwAAwASELgAAABMQugAAAExA6AIAADABoQsAAMAEhC4AAAATELoAAABMQOgCAAAwAaELAADABIQuAAAAExC6AAAATEDoAgAAMAGhCwAAwASELgAAABMQugAAAExA6AIAADABoQsAAMAEhC4AAAATELoAAABMQOgCAAAwAaELAADABIQuAAAAExC6AAAATEDoAgAAMAGhCwAAwASELgAAABMQugAAAExA6AIAADABoQsAAMAEhC4AAAATELoAAABMQOgCAAAwAaELAADABIQuAAAAExC6AAAATEDoAgAAMAGhCwAAwASELgAAABMQugAAAExA6AIAADABoQsAAMAEhC4AAAATELoAAABMQOgCAAAwAaELAADABIQuAAAAExC6AAAATEDoAgAAMAGhCwAAwASELgAAABMQugAAAExQq9CVnZ2tyZMnKzY2VjabTeHh4erRo4emTZumwsLCWg3s5MmTGjt2rKKjoxUcHKzIyEj17dtXs2fPlmEYlbb74osvNG7cOPXv31/t2rVTWFiYAgIC1KxZMw0ZMkQffPCBiouLazU2AAAAb1mMqhJMFZKTk9WvXz8lJSVJkqxWq5xOpwoKCiRJ3bp1U3x8vCIiIrzuOyEhQYMHD1Z6erokyWazKT8/3x2WBg0apCVLligwMLBc25iYGO3evdv9d2hoqIqKipSfn+9+7uqrr9ayZcvUpEmTao8pKytL4eHhstvtCgsL8/o9AQAA89Wn9XeNtnQ5nU7dcsstSkpKUtOmTfXVV18pNzdXDodDCxYsUGhoqLZt26bhw4d73bfdbtfNN9+s9PR0dezYUVu2bFF2drZyc3M1Y8YM+fv7a9WqVRozZkyF7X/zm99o5syZ2r17txwOh7KyspSXl6fjx49rypQp8vHx0Q8//KCHHnqoJm8dAACgZowamD17tiHJkGRs2LChXPnHH3/sLl+9erVXfT/77LOGJCM4ONg4fPhwufKXX37ZkGT4+voaiYmJXo994sSJ7rGlpKRUu53dbjckGXa73evXBAAAdaM+rb9rtKVr7ty5kqT+/furV69e5cqHDRumtm3bSpI+/PBDr/oure/Zh6fRo0fLZrPJ6XRq3rx53g5d11xzjXv6+PHjXrcHAACoCa9Dl8Ph0Pr16yVJQ4YMqbCOxWLRjTfeKElatWpVtftOTEzU0aNHq+zbZrOpb9++Xvddau3ate7pyy+/3Ov2AAAANeF16Nq7d69cLpekkoPWK1NalpaWpoyMjGr1vWvXrnLtq+p7z5491eo3JydHu3bt0oQJEzRt2jRJ0oMPPqjLLrusWu0BAABqy8/bBqmpqe7p5s2bV1rPsyw1NVWRkZEXvO+srCzl5OTIZrOVq7Nx48YKd336+vrqoYce0owZM6ocS0FBgftMzNLXAgAAqCmvt3RlZ2e7p61Wa6X1PMs825jVd0BAgJo0aaImTZrI39/f/fzjjz+u559/XsHBwVWO5ZVXXlF4eLj70bJly2q9BwAAgIr8z16R/uqrr1ZaWprS0tKUn5+vAwcOaNSoUfrXv/6lK6+8UkuWLKmy/cSJE2W3292PlJQUk0YOAAD+F3kdukJDQ93TDoej0nqeZZ5t6qJvHx8fXXHFFXrrrbf0+uuvKycnR8OHD9eJEycqbRMYGKiwsLAyDwAAgJryOnQ1a9bMPV3VJRc8yzzbXMi+w8LCKjyeqyqjRo1SYGCgcnJyNH/+fK/aAgAA1JTXoatTp07y8Slp5nm24c+VlkVFRVXrIHqp7BmL1em7c+fO1erXU1BQkHs8Bw8e9Lo9AABATXgduqxWq3r37i1JWrFiRYV1DMPQypUrJZXcJ7G6oqOj1apVqyr7zs3NdV9ry5u+S2VnZ+v06dOSqr/bEwAAoLZqdCB96X0L16xZo02bNpUrX7RokQ4fPiyp5HpY3iitv2DBAvfNtD299dZbysnJka+vb7l7O5beELsqr7/+urtev379vBobAABATdU4dMXGxsowDN15552Kj4+XJLlcLi1atEgjRoyQVHJV+QEDBpRpO3nyZFksFlkslgpD1bhx4xQVFSWHw6GhQ4cqISFBklRYWKh33nlHzz33nCRp5MiR6tChQ5m28+bN06233qpPP/1Up06dcj/vcrm0Y8cOjRw5Ui+++KIkqXfv3u6r5gMAAFxsXl8cVZL8/Py0ZMkS9e/fX0lJSRo4cKCsVqtcLpfy8/MlSd26davRvRHDw8O1dOlSDR48WHv27FH37t0VGhqq/Px8FRUVSSrZrTh9+vRybQ3D0BdffKEvvvhCkhQSEqLg4GBlZWWpsLDQXe/666/XokWLZLFYavL2AQAAvFbj63S1adNGO3bs0KRJkxQTEyOLxSJ/f3/FxcVp6tSp2rhxoyIiImrUd1xcnHbv3q0xY8aoffv2KioqUkhIiPr06aNZs2Zp+fLlCgwMLNdu6NChmjlzpu677z5deeWVCg4O1tmzZxUQEKCOHTvqgQce0Jdffqn4+PhqH9wPAABwIVgMwzDqehCXgqysLIWHh8tut3PNLgAALhH1af39P3tFegAAgPqE0AUAAGACQhcAAIAJCF0AAAAmIHQBAACYgNAFAABgAkIXAACACQhdAAAAJiB0AQAAmIDQBQAAYAJCFwAAgAkIXQAAACYgdAEAAJiA0AUAAGACQhcAAIAJCF0AAAAmIHQBAACYgNAFAABgAkIXAACACQhdAAAAJiB0AQAAmIDQBQAAYAJCFwAAgAkIXQAAACYgdAEAAJiA0AUAAGACQhcAAIAJCF0AAAAmIHQBAACYgNAFAABgAkIXAACACQhdAAAAJiB0AQAAmIDQBQAAYAJCFwAAgAkIXQAAACYgdAEAAJiA0AUAAGACQhcAAIAJCF0AAAAmIHQBAACYgNAFAABgAkIXAACACQhdAAAAJiB0AQAAmIDQBQAAYAJCFwAAgAkIXQAAACYgdAEAAJiA0AUAAGACQhcAAIAJCF0AAAAmIHQBAACYgNAFAABgAkIXAACACWoVurKzszV58mTFxsbKZrMpPDxcPXr00LRp01RYWFirgZ08eVJjx45VdHS0goODFRkZqb59+2r27NkyDKPSdgcPHtQbb7yhW265Ra1bt1ZgYKBCQkLUoUMHPfbYY0pISKjVuAAAAGrCYlSVYKqQnJysfv36KSkpSZJktVrldDpVUFAgSerWrZvi4+MVERHhdd8JCQkaPHiw0tPTJUk2m035+fkqLi6WJA0aNEhLlixRYGBgmXbr169Xnz59yjwXGhqqgoICdwj08fHRX/7yF73wwgtejSkrK0vh4eGy2+0KCwvz+j0BAADz1af1d422dDmdTt1yyy1KSkpS06ZN9dVXXyk3N1cOh0MLFixQaGiotm3bpuHDh3vdt91u180336z09HR17NhRW7ZsUXZ2tnJzczVjxgz5+/tr1apVGjNmTLm2RUVF8vX11e23365FixbpzJkzysrKksPh0ObNm9WnTx+5XC69+OKLeu+992ry1gEAAGrGqIHZs2cbkgxJxoYNG8qVf/zxx+7y1atXe9X3s88+a0gygoODjcOHD5crf/nllw1Jhq+vr5GYmFimLCUlxdi/f3+lfRcUFBhdunQxJBnt2rXzalx2u92QZNjtdq/aAQCAulOf1t812tI1d+5cSVL//v3Vq1evcuXDhg1T27ZtJUkffvihV32X1vfsw9Po0aNls9nkdDo1b968MmUtWrRQ+/btK+07ICBA999/vyTp0KFDOnv2rFdjAwAAqCmvQ5fD4dD69eslSUOGDKmwjsVi0Y033ihJWrVqVbX7TkxM1NGjR6vs22azqW/fvl73XSooKMg97XQ6vW4PAABQE16Hrr1798rlckmSYmJiKq1XWpaWlqaMjIxq9b1r165y7avqe8+ePdXq19M333wjSWratKkaNmzodXsAAICa8PO2QWpqqnu6efPmldbzLEtNTVVkZOQF7zsrK0s5OTmy2Wzn7VuSvv/+e33++eeSpN/+9reyWCyV1i0oKHCfiVn6WgAAADXl9Zau7Oxs97TVaq20nmeZZ5u66vv06dO699575XK51L59e02YMKHK+q+88orCw8Pdj5YtW1brdQAAACryi7gifU5Ojm699VYlJycrNDRUixYtOu/WsYkTJ8put7sfKSkpJo0WAAD8L/J692JoaKh72uFwVFrPs8yzjTd9V3YRM2/6zs3N1dChQ7Vx40bZbDYtW7ZMXbt2Pe9YAgMDy118FQAAoKa83tLVrFkz9/Tx48crredZ5tnmQvYdFhZW5Rar0sD13XffKSQkRF9++WW5K9YDAACYwevQ1alTJ/n4lDTzPNvw50rLoqKiqnUQvVT2jMXq9N25c+dK65QGrm+//VZWq1Vffvmlfv3rX1drHAAAABea16HLarWqd+/ekqQVK1ZUWMcwDK1cuVJSyX0Sqys6OlqtWrWqsu/c3FytXbu2yr5zc3N100036dtvv1VISIiWLVum6667rtrjAAAAuNBqdCD9Qw89JElas2aNNm3aVK580aJFOnz4sCTpwQcf9Krv0voLFixw30zb01tvvaWcnBz5+vpWeG/H0sBVukuRwAUAAOqDGoeu2NhYGYahO++8U/Hx8ZIkl8ulRYsWacSIEZJKrio/YMCAMm0nT54si8Uii8VSYagaN26coqKi5HA4NHToUCUkJEiSCgsL9c477+i5556TJI0cOVIdOnQo09bhcOjmm2/Wd999J5vNpuXLl7NLEQAA1Aten70oSX5+flqyZIn69++vpKQkDRw4UFarVS6XS/n5+ZKkbt26lbs3YnWEh4dr6dKlGjx4sPbs2aPu3bsrNDRU+fn5KioqklSyW3H69Onl2n7yySfuK84XFxfrrrvuqvK1Pv30U1177bVejxEAAMBbNQpdktSmTRvt2LFDU6dO1aeffqojR47I399fV155pe69916NHj1aAQEBNeo7Li5Ou3fv1t/+9jctXbpUKSkpCgkJUUxMjB566CE9+uij7oP5PZXenkiS8vPz3QGwMoWFhTUaHwAAgLcshmEYdT2IS0FWVpbCw8Nlt9srvX4YAACoX+rT+vsXcUV6AACAukboAgAAMAGhCwAAwASELgAAABMQugAAAExA6AIAADABoQsAAMAEhC4AAAATELoAAABMQOgCAAAwAaELAADABIQuAAAAExC6AAAATEDoAgAAMAGhCwAAwASELgAAABMQugAAAExA6AIAADABoQsAAMAEhC4AAAATELoAAABMQOgCAAAwAaELAADABIQuAAAAExC6AAAATEDoAgAAMAGhCwAAwASELgAAABMQugAAAExA6AIAADABoQsAAMAEhC4AAAATELoAAABMQOgCAAAwAaELAADABIQuAAAAExC6AAAATEDoAgAAMAGhCwAAwASELgAAABMQugAAAExA6AIAADABoQsAAMAEhC4AAAATELoAAABMQOgCAAAwAaELAADABIQuAAAAExC6AAAATEDoAgAAMAGhCwAAwASELgAAABMQugAAAExA6AIAADABoQsAAMAEtQpd2dnZmjx5smJjY2Wz2RQeHq4ePXpo2rRpKiwsrNXATp48qbFjxyo6OlrBwcGKjIxU3759NXv2bBmGUWm7tLQ0LVy4UH/60590ww03qGHDhrJYLLJYLPrmm29qNSYAAICashhVJZgqJCcnq1+/fkpKSpIkWa1WOZ1OFRQUSJK6deum+Ph4RUREeN13QkKCBg8erPT0dEmSzWZTfn6+iouLJUmDBg3SkiVLFBgYWK7t5MmTNWXKlAr7XbNmjfr16+f1eCQpKytL4eHhstvtCgsLq1EfAADAXPVp/V2jLV1Op1O33HKLkpKS1LRpU3311VfKzc2Vw+HQggULFBoaqm3btmn48OFe922323XzzTcrPT1dHTt21JYtW5Sdna3c3FzNmDFD/v7+WrVqlcaMGVNh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1209t6AdP3680npVldXGiBEjdPToUTVv3lwNGzbUgQMH9Pvf//6ivBaA+oHQBeCSVXq818aNG8scr1UdV199tXx8Sr4C16xZU2m9r7/+uuYDrMSsWbP0ySefuK/H9d5770mS5s6dq/nz51/w1wNQPxC6AFyyHnjgAQUHB8vpdOrJJ590726siMvlUmZmpvvvBg0aaNCgQZKkqVOnKj8/v1yb1atXa8OGDRd0zPv27dPTTz8tSfrjH/+o/v3767bbbtOoUaMklewqPXLkyAV9TQD1A6ELwCUrKipKr776qiTpyy+/1A033KD169e7w5dhGNq3b5/eeOMNxcTEaOnSpWXav/jii/L19dW+ffs0dOhQJSYmSpKKi4u1cOFC3X333WrQoMEFG29BQYGGDRsmh8OhX/3qV3rhhRfcZdOmTVNMTIyysrJ07733qri4+IK9LoD6gdAF4JL21FNP6bXXXpOvr6/WrFmjPn36yGq1qlGjRgoMDFSnTp00duxY7d27VxaLpUzb7t276+2335bFYtHXX3+tjh07qkGDBrLZbLrnnnvUpEkTTZo06YKNdfz48e7rcX388cdlbmkUFBSkBQsWKDg4WJs2bdLzzz9/wV4XQP1A6AJwyRs/frz27dunMWPGqEuXLgoKClJmZqZsNpt69OihCRMmaMOGDbrvvvvKtR05cqTWr1+vW265RZGRkSooKFDr1q01ceJEbd68ucw9Imvjyy+/1JtvvilJevvttyu8HteVV17pvoTEq6++WuWxZgAuPRbDMIy6HgQA1Fdz5szRI488otatW9erS04AuPSwpQsAAMAEhC4AAAATELoAAABMwL0XAcALKSkp6tGjh1dtWrZsqS1btlykEQG4VHAgPQB4ISkpSW3btvWqDQfhA5AIXQAAAKbgmC4AAAATELoAAABMQOgCAAAwAaELAADABIQuAAAAExC6AAAATEDoAgAAMAGhCwAAwASELgAAABP8PymdIjsNs6NlAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig = plt.figure()\n", + "ax = fig.gca()\n", + "\n", + "abs(dataOnlyOneBeamFFT).plot.errorbar(ax=ax, x='freq_x')\n", + "ax.set_xlim([0.5, 250])\n", + "ax.set_ylim([0, 0.05])\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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OOII3HXXXdi2bZtjnebPn4+zzz4bBxxwAPLy8tCxY0fceeed2L17d7S+7dq1S2i/Kysr0aNHD0QiERx11FGoqqpSLnfBBRcgEomgVatWrvUmCCKzINFGEERGkZeXh+bNm6Nx48bRac2bN49+mjRpYll++/bt6NmzJ+699178+OOPqFcvPv9q1KhR6NmzJyZOnIjVq1cjEomgqqoKixcvxv3334/DDz8c33zzjbI+L730Evr06YP//e9/2L59O3Jzc7F27Vo88MAD6N27N3bu3BnIfufm5mLq1KkoKCjAggULcMcdd8QtM2HCBLz66qvIysrCv/71LxxwwAGBbJsgiDSBEQRBZCBz5sxhAJjuMda2bVsGgBUWFrIWLVqwN954g+3du5cxxtiGDRtYeXk5Y4yxxx9/nAFgRUVF7MEHH2S//PILY4yx6upqtnDhQnbiiScyAKxNmzasrKzMso1FixaxevXqMQCsf//+bNmyZYwxxvbu3cteeeUV1qhRI9aoUSMGgLVt2zaQ/X7xxRcZABaJRNjMmTOj05ctW8by8/MZAHbbbbcFsi2CINILEm0EQWQkpqItOzubff3118pltm7dyvLz81kkEmEffvihcpmqqirWs2dPBoA9/vjjlnmnnXYaA8A6dOjAKioq4tZ9//33o3UMSrQxxtigQYMYANa8eXO2ZcsWtmfPHnbEEUcwAOyoo46KilOCIOoW5B4lCKJOc+qpp6JHjx7KeVOmTEFFRQV69eqFk046SblMvXr1cOGFFwIAZs6cGZ2+a9eu6P8RI0YgLy8vbt2BAwfimGOOSXQX4njuuefQvn17bNmyBYMHD8bw4cPx3XffoaioCK+88gpycnIC3yZBEKmHOtclCKJO06dPH+28uXPnAgB++OEHtGjRQrvcb7/9BgBYt25ddNrXX3+N2tpaAMCJJ56oXffEE0/EF1984anObhQXF+OVV15B37598f7770enP/vsszjkkEMC3RZBEOkDiTaCIOo0zZo1087btGkTAC7KhDBzQu5m5Ndff43+bt26tXadNm3amFTTM0cffTRuuOEGPPbYYwB41ujFF18cyrYIgkgPyD1KEESdJjs7WzuvpqYGAPDXv/4VjMf4On7s3YSkkl27dmHatGnR/19//TV2796dwhoRBBE2JNoIgthvES7R77//3vO6sgVv48aN2uWc5iXCVVddhfXr16N169Zo2rQpfvrpJ1x//fWhbIsgiPSARBtBEPstIt5t/vz5lng1E4488khkZfFH6Jw5c7TLffTRR/4rqOGFF17Aa6+9Fu2P7cUXXwQATJo0Ca+88krg2yMIIj0g0UYQxH7LX/7yF+Tl5aGmpgbXXXdd1F2qora2Frt27Yr+b9SoEQYMGAAAGDt2LPbs2RO3zocffojPP/880DovX74cN954IwDg1ltvxQknnIA//vGP+Nvf/gaAu3rXrFkT6DYJgkgPSLQRBLHf0qJFCzz00EMAgHfffRennHIK5s2bFxVvjDEsX74c48aNQ7du3TB9+nTL+vfeey+ys7OxfPlynHHGGVixYgUAoLq6Gq+++ir+/Oc/o1GjRoHVt7KyEoMGDUJFRQWOPvpo3HPPPdF5jz32GLp164bS0lJceOGFqK6uDmy7BEGkByTaCILYr/n73/+ORx55BNnZ2ZgzZw769u2L/Px8HHDAAcjNzUXnzp0xbNgwLFu2DJFIxLJur1698MwzzyASieCjjz5Cp06d0KhRIxQWFuKCCy5A8+bNMXLkyMDqOmLEiGh/bP/5z38sQ3I1aNAAU6dORV5eHr788kuMGjUqsO0SBJEekGgjCGK/Z8SIEVi+fDluuukmHH744WjQoAF27dqFwsJC9O7dG7fccgs+//xzXHTRRXHrXn311Zg3bx7OOussNGnSBJWVlWjbti1uv/12fPXVV5YxUhPh3XffxZNPPgkAeOaZZ5T9sXXt2jXaBchDDz3kGGtHEETmEWGMsVRXgiAIoq7y8ssv47LLLkPbtm3TqssQgiAyD7K0EQRBEARBZAAk2giCIAiCIDIAEm0EQRAEQRAZAI09ShAEkUQ2bNiA3r17e1rnoIMOwoIFC0KqEUEQmQIlIhAEQSSRtWvXon379p7WoSQGgiAAEm0EQRAEQRAZAcW0EQRBEARBZAAk2giCIAiCIDIAEm0EQRAEQRAZAIk2giAIgiCIDIBEG0EQBEEQRAZAoo0gCIIgCCIDINFGEARBEASRAZBoIwiCIAiCyABItBEEQRAEQWQA/w892FK6Fy8COwAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig = plt.figure()\n", + "ax = fig.gca()\n", + "\n", + "abs(dataOnlyOneBeamFFT).plot.errorbar(ax=ax, x='freq_x', fmt='r')\n", + "abs(dataWithoutModulationFFT).plot.errorbar(ax=ax, x='freq_x', fmt='b')\n", + "\n", + "ax.set_xlim([0.5, 250])\n", + "ax.set_ylim([0, 0.02])\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Without Modulation # 2" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.DataArray 'CH1' (x: 1200)>\n",
+       "array([0.49 , 0.53 , 0.533, ..., 0.522, 0.498, 0.454])\n",
+       "Coordinates:\n",
+       "  * x        (x) float64 0.0 1e-05 2e-05 3e-05 ... 0.01197 0.01198 0.01199
" + ], + "text/plain": [ + "\n", + "array([0.49 , 0.53 , 0.533, ..., 0.522, 0.498, 0.454])\n", + "Coordinates:\n", + " * x (x) float64 0.0 1e-05 2e-05 3e-05 ... 0.01197 0.01198 0.01199" + ] + }, + "execution_count": 81, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "filePath = r'F:\\Jianshun\\AccordionLatticeShorTermStability\\withoutModulation_2.csv'\n", + "\n", + "data = read_csv_file(filePath, csvEngine='pandas', csvKwargs=dict(header=[0], skiprows=[1], encoding = \"ISO-8859-1\",))\n", + "dataWithoutModulation2 = xr.DataArray(\n", + " data=data.CH1[0,:],\n", + " dims=['x'],\n", + " coords=dict(\n", + " x=data.X[0,:].to_numpy() * 1e-05\n", + " )\n", + ")\n", + "dataWithoutModulation2" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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M5M6EgegencGqnfnoLp3Bqp3Z/DXe6RbFP1EtqpLEARBEARBWAopiwRBEARBEIQipCzGKElJSXjyySeRlJTktCgxBdW7M1C9OwfVvTNQvTtDtNY7LXAhCIIgCIIgFCHLIkEQBEEQBKEIKYsEQRAEQRCEIqQsEgRBEARBEIqQskgQBEEQBEEoQsqixZSUlCAvLw+5ublIT09HVlYW+vXrhxdffBFVVVWG8j548CAeeOABdOrUCSkpKWjYsCEGDRqEmTNncu1FuWPHDtx2221o27YtkpOT0aRJE1xwwQWYP38+V/m//fYbrr/+erRq1QpJSUlo3rw5Lr/8cnz77bdc6ZcsWYLLL78czZs3R1JSElq1aoXrr78ev/32G1d6NaKx3teuXYtnn30WF1xwAVq2bInExERkZGSge/fuuPfee7F161bV9Dk5OfB4PKp/AwcOFKqLUKKx3ocMGaJZbzyB86m989f7rFmzNOtc/jd79uywPGK1vR84cAAff/wxHn30UYwYMQKNGjUK3O/SpUu5y6f+3d56d33/LhGWUVhYKOXk5EgAJABSamqqlJSUFPh/r169pGPHjunKe9WqVVKjRo0CeaWnp0vx8fGB/48cOVKqqKhQTP/ll19KqampgeszMzMlr9cb+P+NN94o1dXVKaZ/6623gsrLysqSPB5P4P9PPvmkqvxPPvlk4FqPxyNlZWUF/h8fHy+99dZbuupFkqKz3t9///3ANfI6j4uLC/w/MTFRev311xXLbtOmTaDMpk2bMv8uueQSXfUiSdFZ75IkSYMHD5YASGlpaYr11qtXL1X5qb2L1fvcuXMV69r/l5KSEshnw4YNYXnEanuXt7XQvyVLlnCVT/27vfUeCf07KYsWUVNTI+Xm5koApObNm0vffPONJEmSVFtbK82dO1fKyMiQAEijR48WzvvEiRNSs2bNJABS586dpV9++UWSJEmqrKyUXn31VSkhIUECIN1xxx3M9AUFBVJaWpoEQBowYIC0ZcsWSZIkqaSkRJoyZUqgcU6bNo2Z/scffww04ssuu0zavXu3JEmSdOTIEem2224LpP/oo4+Y6T/66KPANbfddpt05MgRSZIkaffu3dJll10mAZDi4uKkH3/8UbhuorXe3333XSkpKUm6/vrrpS+//FIqKioKlL148WKpe/fugY7Zf8+h+DuTd999V/jetYjW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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "dataWithoutModulation2.plot.errorbar()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "metadata": {}, + "outputs": [], + "source": [ + "dataWithoutModulationFFT2 = fft(dataWithoutModulation2)" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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3313Y/78+YZhGEYkEjHuvvtuo6qqygBgXHTRRdrjly9fbk7IkydPNj799FPDMAyjtbXVuO6668wO/Zvf/EZ7/Ny5c41AIGAAMKZOnWqsXr3aMAzD2Lx5s3HhhReax//jH//QHv+Pf/zD/MyFF15obN682TAMw1i9erUxdepUA4ARCAQcJ4xKBIAxadIkY+bMmcayZcvM11esWGF873vfM6/HmWeeaTuW97vyeOCBB4xbbrnFmDdvnrF161bz9dbWVmP27NnGwIEDDQDGoEGDjG3btlmO5f2ubOLxuDF58mQDgHHIIYe4iiLea3coinYgYrGY7bXRo0d7EkU///nPDQBGTU2NsXz5ctv7v/71r83OKB4SmTPPPNMAYAwZMsQyYAsuuOACc8WxZcsW2/tTpkwxABh77bWX0d3dbXv/uOOOMwAYo0ePtv3OWCxm/s7jjjvOdmwkEjH22msvA4AxZcoUt8tQUbz00kuu78sD0Oeff255j/e79/Hcc8+Z9/vBBx+0vMf7XdnceeedBgDjjDPOsFhRdPBeu0NRtIPjVRSNGjXKNIvqaG1tNerr6w0AxnXXXWd5r62tzaipqTEAGDfccIP2+BUrVpgP8n333Wd5b9myZeZ7DzzwgPb4V155xfyMKgbmzJljvvfqq69qj589e7b5Gdmq0pt55513zN/8+OOPW97j/e59bN++3fzNN998s+U93u/KRVhu+vfvb2zcuDGjKOK9doeB1iQjn376KT7//HMAwAknnKD9TH19PQ477DAAwPPPP29574033kBnZ6fr8WPGjMH48eO1x7/wwgvm38cff7z2+ClTpqChocH1+IaGBnOLGhW5XfL39Waqq6vNv+PxuPk373fv5PXXXzf/3nnnnc2/eb8rm/PPPx/t7e24/fbbMXDgQNfP8l5nhqKIZETe+HfPPfd0/Jx475NPPnE8fo899sh4/Mcff6w9ftCgQRg0aJD22EAggN133931+PHjxyMQCGiPHzRokDmgqMf3Vl555RXz77322sv8m/e79xCJRLBy5UrcfffdOOusswAAu+yyC0466STzM7zflcusWbMwZ84cHH300Z621OK9zgxFEcnI2rVrzb+HDx/u+DnxXktLC9ra2mzH9+3bF7W1tRmPl79P/rfbdxfz+N7Itm3bMGPGDADAYYcdhnHjxpnv8X5XPtXV1fD5fKiu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tcGDB5v/9evXz/L55uZm7L///rjxxhuxZMkSBIP2HIzp06dj//33x/3334/ly5fD5/MhGo3if//7H371q19h7733xnvvvadtz3333YfJkyfjySefRHNzM8LhMFauXIlf//rXOPDAA7F169aC/O5wOIyHH34YdXV1mD9/Pn72s5/ZPnPvvffikUcegd/vx1//+lcMGDCgIN9NCOkFGISQXsvLL79sADCcHvXRo0cbAIz6+npjyJAhxuOPP250d3cbhmEYq1evNtrb2w3DMIw77rjDAGA0NDQYM2bMMNatW2cYhmHEYjFjwYIFxpFHHmkAMEaMGGG0trZavuPdd981gsGgAcA4/PDDjUWLFhmGYRjd3d3GQw89ZDQ1NRlNTU0GAGP06NEF+d1//vOfDQCGz+cznnvuOfP1RYsWGbW1tQYA4+qrry7IdxFCeg8URYT0YryKokAgYCxcuFD7mU2bNhm1tbWGz+czXnzxRe1notGosf/++xsAjDvuuMPy3gknnGAAMHbbbTejo6PDduyzzz5rtrFQosgwDOPb3/62AcAYPHiwsWHDBqOrq8vYZ599DADGpEmTTPFHCCECus8IITj++OMxceJE7Xt/+9vf0NHRgQMOOABHHXWU9jPBYBDf+c53AADPPfec+fq2bdvMf0+bNg01NTW2Y4877jgccsgh+f4EG/fccw/Gjh2LDRs24JxzzsGVV16JDz74AA0NDXjooYdQVVVV8O8khFQ2LN5ICMHkyZMd33vjjTcAAB999BGGDBni+LnOzk4AwKpVq8zXFi5ciEQiAQA48sgjHY898sgjMW/evKzanInGxkY89NBDmDJlCp599lnz9T/84Q/YaaedCvpdhJDeAUURIQSDBg1yfG/t2rUAkqJHCB835DIAGzduNP8ePny44zEjRozw0sysOeigg3DJJZfgtttuA5DMOjvjjDOK8l2EkMqH7jNCCAKBgON78XgcAPCDH/wARjIO0fU/NY2/lGzbtg3//Oc/zX8vXLgQbW1tJWwRIaScoSgihLgiXGYffvhh1sfKFqg1a9Y4fs7tvXw4//zz8fnnn2P48OHo378/PvvsM1x88cVF+S5CSOVDUUQIcUXEG7311luWeCEv7LfffvD7k8PMyy+/7Pi5l156KfcGOjBr1iw8+uijZj2iP//5zwCABx54AA899FDBv48QUvlQFBFCXDnrrLNQU1ODeDyOH/3oR6Y7TUcikcC2bdvMfzc1NeHYY48FANx6663o6uqyHfPiiy9i7ty5BW3z4sWLcemllwIAfvrTn+KII47AySefjB/+8IcAkq7AFStWFPQ7CSGVD0URIcSVIUOG4OabbwYAPP300zjmmGPw5ptvmuLIMAwsXrwYt99+O/bcc0889dRTluNvvPFGBAIBLF68GF/5ylfw6aefAgBisRgeeeQRfOtb30JTU1PB2huJRPDtb38bHR0dOOigg/DLX/7SfO+2227DnnvuiZaWFnznO99BLBYr2PcSQiofiiJCSEZ+8pOf4Le//S0CgQBefvllTJkyBbW1tRgwYADC4TDGjx+PK664AosWLYLP57Mce8ABB2DmzJnw+Xx46aWXsPvuu6OpqQn19fU47bTTMHjwYFx33XUFa+u0adPMekR///vfLVuWVFdX4+GHH0ZNTQ3efvttTJ8+vWDfSwipfCiKCCGemDZtGhYvXozLLrsMe++9N6qrq7Ft2zbU19fjwAMPxFVXXYW5c+fi9NNPtx17wQUX4M0338RJJ52Efv36IRKJYPTo0bjmmmvwzjvvWPZoy4enn34ad911FwBg5syZ2npEe+yxh5mif/PNN7vGOhFCdix8hmEYpW4EIWTHZvbs2Tj33HMxevToskrpJ4TsWNBSRAghhBACiiJCCCGEEAAURYQQQgghALj3GSGkDFm9ejUOPPDArI4ZOXIk5s+fX6QWEUJ2BBhoTQgpO1auXImxY8dmdQyDtAkh+UJRRAghhBACxhQRQgghhACgKCKEEEIIAUBRRAghhBACgKKIEEIIIQQARREhhBBCCACKIkIIIYQQABRFhBBCCCEAKIoIIYQQQgBQFBFCCCGEAAD+HynaOCwHFaM3AAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig = plt.figure()\n", + "ax = fig.gca()\n", + "\n", + "abs(dataWithoutModulationFFT2).plot.errorbar(ax=ax, x='freq_x')\n", + "ax.set_xlim([1, 40000])\n", + "ax.set_ylim([0, 0.00005])\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Only One Beam # 2" + ] + }, + { + "cell_type": "code", + "execution_count": 95, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.DataArray 'CH1' (x: 1200)>\n",
+       "array([0.215, 0.197, 0.195, ..., 0.194, 0.218, 0.198])\n",
+       "Coordinates:\n",
+       "  * x        (x) float64 0.0 1e-05 2e-05 3e-05 ... 0.01197 0.01198 0.01199
" + ], + "text/plain": [ + "\n", + "array([0.215, 0.197, 0.195, ..., 0.194, 0.218, 0.198])\n", + "Coordinates:\n", + " * x (x) float64 0.0 1e-05 2e-05 3e-05 ... 0.01197 0.01198 0.01199" + ] + }, + "execution_count": 95, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "filePath = r'F:\\Jianshun\\AccordionLatticeShorTermStability\\onlyOneBeam_2.csv'\n", + "\n", + "data = read_csv_file(filePath, csvEngine='pandas', csvKwargs=dict(header=[0], skiprows=[1], encoding = \"ISO-8859-1\",))\n", + "dataOnlyOneBeam2 = xr.DataArray(\n", + " data=data.CH1[0,:],\n", + " dims=['x'],\n", + " coords=dict(\n", + " x=data.X[0,:].to_numpy() * 1e-05\n", + " )\n", + ")\n", + "dataOnlyOneBeam2" + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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3ER6y26XhsN/9339L581CFabwDa+OmGwSEQhzwwBUyAPqWiLRXTKPTN8biK9KbkOLBYLq6B1xDsREREREUlisEhEihnRwYWIiIzFYJGIiIiIJDFYJCLFjOjgQkRExmKwSERkMMbgRBTKGCwSERERkSQGixT24mN4mmslPpZ5qQeWLBJRKOOdnxT5aOY16NAsEUsfvtbopKh2/+BOaJ4Uh/sHZxmdFNN7c1J/dGyeiDcm9TM6KWFh4oD2+FXHprgmq5nRSSEikmQROBZGSCsvL0daWhrKysqQmppqdHKIiIhIgXB6fpuuZLGiogI5OTnIzs5GcnIy0tLSMGDAALzyyiuor6/3a58XL17E559/jqeeegq33XYb2rRpA4vFAovFgvnz5yvah81mw6JFizBixAi0bNkS8fHxyMzMxL333ostW7b4lS4iIiIio5lqur8TJ05g6NChyM/PBwAkJiairq4Ou3btwq5du7Bo0SJs2LABTZs2VbXfVatW4f777/c7XVVVVbjrrruwdu1aAEB0dDRSU1NRVFSEFStW4JNPPsFTTz2FnJwcv49BREREZATTlCxarVaMHTsW+fn5aNOmDdatW4eqqipUV1dj6dKlSElJwd69ezFlyhS/9p+RkYHRo0fjySefxKeffqpq21mzZmHt2rWIiorC888/j9LSUpSUlODChQt48sknIQgC5syZg8WLF/uVNiIiIiKjmKbN4vvvv48HH3wQALBjxw4MGjTIbfmSJUswefJkAMD69esxfPhwxftubGxETIx7Iatj8OEPP/wQM2bMkNx2//79yM7OBgD84Q9/wD//+U+vdWbMmIEFCxagbdu2yMvLQ1xcnOK0hVObByIiokgRTs9v05QsLliwAAAwbNgwr0ARACZOnIhOnToBAD766CNV+/YMFNX46quvnL8/+uijous89thjAIDCwkJnVTURERGRGZgiWKyursb27dsBAKNHjxZdx2KxYNSoUQAQ1IDsxIkTAIC0tDS0bdtWdJ0uXbo4A9LVq1cHLW1EREREgTJFsJibmwubzQYA6N27t+R6jmVFRUUoKSkJStocrFar5DKbzeZM/88//xysJBEREREFzBTBYmFhofP3zMxMyfVcl7luo6esrCwAQGVlpbOU0ZNrsOsrXXV1dSgvL3f7ISIiIjKKKYLFiooK5++JiYmS67kuc91GT2PG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G2+8UejQoYOQlJQkxMbGCq1atRKGDx8uvPrqq6JVhWqFW77v379feOqpp4RbbrlF6NSpk5CamirExMQIzZs3F4YMGSI888wzQlFRkc9jCwLPd3/vM5MmTRIAe9VcQ0ODom0i+XzXIlgUBN7fg5nvZri/WwTBjwF3iIiIiCgisDc0EREREUlisEhEREREkhgsEhEREZEkBotEREREJInBIhERERFJYrBIRERERJIYLBIRERGRJAaLRERERCSJwSIRERERSWKwSERERESSGCwSERERkSQGi0REREQkicEiEREREUlisEhEREREkhgsEhEREZEkBotEREHw4osvwmKxIC4uDjt37hRd5+uvv0ZUVBQsFgsWL14c5BQSEYmzCIIgGJ0IIqJwJwgCRowYgfXr1+OKK67ATz/9hJSUFOfyM2fOoG/fvjh37hymT5+OBQsWGJhaIqLLGCwSEQVJUVER+vbti+LiYkyePBmLFi0C4B5Idu7cGXv37kVycrLBqSUismM1NBFRkGRkZGD+/PnOamZH6eGLL76I9evXIzY2FkuWLGGgSEQhhSWLRERB9qc//QmvvvoqkpOT8fbbb2PmzJloaGjASy+9hD//+c9GJ4+IyA2DRSKiIKuvr8d1112H3bt3O/83YsQIrF69GhaLxcCUERF5Y7BIRGSA/fv3Izs7GwCQlpaGQ4cOISMjw+BUERF5Y5tFIiIDvPvuu87fy8vL8dNPPxmXGCIiGSxZJCIKsv/85z8YO3YsAKBPnz7Yt28fWrVqhX379qF169YGp46IyB1LFomIgujMmTO4//77AQD3338/tmzZgqysLBQXF+O+++4D39+JKNQwWCQiChKbzYZp06bh/Pnz6NKlC9544w2kpaVh8eLFiImJwZo1a/Dqq68anUwiIjcMFomIguQf//gHNmzY4BxPMSkpCQAwaNAgPP300wCA//3f/8WePXuMTCYRkRu2WSQiCoKdO3diyJAhkuMp2mw2DB8+HJs3b0bXrl2xZ88eZzBJRGQkBotERDqrqKjAVVddhePHj+OWW27BmjVrRMdTPH36NPr27YuSkhLMmDEDH374oQGpJSJyx2CRiIiIiCSxzSIRERERSWKwSERERESSGCwSERERkSQGi0REREQkicEiEREREUlisEhEREREkhgsEhEREZEkBotEREREJInBIhERERFJYrBIRERERJIYLBIRERGRJAaLRERERCSJwSIRERERSfr/nku106sxt2gAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "dataOnlyOneBeam2.plot.errorbar()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "metadata": {}, + "outputs": [], + "source": [ + "dataOnlyOneBeamFFT2 = fft(dataOnlyOneBeam2)" + ] + }, + { + "cell_type": "code", + "execution_count": 98, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkUAAAHdCAYAAAATow1yAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAA9hAAAPYQGoP6dpAAB0TUlEQVR4nO3dd3wUZf4H8M+WZDe9k1BDk6Z0BBE4KSqix4l6duxnPf2JCtjuBMsJCpY7PRSxwFmwop5wgNKUIr0IQqgJhNDSezbZ3fn9sZnZZ2ZndjeNFD7v1yuvV7K7s/vszmbmO9/n+zyPSZIkCURERETnOHNjN4CIiIioKWBQRERERAQGRUREREQAGBQRERERAWBQRERERASAQRERERERAAZFRERERAAYFBEREREBYFBEREREBIBBERERERGAJhwUlZWVYenSpXjppZdw7bXXIjU1FSaTCSaTCdOnT2/s5tWY3HZ/PxMnTmzsZhIREZ2zrI3dACObN2/GlVde2djNqHdxcXEIDQ3VvS82NvbsNoaIiIgUTTYoAjwBxIABA5Sfxx57DKdOnWrsZtXJokWLMHLkyMZuBhEREWk02aBoxIgRyMvLU9321FNPNVJriIiIqKVrsjVFFoulzs9x+PBhPPLII+jZsyciIyMRHh6Onj17YtKkSTh27Fg9tJKIiIhaiiabKaqrefPm4a9//SuqqqoAADabDWazGWlpaUhLS8NHH32Er7/+Gpdddlkjt5SIiIiagiabKaqL7777Dvfddx8AT5dbRkYGysvLUVpairS0NFx//fUoKirCn//857OeMXr88cfRqlUrhIaGIikpCWPGjMG///1vlJWVndV2EBERkVqLC4oqKyvx8MMPAwDeffddzJgxQzWcv3v37vjyyy/xpz/9CUVFRXj99dfPavt27NiBsrIy2O125OTkYNWqVXj44YfRv39/7Nu376y2hYiIiLxaXFC0dOlSZGVlITk5GXfddZfh426//XYAwPLly89Ku26//XYsWbIEubm5KCkpQVFRETIzM/H3v/8dISEhOHDgAMaOHYuCgoKz0h4iIiJSa3E1RevWrQMA5Ofno3Xr1oaPq6ysBAAcPXrU5z6TyVTr17/xxhvx+eef+9y+YMECn9vatWuHF154Af369cN1112HzMxMvP7663jhhRdq/fpERERUOy0uU3TixAkAnqDn9OnThj/5+fkAgPLy8sZsLgDg2muvxbBhwwB46qGIiIjo7GtxmSKXywUAuOKKK7B06dJaPUd2dnatX99ms9Vqu6FDh2L9+vU4cuRIrV+biIiIaq/FBUUpKSkAgN27d9f6ORITE+urOURERNRMtLjuM7kbKisrS6kvag42btwIAOjUqVMjt4SIiOjcVKugaP78+UGt+r5ixYr6bm9A48ePVwqsH3300YDz/2iXEmkIkiT5vf+7775TArirr766wdtDREREvuqUKTKbzUhOTjb8qW19jSw/Px85OTnKj9vtBgCUlZWpbi8pKVG2sdvtmDNnDkwmE7Zv345hw4Zh+fLlymgzAEhPT8fcuXMxePBgzJkzp05tDMb111+Pp556Chs3bkRFRYVye1ZWFp5//nnceOONAIC2bdviiSeeaPD2EBERkS+TFCiNoWP+/Pm46667kJqaioyMjAZolkfHjh11h8xr3XHHHZg/f77qtk8//RT33XefkimyWq2IiYlBSUkJHA6H8riXXnoJzz77bL22W2vkyJH4+eefAXgCyZiYGLhcLhQVFSmP6d69OxYtWoRevXo1aFuIiIhIX4srtJbdeuutGD16NObMmYNly5bh0KFDKCgoQGRkJHr27Inhw4djwoQJuOSSSxq8Lc888wz69++PTZs2ITMzE7m5uXC73WjTpg369euHa665BhMnToTdbm/wthAREZG+Jp0pIiIiIjpbWtzoMyIiIqLaqFNQlJ2djYEDByIyMhJhYWHo3LkzJk6ciDVr1tRT84iIiIjOjjp1n8ni4uJQWlqqGuF111134b333oPValy25HA4VEXPbrcbeXl5SEhIqNP6Y0RERHT2SJKE4uJitGnTBmZzM+6Ekmph+fLl0rRp06Rdu3ZJFRUVkiRJktPplNavXy9deumlEgAJgPTwww/7fZ5p06Ypj+UPf/jDH/7whz/N+yczM7M2YUWTUatMkT9utxvXXnstvv/+e5jNZqSlpeG8887Tfaw2U1RYWIgOHTrg7reX4o3bLq7PZhEREVEDKSoqQvv27VFQUICYmJjGbk6t1fuQfLPZjNmzZ+P777+H2+3GDz/8gMcff1z3sTabTXeCx9CwCERHR9d304iIiKgBNffSlwbp+OvatauyqCpXfSciIqLmoBlXQxERERHVnwYJig4fPoycnBwAXPWdiIiImocaB0WB6rIlScKUKVM8T242449//GPtWkZERER0FtU4KDp69CgGDx6MuXPn4siRI0qQ5Ha7sXHjRowbNw7ffvstAOD+++9H9+7d67fFRERERA2gVqPPtmzZgi1btgDwjCCLiopCcXGxanj9XXfdhX/961/100oiIiKiBlbjoCg5ORlvvfUWfv31V+zcuRPZ2dnIz8+H3W5Hp06dcPHFF+Puu+/GsGHDGqK9RERERA2ixkFRWFgYHn74YTz88MMN0R4iIiKiRsEh+URERERgUEREREQEgEEREREREQAGRUREREQAGBQRERERAWBQRERERASAQRERERERAAZFRERERAAYFBEREREBYFBEREREBIBBEREREREABkVEREREABgUEREREQFgUEREREQEgEEREREREQAGRUREREQAGBQRERERAWBQRERERASAQRERERERAAZFRERERAAYFBEREREBYFBEREREBIBBEREREREABkVEREREABgUEREREQFgUEREREQEgEEREREREQAGRUREREQAGBQRERERAWBQRERERASAQRERERERAAZFRERERAAYFBEREREBYFBEREREBIBBEREREREABkVEREREABgUEREREQFgUEREREQEgEEREREREQAGRUREREQAGBQRERERAWBQRERERASAQRERERERAAZFRERERAAYFBEREREBYFBEREREBIBBEREREREABkVEREREABgUEREREQFgUEREREQEgEEREREREQAGRUREREQAGBQRERERAWBQRERERASAQRERERERgHoMimbOnAmTyaT8EBERETUn9RIU7d+/H88//3x9PBURERFRo6hzUOR2u3HPPfegoqICQ4cOrY82EREREZ11dQ6K3nrrLaxfvx633norLr/88vpoExEREdFZV6egKD09Hc8++ywSEhLwxhtv1FebINXbMxEREREFx1qXje+9916UlpZizpw5SEpKqq82EREREZ11tc4UzZs3DytXrsSll16K22+/vT7bRERERHTW1SpTlJWVhSlTpiAsLAxz586t9Ys7HA44HA7l76Kiolo/FxEREVFd1CpTdP/996OwsBDTp09H586da/3iM2bMQExMjPLTvn37Wj8XERERUV3UOCj65JNPsGTJEvTr1w+PP/54nV786aefRmFhofKTmZlZp+cjIiIiqq0adZ+dOXMGkyZNgsViwbx582C11qlOGzabDTabrU7PQURERFQfahTVPPnkk8jNzcWDDz6IHj16oKSkRHV/ZWWl8rt8X2hoKEJDQ+uhqUREREQNp0bdZ+np6QCAd955B1FRUT4/M2bMUB4r3zZ16tT6bTERERFRA6i3BWGJiIiImrMaBUVr1qyBJEmGP9OmTVMeK9/25ptv1nebiYiIiOodM0VEREREYFBEREREBIBBERERERGAeg6Kpk+frtQSERERETUnzBQRERERgUEREREREQAGRUREREQAGBQRERERAWBQRERERASAQRERERERAAZFRERERAAYFBEREREBYFBEREREBIBBEREREREABkVEREREABgUEREREQFgUEREREQEgEEREREREQAGRUREREQAGBQRERERAWBQRERERASAQRERERERAAZFRERERAAYFBEREREBYFBEREREBIBBEREREREABkVEREREABgUEREREQFgUEREREQEgEEREREREQAGRUREREQAGBQRERERAWBQRERERASAQRERERERAAZFRERERAAYFBEREREBYFBEREREBIBBEREREREABkVEREREABgUEREREQFgUEREREQEgEEREREREQAGRUREREQAGBQRERERAWBQRERERASAQRERERERAAZFRERERAAYFBEREREBYFBEREREBIBBEREREREABkVEREREABgUEREREQFgUEREREQEgEEREREREQAGRUREREQAGBQRERERAWBQRERERASAQRERERERAAZFRERERAAAa2022r59O3744Qds27YNBw4cQHZ2NoqKihAdHY0ePXrgyiuvxIMPPoj4+Pj6bi8RERFRg6hVUPThhx/i3//+t/K33W5HWFgY8vLysGHDBmzYsAFvvvkm/vvf/2Lo0KE1fwGpNq0iIiIiqr1adZ8NHjwYs2bNwq+//or8/HyUl5ejqKgIxcXFmD9/PpKSkpCTk4MJEyagsLCwvttMREREVO9qlSm6/fbbdW+PjIzEHXfcgdatW2Ps2LE4c+YMFi9ejFtvvbVOjSQiIiJqaA1SaH3RRRcpvx8/frwhXoKIiIioXjVIULR27Vrl9y5dujTESxARERHVq1p1n+lxOBw4efIkFi9ejOeeew4A0LVrV4wfP76+XoKIiIiowdQ5KLLb7XA4HD63Dxs2DJ999hlsNpvhtg6HQ7VtUVFRXZtDREREVCt17j5LSUlBcnIyIiIilNtGjRqFN998Ex06dPC77YwZMxATE6P8tG/fvq7NISIiIqqVOgdFGRkZOHXqFEpKSnD69GnMnj0bO3fuxODBg5VuNCNPP/00CgsLlZ/MzMy6NoeIiIioVuq10LpVq1Z44oknsGzZMphMJrz44otYvHix4eNtNhuio6NVP0RERESNoUFGnw0ePBjDhw8HALz33nsN8RJERERE9arBFoRt27YtAODQoUMN9RJERERE9abBgqIjR44AAKKiohrqJYiIiIjqTY2DIpfLBUnyv2LrypUrsXnzZgDAyJEja9UwIiIiorOpxkFRZmYm+vfvj7lz5+LIkSOqACkzMxMzZ87E1VdfDUmSEB8fj8cee6xeG0xERETUEGo1eeOuXbvwwAMPAABCQ0MRHR2N8vJylJaWKo/p1KkTvvnmG6SkpNRPS4mIiIgaUI2DojZt2uDLL7/EmjVrsGnTJpw8eRI5OTmwWCzo0KED+vbti6uvvhq33HILwsLCGqLNRERERPWuxkFRaGgorr/+elx//fUN0R4iIiKiRtFgo8+IiIiImhMGRURERERgUEREREQEgEEREREREQAGRUREREQAGBQRERERAWBQRERERASAQRERERERAAZFRERERAAYFBEREREBYFBEREREBIBBEREREREABkVEREREABgUEREREQFgUEREREQEgEEREREREQAGRUREREQAGBQRERERAWBQRERERASAQRERERERAAZFRERERAAYFBEREREBYFBEREREBIBBEREREREABkVEREREABgUEREREQFgUEREREQEgEEREREREQAGRUREREQAGBQRERERAWBQRERERASAQRERERERAAZFRERERAAYFBEREREBYFBEREREBIBBEREREREABkVEREREABgUEREREQFgUEREREQEgEEREREREQAGRUREREQAGBQRERERAWBQRERERASAQRERERERAAZFRERERAAYFBEREREBYFBEREREBIBBEREREREABkVEREREABgUEREREQFgUEREREQEgEEREREREQAGRUREREQAmmhQJDV2A4iIiOicU6ugKDc3Fx999BEmTpyIXr16ISIiAjabDe3atcOECRPw7bff1nc7iYiIiBqUtTYbpaSkwOl0Kn/b7XaEhIQgKysLWVlZ+P777zFu3Dh8/fXXCA8Pr7fGEhERETWUWmWKnE4nBg8ejDlz5uDw4cMoLy9HSUkJ0tPTcc899wAAli5divvvv79eG0tERETUUGqVKVq1ahVGjRrlc3vHjh3x/vvvw2q1Yu7cufjkk0/w8ssvo3379nVuKBEREVFDqlWmSC8gEsnZIgDYunVrbV6CiIiI6KxqkNFndrtd+d3lcjXESxARERHVqwYJitasWaP83rt374Z4CSIiIqJ6Ve9BUUFBAWbMmAEAGDFiBLp3717fL0FERERU72pVaG3E7Xbjtttuw8mTJ2Gz2fDWW2/5fbzD4YDD4VD+Lioqqs/mEBEREQWtXjNFjz76KBYvXgwAmDNnDvr27ev38TNmzEBMTIzyw1FqRERE1FjqLSiaPHky3n77bQDAG2+8gbvvvjvgNk8//TQKCwuVn8zMzPpqDhEREVGN1Ev32dSpU/Haa68BAGbNmoVJkyYFtZ3NZoPNZquPJhARERHVSZ2DoilTpmD27NkAgFdffRWTJ0+uc6OIiIiIzrY6BUWTJ09WMkSvvvoqpkyZUi+NIiIiIjrbah0UiQHR7Nmz8cQTT9Rbo4iIiIjOtloFRU8++aQSEL3++ut47LHH6rVRRERERGdbjUefHTt2DK+++qpnY7MZr7zyClJSUgx/5HojIiIioqasxpkit9ut+v306dN+H19SUlLzVhERERGdZTUOijp27AhJkhqiLURERESNpkEWhCUiIiJqbhgUEREREYFBEREREREABkVEREREABgUEREREQFgUEREREQEgEEREREREQAGRUREREQAGBQRERERAWBQRERERASAQRERERERAAZFRERERAAYFBEREREBYFBEREREBIBBEREREREABkVEREREABgUEREREQFgUEREREQEgEEREREREQAGRUREREQAGBQRERERAWBQRERERASAQRERERERAAZFRERERAAYFBEREREBYFBEREREBIBBEREREREABkVEREREABgUEREREQFgUEREREQEgEEREREREQAGRUREREQAGBQRERERAWBQRERERASAQRERERERAAZFRERERAAYFBEREREBYFBEREREBIBBEREREREABkVEREREABgUEREREQFgUEREREQEgEEREREREQAGRUREREQAGBQRERERAWBQRERE1OIUlFXilnkb8fW2443dlGaFQREREVEL88+VB7Hh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On36tFRRUSH17dtXAiANHjxYCf6IiGTsPiMiXHHFFejfv7/ufZ9++inKysowaNAgjBkzRvcxVqsVN998MwBg+fLlyu0FBQXK31OmTEFYWJjPtmPHjsXQoUPr+hZ8zJ07F506dcLp06dxxx13YPLkydi1axeioqKwcOFChISE1PtrElHzxskbiQjDhg0zvG/dunUAgD179iAlJcXwceXl5QCAo0ePKrdt374dbrcbADB69GjDbUePHo1ff/21Rm0OJDo6GgsXLsTw4cOxbNky5fZ33nkHnTt3rtfXIqKWgUEREaFVq1aG9504cQKAJ+iRAx9/xGkAzpw5o/zetm1bw23atWsXTDNrbMiQIXj00Ufx2muvAfCMOrv11lsb5LWIqPlj9xkRwWKxGN7ncrkAAA888AAkTx2i3x/tMP7GVFBQgK+++kr5e/v27SgpKWnEFhFRU8agiIj8krvMdu/eXeNtxQxUVlaW4eP83VcX9957L44dO4a2bdsiISEBBw8exMMPP9wgr0VEzR+DIiLyS6432rhxo6peKBgDBgyA2ew5zKxevdrwcatWrap9Aw3MmzcPX3/9tTIf0QcffAAAWLBgARYuXFjvr0dEzR+DIiLy67bbbkNYWBhcLhf++te/Kt1petxuNwoKCpS/Y2NjcfnllwMAZs+ejYqKCp9tVqxYgQ0bNtRrm9PS0jBp0iQAwJNPPolRo0bh6quvxkMPPQTA0xWYnp5er69JRM0fgyIi8islJQUzZ84EACxZsgSXXXYZ1q9frwRHkiQhLS0Nr7/+Oi644AIsXrxYtf2LL74Ii8WCtLQ0XHXVVdi/fz8AwOl04ssvv8QNN9yA2NjYemuvw+HATTfdhLKyMgwZMgQvvPCCct9rr72GCy64AEVFRbj55pvhdDrr7XWJqPljUEREAf3f//0fXn31VVgsFqxevRrDhw9HeHg4EhMTYbPZ0LNnTzzxxBPYt28fTCaTattBgwZhzpw5MJlMWLVqFXr06IHY2FhERkbixhtvRHJyMp577rl6a+uUKVOU+Yg+++wz1ZIldrsdn3/+OcLCwrBp0yZMmzat3l6XiJo/BkVEFJQpU6YgLS0Njz32GPr06QO73Y6CggJERkbiwgsvxNSpU7FhwwbccsstPtved999WL9+PcaPH4/4+Hg4HA6kpqbi6aefxubNm1VrtNXFkiVL8NZbbwEA5syZozsf0fnnn68M0Z85c6bfWiciOreYJEmSGrsRRHRumz9/Pu666y6kpqY2qSH9RHRuYaaIiIiICAyKiIiIiAAwKCIiIiICwLXPiKgJyszMxIUXXlijbdq3b48tW7Y0UIuI6FzAQmsianIyMjLQqVOnGm3DIm0iqisGRURERERgTRERERERAAZFRERERAAYFBEREREBYFBEREREBIBBEREREREABkVEREREABgUEREREQFgUEREREQEgEEREREREQDg/wGa0NOcXHNpoAAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig = plt.figure()\n", + "ax = fig.gca()\n", + "\n", + "abs(dataOnlyOneBeamFFT2).plot.errorbar(ax=ax, x='freq_x')\n", + "ax.set_xlim([1, 40000])\n", + "ax.set_ylim([0, 0.00005])\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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x4T3e/OC93vzoqPc74gVx/i5pqYm7LLLLvjmm2/Qv39/PPXUUxg/fjxaWlrw4osv4k9/+hMqKiowYcIE/Pe//01FuQkhhBBCkkpcoggAli5dinHjxmHp0qUAhFutpaUFdXV1AICdd94ZM2fORNeuXZNWWEIIIYSQVBG3KAJEUsbJkyfjpZdewpIlS5CVlYVtt90WJ5xwAi688ELk5eUls6yEEEIIISkjIVFECCGEENJRyOyEAiQmampq8NZbb+GWW27B0UcfjUGDBiESiSASieCGG24ItY81a9bgsssuw9ChQ1FYWIhu3bph7NixePzxx0Old1+0aBHOOeccDBkyBAUFBejVqxcOOuggvPjii6GOv2DBApx88snYYostkJ+fj759++Koo47CrFmzQm0/e/ZsHHXUUejbty/y8/OxxRZb4OSTT8aCBQtCbZ9JbNiwAU8++SROPvlkbLfddiguLo6e85FHHomXX345cB+835nDggULcOONN+Lwww/HsGHD0L17d+Tm5qJ79+4YPXo0br31VmzcuNF3H7zfmc3tt98ebdODEiDzXnvQHhOukfZh9uzZ0Ul69b/rr78+cPvPPvvM6t69e3SbkpISKycnJ/r9wAMPtOp8Jo598803raKiouj6nTp1srKysqLfTz/9dKulpcVz+6lTpzqO17lzZysSiYQ+h+uvvz66biQSsTp37hz9npOTY02dOjXwGmQS6rUCYBUUFFjFxcWOZRMmTLCqq6uN2/N+Zxbnn3++636XlpY6lvXo0cOaO3eucXve78xm4cKFVkFBgeN+e8F77Q1F0WbE7Nmzra5du1rjx4+3Jk6caD333HNWnz59QlXCTZs2RdcdNmyY9WnrbO319fXWQw89ZOXm5loArPPOO8+4/eLFi6Md8ujRo60ff/zRsizLqqystK677rpohb7jjjuM28+dO9fKzs62AFhHHnmktWLFCsuyLGv9+vXWOeecE93+3//+t3H7f//739F1zjnnHGv9+vWWZVnWihUrrCOPPNICYGVnZ3t2GJkIAGvUqFHWlClTrEWLFkWXL1myxDrzzDOj1+Pkk092bcv7nXk89dRT1l133WV9/PHHVllZWXR5ZWWlNW3aNKtnz54WAKtXr17Wpk2bHNvyfmc2zc3N1ujRoy0A1l577eUriniv/aEo2oxoampyLRs0aFAoUfTXv/7VAmAVFhZaixcvdv1+2223RSujfEhUTj75ZAuA1adPH0eDLTn77LOjbxwbN250/T5mzBgLgLXDDjtYDQ0Nrt8POuggC4A1aNAg13k2NTVFz/Oggw5ybVtfX2/tsMMOFgBrzJgxfpcho5g1a5bv72oDtHz5csdvvN8djxkzZkTv99NPP+34jfc7s7nvvvssANZJJ53ksKKY4L32h6JoMyesKBo4cGDULGqisrLSKikpsQBY1113neO3qqoqq7Cw0AJg3XjjjcbtlyxZEn2Qn3jiCcdvixYtiv721FNPGbd///33o+voYmDmzJnR3z744APj9tOmTYuuo1pVOjLz58+PnvNLL73k+I33u+NRXl4ePefbb7/d8Rvvd+YiLTfdu3e31q5dGyiKeK/9YaA1CeTHH3/E8uXLAQATJkwwrlNSUoKxY8cCAN555x3Hbx999BFqa2t9tx88eDCGDx9u3P7dd9+Nfj744ION248ZMwalpaW+25eWlkanqNFRy6UeryNTUFAQ/dzc3Bz9zPvdMfnwww+jn7faaqvoZ97vzOass85CdXU17rnnHvTs2dN3Xd7rYCiKSCDqxL8jRozwXE/+9v3333tuv/322wdu/9133xm379WrF3r16mXcNjs7G8OGDfPdfvjw4cjOzjZu36tXr2iDom/fUXn//fejn3fYYYfoZ97vjkN9fT2WLl2Khx56CKeccgoAYOutt8Zhhx0WXYf3O3OZOnUqZs6cif333z/UlFq818FQFJFAfvvtt+jn/v37e64nf6uoqEBVVZVr+65du6KoqChwe/V46ne/Y6dy+47Ipk2bMGnSJADA2LFjMXTo0OhvvN+ZT0FBASKRCAoKCjBkyBBceOGFKCsrw+jRozFz5kzH/FS835nJypUrMXHiRBQWFuLRRx8NtQ3vdTAURSSQysrK6Ge/B0H9Td1GfvbbVv1d3TYdtu9otLS04JRTTsGqVauQn5+PBx980PE773fm06dPH/Tu3RvFxcXRZePGjcN9992HgQMHOtbl/c5MzjnnHJSXl+OGG27AlltuGWob3utgKIoI2cy46KKL8MYbbwAApkyZgpEjR7ZziUiyWbp0KVavXo2qqiqsWbMGkydPxpdffolRo0bhuuuua+/ikQR5+umn8eabb2KnnXbCpZde2t7F6VBQFJFAZNAbILJie6H+pm4jP/ttq/6ubpsO23ckLr/8cjz00EMAgHvvvRdnnHGGax3e745Fr169cNlll+Htt99GJBLBzTffHBXFAO93prF27VpcfPHFyM7OxtSpU5GTkxN6W97rYCiKSCD9+vWLfl65cqXnevK3Tp06oaSkxLV9WVmZb2WW26vHU7/7HTuV23cUrrjiCtx9990AgLvuugsXX3yxcT3e747JqFGjMGbMGADAY489Fl3O+51ZXHnlldiwYQPOPvtsDBs2DFVVVY6/hoaG6Lr6Mt7rYCiKSCDqKAV19IGO/G277bbz3N5vNIDcXh/VILdfu3Yt1q1bZ9y2ubkZCxcu9N3+hx9+cAw9V1H37TeqIlOZOHEi7rrrLgDAnXfeicsvv9xzXd7vjosMQP3ll1+iy3i/M4slS5YAAP7+97+jtLTU9ScHUACILrviiisA8F6HgaKIBDJ06NBocObbb79tXKe6ujqaB+XAAw90/DZmzBgUFhb6br9s2TL88MMPxu0POOCA6Gev7efMmRMNqvPavrKyEnPnzjVur+5XPV5H4PLLL8fkyZMBCEE0ceJE3/V5vzsuixcvBuB0K/B+bz7wXocg5nSPpEMR6zQfRUVF1pIlS1y/33HHHaFSw/ft29c175JlWdZ5551nAbBKS0t9U8OPHDnSmBp+woQJoVLDH3LIIa5tGxoarB133LFDTgNw2WWXRbO7Tp48OfR2vN+ZRVNTk+8EnJZlWe+991500s0rrrjC8Rvvd8ch7DQfvNdmKIo2MzZu3GitW7cu+jdgwAALgDVx4kTH8srKSsd26iSC2223nfXZZ59ZliXmmpkyZYqVl5dnAeEmERw7dqz1008/WZYl0sbfeOON0cY6zCSCRx99tPXrr79almVZGzZsiD6EQLhJBM877zxrw4YNlmVZ1q+//modffTR0UagI00YecUVV0TP+Z577olpW97vzGLJkiXWyJEjrUceecRatGiRQyAtX77cmjRpUvR+dOvWzVq1apVje97vjkOQKOK99oeiaDNDquygv9NOO8217WeffWZ17949uk5paWl0RmUA1oEHHmjV1dV5HvvNN9+0ioqKout37tw5+nAAsP74xz/6vu1OnTrVysnJia7fpUuX6AMYxtqlNhaRSMTq0qVL9HtOTo41derUsJcx7Vm2bFn03LKysqzevXv7/t11112uffB+Zw7qfFMArLy8PKtHjx7Rzkv+DRkyxFqwYIFxH7zfHYMgUWRZvNd+UBRtZiQiiizLslavXm1dcskl1jbbbGMVFBRYXbp0scaMGWNNnTrVam5uDjz+L7/8Yp111lnW4MGDrby8PKt79+7WAQccYL3wwguhyv/5559bJ554otW/f38rLy/P6t27t3XkkUdaM2fODLX9zJkzrSOPPNLq3bu3lZeXZ/Xv39868cQTo29LHQW9kwz682qEeL8zg/r6emv69OnWn//8Z2vXXXe1+vXrZ+Xl5VmFhYXWwIEDrcMOO8x6/PHHrZqaGt/98H5nPmFEkWXxXnsRsSzLAiGEEELIZg5HnxFCCCGEgKKIEEIIIQQARREhhBBCCACKIkIIIYQQABRFhBBCCCEAKIoIIYQQQgBQFBFCCCGEAKAoIoQQQggBQFFECCGEEAKAoogQQgghBABFESEdnubmZtxzzz3YeeedUVxcjEgkgkgkgldeeaW9i0YIIWlFTnsXgBCSWi6++GI89NBDAIC8vDz07t0bAFBQUNCexSKEkLSDE8IS0oGprKxE9+7d0djYiDvvvBOXX345IpFIexeLEELSEooiQjown376KUaNGgVACKSSkpJ2LhEhhKQvjCkipANTU1MT/UxBRAgh/lAUEdIBmTZtGiKRCPbdd9/oMhlgrS4fPHgwIpEIpk2bhqqqKlx33XXYYYcdUFpaikgkgqVLlzr2+8UXX+CMM87AVltthaKiIpSUlGDkyJH461//ivXr1/uW6ZNPPsGRRx6JHj16oLCwEEOHDsW1116LqqqqaHkHDx6c0HnX19dj5513RiQSwahRo9DY2Ghc77jjjkMkEkG/fv0Cy00I2XygKCKkA1JYWIjevXuja9eu0WW9e/eO/nXr1s2x/oYNG7Drrrvi5ptvxk8//YScHPcYjOuvvx677rornnzySSxevBiRSASNjY34+uuvceutt2LHHXfEF198YSzPE088gdGjR+PVV1/Fhg0bkJ+fj6VLl+K2227D7rvvjrKysqScd35+Pp5//nkUFxfj008/xTXXXONa5/HHH8f06dORlZWFf/3rX+jRo0dSjk0I6QBYhJAOy+zZsy0AltejPmjQIAuAVVJSYvXp08d66aWXrIaGBsuyLGvFihVWdXW1ZVmWde+991oArNLSUmvSpEnWqlWrLMuyrKamJuuzzz6z9ttvPwuAtcUWW1iVlZWOY3z++edWTk6OBcDad999rR9++MGyLMtqaGiwnnvuOatLly5Wly5dLADWoEGDknLe//jHPywAViQSsWbMmBFd/sMPP1hFRUUWAOuqq65KyrEIIR0HiiJCOjBhRVF2dra1YMEC4zrr1q2zioqKrEgkYr333nvGdRobG61dd93VAmDde++9jt8mTJhgAbC23XZbq6amxrXt22+/HS1jskSRZVnW8ccfbwGwevfuba1Zs8aqq6uzRo4caQGwRo0aFRV/hBAiofuMEIKDDz4YO++8s/G3Z555BjU1Ndhtt90wfvx44zo5OTk44YQTAAAzZsyILt+0aVP0+8SJE1FYWOja9qCDDsJee+2V6Cm4ePTRRzFkyBCsWbMGp512Gi6//HJ89dVXKC0txXPPPYfc3NykH5MQktkweSMhBKNHj/b87aOPPgIAfPvtt+jTp4/nerW1tQCAZcuWRZctWLAALS0tAID99tvPc9v99tsPH3/8cUxlDqJTp0547rnnMGbMGLz99tvR5X//+9+x5ZZbJvVYhJCOAUURIQS9evXy/O23334DIESPFD5+qGkA1q5dG/3cv39/z2222GKLMMWMmT322AMXXXQR7r77bgBi1NlJJ52UkmMRQjIfus8IIcjOzvb8rbm5GQBw7rnnwhJxiL5/+jD+9mTTpk34z3/+E/2+YMECVFVVtWOJCCHpDEURIcQX6TL75ptvYt5WtUCtXLnScz2/3xLhrLPOwvLly9G/f390794dP//8My644IKUHIsQkvlQFBFCfJHxRp988okjXigMu+yyC7KyRDMze/Zsz/VmzZoVfwE9mDp1Kl544YVoPqJ//OMfAICnnnoKzz33XNKPRwjJfCiKCCG+nHLKKSgsLERzczPOP//8qDvNREtLCzZt2hT93qVLFxx44IEAgMmTJ6Ours61zXvvvYe5c+cmtcwLFy7ExRdfDAC48sorMW7cOBxxxBH485//DEC4ApcsWZLUYxJCMh+KIkKIL3369MHtt98OAHjzzTdxwAEHYM6cOVFxZFkWFi5ciHvuuQcjRozAG2+84dj+5ptvRnZ2NhYuXIjf/e53+PHHHwEATU1NmD59Ov7whz+gS5cuSStvfX09jj/+eNTU1GCPPfbATTfdFP3t7rvvxogRI1BRUYETTjgBTU1NSTsuISTzoSgihATyl7/8BXfeeSeys7Mxe/ZsjBkzBkVFRejRowfy8/MxfPhwXHbZZfjhhx8QiUQc2+62226YMmUKIpEIZs2ahWHDhqFLly4oKSnBcccdh969e+O6665LWlknTpwYzUf07LPPOqYsKSgowPPPP4/CwkLMmzcP119/fdKOSwjJfCiKCCGhmDhxIhYuXIhLLrkEO+64IwoKCrBp0yaUlJRg9913xxVXXIG5c+fixBNPdG179tlnY86cOTjssMPQrVs31NfXY9CgQbj66qsxf/58xxxtifDmm2/iwQcfBABMmTLFmI9o++23jw7Rv/32231jnQghmxcRy7Ks9i4EIWTzZtq0aTj99NMxaNCgtBrSTwjZvKCliBBCCCEEFEWEEEIIIQAoigghhBBCAHDuM0JIGrJixQrsvvvuMW0zYMAAfPrppykqESFkc4CB1oSQtGPp0qUYMmRITNswSJsQkigURYQQQgghYEwRIYQQQggAiiJCCCGEEAAURYQQQgghACiKCCGEEEIAUBQRQgghhACgKCKEEEIIAUBRRAghhBACgKKIEEIIIQQARREhhBBCCADg/wFB5YN8lw1FaQAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig = plt.figure()\n", + "ax = fig.gca()\n", + "\n", + "abs(dataOnlyOneBeamFFT2).plot.errorbar(ax=ax, x='freq_x', fmt='r')\n", + "abs(dataWithoutModulationFFT2).plot.errorbar(ax=ax, x='freq_x', fmt='b')\n", + "\n", + "ax.set_xlim([1, 40000])\n", + "ax.set_ylim([0, 0.00005])\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "base", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +}