You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

3217 lines
1.7 MiB

{
"cells": [
{
"attachments": {},
"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"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## Start a client for parallel computing"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
" <div style=\"width: 24px; height: 24px; background-color: #e1e1e1; border: 3px solid #9D9D9D; border-radius: 5px; position: absolute;\"> </div>\n",
" <div style=\"margin-left: 48px;\">\n",
" <h3 style=\"margin-bottom: 0px;\">Client</h3>\n",
" <p style=\"color: #9D9D9D; margin-bottom: 0px;\">Client-8ba1675f-1745-11ee-81b0-80e82ce2fa8e</p>\n",
" <table style=\"width: 100%; text-align: left;\">\n",
"\n",
" <tr>\n",
" \n",
" <td style=\"text-align: left;\"><strong>Connection method:</strong> Cluster object</td>\n",
" <td style=\"text-align: left;\"><strong>Cluster type:</strong> distributed.LocalCluster</td>\n",
" \n",
" </tr>\n",
"\n",
" \n",
" <tr>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Dashboard: </strong> <a href=\"http://127.0.0.1:8787/status\" target=\"_blank\">http://127.0.0.1:8787/status</a>\n",
" </td>\n",
" <td style=\"text-align: left;\"></td>\n",
" </tr>\n",
" \n",
"\n",
" </table>\n",
"\n",
" \n",
"\n",
" \n",
" <details>\n",
" <summary style=\"margin-bottom: 20px;\"><h3 style=\"display: inline;\">Cluster Info</h3></summary>\n",
" <div class=\"jp-RenderedHTMLCommon jp-RenderedHTML jp-mod-trusted jp-OutputArea-output\">\n",
" <div style=\"width: 24px; height: 24px; background-color: #e1e1e1; border: 3px solid #9D9D9D; border-radius: 5px; position: absolute;\">\n",
" </div>\n",
" <div style=\"margin-left: 48px;\">\n",
" <h3 style=\"margin-bottom: 0px; margin-top: 0px;\">LocalCluster</h3>\n",
" <p style=\"color: #9D9D9D; margin-bottom: 0px;\">5686383f</p>\n",
" <table style=\"width: 100%; text-align: left;\">\n",
" <tr>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Dashboard:</strong> <a href=\"http://127.0.0.1:8787/status\" target=\"_blank\">http://127.0.0.1:8787/status</a>\n",
" </td>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Workers:</strong> 8\n",
" </td>\n",
" </tr>\n",
" <tr>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Total threads:</strong> 128\n",
" </td>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Total memory:</strong> 149.01 GiB\n",
" </td>\n",
" </tr>\n",
" \n",
" <tr>\n",
" <td style=\"text-align: left;\"><strong>Status:</strong> running</td>\n",
" <td style=\"text-align: left;\"><strong>Using processes:</strong> True</td>\n",
"</tr>\n",
"\n",
" \n",
" </table>\n",
"\n",
" <details>\n",
" <summary style=\"margin-bottom: 20px;\">\n",
" <h3 style=\"display: inline;\">Scheduler Info</h3>\n",
" </summary>\n",
"\n",
" <div style=\"\">\n",
" <div>\n",
" <div style=\"width: 24px; height: 24px; background-color: #FFF7E5; border: 3px solid #FF6132; border-radius: 5px; position: absolute;\"> </div>\n",
" <div style=\"margin-left: 48px;\">\n",
" <h3 style=\"margin-bottom: 0px;\">Scheduler</h3>\n",
" <p style=\"color: #9D9D9D; margin-bottom: 0px;\">Scheduler-579b49b9-56d3-437e-8497-ccb704499216</p>\n",
" <table style=\"width: 100%; text-align: left;\">\n",
" <tr>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Comm:</strong> tcp://127.0.0.1:58438\n",
" </td>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Workers:</strong> 8\n",
" </td>\n",
" </tr>\n",
" <tr>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Dashboard:</strong> <a href=\"http://127.0.0.1:8787/status\" target=\"_blank\">http://127.0.0.1:8787/status</a>\n",
" </td>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Total threads:</strong> 128\n",
" </td>\n",
" </tr>\n",
" <tr>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Started:</strong> Just now\n",
" </td>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Total memory:</strong> 149.01 GiB\n",
" </td>\n",
" </tr>\n",
" </table>\n",
" </div>\n",
" </div>\n",
"\n",
" <details style=\"margin-left: 48px;\">\n",
" <summary style=\"margin-bottom: 20px;\">\n",
" <h3 style=\"display: inline;\">Workers</h3>\n",
" </summary>\n",
"\n",
" \n",
" <div style=\"margin-bottom: 20px;\">\n",
" <div style=\"width: 24px; height: 24px; background-color: #DBF5FF; border: 3px solid #4CC9FF; border-radius: 5px; position: absolute;\"> </div>\n",
" <div style=\"margin-left: 48px;\">\n",
" <details>\n",
" <summary>\n",
" <h4 style=\"margin-bottom: 0px; display: inline;\">Worker: 0</h4>\n",
" </summary>\n",
" <table style=\"width: 100%; text-align: left;\">\n",
" <tr>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Comm: </strong> tcp://127.0.0.1:58495\n",
" </td>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Total threads: </strong> 16\n",
" </td>\n",
" </tr>\n",
" <tr>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Dashboard: </strong> <a href=\"http://127.0.0.1:58496/status\" target=\"_blank\">http://127.0.0.1:58496/status</a>\n",
" </td>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Memory: </strong> 18.63 GiB\n",
" </td>\n",
" </tr>\n",
" <tr>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Nanny: </strong> tcp://127.0.0.1:58441\n",
" </td>\n",
" <td style=\"text-align: left;\"></td>\n",
" </tr>\n",
" <tr>\n",
" <td colspan=\"2\" style=\"text-align: left;\">\n",
" <strong>Local directory: </strong> C:\\Users\\data\\AppData\\Local\\Temp\\dask-worker-space\\worker-fjkqs65s\n",
" </td>\n",
" </tr>\n",
"\n",
" \n",
"\n",
" \n",
"\n",
" </table>\n",
" </details>\n",
" </div>\n",
" </div>\n",
" \n",
" <div style=\"margin-bottom: 20px;\">\n",
" <div style=\"width: 24px; height: 24px; background-color: #DBF5FF; border: 3px solid #4CC9FF; border-radius: 5px; position: absolute;\"> </div>\n",
" <div style=\"margin-left: 48px;\">\n",
" <details>\n",
" <summary>\n",
" <h4 style=\"margin-bottom: 0px; display: inline;\">Worker: 1</h4>\n",
" </summary>\n",
" <table style=\"width: 100%; text-align: left;\">\n",
" <tr>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Comm: </strong> tcp://127.0.0.1:58478\n",
" </td>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Total threads: </strong> 16\n",
" </td>\n",
" </tr>\n",
" <tr>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Dashboard: </strong> <a href=\"http://127.0.0.1:58481/status\" target=\"_blank\">http://127.0.0.1:58481/status</a>\n",
" </td>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Memory: </strong> 18.63 GiB\n",
" </td>\n",
" </tr>\n",
" <tr>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Nanny: </strong> tcp://127.0.0.1:58442\n",
" </td>\n",
" <td style=\"text-align: left;\"></td>\n",
" </tr>\n",
" <tr>\n",
" <td colspan=\"2\" style=\"text-align: left;\">\n",
" <strong>Local directory: </strong> C:\\Users\\data\\AppData\\Local\\Temp\\dask-worker-space\\worker-2zpxzh7e\n",
" </td>\n",
" </tr>\n",
"\n",
" \n",
"\n",
" \n",
"\n",
" </table>\n",
" </details>\n",
" </div>\n",
" </div>\n",
" \n",
" <div style=\"margin-bottom: 20px;\">\n",
" <div style=\"width: 24px; height: 24px; background-color: #DBF5FF; border: 3px solid #4CC9FF; border-radius: 5px; position: absolute;\"> </div>\n",
" <div style=\"margin-left: 48px;\">\n",
" <details>\n",
" <summary>\n",
" <h4 style=\"margin-bottom: 0px; display: inline;\">Worker: 2</h4>\n",
" </summary>\n",
" <table style=\"width: 100%; text-align: left;\">\n",
" <tr>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Comm: </strong> tcp://127.0.0.1:58485\n",
" </td>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Total threads: </strong> 16\n",
" </td>\n",
" </tr>\n",
" <tr>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Dashboard: </strong> <a href=\"http://127.0.0.1:58489/status\" target=\"_blank\">http://127.0.0.1:58489/status</a>\n",
" </td>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Memory: </strong> 18.63 GiB\n",
" </td>\n",
" </tr>\n",
" <tr>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Nanny: </strong> tcp://127.0.0.1:58443\n",
" </td>\n",
" <td style=\"text-align: left;\"></td>\n",
" </tr>\n",
" <tr>\n",
" <td colspan=\"2\" style=\"text-align: left;\">\n",
" <strong>Local directory: </strong> C:\\Users\\data\\AppData\\Local\\Temp\\dask-worker-space\\worker-xj22aq7d\n",
" </td>\n",
" </tr>\n",
"\n",
" \n",
"\n",
" \n",
"\n",
" </table>\n",
" </details>\n",
" </div>\n",
" </div>\n",
" \n",
" <div style=\"margin-bottom: 20px;\">\n",
" <div style=\"width: 24px; height: 24px; background-color: #DBF5FF; border: 3px solid #4CC9FF; border-radius: 5px; position: absolute;\"> </div>\n",
" <div style=\"margin-left: 48px;\">\n",
" <details>\n",
" <summary>\n",
" <h4 style=\"margin-bottom: 0px; display: inline;\">Worker: 3</h4>\n",
" </summary>\n",
" <table style=\"width: 100%; text-align: left;\">\n",
" <tr>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Comm: </strong> tcp://127.0.0.1:58483\n",
" </td>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Total threads: </strong> 16\n",
" </td>\n",
" </tr>\n",
" <tr>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Dashboard: </strong> <a href=\"http://127.0.0.1:58486/status\" target=\"_blank\">http://127.0.0.1:58486/status</a>\n",
" </td>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Memory: </strong> 18.63 GiB\n",
" </td>\n",
" </tr>\n",
" <tr>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Nanny: </strong> tcp://127.0.0.1:58444\n",
" </td>\n",
" <td style=\"text-align: left;\"></td>\n",
" </tr>\n",
" <tr>\n",
" <td colspan=\"2\" style=\"text-align: left;\">\n",
" <strong>Local directory: </strong> C:\\Users\\data\\AppData\\Local\\Temp\\dask-worker-space\\worker-ywxt37o0\n",
" </td>\n",
" </tr>\n",
"\n",
" \n",
"\n",
" \n",
"\n",
" </table>\n",
" </details>\n",
" </div>\n",
" </div>\n",
" \n",
" <div style=\"margin-bottom: 20px;\">\n",
" <div style=\"width: 24px; height: 24px; background-color: #DBF5FF; border: 3px solid #4CC9FF; border-radius: 5px; position: absolute;\"> </div>\n",
" <div style=\"margin-left: 48px;\">\n",
" <details>\n",
" <summary>\n",
" <h4 style=\"margin-bottom: 0px; display: inline;\">Worker: 4</h4>\n",
" </summary>\n",
" <table style=\"width: 100%; text-align: left;\">\n",
" <tr>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Comm: </strong> tcp://127.0.0.1:58460\n",
" </td>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Total threads: </strong> 16\n",
" </td>\n",
" </tr>\n",
" <tr>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Dashboard: </strong> <a href=\"http://127.0.0.1:58473/status\" target=\"_blank\">http://127.0.0.1:58473/status</a>\n",
" </td>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Memory: </strong> 18.63 GiB\n",
" </td>\n",
" </tr>\n",
" <tr>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Nanny: </strong> tcp://127.0.0.1:58445\n",
" </td>\n",
" <td style=\"text-align: left;\"></td>\n",
" </tr>\n",
" <tr>\n",
" <td colspan=\"2\" style=\"text-align: left;\">\n",
" <strong>Local directory: </strong> C:\\Users\\data\\AppData\\Local\\Temp\\dask-worker-space\\worker-r165h314\n",
" </td>\n",
" </tr>\n",
"\n",
" \n",
"\n",
" \n",
"\n",
" </table>\n",
" </details>\n",
" </div>\n",
" </div>\n",
" \n",
" <div style=\"margin-bottom: 20px;\">\n",
" <div style=\"width: 24px; height: 24px; background-color: #DBF5FF; border: 3px solid #4CC9FF; border-radius: 5px; position: absolute;\"> </div>\n",
" <div style=\"margin-left: 48px;\">\n",
" <details>\n",
" <summary>\n",
" <h4 style=\"margin-bottom: 0px; display: inline;\">Worker: 5</h4>\n",
" </summary>\n",
" <table style=\"width: 100%; text-align: left;\">\n",
" <tr>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Comm: </strong> tcp://127.0.0.1:58492\n",
" </td>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Total threads: </strong> 16\n",
" </td>\n",
" </tr>\n",
" <tr>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Dashboard: </strong> <a href=\"http://127.0.0.1:58493/status\" target=\"_blank\">http://127.0.0.1:58493/status</a>\n",
" </td>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Memory: </strong> 18.63 GiB\n",
" </td>\n",
" </tr>\n",
" <tr>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Nanny: </strong> tcp://127.0.0.1:58446\n",
" </td>\n",
" <td style=\"text-align: left;\"></td>\n",
" </tr>\n",
" <tr>\n",
" <td colspan=\"2\" style=\"text-align: left;\">\n",
" <strong>Local directory: </strong> C:\\Users\\data\\AppData\\Local\\Temp\\dask-worker-space\\worker-y9scwwnw\n",
" </td>\n",
" </tr>\n",
"\n",
" \n",
"\n",
" \n",
"\n",
" </table>\n",
" </details>\n",
" </div>\n",
" </div>\n",
" \n",
" <div style=\"margin-bottom: 20px;\">\n",
" <div style=\"width: 24px; height: 24px; background-color: #DBF5FF; border: 3px solid #4CC9FF; border-radius: 5px; position: absolute;\"> </div>\n",
" <div style=\"margin-left: 48px;\">\n",
" <details>\n",
" <summary>\n",
" <h4 style=\"margin-bottom: 0px; display: inline;\">Worker: 6</h4>\n",
" </summary>\n",
" <table style=\"width: 100%; text-align: left;\">\n",
" <tr>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Comm: </strong> tcp://127.0.0.1:58477\n",
" </td>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Total threads: </strong> 16\n",
" </td>\n",
" </tr>\n",
" <tr>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Dashboard: </strong> <a href=\"http://127.0.0.1:58479/status\" target=\"_blank\">http://127.0.0.1:58479/status</a>\n",
" </td>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Memory: </strong> 18.63 GiB\n",
" </td>\n",
" </tr>\n",
" <tr>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Nanny: </strong> tcp://127.0.0.1:58447\n",
" </td>\n",
" <td style=\"text-align: left;\"></td>\n",
" </tr>\n",
" <tr>\n",
" <td colspan=\"2\" style=\"text-align: left;\">\n",
" <strong>Local directory: </strong> C:\\Users\\data\\AppData\\Local\\Temp\\dask-worker-space\\worker-6gncvkv7\n",
" </td>\n",
" </tr>\n",
"\n",
" \n",
"\n",
" \n",
"\n",
" </table>\n",
" </details>\n",
" </div>\n",
" </div>\n",
" \n",
" <div style=\"margin-bottom: 20px;\">\n",
" <div style=\"width: 24px; height: 24px; background-color: #DBF5FF; border: 3px solid #4CC9FF; border-radius: 5px; position: absolute;\"> </div>\n",
" <div style=\"margin-left: 48px;\">\n",
" <details>\n",
" <summary>\n",
" <h4 style=\"margin-bottom: 0px; display: inline;\">Worker: 7</h4>\n",
" </summary>\n",
" <table style=\"width: 100%; text-align: left;\">\n",
" <tr>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Comm: </strong> tcp://127.0.0.1:58484\n",
" </td>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Total threads: </strong> 16\n",
" </td>\n",
" </tr>\n",
" <tr>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Dashboard: </strong> <a href=\"http://127.0.0.1:58488/status\" target=\"_blank\">http://127.0.0.1:58488/status</a>\n",
" </td>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Memory: </strong> 18.63 GiB\n",
" </td>\n",
" </tr>\n",
" <tr>\n",
" <td style=\"text-align: left;\">\n",
" <strong>Nanny: </strong> tcp://127.0.0.1:58448\n",
" </td>\n",
" <td style=\"text-align: left;\"></td>\n",
" </tr>\n",
" <tr>\n",
" <td colspan=\"2\" style=\"text-align: left;\">\n",
" <strong>Local directory: </strong> C:\\Users\\data\\AppData\\Local\\Temp\\dask-worker-space\\worker-4vducatr\n",
" </td>\n",
" </tr>\n",
"\n",
" \n",
"\n",
" \n",
"\n",
" </table>\n",
" </details>\n",
" </div>\n",
" </div>\n",
" \n",
"\n",
" </details>\n",
"</div>\n",
"\n",
" </details>\n",
" </div>\n",
"</div>\n",
" </details>\n",
" \n",
"\n",
" </div>\n",
"</div>"
],
"text/plain": [
"<Client: 'tcp://127.0.0.1:58438' processes=8 threads=128, memory=149.01 GiB>"
]
},
"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"
]
},
{
"attachments": {},
"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')"
]
},
{
"attachments": {},
"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())"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"# Repetition Scans"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## scan MOT freq"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The detected scaning axes and values are: \n",
"\n",
"{'initial_freq': array([101. , 101.25, 101.5 , 101.75, 102. , 102.25, 102.5 , 102.75,\n",
" 103. , 103.25]), '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(\"<div id='\" + id + \"'></div>\");\n if (!fig.cell_info) {\n console.error('Failed to find cell for figure', id, fig);\n return;\n }\n fig.cell_info[0].output_area.element.on(\n 'cleared',\n { fig: fig },\n fig._remove_fig_handler\n );\n};\n\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 '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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 '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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 = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n // Add the status bar.\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message pull-right';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n\n // Add the close button to the window.\n var buttongrp = document.createElement('div');\n buttongrp.classList = 'btn-group inline pull-right';\n button = document.createElement('button');\n button.classList = 'btn btn-mini btn-primary';\n button.href = '#';\n button.title = 'Stop Interaction';\n button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n button.addEventListener('click', function (_evt) {\n fig.handle_close(fig, {});\n });\n button.addEventListener(\n 'mouseover',\n on_mouseover_closure('Stop Interaction')\n );\n buttongrp.appendChild(button);\n var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n titlebar.insertBefore(buttongrp, titlebar.firstChild);\n};\n\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": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\" width=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%matplotlib notebook\n",
"shotNum = \"0000\"\n",
"filePath = folderPath + \"/\" + shotNum + \"/*.h5\"\n",
"\n",
"dataSetDict = {\n",
" dskey[groupList[i]]: read_hdf5_file(filePath, groupList[i])\n",
" for i in range(len(groupList))\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, 825)\n",
"imageAnalyser.span = (550, 1250)\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('MOT AOM Freq (MHz)')\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')"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## scan Push freq"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The detected scaning axes and values are: \n",
"\n",
"{'push_freq': array([101.1, 101.6, 102.1, 102.6, 103.1, 103.6, 104.1, 104.6, 105.1,\n",
" 105.6, 106.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(\"<div id='\" + id + \"'></div>\");\n if (!fig.cell_info) {\n console.error('Failed to find cell for figure', id, fig);\n return;\n }\n fig.cell_info[0].output_area.element.on(\n 'cleared',\n { fig: fig },\n fig._remove_fig_handler\n );\n};\n\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 '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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 '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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 = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n // Add the status bar.\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message pull-right';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n\n // Add the close button to the window.\n var buttongrp = document.createElement('div');\n buttongrp.classList = 'btn-group inline pull-right';\n button = document.createElement('button');\n button.classList = 'btn btn-mini btn-primary';\n button.href = '#';\n button.title = 'Stop Interaction';\n button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n button.addEventListener('click', function (_evt) {\n fig.handle_close(fig, {});\n });\n button.addEventListener(\n 'mouseover',\n on_mouseover_closure('Stop Interaction')\n );\n buttongrp.appendChild(button);\n var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n titlebar.insertBefore(buttongrp, titlebar.firstChild);\n};\n\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": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAAAXNSR0IArs4c6QAAGJZJREFUeF7t1kEBAAAIAjHpX9ogNxswfLBzBAgQIECAAAECKYGl0gpLgAABAgQIECBwBqAnIECAAAECBAjEBAzAWOHiEiBAgAABAgQMQD9AgAABAgQIEIgJGICxwsUlQIAAAQIECBiAfoAAAQIECBAgEBMwAGOFi0uAAAECBAgQMAD9AAECBAgQIEAgJmAAxgoXlwABAgQIECBgAPoBAgQIECBAgEBMwACMFS4uAQIECBAgQMAA9AMECBAgQIAAgZiAARgrXFwCBAgQIECAgAHoBwgQIECAAAECMQEDMFa4uAQIECBAgAABA9APECBAgAABAgRiAgZgrHBxCRAgQIAAAQIGoB8gQIAAAQIECMQEDMBY4eISIECAAAECBAxAP0CAAAECBAgQiAkYgLHCxSVAgAABAgQIGIB+gAABAgQIECAQEzAAY4WLS4AAAQIECBAwAP0AAQIECBAgQCAmYADGCheXAAECBAgQIGAA+gECBAgQIECAQEzAAIwVLi4BAgQIECBAwAD0AwQIECBAgACBmIABGCtcXAIECBAgQICAAegHCBAgQIAAAQIxAQMwVri4BAgQIECAAAED0A8QIECAAAECBGICBmCscHEJECBAgAABAgagHyBAgAABAgQIxAQMwFjh4hIgQIAAAQIEDEA/QIAAAQIECBCICRiAscLFJUCAAAECBAgYgH6AAAECBAgQIBATMABjhYtLgAABAgQIEDAA/QABAgQIECBAICZgAMYKF5cAAQIECBAgYAD6AQIECBAgQIBATMAAjBUuLgECBAgQIEDAAPQDBAgQIECAAIGYgAEYK1xcAgQIECBAgIAB6AcIECBAgAABAjEBAzBWuLgECBAgQIAAAQPQDxAgQIAAAQIEYgIGYKxwcQkQIECAAAECBqAfIECAAAECBAjEBAzAWOHiEiBAgAABAgQMQD9AgAABAgQIEIgJGICxwsUlQIAAAQIECBiAfoAAAQIECBAgEBMwAGOFi0uAAAECBAgQMAD9AAECBAgQIEAgJmAAxgoXlwABAgQIECBgAPoBAgQIECBAgEBMwACMFS4uAQIECBAgQMAA9AMECBAgQIAAgZiAARgrXFwCBAgQIECAgAHoBwgQIECAAAECMQEDMFa4uAQIECBAgAABA9APECBAgAABAgRiAgZgrHBxCRAgQIAAAQIGoB8gQIAAAQIECMQEDMBY4eISIECAAAECBAxAP0CAAAECBAgQiAkYgLHCxSVAgAABAgQIGIB+gAABAgQIECAQEzAAY4WLS4AAAQIECBAwAP0AAQIECBAgQCAmYADGCheXAAECBAgQIGAA+gECBAgQIECAQEzAAIwVLi4BAgQIECBAwAD0AwQIECBAgACBmIABGCtcXAIECBAgQICAAegHCBAgQIAAAQIxAQMwVri4BAgQIECAAAED0A8QIECAAAECBGICBmCscHEJECBAgAABAgagHyBAgAABAgQIxAQMwFjh4hIgQIAAAQIEDEA/QIAAAQIECBCICRiAscLFJUCAAAECBAgYgH6AAAECBAgQIBATMABjhYtLgAABAgQIEDAA/QABAgQIECBAICZgAMYKF5cAAQIECBAgYAD6AQIECBAgQIBATMAAjBUuLgECBAgQIEDAAPQDBAgQIECAAIGYgAEYK1xcAgQIECBAgIAB6AcIECBAgAABAjEBAzBWuLgECBAgQIAAAQPQDxAgQIAAAQIEYgIGYKxwcQkQIECAAAECBqAfIECAAAECBAjEBAzAWOHiEiBAgAABAgQMQD9AgAABAgQIEIgJGICxwsUlQIAAAQIECBiAfoAAAQIECBAgEBMwAGOFi0uAAAECBAgQMAD9AAECBAgQIEAgJmAAxgoXlwABAgQIECBgAPoBAgQIECBAgEBMwACMFS4uAQIECBAgQMAA9AMECBAgQIAAgZiAARgrXFwCBAgQIECAgAHoBwgQIECAAAECMQEDMFa4uAQIECBAgAABA9APECBAgAABAgRiAgZgrHBxCRAgQIAAAQIGoB8gQIAAAQIECMQEDMBY4eISIECAAAECBAxAP0CAAAECBAgQiAkYgLHCxSVAgAABAgQIGIB+gAABAgQIECAQEzAAY4WLS4AAAQIECBAwAP0AAQIECBAgQCAmYADGCheXAAECBAgQIGAA+gECBAgQIECAQEzAAIwVLi4BAgQIECBAwAD0AwQIECBAgACBmIABGCtcXAIECBAgQICAAegHCBAgQIAAAQIxAQMwVri4BAgQIECAAAED0A8QIECAAAECBGICBmCscHEJECBAgAABAgagHyBAgAABAgQIxAQMwFjh4hIgQIAAAQIEDEA/QIAAAQIECBCICRiAscLFJUCAAAECBAgYgH6AAAECBAgQIBATMABjhYtLgAABAgQIEDAA/QABAgQIECBAICZgAMYKF5cAAQIECBAgYAD6AQIECBAgQIBATMAAjBUuLgECBAgQIEDAAPQDBAgQIECAAIGYgAEYK1xcAgQIECBAgIAB6AcIECBAgAABAjEBAzBWuLgECBAgQIAAAQPQDxAgQIAAAQIEYgIGYKxwcQkQIECAAAECBqAfIECAAAECBAjEBAzAWOHiEiBAgAABAgQMQD9AgAABAgQIEIgJGICxwsUlQIAAAQIECBiAfoAAAQIECBAgEBMwAGOFi0uAAAECBAgQMAD9AAECBAgQIEAgJmAAxgoXlwABAgQIECBgAPoBAgQIECBAgEBMwACMFS4uAQIECBAgQMAA9AMECBAgQIAAgZiAARgrXFwCBAgQIECAgAHoBwgQIECAAAECMQEDMFa4uAQIECBAgAABA9APECBAgAABAgRiAgZgrHBxCRAgQIAAAQIGoB8gQIAAAQIECMQEDMBY4eISIECAAAECBAxAP0CAAAECBAgQiAkYgLHCxSVAgAABAgQIGIB+gAABAgQIECAQEzAAY4WLS4AAAQIECBAwAP0AAQIECBAgQCAmYADGCheXAAECBAgQIGAA+gECBAgQIECAQEzAAIwVLi4BAgQIECBAwAD0AwQIECBAgACBmIABGCtcXAIECBAgQICAAegHCBAgQIAAAQIxAQMwVri4BAgQIECAAAED0A8QIECAAAECBGICBmCscHEJECBAgAABAgagHyBAgAABAgQIxAQMwFjh4hIgQIAAAQIEDEA/QIAAAQIECBCICRiAscLFJUCAAAECBAgYgH6AAAECBAgQIBATMABjhYtLgAABAgQIEDAA/QABAgQIECBAICZgAMYKF5cAAQIECBAgYAD6AQIECBAgQIBATMAAjBUuLgECBAgQIEDAAPQDBAgQIECAAIGYgAEYK1xcAgQIECBAgIAB6AcIECBAgAABAjEBAzBWuLgECBAgQIAAAQPQDxAgQIAAAQIEYgIGYKxwcQkQIECAAAECBqAfIECAAAECBAjEBAzAWOHiEiBAgAABAgQMQD9AgAABAgQIEIgJGICxwsUlQIAAAQIECBiAfoAAAQIECBAgEBMwAGOFi0uAAAECBAgQMAD9AAECBAgQIEAgJmAAxgoXlwABAgQIECBgAPoBAgQIECBAgEBMwACMFS4uAQIECBAgQMAA9AMECBAgQIAAgZiAARgrXFwCBAgQIECAgAHoBwgQIECAAAECMQEDMFa4uAQIECBAgAABA9APECBAgAABAgRiAgZgrHBxCRAgQIAAAQIGoB8gQIAAAQIECMQEDMBY4eISIECAAAECBAxAP0CAAAECBAgQiAkYgLHCxSVAgAABAgQIGIB+gAABAgQIECAQEzAAY4WLS4AAAQIECBAwAP0AAQIECBAgQCAmYADGCheXAAECBAgQIGAA+gECBAgQIECAQEzAAIwVLi4BAgQIECBAwAD0AwQIECBAgACBmIABGCtcXAIECBAgQICAAegHCBAgQIAAAQIxAQMwVri4BAgQIECAAAED0A8QIECAAAECBGICBmCscHEJECBAgAABAgagHyBAgAABAgQIxAQMwFjh4hIgQIAAAQIEDEA/QIAAAQIECBCICRiAscLFJUCAAAECBAgYgH6AAAECBAgQIBATMABjhYtLgAABAgQIEDAA/QABAgQIECBAICZgAMYKF5cAAQIECBAgYAD6AQIECBAgQIBATMAAjBUuLgECBAgQIEDAAPQDBAgQIECAAIGYgAEYK1xcAgQIECBAgIAB6AcIECBAgAABAjEBAzBWuLgECBAgQIAAAQPQDxAgQIAAAQIEYgIGYKxwcQkQIECAAAECBqAfIECAAAECBAjEBAzAWOHiEiBAgAABAgQMQD9AgAABAgQIEIgJGICxwsUlQIAAAQIECBiAfoAAAQIECBAgEBMwAGOFi0uAAAECBAgQMAD9AAECBAgQIEAgJmAAxgoXlwABAgQIECBgAPoBAgQIECBAgEBMwACMFS4uAQIECBAgQMAA9AMECBAgQIAAgZiAARgrXFwCBAgQIECAgAHoBwgQIECAAAECMQEDMFa4uAQIECBAgAABA9APECBAgAABAgRiAgZgrHBxCRAgQIAAAQIGoB8gQIAAAQIECMQEDMBY4eISIECAAAECBAxAP0CAAAECBAgQiAkYgLHCxSVAgAABAgQIGIB+gAABAgQIECAQEzAAY4WLS4AAAQIECBAwAP0AAQIECBAgQCAmYADGCheXAAECBAgQIGAA+gECBAgQIECAQEzAAIwVLi4BAgQIECBAwAD0AwQIECBAgACBmIABGCtcXAIECBAgQICAAegHCBAgQIAAAQIxAQMwVri4BAgQIECAAAED0A8QIECAAAECBGICBmCscHEJECBAgAABAgagHyBAgAABAgQIxAQMwFjh4hIgQIAAAQIEDEA/QIAAAQIECBCICRiAscLFJUCAAAECBAgYgH6AAAECBAgQIBATMABjhYtLgAABAgQIEDAA/QABAgQIECBAICZgAMYKF5cAAQIECBAgYAD6AQIECBAgQIBATMAAjBUuLgECBAgQIEDAAPQDBAgQIECAAIGYgAEYK1xcAgQIECBAgIAB6AcIECBAgAABAjEBAzBWuLgECBAgQIAAAQPQDxAgQIAAAQIEYgIGYKxwcQkQIECAAAECBqAfIECAAAECBAjEBAzAWOHiEiBAgAABAgQMQD9AgAABAgQIEIgJGICxwsUlQIAAAQIECBiAfoAAAQIECBAgEBMwAGOFi0uAAAECBAgQMAD9AAECBAgQIEAgJmAAxgoXlwABAgQIECBgAPoBAgQIECBAgEBMwACMFS4uAQIECBAgQMAA9AMECBAgQIAAgZiAARgrXFwCBAgQIECAgAHoBwgQIECAAAECMQEDMFa4uAQIECBAgAABA9APECBAgAABAgRiAgZgrHBxCRAgQIAAAQIGoB8gQIAAAQIECMQEDMBY4eISIECAAAECBAxAP0CAAAECBAgQiAkYgLHCxSVAgAABAgQIGIB+gAABAgQIECAQEzAAY4WLS4AAAQIECBAwAP0AAQIECBAgQCAmYADGCheXAAECBAgQIGAA+gECBAgQIECAQEzAAIwVLi4BAgQIECBAwAD0AwQIECBAgACBmIABGCtcXAIECBAgQICAAegHCBAgQIAAAQIxAQMwVri4BAgQIECAAAED0A8QIECAAAECBGICBmCscHEJECBAgAABAgagHyBAgAABAgQIxAQMwFjh4hIgQIAAAQIEDEA/QIAAAQIECBCICRiAscLFJUCAAAECBAgYgH6AAAECBAgQIBATMABjhYtLgAABAgQIEDAA/QABAgQIECBAICZgAMYKF5cAAQIECBAgYAD6AQIECBAgQIBATMAAjBUuLgECBAgQIEDAAPQDBAgQIECAAIGYgAEYK1xcAgQIECBAgIAB6AcIECBAgAABAjEBAzBWuLgECBAgQIAAAQPQDxAgQIAAAQIEYgIGYKxwcQkQIECAAAECBqAfIECAAAECBAjEBAzAWOHiEiBAgAABAgQMQD9AgAABAgQIEIgJGICxwsUlQIAAAQIECBiAfoAAAQIECBAgEBMwAGOFi0uAAAECBAgQMAD9AAECBAgQIEAgJmAAxgoXlwABAgQIECBgAPoBAgQIECBAgEBMwACMFS4uAQIECBAgQMAA9AMECBAgQIAAgZiAARgrXFwCBAgQIECAgAHoBwgQIECAAAECMQEDMFa4uAQIECBAgAABA9APECBAgAABAgRiAgZgrHBxCRAgQIAAAQIGoB8gQIAAAQIECMQEDMBY4eISIECAAAECBAxAP0CAAAECBAgQiAkYgLHCxSVAgAABAgQIGIB+gAABAgQIECAQEzAAY4WLS4AAAQIECBAwAP0AAQIECBAgQCAmYADGCheXAAECBAgQIGAA+gECBAgQIECAQEzAAIwVLi4BAgQIECBAwAD0AwQIECBAgACBmIABGCtcXAIECBAgQICAAegHCBAgQIAAAQIxAQMwVri4BAgQIECAAAED0A8QIECAAAECBGICBmCscHEJECBAgAABAgagHyBAgAABAgQIxAQMwFjh4hIgQIAAAQIEDEA/QIAAAQIECBCICRiAscLFJUCAAAECBAgYgH6AAAECBAgQIBATMABjhYtLgAABAgQIEDAA/QABAgQIECBAICZgAMYKF5cAAQIECBAgYAD6AQIECBAgQIBATMAAjBUuLgECBAgQIEDAAPQDBAgQIECAAIGYgAEYK1xcAgQIECBAgIAB6AcIECBAgAABAjEBAzBWuLgECBAgQIAAAQPQDxAgQIAAAQIEYgIGYKxwcQkQIECAAAECBqAfIECAAAECBAjEBAzAWOHiEiBAgAABAgQMQD9AgAABAgQIEIgJGICxwsUlQIAAAQIECBiAfoAAAQIECBAgEBMwAGOFi0uAAAECBAgQMAD9AAECBAgQIEAgJmAAxgoXlwABAgQIECBgAPoBAgQIECBAgEBMwACMFS4uAQIECBAgQMAA9AMECBAgQIAAgZiAARgrXFwCBAgQIECAgAHoBwgQIECAAAECMQEDMFa4uAQIECBAgAABA9APECBAgAABAgRiAgZgrHBxCRAgQIAAAQIGoB8gQIAAAQIECMQEDMBY4eISIECAAAECBAxAP0CAAAECBAgQiAkYgLHCxSVAgAABAgQIGIB+gAABAgQIECAQEzAAY4WLS4AAAQIECBAwAP0AAQIECBAgQCAmYADGCheXAAECBAgQIGAA+gECBAgQIECAQEzAAIwVLi4BAgQIECBAwAD0AwQIECBAgACBmIABGCtcXAIECBAgQICAAegHCBAgQIAAAQIxAQMwVri4BAgQIECAAAED0A8QIECAAAECBGICBmCscHEJECBAgAABAgagHyBAgAABAgQIxAQMwFjh4hIgQIAAAQIEDEA/QIAAAQIECBCICRiAscLFJUCAAAECBAgYgH6AAAECBAgQIBATMABjhYtLgAABAgQIEDAA/QABAgQIECBAICZgAMYKF5cAAQIECBAgYAD6AQIECBAgQIBATMAAjBUuLgECBAgQIEDAAPQDBAgQIECAAIGYgAEYK1xcAgQIECBAgIAB6AcIECBAgAABAjEBAzBWuLgECBAgQIAAAQPQDxAgQIAAAQIEYgIGYKxwcQkQIECAAAECBqAfIECAAAECBAjEBAzAWOHiEiBAgAABAgQMQD9AgAABAgQIEIgJGICxwsUlQIAAAQIECBiAfoAAAQIECBAgEBMwAGOFi0uAAAECBAgQMAD9AAECBAgQIEAgJmAAxgoXlwABAgQIECBgAPoBAgQIECBAgEBMwACMFS4uAQIECBAgQMAA9AMECBAgQIAAgZiAARgrXFwCBAgQIECAgAHoBwgQIECAAAECMQEDMFa4uAQIECBAgAABA9APECBAgAABAgRiAgZgrHBxCRAgQIAAAQIGoB8gQIAAAQIECMQEDMBY4eISIECAAAECBAxAP0CAAAECBAgQiAkYgLHCxSVAgAABAgQIGIB+gAABAgQIECAQEzAAY4WLS4AAAQIECBAwAP0AAQIECBAgQCAmYADGCheXAAECBAgQIGAA+gECBAgQIECAQEzAAIwVLi4BAgQIECBAwAD0AwQIECBAgACBmIABGCtcXAIECBAgQICAAegHCBAgQIAAAQIxAQMwVri4BAgQIECAAAED0A8QIECAAAECBGICBmCscHEJECBAgAABAgagHyBAgAABAgQIxAQMwFjh4hIgQIAAAQIEDEA/QIAAAQIECBCICRiAscLFJUCAAAECBAgYgH6AAAECBAgQIBATMABjhYtLgAABAgQIEDAA/QABAgQIECBAICZgAMYKF5cAAQIECBAgYAD6AQIECBAgQIBATMAAjBUuLgECBAgQIEDAAPQDBAgQIECAAIGYgAEYK1xcAgQIECBAgIAB6AcIECBAgAABAjEBAzBWuLgECBAgQIAAgQfuPgHhBVmL8wAAAABJRU5ErkJggg==\" width=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%matplotlib notebook\n",
"shotNum = \"0001\"\n",
"filePath = folderPath + \"/\" + shotNum + \"/*.h5\"\n",
"\n",
"dataSetDict = {\n",
" dskey[groupList[i]]: read_hdf5_file(filePath, groupList[i])\n",
" for i in range(len(groupList))\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, 825)\n",
"imageAnalyser.span = (550, 1250)\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('Push AOM Freq (MHz)')\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')"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## scan Z comp current"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The detected scaning axes and values are: \n",
"\n",
"{'compZ_final_current': array([0.242 , 0.2427, 0.2434, 0.2441, 0.2448, 0.2455, 0.2462, 0.2469,\n",
" 0.2476, 0.2483, 0.249 , 0.2497, 0.2504, 0.2511, 0.2518]), '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(\"<div id='\" + id + \"'></div>\");\n if (!fig.cell_info) {\n console.error('Failed to find cell for figure', id, fig);\n return;\n }\n fig.cell_info[0].output_area.element.on(\n 'cleared',\n { fig: fig },\n fig._remove_fig_handler\n );\n};\n\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 '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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 '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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 = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n // Add the status bar.\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message pull-right';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n\n // Add the close button to the window.\n var buttongrp = document.createElement('div');\n buttongrp.classList = 'btn-group inline pull-right';\n button = document.createElement('button');\n button.classList = 'btn btn-mini btn-primary';\n button.href = '#';\n button.title = 'Stop Interaction';\n button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n button.addEventListener('click', function (_evt) {\n fig.handle_close(fig, {});\n });\n button.addEventListener(\n 'mouseover',\n on_mouseover_closure('Stop Interaction')\n );\n buttongrp.appendChild(button);\n var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n titlebar.insertBefore(buttongrp, titlebar.firstChild);\n};\n\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": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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PBrA9RCmTBEZMSIeyOTJIsOHx8e5RLgObpeyeE/rCpBDOL2DLMJgQQ7Z5oD0EMEZwDlz5siVV14pzz//vCxevFjuueceOeKIIxoI1tfXy9ixY+WWW26RZcuWyZ577ik33HCD7LTTTg0xa9askXPPPVemTJkin376qRx44IFy4403Si/dB/z80ntHjRol999/f/RfDjvsMLnuuuukc+fODTHvvvuunHbaafL4449Lu3btZMSIEXLVVVfJJptsYtyjkPBoANdj4AqgcXfMfSAfduEgJoswWJBDtjkgPURwBvDhhx+Wp59+Wr7xjW/IUUcd1cIAjh8/XsaNGye333677LjjjnLZZZeJmsbXX39dOnToEJE+5ZRT5IEHHohiunbtKuecc458+OGHkams/vybIIMGDZK6urrISOp10kknSW1tbXSfXuvWrZO+ffvKFltsIVdffbUsXbpUjj32WBk8eHBkFE0vJDwawPUUSu8A6unf5odA9M/5DqBpb81+HB924TAkizBYkEO2OSA9RHAGsDGqqqqqJgZQV/969uwpZ555plxwwQVRqK72bbnllqLG8OSTT5YVK1ZEpu3OO++Uo48+OopZtGiR1NTUyIwZM2TgwIHy2muvSZ8+feTZZ5+NVhD10n/ee++9Ze7cudK7d29RI3rooYfKggULojL1mjp1qhx33HGyZMkS6dixo1GvQsKjAfwCQekUsP6XxiaQp4CNumlugviwCwclWYTBghyyzQHpITJlAN966y3Zbrvt5IUXXpDddtutgerhhx8ebd1OmjQp2q7VLV9d8evSpUtDzK677hptJev28a233ipnn322LF++vEnP0BzXXnutjBw5Ui655BK577775OWXX26I0W3jzTffPCqjfyunDtSQ6v9Kl8JT8/nBBx8Ym0ab7qqD+7HHHpODDz5Y2rRpY3Nr7mLvuadKzjqrWhYt+vzbL6Knf+vl6qvXyZFHNvs+jOfWk4NnQR3TkYOjcIDbyAIgqkNKcnAQDXCLKwf1EN26dYsWt0wXnkyrnykD+Mwzz8i+++4rCxcubFiV04bq9u0777wjjz76qEyePDkycI1NmMYMGDBAtt12W7n55pvl8ssvj7aH582b10Qn3VLWey+88MIo59tvvy0zZ85sEtO2bdvo3uGtnCYYM2ZMZDKbX1qv9u3bm3JhnKMCq1ZVy4gRh0Z3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xx13nPz0pz/1/hHcrID1zeH222+XkSNHtmi+9vsvfelLDf/dptysaJmknjZ6mDyrTTign9U0gEl6RMJ77777bvnv//7vaKLdd9995eabb5bf/va38uqrr8rWW2/dIvuZZ54ZfQ28f//+0e8L33bbbXLVVVfJc889J7vttluT+HfeeSfK+ZWvfEU233zzJgbwkEMOkWHDhsnuu+8uOuFedNFF8sorr0Tlbrrppglblb3bK8WhpNRf//pXGTp0aPSxXGVbVANYKQ7Lli2Lxo9qf8opp0j37t3ln//8p9TW1sp2222XvQ7tocaVYjFu3Di59tprZdKkSdFfcP/2t79FZuWyyy6L/nJUtAvBQY2Havn66683kfPLX/5yw7/blpt3LrZ6mDyrTTign9U0gBXsuXvuuad84xvfiFb1StfXvvY1OeKII6JPu5hcOkkeffTRcskllzSEr1u3Tg444IBo4nzyySejH5FuvALYPO/7778fPfSeeOIJ2X///U2KzVVMJTl8/PHHUR/QvwToQ65v376FNYCV4jB69Gh5+umno7HCa70ClWJx6KGHypZbbhmtvpauo446Stq3by933nln4fAgOKjxUIOiz4XWLh/l5gmWDz2aP6tNOKCf1TSAFeqln332WTSp/eEPf5AjjzyyoRb6NzPd4lUzFnfp7wzrKsX5558vP/7xjxvCf/azn8nf//53ueeee6LtkzgD+Oabb8oOO+wQrQLuvPPOccXm6s8rzeHYY4+NVmh11aNfv36FNYCV5NCnT5/oNYq6urpo3G211VZy6qmnyoknnpirvm7amEqy+MUvfiE33XSTzJw5M9qGf/nll2XAgAHRX4r0dZYiXSgOajxOOOGEqJ/rYoH+pfPSSy9t2EXyUW6eOPnQo9yzOo5DOQ19P6tpACvUUxctWhQNQF150HfwStfll18ebX80X54vV019d1AnzNdeey1awdNL8+mKoJrIbt26xRpA/aFpfUdQt8GKuAJSSQ76jqau+uk2l757U2QDWEkOpfeezj77bPn+978vf/nLX6IVEn0l45hjjqnQDFG5YivJQucjfRdW30murq6ODIpuC+uH7ot2oTg8++yzokZil112Ef11iokTJ8qMGTMis60LAT7KzRMrH3qUe1bHcWiuIeJZTQNYoZ5a6lTPPPOM7L333g210MlOtzr0gMaGrilTpkR/i7vvvvvkoIMOikI/+ugj+frXvx5tJw4aNCj6b3ErgKeddpo89NBD8tRTT0mvXr0qpEbliq0UhwULFsi3vvWtaKVj1113jQSgAdxKKjEeNtlkk4iFll26Ro0aJfpu5p///OfKdc4KlVypMaHN1b8UnXfeedHBON0y07/Iqhm/5pprRFfLi3QhOJTTT1en9DUUff3nV7/6VYMBdB2LeWNUKQ7NdUQ8q2kAK9Rbkywr6wup+n6fbh9/97vfbWiBTpb6Mrv+zbl06eDWa6ONNopWFRu/1H766adH7wbOmTNHtt122wopUdliK8VBt9t1678xK13tqKqqiljpKe/Gf1ZZlfClV4qDjodtttlGDj744OgAVunS93J1dVZPBxftqiSLmpoa0Xcy9WFXupTDXXfdFfuX4rxxQnBoTSN93UFfgdBT8EnKzRsDbU8SPVp7VptwaByDelbTAFawx+qLpfqZCV2xK136PpJuybZ2CERX/n70ox+J/r8eFml8rV69Olrab3zp5xN0ZVCX+fWdGl3t0KVk7VD6juDs2bOjZf8iX5XgoAZPT2o3vtTUf/WrX40+R1K0dzFVh0pw0PEwYsQI0RXZxq9AnHXWWdHp+sargkUaI5Vi0bVr18h462ns0qVzoX7xYN68eUVCELXVN4dyAurzYI899oi2hG+99VbncvMMp1Ic0M9qGsAK9trS0XJ96Vm3gW+55Rb5zW9+I//4xz+iVQl970VXIO64446olmr69J0kNXODBw9uqLl+y69Tp05lW1JuC1hfcJ88eXK0fdz423+aQ3MV7aoUh+Y6F3kLWLWoFAfd6tX3cMeOHRt9jkffAdQVER2PP/jBD4o2HKL2VoqFzld//OMfo/cvdQv4xRdflJNOOin6S6++F1i0C8FB+/lee+0V/cVf3wHUbV997UjfH1cjaMKfHJI/q004oJ/VNIAV7sm6+vfLX/4y+hC0rvroadDSp1h0Mnz77bejVTq91CCUOx2s78boiaJyVzkDqNuM5S79W7bGF/GqBAcawJY9rVIcHnzwwegvXG+88Ub0OoQeCCnqKeASlUqw0N2Kiy++ONqdWLJkSfTdUz39q5+50tXaIl6+Oejqtn6oWD+0rX/p19eG9OPbjd9FV503VC45JH9Wm3BAP6tpAIvYk9lmKkAFqAAVoAJUoNAK0AAWGj8bTwWoABWgAlSAChRRARrAIlJnm6kAFaACVIAKUIFCK0ADWGj8bDwVoAJUgApQASpQRAVoAItInW2mAlSAClABKkAFCq0ADWCh8bPxVIAKUAEqQAWoQBEVoAEsInW2mQpQASpABagAFSi0AjSAhcbPxlMBKkAFqAAVoAJFVIAGsIjU2WYqQAWoABWgAlSg0ArQABYaPxtPBagAFUiugP560f/8z/9Ev6tsel1//fUyc+ZMuf/++01vYRwVoAIeFaAB9CgmU1EBKpBfBfTnFkeOHNlqA/VnFPXnFPNwaVvPPPNMWb58eWxz9Gf09Kfz5s6dKxtttFGT+Msvvzz6abdx48bJ6NGjm/zZmjVrpLa2Vv7whz/It7/97dhyGEAFqIBfBWgA/erJbFSACuRUgU8//VRWrFjRonX6m6njx4+XWbNmyT777JNK6z/77LOyv43773//W9q0aZO4DjYGcMCAAdK/f//ot5SbXzvssIMMGTJE/u///k/mzZvX4s/POeccqaurk7vvvjtxnZmAClABOwVoAO30YjQVoAKeFfjPf/4jV155pfzmN7+RBQsWyJZbbiknn3yyXHTRRVFJr7zyipxxxhny5z//Wdq3by9HHXWUXHPNNbLZZptFf64rb7pStccee8jEiRNFV5b0h9b1fjUlv/vd76L7fv7zn8uPfvSj6J63335btt12W5kyZYr86le/khdeeEG22247ueGGG6Rfv37GLXziiSfkoIMOkl//+tdywgkntHqf1u/888+X++67LzKR22+/vfziF7+QQw89VMaMGSP33nuvvPTSSw33T5gwQfR/Ws/Gbdxzzz3luuuui8zf7NmzozaoeVIT+uyzz0b10FVKXYn85S9/KfPnz49W2UaNGiWnnnpqk7arKdNczz33nKhRu+mmm2TvvfeO8qqha3z97Gc/i+rZ/Prggw+ke/fuEaOddtqpyR+rNj/4wQ8a6qBa61Zx40tj1ECqPu3atTPWnYFUgAokV4AGMLmGzEAFqEACBS644ILI/F177bXRVuDixYuj7UQ1VKtWrYrMyV577SVjx46VJUuWRP9djYSuUpXM0fTp0+WYY46R008/XZ5++mk5/vjjZeDAgVHc97///cgkqQH85z//KTU1NQ0GsFevXpHR6tOnT2QqNU5NU9euXWNb9M4778juu+8uQ4cOFX2frbVLDe6+++4rH330UdRGNZqvvvqqVFdXy6BBg4wNoBq2I488UlSv+vr6yACrAVSDd/XVV8tuu+0mbdu2lYceekjUsGmd9L+9+OKLcuKJJ0btO/bYYxva/tWvflWuuuqqSF81y3/961/lzTffFK2vGslLLrlEXn/99ahZWlbJcDdupxrXH/7wh7Jy5coW27/KQ828mvtzzz1X3n//fZk0aVITmT755BPp0KFDtHp6wAEHxGrOACpABfwpQAPoT0tmogJUwFIBNUVbbLFFZFbKraCpMVTDoyuDm266aZR9xowZ8r3vfU8WLVoUGQxdAdRVq7feeqvBhKi50ZWpOXPmRPesW7dOOnXqJL/97W9l2LBhDSZIV+E0v15r166NDJWaSF2t29ClxlTNquZ87LHHZOONN241XA86qNF77bXXZMcdd2wRZ7oC+Mgjj8i7777bsPVbWsVUA6srpKVr6623jrakhw8f3vDfLrvsski3Z555pqHtqoUaZb3UkOoKntZRtTPdAtaydRVRjXXjSw1hjx49ovJ23XXXaHVTTbCa+44dOzaJ3XzzzSNjrOaUFxWgAukpQAOYntYsiQpQgWYK/OUvfxHd1lTzpuar+aWHC3QFS1eISpduoXbu3Fl0+1BX+NQA6uqSrnyVLl1N2nnnnaMt3dK1zTbbiL5zptuhJfNUylGK0RU2zR13mEPNlW656qpZt27dNshVt2K1HrpiWO4yNYALFy6MzGbpKrXhqaeeisyVXqqDGl/dTm18IEPNrZrV9957r6Htqr2uYOq1bNkyUSNW0sPUAF5xxRVy1113yT/+8Y8mTdPtZG2zbg2Xrl122SUy1yeddFKT2K222kp++tOfyimnnMLxQQWoQIoK0ACmKDaLogJUoKkCahC+/vWvt2oA9V2+l19+WR5//PEWBlBX9/bbb7+GdwB1O7J06Xt8ffv2jbZ3S5dulerJVv3fhgxgly5d5NZbb20Vla6u6XZyaXUrjqmukOlWa2sGUHPp9q62s3TptqkaqObvADZuY6kNapC1rXqpwfvyl78cmTI11o0v3XJWk13uPn0HT9utRlu1MzWAukKr2826Gtv40vcx//a3vzUxobq1rIZT3zlsfKlZvfPOO6PDIryoABVITwEawPS0ZklUgAo0U2D16tXRypMexEiyBawGxsUAqpkrbffqKtlXvvIV+fGPf9zqFrBuw+rBDT3QoO8Wmly6qvZf//VfrW4B6/t2ugr4r3/9S6qqqqKUenhC32W0NYB6r77XqIdo9PMr5S4TAzh58uQoh27Rb+hSk6dmb+nSpZGB1EtNvW776ra8si1dykhXbP/+979Hq7N66daxHojRdw/13UheVIAKpKcADWB6WrMkKkAFyiighzv09K6u1ulWpm5j6paivp+m79qpQdDPq6hJ0j9To6grf40PgbgaQH1fTsv92te+Fr2HpsZHD4GU29Z94403IrNz9NFHlz0RqydzGxuexk3VU7V6YlYPYmh79JCLmr1DDjkkMob6/p1up+oqmJpMNW/6rpyLAdR3+3SbW/Ppu4d6KlqNmm7z6pa6iQHU1U1l8cc//jEyc3qKWv/X/NJ3K3v27BmdtFZjrJeusOr2uP6v+aU5VUPVWi9leOmll7Z4h5ADhQpQAbwCNIB4jVkCFaACG1BAtwbVrOh2om4l6uEB/VWJ0nflTD8D47ICqIZPzaduo+oKlB5G0dW6cpca1XKfQinF6nuHuupV7vrwww+jk7D6qxd68rX0GZjvfve7Ubi+M6cfTdY4/cxN79695ZZbbnEygJpP26XbyHq4Qw/P6Pt3asz0HUcTA6g59J08/Uizru619hkYjVNOmlNXRfX7hGoI9WDNeeed10IKNcDKWt9nVMOsJ7XVHDf/SDQHDBWgAngFaADxGrMEKkAFAlOgnAkKrIqZqY6+d6grmM8//7zoQRvT6//9v/8nBx54YPSBaD2gwosKUIF0FaABTFdvlkYFqEAACtAA+oWgH7jW7W/dmje99PM4+j1DXQXkRQWoQPoK0ACmrzlLpAJUoMIK0ABWGACLpwJUoOIK0ABWHAErQAWoABWgAlSAClCBdBWgAUxXb5ZGBagAFaACVIAKUIGKK0ADWHEErAAVoAJUgApQASpABdJVgAYwXb1ZGhWgAlSAClABKkAFKq4ADWDFEbACVIAKUAEqQAWoABVIVwEawHT1ZmlUgApQASpABagAFai4AjSAFUfAClABKkAFqAAVoAJUIF0FaADT1ZulUQEqQAWoABWgAlSg4grQAFYcAStABagAFaACVIAKUIF0FaABTFdvlkYFqAAVoAJUgApQgYorQANYcQSsABWgAlSAClABKkAF0lWABjBdvVkaFaACVIAKUAEqQAUqrgANYMURsAJUgApQASpABagAFUhXARrAdPVmaVSAClABKkAFqAAVqLgCNIAVR8AKUAEqQAWoABWgAlQgXQX+Px7XHR68FRb6AAAAAElFTkSuQmCC\" width=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"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])\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 = (305, 870)\n",
"imageAnalyser.span = (400, 400)\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('comp Z current (A)')\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')"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"# Evaporative Cooling"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"img_dir = '//DyLabNAS/Data/'\n",
"SequenceName = \"Evaporative_Cooling\" + \"/\"\n",
"folderPath = img_dir + SequenceName + '2023/06/30'# get_date()\n",
"\n",
"# mongoDB = mongoClient[SequenceName]\n",
"\n",
"# DB = MongoDB(mongoClient, mongoDB, date=get_date())"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"# Check BEC"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"ename": "OSError",
"evalue": "no files to open",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mOSError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32mf:\\Jianshun\\analyseScript\\20230630_Data_Analysis_2.ipynb Cell 20\u001b[0m in \u001b[0;36m4\n\u001b[0;32m <a href='vscode-notebook-cell:/f%3A/Jianshun/analyseScript/20230630_Data_Analysis_2.ipynb#X25sZmlsZQ%3D%3D?line=0'>1</a>\u001b[0m shotNum \u001b[39m=\u001b[39m \u001b[39m\"\u001b[39m\u001b[39m0000\u001b[39m\u001b[39m\"\u001b[39m\n\u001b[0;32m <a href='vscode-notebook-cell:/f%3A/Jianshun/analyseScript/20230630_Data_Analysis_2.ipynb#X25sZmlsZQ%3D%3D?line=1'>2</a>\u001b[0m filePath \u001b[39m=\u001b[39m folderPath \u001b[39m+\u001b[39m \u001b[39m\"\u001b[39m\u001b[39m/\u001b[39m\u001b[39m\"\u001b[39m \u001b[39m+\u001b[39m shotNum \u001b[39m+\u001b[39m \u001b[39m\"\u001b[39m\u001b[39m/*.h5\u001b[39m\u001b[39m\"\u001b[39m\n\u001b[1;32m----> <a href='vscode-notebook-cell:/f%3A/Jianshun/analyseScript/20230630_Data_Analysis_2.ipynb#X25sZmlsZQ%3D%3D?line=3'>4</a>\u001b[0m dataSetDict \u001b[39m=\u001b[39m {\n\u001b[0;32m <a href='vscode-notebook-cell:/f%3A/Jianshun/analyseScript/20230630_Data_Analysis_2.ipynb#X25sZmlsZQ%3D%3D?line=4'>5</a>\u001b[0m dskey[groupList[i]]: read_hdf5_file(filePath, groupList[i])\n\u001b[0;32m <a href='vscode-notebook-cell:/f%3A/Jianshun/analyseScript/20230630_Data_Analysis_2.ipynb#X25sZmlsZQ%3D%3D?line=5'>6</a>\u001b[0m \u001b[39mfor\u001b[39;00m i \u001b[39min\u001b[39;00m [\u001b[39m0\u001b[39m]\n\u001b[0;32m <a href='vscode-notebook-cell:/f%3A/Jianshun/analyseScript/20230630_Data_Analysis_2.ipynb#X25sZmlsZQ%3D%3D?line=6'>7</a>\u001b[0m }\n\u001b[0;32m <a href='vscode-notebook-cell:/f%3A/Jianshun/analyseScript/20230630_Data_Analysis_2.ipynb#X25sZmlsZQ%3D%3D?line=8'>9</a>\u001b[0m dataSet \u001b[39m=\u001b[39m dataSetDict[\u001b[39m\"\u001b[39m\u001b[39mcamera_0\u001b[39m\u001b[39m\"\u001b[39m]\n\u001b[0;32m <a href='vscode-notebook-cell:/f%3A/Jianshun/analyseScript/20230630_Data_Analysis_2.ipynb#X25sZmlsZQ%3D%3D?line=10'>11</a>\u001b[0m print_scanAxis(dataSet)\n",
"\u001b[1;32mf:\\Jianshun\\analyseScript\\20230630_Data_Analysis_2.ipynb Cell 20\u001b[0m in \u001b[0;36m5\n\u001b[0;32m <a href='vscode-notebook-cell:/f%3A/Jianshun/analyseScript/20230630_Data_Analysis_2.ipynb#X25sZmlsZQ%3D%3D?line=0'>1</a>\u001b[0m shotNum \u001b[39m=\u001b[39m \u001b[39m\"\u001b[39m\u001b[39m0000\u001b[39m\u001b[39m\"\u001b[39m\n\u001b[0;32m <a href='vscode-notebook-cell:/f%3A/Jianshun/analyseScript/20230630_Data_Analysis_2.ipynb#X25sZmlsZQ%3D%3D?line=1'>2</a>\u001b[0m filePath \u001b[39m=\u001b[39m folderPath \u001b[39m+\u001b[39m \u001b[39m\"\u001b[39m\u001b[39m/\u001b[39m\u001b[39m\"\u001b[39m \u001b[39m+\u001b[39m shotNum \u001b[39m+\u001b[39m \u001b[39m\"\u001b[39m\u001b[39m/*.h5\u001b[39m\u001b[39m\"\u001b[39m\n\u001b[0;32m <a href='vscode-notebook-cell:/f%3A/Jianshun/analyseScript/20230630_Data_Analysis_2.ipynb#X25sZmlsZQ%3D%3D?line=3'>4</a>\u001b[0m dataSetDict \u001b[39m=\u001b[39m {\n\u001b[1;32m----> <a href='vscode-notebook-cell:/f%3A/Jianshun/analyseScript/20230630_Data_Analysis_2.ipynb#X25sZmlsZQ%3D%3D?line=4'>5</a>\u001b[0m dskey[groupList[i]]: read_hdf5_file(filePath, groupList[i])\n\u001b[0;32m <a href='vscode-notebook-cell:/f%3A/Jianshun/analyseScript/20230630_Data_Analysis_2.ipynb#X25sZmlsZQ%3D%3D?line=5'>6</a>\u001b[0m \u001b[39mfor\u001b[39;00m i \u001b[39min\u001b[39;00m [\u001b[39m0\u001b[39m]\n\u001b[0;32m <a href='vscode-notebook-cell:/f%3A/Jianshun/analyseScript/20230630_Data_Analysis_2.ipynb#X25sZmlsZQ%3D%3D?line=6'>7</a>\u001b[0m }\n\u001b[0;32m <a href='vscode-notebook-cell:/f%3A/Jianshun/analyseScript/20230630_Data_Analysis_2.ipynb#X25sZmlsZQ%3D%3D?line=8'>9</a>\u001b[0m dataSet \u001b[39m=\u001b[39m dataSetDict[\u001b[39m\"\u001b[39m\u001b[39mcamera_0\u001b[39m\u001b[39m\"\u001b[39m]\n\u001b[0;32m <a href='vscode-notebook-cell:/f%3A/Jianshun/analyseScript/20230630_Data_Analysis_2.ipynb#X25sZmlsZQ%3D%3D?line=10'>11</a>\u001b[0m print_scanAxis(dataSet)\n",
"File \u001b[1;32mf:\\Jianshun\\analyseScript\\DataContainer\\ReadData.py:150\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 139\u001b[0m kwargs\u001b[39m.\u001b[39mupdate(\n\u001b[0;32m 140\u001b[0m {\n\u001b[0;32m 141\u001b[0m \u001b[39m'\u001b[39m\u001b[39mjoin\u001b[39m\u001b[39m'\u001b[39m: join, \n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 146\u001b[0m }\n\u001b[0;32m 147\u001b[0m )\n\u001b[0;32m 149\u001b[0m \u001b[39mif\u001b[39;00m datesetOfGlobal \u001b[39mis\u001b[39;00m \u001b[39mNone\u001b[39;00m:\n\u001b[1;32m--> 150\u001b[0m datesetOfGlobal \u001b[39m=\u001b[39m xr\u001b[39m.\u001b[39;49mopen_mfdataset(\n\u001b[0;32m 151\u001b[0m fullFilePath, \n\u001b[0;32m 152\u001b[0m group\u001b[39m=\u001b[39;49m\u001b[39m\"\u001b[39;49m\u001b[39mglobals\u001b[39;49m\u001b[39m\"\u001b[39;49m, \n\u001b[0;32m 153\u001b[0m concat_dim\u001b[39m=\u001b[39;49m\u001b[39m\"\u001b[39;49m\u001b[39mfileNum\u001b[39;49m\u001b[39m\"\u001b[39;49m, \n\u001b[0;32m 154\u001b[0m combine\u001b[39m=\u001b[39;49m\u001b[39m\"\u001b[39;49m\u001b[39mnested\u001b[39;49m\u001b[39m\"\u001b[39;49m, \n\u001b[0;32m 155\u001b[0m preprocess\u001b[39m=\u001b[39;49m_read_shot_number_from_hdf5, \n\u001b[0;32m 156\u001b[0m engine\u001b[39m=\u001b[39;49m\u001b[39m\"\u001b[39;49m\u001b[39mh5netcdf\u001b[39;49m\u001b[39m\"\u001b[39;49m, \n\u001b[0;32m 157\u001b[0m phony_dims\u001b[39m=\u001b[39;49m\u001b[39m\"\u001b[39;49m\u001b[39maccess\u001b[39;49m\u001b[39m\"\u001b[39;49m, \n\u001b[0;32m 158\u001b[0m combine_attrs\u001b[39m=\u001b[39;49m_read_globals_attrs,\n\u001b[0;32m 159\u001b[0m parallel\u001b[39m=\u001b[39;49m\u001b[39mTrue\u001b[39;49;00m, )\n\u001b[0;32m 161\u001b[0m datesetOfGlobal\u001b[39m.\u001b[39mattrs[\u001b[39m'\u001b[39m\u001b[39mscanAxis\u001b[39m\u001b[39m'\u001b[39m] \u001b[39m=\u001b[39m np\u001b[39m.\u001b[39msetdiff1d(datesetOfGlobal\u001b[39m.\u001b[39mattrs[\u001b[39m'\u001b[39m\u001b[39mscanAxis\u001b[39m\u001b[39m'\u001b[39m], excludeAxis)\n\u001b[0;32m 163\u001b[0m _assgin_scan_axis \u001b[39m=\u001b[39m partial(_assign_scan_axis_partial, datesetOfGlobal\u001b[39m=\u001b[39mdatesetOfGlobal, fullFilePath\u001b[39m=\u001b[39mfullFilePath)\n",
"File \u001b[1;32m~\\AppData\\Roaming\\Python\\Python39\\site-packages\\xarray\\backends\\api.py:947\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 944\u001b[0m paths \u001b[39m=\u001b[39m [os\u001b[39m.\u001b[39mfspath(p) \u001b[39mif\u001b[39;00m \u001b[39misinstance\u001b[39m(p, os\u001b[39m.\u001b[39mPathLike) \u001b[39melse\u001b[39;00m p \u001b[39mfor\u001b[39;00m p \u001b[39min\u001b[39;00m paths]\n\u001b[0;32m 946\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mnot\u001b[39;00m paths:\n\u001b[1;32m--> 947\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mOSError\u001b[39;00m(\u001b[39m\"\u001b[39m\u001b[39mno files to open\u001b[39m\u001b[39m\"\u001b[39m)\n\u001b[0;32m 949\u001b[0m \u001b[39mif\u001b[39;00m combine \u001b[39m==\u001b[39m \u001b[39m\"\u001b[39m\u001b[39mnested\u001b[39m\u001b[39m\"\u001b[39m:\n\u001b[0;32m 950\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39misinstance\u001b[39m(concat_dim, (\u001b[39mstr\u001b[39m, DataArray)) \u001b[39mor\u001b[39;00m concat_dim \u001b[39mis\u001b[39;00m \u001b[39mNone\u001b[39;00m:\n",
"\u001b[1;31mOSError\u001b[0m: no files to open"
]
}
],
"source": [
"shotNum = \"0000\"\n",
"filePath = folderPath + \"/\" + shotNum + \"/*.h5\"\n",
"\n",
"dataSetDict = {\n",
" dskey[groupList[i]]: read_hdf5_file(filePath, groupList[i])\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 = (880, 990)\n",
"imageAnalyser.span = (150, 150)\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('comp Z current (A)')\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": 36,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The detected scaning axes and values are: \n",
"\n",
"{'compZ_current_sg': array([0.195, 0.196, 0.197, 0.198, 0.199, 0.2 , 0.201, 0.202, 0.203,\n",
" 0.204]), '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(\"<div id='\" + id + \"'></div>\");\n if (!fig.cell_info) {\n console.error('Failed to find cell for figure', id, fig);\n return;\n }\n fig.cell_info[0].output_area.element.on(\n 'cleared',\n { fig: fig },\n fig._remove_fig_handler\n );\n};\n\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 '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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 '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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 = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n // Add the status bar.\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message pull-right';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n\n // Add the close button to the window.\n var buttongrp = document.createElement('div');\n buttongrp.classList = 'btn-group inline pull-right';\n button = document.createElement('button');\n button.classList = 'btn btn-mini btn-primary';\n button.href = '#';\n button.title = 'Stop Interaction';\n button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n button.addEventListener('click', function (_evt) {\n fig.handle_close(fig, {});\n });\n button.addEventListener(\n 'mouseover',\n on_mouseover_closure('Stop Interaction')\n );\n buttongrp.appendChild(button);\n var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n titlebar.insertBefore(buttongrp, titlebar.firstChild);\n};\n\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": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAAAXNSR0IArs4c6QAAIABJREFUeF7snQv8VlO+/z+VpOhGF6WoSWUYf8LI5bg0qGk4RDNF425kOjMTIyY5GuV+OSNORDHUiYoxQk0uGdLBcAgzLoWaXFJqumhqupD6v757e+rXr+fX3s/+7mfdns9+vXqhZ333d633Z+21P9bea+1amzZt2gQeJEACJEACJEACJEACFUOgFg1gxWjNhpIACZAACZAACZBARIAGkB2BBEiABEiABEiABCqMAA1ghQnO5pIACZAACZAACZAADSD7AAmQAAmQAAmQAAlUGAEawAoTnM0lARIgARIgARIgARpA9gESIAESIAESIAESqDACNIAVJjibSwIkQAIkQAIkQAI0gOwDJEACJEACJEACJFBhBGgAK0xwNpcESIAESIAESIAEaADZB0iABEiABEiABEigwgjQAFaY4GwuCZAACZAACZAACdAAsg+QAAmQAAmQAAmQQIURoAGsMMHZXBIgARIgARIgARKgAWQfIAESIAESIAESIIEKI0ADWGGCs7kkQAIkQAIkQAIk4JwBnDlzJm699VbMmjULixYtwuTJk9GrV6/NSj322GMYPXp09PuyZcvw1ltv4cADD9xKyWOPPRYvvvjiVn/Xt29fTJo0afPfrVixAgMHDsSTTz4Z/d3JJ5+MkSNHokmTJuwVJEACJEACJEACJBA0AecM4FNPPYWXX34ZBx10EHr37r2NARw/fjzmz5+P1q1b48ILL6zRAHbq1AnXXHPNZvHq16+Pxo0bb/7vnj17YsGCBRgzZkz0d/3790e7du0wZcqUoAVn40iABEiABEiABEjAOQNYVZJatWptYwALv3/88cdo3759jQZQZgVvv/32ogrPnj0b++67L1599VV07do1KiP/fvjhh2POnDno3Llzqp6xceNGLFy4EA0bNoTUlQcJkAAJkAAJkAAJmCCwadMmrFq1KpoQq127dskpgzWA7733HgROy5YtIbN9V199dWTU5Lj//vtx6aWX4ssvv9wKmDz+HTFiBM4777xUIGUGsW3btqnKshAJkAAJkAAJkAAJ5E3gs88+Q5s2bUo+bZAG8N57741mB3fffXe8++67GDJkCPbee29Mnz49AnTDDTdg7Nix+PDDD7cCJo+NxfxJ+WLH+vXr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BlAnFQc2HT9b0dTNFnldXuqm42crmrrZIp89Lw1gdnbeRNIA6qTiwKbjZyuautkir8tL3XT8bEVTN1vks+elAczOzptIGkCdVBzYdPxsRVM3W+R1eambjp+taOpmi3z2vDSA2dl5E0kDqJOKA5uOn61o6maLvC4vddPxsxVN3WyRz56XBjA7O28iaQB1UnFg0/GzFU3dbJHX5aVuOn62oqmbLfLZ89IAZmfnTSQNoE4qDmw6fraiqZst8rq81E3Hz1Y0dbNFPnteGsDs7LyJpAHUScWBTcfPVjR1s0Vel5e66fjZiqZutshnz0sDmJ2dN5E0gDqpOLDp+NmKpm62yOvyUjcdP1vR1M0W+ex5aQCzs/MmkgZQJxUHNh0/W9HUzRZ5XV7qpuNnK5q62SKfPS8NYHZ23kTSAOqk4sCm42crmrrZIq/LS910/GxFUzdb5LPnpQHMzs6bSBpAnVQc2HT8bEVTN1vkdXmpm46frWjqZot89rw0gNnZeRNJA6iTigObjp+taOpmi7wuL3XT8bMVTd1skc+elwYwOztvImkAdVJxYNPxsxVN3WyR1+Wlbjp+tqKpmy3y2fPSAGZn500kDaBOKg5sOn62oqmbLfK6vNRNx89WNHWzRT57XhrA7Oy8iaQB1EnFgU3Hz1Y0dbNFXpeXuun42YqmbrbIZ89LA5idXWLkqlWrMHToUEyePBlLlixBly5dcMcdd+D73/9+FLtp0yYMHz4cY8aMwYoVK9C1a1fcdddd2G+//Tafe/369bjsssswceJErF27FscddxxGjRqFNm3aJOYvFKABTI2qaEEObDp+tqKpmy3yurzUTcfPVjR1s0U+e14awOzsEiP79u2Ld999F3fffTdat26NBx98ECNGjMD777+PPfbYAzfffDOuv/56jB07Fp06dcJ1112HmTNn4oMPPkDDhg2j8w8YMABTpkyJyuy2224YNGgQli9fjlmzZqFOnTqJdZACNICpMNVYiAObjp+taOpmi7wuL3XT8bMVTd1skc+elwYwO7vtRspsnZi4J554AieeeOLmsgceeCBOOukkXHvttZEpvOSSSzB48ODod5nta9myZWQML7roIqxcuRLNmzfH+PHjIWZSjoULF6Jt27aYNm0aevTokar2NICpMNEA6jA5F80bknOSpKoQdUuFyblC1M05SRIrRAOYiChbAXn8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f9Y6Ihd+i/a3Fk8Qcedvsyw+gVz4TQIwvl90hAiIgAiIgAiIgAiIQAoEFAFMAZ5OFQEREAEREAEREIGySEACsCx6TXMWAREQAREQAREQgRQISACmAE+nioAIiIAIiIAIiEBZJCABWBa9pjmLgAiIgAiIgAiIQAoEJABTgKdTRUAEREAEREAERKAsEpAALIte05xFQAREQAREQAREIAUCEoApwNOpIiACIiACIiACIlAWCUgAlkWvac4iIAIiIAIiIAIikAIBCcAU4OlUERABESh0Arz95/rrr/f3dCdqDz/8sM2ZM8deffXVRE/RcSIgAmkmIAGYZqC6nAiIwL5HgNen8WL2WMbrtXjN1r5grPWWW26xn376Ke5yeC0jr2L87LPPrHz58kWOHz16tL/+j3cNDx06tMjv/vjjDzv22GNt+vTpdu6558YdRweIgAikn4AEYPqZ6ooiIAL7GIHff//dfv7552Kr4n2hY8eOtXfeecfOPvvsrKx6z549Ud+f/Oeff9r++++f8hxKIwDbtGljF1xwgb+bO9IaNGhgV199tb300ku2bt26Yr+/9dZbbcuWLfbCCy+kPGddQAREoPQEJABLz0xniIAIpInA33//bffee6899thjtnnzZqtZs6Zdd911NmzYMB9h1apVdvPNN9vixYutYsWK1rFjR5swYYJVrlzZf0/kjUjVmWeeaRMnTjQiS4MGDfLzESVPPPGEnzdy5Ejr1auXn/Pll19avXr1bNq0afbggw/a8uXL7bjjjrNHHnnEWrVqlfDK5s+fb61bt7ZHH33U+vTpE/M85jdkyBCbOXOmi8jjjz/exowZYx06dLC77rrLZsyYYR999FHo/AceeMD4YZ7ha2zevLk99NBDLv7mzZvna0A8IULff/99nwdRSiKR48aNs40bN3qU7aabbrL+/fsXWTuijGstWbLEEGqTJk2yFi1a+HURdOF25513+jwj7fvvv7cjjjjCfXTyyScX+TVsunfvHpoDrEkVhxvHICDhc/DBByfMXQeKgAikh4AEYHo46ioiIAJJELj99ttd/N1///2eCvzmm288nYig2rVrl4uTs846y0aMGGHbtm3zf0dIEKUKxNHLL79sPXr0sIEDB9qiRYusd+/e1rZtWz+uU6dOLpIQgF988YXVqVMnJABr167tQqtRo0YuKjkO0VSjRo24K9m0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\" width=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"shotNum = \"0001\"\n",
"filePath = folderPath + \"/\" + shotNum + \"/*.h5\"\n",
"\n",
"dataSetDict = {\n",
" dskey[groupList[i]]: read_hdf5_file(filePath, groupList[i])\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 = (880, 990)\n",
"imageAnalyser.span = (150, 150)\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('comp Z current (A)')\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')"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## Measure magnification of side-imaging again"
]
},
{
"cell_type": "code",
"execution_count": 99,
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The detected scaning axes and values are: \n",
"\n",
"{'TOF_free': 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, 0.02 , 0.021]), '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(\"<div id='\" + id + \"'></div>\");\n if (!fig.cell_info) {\n console.error('Failed to find cell for figure', id, fig);\n return;\n }\n fig.cell_info[0].output_area.element.on(\n 'cleared',\n { fig: fig },\n fig._remove_fig_handler\n );\n};\n\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 '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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 '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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 = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n // Add the status bar.\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message pull-right';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n\n // Add the close button to the window.\n var buttongrp = document.createElement('div');\n buttongrp.classList = 'btn-group inline pull-right';\n button = document.createElement('button');\n button.classList = 'btn btn-mini btn-primary';\n button.href = '#';\n button.title = 'Stop Interaction';\n button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n button.addEventListener('click', function (_evt) {\n fig.handle_close(fig, {});\n });\n button.addEventListener(\n 'mouseover',\n on_mouseover_closure('Stop Interaction')\n );\n buttongrp.appendChild(button);\n var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n titlebar.insertBefore(buttongrp, titlebar.firstChild);\n};\n\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": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\" width=\"480\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"shotNum = \"0005\"\n",
"filePath = folderPath + \"/\" + shotNum + \"/*.h5\"\n",
"\n",
"dataSetDict = {\n",
" dskey[groupList[i]]: read_hdf5_file(filePath, groupList[i])\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 = (550, 990)\n",
"imageAnalyser.span = (1000, 200)\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('TOF (s)')\n",
"plt.ylabel('NCount')\n",
"plt.tight_layout()\n",
"plt.grid(visible=1)\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 100,
"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(\"<div id='\" + id + \"'></div>\");\n if (!fig.cell_info) {\n console.error('Failed to find cell for figure', id, fig);\n return;\n }\n fig.cell_info[0].output_area.element.on(\n 'cleared',\n { fig: fig },\n fig._remove_fig_handler\n );\n};\n\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 '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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 '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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 = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n // Add the status bar.\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message pull-right';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n\n // Add the close button to the window.\n var buttongrp = document.createElement('div');\n buttongrp.classList = 'btn-group inline pull-right';\n button = document.createElement('button');\n button.classList = 'btn btn-mini btn-primary';\n button.href = '#';\n button.title = 'Stop Interaction';\n button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n button.addEventListener('click', function (_evt) {\n fig.handle_close(fig, {});\n });\n button.addEventListener(\n 'mouseover',\n on_mouseover_closure('Stop Interaction')\n );\n buttongrp.appendChild(button);\n var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n titlebar.insertBefore(buttongrp, titlebar.firstChild);\n};\n\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": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\" width=\"480\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"remove_bad_shots(dataSet_cropOD, TOF_free=0.005)\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('TOF (s)')\n",
"plt.ylabel('NCount')\n",
"plt.tight_layout()\n",
"plt.grid(visible=1)\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 101,
"metadata": {
"scrolled": false
},
"outputs": [],
"source": [
"dataSet_cropOD = dataSet_cropOD[1:-1, :, :, :]\n",
"dataSet_cropOD_chunk = dataSet_cropOD.chunk((1, 1, 1000, 200))\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": 102,
"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(\"<div id='\" + id + \"'></div>\");\n if (!fig.cell_info) {\n console.error('Failed to find cell for figure', id, fig);\n return;\n }\n fig.cell_info[0].output_area.element.on(\n 'cleared',\n { fig: fig },\n fig._remove_fig_handler\n );\n};\n\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 '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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 '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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 = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n // Add the status bar.\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message pull-right';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n\n // Add the close button to the window.\n var buttongrp = document.createElement('div');\n buttongrp.classList = 'btn-group inline pull-right';\n button = document.createElement('button');\n button.classList = 'btn btn-mini btn-primary';\n button.href = '#';\n button.title = 'Stop Interaction';\n button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n button.addEventListener('click', function (_evt) {\n fig.handle_close(fig, {});\n });\n button.addEventListener(\n 'mouseover',\n on_mouseover_closure('Stop Interaction')\n );\n buttongrp.appendChild(button);\n var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n titlebar.insertBefore(buttongrp, titlebar.firstChild);\n};\n\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": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeAAAAFoCAYAAACPNyggAAAAAXNSR0IArs4c6QAAIABJREFUeF7tnQmYFcXV/l9gQCSyCwQEBRE+I3wfoiYY+RshCAjGAGpAMFFHBYIxArIpiQqRRSRRNEIAFyAgkLgmIIsojBgxRsElJooLiGyKLOLGzvyf0+0dLsPMVM+t293Tdd56Hh91bnX3PW+9Vb97qqury+Xn5+eDhQpQASpABagAFYhUgXIEcKR682JUgApQASpABTwFCGAagQpQASpABahADAoQwDGIzktSASpABagAFSCA6QEqQAWoABWgAjEoQADHIDovSQWoABWgAlSAAKYHqAAVoAJUgArEoAABHIPovCQVoAJUgApQAQKYHqACVIAKUAEqEIMCBHAMovOSVIAKUAEqQAUIYHqAClABKkAFqEAMChDAMYjOS1IBKkAFqAAVIIDpASpABagAFaACMShAAMcgOi9JBagAFaACVIAApgeoABWgAlSACsSgAAEcg+i8JBWgAlSAClABApgeoAJUgApQASoQgwIEcAyi85JUgApQASpABQhgeoAKUAEqQAWoQAwKEMAxiM5LUgEqQAWoABUggOkBKkAFqAAVoAIxKEAAxyA6L0kFqAAVoAJUgACmB6gAFaACVIAKxKAAARyD6LwkFaACVIAKUAECmB6gAlSAClABKhCDAgRwDKLzklSAClABKkAFCGB6gApQASpABahADAoQwDGIzktSASpABagAFSCA6QEqQAWoABWgAjEoQADHIDovSQWoABWgAlSAAKYHqAAVoAJUgArEoAABHIPovCQVoAJUgApQAQKYHqACVIAKUAEqEIMCBHAMovOSVIAKUAEqQAUIYHqAClABKkAFqEAMChDAMYjOS1IBKkAFqAAVIIDpASpABagAFaACMShAAMcgOi9JBagAFaACVIAApgeoABWgAlSACsSgAAEcg+i8JBWgAlSAClABApgeoAJUgApQASoQgwIEcAyi85JUgApQASpABQhgeoAKUAEqQAWoQAwKEMAxiM5LUgEqQAWoABUggOkBKkAFqAAVoAIxKEAAxyA6L0kFqAAVoAJUgACmB6gAFaACVIAKxKAAARyD6LwkFaACVIAKUAECmB6gAlSAClABKhCDAgRwDKLzklSAClABKkAFCGB6gApQASpABahADAoQwDGIzktS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\" width=\"480\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"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(990), y=np.arange(350), 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",
"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(\"<div id='\" + id + \"'></div>\");\n if (!fig.cell_info) {\n console.error('Failed to find cell for figure', id, fig);\n return;\n }\n fig.cell_info[0].output_area.element.on(\n 'cleared',\n { fig: fig },\n fig._remove_fig_handler\n );\n};\n\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 '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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 '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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 = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n // Add the status bar.\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message pull-right';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n\n // Add the close button to the window.\n var buttongrp = document.createElement('div');\n buttongrp.classList = 'btn-group inline pull-right';\n button = document.createElement('button');\n button.classList = 'btn btn-mini btn-primary';\n button.href = '#';\n button.title = 'Stop Interaction';\n button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n button.addEventListener('click', function (_evt) {\n fig.handle_close(fig, {});\n });\n button.addEventListener(\n 'mouseover',\n on_mouseover_closure('Stop Interaction')\n );\n buttongrp.appendChild(button);\n var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n titlebar.insertBefore(buttongrp, titlebar.firstChild);\n};\n\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": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeAAAAFoCAYAAACPNyggAAAAAXNSR0IArs4c6QAAIABJREFUeF7tXQm41mP6vk+ntKChpIkTlRLSRPyZqUFZogwlWSr7kl1FZBlLY80yiskSKaRCslO2shuELCNZ0m6rNA0VLf/rfr++4zunc873e7/f/p77va6u6px3e+7ned7797xr0bp169ZBSQgIASEgBISAEIgUgSIRcKR4qzEhIASEgBAQAgYBEbAMQQgIASEgBIRADAiIgGMAXU0KASEgBISAEBABywaEgBAQAkJACMSAgAg4BtDVpBAQAkJACAgBEbBsQAgIASEgBIRADAiIgGMAXU0KASEgBISAEBABywaEgBAQAkJACMSAgAg4BtDVpBAQAkJACAgBEbBsQAgIASEgBIRADAiIgGMAXU0KASEgBISAEBABywaEgBAQAkJACMSAgAg4BtDVpBAQAkJACAgBEbBsQAgIASEgBIRADAiIgGMAXU0KASEgBISAEBABywaEgBAQAkJACMSAgAg4BtDVpBAQAkJACAgBEbBsQAgIASEgBIRADAiIgGMAXU0KASEgBISAEBABywaEgBAQAkJACMSAgAg4BtDVpBAQAkJACAgBEbBsQAgIASEgBIRADAiIgGMAXU0KASEgBISAEBABywaEgBAQAkJACMSAgAg4BtDVpBAQAkJACAgBEbBsQAgIASEgBIRADAiIgGMAXU0KASEgBISAEBABywaEgBAQAkJACMSAgAg4BtDVpBAQAkJACAgBEbBsQAgIASEgBIRADAiIgGMAXU0KASEgBISAEBABywaEgBAQAkJACMSAgAg4BtDVpBAQAkJACAgBEbBsQAgIASEgBIRADAiIgGMAXU0KASEgBISAEBABywaEgBAQAkJACMSAgAg4BtDVpBAQAkJACAgBEbBsQAgIASEgBIRADAiIgGMAXU0KASEgBISAEBABywaEgBAQAkJACMSAgAg4BtDVpBAQAkJACAgBEbBsQAgIASEgBIRADAiIgGMAXU0KASEgBISAEBABywaEgBAQAkJACMSAgAg4BtDVpBAQAkJACAgBEbBsQAgIASEgBIRADAiIgGMAXU0KASEgBISAEBABywaEgBAQAkJACMSAgAg4BtDVpBAQAkJACAgBEbBsQAgIASEgBIRADAiIgGMAXU0KASEgBISAEBAB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L88WDxgwwETJTIx2GzdubIiZ09/c9NWoUSM88MADOOqoo0yehQsXomnTpnj22Wdx4IEH5u2OCDgvRInJYOsYiem4x464Lp8I2KMhJDxb6HbKOyS5yypf4hw03xsMONnKFxkBH3rooXj99dfNFO/RRx9tpqD/8Y9/4LrrrjMbszg17TXttNNOhiDnz59v1o+33nprnHnmmTj11FNNFbxXmpHw+++/byLlbOKTh3z6kJeBvPzyy2bKmRHv5rwKZX1q164devToYaav8yURcD6EkvN7W8dITs+99cR1+UTA3uwg6blCt9Px44E+ffLDMG4c0Lt3/nyWOWzli4yAKcedd95p1lxJxt988w3mzp1rpn/3339/KzHr1Klj8p933nnmbWFG0Yx277rrLhx33HHghq+OHTuC68SMhLOpX79+mDNnDqZMmYJx48bhxBNPNJFxburSpYvZnc26yifmzc1PAmbE/OOPP6J+/fpWMiQtMw3nhRdewAEHHIBatWolrXu++yP5fEMYewXSYewq8N2BsHVY9MorqHnAAXn7ufqFF7Bun33y5rPNYCtfpARMYS6++GIzDcx7oKdNm4YOHTrYyoiNNtoIu+++uyHabOKVlu+++67ZVZ0lYE4pN2nSpDQPI+R58+aZI0+VETAJiNEzPxbKpyuvvLLCyJh12axhWwusAkJACAgBIZAXgU8/2gzHXX4MtsIC1EC5TViA+cmKLbbACwywQlgDztvBchkiI2BunDrllFPw0ksv4cYbbzRTx48//jhuuOEGM31sk3irFonynnvuKS12xx13mI1WjHrDmoJWBGyjpWTltf0yTVbv8/fGdfmIgOsyui5f2Dp8/fUiHHxwMQ5a8RgeRS+gCCjK2Qm9rqjIONKaCROw7rDD8jtVATlsdRgZAXOdllO73PSUfSeYV1OSfHk95TPPPONZ3D59+phINncT1sCBA/Hvf//bRL/ZTVj82YUXXmjq5StM3C1dfhMWN4YdeeSRJs+iRYvMJjFtwnJzCpp67datm7NT7C7Llx28XZbRdv3Q84CZoIxhyvj995n9V9wE/dixk7DRBWXPAZsrr4YNA3qGcwSpEBuNjICvuuoqXHrppahR7t0nbqTiWizXH70mTjVz6pobpUieXAPm9DLP/PKiDyYSLTd4jR49Gq1atcK1115rprzLH0N6+umnzTp0gwYNzPr0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\" width=\"480\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"M = 2.3513 ± 0.0036 \n"
]
}
],
"source": [
"def free_fall(x, A, B):\n",
" return A*(x**2) + B\n",
"\n",
"fitModel_freefall = NewFitModel(free_fall)\n",
"fitAnalyser_freefall = FitAnalyser(fitModel_freefall, fitDim=1)\n",
"\n",
"params = fitAnalyser_freefall.fitModel.make_params()\n",
"params.add(name=\"A\", value= 1e6, max = np.inf, min =-np.inf, vary = True)\n",
"params.add(name=\"B\", value= 1000, max = np.inf, min =-np.inf, vary = True)\n",
"\n",
"fitResult_freefall = fitAnalyser_freefall.fit(val_mean, params, x='TOF_free', dask=\"parallelized\")\n",
"\n",
"val = fitAnalyser_freefall.get_fit_value(fitResult_freefall)\n",
"std = fitAnalyser_freefall.get_fit_std(fitResult_freefall)\n",
"\n",
"fit_vals = tuple([val['A'].item(), val['B'].item()])\n",
"\n",
"fig = plt.figure()\n",
"ax = fig.gca()\n",
"val_mean.plot.errorbar(ax=ax, yerr=std_mean, fmt='or')\n",
"tof = np.linspace(5,21,50)*1e-3\n",
"plt.plot(tof, free_fall(tof, *fit_vals), 'b--',label='fit: A=%5.3f, B=%5.3f' % fit_vals)\n",
"plt.grid(visible =1)\n",
"plt.xlabel('TOF (s)')\n",
"plt.ylabel('Cloud Center (pixels)')\n",
"plt.legend()\n",
"plt.show()\n",
"\n",
"#pixel= 3.45e-6\n",
"pixel = 5.86e-6\n",
"g = 9.80998\n",
"M = val['A'].item() * 2 * pixel/g\n",
"dM = std['A'].item() * 2 * pixel/g\n",
"\n",
"print('M = %.4f \\u00B1 %.4f '% tuple([M,dM]))"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## Measure temperature at the end of evaporative cooling 2, truncation 0.7"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The detected scaning axes and values are: \n",
"\n",
"{'TOF_free': array([0.002, 0.003, 0.004, 0.005, 0.006, 0.007, 0.008, 0.009, 0.01 ,\n",
" 0.011, 0.012, 0.013, 0.014, 0.015]), 'runs': array([0., 1., 2.])}\n"
]
},
{
"data": {
"image/png": "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11NPPVVn37feektnzpxxe3uQurz66qvy9/d3ORU7evRoHT161OWWIBUVFVq3bp369u2rjh071m9HAIsoKZFatPDXqFEjXU6ZAAB8n9dPmz7//PN68sknFR8fr+HDh2vfvn0u6y+/V1tGRoYCAwM1fvx4t+M9++yzOnLkiIYOHarOnTs7v7CQmZmplJQUhYaGOvtOmjRJ6enpGjdunNLS0hQWFqaVK1fqs88+065duzy/swAAAFfJ6+Ft69atkqQdO3Zox44dNdZXne6UpBMnTigzM1NJSUm64YYb3I4XGRmpt956S2+//baKiooUGBioPn366LXXXtMDDzzg0tdutys7O1vJycmaPn26SktL1adPH23fvp2nKwAAPOriRendd216771OCgqyafBgqXlzb88KVuT18LZnzx7TfSMiInTxYt1fYU5ISFBCQoLpMcPDw7V27VrT/QEAqK9Nm6SZM6Wvv/aTdKdeeEHq3FlavlxKTPT27GA1PnHNGwAA16tNm6SxY6Wvv3Ztz8urbN+0yTvzgnUR3gAAaCQXL1Yecat2BZBTVdusWZX9ALMIbwAANJL33695xK06w5BOnKjsB5hFeAMACykpkWy2yh9u8+L7vvnGs/0AifAGAECj6dDBs/0AifAGAECjGTCg8lultT0q22aTIiIq+wFmEd4AAGgkzZtX3g5EqhngqpaXLeN+b6gfwhsA4LrjS9cGJiZKb7whderk2t65c2U793mzBl96TxHeAABXpfptLv7+dxu3vXAjMVH64gspK6tCs2d/rKysCh0/TnBDwxDeAAANtmmTFBX1/XJCgp+6duXGs+40by4NHGjopz/N08CBhs+cKq0ett97j3vOWQHhDQDQIFVPDsjLc23nyQHWcXn4vu8+Eb4tgPAGAKg3nhxgfYRv6yK8AQDqjScHWBvh29oIb0ATxAXmuFo8OcDaCN/WRngDmhguMIcn+PqTA7gIv26Eb2sjvAFNCNe4wFN8+ckBXIR/Zb4evlE3whvQRHCNS/0FBUkXLji0ZcubCgry9mx8i68+OYA/UMzx5fCNKyO8AU0E17jA06qeHNCxo2u7t54cwB8o5vlq+IY5hDegieAaFzSGxETpyJHvl7du9d6TA/gDpX58LXzDPMIb0ERwjcv1wRcvxK9+dOYnP/HekwP4A6X+Lg/f77wjHttlAYQ3oIngGhfr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U1VaWirDMCRJQUFBSk1N1ezZsz0yQQAAAHyvweHtlVdeUXJysu69915NmDBBHTt21MmTJ7V27Vo9/vjjateunR588EFPzhUAAKDJa3B4+93vfqfx48dr3bp1Lu3jxo1TUlKSfve73xHeAAAAPKzBXwk9evSokpKS3K5LSkrSP//5zwZPCgAAAO41OLwFBgaqsLDQ7brCwkIFBgY2eFIAAABwr8HhbcCAAUpJSdHJkydd2k+dOqWnn35aP/3pT696cgAAAHDV4GvelixZoh/96Efq1q2bhg4dqg4dOuibb75RTk6O/P39tWnTJk/OEwAAALqKI289evTQgQMHNHLkSB04cECrV6/WgQMHNGrUKH300UeKiory5DwBAACgq7zP22233abXXnvNU3MBAADAFdT7yNuhQ4f09ddf17r+66+/1qFDh65qUgAAAHCvXuHtvffeU0xMjL799tta+3z77beKiYnRzp07r3pyAAAAcFWv8Jaenq6xY8cqJiam1j4xMTG6//779fLLL1/15AAAAOCqXuHtgw8+0KhRo67Y72c/+5n27dvX0DkBAACgFvUKb6dPn1anTp2u2K9Dhw7Kz89v8KQAAADgXr3CW1BQUK1PVaiuqKhILVu2bPCkAAAA4F69wluPHj20Y8eOK/bbvn27evTo0eBJAQAAwL16hbf7779fGRkZevfdd2vts3v3bq1evVo///nPr3pyAAAAcFWvm/T+8pe/1Jo1axQXF6fJkydr5MiRuvnmmyVJx48f15YtW5SRkaHo6GhNmTKlUSYMAADQlNUrvLVo0UI7d+7Ugw8+qBdffFF//OMfXdYbhqF7771Xr7zyilq0aOHRiQIAAKABj8cKCQnRO++8o08++USZmZk6ceKEJKlLly4aNmyYbr/9do9PEgAAAJUa/GzTmJiYOm/WCwAAAM+r1xcWevfubfonOjra1Jg5OTmaNGmSIiMjFRQUpE6dOmnkyJH65JNPavQ9ePCg7rnnHrVq1Upt27ZVYmKijh075nbcFStWKDIyUna7XTfffLNSU1PlcDhq9MvPz9eECRMUGhqqli1bqn///srOzq5PWZqkkhLJZqv8KSnx9mwAAGg66hXegoODFRISUueP3W5Xbm6ucnNzTY354osv6osvvtDMmTP1zjvvaPny5crPz1e/fv2Uk5Pj7Hf06FENGjRIFy5c0F//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y4W3t956S2fOnHF7e5C6vPrqq/L391dMTIyzbfTo0Tp69KjLLUEqKiq0bt069e3bVx07dvTYvAEAADzBJ06bbt++XSUlJTp37pwk6ciRI3rjjTckSffdd5/LFwAyMjIUGBio8ePHux3r2Wef1ZEjRzR06FB17tzZ+YWFzMxMpaSkKDQ01Nl30qRJSk9P17hx45SWlqawsDCtXLlSn332mXbt2tWIewwAANAwPhHefv3rX+vLL790Lm/cuFEbN26UJB0/flxdu3aVJJ04cUKZmZlKSkrSDTfc4HasyMhIvfXWW3r77bdVVFSkwMBA9enTR6+99poeeOABl752u13Z2dlKTk7W9OnTVVpaqj59+mj79u08XQEAAPgknwhvX3zxhal+ERERunix7ltSJCQkKCEhwfRrh4eHa+3atab7AwAAeJPlrnkDAABoyghvAAAAFkJ4AwAAsBCfuOYN1hMUJP371nkAAOAa4sgbAACAhRDeAAAALITwBgAAYCGENwAAAAshvAEAAFgI4Q0AAMBCCG8AAAAWQngDAACwEMIbAACAhRDeAAAALITwBgAAYCGENwAAAAshvAEAAFgI4Q0AAMBCCG8AAAAWQngDAACwEMIbAACAhRDeAAAALITwBgAAYCGENwAAAAshvAEAAFgI4Q0AAMBCCG8AAAAWQngDAACwEMIbAACAhRDeAAAALITwBgAAYCGENwAAAAshvAEAAFiI18PbuXPnlJycrLi4OLVr1042m00pKSk1+k2YMEE2m63GT2RkpNtxV6xYocjISNntdt18881KTU2Vw+Go0S8/P18TJkxQaGioWrZsqf79+ys7O9vTuwkAAOARft6eQEFBgVatWqXo6GiNGjVKL7/8cq19AwMDlZOTU6PtcosXL9aCBQs0Z84cxcXF6cCBA5o/f77y8vK0atUqZ7/y8nINHTpUZ8+e1fLlyxUWFqb09HTFx8dr165dGjhwoOd2FAAAwAO8Ht5uuukmFRUVyWaz6cyZM3WGt2bNmqlfv351jldQUKBFixZpypQpWrJkiSRp0KBBcjgcmj9/vmbNmqWoqChJUkZGhnJzc7V37171799fkjR48GBFR0crOTlZ+/fv99BeAgAAeIbXT5tWnf70lB07dqisrEwTJ050aZ84caIMw9CWLVucbZs3b1b37t2dwU2S/Pz8lJSUpI8++kh5eXke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qq2goKDW11+6dKlSU1NrtGdmZqply5YN3S23ysqaS6rcx5ycHAUE8DT6K8nKyvL2FCyDWplDncyhTuZQJ/OaUq1KS0tN9bNkeCssLNR9990nwzD0l7/8Rc2auZ79Xb9+vcvymDFjlJCQoLS0NM2YMUPt2rVzrqvrlG1d6+bOnavZs2c7l4uLixUREaG4uDi1adOmvrtUp5KS738fMmSI2rb19+j41xOHw6GsrCzFxsbK35861YVamUOdzKFO5lAn85pirarO4l2J5cJbUVGRYmNjlZeXp5ycHN1yyy2mtktKStK2bdv08ccf695775UkhYSEuD26VlhYKEluj8pVsdvtstvtNdr9/f09/iarPlxjjH89ok7mUStzqJM51Mkc6mReU6qV2f20VHgrKirSPffco+PHjys7O9t5bZoZhmFIkstRul69eunQoUM1+la19ezZ8ypnDAAA4Fle/7apWVXB7dixY8rMzNTtt99er+1fffVV+fv7KyYmxtk2evRoHT161OWWIBUVFVq3bp369u2rjpc/lwoAAMDLfOLI2/bt21VSUqJz585Jko4cOaI33nhDknTffffJZrNp2LBh+s///E8tW7ZMFRUV2rdvn3P7du3a6dZbb5UkPfvsszpy5IiGDh2qzp07O7+wkJmZqZSUFIWGhjq3mzRpktLT0zVu3DilpaUpLCxMK1eu1GeffaZdu3ZdwwoAAACY4xPh7de//rW+/PJL5/LGjRu1ceNGSdLx48clSQcOHJAkzZw5s8b2Dz/8sNasWSNJioyM1FtvvaW3335bRUVFCgwMVJ8+ffTaa6/pgQcecNnObrcrOztbycnJmj59ukpLS9WnTx9t375dAwcObIxdBQAAuCo+Ed6++OKLK/apumbtShISEpSQkGD6tcPDw7V27VrT/QEAALzJMte8AQAAgPAGAABgKYQ3AAAACyG8AQAAWAjhDQAAwEIIbwAAABZCeAMAALAQwpsFBAVJFy44tGXLmwoK8vZsAACANxHeAAAALITwBgAAYCGENwAAAAshvAEAAFgI4Q0AAMBCCG8AAAAWQngDAACwEMIbAACAhRDeAAAALITwBgAAYCGENwAAAAshvAEAAFgI4Q0AAMBCCG8AAAAWQngDAACwEMIbAACAhfh5ewLXC8MwJEnFxcWNMr7D4VBpaamKi4vl7+/fKK9xPaBO5lEr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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"shotNum = \"0007\"\n",
"filePath = folderPath + \"/\" + shotNum + \"/*.h5\"\n",
"\n",
"dataSetDict = {\n",
" dskey[groupList[i]]: read_hdf5_file(filePath, groupList[i])\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 = (350, 990)\n",
"imageAnalyser.span = (650, 200)\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('TOF (s)')\n",
"plt.ylabel('NCount')\n",
"plt.tight_layout()\n",
"plt.grid(visible=1)\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"dataSet_cropOD_chunk = dataSet_cropOD.chunk((1, 1, 650, 200))\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": 18,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"3.769727404282448\n",
"0.07242840439128356\n"
]
}
],
"source": [
"data = fitAnalyser.get_fit_value(fitResult)\n",
"\n",
"print(data.amplitude.sel(TOF_free=0.01).mean('runs').item() * 147 / 1e5)\n",
"print(data.amplitude.sel(TOF_free=0.01).std('runs').item() * 147 / 1e5)"
]
},
{
"cell_type": "code",
"execution_count": 123,
"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(\"<div id='\" + id + \"'></div>\");\n if (!fig.cell_info) {\n console.error('Failed to find cell for figure', id, fig);\n return;\n }\n fig.cell_info[0].output_area.element.on(\n 'cleared',\n { fig: fig },\n fig._remove_fig_handler\n );\n};\n\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 '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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 '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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 = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n // Add the status bar.\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message pull-right';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n\n // Add the close button to the window.\n var buttongrp = document.createElement('div');\n buttongrp.classList = 'btn-group inline pull-right';\n button = document.createElement('button');\n button.classList = 'btn btn-mini btn-primary';\n button.href = '#';\n button.title = 'Stop Interaction';\n button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n button.addEventListener('click', function (_evt) {\n fig.handle_close(fig, {});\n });\n button.addEventListener(\n 'mouseover',\n on_mouseover_closure('Stop Interaction')\n );\n buttongrp.appendChild(button);\n var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n titlebar.insertBefore(buttongrp, titlebar.firstChild);\n};\n\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": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeAAAAFoCAYAAACPNyggAAAAAXNSR0IArs4c6QAAIABJREFUeF7tnQvYllP2/7+FcoiakBjSZMSMU0kGzaBxGOMQJmOcO+mADDIoI9O4RkkjhYohU8ph/EMTP4ehesmEqTSGEKVmDHIaSipF/a/13N56e3uf99n3vda9n73re19X129+3r3X/t6ftfZaz75Pu86aNWvWgAcJkAAJkAAJBEqgTp06dQKVppJVhwVYxY+dSYAESIAEcibAApwzYJonARIgARIggZoIsAAzLkiABEiABEigDARYgMsAnUOSAAmQAAmQAAswY4AESIAESIAEykCABbgM0DkkCZAACZAACbAAMwZIgARIgARIoAwEWIDLAJ1DkgAJkAAJkAALMGOABEiABEiABMpAgAW4DNA5JAmQAAmQAAmwADMGSIAESIAESKAMBFiAywCdQ5IACZAACZAACzBjgARIgARIgATKQIAFuAzQOSQJkAAJkAAJsAAzBkiABEiABEigDARYgMsAnUOSAAmQAAmQAAswY4AESIAESIAEykCABbgM0DkkCZAACZAACbAAMwZIgARIgARIoAwEWIDLAJ1DkgAJkAAJkAALMGOABEiABEiABMpAgAW4DNA5JAmQAAmQAAmwADMGSIAESIAESKAMBFiAywCdQ5IACZAACZAACzBjgARIgARIgATKQIAFuAzQOSQJkAAJkAAJsAAzBkiABEiABEigDARYgMsAnUOSAAmQAAmQAAswY4AESIAESIAEykCABbgM0DkkCZAACZAACbAAMwZIgARIgARIoAwEWIDLAJ1DkgAJkAAJkAALMGOABEiABEiABMpAgAW4DNA5JAmQAAmQAAmwADMGSIAESIAESKAMBFiAywCdQ5IACZAACZAACzBjgARIgARIgATKQIAFuAzQsw7ZvHlztGjRIlP3L774Attuu22mvuXuFKt26vYbObHyFkqxag9V9zvvvIOFCxf6DcAMo7EAZ4BWri4//elPMWXKlEzD//3vf0e7du0y9S13p1i1U7ffyImVt1CKVXuoujW50mfUsgD7pK0cSxNUoU4UFySxaqduF+/atYmVNwuwXQxUWtLkSns1xS2yAPukrRxLE1RMTkr4GbrHypy6Mzhb2YXMlQCrddfkSlsltVtjAfZJWzmWJqhineBcHSiDJkP3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ezFixAgcJE+E5HhogirUieKCK1bt1O3i3XRt7rsvWflWFt2qvWPlHfOPh1CZa3JluojUtWYBzshPLjn36NEDEydOxIABA9Dbw+d2NEEV6kRxwR+rdup28a5bG3m396qrgCFDgHvuAc49d8N+sfJmAXaLgTStNLkyzTjatizAGQm2b98echlaivAll1yCb775BnfJC4k5HpqgYnLK0TFFTMfKPDTdq1YB3bsDY8cCN98MXHppzcBD050m4mLVHqpuTa5M4zdtWxbgjARnzJiBtm3bru1933334ayzzspoza2bJqhCnSguZx6rdup28W7tbb7+Gjj5ZODpp5MCLK8dFTti5c0VsD5OqlvQ5Ep7NcUtsgAraK9cuRIffvgh1sj1MciTl82KWpszZw569uxZeFJa2g8dOrRQwIcMGVK4jF2nTh2MHDkS+8tjnUUOTVAxOSkcnbFrrMxD03399cDBBwPHHFO7I0LTnSZsYtUeqm5NrkzjN21bFuCMBKVYDhs2DJ988gm222477LDDDphZy6d3PvroI9SrVw+NGjXCm2++ia5duxaeou7evTsqKirw9ttvo1u3bpg2bRoLcDUCoU7yUqFD3aUIFf+7fON5+nTgjDPcbcTKmytgdx+7tmQBdiWVT7s6ayqXpfnYLzzx/MILL+CYY47BU089hYsuusj5HvD8+fPRuXNnnHPOOViyZAmuuOKKgsp99tkHL7/8MurXr1+jak1QMTnlFAi1mI2Vebl1v/Ya8LOfJU86v/oqsOWWbr4rt243lTW3ilV7qLo1uVLjx7R9uQJOS+zb9pUOPuKIIwor2Hbt2mG6/GQvcaxatQonnngi+vTpg1mzZqFJkyY4//zzC73ExoQJE7DzzjuvtTJ27FjIPzkWLFiA8ePHlxqixr8vXry48M5yjEes2qk7fbS98sq2uOqqH6Jp0xX44x9fxw47rHI2EitvOcFYtYequ3///rl/l8E5MGtpyAKckeLVV1+Na665pnDfdvTo0dhvv/3woGw+Wsshry6dffbZOPzww3HBBRfgjjvuWG8FvO+++xaKMlfA60MM9Vd2qdCh7lKE1v/71KnA8ccDhxwCTJyYfFIyzRErbznHWLWHqpsr4DQzx75t7pegq0r+/PPPC/d2azvkirjc423ZsiX69u1baDp37tzCg1lTp07FvHnz0KVLFzz//PNFzWiC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Hy6/zqykrmfHUnel4WuuuQZiN88nHy11f/PNNxDN4h/53wMGDMARRxyRC28xaqldNP/6178uxFXdunVxzz33YNddd81FexbdU6ZMKeibN28e3nzzTcjbA3J8/vnnhdsw//vf//C9730Pd955Z+Ec8jgsdYc+N4vx9jk38/ChD5sswD4o5zCGJBNJ2C+99BK+/PJLHHnkkfjnP/+JzTbbrDDa3/72t0JilETwzDPPFArwvffeiz/96U/4z3/+UyjYd911V6EQX3/99Zg7dy722muvQt8zzjgDXbt2xbHHHmuu3Fq3CJTzkST1wgsv5FaArXXfcccdWLlyJfAANWkAAAlxSURBVC6++GJzxtUNWms/5ZRTcOmllxZiTuJqzpw5+OMf/2h+Hll1f/bZZ6hXrx5OOOEEjBkzZm0Bvvrqqwuv8Z1//vmFHz+777574ceo9WGtO/S5WYy3r7lp7T+f9liAfdI2HOupp57CpEmT1q6AJdncfPPNaNmyZWGUfv364cADD8Qvf/lLyGpYiutbb72FM888E3369EHbtm3x8ccf4+STT8b06dPXU3bOOeegS5cu662oraTnofu8886DJNfjjjsutwJsrVue2G3Xrh3k4xHNmjXDLbfcgu22284K83p2rLX3798frVu3xi9+8YtC4V29ejWuvPJKc+1ZdVcKkR8IVQvwoYceWpgzO+64Y+HKg8yX++67L3jdVQWGODeL8Zb/7mNumjvQo0EWYI+wLYeSxPH6668XVrJynH322ejduzckycjRo0cPnH766Tj66KML/7/88peX02VVO3LkSHz/+9/HqlWrsO+++xZWv5WHrJZlRSyXlfK4BG2t+8UXX8S4ceMKP0TkUmNel6CtdcsPIlmJXXHFFYUi9umnn2LQoEGWIbLWlrX2V155BR06dEDDhg0LMSQ+kP9tfWTVXawgyI9TmTNym+Xtt98uzBcp8taHte7Q52Yx3r7mprX/fNpjAfZJ23CsrKuD2lbAcjn7kksuwf/93/9h++23N1S7zpS1bvlBIZfZmzRpkmsBttYtP5TkHqT8AHrjjTcK9+sff/zxKJiL9qFDhxZ+7Mltjeeeew5ySd36yMq8WEGIeQUc8twsxtvX3LSOO5/2WIB90jYcq/I+0z/+8Y/CPWC5H1z1HrAkL0mOch948uTJGD16dOFymyTK9957D9ddd13hv82fPx8DBw4s9O3WrRseffRR7LLLLoZK1zdlqVsus8tl3Eq9zz77LOQSnRQ268NSt/CWe5B77LFH4VK/PAg3e/ZsDBs2zFp2wZ61dilk8qNH9D/99NMF3g8++KC59qy6ixUEiZc999yz8HyDXEaXhxLlSpH1Ya079LlZE+8vvvjC29y09p9PeyzAPmkbjyXFddSoUQWrUlD3228/3HDDDYVELvd95UGZl19+ufBAyt1331146ESegpZLn//+978LTz9L8v/Od76Dgw46CEuXLl37vWi5TyyXGfM4LHVX1ZfnJWgZx1K3JGn5wSOXnrfaaquCH2QVn9dhqX3atGmFe77yBLE8wX377bdjn332yUV6Ft2vvfZaIfZnzZpV0CXPOcilfnlYSJ6CFvYyF+QhxLyegrbUHfrcLMbb59zMJfg8GGUB9gCZQ5AACZAACZBAdQIswIwJEiABEiABEigDARbgMkDnkCRAAiRAAiTAAswYIAESIAESIIEyEGABLgN0DkkCJEACJEACLMCMARIgARIgARIoAwEW4DJA55AkQAIkQAIkwALMGCCBTYiAvLdbuWuW7BTUtGnTwvvgxxxzTOFzkvKxFvlUo7wbfuuttxa+Uy27ZMkGHXvvvXeBlLwfLu+JVz+WL1+O448/vvCf5dOgP/zhDzchsjxVEkhPgAU4PTP2IIGNgkDnzp0h/2TTggceeKCwU5Z8hlQ+DPLkk0+ib9++hY9ZyIc3ZFMD+VfbIbtR3XbbbYUvsFU9pOhX7tK1UYDjSZCAEQEWYCOQNEMCsRGoWoDlu72/+c1v1tuC8rDDDsNNN91U+HpaqQIsq1/5ROWiRYsKK2Vp37FjR+y///5YsmRJYbenCy64oPC1NdnkQz6JKhuCPP/884XPcsp/22mnnQrbG8oPAB4ksCkQYAHeFLzMcySBGghULcA/+MEP8Mgjj6y9zCzN5bKzbDkon8isegladm2q3HWrqlm5VF1ZqGVXKtkOU741LpezzzrrLPTq1QuHH344ZDelAQMG4OGHH0arVq0wdepUNG7cGMOHDy+Ykw1BeJDApkCABXhT8DLPkQRKFGDtCljMVy/A5557buHytRzyTWbZh7fykBWvbOAgmyNIEZZjxYoVaN++fW7bMjIISCA0AizAoXmEekjAE4GqK2B5+Eo2J6h6D1g2XJBdmlzvAVcvwGJf/lvlaloe3Dr44IML///KlSuxxRZboE2bNoUVcOV+wvLfZfMQHiSwKRBgAd4UvMxzJIESK2D5s1wCloexpDDKk9Fy31Z2mKpaWGsDWVsBfv/999G7d28sXrwYq1evxs9//vPCjkrTp0/HtddeW/hvclx11VX42c9+Rn+RwCZBgAV4k3AzT5IESIAESCA0AizAoXmEekggAgJyz1guF1ce8r6w7IHLgwRIwJ0AC7A7K7YkARIgARIgATMCLMBmKGmIBEiABEiABNwJsAC7s2JLEiABEiABEjAjwAJshpKGSIAESIAESMCdAAuwOyu2JAESIAESIAEzAizAZihpiARIgARIgATcCWy0BdgdAVuSAAmQAAmQAAlYEahjZYh2SIAESIAESIAE3AmwALuzYksSIAESIAESMCPAAmyGkoZIgARIgARIwJ0AC7A7K7YkARIgARIgATMCLMBmKGmIBEiABEiABNwJsAC7s2JLEiABEiABEjAjwAJshpKGSIAESIAESMCdAAuwOyu2JAESIAESIAEzAizAZihpiARIgARIgATcCbAAu7NiSxIgARIgARIwI8ACbIaShkiABEiABEjAnQALsDsrtiQBEiABEiABMwIswGYoaYgESIAESIAE3AmwALuzYksSIAESIAESMCPAAmyGkoZIgARIgARIwJ0AC7A7K7YkARIgARIgATMCLMBmKGmIBEiABEiABNwJsAC7s2JLEiABEiABEjAjwAJshpKGSIAESIAESMCdAAuwOyu2JAESIAESIAEzAizAZihpiARIgARIgATcCbAAu7NiSxIgARIgARIwI8ACbIaShkiABEiABEjAnQALsDsrtiQBEiABEiABMwIswGYoaYgESIAESIAE3AmwALuzYksSIAESIAESMCPAAmyGkoZIgARIgARIwJ0AC7A7K7YkARIgARIgATMCLMBmKGmIBEiABEiABNwJsAC7s2JLEiABEiABEjAjwAJshpKGSIAESIAESMCdAAuwOyu2JAESIAESIAEzAizAZihpiARIgARIgATcCbAAu7NiSxIgARIgARIwI8ACbIaShkiABEiABEjAnQALsDsrtiQBEiABEiABMwIswGYoaYgESIAESIAE3AmwALuzYksSIAESIAESMCPAAmyGkoZIgARIgARIwJ3A/wdPdicqHwq/1QAAAABJRU5ErkJggg==\" width=\"719.9999785423286\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"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(990), y=np.arange(350), 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",
"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": 119,
"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(\"<div id='\" + id + \"'></div>\");\n if (!fig.cell_info) {\n console.error('Failed to find cell for figure', id, fig);\n return;\n }\n fig.cell_info[0].output_area.element.on(\n 'cleared',\n { fig: fig },\n fig._remove_fig_handler\n );\n};\n\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 '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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 '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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 = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n // Add the status bar.\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message pull-right';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n\n // Add the close button to the window.\n var buttongrp = document.createElement('div');\n buttongrp.classList = 'btn-group inline pull-right';\n button = document.createElement('button');\n button.classList = 'btn btn-mini btn-primary';\n button.href = '#';\n button.title = 'Stop Interaction';\n button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n button.addEventListener('click', function (_evt) {\n fig.handle_close(fig, {});\n });\n button.addEventListener(\n 'mouseover',\n on_mouseover_closure('Stop Interaction')\n );\n buttongrp.appendChild(button);\n var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n titlebar.insertBefore(buttongrp, titlebar.firstChild);\n};\n\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": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeAAAAFoCAYAAACPNyggAAAAAXNSR0IArs4c6QAAIABJREFUeF7tnQm0VcW1rn9QsQNB7DAvQYKJmogKwrEJNwSuXRIVe6+xB6TxSqKSGMUrXp/PQAzRGOVCCKgg2MSgEDC2NEcxdnR6FVFBsYnGPoAIctDDG3OvHDjdPrvWmnPVroJ/jcGIgVmz/vXVrDl3ra6abdiwYQN4kAAJkAAJkECgBJo1a9YsUGkqWc1YgFX82JgESIAESCBnAizAOQOmexIgARIgARJojAALMOOCBEiABEiABMpAgAW4DNDZJQmQAAmQAAmwADMGSIAESIAESKAMBFiAywCdXZIACZAACZAACzBjgARIgARIgATKQIAFuAzQ2SUJkAAJkAAJsAAzBkiABEiABEigDARYgMsAnV2SAAmQAAmQAAswY4AESIAESIAEykCABbgM0NklCZAACZAACbAAMwZIgARIgARIoAwEWIDLAJ1dkgAJkAAJkAALMGOABEiABEiABMpAgAW4DNDZJQmQAAmQAAmwADMGSIAESIAESKAMBFiAywCdXZIACZAACZAACzBjgARIgARIgATKQIAFuAzQ2SUJkAAJkAAJsAAzBkiABEiABEigDARYgMsAnV2SAAmQAAmQAAswY4AESIAESIAEykCABbgM0NklCZAACZAACbAAMwZIgARIgARIoAwEWIDLAJ1dkgAJkAAJkAALMGOABEiABEiABMpAgAW4DNDZJQmQAAmQAAmwADMGSIAESIAESKAMBFiAywCdXZIACZAACZAACzBjgARIgARIgATKQIAFuAzQ2SUJkAAJkAAJsAAzBkiABEiABEigDARYgMsAnV2SAAmQAAmQAAswY4AESIAESIAEykCABbgM0NklCZAACZAACbAAMwZIgARIgARIoAwEWIDLAD1rlx06dEDHjh0zNf/ss8/QqlWrTG3L3ShW7dTtN3Ji5S2UYtUequ433ngDb775pt8AzNAbC3AGaOVq8u///u+YPXt2pu7/9re/oXv37pnalrtRrNqp22/kxMpbKMWqPVTdmlzpM2pZgH3SVvalCapQJ4oLkli1U7fL6NrZxMqbBdguBmo8aXKlvZriHlmAfdJW9qUJKiYnJfwMzWNlTt0ZBlvZhMyVAOs11+RKWyVNe2MB9klb2ZcmqGKd4FwdKIMm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\" width=\"719.9999785423286\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"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(990), y=np.arange(950), 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",
"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": 125,
"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(\"<div id='\" + id + \"'></div>\");\n if (!fig.cell_info) {\n console.error('Failed to find cell for figure', id, fig);\n return;\n }\n fig.cell_info[0].output_area.element.on(\n 'cleared',\n { fig: fig },\n fig._remove_fig_handler\n );\n};\n\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 '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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 '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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 = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n // Add the status bar.\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message pull-right';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n\n // Add the close button to the window.\n var buttongrp = document.createElement('div');\n buttongrp.classList = 'btn-group inline pull-right';\n button = document.createElement('button');\n button.classList = 'btn btn-mini btn-primary';\n button.href = '#';\n button.title = 'Stop Interaction';\n button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n button.addEventListener('click', function (_evt) {\n fig.handle_close(fig, {});\n });\n button.addEventListener(\n 'mouseover',\n on_mouseover_closure('Stop Interaction')\n );\n buttongrp.appendChild(button);\n var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n titlebar.insertBefore(buttongrp, titlebar.firstChild);\n};\n\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": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\" width=\"640.4999809116131\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"T = 0.526 ± 0.006 uK\n"
]
}
],
"source": [
"def expansion(x, A, B):\n",
" return np.sqrt(A*x*x+B)\n",
"\n",
"val_truncated = val_mean[0:]\n",
"std_mean_truncated = std_mean[0:]\n",
"\n",
"fitModel_temperature = NewFitModel(expansion)\n",
"fitAnalyser_temperature = FitAnalyser(fitModel_temperature, fitDim=1)\n",
"\n",
"params = fitAnalyser_temperature.fitModel.make_params()\n",
"params.add(name=\"A\", value= 1e6, max = np.inf, min = 1, vary = True)\n",
"params.add(name=\"B\", value= 1000, max = np.inf, min = 0, vary = True)\n",
"\n",
"fitResult_temperature = fitAnalyser_temperature.fit(val_truncated, params, x='TOF_free', dask=\"parallelized\")\n",
"\n",
"val = fitAnalyser_temperature.get_fit_value(fitResult_temperature)\n",
"std = fitAnalyser_temperature.get_fit_std(fitResult_temperature)\n",
"\n",
"fit_vals = tuple([val['A'].item(), val['B'].item()])\n",
"fit_vals_std = tuple([std['A'].item(), std['B'].item()])\n",
"\n",
"tof = (np.arange(2,16,0.1)*1e-3)\n",
"\n",
"fig = plt.figure()\n",
"ax = fig.gca()\n",
"val_mean.plot.errorbar(ax=ax, yerr=std_mean, fmt='or')\n",
"plt.plot(tof, expansion(tof, *fit_vals), 'b--',\n",
" label='fit: A=%.3f, B=%.3f' % tuple(fit_vals))\n",
"plt.xlabel('TOF (s)')\n",
"plt.ylabel('Cloud Width - Vertical (pixels)')\n",
"#plt.ylabel('Cloud Width - Horizontal (pixels)')\n",
"plt.tight_layout()\n",
"plt.grid(visible=1)\n",
"plt.legend()\n",
"\n",
"\n",
"m = 164*1.673e-27\n",
"kb = 1.38e-23\n",
"pixel = 5.86e-6\n",
"M = 2.3513\n",
"\n",
"T = fit_vals[0] * (m/kb) * ((pixel*pixel)/(M*M)) / (1e-6)\n",
"dT = fit_vals_std[0] * (m/kb) * ((pixel*pixel)/(M*M)) / (1e-6)\n",
"\n",
"print('T = %.3f \\u00B1 %.3f uK'% tuple([T,dT]))"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## Measure temperature at the end of evaporative cooling 2, truncation 0.65"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The detected scaning axes and values are: \n",
"\n",
"{'TOF_free': array([0.002, 0.003, 0.004, 0.005, 0.006, 0.007, 0.008, 0.009, 0.01 ,\n",
" 0.011, 0.012, 0.013, 0.014, 0.015]), 'runs': array([0., 1., 2.])}\n"
]
},
{
"data": {
"image/png": "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1UojR47UkSNHqhx3+fLlio6Olt1u1w033KCUlBQ5HA63fnl5eZowYYLCwsIUGBiouLg4ZWVleXw/AQAAPMHr4e3MmTOKiorSokWLtGXLFv35z39Whw4ddP/992vBggXOfocPH1a/fv10/vx5vf322/rTn/6k//3f/1WfPn108uRJlzEXLlyoadOmaeTIkdq+fbsefvhhLVq0SFOmTHHpV1paqoEDByorK0vLli3Te++9p4iICCUmJuqjjz66KvsPAABQG14/561fv37q16+fS9uQIUN09OhRrVy5UnPnzpUkPfXUU7Lb7frggw/UsmVLSVJsbKx+8YtfaPHixXruueckSfn5+VqwYIEeeOABLVq0yPkaDodDc+fO1fTp09W5c2dJUnp6unJycrR7927FxcVJkvr376+YmBglJSVp7969V6MEAAAApnl95a06YWFh8vMrz5ZlZWX64IMPNGrUKGdwk6Trr79e/fv316ZNm5xt27ZtU0lJiSZOnOgy3sSJE2UYht59911n26ZNm9SpUydncJMkPz8/jRs3Tp999plyc3Prae8AAADqxmfC28WLF1VWVqaTJ09qxYoV2r59u5588klJ0tdff61z586pe/fubs/r3r27/vnPf6qkpESSlJOTI0nq1q2bS7+2bdsqLCzMub2ib3VjStKhQ4c8s3MAAAAe4vXDphUefvhh/fGPf5QkNWvWTC+99JIeeughSeWHQiUpJCTE7XkhISEyDEMFBQVq27at8vPzZbfbFVTFpTwhISHOsSrGrW7Myq9bldLSUpWWljofFxYWSpIcDkeVF0ZcqYox62PshsTX6lQ+Df9//+6Qj0zLZ+fla6iTeb72b89X+WKdfPV97ou1qm9m99Vnwtvs2bM1efJk5eXlafPmzXrkkUdUVFSk//iP/3D2sdls1T6/8jaz/Wrbt7Jnn31WKSkpbu0ZGRkKDAys9nlXKjMzs97Gbkh8pU4lJU0lDZEkbd++Xc2bX/DuhP6t8ryys7N9Zl6+hjrVnq/82/N1vlQnX/2cquBLtapvxcXFpvr5THhr37692rdvL0kaNGiQJGnWrFkaP368QkNDJVW9Enb69GnZbDa1+vddRkNDQ1VSUqLi4mK3EHX69GnFxsY6H4eGhlY7plT1Sl+FWbNmacaMGc7HhYWFioqKUkJCgst5eZ7icDiUmZmp+Ph4+fv7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SoqKi4tlGIYkKSgoSCkpKZoxY4ZHJggAAICf1Tm8/fnPf1ZSUpLuvvtuTZgwQe3atdPx48e1Zs0aPfHEE2rdurXuv/9+T84VAACg0atzeHvxxRc1duxYrV271qV9zJgxGjdunF588UXCGwAAgIfV+ZLQw4cPa9y4cVVuGzdunP7xj3/UeVIAAACoWp3DW0BAgE6fPl3lttOnTysgIKDOkwIAAEDV6hze+vTpo+TkZB0/ftyl/cSJE3rmmWf0m9/85oonBwAAAFd1Pudt0aJF+uUvf6mOHTtq4MCBatu2rX744QdlZ2fL399fGzdu9OQ8AQAAoCtYeevSpYv27dunYcOGad++fVq1apX27dun4cOH67PPPlPnzp09OU8AAADoCu/zdvPNN+uNN97w1FwAAABQg1qvvB08eFDff/99tdu///57HTx48IomBQAAgKrVKrx9/PHHio2N1Y8//lhtnx9//FGxsbHavn37FU8OAAAArmoV3tLS0jR69GjFxsZW2yc2Nlb33HOPXnvttSueHHzXhQs///7xx66PAQBA/alVePvkk080fPjwGvv99re/1Z49e+o6J/i4jRulytejDBokdehQ3g4AAOpXrcLbyZMndd1119XYr23btsrLy6vzpOC7Nm6URo+WcnNd23Nzy9sJcAAA1K9ahbegoKBqv1WhsoKCAgUGBtZ5UvBNFy5I06ZJhuG+raJt+nQOoQIAUJ9qFd66dOmibdu21dhv69at6tKlS50nBd/0179Kl7nQWIYhHTtW3g8AANSPWoW3e+65R+np6froo4+q7bNz506tWrVK99133xVPDr7lhx882w8AANRerW7S++CDD2r16tVKSEjQ5MmTNWzYMN1www2SpKNHj+rdd99Venq6YmJi9MADD9TLhOE9bdt6th8AAKi9Wq28NWvWTNu3b9fAgQP18ssv6+6771Z0dLSio6N1991365VXXtGdd96prVu3qlmzZqbGzM7O1qRJkxQdHa2goCBdd911GjZsmPbv3+/sc+HCBb3wwgtKTExUZGSkAgMDdcstt2jmzJk6c+aM25g2m63Kn9TUVLe+eXl5mjBhgsLCwhQYGKi4uDhlZWXVpiyNRp8+UmSkZLNVvd1mk6KiyvsBAID6UeuvxwoNDdWWLVu0f/9+ZWRk6NixY5Kk9u3b66677tKtt95aq/Fefvll5efn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NGmSoqOjFRQUpOuuu07Dhg3T/v373foeOHBAd955p4KDg9WqVSuNHDlSR44cqXLc5cuXKzo6Wna7XTfccINSUlLkcDjc+uXl5WnChAkKCwtTYGCg4uLilJWV5fH9BAAA8ASvh7eXX35Z33zzjaZNm6YtW7Zo2bJlysvLU+/evZWdne3sd/jwYfXr10/nz5/X22+/rT/96U/63//9X/Xp00cnT550GXPhwoWaNm2aRo4cqe3bt+vhhx/WokWLNGXKFJd+paWlGjhwoLKysrRs2TK99957ioiIUGJioj766KOrsv8AAAC14eftCaSlpSk8PNylLTExUR07dtSiRYs0YMAASdJTTz0lu92uDz74QC1btpQkxcbG6he/+IUWL16s5557TpKUn5+vBQsW6IEHHtCiRYskSf369ZPD4dDcuXM1ffp0de7cWZKUnp6unJwc7d69W3FxcZKk/v37KyYmRklJSdq7d+9VqQEAAIBZXl95uzS4SVJwcLA6d+6sY8eOSZLKysr0wQcfaNSoUc7gJknXX3+9+vfvr02bNjnbtm3bppKSEk2cONFlzIkTJ8owDL377rvOtk2bNqlTp07O4CZJfn5+GjdunD777DPl5uZ6ajcBAAA8wuvhrSo//fSTDhw4oC5dukiSvv76a507d07du3d369u9e3f985//VElJiSQpJydHktStWzeXfm3btlVYWJhze0Xf6saUpEOHDnlmhwAAADzE64dNqzJlyhQVFRVpzpw5ksoPhUpSSEiIW9+QkBAZhqGCggK1bdtW+fn5stvtCgoKqrJvxVgV41Y3ZuXXrUppaalKS0udjwsLCyVJDoejygsjrlTFmPUxdkNCncyjVuZQJ3OokznUybzGWCuz++pz4W3evHlat26dli9frtjYWJdtNput2udV3ma2X237Vvbss88qJSXFrT0jI0OBgYHVPu9KZWZm1tvYDQl1Mo9amUOdzKFO5lAn8xpTrYqLi03186nwlpKSogULFmjhwoV65JFHnO2hoaGSql4JO336tGw2m1q1auXsW1JSouLiYrcQdfr0aZdAGBoaWu2YUtUrfRVmzZqlGTNmOB8XFhYqKipKCQkJLufleYrD4VBmZqbi4+Pl7+/v8fEbCupkHrUyhzqZQ53MoU7mNcZaVRzFq4nPhLeUlBQlJycrOTlZs2fPdtl20003KSAgQAcP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rvY1Vq1apYceekgPPvignn/++Rr2pH75Wp0mTZqkkSNH6vbbb9eZM2ckSSUlJZKkwsJC2e12tWjRwsyueZyv1aqi71133eXS76677pLNZtOBAwcuuz/1xdfq9Nxzz+mLL77Qt99+q7Zt20qS+vTpo+joaA0YMEDr1q3T+PHjze6ex1yNOtV2Pl988YVbe1FRkc6fP1+nMT3F12pVWWP7PK8NX/489xQOm3pYt27d9I9//ENlZWUu7QcPHpQkde3a9bLPreh3uedW/G91fat6jVWrVmny5MkaP368XnnlFa//NetrdTp06JA2bNiga6+91vlTsap00003qU+fPrXZPY/ytVpVdX5KZU2aeOdjxdfq9MUXX+i6665zBrcKd9xxhyTvnct1NepU2/mcPHlSJ06c8NiYnuJrtarQGD/Pa8OXP889xttXTDQ0W7ZsMSQZb775pkt7YmJijZdMV1yFtmfPHmebw+EwunTpYvTq1culb8+ePY2uXbu6jPfpp58akoyXX37Zpe+qVauMJk2aGL/73e+8em+pynytTjt37nT7GT9+vCHJePfdd92uGLyafK1W//jHPwybzWY88MADLs/fuHGjIcl4/fXX67SfV8rX6jRx4kTDz8/P7Wq5jIwMQ5KxdOnSOu3nlbpadarMzK1CUlNTXdofeughr98qxNdqZRiN+/O8ssvVyZc/zz2F8FYP4uPjjWuvvdZYuXKlkZ2dbTzwwAOGJGPt2rXOPpMmTTKaNm1qfPPNN862kpISo0uXLkZUVJSxbt06IzMz0xgxYkSVNyvcuXOn4efnZ4wYMcLIzMw01q1bZ0RFRbndKPTtt982mjRpYtx2223GJ598Ynz66acuP9XdqPZq8KU6VcWXLi33tVo98sgjRpMmTYwZM2YYmZmZRlpamnHttdcat956q1FaWlq/xbgMX6rT559/bjRr1sy45ZZbjDVr1hjZ2dnGSy+9ZISHhxsRERFefV9djTp98803xoYNG4wNGzYYiYmJhiTn40v/41lxk97nn3/e2LVrlzF79myfukmvr9SqsX+e1+Y9dSlf+jz3BMJbPTh79qwxdepUo02bNkazZs2M7t27G2+88YZLn4q/Ao4ePerSfuLECeN3v/udERISYjRv3tzo3bu3kZmZWeXrZGRkGL179zaaN29uhISEGL/73e/cbuJY8TrV/Vz6+leTL9WpKr70j93XalVWVmakpqYaHTt2NPz9/Y22bdsaf/jDH4yCggJP7XKd+FqdDhw4YIwYMcKIjIw07Ha7ceONNxqTJ082vvvuO4/tc11cjTqtWrWq2s+d8ePHu/Q9f/688fTTTxvt27c3mjVrZtx8883GSy+95OndrhNfqlVj/zyvzXvqUr70ee4JNsMwjLocbgUAAMDVxwULAAAAFkJ4AwAAsBDCGwAAgIUQ3gAAACyE8AYAAGAhhDcAAAALIbwBAABYCOENAADAQghvAAAAFkJ4A9Ao2Ww2Uz+7du1yPufYsWN65JFHdNNNN6l58+a69tpr1a9fP61bt06XflnNN998U+2Yt99+u6k5PvPMM+rcubMuXrxoer+ysrIUHBys3Nxc088BYC18PRaARmnPnj0uj+fPn6+dO3cqOzvbpb1z585q2bKlPvnkEw0ZMkTBwcF64okn1L17d/300096++23tX79et1zzz1av369mjQp/5v4m2++0Q033KBHH31UY8eOdRkzODhYXbt2vez8jh8/rptvvlmrV6/W6NGja7VvAwYMUFRUlNasWVOr5wGwBj9vTwAAvKF3794uj1u3bq0mTZq4tUvSmTNnNHLkSF1zzTXau3evIiIinNuGDRum7t27a+bMmerRo4dmzpzp8tz27dtXOWZNli1bplatWmnkyJG1fu6UKVN0zz33aMGCBYqKiqr18wH4Ng6bAkANXnvtNeXl5Sk1NdUluFVISkpSdHS0nn/+eTkcjit+vfPnzys9PV1jx451ruRVePnllxUTE6Pg4GC1aNFC0dHRmj17tkufoUOHKjg4WK+++uoVzwWA7yG8AUANMjMz1bRpUw0dOrTK7TabTb/97W91+vRp7d+/32XbxYsXVVZW5vJT09kqe/fuVX5+vvr37+/S/uabb+rhhx9W3759tWnTJr377rt67LHHVFRU5NKvWbNm+uUvf6kPP/ywDnsLwNcR3gCgBt99951at26toKCgavvccMMNzr6VPfnkk/L393f5ycrKuuzrffrpp5Kk2267zaX9k08+UatWrfTSSy8pPj5eAwcO1EMPPaRly5a5jXHbbbfpiy++cAt2AKyP8AYAHlCxmmaz2Vzap02bpn379rn89OrV67JjHT9+XDabTWFhYS7tPXv21JkzZ3Tffffpvffe06lTp6odIzw8XBcvXtSJEyfquEcAfBUXLABADdq3b6//7//7/1RUVFTt6ts333wjSW4XCERGRpq+NUiFc+fOyd/fX02bNnVpv//++1VWVqZXX31Vo0aN0sWLF3XHHXdowYIFio+Pd+nbvHlz51gAGhZW3gCgBvHx8bpw4YI2b95c5XbDMPT+++8rJCREsbGxV/x6YWFhOn/+fJWHPCdOnKjdu3frp59+0ocffijDMDRkyBB9++23Lv1Onz7tHAtAw0J4A4AaTJ48WeHh4Zo1a5by8vLctv/nf/6nDh8+rKSkJPn7+1/x60VHR0uSvv7662r7BAUF6e6779acOXN0/vx5HTp0yGX7kSNHFBoaWuXVsQCsjcOmAFCDVq1aaePGjRoyZIhiY2P1xBNPKCYmRoWFhXrrrbe0bt063XPPPXriiSc88nr9+vWTVH4j4e7duzvbH3jgAQUEBOhXv/qV2rZtqxMnTujZZ5/VNddcozvuuMNljD179qhv375u5+ABsD5W3gDAhF/96lf6+9//rmHDhmnZsmVKSEjQ/fffr2PHjmnt2rV644033O7JVldRUVHq06eP3nvvPZf2Pn36KCcnR9OmTVN8fLwee+wx3XzzzfrrX/+q1q1bO/t9/fXXOnjwoP7v//2/HpkPAN/C12MBgA/6y1/+onvuuUfffvutrrvuulo9d968efrzn/+sr7/+Wn5+HGABGhrCGwD4IMMw9Mtf/lKxsbH6r//6L9PPO3PmjG688UYtX76clTeggeKwKQD4IJvNpldffVXt2rXTxYsXTT/v6NGjmjVrlsaOHVuPswPgTay8AQAAWAgrbwAAABZCeAMAALAQwhsAAICFEN4AAAAshPAGAABgIYQ3AAAACyG8AQAAWAjhDQAAwEL+f99UR9mCfCrkAAAAAElFTkSuQmCC",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"shotNum = \"0008\"\n",
"filePath = folderPath + \"/\" + shotNum + \"/*.h5\"\n",
"\n",
"dataSetDict = {\n",
" dskey[groupList[i]]: read_hdf5_file(filePath, groupList[i])\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 = (350, 990)\n",
"imageAnalyser.span = (650, 200)\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('TOF (s)')\n",
"plt.ylabel('NCount')\n",
"plt.tight_layout()\n",
"plt.grid(visible=1)\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [],
"source": [
"dataSet_cropOD_chunk = dataSet_cropOD.chunk((1, 1, 650, 200))\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": 21,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"4.158908069274802\n",
"0.17858152215917347\n"
]
}
],
"source": [
"data = fitAnalyser.get_fit_value(fitResult)\n",
"\n",
"print(data.amplitude.sel(TOF_free=0.01).mean('runs').item() * 147 / 1e5)\n",
"print(data.amplitude.sel(TOF_free=0.01).std('runs').item() * 147 / 1e5)"
]
},
{
"cell_type": "code",
"execution_count": 109,
"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(\"<div id='\" + id + \"'></div>\");\n if (!fig.cell_info) {\n console.error('Failed to find cell for figure', id, fig);\n return;\n }\n fig.cell_info[0].output_area.element.on(\n 'cleared',\n { fig: fig },\n fig._remove_fig_handler\n );\n};\n\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 '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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 '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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 = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n // Add the status bar.\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message pull-right';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n\n // Add the close button to the window.\n var buttongrp = document.createElement('div');\n buttongrp.classList = 'btn-group inline pull-right';\n button = document.createElement('button');\n button.classList = 'btn btn-mini btn-primary';\n button.href = '#';\n button.title = 'Stop Interaction';\n button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n button.addEventListener('click', function (_evt) {\n fig.handle_close(fig, {});\n });\n button.addEventListener(\n 'mouseover',\n on_mouseover_closure('Stop Interaction')\n );\n buttongrp.appendChild(button);\n var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n titlebar.insertBefore(buttongrp, titlebar.firstChild);\n};\n\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": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeAAAAFoCAYAAACPNyggAAAAAXNSR0IArs4c6QAAIABJREFUeF7tnQu4lUXZ/m8QUBOVLE1NgbAUFQ1FvjTSJLXUlEyxv2c5CMgVaUEePyk+UpA8hIobFVQQPFRoBFaWCDsxD3EqlTyAgQfMQxogAiLC/3rWasFms9de877PM7Nm4H6va18Ze+aZ+/3NM3Pvede7ZpqsX79+PXiRAAmQAAmQQKQEmjRp0iRSaSpZTWjAKn6sTAIkQAIk4JkADdgzYIYnARIgARIggYYI0ICZFyRAAiRAAiRQBQI04CpAZ5MkQAIkQAIkQANmDpAACZAACZBAFQjQgKsAnU2SAAmQAAmQAA2YOUACJEACJEACVSBAA64CdDZJAiRAAiRAAjRg5gAJkAAJkAAJVIEADbgK0NkkCZAACZAACdCAmQMkQAIkQAIkUAUCNOAqQGeTJEACJEACJEADZg6QAAmQAAmQQBUI0ICrAJ1NkgAJkAAJkAANmDlAAiRAAiRAAlUgQAOuAnQ2SQIkQAIkQAI0YOYACZAACZAACVSBAA24CtDZJAmQAAmQAAnQgJkDJEACJEACJFAFAjTgKkBnkyRAAiRAAiRAA2YOkAAJkAAJkEAVCNCAqwCdTZIACZAACZAADZg5QAIkQAIkQAJVIEADrgJ0NkkCJEACJEACNGDmAAmQAAmQAAlUgQANuArQ2SQJkAAJkAAJ0ICZAyRAAiRAAiRQBQI04CpAZ5MkQAIkQAIkQANmDpAACZAACZBAFQjQgKsAnU2SAAmQAAmQAA2YOUACJEACJEACVSBAA64CdDZJAiRAAiRAAjRg5gAJkAAJkAAJVIEADbgK0NkkCZAACZAACdCAmQMkQAIkQAIkUAUCNOAqQGeTJEACJEACJEADZg6QAAmQAAmQQBUI0ICrAD1vk23btkW7du1yVf/ggw+w44475qpb7UqpaqfusJmTKm+hlKr2WHX/85//xOLFi8MmYI7WaMA5oFWryje+8Q1Mnz49V/N/+ctf0KVLl1x1q10pVe3UHTZzUuUtlFLVHqtuzVwZMmtpwCFpK9vSJFWsA8UFSaraqduld+3KpMqbBmyXA6VImrnSXk35iDTgkLSVbWmSipOTEn6O6qkyp+4cna2sQuZKgPWqa+ZKWyWNR6MBh6StbEuTVKkOcK4OlEmTo3qquZKqbuZ4jiStUEUzV9qr4Qo4JFNvbWmSipOTt24pGzhV5tTNXHElEGuuaOZK13u3KMcVsAXFQDE0SRXrQHFBl6p26nbpXbsyqfLmCtguB0qRNHOlvRqugEMy9daWJqk4OXnrFq6Aw6NtsEXmePiOiJW5Zq4MSZEr4JC0lW1pkirWgeKCJFXt1O3Su3ZlUuXNFbBdDnAFbM8yT8Qm69evX5+nYsx1aMAx987m2lI1BOoOn2dkbstcM1faKmk8GlfAIWkr29IkVaoDnKsDZdLkqJ5qrqSqmzmeI0krVNHMlfZqykekAYekrWxLk1ScnJTwc1RPlTl15+hsZRUyVwKsV10zV9oq4Qo4JE+vbWmSKtUBztWB15RqMHiquZKqbub45mn4r38Bt98O9OsH7LFH9jGgmSuzt5a/BlfA+dkFr6lJKk5OwbuL+/sGRs4cDwzc4x7Wc+cCnToBc+YAhx6a/b40c2X21vLXoAHnZxe8piapODkF7y4acGDkzPHAwGnAauA0YDXCcAFowOFYW7SUqiFQt0XvZ4tB5ht5vfYaMHAg8OCDwGmnATfeCLRunY2nZq7M1pKuNA1Yxy9obU1SpTrA+flY0BQrNJZqrqSqm8w3Nd9DDgGWLgXWrQOaNgVatQLmzctmwpq5MuSIowGHpK1sS5NUnJyU8HNUT5U5defobGUVMi8CvPBCYOxY4JNPNgLdZhugTx9g9Gh3yJq50r0VfUkasJ5hsAiapEp1gHN1ECy9NjSUaq6kqps5vjHHDzoIeP75zXNeXsiaPdt9LGjmSvdW9CVpwHqGwSJokoqTU7BuopGFR11okTkeHrwlc/nM96yzgDVrNr0PWQH37QvU1Ljfn2audG9FX5IGrGcYLIImqSwHSrAb/m9DqWqn7rCZkirvlP94sGK+ahXQvj1w4IHA008Dy5cXH0OL+e68Mz8DDjuS9K1xL+h6DK0Gir5rskdIVTt1Z+9rTY1UeW/NBvzCC8COOwJ77QW89Rbwuc8Br78ODBoETJoEdO8O3HBDthewhKdmsaLJwax1uQLOSixn+dWrV+OYY45B8+bNsWLFCgwaNAhHHHEEOnbsWPiRa+DAgejWrVvZFjRJxckpZ8cpqqXKnLoVnZ6z6tbGXI7KGTcOGDAAOOMM4M47NwXHjThyJlIk1aJbAcvhTGvXri0Y8LJly9ChQwfMnDkTPXr0QG1trRM2GrATpmgKbW2TarXBp8p7a1sBy+Pl/v2B++4DevcGbroJ2GEHGnC1x49l+9EZcN2bW7JkCfr27Ytbb70VnTt3Rvv27dG6dWuMHDkSu+66K1fAW8jj81QNgbotpyK3WFsL87VrAfme76uvAnfcUVz9NnRxL2i3vIm1VJQGLCvfk08+GfPnz8eIESNw7rnnYs2aNdhxxx0xZsyYwor4nnvuoQHTgKs6rrYWM6gq5K0sx+WRs5hv8+bAQw8BX/4ysM8+/npA87TQn6rNI/Mz4JC0/9vWO++8U1j5Pvvss9hZXvEDsHLlysK/iTnXvcaPHw/5kWvRokWYOHFiLsVi/qW2cgWoYqVUtVN32KRJlbdQSlW7i+7//KcZhg37EvbcczV+9KNFQZJi8ODBmD59epC2NI3QgDX0MtSVla58/tukSZOC2cqLV7NmzdpgilOnTsW4cePwoHwZrsyl+asu1VWNoEhVO3VnGCAGRVPlvSXnuLzecvbZxe/2yjrixBMNOtohhGaudAhvVoQGbIay8UDPPfccBgwYgKZNm0LeiL744oux3XbbYejQoYVH0C1atCg8hm7bti0NuB6BVCdW6g40uP7bTKq8t0QDlkfOQ4YAP/sZ8PWvA/Lg7vOfD5cPNOBwrBtqKcrPgLVINEnFyUlLP3v9VJlTd/a+1tbYEpnLm85iuldcUdxQI+SlmStD6uQKOCRtZVuapEp1gG+JqwNlGnivnmqupKp7S8rxKVOADz8EzjwTkFVwkybe07XBBjRzZUjFNOCQtJVtaZKKk5MSfo7qqTKn7hydraySInP5qtD//u9ruOaa1thlF+DSS4Gbby7u53zvvUogyuqauVLZdKbqNOBMuKpbWJNUKQ7wEu1UtVN32PGSKu8UV8CvvSY79wHyzug3vwksWQIsWFDcNvL736/eyreUcZq5MmTW0oBD0la2pUkqTk5K+Dmqp8qcunN0trJKSszFfGUzjaVLgXXrijfetCnw8MPACScoQRhV18yVRhKcwtCAnTDFUUiTVCkN8Pq0U9VO3WHHTaq8U1sBX3ghMHZs8bSi0iUvWfXpA4weHbbPy7WmmStD3gENOCRtZVuapOLkpISfo3qqzKk7R2crq6TE/KCDgOef3/yGO3UCZs9WgjCqrpkrjSQ4haEBO2GKo5AmqVIa4FwBVzffUs2VVHWntAKWjTWOPx746KNNc1RWwH37AjU11c3dUuuauTLkHdCAQ9JWtqVJKk5OSvg5qqfKnLpzdLaySgrMx4wpnmJ0+OHAP/4ByKlG8hhazFd21J03L/u5vUpsZatr5kpfmhqKSwMOSVvZliapUhjg5fCkqp26lQmfsXqqvFNZAT/2GPDII8Dw4cCbbwKDBgGTJgHduxfffm7dOmOHeSyumSs9ytosNA04JG1lW5qk4uSkhJ+jeqrMqTtHZyurxMpc3ni+5RZgxIjim851r7rfA95jDyUA4+qaudJYSqPhaMAhaSvb0iRVrAPcBUmq2qnbpXftyqTKO9YVsHzee/rpwA47AE88Aey11+Z9FStzzVxpl5GVI9GAKzOKpoQmqWIdKC5wU9VO3S69a1cmVd6xGbBsISk7WskjZjlI4Ze/BD772Yb7KVbmmrnSLiMrR6IBV2YUTQlNUsU6UFzgpqqdul16165MqrxjM+CpU4Fu3Yo7Xcmj52bNyvdRrMw1c6VdRlaORAOuzCiaEpqkinWguMBNVTt1u/SuXZlUecdiwCtWAC1bFg9RePzx4uq30hUrc81cWemeLX9PA7ak6TmWJqliHSguyFLVTt0uvWtXJlXeMRjwjBnAGWcA99wDfOtb7n0SK3PNXOl+9/qSNGA9w2ARNEkV60BxgZeqdup26V27MqnyrqYBy2r3ppuAH/8YOPpo4IEHyn/e21BPxcpcM1faZWTlSDTgyoyiKaFJqlgHigvcVLVTt0vv2pVJlXe1DHjVKqBfP2DChOILV9de2/jnvTRgu1wtRaIB2zP1FpEG7A2tl8CpGgJ1e0mHRoNWg/myZUDXrsXVr5zhm+eqhm4XnZq50iW+VRkasBXJAHE0SRXrQHHBlqp26nbpXbsyqfL2uQKWzTJuv7240i1tlvHnPwN77w20a7dxK8m8vRArc81cmZdFnno04DzUqlRHk1SxDhQXlKlqp26X3rUrkypvnwY8dy4gpxTNmVM8w7f0/V45UnDUKD37WJlr5ko9FfcINGB3VlUvqUmqWAeKC9RUtVO3S+/alUmVty8Dlm0k5bu8Dz4IfOc7xUMTHnoo/+e9DfVUrMw1c6VdRlaORAOuzCiaEpqkinWguMBNVTt1u/SuXZlUefswYDFfWfEuXQqsW7eRsbzxfNFFWz5zzVxpR6dyJBpwZUbRlNAkFSen8N2YKnPqTj9X5BHz2LHFz3hLl6yA+/QBRo+2u79Yc0UzV9rRqRyJBlyZUTQlNEkV60BxgZuqdup26V27Mqny9rECls995fPf+pf8++zZWz5zzVxpR6dyJBpwZUbRlNAkFSen8N2YKnPqTjtXliwBOncG5A3oupesgPv2BWpq7O4v1lzRzJV2dCpHogFXZhRNCU1SxTpQXOCmqp26XXrXrkyqvC1XwA8/DPToUdxQQzba+PDDjV812nlnYN48oHXrLZ+5Zq60o1M5Eg24MqNoSmiSipNT+G5MlTl1p5srl1wCvPQScNddwMqVxTeeJ00CuncHbrjB1nwt/3CwJq6ZK621NBaPBhyStrItTVKlOqnGPMgrdWeqzKm7Us/a/17DXAxXPu8980xg7dri142aNClqrPs94EMPjUu3vZqNETVzpU9d9WPTgEPSVralSSrNAFfKVldPVTt1q7s+U4BUeef9I1MOUhg/HhgwANhnn+JmG/XP7qUBZ0qh4IVpwMGR52+QBpyfXTVqpmoI1B0+W7IyX74c6N8fuO8+oGdP4JZbgB122Fx3Q1tRWt5dVt2WbTcWSzNXhtIo7dCAA9FevXo1jjnmGDRv3hwrVqzAoEGDcOaZZ+K6667D5MmTpSNQU1ODgw8+uKwiTVLFOlBc8KeqnbpdeteuTKq886yAe/cGfv1r4Lbb8h+kYEE+VuaaudKCi2sMGrArKWW59evXY+3atQUDXrZsGTp06IDHHnsMffr0QW1tLRYsWIDevXtj5syZNOB6BGId5JVSgrorEbL9faq8XQ1YdrR6/XWgTRvgrbeKbzjLo+dqXrEypwFXMyuAJuvF8SK9lixZgr59+6Jbt25Yvnw5LpFXFwEceOCBmDt3LrbddtsGlWuSKtaB4tJFqWqnbpfetSuTKm8XA37nHeD884HnngMWLAC2396OmyZSrMw1c6WGR9a6XAFnJaYoLyvfk08+GfPnz8eIESPwzjvvYLfddsMFF1xQiNqlSxdMmjQJe5TODavXliapYh0oLjhT1U7dLr1rVyZV3pUMeNo04Nxzi9/nvece4Pjj7ZhpI8XKXDNXaplkqU8DzkLLqKwYb+fOnTFw4ECsWbNmwwpYHkvPmTNnkxXw+PHjIT9yLVq0CBMnTsylQsx/Z/kmfoJXqtqpO2yypcpbKJXT/stf7olRo9qiU6dluOqql/HZz34cFmqF1mJlPnjwYEyfPj0qVg2JoQEH6iIxWvn8V162WrlyJTp27IipU6eiX79+mDFjBhYuXIiePXviiSeeKKtI81ddrH+puuBPVTt1u/SuXZlUeTe2An76aaC2Frj0UqBpUztWVpFiZa6ZK63YuMShAbtQMijz3HPPYcCAAWjatCnkjeiLL74YZ5xxRuFR9JQpUwrGPGrUqIIxl7s0SRXrQHFBm6p26nbpXbsyqfKub8DydvO4ccBvf7v593rtaNlEipW5Zq60IeMWhQbsximKUpqkinWguIBNVTt1u/SuXZkUecu5vcOGySp3Bb72tZaF7SPvvx/43veAO+8EWra04+MjUqzMNXOlD07lYtKAQ9JWtqVJqlgHiguSVLVTt0vv2pVJjbeY7yGHyOe/m57be+21xUfOpe0k7QjZR4qVuWautKdUPiINOCRtZVuapIp1oLggSVU7dbv0rl2Z1HhfeCEwduym5iv7OPfpA4webcfFZ6RYmWvmSp+86semAYekrWxLk1SxDhQXJKlqp26X3rUrkxpvORxBjgesf3XqBMyebcfFZ6RYmWvmSp+8aMAh6Rq3pUmqWAeKC6JUtVO3S+/alUmJ9xtvFB8///vfm96/rID79gVqauy4+IwUK3PNXOmTFw04JF3jtjRJFetAcUGUqnbqdulduzKp8JZvGp52WvHYQHnpasWK4mNo+f/yVX1ZFbdubcfFZ6RYmWvmSp+8aMAh6Rq3pUmqWAeKC6JUtVO3S+/alUmBt+wNITtZHXFE8TCF1auB4cOBGTNWoGvXlrjiinTMV3ouVuaaudIuIytH4mfAlRlFU0KTVLEOFBe4qWqnbpfetSuTAm8xXDk68Ic/BJo333jvKWhvqKdi1a2ZK+0ysnIkGnBlRtGU0CRVrAPFBW6q2qnbpXftysTKW87klYMUrr8eKHfaaKzaK/VOrLo1c2Wle7b8PQ3YkqbnWJqkinWguCBLVTt1u/SuXZkYeT/zDHDqqYCczSY7W3Xu3PD9xqjdpWdi1a2ZK13u26oMDdiKZIA4mqSKdaC4YEtVO3W79K5dmdh43303IN/1la8VPfggUOaQswKA2LS79kqsujVzpeu9W5SjAVtQDBRDk1SxDhQXdKlqp26X3rUrExPv994D9t23+LazfOZb5ojvDTcfk/YsPRKrbs1cmeX+tWVpwFqCAetrkirWgeKCL1Xt1O3Su3ZlYuD97rtAixbFrxMtWQJ8/vNu9xeDdjelm5aKVbdmrszDIW8dGnBeclWop0mqWAeKC8ZUtVO3S+/alak277lzge9+F+jatXiaUZar2tqzaK1bNlbdmrkyL4s89WjAeahVqY4mqWIdKC4oU9VO3S69a1emmrzvvRe44AKgQwfgoYeAvffOdl/V1J5NKVfAGl7169KALWl6jkUD9gzYODwnVWOgFcJVi7ecXHTddcB55wG33QZsv332+66W9uxKacBaZnXr04AtaXqORQP2DNg4PCdVY6CRGrAcHyime9FF+Y8QZK7Y5opmrrRV0ng0GnBI2sq2NEmV6gAXZKlqp25lwmesHpL3c88BTz4J9OuXUWSZ4iG12yguRolVt2autORTKRYNuBKhiH6vSapYB4oL3lS1U7dL79qVCcV70qTizlbt2wNPPVV861l7hdKu1Vm/fqy6NXOlNaPG4tGAQ9JWtqVJqlgHiguSVLVTt0vv2pXxwfu114CrrgKmTQOOOab49aJbbwXOPBMYOxb41Kds9PvQbqOs8Six6tbMlSG4ldqgAYekrWxLk1SxDhQXJKlqp26X3rUrY81bzFfO7F26FFi3rvj5rmwpKScWXXNN/s97G7pja+12VGnAPlnSgH3SNY5NAzYG6jkcJ1XPgOuFt+Yt20jKKlfO6i1dTZsCffsCo0fb3pu1dlt15aPFqlszV4ZiJ+3QgEPSVralSapYB4oLklS1U7dL79qVseZ92GHAnDmb65O9nWfPttMtkay126qjAfviSQP2RdZDXBqwB6geQ3JS9Qi3gdDWvI8/HvjjHzdtaJttiivgmhrbe7PWbquOBuyLJw3YF1kPcWnAHqB6DMlJ1SNczwYsL1r94AdA8+bFR9DyI+YrL2HNmwe0bm17b8wVW56audJWSePRaMAhaSvb0iRVqgOcj+eUSZOjeqq5YqX7zTeLJxnJSlc21/jpT4FHHwWOOw742c/szZc5niNJK1TRzJX2aspHpAGHpK1sS5NUVpOT8hZyVU9VO3Xn6u7clbS8P/qo2LQcHbh4MdC2bW4pmStqtWdu0KhCrLo1c6URGqcwNGAnTHEU0iRVrAPFhWyq2qnbpXftymh4y1eN5CQjMd2777bT5BpJo921DR/lYtWtmSt9cCoXkwYckrayLU1SxTpQXJCkqp26XXrXrkxe3q+/DpxwAiCPnn/7W+DII+00uUbKq901vq9yserWzJW+WDUUlwYckrayLU1SxTpQXJCkqp26XXrXrkwe3s8+WzRfednqD38A9t/fTk+WSHm0Z4nvq2ysujVzpS9WNOCQZD20pUmqWAeKC6ZUtVO3S+/alcnD+8orgUceAX73O2CPPey0ZI2UR3vWNnyUj1W3Zq70walcTK6AA9GeP38++vXrh6ZNm2L9+vW48cYbseuuu6Jjx46FH7kGDhyIbt26lVWkSapYB4oL/lS1U7dL79qVycK79JKVbDG5ahWwww52OvJEyqI9T3xfdWLVrZkrfbHiCjgk2XptvfPOO2jRogVatWqFF198Eb169cJ9992HHj16oLa21kmZJqliHSguN56qdup26V27Mi68ZS9nOb9Xvloku1wddJBd+5pILto18X3VjVW3Zq70xYoGHJJsI2298sorBeOdMGECOnfujPbt26N169YYOXJkYVVc7tIkVawDxaVLUtVO3S69a1emEu+1a4uba9x2W9GA5UcOWIjhqqQ9Bo0NaYhVt2auDMmaj6BD0gbw8ccf46STTio8bj766KOxZs0a7LjjjhgzZgxmzpyJe+65ZxNF48ePh/zItWjRIkycODGX4mXLlmFn2cYnwStV7dQdNtka471qVVMMGbIfnn7607jkkoU46aR3woqr0BpzxbY7Bg8ejOnTp9sG9RCNBuwBarmQ69atw9lnn42jjjoK/fv336TYypUrC6th+ayYK+BNCcT6V3al1KHuSoRsf98Y77ffBo49Fvj5z4tvPcd2MVdse4QrYFueWaM1WS9vOkV0iZzevXtj3333xeWXX15QVvev3qlTp2LcuHF48MEHacD1CHByCpvIWxLvhQuBli2B3XffuJ9zWJpurW1JzN3u2G8pGrBfvpWiR2fADz/8MLp3747DDz+8oH2XXXbBeeedh6FDhxYeQcsLWvIYum0j+99pkirVAS6sUtVO3ZWGqe3v6/N+5hngpJOKK9/777dtyzoac8WWqGautFXSeDQ+gg5JW9mWJqlSHeA0YGXS5Kieaq7U1T1lCnDGGcChhxZ3t/rMZ3KACFhlS2AeEFfFpjRzZcXghgVowIYwfYfSJFWqA5wG7DurNo+fWq689howbBhQW7sCRx/dEm3aAFddVdzbecIEYPvtwzPM2mJqzEv3F6tuzVyZte805WnAGnqB62qSKtaB4oIwVe3U7dK7ujJivoccIu9TbPyMd7vtgO99DxgzpniGbwoXc8W2lzRzpa0SPoIOwlPecJZdrnxemqRKdYBzBewzoxqOnVKuXHghMHZs0XxLl5hunz7A6NHh2eVtMSXmde8xVt2auTJvH+apxxVwHmqQx1vfLby1LN+tfeONNwovVPn+3pkmqWIdKC74U9VO3S69qyvTqRMwd+7mMeTfZ8/WxQ5Zm7liS1szV9oq4QrYC8/f//73+MlPflIw3nvvvRe33norDjvsMC9tlYJqkirVAc4VsNeUajB4Krny6KPFF63ef3/T25AVcN++QE1NeHZ5W0yFef37i1W3Zq7M24d56nEFnIcaAHnk3LdvX0yePBlDhgzBgAEDckZyr6ZJqlgHisvdp6qdul16N3sZ+Ya/bCEpW0nKSUYvvgh8+OHGz4Blw7d584DWrbPHrlYN5ootec1caauEK2AvPLt27Vp4DC0mfPHFF+OTTz7BWPkwyuOlSapUBzhXwB4TqkzoWHPllVeA//1fYN99gaFDZVtXoFkz4PXXgeHDgRkzVqBr15a44oq0zJc5bp/jmrnSXk35iFwB56Q9a9aswtaRpUtONjrrrLNyRnOrpkmqWCdVlztPVTt1u/Ru5TLvvgv87GfFQxR22614mtE552xeL1XeNODKOZC1hGauzNqWpjwNWEFPDlJ4++23C+f7yiUnGvm8NEnFyclnzzQcO1XmMel+4w3ggAMA+YKB7OB60UXApz61ZfGmAduPTc1caa+GK2BzpjU1NYXjA//9739jp512wmc/+1nM9vzapSapYppUs3ZGqtqpO2tPF8vLsYGye9WppxY/673jDuC00yrvZpUqbxpwvjxprJZmrrRXQwM2ZypvPD/11FM47rjj8Mc//hHf//73+RmwOeViwFQnVurOlhDyIEmMVz7DlRerZs0CsnyxIFXezPFseeJSmgbsQslfGe+HMZQ6+Otf/zpqa2vRpUsXPPnkk/7uCIAmqTg5ee2aBoOnyrwaup9+Ghg0CJAhdNxxwIgRxR2uslzV0J1FX2NlU9Ueq27NXGnVpy5x+BmwC6UGylx55ZW46qqrII+i77zzThx00EH41a9+lTOaWzVNUsU6UFzuPFXt1F25d0tfKbruuuKJRWK8YsB5rlR5cwWcp7cbr6OZK+3VlI9IAzagvXTpUrRq1cogkr+k4uTkvXs2ayBV5j50lw5MkNck5LFy797FvZp32gm4/vriV4pkAw3Nbq4+dIfKmlS1x6qbBhwqcxtux/sj6Jdffrnwme9777234S3ou+66y+tda5Iq1oHiAixV7dRd7N36BybIi1Wy8pUNM66+GrDawyZV3lwBu8wC2cpo5spsLelKcwWck1/Hjh1xySWXYK+99toQQT5qbIqUAAAgAElEQVQP9nlpkoqTk8+eaTh2qsytdTd0YIKYcM+ewJ132vWLtW47ZZUjpao9Vt2aubJyb9mVoAHnZHn88cfjEdkHL+ClSapYB4oLvlS1U3exd+WR85w5m/e09YEJqfLmCthlFshWRjNXZmtJV5oGnJPfpEmTMHPmTBx66KFoIn/OA4WDGXxemqTi5OSzZ7gCbozu8ccDcnDCunUbS/k4MIE5zhwvEdDMlSEp0oBz0pbv/7Zt23bDI2gxYTkdyeelSSpOTj57hgZcjq58r7d79+LLVXJmr/yI+fo4MIE5zhynAYfPgYZa9P4SFh9Bh+voVCfWrV23mO/ppwPf+U5x/2Z521k215At1H0cmJAqbz6Ctp9LNIsVezXlI3IFnJP2ZZddhq985Svo1KnThkfQ3As6J8wK1VKdWLdm3dOmASeeWDTf++4Dmjf3kxt1o6bKmwZsnxs0YHumWSJ6XwHLcYR1L3kEPX369CwaM5fVJBUnp8y41RVSZW6h+/33gRtuAIYMCWO+KZtYytotckU90BoIoJkrfegpF5Mr4JC0lW1pkirWgeKCJFXtW6Nu+WLA/vsDbdq49KxtmVR504Bt80CiaeZKezV8BG3OdKicCF7natGiBfbbbz+ccsopGx5JWzeqSSpOTta9UTleqszz6p4ypfjCVf/+wE03VeZjXSKvbmsdeeKlqj1W3Zq5Mk//5a3DFXBOcj179iwYrXwOPGvWLKxevRrNmjUr7Io1fvz4nFEbr6ZJqlgHiguoVLVvTbpL5tutW3FP5xCf+dbPnVR5cwXsMgtkK6OZK7O1pCtNA87Jr1u3bpgis85/r5NPPhlTp07F4YcfjqflaBcPlyapODl56JAKIVNlnlV3DOabsomlrD1rroQahZq5MpRGaYcGnJO2bMDxm9/8Bm3atMGrr76KU089FXPmzIFsR/nnP/85Z1SugBsiEOsgr9TJW4tuMeAHHgDkwU81Vr6lfkiVNw240kjK/nsacHZmljW8vwUtu2D96Ec/wvvvv4/PfOYz+MUvflFY/U6bNg3yHWEflyapODn56JHGY6bK3FX3s88CBx0kf8WHZ7sl/aFGA7bPH81caa+mfESugEPSVralSSrXSVUp0Uv1VLVvybqnTgVOOw247TagVy8v3Z45aKq8acCZu7piBc1cWTG4YQEacEaYP//5z3HppZei9BJW3eqNHUc4f/589OvXD02bNi28qHXjjTeic+fOuO666zB58uTCC101NTU4+OCDyyrSJBUnp4wdbVA8VeaVdJfMt5ovXHEFbJCgBiEq5YpBE7lCaObKXA3mrEQDzgju73//O7785S8XTLNVq1ZYs2YNVq5cWYgiX0Eqd73zzjuQrypJnRdffBG9evXCuHHj0KdPH9TW1mLBggXo3bt34YCHcpcmqWIdKC74U9W+JeqO1XxTXkWmrD3WHNfMlS5zklUZGnBOkkcffXTBOK+88kq8/fbbePPNN/GHP/zBKdorr7yCHj164JxzzsHy5csL5wrLdeCBB2Lu3LnYdtttG4yjSapYB4oLsFS1b4m6zzoLWLOmel81aixfUuVNA3aZBbKV0cyV2VrSlaYB5+RX6uBzzz0XEyZMgGxNOWPGjIrRPv74Y5x00kkYOHBg4a3p3XbbDRdccEGhXpcuXSDHHO6xxx404DoEUp1YtyTdH3wA7Lgj8PHHxY6p5tvO5QZZqrxpwBWnzcwFaMCZkZlW8P4W9BFHHIHvfve7WLp0KYYNG4ajjjoKjz/+eKM3sW7dOpx99tmFsv3798ftt9++yQq4Q4cOBVOuuwKWTT1KG3ssWrQIEydOzAVq2bJl2FnOgEvwSlX7lqL7iSc+jeHDv4RbbnkO7dqtijaDUuUtQFPVHqvuwYMHe9+b32IgcAWck+JLL71UeOQsn9vKDlj3339/4XPdcpe8eCVl9913X1x++eWFYhJDXsySlfPChQsLL3Y98cQTZWNo/qrj6iBnRyuqpcq8ru7SZ74nn1z8rm+MK99SF6XKmytgxSArU1UzV9qrKR+RBhyI9sMPP4zu3bsXviss1y677IKHHnoII0aMKOyoJW9Bjxo1Ch07dqQB1yOQ6sSauu6UzDdlE0tZe6w5TgMOZGxlmvH+CLoat6dJqlgHigvHVLWnpvu114Bhw4Da2hX42tdaQgz4a1+Lf+XLFbDLKPJTJtYc18yVfkg1HJUr4JC0lW1pkirWgeKCJFXtKekW8z3kEPksEvjkE2CbbYovXc2eDeyzj0svVb9MSrzr00pVe6y6NXNlyEymAYekrWxLk1SxDhQXJKlqT0n3hRcCY8cWzbd0iQn36QOMHu3SS9UvkxJvGrDffNHMlX6VbRqdBhyStrItTVJxclLCz1E9JeYHHgj84x+b32SnTsVVcApXSrxpwH4zSjNX+lVGAw7J17QtTVJxcjLtCqdgqTC/5hpg8GBg/fpNb0tWwH37AjU1Trdb9UKp8G4IVKraY9WtmStDJjJXwCFpK9vSJFWsA8UFSaraY9YtZiubarRoUXz0LKtfOU6w7mfA8rXxefOA1q1deqn6ZWLmXYlOqtpj1a2ZKyv1leXvacCWND3H0iRVrAPFBVmq2mPVvWAB8IMfAG3bFk8zKl3yItbw4cCMGSvQtWtLXHFFOuYr9xArb+a4CwHbMpq50lZJ49FowCFpK9vSJBUnJyX8HNVjYy5nhojB/vznwJ57AjffDMgGG/Wv2HS7ok9Vd8p/PMTKXDNXuuabRTkasAXFQDE0SRXrQHFBl6r2mHR/+CEgJ12+8QZw6aUorG4/9amG6cek2yU/SmVS1U0DztLLbmU1c6VbCzalaMA2HINE0SQVJ6cgXbRJIzEwf/VVYK+9it/rlZepjjsO+NKXGmcRg+48vZWqbhpwnt5uvI5mrrRXUz4iDTgkbWVbmqTi5KSEn6N6NZmvXl181CyPnG+5BfjvgVtOd1FN3U4CyxRKVTcNWNPrDdfVzJX2amjAIZl6a0uTVJycvHVL2cDVYi7HUstLVrL6HTSo+BWjHXZwv/9q6XZX2HDJVHXTgLU9v3l9zVxpr4YGHJKpt7Y0ScXJyVu3RGXAf/oT8K1vAd/4BjBqFLD//tnvO9VcSVU3DTh7jlaqoZkrK8W2/D0fQVvS9BxLk1ScnDx3TgPhQzFfswYQ4z3pJGDdOuCRR4ATTgCaNMl3z6F051NXvlaqumnA1pkgf4B+g+cB22N1jsjTkOqh4uTknDtmBX0wL51YJNtDHnYYcNRRwNChwCuvAAsXAm3a6OX70K1XVTlCqrppwJX7NmsJGnBWYrblacA0YNuMyhHN2hDqn1gkK1zZ0apzZ+DOO4GDDsohsoordxu1G6NY87bW11i8VLXHqpsGHDJ7N2+LBkwDrm4GetiZqaETi5o2Le7XbHliUayTaqUOTVU3V8CVejb772nA2ZlZ1qAB04At8ylXLGtDkJOJ5s7dXIr1iUXWunPBy1EpVd004BydXaEKDdieaZaINGAacJZ88VLW0hBkJys5MlC+WlT38nFikaVuL2DLBE1VNw3YPktowPZMs0SkAdOAs+SLl7JWhvCvfxX3bH7hheKOVrKn8yefFP/bx4lFVrq9QG0kaKq6acD2mUIDtmeaJSINmAacJV+8lLUwBDkmUL5StHYt8LvfAbvsUtzdatas4stXPk4sstDtBWiFoKnqpgHbZwsN2J5plog0YBpwlnzxUtbCEOSRs7x8NWZMcU/nEJeF7hA667eRqm4asH220IDtmWaJSAOmAWfJFy9lNYbwy18WD06QFW/oS6M7tNa67aWqmwZsnzU0YHumWSLSgGnAWfLFS9k8hiA7WcnezcOGASNHAhdf7EVao0Hz6A6vcvMWU9VNA7bPHhqwPdMsEWnANOAs+eKlbFZDkBOMevYEHngAuO664kEKebeT1NxQVt2atizrpqqbBmyZBcVYNGB7plki0oBpwFnyxUvZLIYgbzUfcwzwzDPAhAlA9+5eJDkFzaLbKWCgQqnqpgHbJwgN2J5plog0YBpwlnzxUjarIciLVrKd5OGHe5HjHDSrbufAngumqpsGbJ8YNGB7plki0oBpwFnyxUtZF0P4y1+Ap54CfvxjLxJyBXXRnSuw50qp6qYB2ycGDdieaZaINGAacJZ88VK2kiHIm87nn19c8T76KNC8uRcZmYNW0p05YKAKqeqmAdsnCA3YnmmWiDRgGnCWfPFStpwhyAlG114LXHklcM45wNixwLbbepGQK2iqRpaqbhpwrjRttBIN2J5plog0YBpwlnzxUracIdx2G9C/P/DTnxZ/qvGmc2M3nKqRpaqbBmw//GjA9kyzRIzOgI888ki88MILGDBgAIYMGVK4l8WLF6Njx46FH7kGDhyIbt26lb1PTVJxcsqSPjZl6zOXla+YrRysII+cTznFph3rKKnmSqq6acDWGcyvIdkTzRYxOgN+/fXX8dhjjxVMt64B9+jRA7W1tU53RwN2whRNobqG8NprxcfNt98O7L9/NBIbFJKqkaWqmwZsPx40c6W9mvIRmzSJ7fmXzd1HZ8ByW+PGjdvMgDt37oz27dujdevWGDlyJHbddVeugOsRSHViLemeMwc46SRgu+2A3/+eBmwzxDePkmqe0IDtM4IGbM80S8QkDPijjz7CmjVrsOOOO2LMmDGYOXMm7rnnHhpw4gYsq13ZSrK2dgW+8IWWkAccBx8MTJkCfO5zWdK4OmVTNbJUddOA7fOcBmzPNEvEJAy47g2tXLkSshqeP3/+Jvc5fvx4yI9cixYtwsSJE7Nw2FB22bJl2FkOj03wSkn7W2+1QK9eHbFixTZYt64pgPVo1mw9xo+fhzZtVidBPyXedYGmqlvuIVXtseoePHgwpk+fHv144yPogF1U/xF03eSdOnVq4RH1gw8+yBVwwitgOTpQvlYkW0uWrm22Afr0AUaPDphsiqZSXUmmqpsrYEWylqnKFbA90ywRo1sBn3/++Zg9ezZWrVqFdu3aYdq0aZg8eTKGDh1aeATdokWLwmPotm3b0oATNuAOHYB6DzEKd9OpEzB7dpYUrl7ZVI0sVd00YPtcpwHbM80SMToDziK+XFlNUnFysuiBxmPIpwNymtHatZuWkxVw375ATY1/DRYtpJorqeqmAVtk7aYxNHOlvZryEfkIOiRtZVuapOLkpITfSHX5fm/v3sDddwOnngrMmAEsX158DC3mKx+9z5sHtG7tT4Nl5FRzJVXdNGDL7C3G0syV9mpowCGZemtLk1ScnLx1SyGwvPW8997AuecC8hb08OFixCvQtWtLXHFFOuZLM/CbJ+Wipzo+Y9WtmStDZgBXwCFpK9vSJFWsA8UFSYzaZdU7ciQg/ztwYMN3EaPuVHlvybr5R49L72Yro5krs7WkK00D1vELWluTVKmaQYyT07vvAj16FDfVuPRSYMQIGnDQgVCmMeZ4+F6IlblmrgxJkQYckrayLU1SxTpQXJDEpF2+WihbSsqLVuPGASeeWP4OYtLtwrlUhrqz0LIpS+Y2HEtRNHOlrZLGo9GAQ9JWtqVJqlQHeGwrYDkrY+VKYMIEYI89Gu/QVJlTt3Kg5qhO5jmgNVJFM1faKqEBh+TptS1NUqU6wGMw4MWLgSVLgC5dgA8+AD71qeLbzZWuVJlTd6Wetf89mdsy1cyVtkpowCF5em1Lk1SpDvBqG/Cvf13cxWq//YCnn852dm+qzKnb6zBuMDiZ2zLXzJW2SmjAIXl6bUuTVKkO8GoZsDxm/tGPgDvuAE4/vfi/rVpl695UmVN3tn62KE3mFhQ3xtDMlbZKaMAheXptS5NUqQ7wahnwKacAf/oTcNNNwAUXZFv5lpIgVebU7XUYcwUcAK9mrgwgb0MTfAkrJG1lW5qkSnVSDWnA8p1e2cFKdq76+9+B5s2BAw7I32mpMqfu/H2etyaZ5yXXcD3NXGmrhCvgkDy9tqVJqlQHeCgDfv/94me9b7wBPPmk20tWlTo7VebUXaln7X9P5rZMNXOlrRIacEieXtvSJFWqA9yXAct2kbJ9pJxQtNdewF//CqxaBdx5Z3E/Z4srVebUbdH72WKQeTZelUpr5spKsS1/z0fQljQ9x9IkVaoD3IcBi/kecogcgr7x3N5mzYDHHweOOMKuE1NlTt12OeAaicxdSbmV08yVbi3YlKIB23AMEkWTVKkOcB8GfOGFwNixG81X2pDv9coj6NGj7boyVebUbZcDrpHI3JWUWznNXOnWgk0pGrANxyBRNEmV6gD3YcDt2gGLFm3eZZ06FR9JW12pMqduqwxwj0Pm7qxcSmrmSpf4VmVowFYkA8TRJFWqA9zSgOUN5wEDittINmlSPMmodMkKuG9foKbGriNTZU7ddjngGonMXUm5ldPMlW4t2JSiAdtwDBJFk1SpDnArA/7LX4qHKLz3HvB//wdcffXGz4DFfOWrR/Pm2Z7bmypz6g4ynDdphMxtmWvmSlsljUejAYekrWxLk1SpDnArA5Yze+VNZ1n9fuELgLyINXw4MGsW0LkzcMUVtuZrpVuZMrmqp5orqepmruRK00YraeZKezXlI9KAQ9JWtqVJqq1xclqwAPjb34pbSa5ZAzRtCsjbzqGuVJlTd6gM2dgOmdsy18yVtkq4Ag7J02tbmqRKdYDnWR3IZ7vylvMPfwjssw8wd25Y4y0lQarMqdvrMG4wOJnbMtfMlbZKaMAheXptS5NUqQ7wrAb8738Xv040eXJxD+df/AJo2dJrt5QNnipz6g6fL2Ruy1wzV9oqoQGH5Om1LU1SpTrAsxrwmWcCjz4KjBkDfPe7XrujYvBUmVN3xa41L0Dmtkg1c6WtEhpwSJ5e29IkVaoD3MWAZQvJxYuB/fcH3nyz2AV77um1K5yCp8qcup2617QQmZvihGautFVCAw7J02tbmqRKdYBXMuBnnwXOOgv46CPgxRdtDlGw6sRUmVO3VQa4xyFzd1YuJTVzpUt8qzJ8C9qKZIA4mqRKdYCXM+B164CRI4tfH2rfHrj3XqBDhwCdkKGJVJlTd4ZONipK5kYg/xtGM1faKuEKOCRPr21pkirVAV7OgHv3Bu66C5Dv915zDbDddl7R5wqeKnPqztXdqkpkrsK3WWXNXGmrhAYckqfXtjRJleoAr2/A8nnv9tsXz+z98EPguOO8IlcFT5U5dau6PVdlMs+FrWwlzVxpq4QGHJKn17Y0SZXiAC+d2VtbuwJdurSE7OX89tvAjBlxfdZbrtNTZF7uiYPXxDYKnipvMjdKgDphNHOlvZryEfkZcEjayrY0SZXa5NTQmb2C7/rri4+d5TCF2K/UmJd4Unf4zCJzW+aaudJWCVfAIXmWbevII4/ECy+8gAEDBmDIkCEbyl133XWYPHkymjRpgpqaGhx88MFeHqukNsBDndnrMzlSY04D9pkNjcdmrtiypwHb8swarcn69XUPm8ta3b7866+/jsceewyLFy/eYMAvv/wy+vTpg9raWixYsAC9e/fGzJkzt2oD/uST4kYal1wCPP/85iisz+y17+mNETmp+qS7eexUecudpKo9Vt004LBjr35r0RmwCBw3btwmBnz77bdj+fLluETcBsCBBx6IuXPnYtttt22QniapYh0opRuVgxPGjQPGjweWLAG+8hVg9mxADLl0+Tiz12eaxs683L1Tt8+saDg2mdsy18yVtkoaj8bPgAPSrm/Aw4YNw2677YYLZNNiAF26dMGkSZOwxx57bFA1fvx4yI9cixYtwsSJE3MpXrZsGXaWQ28jvB54YE+MGvUFtGy5Fsce+y5OOukdtGq1Br16dcSHH26DTz5pim22WYcddvgEd931N+y++5oI72JzSTEzbwwgdYdPLzK3ZT548GBMnz7dNqiHaDRgD1DLhay0Au7QoQPmzJmzRa+A5YOBJ54ofof3q18tHpzwwgvFYwNPOaX4FaPSVTqzd8aMFejataWXM3t9dj9XNT7pbh47Vd5yJ6lqj1U3V8Bhx1791pJ4BP3SSy+hX79+mDFjBhYuXIiePXviCXGnMpcmqao9UP71L+Duu4s/CxcC7doBV10F9OxZOVGqrb2ywoZLUHdecvnqpcqbBpyvvxurpZkr7dWUj8gVcCDa559/PmbPno1Vq1ahXbt2mDZtWqHlESNGYMqUKYW3oEeNGoWOHTtuMQYs+zO/917xYAQ5HvDss4Hu3YFevYAjjwSaNnWDn+rESt1u/WtVKlXeNGCrDNgYhwZszzRLxChXwFluoKGymqTyMTmVNsqQl6UOOwy48kqgdWtg3rziSlf2Z+7SBZgyBfj4Y0B2sdppp+wUfGjPriJ7DerOzkxTI1XeNGBNrzdcVzNX2qvhCjgkU29taZLKenKqv1GGvKEsB9/Lalc+0919d+C884qPmOWwBM1lrV2jJUtd6s5CS182Vd40YH3f14+gmSvt1dCAQzL11pYmqawnp3IbZbRpA9x0E3D88UCzZjYorLXbqKochborM7IskSpvGrBlFhRjaeZKezU04JBMvbWlSSrryemQQ4pvLte/fGyUYa3dWwfVC0zdoUgX20mVd8raY2WumStDZi1fwgpJW9mWJqmsBop8jej++wH56rJ8plv38rVRhpV2Jf7M1ak7MzJVhVR504BV3d5gZc1caa+GK+CQTL21pUkqq8lJDPjEE4uHITz1FPDBB8XdqsR8ZZ8PeQFLXsSyvKy0W2pyiUXdLpTsyqTKmwZslwOlSJq50l4NDTgkU29taZJKMzktWwbI+RHHHgt8+9vA6tXAdtsBpY0yZs0COneGt40yNNq9dYZDYOp2gGRYJFXeNGDDJPhvKM1caa+GBhySqbe2NEmVZ3KS1e6ECcCllwIrVgA331z8Dm/oK4/20Bobao+6w/ZCqrxpwPZ5opkr7dXQgEMy9daWJqmyTk5vvAGccYa82AL8v/9XPId3r7283VqjgbNqr47KzVul7rA9kSpvGrB9nmjmSns1NOCQTL21pUkq18lJNsxo3rz4gtXppwODBgFdu3q7JafArtqdggUsRN0BYfMt6LCw/9tarDmumStDguRb0CFpK9vSJFWlgbJuXfE4wJ/+FJgxA/jiF5ViDatX0m7YlGko6jbFWTFYqry5Aq7YtZkLaObKzI0pKtCAFfBCV9UkVWOT05w5wPe/DzzzTHG/ZnncLDtZxXKlOrFSd9gMSpU3Ddg+TzRzpb2a8hFpwCFpK9vSJFW5yWnMGKBfP6BDB2DUKOCoo5QiPVRPdWKlbg/J0EjIVHnTgO3zRDNX2quhAYdk6q0tTVLVnZzke7uvvlo8EnDxYuC3vy2ugK22jrQGkOrESt3WmdB4vFR504Dt80QzV9qroQGHZOqtrTxJVTqxqLZ2BY4+uiVOOAG4+mrg7beL5/K2aOFNrlngVCdW6jZLAadAqfKmATt1b6ZCeebKTA0YFeYjaCOQIcJkTar6JxbJ7lXy3d4DDgDk0fNXvxpCtb6NVCdW6tb3fZYIqfKmAWfpZbeyWedKt6j2pWjA9ky9RcyaVA2dWNS0KdCnD3Dbbd5kmgdOdWKlbvNUaDRgqrxpwPZ5knWutFfgFpEG7MYpilJZk+qwwwB5w7n+5ePEIp+AUp1YqdtnVmweO1XeNGD7PMk6V9orcItIA3bjFEWprElV7szevn2BmpoobslJRKoTK3U7da9ZoVR504DNUmBDoKxzpb0Ct4g0YDdOUZTKmlT1PwP2eWKRT0CpTqzU7TMruAIOS7fh1mLN8axzZbVY0oCrRT5Hu3mSqnRi0YwZK9C1a0tvJxbluB3nKrEO8ko3QN2VCNn+PlXeXAHb5oFEyzNX2quoHJEGXJlRNCU0ScXJKXw3psqcupkrrgRizRXNXOl67xblaMAWFAPF0CRVrAPFBV2q2qnbpXftyqTKmytguxwoRdLMlfZqykekAYekrWxLk1ScnJTwc1RPlTl15+hsZRUyVwKsV10zV9oqaTwaDTgkbWVbmqRKdYBzdaBMmhzVU82VVHUzx3MkaYUqmrnSXg1XwCGZemtLk1ScnLx1S9nAqTKnbuaKK4FYc0UzV7reu0U5roAtKAaKoUmqWAeKC7pUtVO3S+/alUmVN1fAdjlQiqSZK+3VcAUckqm3tjRJxcnJW7dwBRwebYMtMsfDd0SszDVzZUiKXAGHpK1sS5NUsQ4UFySpaqdul961K5Mqb66A7XKAK2B7lnkiNlm/Xs792bKutm3bop0c4pvjeuutt7D77rvnqFn9Kqlqp+6wuZMqb6GUqvZYdf/zn//EYjnsPPKLK+DIO8hKnmb1bKUhb5xUtVN33h7PVy9V3nK3qWpPVXe+DLOvRQO2ZxplxJQHSqraqTvsUEiVNw04bJ7E1BoNOKbe8Khl/PjxOP/88z224C90qtqp219ONBQ5Vd5yL6lqT1V32Mws3xoNOJaeoA4SIAESIIGtigANeKvqbt4sCZAACZBALARowLH0RA4dEydOxK233lqoefXVV+OYY47ZEEVeAh80aBBmzZqFbbfdFnfffTf23ntvfPTRR+jTpw8WLVqEXXbZpfDoq1WrVrjssstQW1uLZs2aoVOnTrjpppvQpEmTHKoqV7HUXWrtqquugsT1+eajpe5PPvkEoln6R/57yJAh+PrXv14ZXs4SltpF80UXXVTIq6ZNm+Kee+7BXnvtlVNZ49Xy6J4+fXpB38KFC/Hiiy9Cvj0g19KlSwsfw7z//vv4whe+gDFjxhTuwcdlqTv2sVmOd8ix6aMPQ8SkAYeg7KENmUxkwn7mmWfw4Ycf4uijj8bf/vY3bLPNNoXW/vSnPxUmRpkIpk2bVjDge++9F3fccQdee+21gmGPHTu2YMTXXHMNXnrpJey3336FumeccQZ69eqFb37zm+bKrXWLQLkfmaSeeuopbwZsrfv222/HmjVr8IMf/MCccf2A1tpPOeUU/PCHPyzknOTV/Pnzcf3115vfR17d//nPf3yRB+oAAAlGSURBVNCiRQt8+9vfxrhx4zYY8JVXXln4Gt8FF1xQ+OOnTZs2hT9GrS9r3bGPzXK8Q41N6/4LGY8GHJK2YVt//OMfMWXKlA0rYJlsfvGLX2DfffcttHLFFVfg0EMPxemnnw5ZDYu5vvzyyzjzzDMxcOBAdO7cGe+++y6+853v4Mknn9xE2TnnnIOePXtusqK2ku5D93nnnQeZXI8//nhvBmytW97Y7dKlC2TziNatW+Pmm2/GTjvtZIV5kzjW2gcPHoxDDjkEp556asF4161bh0svvdRce17dJSHyB0JdAz7iiCMKY2bXXXctPHmQ8XLfffdFr7uuwBjHZjne8u8hxqZ5BwYMSAMOCNuyKZk4/vGPfxRWsnKdffbZGDBgAGSSkatv37743ve+h2OPPbbw/+Uvf/lyuqxqa2pq8MUvfhEff/wxOnToUFj9li5ZLcuKWB4r+XgEba376aefxoQJEwp/iMijRl+PoK11yx9EshK75JJLCib23nvvYfjw4ZYpsiGWtfa///3v6NatG3beeedCDkkfyH9bX3l1lzME+eNUxox8zLJgwYLCeBGTt76sdcc+NsvxDjU2rfsvZDwacEjahm3lXR00tgKWx9kXX3wxfve73+Ezn/mModqNoax1yx8U8ph9t91282rA1rrlDyX5DFL+AHrhhRcKn9f//ve/T4K5aL/xxhsLf+zJxxqPP/445JG69ZWXeTlDSHkFHPPYLMc71Ni0zruQ8WjAIWkbtlX6nOmvf/1r4TNg+Ty47mfAMnnJ5CifAz/22GO48847C4/bZKJcsmQJhg4dWvi3V155BcOGDSvU7d27N6ZOnYo999zTUOmmoSx1y2N2eYxb0vvnP/8Z8ohOjM36stQtvOUzyH322afwqF9ehJs3bx5GjhxpLbsQz1q7GJn80SP6H3300QLvX/3qV+ba8+ouZwiSL1/60pcK7zfIY3R5KVGeFFlf1rpjH5sN8f7ggw+CjU3r/gsZjwYckrZxW2Kuo0ePLkQVQz3ooINw7bXXFiZy+dxXXpSZO3du4YWUu+66q/DSibwFLY8+X3311cLbzzL5f/rTn8Zhhx2GFStWbNgvWj4nlseMPi5L3XX1+XwELe1Y6pZJWv7gkUfP22+/faEfZBXv67LUPnPmzMJnvvIGsbzBfdttt+HAAw/0Ij2P7ueff76Q+3PmzCnokvcc5FG/vCwkb0ELexkL8hKir7egLXXHPjbL8Q45Nr0kX4CgNOAAkNkECZAACZAACdQnQANmTpAACZAACZBAFQjQgKsAnU2SAAmQAAmQAA2YOUACJEACJEACVSBAA64CdDZJAiRAAiRAAjRg5gAJkAAJkAAJVIEADbgK0NkkCZAACZAACdCAmQMksBURkO/tlk7NkpOCdt9998L3wY877rjCdpKyWYts1SjfDb/lllsK+1TLKVlyQEf79u0LpOT74fI98frXqlWrcOKJJxb+WbYGPeCAA7YisrxVEshOgAacnRlrkMAWQaBHjx6QHzm04IEHHiiclCXbkMrGII888gguv/zywmYWsvGGHGogP41dchrVqFGjCjuw1b3E9EundG0R4HgTJGBEgAZsBJJhSCA1AnUNWPbt/fGPf7zJEZRf/epXccMNNxR2T6tkwLL6lS0q33rrrcJKWcqfdtppOPjgg7F8+fLCaU/9+/cv7LYmh3zIlqhyIMgTTzxR2JZT/u1zn/tc4XhD+QOAFwlsDQRowFtDL/MeSaABAnUNeP/998dvfvObDY+Zpbg8dpYjB2WLzLqPoOXUptKpW3XDyqPqklHLqVRyHKbsNS6Ps8866yxceOGFOOqooyCnKQ0ZMgQPPfQQOnbsiBkzZmCXXXbBTTfdVAgnB4LwIoGtgQANeGvoZd4jCVQwYO0KWMLXN+Bzzz238PhaLtmTWc7hLV2y4pUDHORwBDFhuVavXo2uXbt6O5aRSUACsRGgAcfWI9RDAoEI1F0By8tXcjhB3c+A5cAFOaXJ9TPg+gYs8eXfSqtpeXHrf/7nfwr/f82aNWjevDk6depUWAGXzhOWf5fDQ3iRwNZAgAa8NfQy75EEKqyA5dfyCFhexhJjlDej5XNbOWGqrrE2BrIxA37zzTcxYMAALFu2DOvWrcMJJ5xQOFHpySefxE9+8pPCv8l12WWX4Vvf+hb7iwS2CgI04K2im3mTJEACJEACsRGgAcfWI9RDAgkQkM+M5XFx6ZLvC8sZuLxIgATcCdCA3VmxJAmQAAmQAAmYEaABm6FkIBIgARIgARJwJ0ADdmfFkiRAAiRAAiRgRoAGbIaSgUiABEiABEjAnQAN2J0VS5IACZAACZCAGQEasBlKBiIBEiABEiABdwJbrAG7I2BJEiABEiABEiABKwJNrAIxDgmQAAmQAAmQgDsBGrA7K5YkARIgARIgATMCNGAzlAxEAiRAAiRAAu4EaMDurFiSBEiABEiABMwI0IDNUDIQCZAACZAACbgToAG7s2JJEiABEiABEjAjQAM2Q8lAJEACJEACJOBOgAbszoolSYAESIAESMCMAA3YDCUDkQAJkAAJkIA7ARqwOyuWJAESIAESIAEzAjRgM5QMRAIkQAIkQALuBGjA7qxYkgRIgARIgATMCNCAzVAyEAmQAAmQAAm4E6ABu7NiSRIgARIgARIwI0ADNkPJQCRAAiRAAiTgToAG7M6KJUmABEiABEjAjAAN2AwlA5EACZAACZCAOwEasDsrliQBEiABEiABMwI0YDOUDEQCJEACJEAC7gRowO6sWJIESIAESIAEzAjQgM1QMhAJkAAJkAAJuBOgAbuzYkkSIAESIAESMCNAAzZDyUAkQAIkQAIk4E6ABuzOiiVJgARIgARIwIwADdgMJQORAAmQAAmQgDsBGrA7K5YkARIgARIgATMCNGAzlAxEAiRAAiRAAu4EaMDurFiSBEiABEiABMwI0IDNUDIQCZAACZAACbgToAG7s2JJEiABEiABEjAjQAM2Q8lAJEACJEACJOBOgAbszoolSYAESIAESMCMAA3YDCUDkQAJkAAJkIA7ARqwOyuWJAESIAESIAEzAjRgM5QMRAIkQAIkQALuBGjA7qxYkgRIgARIgATMCNCAzVAyEAmQAAmQAAm4E6ABu7NiSRIgARIgARIwI0ADNkPJQCRAAiRAAiTgTuD/A816hyoyyH8BAAAAAElFTkSuQmCC\" width=\"719.9999785423286\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"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(990), y=np.arange(350), 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",
"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": 112,
"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(\"<div id='\" + id + \"'></div>\");\n if (!fig.cell_info) {\n console.error('Failed to find cell for figure', id, fig);\n return;\n }\n fig.cell_info[0].output_area.element.on(\n 'cleared',\n { fig: fig },\n fig._remove_fig_handler\n );\n};\n\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 '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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 '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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 = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n // Add the status bar.\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message pull-right';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n\n // Add the close button to the window.\n var buttongrp = document.createElement('div');\n buttongrp.classList = 'btn-group inline pull-right';\n button = document.createElement('button');\n button.classList = 'btn btn-mini btn-primary';\n button.href = '#';\n button.title = 'Stop Interaction';\n button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n button.addEventListener('click', function (_evt) {\n fig.handle_close(fig, {});\n });\n button.addEventListener(\n 'mouseover',\n on_mouseover_closure('Stop Interaction')\n );\n buttongrp.appendChild(button);\n var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n titlebar.insertBefore(buttongrp, titlebar.firstChild);\n};\n\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": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\" width=\"719.9999785423286\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"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(990), y=np.arange(950), 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",
"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": 114,
"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(\"<div id='\" + id + \"'></div>\");\n if (!fig.cell_info) {\n console.error('Failed to find cell for figure', id, fig);\n return;\n }\n fig.cell_info[0].output_area.element.on(\n 'cleared',\n { fig: fig },\n fig._remove_fig_handler\n );\n};\n\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 '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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 '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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 = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n // Add the status bar.\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message pull-right';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n\n // Add the close button to the window.\n var buttongrp = document.createElement('div');\n buttongrp.classList = 'btn-group inline pull-right';\n button = document.createElement('button');\n button.classList = 'btn btn-mini btn-primary';\n button.href = '#';\n button.title = 'Stop Interaction';\n button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n button.addEventListener('click', function (_evt) {\n fig.handle_close(fig, {});\n });\n button.addEventListener(\n 'mouseover',\n on_mouseover_closure('Stop Interaction')\n );\n buttongrp.appendChild(button);\n var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n titlebar.insertBefore(buttongrp, titlebar.firstChild);\n};\n\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": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\" width=\"640.4999809116131\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"T = 0.649 ± 0.005 uK\n"
]
}
],
"source": [
"def expansion(x, A, B):\n",
" return np.sqrt(A*x*x+B)\n",
"\n",
"val_truncated = val_mean[2:]\n",
"std_mean_truncated = std_mean[2:]\n",
"\n",
"fitModel_temperature = NewFitModel(expansion)\n",
"fitAnalyser_temperature = FitAnalyser(fitModel_temperature, fitDim=1)\n",
"\n",
"params = fitAnalyser_temperature.fitModel.make_params()\n",
"params.add(name=\"A\", value= 1e6, max = np.inf, min = 1, vary = True)\n",
"params.add(name=\"B\", value= 1000, max = np.inf, min = 0, vary = True)\n",
"\n",
"fitResult_temperature = fitAnalyser_temperature.fit(val_truncated, params, x='TOF_free', dask=\"parallelized\")\n",
"\n",
"val = fitAnalyser_temperature.get_fit_value(fitResult_temperature)\n",
"std = fitAnalyser_temperature.get_fit_std(fitResult_temperature)\n",
"\n",
"fit_vals = tuple([val['A'].item(), val['B'].item()])\n",
"fit_vals_std = tuple([std['A'].item(), std['B'].item()])\n",
"\n",
"tof = (np.arange(2,16,0.1)*1e-3)\n",
"\n",
"fig = plt.figure()\n",
"ax = fig.gca()\n",
"val_mean.plot.errorbar(ax=ax, yerr=std_mean, fmt='or')\n",
"plt.plot(tof, expansion(tof, *fit_vals), 'b--',\n",
" label='fit: A=%.3f, B=%.3f' % tuple(fit_vals))\n",
"plt.xlabel('TOF (s)')\n",
"#plt.ylabel('Cloud Width - Vertical (pixels)')\n",
"plt.ylabel('Cloud Width - Horizontal (pixels)')\n",
"plt.tight_layout()\n",
"plt.grid(visible=1)\n",
"plt.legend()\n",
"\n",
"\n",
"m = 164*1.673e-27\n",
"kb = 1.38e-23\n",
"pixel = 5.86e-6\n",
"M = 2.3513\n",
"\n",
"T = fit_vals[0] * (m/kb) * ((pixel*pixel)/(M*M)) / (1e-6)\n",
"dT = fit_vals_std[0] * (m/kb) * ((pixel*pixel)/(M*M)) / (1e-6)\n",
"\n",
"print('T = %.3f \\u00B1 %.3f uK'% tuple([T,dT]))"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## Measure temperature at the end of evaporative cooling 2, truncation 0.6"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The detected scaning axes and values are: \n",
"\n",
"{'TOF_free': array([0.002, 0.003, 0.004, 0.005, 0.006, 0.007, 0.008, 0.009, 0.01 ,\n",
" 0.011, 0.012, 0.013, 0.014, 0.015]), 'runs': array([0., 1., 2.])}\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAm8AAAHQCAYAAAD3Qo21AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAA9hAAAPYQGoP6dpAABT40lEQVR4nO3de1yUdd7/8fcoOHLQDBDUwKzcZPGAxSayu6ZmEp7WQ3pX/mhTo/ptmlpt5AEL1kPunbWai7WVq+ahg61aVioIWnvnMd3uBVu7f5vWGq2heMBAcdDr9wf3TIwDeoGDM5e8no8Hj5zv9Z3vfL8fxuntdRqbYRiGAAAAYAlNfD0BAAAAmEd4AwAAsBDCGwAAgIUQ3gAAACyE8AYAAGAhhDcAAAALIbwBAABYCOENAADAQgJ8PYGrxfnz5/Xdd9+pRYsWstlsvp4OAACwGMMwdOrUKbVr105NmtS+f43w5iXfffedYmJifD0NAABgcYcOHVJ0dHSt2wlvXtKiRQtJVQVv2bKl18d3OBzKyclRcnKyAgMDvT7+1YI6mUetzKFO5lAnc6iTeY2xVqWlpYqJiXFlitoQ3rzEeai0ZcuWDRbegoOD1bJly0bzJq4P6mQetTKHOplDncyhTuY15lpd6vQrLlgAAACwEMIbAACAhRDeAAAALITwBgAAYCGENwAAAAshvAEAAFgI4Q0AAMBCCG8AAAAWQngDAACwEMIbAACAhRDeAAAALITwBgAAYCGENwAAAAshvAEAAFgI4Q0AAMBCCG8AADRiZWWSzVb1U1bm69nADMIbAACAhRDeAAAALITwBgAAYCGENwAAAAshvAEAAFgI4Q0AAMBCCG8AAAAWEuDrCQDeUlYmhYYGShqq48cdatXK1zNyzqnqzz/8IIWE+HY+AADrY88bAACAhRDeAAAALITwBgAAYCE+D2+ff/65Bg0apPbt2ysoKEhhYWFKSkrSihUr3PqNGTNGNpvN4yc2NrbGcRcuXKjY2FjZ7XbdcMMNysrKksPh8OhXXFysMWPGKCIiQsHBwUpKSlJeXl6DrBUAAOBy+fyChRMnTigmJkb33XefrrvuOpWVlWnlypW6//779fXXXysjI8PVNygoSPn5+W7PDwoK8hhz9uzZmjFjhqZMmaLk5GTt3r1bGRkZKioq0quvvurqV1FRoX79+unEiRNasGCBIiMjlZ2drZSUFG3evFm9e/duuIUDAADUg8/DW58+fdSnTx+3tsGDB+vgwYN69dVX3cJbkyZN1LNnz4uOV1JSolmzZumhhx7SnDlzXK/hcDiUkZGhyZMnKy4uTpK0ePFiFRYWatu2bUpKSpIk9e3bV/Hx8UpPT9fOnTu9uFIAAIDL5/PDprWJiIhQQEDds+XGjRt15swZjR071q197NixMgxD69atc7WtXbtWnTp1cgU3SQoICFBqaqp27dqloqKies8fAACgIfhNeDt//rwqKyt15MgRLVq0SJs2bdLTTz/t1uf06dNq06aNmjZtqujoaE2YMEHHjh1z61NYWChJ6tq1q1t727ZtFRER4dru7NutWzePuTjb9u3b55W1AcDVrKxMatYsUMOGDVVZma9n47+oE7zF54dNnR599FH96U9/kiQ1a9ZML730kh555BHX9vj4eMXHx6tLly6SpI8//lh/+MMflJeXp927dyv0f++EWlJSIrvdrpAa7oYaFhamkpIS1+OSkhKFhYXV2M+5vTYVFRWqqKhwPS4tLZUkORyOGi+MuFzOMRti7KtFVWkC//fPDvlDqfxxTk68p8yhTpfmz+9zf+KvdfLfeTW+v3tm1+o34W3atGlKS0tTcXGx1q9frwkTJqisrEy//e1vJUmPP/64W//+/fvrlltu0ciRI/Xaa6+5bbfZbLW+zoXb6tK3uueee05ZWVke7Tk5OQoODq71eZcrNze3wca2ujNnmkoaLEnKz89X8+bnfDshuc9p06ZNfjGnC/GeMoc61c4f/+75I3+tk79/TjWmv3vl5eWm+vlNeGvfvr3at28vSRo4cKAkaerUqXrggQfUunXrGp8zfPhwhYSEaMeOHa628PBwnTlzRuXl5R4h6tixY0pISHDrW9PeNeeh2Jr2yjlNnTpVTzzxhOtxaWmpYmJilJycrJYtW15quXXmcDiUm5ur/v37KzAw0OvjXw2qH4a444471KqV7+tUfU533XWXX309Fu8pc6jTpfnj3z1/5K918tfPqcb4d895FO9S/Ca8XahHjx565ZVXdODAgVrDmyQZhqEmTX48dc95rltBQYESExNd7YcPH9bRo0ddh12dfQsKCjzGdLZV73shu90uu93u0R4YGNigb7KGHt/KqpfFX+rkOSffzaU2/lIrf0edauePf/f8kb/Wyd8/p/ypVg3N7Dr9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0549e9y2nT9/XpWVlW4/lzpbZefOnSopKVHfvn3d2t966y09+uij6t27t9auXat169bp8ccfV1lZmVu/Zs2a6ec//7k+/PDDeqwWgL8jvAHAJfzrX/9S69atFRISUmufG264wdW3uqefflqBgYFuP3l5eRd9ve3bt0uSbr31Vrf2Tz/9VK1atdJLL72k/v37q1+/fnrkkUe0YMECjzFuvfVWff755x7BDoD1Ed4AwAuce9NsNptb+6RJk7R79263n8TExIuO9d1338lmsykiIsKtvUePHjpx4oTuu+8+vffeezp69GitY0RGRur8+fM6fPhwPVcEwF9xwQIAXEL79u31//7f/1NZWVmte9++/vprSfK4QCA6Otr0rUGcTp8+rcDAQDVt2tSt/f7771dlZaVee+013X333Tp//rxuu+02zZo1S/3793fr27x5c9dYAK4u7HkDgEvo37+/zp07p/Xr19e43TAMvf/++woLC1NCQsJlv15ERITOnj1b4yHPsWPHatu2bTp58qQ+/PBDGYahwYMH65tvvnHrd+zYMddYAK4uhDcAuIS0tDRFRkZq6tSpKi4u9tj+n//5n9q/f7/S09MVGBh42a8XGxsrSfrqq69q7RMSEqIBAwZo+vTpOnv2rPbt2+e2/cCBAwoPD6/x6lgA1sZhUwC4hFatWmnNmjUaPHiwEhIS9NRTTyk+Pl6lpaV6++23tXLlSt1zzz166qmnvPJ6ffr0kVR1I+Fu3bq52h966CEFBQXpF7/4hdq2bavDhw/rueee0zXXXKPbbrvNbYwdO3aod+/eHufgAbA+9rwBgAm/+MUv9Pe//11Dhw7VggULlJycrPvvv1+HDh3SihUr9Oabb3rck62+YmJi1KtXL7333ntu7b169VJhYaEmTZqk/v376/HHH9fNN9+sv/71r2rdurWr31dffaWCggL9n//zf7wyHwD+ha/HAgA/9Je//EX33HOPvvnmG1133XV1eu6MGTP0xhtv6KuvvlJAAAdYgKsN4Q0A/JBhGPr5z3+uhIQE/fGPfzT9vBMnTujGG2/UwoUL2fMGXKU4bAoAfshms+m1115Tu3btdP78edPPO3jwoKZOnarRo0c34OwA+BJ73gAAACyEPW8AAAAWQngDAACwEMIbAACAhRDeAAAALITwBgAAYCGENwAAAAshvAEAAFgI4Q0AAMBC/j/Q0joeDAVVGQAAAABJRU5ErkJggg==",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"shotNum = \"0009\"\n",
"filePath = folderPath + \"/\" + shotNum + \"/*.h5\"\n",
"\n",
"dataSetDict = {\n",
" dskey[groupList[i]]: read_hdf5_file(filePath, groupList[i])\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 = (350, 990)\n",
"imageAnalyser.span = (650, 200)\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('TOF (s)')\n",
"plt.ylabel('NCount')\n",
"plt.tight_layout()\n",
"plt.grid(visible=1)\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [],
"source": [
"dataSet_cropOD_chunk = dataSet_cropOD.chunk((1, 1, 650, 200))\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": 24,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"4.809698089774189\n",
"0.160561481247611\n"
]
}
],
"source": [
"data = fitAnalyser.get_fit_value(fitResult)\n",
"\n",
"print(data.amplitude.sel(TOF_free=0.01).mean('runs').item() * 147 / 1e5)\n",
"print(data.amplitude.sel(TOF_free=0.01).std('runs').item() * 147 / 1e5)"
]
},
{
"cell_type": "code",
"execution_count": 134,
"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(\"<div id='\" + id + \"'></div>\");\n if (!fig.cell_info) {\n console.error('Failed to find cell for figure', id, fig);\n return;\n }\n fig.cell_info[0].output_area.element.on(\n 'cleared',\n { fig: fig },\n fig._remove_fig_handler\n );\n};\n\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 '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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 '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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 = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n // Add the status bar.\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message pull-right';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n\n // Add the close button to the window.\n var buttongrp = document.createElement('div');\n buttongrp.classList = 'btn-group inline pull-right';\n button = document.createElement('button');\n button.classList = 'btn btn-mini btn-primary';\n button.href = '#';\n button.title = 'Stop Interaction';\n button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n button.addEventListener('click', function (_evt) {\n fig.handle_close(fig, {});\n });\n button.addEventListener(\n 'mouseover',\n on_mouseover_closure('Stop Interaction')\n );\n buttongrp.appendChild(button);\n var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n titlebar.insertBefore(buttongrp, titlebar.firstChild);\n};\n\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": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\" width=\"719.9999785423286\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"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(990), y=np.arange(350), 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",
"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": 132,
"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(\"<div id='\" + id + \"'></div>\");\n if (!fig.cell_info) {\n console.error('Failed to find cell for figure', id, fig);\n return;\n }\n fig.cell_info[0].output_area.element.on(\n 'cleared',\n { fig: fig },\n fig._remove_fig_handler\n );\n};\n\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 '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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 '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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 = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n // Add the status bar.\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message pull-right';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n\n // Add the close button to the window.\n var buttongrp = document.createElement('div');\n buttongrp.classList = 'btn-group inline pull-right';\n button = document.createElement('button');\n button.classList = 'btn btn-mini btn-primary';\n button.href = '#';\n button.title = 'Stop Interaction';\n button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n button.addEventListener('click', function (_evt) {\n fig.handle_close(fig, {});\n });\n button.addEventListener(\n 'mouseover',\n on_mouseover_closure('Stop Interaction')\n );\n buttongrp.appendChild(button);\n var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n titlebar.insertBefore(buttongrp, titlebar.firstChild);\n};\n\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": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeAAAAFoCAYAAACPNyggAAAAAXNSR0IArs4c6QAAIABJREFUeF7tnQuYV1W5xt9BwUwQtCQ1I8Q0DFIQyAtHBc0uXtDMzBsK4gAW6QlFhcRjahCa5gUhAw2UtDyYBGapCGOYWYBoSoioeDmYYV4GCBERzvPt3cAwzH/+a+/v2+u/Frz7eeYpmbW+9e7f+tZ6Z+3bqtqwYcMG8CABEiABEiCBQAlUVVVVBSpNJauKBqzix8okQAIkQAIFE6ABFwyY4UmABEiABEigMQI0YOYFCZAACZAACVSAAA24AtDZJAmQAAmQAAnQgJkDJEACJEACJFABAjTgCkBnkyRAAiRAAiRAA2YOkAAJkAAJkEAFCNCAKwCdTZIACZAACZAADZg5QAIkQAIkQAIVIEADrgB0NkkCJEACJEACNGDmAAmQAAmQAAlUgAANuALQ2SQJkAAJkAAJ0ICZAyRAAiRAAiRQAQI04ApAZ5MkQAIkQAIkQANmDpAACZAACZBABQjQgCsAnU2SAAmQAAmQAA2YOUACJEACJEACFSBAA64AdDZJAiRAAiRAAjRg5gAJkAAJkAAJVIAADbgC0NkkCZAACZAACdCAmQMkQAIkQAIkUAECNOAKQGeTJEACJEACJEADZg6QAAmQAAmQQAUI0IArAJ1NkgAJkAAJkAANmDlAAiRAAiRAAhUgQAOuAHQ2SQIkQAIkQAI0YOYACZAACZAACVSAAA24AtDZJAmQAAmQAAnQgJkDJEACJEACJFABAjTgCkBnkyRAAiRAAiRAA2YOkAAJkAAJkEAFCNCAKwCdTZIACZAACZAADZg5QAIkQAIkQAIVIEADrgB0NkkCJEACJEACNGDmAAmQAAmQAAlUgAANuALQ2SQJkAAJkAAJ0ICZAyRAAiRAAiRQAQI04ApAz9tk+/bt0aFDh1zVV65ciVatWuWqW+lKsWqnbr+ZEytvoRSr9lB1v/zyy3jllVf8JmCO1mjAOaBVqspRRx2FWbNm5Wr+T3/6E3r27JmrbqUrxaqduv1mTqy8hVKs2kPVrZkrfWYtDdgnbWVbmqQKdaC4IIlVO3W79K5dmVh504DtcqAukmautFdTOiIN2CdtZVuapOLkpISfo3qszKk7R2crq5C5EmCD6pq50lZJ09FowD5pK9vSJFWsA5yrA2XS5Kgea67Eqps5niNJy1TRzJX2argC9sm0sLY0ScXJqbBuKRk4VubUzVxxJRBqrmjmStdztyjHFbAFRU8xNEkV6kBxQRerdup26V27MrHy5grYLgfqImnmSns1XAH7ZFpYW5qk4uRUWLdwBewfbaMtMsf9d0SozDVzpU+KXAH7pK1sS5NUoQ4UFySxaqdul961KxMrb66A7XKAK2B7lnkiVm3YsGFDnooh16EBh9w7W2qL1RCo23+ekbktc81caauk6WhcAfukrWxLk1SxDnCuDpRJk6N6rLkSq27meI4kLVNFM1faqykdkQbsk7ayLU1ScXJSws9RPVbm1J2js5VVyHwTwNdeA0aNAubNA7p3B0aMANq1ywZYM1dma0lXmgas4+e1tiapYh3gXB14TbGksVhzJVbdZL65+XbtCtTWAh99BGy3HdC6NbBgQTYT1syVPkccDdgnbWVbmqTi5KSEn6N6rMypO0dnK6uQeQpw8GBg4sTUfOsOMeHqamD8eHfImrnSvRV9SRqwnqG3CJqkinWAc3XgLb02NhRrrsSqmzm+KcflkvP8+VvmfLdu6SVp10MzV7q2YVGOBmxB0VMMTVJxcvLUSfWaiZU5dTNXXAlY58oZZwD33LN567ICHjgQGDfOVRWgmSvdW9GXpAHrGXqLoEkq64Hi7aR5T9In6qStWHMlVt1kDnzwAdC8OfB//wcccACwahXvAXsf+IYN8j3gBjA5ORlml2OoWJlTt2MHGxbblpm/9RZw0knAkUemTz/LU9AjRwKPPAIccwxw9dXZHsCSbtEsVgy7tWworoDLIgqngCapYh3gXB34z79YcyVW3dtyji9eDBx3HLByJTB9OnDwwTb5rpkrbRS4RaEBu3EKopQmqTg5+e/CWJlTN3PFlYAmVx57DPjGN4Dddwd+9ztg771dWy1fTjNXlo9uV4IGbMey8EiapNIMlMJPrEwDsWqnbr+ZEyvvbXUFfPbZwLJlwH33AW3a2OaKZq60VdJ0NBqwT9rKtjRJxclJCT9H9ViZU3eOzlZW2VaYyxf6lywB9tsPWLMGaNYMaNFCCa+R6pq50l5N6Yg0YJ+0lW1pkirWAb6trg6UqaKqHmuuxKp7W8lxedJ5wID0Xu/LLwOf/KQqTZusrJkri1O1ZWQasE/ayrY0ScXJSQk/R/VYmVN3js5WVtnamb/9dnq/969/BSZPBr79bSWwMtU1c2WxyjaPTgP2SVvZliapYh3g28rqQJkaptVjzZVYdW/tOf7ii8CxxwLvvgv89rfAYYeZpmujwTRzZfHqNrVAA/ZJW9mWJqk4OSnh56geK3PqztHZyipbM3O559u/f7ry3WcfJSjH6pq50rEJk2I0YBOMfoJokirWAb61rw78ZE62VmLNlVh1b605PmMG0KsX0KoVIA9fVVVly0NNac1cqWk3a10acFZiFSyvSSpOTv47Llbm1M1ccSXQWK6I2f7oR+nXrG68EbjwQtdoduU0c6WdivKRaMDlGQVTQpNUsU6qW+vqIJikakRIrLkSq+6tKcfXrk03TpDLzfIJyR/8wO/Kty6dNXOlz7FJA/ZJW9mWJqk4OSnh56geK3PqztHZyipbA/N164CvfhV4/HHgF78AZGejSh2audKnZhqwT9rKtjRJFesA35pWB8ru91Y91lyJVffWlONyyVn27j38cG/p2mhDmrnSp3IasE/ayrY0ScXJSQk/R/VYmVN3js5WVomNuexYJDsX1dSswv77t0xM9/LLlRAMq2vmSkMZZUPRgMsiCqeAJqliG+D1qceqnbr9jp1Yece2Ahbz7doVqK1N9+yVY/vtAdnZqEMHv31eqjXNXOnzDGjAPmkr29IkFScnJfwc1WNlTt05OltZJSbmgwcDEyduMl859e22A6qrgfHjlSCMqmvmSiMJTmFowE6Y9IXWrFmDo48+Gs2bN8eqVatw0UUX4dBDD0WXLl2SHzmGDh2KPn36lGxMk1QxDfCGAGLVTt36cZMlQqy8Y1sBd+8OzJ+/Zc/IZeh587L0WHFlNXNlcaq2jEwD9kR7w4YNWLduXWLAtbW16Ny5M+bMmYN+/fqhpqbGSYUmqTg5OSE2LRQrc+o2TQOnYDEwX70aWLgQuP32xlfA8vrRuHFOp1t4Ic1cWbi4eg3QgH3S/k9by5Ytw8CBA3HrrbeiR48e6NixI9q1a4cbb7wRu+22G1fADQjEMDk11mnU7Xdwxco7hhXwzJnAoEGA7Ggk64WDD950D1guP7duDSxYALRr57fPS7VGA65sP1RtkCVnYIesfE844QQsXLgQY8aMQd++fbF27Vq0atUKEyZMSFbEd955Jw2YBlzRzI3VyGLVHbIByy5GF12Uflijd2/gttuAffcF5EGs0aOB2bNXoXfvlhg+PBzzFZ404IpOIQjSgOuQLF++PFn5/u1vf0Nr+dMRwOrVq5N/E3Ouf0yePBnyI8fSpUsxZcqUXGTF/OvayhWggpVi1U7dfpMmVt5CKVTtQ4d+AYsWtcR3v/sKjjtu+Rbfcw5V98iRIzFr1iy/CZijNV6CzgEtTxVZ6cr936qqqsRs5cGruXPnbjTFGTNmYNKkSbjvvvu4AuYKOE+KmdWJdSUZq+7QVsCvvAL8+99Ap07pq0WyRth998bTK1TmXAGbTQe5AgW3An722WcxZMgQNGvWDPJE9IUXXoiPfexjuOqqq5JL0C1atEguQ7dv354GTAPOlfRWlUKdVMudX6y6QzFgeaf35pvTD2rI5eYHHihHHAiVOQ24fN8VWSI4A7Y4WU1ShTpQXLjEqp26XXrXrkysvEMw4GeeAc47L329aMiQdDcj2Uaw3BEqc81cWe6cLX/PS9CWNAuOpUmqUAeKC7JYtVO3S+/alYmVd6UNWJ5s3ntvYNdd09eLDjnEvU9CZa6ZK93PXl+SBqxn6C2CJqlCHSgu8GLVTt0uvWtXJlbelTLg2bPT+7xt2wJ/+xvQsSPQokW2/giVuWauzEZAV5oGrOPntbYmqUIdKC4AY9VO3S69a1cmVt6+Dfidd4Bhw4A77gB++EPgiivy90GozDVzZX4a2WvSgLMzq1gNTVKFOlBcYMaqnbpdeteuTKy8fRmwfBnh3nuBCy4A1qwBrr02/X5zs2b5+yBU5pq5Mj+N7DVpwNmZVayGJqlCHSguMGPVTt0uvWtXJlbeRRmwfCxDnmiWr1h9+cvpQ1ZHHQWceCJwyy3Annvq2YfKXDNX6qm4R6ABu7OqeElNUoU6UFygxqqdul16165MrLyLMOC6LQPfew9Yvz5d5bZpA/z616kZWx2hMtfMlVZsXOLQgF0oBVJGk1ShDhQXtLFqp26X3rUrEyvvIgzY15aBoTLXzJV2GVk+Eg24PKNgSmiSKtSB4gI3Vu3U7dK7dmVi5V2EAcsOp/Jub8PDesvAUJlr5kq7jCwfiQZcnlEwJTRJFepAcYEbq3bqdulduzKx8rY2YNk2UD6o99Zbm7OVXYustwwMlblmrrTLyPKRaMDlGQVTQpNUoQ4UF7ixaqdul961KxMrb2sDlqed5Unnu+4CVq0C5BOTRW0ZGCpzzVxpl5HlI9GAyzMKpoQmqUIdKC5wY9VO3S69a1cmVt5WBrxyJfDXvwJHH50ylQexRo4EHnkEOOYY4Oqr7bcMDJW5Zq60y8jykWjA5RkFU0KTVKEOFBe4sWqnbpfetSsTK28LA5aV7rHHAn//O/Dyy8DOO9txbSpSqMw1c6UfcmkrNGCftJVtaZIq1IHigiRW7dTt0rt2ZWLlrTVg2TrwuOOAp54CHn4427ectfRDZa6ZK7VMstSnAWehVeGymqQKdaC4II1VO3W79K5dmVh5awxYHrg6/nhg7lzgoYeAww6z4+kSKVTmmrnS5bytytCArUh6iKNJqlAHigu2WLVTt0vv2pWJlbfGgN94I730PHYs8F//ZcfSNVKozDVzpeu5W5SjAVtQ9BRDk1ShDhQXdLFqp26X3rUrEyvvPAYs33KW1a9sIVj3pSs7ku6RQmWumSvdz15fkgasZ+gtgiapQh0oLvBi1U7dLr1rVyZW3lkNWMz3pJOAFSuAP/1JHuSxY5g1UqjMNXNlVgaa8jRgDT3PdTVJFepAcUEYq3bqdulduzKx8s5iwB98AJx8MjBrFvDAA5teObKjmC1SqMw1c2U2ArrSNGAdP6+1NUkV6kBxARirdup26V27MrHydjVgMd9TTknf650+HfjKV+zY5Y0UKnPNXJmXRZ56NOA81CpUR5NUoQ4UF5Sxaqdul961KxMrb1cDlqec5dLz/fcDX/uaHTdNpFCZa+ZKDY+sdWnAWYlVsLwmqUIdKC44Y9VO3S69a1cmVt7lDLj+Q1by1LPFPr5W1ENlrpkrrdi4xKEBu1AKpIwmqUIdKC5oY9VO3S69a1cmVt5NGfCHHwJnnAEcdBAwfLgdK6tIoTLXzJVWbFzi0IBdKAVSRpNUoQ4UF7Sxaqdul961KxMr71IGvG4dcOaZ6SXnqVOBPn3sWFlFCpW5Zq60YuMShwbsQimQMpqkCnWguKCNVTt1u/SuXZlYeTdmwGK+Z58N/O//pj9y7zfEI1TmmrnSJ2casE/ayrY0SRXqQHFBEqt26nbpXbsysfJuzIDHjAF+8APg178GvvlNO0bWkUJlrpkrrRk1FY8G7JO2si1NUoU6UFyQxKqdul16165MrLwbM2DZYOHJJyv/nm+53gmVuWauLHfOlr+nAVvSLDiWJqlCHSguyGLVTt0uvWtXJlbedQZ86KE9ccklwLnnAl/4gh2XIiOFylwzVxbJq2FsGrBP2sq2NEkV6kBxQRKrdup26V27MjHyfu01YNQoYPbsVaiqaokXXgDuuQf49rftuBQZKVTmmrmySF40YJ90jdvSJFWoA8UFUazaqduld+3KxMZbzLdrV6C2Fvjoo5TDTjsBf/870K6dHZciI4XKXDNXFsmLBuyTrnFbmqQKdaC4IIpVO3W79K5dmdh4Dx4MTJy4yXyFxHbbAdXVwPjxdlyKjBQqc81cWSQvGrBPusZtaZIq1IHigihW7dTt0rt2ZWLj3b07MH/+luffrRswb54dlyIjhcpcM1cWyYsG7JOucVuapAp1oLggilU7dbv0rl2ZmHjX1ACDBgEvvbTlCnjgQGDcODsuRUYKlblmriySFw3YJ916ba1ZswZHH300mjdvjlWrVuGiiy7C6aefjuuuuw7Tpk1DVVUVxo0bhwMOOKCkQk1ShTpQXLojVu3U7dK7dmVi4C3fdR49GrjiCuDgg4Hnn0/39ZV7wHL5uXVrYMEC3gPWZoVmrtS2naU+n4LOQktRdsOGDVi3bl1iwLW1tejcuTMeffRRVFdXo6amBkuWLMGAAQMwZ84cGnADAjFMrI11GnUrBkyOqqHzfustoG9f4OGHgcsvB/7nf4Bly1JDlqege/dumXzvOZYHsKSLQmVOA84xgAyrVG0Qxwv0WLZsGQYOHIg+ffpgxYoVGDZsWKK0U6dOeOqpp7DDDjs0qlyTVKEOFJcuilU7dbv0rl2Z0Hnfeivwwx8CU6ZsuZdv6NpL9VKoujVzpV1Glo/EFXB5RmYlZOV7wgknYOHChRgzZgyWL1+Otm3b4rzzzkva6NmzJ6ZOnYo99thjY5uTJ0+G/MixdOlSTJHRm+OQtlvL9a0Ij1i1U7ffZAuRt1xyfvbZnXHggSsgS4L33muOXXb5cAswIWp36b1QdY8cORKzZs1yOYWKlqEBVwC/GG+PHj0wdOhQrF27duMKWC5Lz58/nyvgBn0S6l/Z5VKHussRsv19aLzfeQc45xzgwQfTe7377lv6fEPT7tozoermCti1B4spF9wlaDFauf8rD1utXr0aXbp0wYwZMzBo0CDMnj0bL774Ivr374/HH3+8JBFNUoU6UFy6P1bt1O3Su3ZlQuL9l78Ap54KrFoF3HkncNxxTZ9nSNqz9EioujVzZZbz15blClhL0LH+s88+iyFDhqBZs2aQJ6IvvPBCnHbaacml6OnTpyfGPHbs2MSYSx2apAp1oLjgi1U7dbv0rl2ZUHj//vfAiScC8p7vr37l9lBVKNqz9kaoujVzZVYGmvI0YA09z3U1SRXqQHFBGKt26nbpXbsyleYt93irqoCVK4GxY4GLLwaaN3c7v0prd1O5ZalQdWvmyrws8tSjAeehVqE6mqQKdaC4oIxVO3W79K5dmUryli9XyQc0pk4FOnTIfk6V1J5d7aYaoerWzJUaHlnr0oCzEqtgeU1ShTpQXHDGqp26XXrXrkwleMuqV75aNXQocOCBwL33Au3bZz+nSmjPrpIrYAtm9WPQgK2JFhiPBlwg3AJCc1ItAGoTIX3zli9YyRuE//u/wPe+B1x3HVDiFf6yIHxrLyvIsUCoujVzpeOpmxSjAZtg9BNEk1ShDhQXcrFqp26X3rUr45v34sXAUUcBN90EnHKK7jx8a9ep5SVoK340YCuSHuLQgD1ANmyCk6ohTIdQPnjLJWd5srlPn3Tv3g8+yL/qrX9KPrQ7IMxcJFTdmrkyMwRFBRqwAp7vqpqkCnWguDCMVTt1u/SuXZkieL/2GjBqVLo9oNzjfftt4Le/Td/tle86Wx1FaLfS1lScUHVr5kof3OraoAH7pK1sS5NUoQ4UFySxaqdul961K2PNW8y3a1egtnbzLQNvvjm952t5WGu31EYDLo4mDbg4tuaRacDmSAsNyEm1ULxbBLfmPXgwMHHilvv1VlcD48fbnpu1dlt1paOFqlszV/piJ+3QgH3SVralSapQB4oLkli1U7dL79qVseYtX7KaP39Lfd26pZekLQ9r7ZbauAIujiYNuDi25pFpwOZICw3ISbVQvIWugOVhq0MOSY1WdjSqO7bbLv3ghrz7a3kwVyxpytPpR3E3JFukmaIFtxlDJvUlCmuSKtYBLihi1U7dFlnvHsOKtxjuRRcBN94I7LgjsHZtehlazFd29FywwO37zu7KmeNZWLmU1cyVLvGtynAFbEXSQxxNUllNTh5Os9CVjU/9sTLflnWL2Z57LnD33en3nI8/Hhg9Gpg7F+jRAxg+3N58+Uem/ajUzJX2akpHpAH7pK1sS5NUsU6qnJyUSZOjeqy5YqFbDPb664EpU9LtBH0dFtp9aa3fTqi6NXOlT440YJ+0lW1pkirUgeKCJFbt1O3Su3ZlLHi/+y7w3HPA4Yfb6XKJZKHdpR3rMqHq1syV1oyaikcD9klb2ZYmqUIdKC5IYtVO3S69a1cmL+/XXwf6909fOcqzkYLFGeTVbtG2JkaoujVzpYZH1ro04KzEKlhek1ShDhQXnLFqp26X3rUrk4f3okXAV76SPmD18MPAfvvZ6ckSKY/2LPGLKhuqbs1cWRSrxuLSgH3SVralSapQB4oLkli1U7dL79qVycr7ySeB444D9twTeOih9H8rdWTVXimdDdsNVbdmrvTJlgbsk7ayLU1ShTpQXJDEqp26XXrXrkwW3qtWpZeb998fmD4d2GUXOx15ImXRnid+UXVC1a2ZK4tixRWwT7IFtKVJqlAHigumWLVTt0vv2pVx5S0f2aiqAp54AujSBfj4x+005I3kqj1v/KLqhapbM1cWxYoG7JNsAW1pkirUgeKCKVbt1O3Su3ZlXHjLxzXkKecJE1ITDuVw0R6K1vo6QtWtmSt9cuYlaJ+0lW1pkirUgeKCJFbt1O3Su3ZlmuItq94f/CD9qMYllwA//jEN2IJ8qDmumSstuLjGoAG7kgqgnCapQh0oLlhj1U7dLr1rV6YU73XrANnZ6Pbb049sDB1q16ZVJOaKFck0jmautFXSdDQasE/ayrY0SRXrABdksWqnbmXCZ6xeivfPfpbu33vHHUDfvhmDeirOXLEFrZkrbZXQgH3yLLQtTVLFOsBpwIWmVKPBY82VhrrrHraSFfBTTwFf+pJ/lq4tbi3MXc+36HKaubJobfXjcwXsk7ayLU1SxTrAacDKpMlRPdZcqa/7H/8ATjoJuPZa4Mgjc0DwXGVrYO4ZWZPNaeZKn+dBA/ZJW9mWJqliHeA0YGXS5Kgea67U6X7xxfTrVrKzkXxgo1OnHBA8V4mduWdcZZvTzJVlgxsWoAHnhLl69Wp83PMLhJqkinWA04BzJqiiWmy58tprwKhRQE3NKnTu3BI1NcAnP5l+WrJdOwUIj1VjY16HJlTdmrnSY7eDBpyTdpcuXXDooYdi4MCB6Nq1a84o2appkirUgeJCIFbt1O3Su7oyYr4y/GprgY8+SmPJd53nzUs/shHLwVyx7SnNXGmrpOloNGAF7UceeQQ///nP8Y9//APnnnsuTjvttEJXxZqkinWAcwWsSNCcVWPKFXm9SHYxqjPfOgOurgbGj88JoALVYmJeH0+oujVzpc/upwEraS9ZsgTXXHMN5syZg1133RUDBgzA+eefr4zaeHVNUoU6UFxAxaqdul16V1dGVr9PP71ljG7d0lVwLAdzxbanNHOlrRKugAvhec899+COO+7ATjvthEGDBuFrX/sa1q9fn7wA/thjjxXSpiapYh3gXAEXkkpNBo0lV555Jn3CWS4/1z/kEvTAgcC4cf7Z5W0xFuYNzy9U3Zq5Mm8f5qnHFXAeagBGjhyZ3P/9zGc+s1mE5557Dp07d94i6sKFCxOjbtasGTZs2IAbbrgBu+22G+ResvzIMXToUPTp06ekIk1ShTpQXPDHqp26XXo3Xxn5qtV3vwt06ADIK0crV6aXocV8W7cGFiyI5wEs/pGZLweaqqWZK+3VlI5IA1bQXrt2Lf75z38mhipHuyYeuVy+fDlatGiBNm3a4Pnnn0/uGd99993o168fauSxTYdDk1SxmgEnJ4fEMC4SQ67IV63mz08/Lbl8efqN59mzV6F375YYPjwu82WOGycwP0VpDzRjxKoNda6YsaJr8XHjxuHGG2/Ev/71L+y888745Cc/iXmON51eeumlxHjvuusu9OjRAx07dkzMW+LJqrjUQQN27Z0wysVgZI2RClW3DK8HHwSuuKLx/g1Vt0s2xqo9VN2audKlv6zKcAWck2T37t3x5z//GccccwweeughfPe738VEeRyzzPHhhx/i+OOPTy439+rVC7KKbtWqFSZMmJA8yHXnnXfSgBsQCHWQl+tr6i5HyO33coHp5puBYcOAAw8E5BGLxl7Bj5U3V8BueZClFA04Cy37soWvgOs6+Mgjj0wuIffs2RNPyA7fTRzykNaZZ56JI444YosnpeXDHrIalnvF9Y/JkydDfuRYunQppkyZkotWbW0tWsvNsQiPWLVTtz7ZVqzYHqNHfw5z5nwCp576Bs4//xU0b57e8ml4xMpbziNW7aHqlmd0Zs2apU/AgiNwBZwT8IgRI3D55ZdDLkXffvvt+OIXv4h77723ZDS5Ii6vKO2333647LLLknL1k3fGjBmYNGkS7rvvvpIxNH/VcXWQs6MV1WJlHpLuyy9Pn2aeNAlo4vnEpJdC0p01bWLVHqpuzVyZte805WnAGnr/qfvee+8lD1c1dTzwwAM45ZRTcMghhyTF5J3hs88+G1dddVVyCVoe0JLL0O3bt6cBNyAQ6iAvlzrUXY5Q479fvx547jnggAOANWvSh6xcPikZK++Y/3gIlTkNON/Ys6pV+CXoF154Ibnn+/bbb298ClreCy7y0CRVqAPFhVes2qnbpXc3L/OvfwHnnCPfdZZbLkDbtu4xYuVNA3bvY9eSmrnStQ2LclwB56Qo7+4OGzYMe+2118YIcj+4yEOTVJyciuyZxmPHyrxSuufMAU4/HfjgA0CeRfz617P1WaV0Z1PJXLHgVS6GZq4sF9vy9zT58jDlAAAgAElEQVTgnDTly1d/+MMfctbOV02TVJyc8jHX1IqVeSV0y7OFsvL9r/8C7r4b+PSns5OvhO7sKmnAVsyaiqOZK33oq2uDBpyT9tSpU5PXhg466CDZUiqJIvd0izw0ScXJqcie4aSal668YiTD5/XX01XvpZcC22+fLxpzPB83Ta1QmWvmSg2PrHVpwFmJ/ae8vP8rD0zVXYIWE76i1BcCcrbRsJomqUIdKC5oYtVO3U337qOPAvKUs3xcY5ddXDKh6TKx8pazilV7qLo1c6U+E90j0IDdWW1Wkpegc4LLUS3UQV7uVKh7EyHZt3fUqHSHItmpaMcd049rHHVUesk5y8NWpbjHypsGXG4kZf89DTg7M8sahT8Ffemll+Lggw9Gt27dNl6Cbupb0BYnp0kqTk4WPZAtRqzMrXWL+cq2gbJrUf19ey+6CBgzJt1AweKw1m2hyTVGrNpD1a2ZK137zKIcV8A5Kfbu3XuzmnIJuugvr2iSKtSB4oI/Vu3Unfbu4MGAfKW1vvmK6VZXA+PHu2SAW5lYeXMF7Na/WUpp5sos7WjL0oC1BD3W1yQVJyePHfWfpmJlbq27e/d056KGh1yKdty/xKnzrHU7NWpUKFbtoerWzJVGXeoUhgbshGnLQvIFq/qHfMnq85//PE466aSNl6Rzhi5ZTZNUoQ4UF0axaqfutHflfd6Gb+zJCnjgwPQzk1ZHrLy5ArbKgE1xNHOlvZrSEWnAOWn3798/MVq5Dzx37lysWbMG22+/ffJVrLrNE3KGpgE3IBDrxErdwNSpwGmnAc2aAfKJSbkMLeYr+4IsWOD2iUnXcRQrbxqwaw+7l6MBu7MqomThD2H16dMH06dP36j9hBNOgGyoIN96fvLJJ4s4J2iSipNTIV3SZNBYmVvp/uUv5d144NvfBq65BrjuOmDuXKBHD2D4cFvzjdnEYtZulSvWo1MzV1praSoeV8A5acsHOO6//3589rOfxauvvoqTTz4Z8+fPh3yO8jHZsLSAQ5NUoQ4UF0yxat/WdfftCzRvDkyYYPekc1P5EitvGrDLLJCtjGauzNaSrjQNOCc/+QrW97//fbzzzjv4xCc+gZ/+9KfJ6nfmzJmQd4SLODRJxcmpiB5pOmaszLW633gD2HNPYN269NKz/Pg4tLp9aCzVRqzaQ9WtmSt95gEN2CdtZVuapAp1oLggiVX7tqj7+usB+SDc3/4G7LOPS+/alYmVN1fAdjlQF0kzV9qrKR2RBpyR9rXXXotLLrkEdQ9h1a/O7QgzwnQsHuvEuq3plvu8I0cCI0ak93z/84l0x17WF4uVNw1Y3/cNI9CA7ZlmiVjYQ1jPPPMMDjzwQEybNg1t2rTB2rVrsXr16kSbvIJU5KFJKk5ORfZM47FjZZ5Vt2yoIMb7ox8BV1+dft+5EkdW3ZXQWKrNWLWHqlszV/rMC66Ac9Lu1asXampqMGLECPzzn//EG2+8gd///vc5o7lV0yRVqAPF5cxj1b6t6F6+HDjgAODii9OfSh2x8uYK2D5jNHOlvZrSEWnAOWnXdXDfvn1x1113QT5NOXv27JzR3KppkoqTkxtjy1KxMnfVLe/1rlkDfPzjwLvv2uxopOHvqlvTRlF1Y9Ueqm7NXFlUHzcWlwack/ahhx6Kb3zjG3jvvfcwatQoHHHEEfjjH/+YM5pbNU1ShTpQXM48Vu1bs275oIZ8yWrpUmDmTH9POjeVL7Hy5grYZRbIVkYzV2ZrSVeaBpyT3+LFi5NLzgMGDEi+gHXPPffg3HPPzRnNrZomqTg5uTG2LBUr83K65fWic84BfvUrYPJk4KyzLKnlj1VOd/7IxdeMVXuoujVzZfG9vakFGrBP2sq2NEkV6kBxQRKr9q1R99q1wOmnA/IRuHvuAU45xaUH/ZSJlTdXwPb5oZkr7dWUjkgD9klb2ZYmqTg5KeHnqB4r86Z0y7edzzwz/cbzCSfkgFJglVh504Dtk0IzV9qroQH7ZFpYW5qk4uRUWLeUDBwr88Z0ywNXdV+0eukl/x/ZcOm9WHnTgF16N1sZzVyZrSVdaa6Adfy81tYkFScnr12VNBYr84a6V64E+vRJN1bo398/R9cWY+W9NeWKa18VXU4zVxatrX58GrBP2sq2NEnFyUkJP0f1WJnX111bm+7nu3AhIK+5H3ZYDhCeqsTKmwZsnyCaudJeDS9B+2RaWFuapOLkVFi3bLWXoN9+G/jqV4GXXwYefhjo3t0/wywtMsez0LIpGypzzVxpQ8YtClfAbpyCKKVJqlAHigvYWLXHpvu114BRo4CamlXo1asl5AtXjz8OPPIIcOCBLj1V2TKx8a5PK1btoerWzJU+s5gG7JO2si1NUoU6UFyQxKo9Jt1ivl27AnLJWT6ysd12wM47p087H3WUSy9VvkxMvBvSilV7qLo1c6XPTKYB+6StbEuTVKEOFBcksWqPSffgwcDEian51h1iwtXVwPjxLr1U+TIx8aYBF5svmrmyWGWbR6cB+6StbEuTVJyclPBzVI+JudzfnT9/y5Ps1g2YNy/HyVegSky8acDFJohmrixWGQ3YJ1/TtjRJxcnJtCucgsXE/OijgVmzNj8tWQHL957HjXM63YoXiok3DbjYdNHMlcUqowH75GvaliapODmZdoVTsFiYv/56+mGNqqr0EnTdPeDWrYEFC4B27ZxOt+KFYuHdGKhYtYeqWzNX+kxkXoL2RHvhwoUYNGgQmjVrhg0bNuCGG25Ajx49cN1112HatGmoqqrCuHHjcIBsrFri0CRVqAPFBX+s2kPXvWoV8LGPAdtvDzz7bPrQ1Y9/DMyevQq9e7fE8OHxmK/kUei8m8r1WLWHqlszV7rMSVZlaMBWJMvEWb58OVq0aIE2bdrg+eefT3ZOmjRpEqqrq1FTU4MlS5YkOyvNmTOHBtyAQKiDvFzqhKz71VfTr1vJe77XXrv5mYSse2s0sZj/eAg1V2jA5WanYn9ftUGWmYEeL730Evr164ezzjoLK1aswLBhwxKlnTp1wlNPPYUddtihUeWapAp1oLh0UazaQ9Ut7/aefDLQsmW6q1HnzjRglzwsskyouVLunEPVrZkry52z5e+5Arak6RDrww8/xPHHH4+hQ4di/vz5aNu2Lc4777ykZs+ePTF16lTsscceGyNNnjwZ8iPH0qVLMWXKFIdWtixSW1uL1nJTL8IjVu0h6n7wwba49tp90LnzSlxzzfNo02bdFhkRom6XtI1Vt5xbrNpD1T1y5EjMavhUoUsSeS5DA/YIfP369TjzzDNxxBFH4Pzzz8dtt9222Qq4c+fOiSlzBcwVWVFp2a8f0Lw5cOutQIsWjbcS6qqmHJNYdct5xao9VN1cAZcbLcX+PrhL0HJFXO7x7rfffrjsssuSs1+8eHHyYNbs2bPx4osvon///nhcrg+WODRJFepAcUmDWLWHonvFCuDpp4EjjgDWrUu/ciVPPJc6QtHtkhv1y8SqmwactafLl9fMleWj25XgCtiOZZORHnjgAZxyyik45JBDknK77rorfvOb32DMmDGYPn168hT02LFj0aVLFxpwAwKxTqwh6JaNFORhq3feAWQf3x13LJ/wIegur3LLErHqpgHn6e2m69CA7ZlmiRjcCjiLeK6ANycQ68Raad2PPQZ885vALrsAM2YAHTu6ZWGldbuppAHn5WRZL9RcoQFb9nL2WDTgrWQVydVB9uSXGrKJwumnA0ceCdx7r1xxcY8T6qRa7gxi1c0cL9ez2X9PA87OzLIGDZgGbJlPuWJV0hBeeQX42c+Aq69OH7rKclRSdxadDcvGqpsGrOn1xuvSgO2ZZolIA6YBZ8mXQsr6NoT33kPy9arRo4E2bfKfkm/d+ZVuXjNW3TRgqwzYFIcGbM80S0QaMA04S74UUtanIbzwQvqw1fLlwEMPAT165D8ln7rzq9yyZqy6acCWWZDGogHbM80SkQZMA86SL4WU9WUIM2cC3/oW8KlPpQ9b7buv7nR86dappAFb88sTL9RcoQHn6U27OjRgGrBdNuWM5GNykp2MPvc5oFcv4Ne/1l16rjtNH7pzIm2yWqy6uQK2zwYasD3TLBFpwDTgLPlSSNkiDOG114BRo4C5c9PLzCNGAC++mH5kQ3Y1sjiK0G2hq1yMWHXTgMv1bPbf04CzM7OsQQOmAVvmU65Y1oYg5tu1KyAPW61fn37NSt7xtd6z11p3Lng5KsWqmwaco7PLVKEB2zPNEpEGTAPOki+FlLU2hMGDgQkTUvOtO+SzktXVwPjxdqdgrdtOWdORYtVNA7bPEBqwPdMsEWnANOAs+VJIWWtD2GcfQD4t2fDo1g2YN8/uFKx12ymjAfti6dpOqLlCA3btwWLK0YBpwMVkVoaolpOT7G69996AXIauv9O1rIAHDgTGjcsgrExRS912qspHilU3V8Dl+zZrCRpwVmK25WnANGDbjMoRzcIQ5H7vkiXpA1fyru+hh8rescBHH6W7GskWz7wHnHaOBe8c3WxSJVbtoeqmAZukZe4gNGAacO7ksaqonZwWLgROOild8T7/fPqUs6yA5UtXdU9By5ev2rWzUhy3kWl521LMFi1W7aHqpgFnyz/r0jRgGrB1TmWOp5mcfvMb4Jxz0svO998PyP1fX4dGty+NjbUTq+6YV++hMqcBV3IkAjRgGnBlM1BxSfSWW4ALLgBOOQX4xS+Ali39nkqok2o5CrHqpgGX69nsv6cBZ2dmWYMGTAO2zKdcsfIawnPPAQ8+CAwblr7r6/vIq9u3zobtxaqbBmyfOTRge6ZZItKAacBZ8qWQslkMYdEi4KqrgDvuAHbcsRA5zkGz6HYO6qFgrLppwPbJQQO2Z5olIg2YBpwlXwop62oIv/0t0Ldv+jDVH/4A7LVXIXKcg7rqdg7oqWCsumnA9glCA7ZnmiUiDZgGnCVfCilbzhDki1ay6v3hD4GTTwYmTQJatSpESqag5XRnCuaxcKy6acD2SUIDtmeaJSINmAacJV8KKVvOEGbPBo4+Grj66nRThUrc723sxMvpLgSWQdBYddOADTq/QQgasD3TLBFpwDTgLPlSSNlShvDmm8Duu6dNyr3f/fcvpPncQWM1slh104Bzp2rJijRge6ZZItKAacBZ8qWQso0ZwowZwFlnAbfemv5viEesRharbhqw/SigAdszzRKRBkwDzpIvhZStbwhyv/eaa4D/+Z/061aTJwM771xIs+qgsRpZrLppwOqU3SIADdieaZaINGAacJZ8KaRsnSH8+9/panfatPSBq8svB5o1K6RJk6CxGlmsumnAJmm7WRAasD3TLBFpwDTgLPliWla+1zxqFFBTswq9erXExRcD3/9+umvRCSeYNlVIsFiNLFbdNGD7NKYB2zPNEpEGTAPOki9mZcV8u3bdtGORrHTbtLHfschMcCOBYjWyWHXTgO2zmQZszzRLRBowDThLvpiVHTwYmDgx3S6w7pBtA6urgfHjzZopNFCsRharbhqwfTrTgO2ZZolIA6YBZ8kXs7IHHZSudhse3boB8+aZNVNooFiNLFbdNGD7dKYB2zPNEpEGTAPOki9mZT/72XTP3vqHrIDl/u+4cWbNFBooViOLVTcN2D6dacD2TLNEpAHTgLPki7rshg3pl6zku86yj++qVellaDHf1q15D1gN2CEADdgBknGRUJnTgI07OmM4GjANOGPK5C9+992A/Nx/P9C8eboCHj0amD17FXr3bonhw9ONFmI5Qp1Uy/GLVTdXwOV6NvvvacDZmVnWCM6ADz/8cCxatAhDhgzBlVdemZzrK6+8gi5duiQ/cgwdOhR9+vQpyUGTVJycLNMrjSUf15B3esVszz4b+PnPgR122NROrMyp2z5XykUk83KEsv1eM1dma0lXuqoqlC/A686jYe3gDPj111/Ho48+mphufQPu168fampqnM5ek1SxDvBQVwcrV6ZbCE6fDowZg+Rd34ZDKVbm1O00HE0LkbkpTmjmSlslTUejAXukPWnSpC0MuEePHujYsSPatWuHG2+8EbvtthtXwA0IhDg5ydaBF1yQXno+/vjGuyxE3S7pTt0ulGzLkLktTxqwLc+s0YJbAcsJNDTgDz74AGvXrkWrVq0wYcIEzJkzB3feeScNOGADfv114DOfAeShq2XLgL32Kp2anFSzDltd+Vh5h3qVx6U3QmVOA3bpveLKRGHA9U9/9erVkNXwwoULN6MyefJkyI8cS5cuxZQpU3JRq62tRWt5HDfCIxTtDzzQFtdfvw+uvfbv6NGjtizJUHSXFdqgAHVnJaYvT+Z6hvUjjBw5ErNmzbINWkA0XoIuAGqpkA1XwPUH3YwZM5IV8n333ccVcGAr4HXr0nu8N90EDBoE3HJL+rRzuSPU1QF1lyPg//fMFVvmXAHb8swaLbgV8DnnnIN58+bh/fffR4cOHTBz5kxMmzYNV111VXIJukWLFsll6Pbt29OAAzLg2lrg1FOBRx9NDfg739nyYatSHcZJNeuw1ZWPlbecdazaQ9VNA9aNJW3t4AxYe0JSX5NUoQ4UFy6V1C5bCcoORiNGAF/+sovaTWUqqTub0s1LU7eGXr66ZJ6PW6lamrnSVknT0XgJ2idtZVuapIp1gFdqdTBzZvqAVceO6QNXed7Wi5U5dSsHao7qZJ4DWhNVNHOlrRIasE+ehbalSapYB7hvAxazHTt20/69mu83x8qcugsdxo0GJ3Nb5pq50lYJDdgnz0Lb0iRVrAPcpwGvXQt873vpF62GDgWuvTb9lnPeI1bm1J23x/PXI/P87BqrqZkrbZXQgH3yLLQtTVLFOsB9GvBJJwEPPgjcdhvQv7++K2NlTt36vs8agcyzEmu6vGautFVCA/bJs9C2NEkV6wAvyoBlw4RRo9I9ert3Tx+yev55YKedgJ49bboxVubUbdP/WaKQeRZa5ctq5sry0e1K8CEsO5aFR9IkVawDvAgDFvPt2hWQV4xky0B5wGqXXey3DIyVOXUXPpS3aIDMbZlr5kpbJVwB++RZaFuapIp1gBdhwIMHAxMnpuZbd8i93upqYPx4uy6MlTl12+WAayQydyXlVk4zV7q1YFOKK2Abjl6iaJIq1gFehAEfcADw7LNbdlm3buklaasjVubUbZUB7nHI3J2VS0nNXOkS36oMDdiKpIc4mqSKdYAXYcCHHAL85S+bd5isgAcOBDSvHTVMgViZU7eHwdygCTK3Za6ZK22VNB2NBuyTtrItTVLFOsCtDHjFCkC+zS5POi9dCshqV/5NLkOL+co+FQsWAO3aKTupXvVYmVO3XQ64RiJzV1Ju5TRzpVsLNqVowDYcvUTRJFWsA9zCgP/0J6BvX+Ddd4GXX04fuJIHsUaPBubOBXr0AIYPtzVfC91ekqqRRmLNlVh1M1fsM10zV9qrKR2RBuyTtrItTVJti5PThx8CV12Vvm4kl53vugvo0EHZCRmqx8qcujN0slFRMjcC+Z8wmrnSVgkvQfvkWWhbmqSKdYBrVgc/+AEwZgxw5ZXAZZcB229faPdsETxW5tTtN080Oe5f6eYthpormrnSJ1OugH3SVralSapQB4oLkiza5VvOr74KyK6Ob78NvPQS8KUvubRiXyaLbvvW80ek7vzs8tYk87zkGq+nmSttlXAF7JNnoW1pkirWAZ5ldfDWW8B558neqqnxyoNVlTxiZU7d/rOGzG2Za+ZKWyU0YJ88C21Lk1SxDnBXA/7979PvN8tTzfKRjRNPLLQrnILHypy6nbrXtBCZm+JU7Z1uq4QG7JNnoW3RgBvH+5OfAMOGAV//OnDHHcDuuxfaDc7BOak6ozIpGCtv1z8yTSAZBwmVuWauNEbUZDjeA/ZJW9mWJqlCHSguSEppX7cufbBKvmr1xz8C3/lO+l3nUI5YmVO3/wwic1vmmrnSVglXwD55FtqWJqliHeCNrQ7kMrOseqdOBR5/HNhhh0Kx5w4eK3Pqzt3luSuSeW50jVbUzJW2SmjAPnkW2pYmqWId4A0NWD6gcfbZ6Yr3kkvS93xbtCgUe+7gsTKn7txdnrsimedGRwO2RWcSrWrDBnkhZes6tnUDvu8+YMAAYOed049qHHlk2P3LSdVv/8TKu7GrPH7J5W8tVOaauTI/jew1eQ84O7OK1dAkVagDpSmYstqVr1jV1KxCr14tIbsYySVn2TChTZuKdYNzwzEypxk4d69pQeaKKU4+BW2LM3M0roAbIIttgIv5du0KvPcesH59cRsmZM6sDBViY153atSdoZONipK5Ecj/hNEsVmyVNB2NK2CftJVtaZIqpgEuX7L69rcb3zKwuhoYP14J0lP1mJjXR0LdnhKkXjNkbstcM1faKqEB++RZaFuapAp9gK9cCbRqBcgGCm3bArW1QGN38WUbwXnzCsVsFjx05qVOlLrNUsA5EJk7o3IqqJkrnRowKsQVsBFIH2E0SRXiAJfLy/ffD9xzT/r5yGXL0nu7Tz4JTJgATJ6cftmq7pB9ewcOTO8Bx3CEyNyFG3W7ULItQ+a2PDVzpa0SroB98iy0LU1ShTTA5Z7uaacBv/1tuuI94gjgjDOAM88EdtopRVh3D1hWwmLCYr7ybecFC+z37S2q00JinuUcqTsLLZuyZG7DsS6KZq60VUID9smz0LY0SVXJAS4m+8gjqeGOHQs0bw4MHQrstVd6r/fTn24cm5jw6NHA7Nmr0Lt3SwwfHo/5yhlVkrkmEalbQy9fXTLPx61ULc1caauEBuyTZ6FtaZLK9wCX+7fysQy5vCxfrJKtATt2BH73O6BDh2yYfGvPpq50aeq2IukWJ1be/GPNrX+zlNLMlVna0ZblPWAtQY/1NUlVxORU956uPBTVvTuSFarc15X3deWbzF26pP8tl5tPP33Tv2dFVoT2rBrylKfuPNTy14mVNw04f59zBWzPziIi3wNuQNF6cmp4j1YMV37k/u7TTwMHHgi8+Wb6RHOzZroutdauU+Nem7rdWVmUjJU3Ddii9zePoVms2KspHZErYJ+0lW1pkkozOcnl5H/+E1iyBHjhhfQBKflv2Xe3/lPKYsDHHgtMm5buUmR1aLRbacgTh7rzUMtfJ1beNOD8fc4VsD07i4jBrYAPP/xwLFq0CEOGDMGVV1658Ryvu+46TJs2DVVVVRg3bhwOkOu3JY48Btzwc44jRpR+kEkuF4vBitHuuCNw8snAP/4BfP7zgLynK4eYbLt2wC67pCvdhkcR7+nGOrFSt8VQdo8RK28asHsfu5bMM1e6xrYsxxWwJc0mYr3++ut49NFH8corr2w04BdeeAHV1dWoqanBkiVLMGDAAMyZM8fMgEu9yvPLX6aG2qkT8IUvALLJweDBwL/+talpWcnKA1Oywr3+emC//YB99wX22Qf42MfS8g1XwEW9pxvrxErdngbXf5qJlTcN2D5PaMD2TLNEDG4FLOInTZq0mQHfdtttWLFiBYYNG5acW6dOnfDUU09hhxIb3GZNqsZMsj5EecXnssvSDe3lFSExWDHaz30u/SpVU4fP93RjnVipO8uQ1ZeNlTcNWN/3DSNknSvtFbhF5ArYjZNJqYYGPGrUKLRt2xbnnXdeEr9nz56YOnUq9thjj43tTZ48GfIjx9KlSzFlyhRnLQMGHIjFi1tuUb5du9UYP/5ZtG69zjlWYwXffLMFpkzZC4sWtcL++6/EWWf9H3bffa0qZmOVa2tr0Vq+whHZQd1+OyxW3kIpVu2h6h45ciRmzZrlNwFztEYDzgEtb5VyK+DOnTtj/vz5ha6Ai7pMnJeJS71YVzbU7dK7dmVi5c0VsF0O1EXiCtieaZaIUVyCXrx4MQYNGoTZs2fjxRdfRP/+/fG4bHhb4siaVD4vE2fpnKxlY51YqTtrT+vKx8qbBqzr98ZqZ50r7RW4ReQK2I2TutQ555yDefPm4f3330eHDh0wc+bMJOaYMWMwffr05CnosWPHoot8vcLIgCVM7J9z5OSkTr3MAWI1slh1M8czp2jZCjTgsogKLRDkClh7xpqk4uSkpZ+9fqzMqTt7X2trkLmW4Ob1NXOlrZKmo3EF7JO2si1NUsU6wLk6UCZNjuqx5kqsupnjOZK0TBXNXGmvpnREGrBP2sq2NEnFyUkJP0f1WJlTd47OVlYhcyXABtU1c6WtEq6AffIstC1NUsU6wLk6KDSlGg0ea67Eqps5bp/jmrnSXg1XwD6ZFtaWJqk4ORXWLSUDx8qcupkrrgRCzRXNXOl67hbleAnagqKnGJqkCnWguKCLVTt1u/SuXZlYeXMFbJcDdZE0c6W9Gq6AfTItrC1NUnFyKqxbuAL2j3arunROA7ZPIM1caa+GBuyTaWFtaZKKBlxYt9CA/aOlAZN5kwQ0c6VPtLwE7ZO2sq327dsnH/HIc7z55pvYfffd81SteJ1YtVO339SJlbdQilV7qLpffvnlZOOb0A8acOg9ZKQvlr8IGzvdWLVTt1HyOoaJlbecXqzaY9XtmFKFF6MBF444jAZiHiixaqduv7kfK28asN88Cak1GnBIvVGgFtnSUL5HHeMRq3bq9pttsfIWSrFqj1W338ws3RoNOJSeoA4SIAESIIFtigANeJvqbp4sCZAACZBAKARowKH0RA4dU6ZMwa233prUvOaaa3D00UdvjLJhwwZcdNFFmDt3LnbYYQf84he/wGc+8xl88MEHqK6uxtKlS7Hrrrsml77atGmDSy+9FDU1Ndh+++3RrVs33HTTTckWiUUclrrr9F1++eWQuEU++Wip+6OPPoJolv6R/3/llVfiyCOPLAJ3EtNSu2i+4IILkrxq1qwZ7rzzTuy1116FaM+je9asWYk+2WP7+eefh7w9IMd7772X3IZ55513sPfee2PChAnJORRxWOoOfWyW4u1zbBbRhz5i0oB9UC6gDZlMZML+y1/+gn//+9/o1asXnn76aWy33XZJaw8//HAyMcpEIGkUAH4AAAm2SURBVHsPiwH/8pe/xM9//nO89tpriWFPnDgxMeIf/ehHWLx4MT7/+c8ndU877TSce+65+MpXvmKu3Fq3CJTzkUnqz3/+c2EGbK37tttuw9q1a/G9733PnHHDgNbaTzrpJPz3f/93knOSVwsXLsRPfvIT8/PIq/vdd99FixYtcNxxx2HSpEkbDXjEiBHJa3znnXde8sfPZz/72eSPUevDWnfoY7MUb19j07r/fMajAfukbdjWQw89hOnTp29cActk89Of/hT77bdf0srw4cNx0EEH4Vvf+hZkNSzm+sILL+D000/H0KFD0aNHD7z11ls48cQT8cQTT2ym7KyzzkL//v03W1FbSS9C99lnnw2ZXL/2ta8VZsDWuuWJ3Z49e0I+kNKuXTvcfPPN2Hnnna0wbxbHWvvIkSPRtWtXnHzyyYnxrl+/Hpdccom59ry664TIHwj1DfjQQw9Nxsxuu+2WXHmQ8XL33XcHr7u+wBDHZine8u8+xqZ5B3oMSAP2CNuyKZk4/v73vycrWTnOPPNMDBkyBDLJyDFw4ECceuqp+PKXv5z8t/zlLy+ny6p23Lhx+NznPocPP/wQnTt3Tla/dYeslmVFLJeVirgEba37ySefxF133ZX8ISKXGou6BG2tW/4gkpXYsGHDEhN7++23MXr0aMsU2RjLWvszzzyDPn36oHXr1kkOSR/I/7c+8uouZQjyx6mMGbnNsmTJkmS8iMlbH9a6Qx+bpXj7GpvW/eczHg3YJ23DtvKuDppaAcvl7AsvvBC/+93v8IlPfMJQ7aZQ1rrlDwq5zN62bdtCDdhat/yhJPcg5Q+gRYsWJffrH3zwwSiYi/Ybbrgh+WNPbmv88Y9/hFxStz7yMi9lCDGvgEMem6V4+xqb1nnnMx4N2Cdtw7bq7jP99a9/Te4By/3g+veAZfKSyVHuAz/66KO4/fbbk8ttMlEuW7YMV111VfJvL730EkaNGpXUHTBgAGbMmIE999zTUOnmoSx1y2V2uYxbp/exxx6DXKITY7M+LHULb7kHuc8++ySX+uVBuAULFuDGG2+0lp3Es9YuRiZ/9Ij+Rx55JOF97733mmvPq7uUIUi+7LvvvsnzDXIZXR5KlCtF1oe17tDHZmO8V65c6W1sWvefz3g0YJ+0jdsScx0/fnwSVQz1i1/8In784x8nE7nc95UHZZ566qnkgZQ77rgjeehEnoKWS5+vvvpq8vSzTP677LILunfvjlWrVm38XrTcJ5bLjEUclrrr6yvyErS0Y6lbJmn5g0cuPe+4445JP8gqvqjDUvucOXOSe77yBLE8wf2zn/0MnTp1KkR6Ht3PPfdckvvz589PdMlzDnKpXx4Wkqeghb2MBXkIsainoC11hz42S/H2OTYLST4PQWnAHiCzCRIgARIgARJoSIAGzJwgARIgARIggQoQoAFXADqbJAESIAESIAEaMHOABEiABEiABCpAgAZcAehskgRIgARIgARowMwBEiABEiABEqgAARpwBaCzSRIgARIgARKgATMHSGAbIiDv7dbtmiU7Be2+++7J++DHHHNM8jlJ+ViLfKpR3g2/5ZZbku9Uyy5ZskFHx44dE1Lyfri8J97weP/993Hssccm/yyfBv3CF76wDZHlqZJAdgI04OzMWIMEtgoC/fr1g/zIpgW/+tWvkp2y5DOk8mGQP/zhD7jsssuSj1nIhzdkUwP5aeqQ3ajGjh2bfIGt/iGmX7dL11YBjidBAkYEaMBGIBmGBGIjUN+A5bu9F1988WZbUB522GG4/vrrk6+nlTNgWf3KJyrffPPNZKUs5b/5zW/igAMOwIoVK5Ldns4///zka2uyyYd8ElU2BHn88ceTz3LKv33qU59KtjeUPwB4kMC2QIAGvC30Ms+RBBohUN+A999/f9x///0bLzNLcbnsLFsOyicy61+Cll2b6nbdqh9WLlXXGbXsSiXbYcq3xuVy9hlnnIHBgwfjiCOOgOymdOWVV+I3v/kNunTpgtmzZ2PXXXfFTTfdlISTDUF4kMC2QIAGvC30Ms+RBMoYsHYFLOEbGnDfvn2Ty9dyyDeZZR/eukNWvLKBg2yOICYsx5o1a9C7d+/CtmVkEpBAaARowKH1CPWQgCcC9VfA8vCVbE5Q/x6wbLgguzS53gNuaMASX/6tbjUtD2596UtfSv577dq1aN68Obp165asgOv2E5Z/l81DeJDAtkCABrwt9DLPkQTKrIDl13IJWB7GEmOUJ6Plvq3sMFXfWJsC2ZQBv/HGGxgyZAhqa2uxfv16fP3rX092VHriiSdwxRVXJP8mx6WXXoqvfvWr7C8S2CYI0IC3iW7mSZIACZAACYRGgAYcWo9QDwlEQEDuGcvl4rpD3heWPXB5kAAJuBOgAbuzYkkSIAESIAESMCNAAzZDyUAkQAIkQAIk4E6ABuzOiiVJgARIgARIwIwADdgMJQORAAmQAAmQgDsBGrA7K5YkARIgARIgATMCNGAzlAxEAiRAAiRAAu4EtloDdkfAkiRAAiRAAiRAAlYEqqwCMQ4JkAAJkAAJkIA7ARqwOyuWJAESIAESIAEzAjRgM5QMRAIkQAIkQALuBGjA7qxYkgRIgARIgATMCNCAzVAyEAmQAAmQAAm4E6ABu7NiSRIgARIgARIwI0ADNkPJQCRAAiRAAiTgToAG7M6KJUmABEiABEjAjAAN2AwlA5EACZAACZCAOwEasDsrliQBEiABEiABMwI0YDOUDEQCJEACJEAC7gRowO6sWJIESIAESIAEzAjQgM1QMhAJkAAJkAAJuBOgAbuzYkkSIAESIAESMCNAAzZDyUAkQAIkQAIk4E6ABuzOiiVJgARIgARIwIwADdgMJQORAAmQAAmQgDsBGrA7K5YkARIgARIgATMCNGAzlAxEAiRAAiRAAu4EaMDurFiSBEiABEiABMwI0IDNUDIQCZAACZAACbgToAG7s2JJEiABEiABEjAjQAM2Q8lAJEACJEACJOBOgAbszoolSYAESIAESMCMAA3YDCUDkQAJkAAJkIA7ARqwOyuWJAESIAESIAEzAjRgM5QMRAIkQAIkQALuBGjA7qxYkgRIgARIgATMCNCAzVAyEAmQAAmQAAm4E6ABu7NiSRIgARIgARIwI0ADNkPJQCRAAiRAAiTgToAG7M6KJUmABEiABEjAjAAN2AwlA5EACZAACZCAOwEasDsrliQBEiABEiABMwI0YDOUDEQCJEACJEAC7gRowO6sWJIESIAESIAEzAjQgM1QMhAJkAAJkAAJuBOgAbuzYkkSIAESIAESMCNAAzZDyUAkQAIkQAIk4E7g/wH3RJUqizR+IwAAAABJRU5ErkJggg==\" width=\"719.9999785423286\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"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(990), y=np.arange(950), 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",
"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": 136,
"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(\"<div id='\" + id + \"'></div>\");\n if (!fig.cell_info) {\n console.error('Failed to find cell for figure', id, fig);\n return;\n }\n fig.cell_info[0].output_area.element.on(\n 'cleared',\n { fig: fig },\n fig._remove_fig_handler\n );\n};\n\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 '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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 '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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 = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n // Add the status bar.\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message pull-right';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n\n // Add the close button to the window.\n var buttongrp = document.createElement('div');\n buttongrp.classList = 'btn-group inline pull-right';\n button = document.createElement('button');\n button.classList = 'btn btn-mini btn-primary';\n button.href = '#';\n button.title = 'Stop Interaction';\n button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n button.addEventListener('click', function (_evt) {\n fig.handle_close(fig, {});\n });\n button.addEventListener(\n 'mouseover',\n on_mouseover_closure('Stop Interaction')\n );\n buttongrp.appendChild(button);\n var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n titlebar.insertBefore(buttongrp, titlebar.firstChild);\n};\n\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": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAasAAAFACAYAAAACklMsAAAAAXNSR0IArs4c6QAAIABJREFUeF7tXQm8VVP7fu5tlOqWT6lwyxBR0khJk/BHg4/QPE830kQhRSKkQZHSIE1fQimllEbySTQZmhRN+iqFbqNS9/5/7zr3XKfbOWevvdda++xz97t+v/sz3LXetd7nedd67lp7DQnp6enp4MQIMAKMACPACHgUgQRKLFYeZYebxQgwAowAIyAQYLHiQGAEGAFGgBHwPAIsVp6niBvICDACjAAjwGLFMcAIMAKMACPgeQRYrDxPETeQEWAEGAFGgMWKY4ARYAQYAUbA8wiwWHmeIm4gI8AIMAKMAIsVxwAjwAgwAoyA5xFgsfI8RdxARoARYAQYgbgRq1KlSuHqq69WYuzYsWMoUKCAko1YF2YfYs1AoH7mgXnQhYDfY+mXX37Brl27LOGMG7G64447sHz5ckuHomX473//ixo1aijZiHVh9iHWDATqZx6YB10I+D2WZMd2FitdEeeSHb8HtkswW1bDPFhC5EoG5sEVmC0rUeGBxSoMvCqAWrLlUgb2wSWgLaphHpgHXQj4PZZYrFisdPUl7Xb83jm1A+rQIPPgEDjNxfzOgy/E6ujRozh06BDOnj1LN/JahtDJkyeRL18+y3xezsA+eIMdVR7oVZ6cOXOiSJEiKFiwYEyc8vsgGRPQ+Y/oCxDwhVj99NNPKFmyJPLkySMVd8ePH0f+/Pml8no1E/vgDWZ08HD69Gns3r0b1113XUycYrGKCewXVOp3HnwjVnY6uo4BJtbhzT7EmoFA/bp4oD+47MSwTu/9PkjqxFLFlt95YLEKEz26Bhgy3a1bN3z33Xfo2rUr5s2bh5kzZ4qzAhs3bsS///1vy9hNS0sTs8JOnTrhueees8wfzDB58mRMnToVtIxE9fTo0UMshbZp0wanTp3Cv/71L0yaNOm8paX+/ftj+vTpF5xlaNmyJX799VesXLlSLKU2aNBAnB86d+6c8ItsUqIzbvRDiQKL2kv1d+/eHd9++y3IlxYtWoi2hCZqT9u2bXHgwAGx/Dpx4kRcfvnlmQP9hAkT0LlzZ2GL0ltvvSVwpFSoUCHR5qSkpIjYhLaL2jBlyhRcddVVllg+8cQT+PDDD8W5PfI9mJYtWwbCKsgv+RSa6OjEoEGDxP86ceIE6HzI77//jj/++APNmjXDX3/9BZotvfLKK6hbty5GjhyJGTNmIG/evMJv4i7rKgCLlSVdUTP4faBXQ09faRUeWKwMixUNijt37jyvFhr4aECiH6v02Wef4aOPPhKD/bp166yyi99v2bIFAwYMwAcffIDExMTMMr169UKFChWEuNCAvWPHDrz44ovi93v27MFTTz2F1atXnydW33zzjRhU//zzTzFg02BPg++1114rBtyyZcsKMb744ouFUGU9tEeiTPWuWLFCCN0NN9wg/Aj9/jJq1CgcOXIEzz//PD7//HMhVtOmTRNiRQLVpEkTbNq0SSyFUTpz5gxy584t/p38vPTSSy8QwFCgQttFAk5tGjFihCWW+/btEz62b98+U6xIoAlDwoJ8vvXWW0WbSTTDpXHjxuGHH37A6NGjhSiRnwMHDhQx8fDDD2Pt2rXYvn27wJO+pz799NNCHEmcQxOLlSVdLFZqELlSmsUqBOZw6mu3o+uaWXXp0kWIQrVq1cRARTMcGszr168vBuwyZcqI2QcNvjSroNlF1tSqVSshIm+88Yb4/W233WYZVPRX/d69e4UA5ciRA8OHDxcicd9994lBmuolQevYsaM4tEqpdevW6NevH+65557zBIfaSvZolhE6u6AyJFy0NEWD8UUXXSQGWZoFkpCQwFWqVAmHDx9G8+bN8cknn4gZHR22pgGaZhHB9Oijj6JRo0aibspDAzcJBfHw8ssvo169eujQoUPY0+u9e/cWMz3iPVIKFSvCkWY4JBgyifgi3IO+b9u2DVTnggULRPHHHnsM999/P+6+++6w5mrXro2hQ4filltuwZIlS0Q5igXCgLhfuHDheeVoxkZ/4JC/LFYyDMnlURkk5Wown8vvPvhyZrV/P0A/oalwYYBWhv76C1i79sLdgJUqBXJv20ZLO4F/L1488BMthQ6UwX+XnVnRYN2wYUMxK1mzZo2YiY0dO1Ysv9EAnjXdeOONGDNmDEgkSazmz5+P9evXo2fPnkKUnnnmGbH89+STT2LYsGFiBrN161Z8/fXXYiZDy2uh7X3//ffFbOaRRx45b8AO1kszIZotDR48WPwvEiaa5dBMi2ZDJIiUHn/8cbEESrOUF154ASkpKec1nWYfP/74I958803MmjULtOxIS2WbN28Wy200s8w6a6PZ2Pjx48VGGBJC2i0XKQWXAWlnHi1n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\" width=\"640.4999809116131\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"T = 0.858 ± 0.004 uK\n"
]
}
],
"source": [
"def expansion(x, A, B):\n",
" return np.sqrt(A*x*x+B)\n",
"\n",
"val_truncated = val_mean[2:]\n",
"std_mean_truncated = std_mean[2:]\n",
"\n",
"fitModel_temperature = NewFitModel(expansion)\n",
"fitAnalyser_temperature = FitAnalyser(fitModel_temperature, fitDim=1)\n",
"\n",
"params = fitAnalyser_temperature.fitModel.make_params()\n",
"params.add(name=\"A\", value= 1e6, max = np.inf, min = 1, vary = True)\n",
"params.add(name=\"B\", value= 1000, max = np.inf, min = 0, vary = True)\n",
"\n",
"fitResult_temperature = fitAnalyser_temperature.fit(val_truncated, params, x='TOF_free', dask=\"parallelized\")\n",
"\n",
"val = fitAnalyser_temperature.get_fit_value(fitResult_temperature)\n",
"std = fitAnalyser_temperature.get_fit_std(fitResult_temperature)\n",
"\n",
"fit_vals = tuple([val['A'].item(), val['B'].item()])\n",
"fit_vals_std = tuple([std['A'].item(), std['B'].item()])\n",
"\n",
"tof = (np.arange(2,16,0.1)*1e-3)\n",
"\n",
"fig = plt.figure()\n",
"ax = fig.gca()\n",
"val_mean.plot.errorbar(ax=ax, yerr=std_mean, fmt='or')\n",
"plt.plot(tof, expansion(tof, *fit_vals), 'b--',\n",
" label='fit: A=%.3f, B=%.3f' % tuple(fit_vals))\n",
"plt.xlabel('TOF (s)')\n",
"plt.ylabel('Cloud Width - Vertical (pixels)')\n",
"# plt.ylabel('Cloud Width - Horizontal (pixels)')\n",
"plt.tight_layout()\n",
"plt.grid(visible=1)\n",
"plt.legend()\n",
"\n",
"\n",
"m = 164*1.673e-27\n",
"kb = 1.38e-23\n",
"pixel = 5.86e-6\n",
"M = 2.3513\n",
"\n",
"T = fit_vals[0] * (m/kb) * ((pixel*pixel)/(M*M)) / (1e-6)\n",
"dT = fit_vals_std[0] * (m/kb) * ((pixel*pixel)/(M*M)) / (1e-6)\n",
"\n",
"print('T = %.3f \\u00B1 %.3f uK'% tuple([T,dT]))"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## Measure temperature at the end of evaporative cooling 2, truncation 0.675"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The detected scaning axes and values are: \n",
"\n",
"{'TOF_free': array([0.002, 0.003, 0.004, 0.005, 0.006, 0.007, 0.008, 0.009, 0.01 ,\n",
" 0.011, 0.012, 0.013, 0.014, 0.015]), 'runs': array([0., 1., 2.])}\n"
]
},
{
"data": {
"image/png": "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tX//fo9+Doej1p+4uDhTfZcuXer1/IWFhZo0aZKioqIUGhqqpKQk5ebmNuo2o+XgRqFozqx4IjfgTwMGSN26Vb2H++JwSLGxVf2aUlDTPp235557TkVFRZo1a5bi4+N18uRJPf300+rfv7+2bdumIUOGSJJ2797tte7evXs1e/ZsjR492mvZuHHj9NBDD3m0de/e3eNxeXm5hg4dqrNnz2rFihWKjo5WZmamUlJStH37dg0cONCPWwoAzUddJ3I7HFUnco8cKbVu3eTTA/yidWtpxYqqf4w4HJ6v9+pAt3x507/GAx7eMjMzFR0d7dGWkpKinj17asmSJe7w1r9/f691//SnP8nhcOiXv/yl17JOnTr5XKemrKws5efna9euXUpKSpIkDR48WAkJCUpLS9PevXsbulkA0KzV50TuQYOabFqA340ZI732mjRzpude5m7dqoLbmDFNP6eAHza9NLhJUnh4uOLj43X06NFa1zt37pw2bNiggQMHqmfPng167k2bNumGG25wBzdJCgoK0sSJE/Xhhx+q4NJjAQAQYFa5y7tVT+QGGsOYMdInn3z3+J13pCNHAhPcJAvsefPl22+/1YEDB9x73Xx59dVXVVJSotTUVJ/L169fr6ysLF28eFG9evXS9OnTNXnyZI8++fn5GuDjQHWfPn0kSYcOHVLXrl19jl9eXq7y8nL34+LiYkmSy+WSy+W6/AY2QPWYjTF2c2K1OpWVSVKwJGnHjgrddpthmUNIVquVVVmpTps2OfTAA60lVR2vGT5c6trV0DPPVGr0aB/HLxtRx44OmfkI6dixQi5X085Nkqr+dwX/63eXLPC/z5Jzkqw8L+v87UnSxYtSdZ2Skly6eLG6zX/Mbqslw9u0adNUUlKi+fPn19onKytLHTp00NixY72WTZgwQXfeeadiY2NVWFiorKwsTZkyRZ9//rkef/xxd7+ioiJFRER4rV/dVlRUVOvzP/HEE8rIyPBqz87OVmho6GW370rk5OQ02tjNiRXqtHt3jF54obeq/9hHjAhSZOR5paYeVFKSdXZHWKFWklRW1lr33HOXJOnVV99S27bWut9EoOu0e3eMnnzyFq/2ggLp7rtb67e/3dekr6vKSikyMllFRW1VHSY9GYqKOq/i4hy9806TTcutrKy1pKrX07Zt2yzxeqo5p7y8PEvMSbJmrWoK9N9e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MmVkZKi0tNT9DQhhYWHKyMjQgw8+6JcJAgAA4DsNDm8vvfSS0tLSdMcdd2jSpEnq0qWLjh8/rjVr1ujhhx9Wx44dde+99/pzrgAAAC1eg8Pb7373O02YMEFr1671aB8/frwmTpyo3/3ud4Q3AAAAP2vwJaGHDx/WxIkTfS6bOHGi/vGPfzR4UgAAAPCtweEtJCREp0+f9rns9OnTCgkJafCkAAAA4FuDw9uAAQOUnp6u48ePe7SfOHFCjz32mH76059e8eQAAADgqcHnvC1ZskQ/+tGP1LNnTw0dOlQxMTH6+uuvlZeXp+DgYG3cuNGf8wQAAICuYM/bjTfeqH379mnkyJHat2+fVq1apX379mnUqFH68MMPFR8f7895AgAAQFd4n7frr79er7zyir/mAgAAgDrUe8/bwYMHdezYsVqXHzt2TAcPHryiSQEAAMC3eoW39957T4mJifrmm29q7fPNN98oMTFR27Ztu+LJAQAAwFO9wltmZqbGjRunxMTEWvskJibq7rvv1osvvnjFkwMAAICneoW3Dz74QKNGjaqz389+9jPt2bOnoXMCAABALeoV3k6ePKmuXbvW2S8mJkaFhYUNnhQAAAB8q1d4CwsLq/VbFWo6c+aMQkNDGzwpAAAA+Fav8HbjjTdq69atdfbbsmWLbrzxxgZPCgCA5iYsTLpwwaXXX39DYWGBng3srF7h7e6771ZWVpbefffdWvvs2LFDq1at0s9//vMrnhwAAAA81esmvb/61a+0evVqJScnKzU1VSNHjtS1114rSTpy5Ihef/11ZWVlKSEhQVOnTm2UCQMAALRk9Qpvbdq00bZt23Tvvffqueee0x//+EeP5YZh6I477tBLL72kNm3a+HWiAAAAaMDXY0VGRuqdd97R/v37lZ2draNHj0qSunfvrttvv1033XST3ycJAACAKg3+btPExMTL3qwXAAAA/lev8NanTx/TfR0Oh/7rv/6r3hMCAABA7eoV3iIiIuRwOC7b55///Kf2799fZz8AAADUX73C286dO2tdVlFRoeeff16PPfaYHA6HJkyYcKVzAwAAwCXqdZ+32mzYsEHx8fGaMWOGEhIStH//fr388sv+GBoAAAA1XFF427lzp/r166e7775b7du3V3Z2trZt26a+ffv6aXoAAACoqUHh7eDBgxo+fLiGDh2qoqIirV+/Xh99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A82qddq3b59Hv2effdaQZHzyySf12j5/aYo6XepyH7SLFi0yJBlff/21R/uuXbtM7blpTFarVW1awvv5pczUyYrv5/7COW9+lp+frx/84AcKCvL82tg+ffq4l19u3ep+vtY9dOiQxxi19b3cc0hSRUWF3n//fd14442X7deYrFin8+fP65e//KVmz56tm2++uR5b07isVqv33ntPklRZWamf/OQnatOmja6++mr9/Oc/1/Hjx+uzaX5ltTqNGjVK3bt310MPPaRDhw7pn//8p9577z0tXbpUI0aM0A9+8IN6bqF/NEWd6jufjh07qnPnzvWeT2OzWq18aSnv5/Vl1fdzfyG8+VlRUZEiIiK82qvbLneistl1q/9bW9+6ToZOT0/X//7v/+rRRx+9bL/GZMU6LVy4UJWVlcrIyDC5FU3DarUqKCiQJI0dO1Y//vGPtW3bNi1dulQ5OTkaOHCgSktLzW6aX1mtTldddZX27Nkjl8ulXr16qV27dho4cKD69eunDRs21GPL/Ksp6uSP+YSFhalNmzYBvbjDarXypaW8n9eXVd/P/SWo7i6or8tdAVPX1TH1Wbe2vpcb48UXX9TixYv10EMPaeTIkZedS2OzUp0+/PBDLV++XFu3blVISMhlnzsQrFSrixcvSpLuvvtuPfnkk5KkwYMHq3Pnzho1apTWr1+v1NTUy86psVipTmfOnNHIkSNVWlqqdevWKTY2Vvn5+Xr88cf1s5/9TG+//bbXnoqm0lR1aor5NDar1aqmlvh+bobV38/9gfDmZ5GRkT7/pXD69GlJvv/FXt91IyMjJfn+F8np06drfY5Vq1bp17/+tX71q1/pqaeeqmNLGpfV6jRlyhSNGTNGP/zhD3X27FlJUllZmSSpuLhYTqdT7dq1M7Npfme1WlX3vf322z363X777XI4HDpw4MBlt6exWK1OTz75pD7++GN9+eWXiomJkSQNGDBAcXFxGjJkiNatW6f77rvP7Ob5TVPUqb7z+fjjj73aS0pKdOHChQaN6S9Wq1VNLe39vD6s/H7uLxw29bPevXvrH//4hyoqKjzaDx48KEnq1avXZdet7ne5dav/W1tfX8+xatUqpaam6r777tMf//jHgP9r1mp1OnTokDZs2KCrr77a/VO9V+m6667TgAED6rN5fmW1Wvk6P6WmVq0C87ZitTp9/PHH6tq1qzu4VbvlllskBe5crqaoU33nc/LkSZ04ccJvY/qL1WpVrSW+n9eHld/P/SbQV0w0N++8844hyXj11Vc92lNSUuq8ZLr6KrQ9e/a421wul3HjjTca/fr18+h76623Gr169fIYb/fu3YYk47nnnvPou2rVKqNVq1bGL37xi4DeW6omq9Vpx44dXj/33XefIcl4/fXXva4YbEpWq9U//vEPw+FwGFOnTvVYf+PGjYYk4+WXX27Qdl4pq9Vp8uTJRlBQkNfVctnZ2YYkY/ny5Q3azivVVHWqycytQpYuXerR/utf/zrgtwqxWq0Mo2W/n9d0uTpZ+f3cXwhvjWDYsGHG1VdfbTz//PNGXl6eMXXqVEOSsXbtWnefKVOmGK1btza++OILd1tZWZlx4403GrGxsca6deuMnJwcY/To0T5vVrhjxw4jKCjIGD16tJGTk2OsW7fOiI2N9bpR6F//+lejVatWxs0332x88MEHxu7duz1+artRbVOwUp18sdKl5Var1fTp041WrVoZDz74oJGTk2NkZmYaV199tXHTTTcZ5eXljVuMy7BSnT766COjTZs2xg9+8ANjzZo1Rl5envH73//eiI6ONjp16hTQ11VT1OmLL74wNmzYYGzYsMFISUkxJLkfX/rhWX2T3qeeesrYuXOnMW/ePEvdpNcqtWrp7+f1eU1dykrv5/5AeGsE586dM2bOnGl07tzZaNOmjdGnTx/jlVde8ehT/a+AI0eOeLSfOHHC+MUvfmFEREQYbdu2Nfr372/k5OT4fJ7s7Gyjf//+Rtu2bY2IiAjjF7/4hddNHKufp7afS5+/KVmpTr5Y6Y/darWqqKgwli5davTs2dMIDg42YmJijN/85jfGmTNn/LXJDWK1Oh04cMAYPXq00a1bN8PpdBrf+973jNTUVOOrr77y2zY3RFPUadWqVbW+79x3330efS9cuGA8+uijRvfu3Y02bdoY119/vfH73//e35vdIFaqVUt/P6/Pa+pSVno/9weHYRhGQw63AgAAoOlxwQIAAICNEN4AAABshPAGAABgI4Q3AAAAGyG8AQAA2AjhDQAAwEYIbwAAADZCeAMAALARwhuAFsnhcJj62blzp3udo0ePavr06bruuuvUtm1bXX311Ro0aJDWrVunS+93/sUXX9Q65g9/+ENTc3zssccUHx+vixcvmt6u3NxchYeHq6CgwPQ6AOyFb1gA0CLt2bPH4/Hjjz+uHTt2KC8vz6M9Pj5e7du31wcffKC77rpL4eHhevjhh9WnTx99++23+utf/6r169fr7rvv1vr169WqVdW/ib/44gtde+21mjFjhiZMmOAxZnh4uHr16nXZ+R0/flzXX3+9Vq9erXHjxtVr24YMGaLY2FitWbOmXusBsIegQE8AAAKhf//+Ho87duyoVq1aebVL0tmzZzVmzBhdddVV2rt3rzp16uReNnLkSPXp00dz5sxR3759NWfOHI91u3fv7nPMuqxYsUIdOnTQmDFj6r3utGnTdPfdd2vRokWKjY2t9/oArI3DpgBQhxdffFGFhYVaunSpR3CrlpaWpri4OD311FNyuVxX/HwXLlxQVlaWJkyY4N6TV+25555TQkKCwsPD1a5dO8XFxWnevHkefUaMGKHw8HC98MILVzwXANZDeAOAOuTk5Kh169YaMWKEz+UOh0M/+9nPdPr0ae3fv99j2cWLF1VRUeHxU9fZKnv37lVRUZEGDx7s0f7qq6/q/vvv18CBA7Vp0ya9/vrreuCBB1RSUuLRr02bNvrRj36kt99+uwFbC8DqCG8AUIevvvpKHTt2VFhYWK19rr32Wnffmn77298qODjY4yc3N/eyz7d7925J0s033+zR/sEHH6hDhw76/e9/r2HDhmno0KH69a9/rRUrVniNcfPNN+vjjz/2CnYA7I/wBgB+UL03zeFweLTPmjVL+/bt8/jp16/fZcc6fvy4HA6HoqKiPNpvvfVWnT17Vj//+c/1xhtv6NSpU7WOER0drYsXL+rEiRMN3CIAVsUFCwBQh+7du+t//ud/VFJSUuvety+++EKSvC4Q6Natm+lbg1Q7f/68goOD1bp1a4/2e++9VxUVFXrhhRc0duxYXbx4UbfccosWLVqkYcOGefRt27ateywAzQt73gCgDsOGDVNlZaU2b97sc7lhGHrzzTcVERGhxMTEK36+qKgoXbhwwechz8mTJ2vXrl369ttv9fbbb8swDN1111368ssvPfqdPn3aPRaA5oXwBgB1SE1NVXR0tObOnavCwkKv5f/xH/+hw4cPKy0tTcHBwVf8fHFxcZKkzz77rNY+YWFhuuOOOzR//nxduHBBhw4d8lj++eefKzIy0ufVsQDsjcOmAFCHDh06aOPGjbrrrruUmJiohx9+WAkJCSouLtZf/vIXrVu3TnfffbcefvhhvzzfoEGDJFXdSLhPnz7u9qlTpyokJEQ//vGPFRMToxMnTuiJJ57QVVddpVtuucVjjD179mjgwIFe5+ABsD/2vAGACT/+8Y/197//XSNHjtSKFSuUnJyse++9V0ePHtXatWv1yiuveN2TraFiY2M1YMAAvfHGGx7tAwYMUH5+vmbNmqVhw4bpgQce0PXXX6/3339fHTt2dPf77LPPdPDgQf2f//N//DIfANbC12MBgAX953/+p+6++259+eWX6tq1a73WXbhwoV566SV99tlnCgriAAvQ3BDeAMCCDMPQj370IyUmJuoPf/iD6fXOnj2r733ve1q5ciV73oBmisOmAGBBDodDL7zwgrp06aKLFy+aXu/IkSOaO3euJkyY0IizAxBI7HkDAACwEfa8AQAA2AjhDQAAwEYIbwAAADZCeAMAALARwhsAAICNEN4AAABshPAGAABgI4Q3AAAAG/n/5qUwTrSbnHgAAAAASUVORK5CYII=",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"shotNum = \"0010\"\n",
"filePath = folderPath + \"/\" + shotNum + \"/*.h5\"\n",
"\n",
"dataSetDict = {\n",
" dskey[groupList[i]]: read_hdf5_file(filePath, groupList[i])\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 = (350, 990)\n",
"imageAnalyser.span = (650, 200)\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('TOF (s)')\n",
"plt.ylabel('NCount')\n",
"plt.tight_layout()\n",
"plt.grid(visible=1)\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [],
"source": [
"dataSet_cropOD_chunk = dataSet_cropOD.chunk((1, 1, 650, 200))\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": 27,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"4.027352128668683\n",
"0.03427747912979168\n"
]
}
],
"source": [
"data = fitAnalyser.get_fit_value(fitResult)\n",
"\n",
"print(data.amplitude.sel(TOF_free=0.01).mean('runs').item() * 147 / 1e5)\n",
"print(data.amplitude.sel(TOF_free=0.01).std('runs').item() * 147 / 1e5)"
]
},
{
"cell_type": "code",
"execution_count": 147,
"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(\"<div id='\" + id + \"'></div>\");\n if (!fig.cell_info) {\n console.error('Failed to find cell for figure', id, fig);\n return;\n }\n fig.cell_info[0].output_area.element.on(\n 'cleared',\n { fig: fig },\n fig._remove_fig_handler\n );\n};\n\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 '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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 '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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 = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n // Add the status bar.\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message pull-right';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n\n // Add the close button to the window.\n var buttongrp = document.createElement('div');\n buttongrp.classList = 'btn-group inline pull-right';\n button = document.createElement('button');\n button.classList = 'btn btn-mini btn-primary';\n button.href = '#';\n button.title = 'Stop Interaction';\n button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n button.addEventListener('click', function (_evt) {\n fig.handle_close(fig, {});\n });\n button.addEventListener(\n 'mouseover',\n on_mouseover_closure('Stop Interaction')\n );\n buttongrp.appendChild(button);\n var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n titlebar.insertBefore(buttongrp, titlebar.firstChild);\n};\n\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": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAkAAAAGwCAYAAABB4NqyAAAAAXNSR0IArs4c6QAAIABJREFUeF7tfQm0FcXV9WZUVJRBcWAQFRQVx0+NQtREEyLGBEREEAwIGkH0DxBUYqKA4vgligmCEI2gMogG+ZQIRjQmwQBR0OCsaESRxCFCVARk+tfp9sF7j/ferbr33L7ddXavxeLCPd1dZ59d5+xbXV1Va+vWrVvBgwgQASJABIgAESACRhCoJQcFkJFo000iQASIABEgAkQgQoACiEQgAkSACBABIkAEzCFAAWQu5HSYCBABIkAEiAARoAAiB4gAESACRIAIEAFzCFAAmQs5HSYCRIAIEAEiQAQogMgBIkAEiAARIAJEwBwCFEDmQk6HiQARIAJEgAgQAQogcoAIEAEiQASIABEwhwAFkLmQ02EiQASIABEgAkSAAogcIAJEgAgQASJABMwhQAFkLuR0mAgQASJABIgAEaAAIgeIABEgAkSACBABcwhQAJkLOR0mAkSACBABIkAEKIDIASJABIgAESACRMAcAhRA5kJOh4kAESACRIAIEAEKIHKACBABIkAEiAARMIcABZC5kNNhIkAEiAARIAJEgAKIHCACRIAIEAEiQATMIUABZC7kdJgIEAEiQASIABGgACIHiAARIAJEgAgQAXMIUACZCzkdJgJEgAgQASJABCiAyAEiQASIABEgAkTAHAIUQOZCToeJABEgAkSACBABCiBygAgQASJABIgAETCHAAWQuZDTYSJABIgAESACRIACiBwgAkSACBABIkAEzCFAAWQu5HSYCBABIkAEiAARoAAiB4gAESACRIAIEAFzCFAAmQs5HSYCRIAIEAEiQAQogMgBIkAEiAARIAJEwBwCFEDmQk6HiQARIAJEgAgQAQogcoAIEAEiQASIABEwhwAFkLmQ02EiQASIABEgAkSAAogcIAJEgAgQASJABMwhQAFkLuR0mAgQASJABIgAEaAAIgeIABEgAkSACBABcwhQAJkLOR0mAkSACBABIkAEKIDIASJABIgAESACRMAcAhRA5kJOh4kAESACRIAIEAEKIHKACBABIkAEiAARMIcABZC5kNNhIkAEiAARIAJEgAKIHCACRIAIEAEiQATMIUABZC7kdJgIEAEiQASIABGgACIHiAARIAJEgAgQAXMIUACZCzkdJgJEgAgQ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9P2GDRtw2WWXYf78+fjkk0/QvHlzXHnllejfv38erdY5JZc/5e+SyzbX92XXWrduHY444ogIgzVr1ug44nkV17bKZXPZ5vpervHoo4/i2muvxVtvvYU99tgj+jxw4EDPVhdu7tLWsrvkss31/QcffIDBgwfjr3/9a7R44mmnnYY777wTe+21V+GO5HGFXO314fq4ceMwefJkvPTSS+jcuTNmz55doUU+98rDFa9TfNqSy7Ymv0PPb7linqb85kWQgIwpgPII5siRIyH73cydOzc6WxJat27doiJV+chlW9P3a9euxS233IK+ffviwAMPxOLFi6N7Pfjgg+jUqVMeLS/8lFz+lL9DLttc35dd64orrsDSpUuxZMmSkgkg17ZKm3PZ5vp+3rx5GDBgAO6//36ceuqp+Oyzz/Dhhx+iXbt2hQfQ8wq52qoZ765du0aXe+CBByBL8MsPi1133RXTp0/3bLWOuabvs2bNQu3ataMfMytXrtxBAPncS8e76q/i05ZctjX5HXp+yxXzNOW3YnMqrdenAMojMi1btoxGfLp37x6d/dBDD2H48OFYsWLFDlfLZZvr+8oXFKHVvn17XHfddXm0vPBTfNqbyzbX99JaET0iAG+77Tb06NGjZALIpa1l6OayzfX98ccfHwmgUoz4VGZIrraWt89lm+v7I488EiNGjMD5558fXXbq1Km46aab8PLLLxdO3DyukKu9Pr6X2co6MS+++OIOAsjnXnm44nWKT1tcbavzO+T8livmacpvXgQJyJgCyDOYq1evRpMmTaJHE23atInOls8HH3xwVJzlcUXZkct2y5YtzteSa65fvz6659ixY7eJL8/mF2Seyx9t3zdt2oQTTjgh8lewkhGCUjwCS9JveYzasGFD3Hrrrbj77rsjf2UU6I477sA+++xTUPx8T07Sb+GOPCKSkVX5W0aA+vTpg8MPPzwaBU360PS9fL+oSgj43KvYOPi0xcfWRQCFlN9yxVzimJb8VmxOpfn6FECe0Xn//ffRqlUrfPzxx9hzzz2js+Vzs2bNIN+1aNFi2xVz2UqSd72W2F5wwQWQeRJPPfVUNJye9JHLH23f5df/8uXLcc899+CZZ54pmQBK0m+JqfyqltEQmQfUtGnTaCRIHoE9+eSTiYY8Sb+FO/JDol+/fli4cGHk54knnognnngiEoRJH5q+l+8X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\" width=\"640.0000169542105\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"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(990), y=np.arange(350), 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",
"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": 150,
"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(\"<div id='\" + id + \"'></div>\");\n if (!fig.cell_info) {\n console.error('Failed to find cell for figure', id, fig);\n return;\n }\n fig.cell_info[0].output_area.element.on(\n 'cleared',\n { fig: fig },\n fig._remove_fig_handler\n );\n};\n\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 '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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 '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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 = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n // Add the status bar.\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message pull-right';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n\n // Add the close button to the window.\n var buttongrp = document.createElement('div');\n buttongrp.classList = 'btn-group inline pull-right';\n button = document.createElement('button');\n button.classList = 'btn btn-mini btn-primary';\n button.href = '#';\n button.title = 'Stop Interaction';\n button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n button.addEventListener('click', function (_evt) {\n fig.handle_close(fig, {});\n });\n button.addEventListener(\n 'mouseover',\n on_mouseover_closure('Stop Interaction')\n );\n buttongrp.appendChild(button);\n var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n titlebar.insertBefore(buttongrp, titlebar.firstChild);\n};\n\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": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAkAAAAGwCAYAAABB4NqyAAAAAXNSR0IArs4c6QAAIABJREFUeF7tfQu8V1P6/tNFCYmi0EUSuRvzH7cyDM2gMKWSUqYUQ+6lchm6oHGbSY0UZswUuqikoR9jlDFEhVyHUrmlMmhILt3r/3n3dupU55zvWt/vu/d37bWe/fn0mTPOu/de7/M8613PWXvttStt2rRpE3gQASJABIgAESACRCAQBCrJQQMUCNtMkwgQASJABIgAEYgQoAGiEIgAESACRIAIEIHgEKABCo5yJkwEiAARIAJEgAjQAFEDRIAIEAEiQASIQHAI0AAFRzkTJgJEgAgQASJABGiAqAEiQASIABEgAkQgOARogIKjnAkTASJABIgAESACNEDUABEgAkSACBABIhAcAjRAwVHOhIkAESACRIAIEAEaIGqACBABIkAEiAARCA4BGqDgKGfCRIAIEAEiQASIAA0QNUAEiAARIAJEgAgEhwANUHCUM2EiQASIABEgAkSABogaIAJEgAgQASJABIJDgAYoOMqZMBEgAkSACBABIkADRA0QASJABIgAESACwSFAAxQc5UyYCBABIkAEiAARoAGiBogAESACRIAIEIHgEKABCo5yJkwEiAARIAJEgAjQAFEDRIAIEAEiQASIQHAI0AAFRzkTJgJEgAgQASJABGiAqAEiQASIABEgAkQgOARogIKjnAkTASJABIgAESACNEDUABEgAkSACBABIhAcAjRAwVHOhIkAESACRIAIEAEaIGqACBABIkAEiAARCA4BGqDgKGfCRIAIEAEiQASIAA0QNUAEiAARIAJEgAgEhwANUHCUM2EiQASIABEgAkSABogaIAJEgAgQASJABIJDgAYoOMqZMBEgAkSACBABIkADRA0QASJABIgAESACwSFAAxQc5UyYCBABIkAEiAARoAGiBogAESACRIAIEIHgEKABCo5yJkwEiAARIAJEgAjQAFEDRIAIEAEiQASIQHAI0AAFRzkTJgJEgAgQASJABGiAqAEiQASIABEgAkQgOARogIKjnAkTASJABIgAESACNEDUABEgAkSACBABIhAcAjRAwVHOhIkAESACRIAIEAEaIGqACBABIkAEiAARCA4BGqDgKGfCRIAIEAEiQASIAA0QNUAEiAARIAJEgAgEhwANUHCUM2EiQASIABEg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uWuPe8Xkpbx70wAZsKItBJ86iQF8NEABmwAaIPvZzu+/B/r0Aa6/Hmjc2LaHFT+e9c2e8+Kztn0LtMc9R3OsVGnTprI+oedic4vTJm0hsED4USBs1EjOybmJXj75BGjbFnjzTUA2z5461eQst2KodT+0rj3uuaXSuDWcATJgRVsILBB+FAgD6WwOIefkPJdeXnghfq39yy+Bk0+O1/3ssUeus9z7PbXuh9a1xz33lEoDZMSJthBYIPwoEEbi+TGInJPzivRy333xGh/Z6+fyy+O9fkp2erbRmQux1LofWtce91zQ5rZt4AyQASvaQmCB8KNAGEiHM0ABr38y7eejRwMXXBAbnpEjgQsvtFGWe7GmebvX8sJb5FPu2uNe4ejqX4EGyABTbSH41EkM4NsqJNTcQ81byA81d9O8f/ghfvT1u98BLVrY9ij34k3zdq/lhbfIp9y1x73C0dW/Ag2QAabaQvCpkxjARwMUsAmgASp7tlMWOVerFn/B3beD9c2PGW7tcc9FndMAGbCiLQQWCD8KhIF0+AgsYPNXXj+fNAno3h3Ye2/gjTfc39jQRuchG17fctce92x1lEY8DZABytpCoAGiATKQnTchoep927w3bgQGDACGDJG3T4Dbbwf69Yt/9ukIlW8aoOypmAbIgDMaIAOQDENCLY6h5u3boGAo8yisNOcrVwJduwJPPgnsuiswfjzQurXN1bITS6378Qee9rjnooKdMEBt2rRBjx49cMYZZ6Bq1arO4aQtBBYIPwqEjVDJeRicyyyPmBt5m2v+/FU46KAaOO884N57Afmo6YEHxh8zbdbMRj3ZiqXW/dC69rjnooqdMEC33HILHn74YXzzzTfo0qULLrjgAhx++OHO4KUtBBYIPwqEjUDJuf+ci/np1AmYMgWQn2V/fXm8VbkyULs28P/+X2yOdtvNRjnZi6XW/dC69rjnopKdMEAlwLz44osYM2YMJk2ahAMOOCCaFercuTN23333omKnLQQWCD8KhI0oybn/nI8dC3TrBmzYsL0yqlQB/vY34PzzbVSTzVhq3Q+ta497LqrZKQNUAtD777+PTp064a233kL16tXRsWNHDBkyBA0aNCgKhtpCYIHwo0DYiJGc+8+57OEza1Y887PtITNBzZsDM2faqCabsdS6H1rXHvdcVLMzBmjVqlV47LHHohmgV155BWef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yJBoYb0YPTF8YgSXLVuW+iMwaUuaecssl7xYIOZPDjELshBajFAxDs3cZb2H/Lv11lvx9ttvY+LEidFj7BId29wraSxs2pIrNlfePte3inJ3rb4lrSlXr08DlAczMhtx9dVXb7UPkPz1JgtYS97cue+++zbPXJQXWzKzUd7v5a2yxo0bo3r16lvtMSSLQ0uun0fzCzolrdy3bWQxH4Hl4kmTc7nXhg0bov2exowZE8Fw8skn45577kl9EXTaeb/33nvR/lqvvfZatOj9qKOOwh//+Mfof4txaGpdzNzgwYO3SkMWt4uuc+Gcdu5p5e17fcvFeWlei13f0taYK/ejAXKFCbaDCBABIkAEiAARSA0BGqDUoOaNiAARIAJEgAgQAVcQoAFyhQm2gwgQASJABIgAEUgNARqg1KDmjYgAESACRIAIEAFXEKABcoUJtoMIEAEiQASIABFIDQEaoNSg5o2IABEgAkSACBABVxCgAXKFCbaDCBABIkAEiAARSA0BGqDUoOaNiAARIAJEgAgQAVcQoAFyhQm2gwgQASJABIgAEUgNARqg1KDmjYgAESgUAflI7rnnnhvtFn3aaadFnwzhQQSIABHIBwEaoHxQ4zlEIFAESn+MddWqVdEnWnbYYYcIjZ///Od4+umno59HjBiBUaNG4aOPPoJ86f3MM8/E73//e9SrVy/6/ccff4z99ttvu6/bL126FKW/pL0tzPItrX//+9945plnom9p8SACRIAI5IsADVC+yPE8IhA4Ar/4xS+ijwDLt+xKH3379sXkyZPxt7/9DSeccAL++9//ol+/fpg7d240cyMGp8QAff3119htt92MkezZs2dkqOTbe2Ud8h2rEkNmfFEGEgEiECQCNEBB0s6kiUDhCJRlgD788EPIV91feOEFtGjRYvNN5AOvhx12WPT4Sj4SmY8BOuecczB16lRUqlQp+or68OHDUaVKlcgMnXXWWXjggQdw4oknRo/FJkyYEM04LV68OGqPxDZv3jxqj5ikW265JfrS/IoVK6J2yseF99lnn8JB4RWIABHIDAI0QJmhig0lAm4hUJYBuv/++zFkyJDIeGx73HTTTZgxYwZefvnlvAyQXK979+7RjFHJDNDo0aNx4YUXYuDAgbj22muxfv366Avrv/3tb/HEE0/gJz/5SWSaLrroIixYsAB16tRB//79o9moRx55JPr/N9xwA1555ZXItPEgAkQgHARogMLhmpkSAVUEyjJAYn6efPJJzJ49e7t7yZqgoUOHYuHChZsN0K677hrN6MjRpk0bjBkzpsI2lmWArrnmGsji6JI1QWeccQZOPfVUXHXVVZuvJbM8l1xyCbp27Ro9QnvppZdw5JFHRr9fvXp1tBZJZqUaNmyoihEvRgSIgLsI0AC5yw1bRgScRsCVGSAxVW+//fZmrA499NDIzJReCySPvWQGStYQ1a1bF6WNl5y4Zs2aaHaq5DGZ08CzcUSACKggQAOkAiMvQgTCQ6AsA7Ro0SI0a9as3DVAHTt2xODBg1UfgcnjsDfffHMzAaeffnq0OFtmfLY9Nm7cGM0AySOwgw46KDzSmDERIAKbEaABohiIABHIC4Hy3gLr3bs3Hn/8ccj6HHn0JG+BybqbOXPmRMZj9913T9QATZs2LXr8NXHiRPz0pz+FvK4vaB8xRAAAAW1JREFU644OOeSQaKGzPDKbP39+tPBZHnn973//i2Z/xJzxIAJEIBwEaIDC4ZqZEgFVBMozQJs2bcKf/vSnyGDIoyiZcZF1Obfddhv22muvqA35vAUm55W1BmjbGSCJkzfB5H7yVlr16tVx7LHHYuTIkWjQoAHWrl2LO++8M1pvJOZMFkLLmiF5i4wHESAC4SBAAxQO18yUCBABIkAEiAAR+BEBGiBKgQgQASJABIgAEQgOARqg4ChnwkTAXQRkc8KLL764zAbKPj7crNBd7tgyIpA1BGiAssYY20sEiAARIAJEgAgUjAANUMEQ8gJEgAgQASJABIhA1hCgAcoaY2wvESACRIAIEAEiUDACNEAFQ8gLEAEiQASIABEgAllDgAYoa4yxvUSACBABIkAEiEDBCNAAFQwhL0AEiAARIAJEgAhkDQEaoKwxxvYSASJABIgAESACBSMQGaCCr8ILEAEiQASIABEgAkQgYwj8f3vhfHGTZgn8AAAAAElFTkSuQmCC\" width=\"640.0000169542105\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"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(990), y=np.arange(950), 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",
"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": 152,
"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(\"<div id='\" + id + \"'></div>\");\n if (!fig.cell_info) {\n console.error('Failed to find cell for figure', id, fig);\n return;\n }\n fig.cell_info[0].output_area.element.on(\n 'cleared',\n { fig: fig },\n fig._remove_fig_handler\n );\n};\n\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 '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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 '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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 = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n // Add the status bar.\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message pull-right';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n\n // Add the close button to the window.\n var buttongrp = document.createElement('div');\n buttongrp.classList = 'btn-group inline pull-right';\n button = document.createElement('button');\n button.classList = 'btn btn-mini btn-primary';\n button.href = '#';\n button.title = 'Stop Interaction';\n button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n button.addEventListener('click', function (_evt) {\n fig.handle_close(fig, {});\n });\n button.addEventListener(\n 'mouseover',\n on_mouseover_closure('Stop Interaction')\n );\n buttongrp.appendChild(button);\n var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n titlebar.insertBefore(buttongrp, titlebar.firstChild);\n};\n\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": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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6zpXIkAIkD3qPJVwHcyemum9WjggQAgQAoQA2VOt61yJANUhQPbhoAQEIAABCEAAAoVKoKKiIq+mN9CtIt/fyusQyS58ItaZRCJwyIwqHOBQdX4TE8REbkwQD/GJBwSonjZCMMcnmOs5lE5+nXggHhCgmqcSc4O5ETcRRIDqedpjUjOp4zap6xnSTn6deXEMIyzIEeSI6mklDvMCAapnun/kkUdE/0v7BodMBMABDlVzATFBTOTGBPEQn3hAgNJuLvQfAhCAAAQgkEICCFAKB50uQwACEIAABNJOAAFKewTQfwhAAAIQgEAKCSBAKRx0ugwBCEAAAhBIO4HUC9CRI0dkzJgx8uqrr5pYKC0tlSeffFIaNWpULTZsZeva/88//8hdd90lH374oRw4cEDOOussGT9+vAwdOjQWMWjrW24jbWVt+7N1HT58WC666CLD47fffkslh3feeUcmTpwoW7dulWbNmpmf77zzzshZBB1DbaitrG3/nj17ZNSoUbJmzRrzHqVevXrJvHnzpFWrVpFzCNK/fObG3LlzpaysTDZt2iTXXXedLF269Lg+2lhFCSSfttnK1sUhTbnSFg9pyZVBOPjIlakXoEmTJom+knvFihUm1jQp9enTx5yIqm62snXt//PPP2XGjBly2223Sfv27WX9+vXmWIsWLZJrr702yrxmjm3rW24DbWVt+7N1jRs3Tr744gvZsGFDbAQoaNuDMLPV9f7778uwYcPkpZdekh49esgff/wh+/btkwsuuCBV8XDLLbeY/r788sui72TVP0KaNGkir732WuQcgoxzPnNj8eLF0rBhQ/OH0A8//FBNgGwxEyWQfNpmK1sXhzTlSls8pCVX2jj4ypWpF6Czzz7brPj069fPxNqbb74pY8eOlZ07d1bLNbaytv1VK1TR6ty5szz66KNR5jVz7Hzabitr26/HU+lRGZwzZ470798/NgIUpO3ZwbKVte3v0qWLEaA4rPhUDUBb23PL28ra9l988cVy//33y4ABA0y1r7zyikybNk02b94c+bxwPTeyHdJHoTdu3FhNgGysogSST9uClq2NQ1pypS0e0pIrbRx85cpUC9Cvv/4qRUVF5vJDx44dzRjoz8XFxeaErJcksput7H///Re4Lq3z77//Nsd86qmnKuUrquRm65trDkePHpWuXbuavis3XQGIwyWwMDno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\" width=\"640.0000169542105\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"T = 0.553 ± 0.004 uK\n"
]
}
],
"source": [
"def expansion(x, A, B):\n",
" return np.sqrt(A*x*x+B)\n",
"\n",
"val_truncated = val_mean[2:]\n",
"std_mean_truncated = std_mean[2:]\n",
"\n",
"fitModel_temperature = NewFitModel(expansion)\n",
"fitAnalyser_temperature = FitAnalyser(fitModel_temperature, fitDim=1)\n",
"\n",
"params = fitAnalyser_temperature.fitModel.make_params()\n",
"params.add(name=\"A\", value= 1e6, max = np.inf, min = 1, vary = True)\n",
"params.add(name=\"B\", value= 1000, max = np.inf, min = 0, vary = True)\n",
"\n",
"fitResult_temperature = fitAnalyser_temperature.fit(val_truncated, params, x='TOF_free', dask=\"parallelized\")\n",
"\n",
"val = fitAnalyser_temperature.get_fit_value(fitResult_temperature)\n",
"std = fitAnalyser_temperature.get_fit_std(fitResult_temperature)\n",
"\n",
"fit_vals = tuple([val['A'].item(), val['B'].item()])\n",
"fit_vals_std = tuple([std['A'].item(), std['B'].item()])\n",
"\n",
"tof = (np.arange(2,16,0.1)*1e-3)\n",
"\n",
"fig = plt.figure()\n",
"ax = fig.gca()\n",
"val_mean.plot.errorbar(ax=ax, yerr=std_mean, fmt='or')\n",
"plt.plot(tof, expansion(tof, *fit_vals), 'b--',\n",
" label='fit: A=%.3f, B=%.3f' % tuple(fit_vals))\n",
"plt.xlabel('TOF (s)')\n",
"# plt.ylabel('Cloud Width - Vertical (pixels)')\n",
"plt.ylabel('Cloud Width - Horizontal (pixels)')\n",
"plt.tight_layout()\n",
"plt.grid(visible=1)\n",
"plt.legend()\n",
"\n",
"\n",
"m = 164*1.673e-27\n",
"kb = 1.38e-23\n",
"pixel = 5.86e-6\n",
"M = 2.3513\n",
"\n",
"T = fit_vals[0] * (m/kb) * ((pixel*pixel)/(M*M)) / (1e-6)\n",
"dT = fit_vals_std[0] * (m/kb) * ((pixel*pixel)/(M*M)) / (1e-6)\n",
"\n",
"print('T = %.3f \\u00B1 %.3f uK'% tuple([T,dT]))"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## Measure temperature at the end of evaporative cooling 2, truncation 0.725"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The detected scaning axes and values are: \n",
"\n",
"{'TOF_free': array([0.002, 0.003, 0.004, 0.005, 0.006, 0.007, 0.008, 0.009, 0.01 ,\n",
" 0.011, 0.012, 0.013, 0.014, 0.015]), 'runs': array([0., 1., 2.])}\n"
]
},
{
"data": {
"image/png": "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srOz5XQ6NXHiRG3cuNGj75IlS5SSkqLExERt375ds2bNUmZmpmbPnu3Rr7KyUuPGjVN+fr5WrFihLVu2qHv37oqPj9ebb77ZqOMAAAC4HJp82lSSli9froyMDJWXl8swDElSSEiIMjIyNG/ePFNjXHXVVTp16pQcDodOnjyp1atXe+33wgsv6NZbb9Vzzz3nbouNjVWPHj20du1aJSYmSqoOg4sXL1ZycrIyMzMlVX8ahMvlUlpamubOnauBAwdKktasWaOCggLt2bNHMTExkqQxY8ZoyJAhSk1N1b59+5pWGAAAgGbS5JW3l156SampqRo5cqT++Mc/6u2339af/vQnjRo1Sr/61a/0+9//3tQ4DoejwY/ZkqTAwEBdccUVHm1BQUHurxo5OTmqqKhQUlKSR9+kpCQZhqHNmze72zZt2qQBAwa4g5skBQQEaOrUqdq/f78KCwtNHQMAAMDl0uSVt//6r//SPffco3Xr1nm0T5kyRVOnTtV//dd/6d57773kCdZISUnRL3/5S61Zs0aJiYmqqKjQk08+qW+++UZz5sxx9ysoKJAkRUVFeewfERGh8PBw9/aaviNGjKjzswYPHixJOnz4sHr16uV1PpWVlR73sistLZUkuVwur9fWXaqaMZtj7Kaonkbg/3/vkkWmZbk6WRm1Moc6mUOdzKFO5rXGWpk91iaHtyNHjmjp0qVet02dOlUJCQlNHdqruXPnqn379po9e7ZmzpwpSQoNDdVrr72mW265xd2vuLhYTqdTIV4+ryk0NFTFxcUefUNDQ732q9len6VLlyojI6NOe25uroKDg80fWCPl5eU129iNUVHRVtJESdL27dsVFHTOvxO6gFXqZAfUyhzqZA51Moc6mdeaalVeXm6qX5PDW/v27VVSUuJ1W0lJidq3b9/Uob168cUXlZKSogceeEC33367zp49q5deekmTJk3Sxo0bNX78eHffi52GvXBbY/rWtmDBAo/r+kpLS9WnTx/FxcWpU6dOZg6pUVwul/Ly8hQbG6vAwECfj99YZWXffT9+/HjLfLap1epkZdTKHOpkDnUyhzqZ1xprVXMWryFNDm8jRoxQenq6Ro8erZ49e7rbT5w4oUcffVQjR45s6tB1nDp1yr3itnz5cnf77bffrtGjR+tnP/uZjh49KkkKCwtTRUWFysvL66yAlZSUKDo62v04LCzM6+paTSj1tipXw+l0yul01mkPDAxs1idZc49vfh61vw+UBabkwSp1sgNqZQ51Moc6mUOdzGtNtTJ7nE0Ob5mZmbr55pt19dVXa9y4cYqIiNCXX36pnTt3KjAwsM7tOy7Fxx9/rDNnzujGG2+ss+2GG27Qm2++qW+//VYdOnRwX+t26NAhDRs2zN3vxIkTOnnypAYNGuRui4qK0qFDh+qMWdNWuy8AAIAVNPndptdee60OHDigSZMm6cCBA3rxxRd14MABTZ48Wfv373ffjsMXalb29u7d69FuGIb27t2rLl26uK9xi4+PV1BQkLKzsz36Zmdny+FweNxLLiEhQUeOHPG4JUhVVZXWrVunYcOGeawoAgAAWMEl3eftmmuu0R/+8IdLnsS2bdtUVlbmvsHvhx9+qFdffVWSNGHCBF155ZVKTEzUqlWr5HQ6NWHCBFVWVmrt2rV699139dhjj7mvTwsNDVVaWpoWLVqk0NBQxcXF6cCBA0pPT9fMmTM9QuWMGTOUlZWlKVOmaNmyZerWrZueffZZffzxx9qxY8clHxcAAICvNTq8HTp0SF26dFHv3r29bv/888916tSpOrfquJj7779fn332mfvxhg0btGHDBknS0aNH1bdvX61fv16//e1v9fvf/14vvPCCAgMDdc0112jdunW65557PMZbuHChOnbsqKysLC1fvlw9evTQ/PnztXDhQo9+TqdT+fn5Sk1N1YMPPqjy8nINHTpU27Zt06hRo0zPHwAA4HJpVHh76623dNttt+m9996rN7z961//UkxMjF577TWPd4BezLFjxxrsExQUpF/+8pf65S9/aWrMOXPmeNz/rT7du3fX2rVrTY0JAADgb4265i0rK0t33XWXxzs2LxQdHa2777673o+5AgAAQNM1Kry9++67F/3w+Bo//OEP67y5AAAAAJeuUeHtq6++qvfjomqLiIhQUVFRkycFAAAA7xoV3kJCQur9VIXaTp061awfEQUAANBaNSq8XXvttcrJyWmw37Zt23Tttdc2eVKwvnO1Psr0rbc8HwMAgObTqPB29913a82aNXrzzTfr7bNr1y69+OKL+vGPf3zJk4M1bdwo1b4H84QJUt++1e0AAKB5NSq83XfffRo0aJDi4uI0e/Zs5ebm6u9//7v+/ve/Kzc3V7NmzVJ8fLyioqKUnJzcXHOGH23cKN11l1RY6NleWFjdToADAKB5Neo+b+3atdP27dt177336rnnntPvfvc7j+2GYej222/XSy+9pHbt2vl0ovC/c+eklBTJMOpuMwzJ4ZDmzpUmTZLatr3s0wMAoFVo9CcshIWFaevWrTp48KByc3N1/PhxSdKVV16p8ePH67rrrvP5JGENb78tff55/dsNQzp+vLrf6NGXbVoAALQqTf5s0+jo6IverBctz5df+rYfAABovEaFt8GDB5vu63A49Ne//rXRE4J1RUT4th8AAGi8RoW30NBQORyOi/b59ttvdfDgwQb7wX5GjJB6965+c4K3694cjurtI0Zc/rkBANBaNCq87d69u95tVVVVWrVqlR599FE5HA7dc889lzo3WEzbttKKFdXvKnU4PANcTVZ/5hnerAAAQHNq1K1C6rNhwwYNHDhQDz74oIYMGaKDBw/q97//vS+GhsUkJkqvvir17OnZ3rt3dXtion/mBQBAa3FJ4W337t0aNmyY7r77bnXq1Em5ubnavn27hg4d6qPpwYoSE6UPP/zu8dat0tGjBDcAAC6HJoW3Q4cOacKECRo3bpyKi4v18ssv67//+781btw4X88PFlX71OjIkZwqBQDgcmlUeDt+/LimTZum66+/XgcPHtQzzzyjjz76SP/+7//eXPMDAABALY16w8I111yjs2fPKj4+XqmpqerYsaMOHTpUb//rr7/+kicIAACA7zQqvFVWVkqStm3bppycnHr7GYYhh8Ohc+fOXdrsAAAA4KFR4e3FF19srnkAAADAhEaFt2nTpjXXPAAAAGCCT+7zBgAAgMuD8AYAAGAjhDcAAAAbIbwBAADYCOENAADARghvAAAANkJ4AwAAsBHCGwAAgI0Q3gAAAGyE8AYAAGAjhDcAAAAbIbwBAADYCOENAADARghvAAAANuL38Hb69GmlpqYqLi5OXbt2lcPhUHp6ute+LpdLTz/9tKKiotS+fXt17txZN998s/bs2VOn78qVKxUZGSmn06l+/fopIyNDLperTr+ioiJNnz5d4eHhCg4OVkxMjPLz8319mAAAAD7h9/BWXFysVatWqbKyUpMnT66337lz55SQkKBHH31UP/7xj7Vt2zatX79e8fHxKisr8+i7ZMkSpaSkKDExUdu3b9esWbOUmZmp2bNne/SrrKzUuHHjlJ+frxUrVmjLli3q3r27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YcIEQ5Kxdu3aZjl+s6xUp9pOnz5t9O3b1+jZs6chyfjqq698dsxNZbVa7dy502jfvr0RFxdnvPrqq8bu3buNl156yfj5z3/u82NvDCvVqaioyAgLCzP69etnZGdnGzt37jSeeuopo0OHDsbQoUONc+fONUsNzLgcdZoxY4bx/e9/3/i3f/s3Izo62rjY/25mzpxpOJ1O44knnjB27dplzJ8/33A4HMaSJUt8cryXwkq1au2v5415TtWw4uu5LxDefOyNN94wJBkvv/yyR3tsbKzRs2dPo6qqqt59s7KyDEnGnj173G0ul8sYOHCgcdNNN3n0vfHGG42BAwcaLpfL3fbuu+8akoxnn33W3favf/2rzs+pqqoyBg8ebPTv37/Rx+crVqtTbbNnzzauu+46Iy0tzRL/2K1Wq7KyMiMiIsK44447jPPnz1/q4fmM1er0/PPPG5KMHTt2eOyfmZlpSDLef//9Jh3npbpcdaodTmfPnl3v/2gLCgoMh8NhZGZmerQnJycb7du3N4qLi00fm69ZrVat/fXcbJ1qs9rrua8Q3nxs5syZRocOHTxe2A3DMF5++WVDkvHuu+/Wu+9tt91mDBgwoE57zYv9559/bhiGYXz++eeGJGPp0qV1+l5zzTVGbGxsg/NMSkoy2rVr12C/5mLVOr311ltGYGCgcfDgQeORRx6xxD92q9UqOzvbkFTnr2J/s2qdDhw44NHv2WefNSQZH374YaOOz1cuR50udLH/0S5evNiQZHz55Zce7Xv27DG1ctOcrFar+rSG1/MLmamTFV/PfYVr3nysoKBAP/jBDxQQEODRPnjwYPf2i+1b08/bvocPH/YYo76+F/sZklRVVaW3335b11577UX7NScr1unMmTP6z//8T82dO1fXX399I46meVmtVm+99ZYk6dy5c7r11lvVrl07denSRT/+8Y/1xRdfNObQfMpqdZo8ebKuvPJK/eIXv9Dhw4f17bff6q233tKyZct055136gc/+EEjj9A3LkedGjufrl27qkePHo2eT3OzWq28aS2v541l1ddzXyG8+VhxcbFCQ0PrtNe0XexCZbP71vy3vr4NXQydnp6uf/zjH3rkkUcu2q85WbFOixYt0rlz55SRkWHyKC4Pq9WqsLBQkvSjH/1It9xyi7Zv365ly5YpLy9Po0aNUnl5udlD8ymr1emKK67Q3r175XK5NGjQIHXs2FGjRo3SsGHDtGHDhkYcmW9djjr5Yj4hISFq166dX9/cYbVaedNaXs8by6qv574S0HAXNNbF3gHT0LtjGrNvfX0vNsbq1au1ZMkS/eIXv9CkSZMuOpfmZqU67d+/X88884xycnLUvn37i/5sf7BSrc6fPy9Juvvuu/X4449LksaMGaMePXpo8uTJevnllzVz5syLzqm5WKlOp06d0qRJk1ReXq7169erT58+Kigo0GOPPaYf/vCHeuONN+qsVFwul6tOl2M+zc1qtaqtNb6em2H113NfILz5WFhYmNe/FEpKSiR5/4u9sfuGhYVJ8v4XSUlJSb0/48UXX9RPf/pT3XfffXryyScbOJLmZbU6zZgxQ4mJibrhhhv09ddfS5IqKiokSaWlpXI6nerYsaOZQ/M5q9Wqpu/48eM9+o0fP14Oh0Pvv//+RY+nuVitTo8//rg++OADffbZZ4qIiJAkjRgxQpGRkRo7dqzWr1+vadOmmT08n7kcdWrsfD744IM67WVlZTp79myTxvQVq9Wqttb2et4YVn499xVOm/pYVFSUPvroI1VVVXm0Hzp0SJI0aNCgi+5b0+9i+9b8t76+3n7Giy++qJkzZ2ratGn63e9+5/e/Zq1Wp8OHD2vDhg3q0qWL+6tmVal///4aMWJEYw7Pp6xWK2/Xp9TWpo1/XlasVqcPPvhAvXr1cge3GjfeeKMk/13LdTnq1Nj5fPXVVzpx4oTPxvQVq9WqRmt8PW8MK7+e+4y/3zHR0mzdutWQZPzxj3/0aI+Pj2/wLdM170Lbu3evu83lchnXXnutMWzYMI++N910kzFo0CCP8d577z1DkvHcc8959H3xxReNNm3aGD/5yU/8em+p2qxWp127dtX5mjZtmiHJ2Lx5c513DF5OVqvVRx99ZDgcDiM5Odlj/40bNxqSjN///vdNOs5LZbU6JSUlGQEBAXXeLZebm2tIMp555pkmHeelulx1qs3MrUKWLVvm0f7Tn/7U77cKsVqtDKN1v57XdrE6Wfn13FcIb80gNjbW6NKli7Fq1Spj586dRnJysiHJWLdunbvPjBkzjLZt2xrHjh1zt1VUVBjXXnut0adPH2P9+vVGXl6ekZCQ4PVmhbt27TICAgKMhIQEIy8vz1i/fr3Rp0+fOjcKfeWVV4w2bdoY119/vfHuu+8a7733nsdXfTeqvRysVCdvrPTWcqvV6oEHHjDatGljzJs3z8jLyzOysrKMLl26GNddd51RWVnZvMW4CCvV6b//+7+Ndu3aGT/4wQ+MtWvXGjt37jR+85vfGN26dTO6d+/u1+fV5ajTsWPHjA0bNhgbNmww4uPjDUnuxxf+z7PmJr1PPvmksXv3buOhhx6y1E16rVKr1v563pjn1IWs9HruC4S3ZnD69Gljzpw5Ro8ePYx27doZgwcPNv7whz949Kn5K+Do0aMe7SdOnDB+8pOfGKGhoUZQUJAxfPhwIy8vz+vPyc3NNYYPH24EBQUZoaGhxk9+8pM6N3Gs+Tn1fV348y8nK9XJGyv9Y7daraqqqoxly5YZV199tREYGGhEREQY999/v3Hq1ClfHXKTWK1O77//vpGQkGD07t3bcDqdxve+9z1j5syZxj//+U+fHXNTXI46vfjii/W+7kybNs2j79mzZ41HHnnEuPLKK4127doZ11xzjfGb3/zG14fdJFaqVWt/PW/Mc+pCVno99wWHYRhGU063AgAA4PLjDQsAAAA2QngDAACwEcIbAACAjRDeAAAAbITwBgAAYCOENwAAABshvAEAANgI4Q0AAMBGCG8AWiWHw2Hqa/fu3e59jh8/rgceeED9+/dXUFCQunTpotGjR2v9+vW68H7nx44dq3fMG264wdQcH330UQ0cOFDnz583fVz5+fnq0KGDCgsLTe8DwF74hAUArdLevXs9Hj/22GPatWuXdu7c6dE+cOBAderUSe+++64mTpyoDh066Fe/+pUGDx6sb775Rq+88opefvll3X333Xr55ZfVpk3138THjh1Tv3799OCDD+qee+7xGLNDhw4aNGjQRef3xRdf6JprrlF2drbuuuuuRh3b2LFj1adPH61du7ZR+wGwhwB/TwAA/GH48OEej7t27ao2bdrUaZekr7/+WomJibriiiu0b98+de/e3b1t0qRJGjx4sObPn6+hQ4dq/vz5HvteeeWVXsdsyIoVK9S5c2clJiY2et/Zs2fr7rvv1uLFi9WnT59G7w/A2jhtCgANWL16tYqKirRs2TKP4FYjNTVVkZGRevLJJ+VyuS755509e1Zr1qzRPffc417Jq/Hcc89pyJAh6tChgzp27KjIyEg99NBDHn3uvPNOdejQQc8///wlzwWA9RDeAKABeXl5atu2re68806v2x0Oh374wx+qpKREBw8e9Nh2/vx5VVVVeXw1dLXKvn37VFxcrDFjxni0//GPf9SsWbM0atQobdq0SZs3b9bPf/5zlZWVefRr166dbr75Zr3xxhtNOFoAVkd4A4AG/POf/1TXrl0VEhJSb59+/fq5+9b261//WoGBgR5f+fn5F/157733niTp+uuv92h/99131blzZ/3mN79RbGysxo0bp5/+9KdasWJFnTGuv/56ffDBB3WCHQD7I7wBgA/UrKY5HA6P9pSUFB04cMDja9iwYRcd64svvpDD4VB4eLhH+0033aSvv/5aP/7xj7VlyxadPHmy3jG6deum8+fP68SJE008IgBWxRsWAKABV155pf7+97+rrKys3tW3Y8eOSVKdNwj07t3b9K1Bapw5c0aBgYFq27atR/u9996rqqoqPf/88/rRj36k8+fP68Ybb9TixYsVGxvr0TcoKMg9FoCWhZU3AGhAbGyszp07p9dee83rdsMw9Je//EWhoaGKjo6+5J8XHh6us2fPej3lmZSUpD179uibb77RG2+8IcMwNHHiRH322Wce/UpKStxjAWhZCG8A0ICZM2eqW7duWrBggYqKiupsf+KJJ3TkyBGlpqYqMDDwkn9eZGSkJOmTTz6pt09ISIhuv/12LVy4UGfPntXhw4c9tn/66acKCwvz+u5YAPbGaVMAaEDnzp21ceNGTZw4UdHR0frVr36lIUOGqLS0VH/605+0fv163X333frVr37lk583evRoSdU3Eh48eLC7PTk5We3bt9ctt9yiiIgInThxQkuXLtUVV1yhG2+80WOMvXv3atSoUXWuwQNgf6y8AYAJt9xyi/72t79p0qRJWrFiheLi4nTvvffq+PHjWrdunf7whz/UuSdbU/Xp00cjRozQli1bPNpHjBihgoICpaSkKDY2Vj//+c91zTXX6O2331bXrl3d/T755BMdOnRI//Ef/+GT+QCwFj4eCwAs6M9//rPuvvtuffbZZ+rVq1ej9l20aJFeeuklffLJJwoI4AQL0NIQ3gDAggzD0M0336zo6Gj99re/Nb3f119/re9973tauXIlK29AC8VpUwCwIIfDoeeff149e/bU+fPnTe939OhRLViwQPfcc08zzg6AP7HyBgAAYCOsvAEAANgI4Q0AAMBGCG8AAAA2QngDAACwEcIbAACAjRDeAAAAbITwBgAAYCOENwAAABv5P/JI9yQupWaEAAAAAElFTkSuQmCC",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"shotNum = \"0011\"\n",
"filePath = folderPath + \"/\" + shotNum + \"/*.h5\"\n",
"\n",
"dataSetDict = {\n",
" dskey[groupList[i]]: read_hdf5_file(filePath, groupList[i])\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 = (350, 990)\n",
"imageAnalyser.span = (650, 200)\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('TOF (s)')\n",
"plt.ylabel('NCount')\n",
"plt.tight_layout()\n",
"plt.grid(visible=1)\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [],
"source": [
"dataSet_cropOD_chunk = dataSet_cropOD.chunk((1, 1, 650, 200))\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": 30,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"3.338057111672083\n",
"0.07935760046682089\n"
]
}
],
"source": [
"data = fitAnalyser.get_fit_value(fitResult)\n",
"\n",
"print(data.amplitude.sel(TOF_free=0.01).mean('runs').item() * 147 / 1e5)\n",
"print(data.amplitude.sel(TOF_free=0.01).std('runs').item() * 147 / 1e5)"
]
},
{
"cell_type": "code",
"execution_count": 160,
"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(\"<div id='\" + id + \"'></div>\");\n if (!fig.cell_info) {\n console.error('Failed to find cell for figure', id, fig);\n return;\n }\n fig.cell_info[0].output_area.element.on(\n 'cleared',\n { fig: fig },\n fig._remove_fig_handler\n );\n};\n\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 '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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 '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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 = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n // Add the status bar.\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message pull-right';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n\n // Add the close button to the window.\n var buttongrp = document.createElement('div');\n buttongrp.classList = 'btn-group inline pull-right';\n button = document.createElement('button');\n button.classList = 'btn btn-mini btn-primary';\n button.href = '#';\n button.title = 'Stop Interaction';\n button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n button.addEventListener('click', function (_evt) {\n fig.handle_close(fig, {});\n });\n button.addEventListener(\n 'mouseover',\n on_mouseover_closure('Stop Interaction')\n );\n buttongrp.appendChild(button);\n var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n titlebar.insertBefore(buttongrp, titlebar.firstChild);\n};\n\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": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAkAAAAGwCAYAAABB4NqyAAAAAXNSR0IArs4c6QAAIABJREFUeF7tfQu8VlP+/tNFuUxKkUtFFMNMrjMTyjDGfyLDlCQlJuRSGL8iMYYursMMxaRcxkyhi5g0BjFyGaJiwrhllEu6GHJJpFLp//nu7dQ5p/ec97ve9/vud++1nv35+Dic7957fZ/nWd/1nLXX3qvO+vXr14MHESACRIAIEAEiQAQCQaCOHDRAgbDNNIkAESACRIAIEIEIARogCoEIEAEiQASIABEIDgEaoOAoZ8JEgAgQASJABIgADRA1QASIABEgAkSACASHAA1QcJQzYSJABIgAESACRIAGiBogAkSACBABIkAEgkOABig4ypkwESACRIAIEAEiQANEDRABIkAEiAARIALBIUADFBzlTJgIEAEiQASIABGgAaIGiAARIAJEgAgQgeAQoAEKjnImTASIABEgAkSACNAAUQNEgAgQASJABIhAcAjQAAVHORMmAkSACBABIkAEaICoASJABIgAESACRCA4BGiAgqOcCRMBIkAEiAARIAI0QNQAESACRIAIEAEiEBwCNEDBUc6EiQARIAJEgAgQARogaoAIEAEiQASIABEIDgEaoOAoZ8JEgAgQASJABIgADRA1QASIABEgAkSACASHAA1QcJQzYSJABIgAESACRIAGiBogAkSACBABIkAEgkOABig4ypkwESACRIAIEAEiQANEDRABIkAEiAARIALBIUADFBzlTJgIEAEiQASIABGgAaIGiAARIAJEgAgQgeAQoAEKjnImTASIABEgAkSACNAAUQNEgAgQASJABIhAcAjQAAVHORMmAkSACBABIkAEaICoASJABIgAESACRCA4BGiAgqOcCRMBIkAEiAARIAI0QNQAESACRIAIEAEiEBwCNEDBUc6EiQARIAJEgAgQARogaoAIEAEiQASIABEIDgEaoOAoZ8JEgAgQASJABIgADRA1QASIABEgAkSACASHAA1QcJQzYSJABIgAESACRIAGiBogAkSACBABIkAEgkOABig4ypkwESACRIAIEAEiQANEDRABIkAEiAARIALBIUADFBzlTJgIEAEiQASIABGgAaIGiAARIAJEgAgQgeAQoAEKjnImTASIABEgAkSACNAAUQNEgAgQASJABIhAcAjQAAVHORMmAkSA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CBABIkAEEkPghRd2wOLF38Nxx81P7J68UYxA165dIeOpz4dXBkjI6t+/P+bMmRMtiG7cuHFO7kaPHo277roLs2bNUnFr7YR9+itBBWCloFBzDzVvzgBxBsi1RlTE//WvwJlnxq+2v/468IMfFHql5M7zqZ9bj3vJsaC/kzcGSMzPueeeG5kamfnZZpttakTh1ltvxdixY2mA9Doxi/SpQLiAEmreNEA0QC79pCL2D38ABg8G6tePNzOV19mzcPjUz2mAsqC479oo5mfGjBl48skn0axZsyotnzx5Mo466ig0atQomh2SdUESf9FFF6kytBaCT51EBSBngIL9GjINEA2QS42QJy5ifP74R2DLLeOPGx55pMsVyhvrU223HvfKy0zuu3sxA7RgwQK0bt0aDRs2RH35k+G74+STT4bM9hx66KF49dVXsXbt2ugbQbIIetCgQVwEXQZF+lQgXOALNW8aIBogl35y1lnAHXcATZvG3/g58ECXs8sf61M/pwEqv55S0QJrIfjUSVwJCjX3UPOmAaIBcqkRd98N/O53wGOPAXvt5XJmOmJ96ufW4146GKraCi9mgEoNrLUQfOokrtiHmnuoedMA0QDlqxGrV1f9ps+KFcBWW+U7K52/96mfW497aWSMBkjBirUQfOokCviqhISae6h50wDRANVWIz78MN7aol8/QPbuyvrhUz+3HvfSyC0NkIIVayH41EkU8NEAcTNUdJFP+AZ2hNrPtXnPnx9vbfHee/FCZ1nzo/w2bWqVpM09tQlUapj1uJfGnGmAFKxYC8GnTqKAjwaIBogGyLWjZDheU99efjme+fn4Y+DEE4Fx49K5tYUrDZrcXa9Zrnjrca9cedR2XxogBSvWQvCpkyjgowGiAaIBcu0oGY7PV9+efjre02v5cuCcc4Cbb07v1hauNOTL3fV65Yy3HvfKmUtN96YBUrBiLQSfOokCPhogGiAaINeOkuH42uqbrPlp0wZYuRIYNgwYMgSoUyfDyVZruk+13XrcSyPLNEAKVqyF4FMnUcBHA0QDRAPk2lEyHJ+vvo0aFa/1kdkf3458uWcpX+txL4250wApWLEWgk+dRAEfDRANEA2Qa0fJcHz1+iZfd54zB/jxjzOclLLpPtV263FPCWGiYTRACritheBTJ1HARwNEA0QD5NpRMhxfub7JRqay49CNNwLjxwMn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rdSaSuv1aYAKYEbe9nrooYfwyCOPRGcfffTR0eOZXG+B5YvN93sxP/JX8JNPPhk9Din3ka+9lduXL7a233/99df47LPPNlxOHoucccYZeOONN6LHjQ0aNEgUiny5WOUt17n66qujhfVi9MTwiRFcsmRJ4o/ApC1J5i2zXPJigZg/OcQsyEJoMULlOCxzl/Ue8s9VV12FV199FZMnT44eY1fo2OVepcbCpS35YvPl7XN9qy33tNW3UmsqrdenASqAGZmNGDBgQJXvAMlfb7KAteLNnVtvvXXDzEVNsRUzGzX9Xt4qa926NRo2bFjlG0OyOLTi+gU0v6hTksq9eiPL+QgsH0+WnMu91q1bF33vady4cREMhx9+OP70pz8lvgg66bzffPPN6Pta//73v6NF7/vvvz9uuOGG6N/lOCy1LmZu+PDhVdKQxe2i63w4J517Unn7Xt/ycV6Z13LXt6Q1lpb70QClhQm2gwgQASJABIgAEUgMARqgxKDmjYgAESACRIAIEIG0IEADlBYm2A4iQASIABEgAkQgMQRogBKDmjciAkSACBABIkAE0oIADVBamGA7iAARIAJEgAgQgcQQoAFKDGreiAgQASJABIgAEUgLAjRAaWGC7SACRIAIEAEiQAQSQ4AGKDGoeSMiQASIABEgAkQgLQjQAKWFCbaDCBABIkAEiAARSAwBGqDEoOaNiAARKBYB2ST3xBNPjL4WfeSRR0ZbhvAgAkSACBSCAA1QIajxHCIQKAKVN2NduXJltEXLZpttFqHx05/+FNOmTYt+HjVqFMaMGYP33nsPstP7Mcccg2uuuQbbb7999Pv3338fu+666ya72y9evBiVd9KuDrPspfWvf/0Ljz32WLSXFg8iQASIQKEI0AAVihzPIwKBI/Czn/0s2gRY9rKrfAwaNAj3338//vrXv+KQQw7B//73P1x00UWYM2dONHMjBqfCAH3++edo0qSJGsm+fftGhkr23st1yD5WFYZMfVEGEgEiECQCNEBB0s6kiUDxCOQyQO+++y5kV/dnnnkGHTt23HAT2eC1Xbt20eMr2SSyEAN0wgknYOrUqahTp060i/pNN92EevXqRWbo2GOPxe23345DDz00eiw2adKkaMbpgw8+iNojsR06dIjaIybpyiuvjHaaX7ZsWdRO2Vx4p512Kh4UXoEIEIHMIEADlBmq2FAikC4Echmg2267DVdffXVkPKofl19+OZ544gk8//zzBRkgud6pp54azRhVzACNHTsWZ5xxBoYOHYqLL74Ya9eujXZYP+uss/Dggw9iv/32i0zTmWeeibfffhvNmjXD4MGDo9moe+65J/rvSy+9FC+88EJk2ngQASIQDgI0QOFwzUyJgCkCuQyQmJ9//OMfmDVr1ib3kjVBN954I+bNm7fBAG299dbRjI4cXbp0wbhx42ptYy4DdOGFF0IWR1esCfrlL3+JTp064f/+7/82XEtmefr164eTTz45eoT23HPPYd99941+v2rVqmgtksxKtWrVyhQjXowIEIH0IkADlF5u2DIikGoE0jIDJKbq1Vdf3YDVD3/4w8jMVF4LJI+9ZAZK1hA1b94clY2XnLh69epodqriMVmqgWfjiAARMEGABsgERl6ECISHQC4DNH/+fHz/+9+vcQ1Qjx49MHz4cNNHYPI48hyDpgAAAdRJREFU7JVXXtlAwFFHHRUtzpYZn+rHt99+G80AySOwPffcMzzSmDERIAIbEKABohiIABEoCIGa3gIbOHAgHnjgAcj6HHn0JG+Bybqb2bNnR8Zjm222KakBeuihh6LHX5MnT8YBBxwAeV1f1h394Ac/iBY6yyOzt956K1r4LI+8Pv3002j2R8wZDyJABMJBgAYoHK6ZKREwRaAmA7R+/XrcfPPNkcGQR1Ey4yLrcq699lrssMMOURsKeQtMzsu1Bqj6DJDEyZtgcj95K61hw4Y48MADMXr0aLRs2RLffPMNrr/++mi9kZgzWQgta4bkLTIeRIAIhIMADVA4XDNTIkAEiAARIAJE4DsEaIAoBSJABIgAESACRCA4BGiAgqOcCROB9CIgHyc8++yzczZQvuPDjxWmlzu2jAhkDQEaoKwxxvYSASJABIgAESACRSNAA1Q0hLwAESACRIAIEAEikDUEaICyxhjbSwSIABEgAkSACBSNAA1Q0RDyAkSACBABIkAEiEDWEKAByhpjbC8RIAJEgAgQASJQNAI0QEVDyAsQASJABIgAESACWUOABihrjLG9RIAIEAEiQASIQNEIRAao6KvwAkSACBABIkAEiAARyBgC/x9ND5hx8uxUvAAAAABJRU5ErkJggg==\" width=\"640.0000169542105\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"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(990), y=np.arange(350), 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",
"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": 162,
"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(\"<div id='\" + id + \"'></div>\");\n if (!fig.cell_info) {\n console.error('Failed to find cell for figure', id, fig);\n return;\n }\n fig.cell_info[0].output_area.element.on(\n 'cleared',\n { fig: fig },\n fig._remove_fig_handler\n );\n};\n\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 '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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 '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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 = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n // Add the status bar.\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message pull-right';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n\n // Add the close button to the window.\n var buttongrp = document.createElement('div');\n buttongrp.classList = 'btn-group inline pull-right';\n button = document.createElement('button');\n button.classList = 'btn btn-mini btn-primary';\n button.href = '#';\n button.title = 'Stop Interaction';\n button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n button.addEventListener('click', function (_evt) {\n fig.handle_close(fig, {});\n });\n button.addEventListener(\n 'mouseover',\n on_mouseover_closure('Stop Interaction')\n );\n buttongrp.appendChild(button);\n var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n titlebar.insertBefore(buttongrp, titlebar.firstChild);\n};\n\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": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAkAAAAGwCAYAAABB4NqyAAAAAXNSR0IArs4c6QAAIABJREFUeF7tXQu4V1P6frso11TuUkLkktu4pVzHSLmVJKVMkUsXM1PE32VGF/cZ10FhBoUuYpqGSJTLiAqRGCJG6IKSXFLp9n/W3nPqnNM55/et3+/b+7f2Wu9+Ho/D+fbe63vfd33rPWuvvVe1devWrQMPIkAEiAARIAJEgAgEgkA1c9AABcI20yQCRIAIEAEiQAQiBGiAKAQiQASIABEgAkQgOARogIKjnAkTASJABIgAESACNEDUABEgAkSACBABIhAcAjRAwVHOhIkAESACRIAIEAEaIGqACBABIkAEiAARCA4BGqDgKGfCRIAIEAEiQASIAA0QNUAEiAARIAJEgAgEhwANUHCUM2EiQASIABEgAkSABogaIAJEgAgQASJABIJDgAYoOMqZMBEgAkSACBABIkADRA0QASJABIgAESACwSFAAxQc5UyYCBABIkAEiAARoAGiBogAESACRIAIEIHgEKABCo5yJkwEiAARIAJEgAjQAFEDRIAIEAEiQASIQHAI0AAFRzkTJgJEgAgQASJABGiAqAEiQASIABEgAkQgOARogIKjnAkTASJABIgAESACNEDUABEgAkSACBABIhAcAjRAwVHOhIkAESACRIAIEAEaIGqACBABIkAEiAARCA4BGqDgKGfCRIAIEAEiQASIAA0QNUAEiAARIAJEgAgEhwANUHCUM2EiQASIABEgAkSABogaIAJEgAgQASJABIJDgAYoOMqZMBEgAkSACBABIkADRA0QASJABIgAESACwSFAAxQc5UyYCBABIkAEiAARoAGiBogAESACRIAIEIHgEKABCo5yJkwEiAARIAJEgAjQAFEDRIAIEAEiQASIQHAI0AAFRzkTJgJEgAgQASJABGiAqAEiQASIABEgAkQgOARogIKjnAkTASJABIgAESACNEDUABEgAkSACBABIhAcAjRAwVHOhIkAESACRIAIEAEaIGqACBABIkAEiAARCA4BGqDgKGfCRIAIEAEiQASIAA0QNUAEiAARIAJEgAgEhwANUHCUM2EiQASIABEgAkSABogaIAJEgAgQASJABIJDgAYoOMqZMBEgAkSACBABIkADRA0QASJABIgAESACwSFAAxQc5UyYCBABIkAEiAARoAGiBogAESACRIAIEIHgEKABCo5yJkwEiAARIAJEgAjQAFEDRIAIEAEiQASIQHAI0AAFRzkTJgJEgAgQASJABGiAqAEiQASIABEgAkQgOARogASUV6tWTRDFECJABIgAESAC/iCwbt06f5KpIBMaIAG9xgBpCuFf//oX2rZtK7izfyGh5h5q3kbBoebOvP2rX7ky8olz7XEvF3bF+D0NkAB1bSH41EkE8JUJCTX3UPOmAQrvDx1q3Q/Otcc927EijXgaIAHK2kJggfCjQAiksz6EnJNzG71kOZZa90Pr2uOei5qmARKwoi0EFgg/CoRAOjRAfARmIxMvYlnf/Khv2uOei+KmARKwoi0EFgg/CoRAOjRANEA2MvEilvXNj/qmPe65KG4aIAEr2kJggfCjQAikQwNEA2QjEy9iWd/8qG/a456L4qYBErCiLQQWCD8KhEA6NEA0QDYy8SKW9c2P+qY97rkobhogASvaQmCB8KNACKRDA0QDZCMTL2JZ3/yob9rjnovipgESsKItBBYIPwqEQDo0QDRANjLxIpb1zY/6pj3uuShuGiABK9pCYIHwo0AIpEMDRANkIxMvYlnf/Khv2uOei+KmARKwoi0EFgg/CoRAOjRANEA2MvEilvXNj/qmPe65KG4aIAEr2kJggfCjQAikQwNEA2QjEy9iWd/8qG/a456L4qYBErCiLQQWCD8KhEA6NEA0QDYy8SKW9c2P+qY97rkobhogASvaQmCB8KNACKRDA0QDZCMTL2JZ3/yob9rjnovipgESsKItBBYIPwqEQDo0QDRANjLxIpb1Lf36VrduLJ2lS/UkpD3u6bVM70o0QAIstYXAApF+gRDQnGgIOSfniQrMoYtT6+lrnQYovw5AAyTAjQZIAJIwJNTiGGreRhah5s68hUXBo7C0OV+7Fhg1CujWDTA/H3kk0Ls30LkzUL16YcBqj3uFtSaZs2mABLhqCyHtTiJIMbWQUHMPNW8aoPRnA1LrzJXciFpPh3NjeDp1AsaOBdasicmoVi02Pu3bA6NHF2aCtMe9YuuyovvTAAlY0RYCC0Q6BUJAbWoh5Jycpya2It+IWk9H6yNGxDM/JeanNO01agDDhwNduuQvBu1xL/+WJHcmDZAAW20hsECkUyAE1KYWQs7JeWpiK/KNqPV0tN6yJTB1KrBu3caEm5mgFi2AKVPyF4P2uJd/S5I7kwZIgK22EFgg0ikQAmpTCyHn5Dw1sRX5RtR6Olpv0ABYsKByss3v583LXwza417+LUnuTBogAbbaQmCBSKdACKhNLYSck/PUxFbkG1HryWv9q6+AffeNX3vnDFD+gqcBEmBHAyQASRgSanEMNW8ji1BzZ97CouBRWBqcm8deZ54JLFwYL3quyABxDZBMVDRAApxogAQgCUPSKBDCpqQaFmreNEDJzwakKmTBzaj15Dh/4AHgkkuAVauA884Dvv/e/IHBt8AEsqwwhAZIgBwNkAAkYUioxTHUvGmAkhsMhV0u9TBqXZ/zlSuB3/0O+NvfgE02Af76V+Dii+PZn9LfATILn3v14neApKKnARIgRQMkAEkYEmpxDDVvGiD9wVDY1YoWRq3rcz5oEDBwILDjjsCTTwLmDbCkD+1xL+n25nN9GiABatpCYIHQLxACGosaQs7JeVEFmOLNqXV9rS9bBvzhD8DgwcDOO6dDpva4l06r7e5CAyTAS1sILBD6BUJAY1FDyDk5L6oAU7w5tV641s2jLbPe5+ij47e9inFoj3vFyCHXPWmAciEUfV68GtZVtNRecG5FISwQhReIPKEv2mnknJwXTXwp35haL0zrK1YAffoADz0E7L8/MHNmYVta5Eu/9riXbzuSPI8GSICuthBYIAorEALKnAsh5+TcOVEm1CBqPX+tmw8Xmn283nwzftRl1vuYDU6LcWiPe8XIIdc9aYByIcQZIAFC8pBQi2OoeRtlhJo785bXBV8iC+H83/8GzjoL+OabeJGzMT9m0XOxDhqgYiHv2H21hVBIJ3EMGuvmhJp7qHnTAOU/G2DduRw5gVq35/yVV4Df/AZYvRro3Ru44w6gVq3iEqo97hU3m4rvzhkgASvaQmCBsC8QApqcDiHn5NxpgSo2jlq31/ovvwCnnBJ/v+f88xXJKOBS2uNeAU1J7FQaIAG02kJggbAvEAKanA4h5+TcaYEqNo5al2n9iy+AJUuAgw6KwTfv2ZitLVw5tMc9V/Iq3Q4aIAEr2kJggZAVCAE1mQkh5+Q8M2ItsKHUem6tv/QS0LEjULs28M47wHbbFQh6Aqdrj3sJNLHgS9IACSDUFgILRO4CIaAlUyHknJxnSrAFNJZar1zrZpbnrruA/v3j/bt+/3vg1lvj7S1cO7THPdfyM+2hARKwoi0EFggOhgLZeRMSqt6ZtzcSFidSFec//wxcdBEwYgSw6abA/fcDv/2t+NKpB2qPe6knILghDZAMJH4IUYCTJISDggQlv2LIuV985somVL4NLpXl/u238Vte5qOGjRoBY8cChxySC8ni/p4GqLj4O3N3bSGwQHAGyBlxp9CQUPXOvFMQl0O3qFsXWLVqFZYt2/h51tq1QNu2gNnT6/HH3VzzUx5K7XHPIarWN4UzQAJWtIUQamGs6i8kAQ2ZDiHnNL2ZFrBF40PVenkDZNb7fP450LhxDN5PP8WPvmrWtACziKHa414RU6n01jRAAla0hRBqgaABCs8EkPPwOA+tvpnZnVGjgG7dzMLmdWjRohp69ACefx544QXgrbeA3XYTDDSOhWiPe46lFzWHBkjAirYQQisQpSEONfdQ86YBogESlNjMhhjz06lTvKbHvNUVD6rxN33MYdb7jB8fb2qatUN73HMxfxogASvaQuBgyEFBIDtvQkLVO/P2RsKVJmLe6IpnfjYOMUZoyBCgZ89s4qA97rmIAg2QgBVtIYRaGDkbEJ7xI+fhcR5SfTOblk6dumHGp/RwYgxQixbAlCmCQcbBEO1xz8EU+QhMQoq2EEIqEOXxDTX3UPOmAaIBktTYrMY0aAAsWFB5683v583LZnba456LKHAGSMCKthA4GHJQEMjOm5BQ9c68vZFwpYn86lfxt31K1vxwBihbnNMACfiiARKAJAzhoCAEyqMwcu4RmYJUQuD7u++A3r2Bf/wDMAuhK1oDVKMGMHw40KWLADQHQ7THPQdT5CMwCSnaQgihQFSGa6i5h5o3H4FxtlNSY7MUM3lyvPB5/nygYUNgzz2BV14p+xZY9epA+/bA6NGA+TmLh/a45yIGnAESsKItBA6GHBQEsvMmJFS9M29vJBwlsmIFcNVVwJ13xnmdey5w993AVluV/Q5Qy5bV0KsX0Llzds2PyU973HNRDTRAAla0hRBqYeRsQHjGj5yHx7mP9c2Yn8MPB957D6hXL97I9Kyzyg4eVW2FIRhmnAvRHvecS5AfQpRRoi0EHwuEDMnKNwuUnp/VOHJOI5BV7dq221etX3458O67wMMPA+btrvIHDZCtUoofzxkgAQc0QAKQhCG+Fsdc6YeaN2eAaPxy9Q1Xfz93LvDqq/GjLnOsWgWYhc1VrenxqZ9rj3su8kwDJGBFWwg+dRIBfGVCQs091LxpgGiAbGtEsePNK+2PPgpccgnw88/AG28A5nV3yeFTP9ce9yT4pR1DAyRAXFsIPnUSAXw0QAj30R8NEA2QbY0oZvy338ZbVzz5ZLyn15VXAgMHArVqyVrlU23XHvdkCKYbRQMkwFtbCD51EgF8NEA0QGjblkbAtq9kNT6r9c3s3t69O7BwIbDrrvEs0NFH27GQ1dwrylJ73LNDMp1oGiABztpC8KmTCOCjAaIBogGy7SgZjs9ifTPf9Nltt3idj/nGz1//CtSpY09CFnOvLEvtcc8ezeTPoAESYKwtBJ86iQA+GiAaIBog246S4fis1jfzTZ+ddwbOPDN/8LOaO2eA8ufc+zNpgPQo9qlA2KASat4Go1BzZ942PSTdWLN1xZ//DCxZAvzlL3r39olz7XFPD2W9K3EGSIClthB86iQC+DgDFLAJoAHi2ifbGpF0/Gefxa+2v/YasPnmwJw58cyPxuFTbdce9zTw1b4GDZAAUW0h+NRJBPDRANEA8RGYbUfJcLyr9c283j5sGPD73wM//QQccgjw2GPA3nvrge1q7vlkqD3u5dOGpM+hARIgrC0EnzqJAD4aIBogGiDbjpLheBfr2+LFwMUXA2PHxh8yNHt6XXut/PV2KR0u5i5te/k47XEv33YkeZ4XBmjlypW45JJLMGnSJCxevBgNGjTAFVdcgfPPPz/Crnv37hg5ciRqlfqYwwsvvIAjjzxShK22EHzqJCIASwWFmnuoefMRGB+B2daIJOI/+gg4+GBgp52ARx4BWrZM4i5+rXfTHveSQbywq3phgJYtW4ZbbrkF3bp1w+67747p06ejTZs2ePzxx9GqVavIANWtWxd3lmzja4mZthA4GHJQsJRgpsND1TvzTk+2a9fGO7IPGQKYLSwaNwZ69Ijf6Np667gdL70EHHpovHt7UodPnGuPe0lhXsh1vTBAFQHQvn17NGvWDIMHD6YBKkQhyuf6VCBsoAk1b84A0ezb9JN8Yo356dQpfrxlfjZrfcxXnM2/GzUCzKLnqvbvyueelZ3jUz+nAdJURorXWrFiBZo0aRLN+HTo0CEyQEaYhtCddtoJPXr0QN++fVFd2Cu0heBTJ7GlNdTcQ82bBogGyLZG2MaPGBF/vNC82l7+MEbooYfiLzyncfjUz7XHvTTwt72HdzNA69atw7nnnov58+dj8uTJkcl5++230bBhQ9SvXx9vvvkmOnbsiH79+kX/VHQMHDgQgwYNKvOrcePG2WLLeCJABIgAEUgYgSuvPAqzZ9cHUK0CA7QOTZsuwc03T0m4Ff5dvl27djDjqc+HVwbIkNWrVy/MmDEjWhC9dcnD33IMDhkyBI888gimTZsm4lbbCfv0V4IIwFJBoeYeat6cAeIMkG2NsI1v0ABYsKDys8zv582zvWp+8T71c+1xLz9Ekz3LGwNkzE+fPn0iU2NmfurVq1cpcvfddx+GDRtGA5Sstiq8uk8Fwga+UPOmAaIBsukn+cSaN7qmTo3X/JQ/zCOwFi2AKSlNAPnUz2mA8lFjkc4x5mfKlCl48cUXsc0225RpxZgxY9C6dWtstdVW0eyQWRdk4i+//HJRa7WF4FMnEQHIGaBgt4OgAaIBsq0RtvFVrQGqUQMYPhzo0sX2qvnF+1Tbtce9/BBN9iwvZoA+//xzNG7cGLVr10bNmjXXI9a1a1eY2Z5jjjkGs2bNwurVq6NvBJlF0P379+ci6GS1xRkgGr8IAZ8GBZsuw7xt0LKP/e474NZb4w8amq0tyr8FZt5xad8eGD2ab4HZo2vepKvGNUD5AOfbOdpCCLUwcjAMbzaAnIfHeRr1belS4MQTgbfeAsz7Kn/8Y/wdoKFDN3wHqFcvoHPn9MyPb1rXHvdc9AVezAAlDay2ENIoEEljku/1Q8091Lx9GxRsdB8q50nn/f33QKtWwBtvAMccAzz7LLDFFjbMJBebdO7JtXzjK2uPe2m2XXovGiABUtpC8KmTCOArExJq7qHmTQPEGSDbGlFV/A8/ACedBJgXeI86CpgwAdhyS807FHYtn/q59rhXGLLJnE0DJMBVWwg+dRIBfDRAAa+DoQGiAbKtEZXF//gj0Lo18Prr8Ztdzz2X7LYW+bTbp9quPe7lg2fS59AACRDWFoJPnUQAHw0QDRB3g7ftKBmOT6q+vf9+/MiraVNg4kSgTh33QEoq92Jkqj3uFSOHXPekAcqFkPm+qPJqeJ86iQA+GiAaIBog246S4fgk65sxQQ0bbtjg1DWYksw97Vy1x7202y+5Hw2QACVtIfjUSQTw0QDRANEA2XaUDMdr1reff453eDe7Fplv+rh+aOZe7Fy1x71i51PR/WmABKxoC8GnTiKAjwaIBogGyLajZDheq74Z83PaacCLLwIDBwIDBrgPilbuLmSqPe65kFP5NtAACVjRFoJPnUQAHw0QDRANkG1HyXC8Rn1bvhw4/XRg0iTgoIOAyZOB+ma/U8cPjdxdSVF73HMlr9LtoAESsKItBJ86iQA+GiAaIBog246S4fhC69uKFUDbtsDzzwMHHBDPAJXb3chZdArN3aXEtMc9l3IraQsNkIAVbSH41EkE8NEA0QDRANl2lAzHF1LfVq4Ezjgj/r5Ps2ax+dluu+yAUUjurmWpPe65lp9pDw2QgBVtIfjUSQTw0QDRANEA2XaUDMcXUt9mzQLM7u6NGgEvvQRsv322gCgkd9cy1R73XMuPBkjIiLYQfOokQgjXh4Wae6h5G+JDzZ1521aHON5scbHrrsAOO+R3fjHP8olz7XGvmLxUdm/OAAlY0RaCT51EAB9ngAI2ATRA/BJ0rhqxahUwfDjQo4d5JJEr2u3f+1Tbtcc9F5mjARKwoi0EnzqJAD4aIBogPgKz7SgZjrepb8b8dOoEjB0LDB4M/OlPGU7cs36uPe65yCwNkIAVbSHYFAhB8zIVEmruoebNGSDOAFVWoFavBs45B3jiCaBJE+Dll4EGDTJVzjZqrE/9XHvcc5FZGiABK9pC8KmTCODjDJBnfxmScxkCofZzSd7G/HTtCjz+OLD77sArrwC77CLD1eUoSe4ut79027THPRfzpgESsKItBJ86iQA+GiAaID4Cs+0oGY7PVd/WrAF++1tg5Ehgt93imR/z1pcPR67cs5Sj9rjnYu40QAJWtIXgUycRwEcDRANEA2TbUTIcn6u+vfsu0Lx5/JaXmfkxb3z5cuTKPUt5ao97LuZOAyRgRVsIPnUSAXw0QDRANEC2HSXD8ZL6ZmZ9jPExM0A+HZLcs5Kv9rjnYt40QAJWtIXgUycRwEcDRANEA2TbUTIcX1F9W7sWGDcu/spz1l91r4oan2q79rjnoqRpgASsaAvBp04igI8GiAaIBsi2o2Q4vnx9M+bn4ouBv/8duPFG4KqrMpxcjqb7VNu1xz0XWacBErCiLQSfOokAPhogGiAaINuOkuH40vXNmJ/evYH77wd23jle8LznnhlOjgbIK/JogAR00gAJQBKGhGr+Qs3byCLU3EPPe906oE8fYOhQYMcdY/PTtKmwUGQ0zCfOtcc9FymlARKwoi0EnzqJAD7OAAVsAmiAwvgQopnpGTUKGDIEmD17OZo23Qxbbgm88EL8tpcxP3vvbVstshfvU23XHvdcZJMGSMCKthB86iQC+GiAaID4CMy2o2Qo3pifku0szDd+zGEWOpsZoNq1gbfeApo1y1BCBTTVp9quPe4VAGtip9IACaDVFoJPnUQAHw0QDRANkG1HyVD8iBFAt25Aifkp3fQaNeKNTrt0yVBCBTTVp9quPe4VAGtip9IACaDVFoJPnUQAHw0QDRANkG1HyVB8y5bA1KnxjE/5w8wEtWgBTJmSoYQKaKpPtV173CsA1sROpQESQKstBJ86iQA+GiAaIBog246SoXizgemCBZU32Px+3rwMJVRAU32q7drjXgGwJnYqDZAAWm0h+NRJBPDRANEA0QDZdpSMxH/9NbDvvsCSJRU3mDNAGSGygmZqj3suIkEDJGBFWwg0QGG8GVNaWuScnAtKTWZCzOMus5P7JZcA335bebO5BigzlFbw+LIa1lX0XDO7KVWUY7Vq63zPskDCaIAKBLDU6aEagVDzNtSHmrvPeX//ffxBw0WLgF69gK++Ap56CjBvhJkx08z8VK8OtG8PjB4d/xzC4RPn2uOei/xzBkjAirYQfOokAvj4CCxgE0AD5M/MlzE2y5Yh+r6POSZMADbdFDj++Nj4mO8AmY8efvjhcuyzz2aRMercORzz45vWtcc927EijXgaIAHK2kKgAfJnUBDIJwoh5+RcqhUX4xYuBHr2BH78EZg0qWpTQ637oXXtcc9FXdMACVjRFgILhB8FQiCd9SHknJzb6MWVWDPr89hjwB/+AHz3HbDHHsArrwDmza7KDmrdD61rj3uuaLp0O2iABKxoC4EFwo8CIZAODVDAs19Z7+fm1Xazi/v48fGant//HrjhBmCLLapWftbztunX5WN9yl173CsE16TOpQESIKstBJ86iQC+MiGh5h5q3iE//ssy56+/DpxyCrB0KdCkCfDQQ8DRR8t6e5bzlmUYxuyX9rhXKLZJnE8DJEBVWwgsEJwBEsjOm5BQ9Z7lvH/4ATjwQOCMM4Drrwc231wuxyznLc+y4kifctce9wrFNonzaYAEqGoLwadOIoCPM0ABPwbiDFA2zL5Z6zNsGHDEEfGHDc1h3vjK9birov7P+pYNznPVbu1xL9f9ivF7GiAB6tpCYIHwo0AIpLM+hJyTcxu9pBlrtqm48ELgueeA5s0B8/jLrPnJ96DW/dC69riXr56SPI8GSICuthBYIPwoEALp0AAFPPvlej83sz5mbc+llwLmkVfTpsDDDwNHHmmj7I1jXc+7sOyqPtun3LXHvSRxz/faNEAC5LSF4FMnEcDHR2ABmwA+AnPT7H/xRTzr8/zz8Td9+vcHBg4ENtvMtkfTAJVGwKfarj3uFa4s/SvQAAkw1RaCT51EAB8NEA0QN0O17SgJx19zDXDjjcA++8SzPmbtj9bB+uam6bXlV3vcs71/GvE0QAKUtYXAAuFHgRBIh4/AAjZ/rvXzn37asI3F8uXA3XfH3/Yx21loHq7lrZlbrmv5lLv2uJcLu2L8ngZIgLq2EHzqJAL4OAMUsAngI7Dim32z1ueBB4ArrwReeAE49FDbXmsXz/pWfM7tGKs4Wnvc02iT9jVogASIaguBBcKPAiGQDmeAAjZ/affzkg1Ju3WLNyc1i5nPOgt4+mngxReBGjWAv/4V6N3bRrn2sWnnbd/C5M7wKXftcS851PO/Mg2QADttIfjUSQTwcQYoYBPAGaB0zL4xPJ06AWPHAmvWbNwr99sv/s5P0rM/IfPtW+7a457tWJFGPA2QAGVtIdAApTMoCKhNLYSck/MkxTZiBGBmfioyP+abPuZ19+7dk2zBhmtT635oXXvcS0d9dnehARLgpS0EFgg/CoRAOnwEFvDsV5r9vGVLYOpUwKz3KX8YA9SiBTBlio1i849NM+/8W5nMmT7lrj3uJYN4YVelARLgpy0EnzqJAD4+AgvYBPj2WMBG72n28wYNALN7e2WH+b354nMaR5p5p5GPzT18yl173LPBMa1YGiAB0tpC8KmTCOCjAaIB4neAbDuKZbxZ4/PBBxWfxBkgSzALCPeptmuPewXAmtipNEACaLWF4FMnEcBHA0QDRANk21Es4v/xD+Dssyte/2MuY97+Gj4c6NLF4qIFhLK++fGIX3vcK0BSiZ1KAySAVlsILBB+FAiBdNaHkHNybqMXaaxZ3Gy2tDBvgR1yCDBzZvyzWQtkZn7MNhft2wOjR8c/p3FQ635oXXvcS0N7tvegARIgpi0EFgg/CoRAOjRAAc9+Jd3Pb78duOwyYJNNAPMW2JlnAqNGAUOHAnPnAo0bA716AZ07p2d+jOCTztum36Ud61Pu2uNe2lxI7kcDJEBJWwg+dRIBfHwExkGBj8BsO0qO+NdeA446Kt681Hz7p3Vr5RsUcDnWNz/+wNMe9wqQVGKn0gAJoNUWAguEHwVCIB3OAAVs/pLu5zfcABx3HGBegXfpSDpvl3It3xafctce91zkjQZIwIq2EHzqJAL4OAMUsAkI+ZGIdj9ftQqYMQNo3ty216Ubr513uq0v7G4+5a497hWGbDJn0wAJcNUWgk+dRAAfDRANEB+B2XaUcvFm9/bdkQafAAAgAElEQVSOHYGJE4EJE4ATTijwggmezvrmxwy39riXoOTyvjQNkAA6bSGwQPhRIATS4SOwgM2fVj//4Qfg9NOBV14B9t473tF9l11s1JdurFbe6bZa524+5a497ukgrHsVGiABntpC8KmTCODjDFDAJoCPwAoz+4sWxQuc3347fs3dzP5st51tr0s3nvWtMM7TZavyu2mPe67kVbodNEACVrSFwALhR4EQSIczQAGbv0L7+ZdfAq1aAbNnA8ccAzz9NFCnjo3qihNbaN7FabXOXX3KXXvc00FY9yo0QAI8tYXgUycRwMcZoIBNAGeA8jf7t90G9O8PnHoqMGZM/Mp7Fg7Wt/w5d4lf7XHPpdxK2kIDJGBFWwgsEH4UCIF0OAMUsPkrtJ+brzk/9hjQqVP8scOsHIXmnZU8K2qnT7lrj3su8uqFAVq5ciUuueQSTJo0CYsXL0aDBg1wxRVX4Pzzz48wX7VqFfr164eRI0dG/92lSxfccccdqFmzpogTbSH41ElEAJYKCjX3UPPmDJCd2TcfOPzpJ+Ckk2x7ljvx1Lod5+4wV7Yl2uOei3l6YYCWLVuGW265Bd26dcPuu++O6dOno02bNnj88cfRqlUrDBgwIPo8+wSzghCIfte+fXtce+21Ik60hcAC4UeBEInnf0HknJzn0stzz8X7dpnDrPtp1CjXGW7+nlr3Q+va456LavXCAFUErDE4zZo1w+DBg9GwYcNoxqdDhw5R6BNPPIH+/fvj888/F3GiLQQWCD8KhEg8NEDB7g1l08/NGp+uXc1sNWDW/lx6qY263Iq1ydutlhfeGp9y1x73CkdX/wpeGqAVK1agSZMmuPPOO3HCCSegfv36mDNnTvT/zGF+3muvvbB06VJsvfXWOVHVFoJPnSQneOUCQs091LwN/aHmLs37b38DLr443r3d/Py/J/e2XcuZeGnezjRYsSE+5a497inCrHYp7wzQunXrcO6552L+/PmYPHly9O9GjRph0aJF2HbbbSPgzM/bb789vvzyS+xSwRfFBg4ciEGDBpUBedy4cWqg80JEgAgQAYPAP//ZBMOH74eaNdfg0ktnoEWLhQSGCDiBQLt27WDGU58PrwyQIatXr16YMWNGtCDazO5899130QzQJ598gj322CPi0vy85557cgaoCMr26S8kG/hCzZszQJU/7jVjyx/+ADz4IGD+vjrxRBtFuRtLrfvxiJ8zQO72sY1aZsxPnz59MG3atGjmp169eutjzBog8zjszDPPjP7fk08+iUsvvRRffPGFKENtIbBA+FEgROL5XxA5J+cV6WXtWvNIHmja1EZNbsdS635oXXvcc1G13swAGfMzZcoUvPjii9hmm23KYG3e9ho/fjyeffbZ6P+ffPLJMNN7fAssfUmGWhxDzZszQGUHw19+AXr2BM47Dzj66PT7Xxp3pNZpgNLQmcY9vDBA5m2uxo0bo3bt2mW+7dO1a1fcd9990XeA+vbtW+Y7QGZGiN8B0pCQ3TVCLY6h5k0DtGEw/PlnwLyIar7GceCB8f5e1avb9Z8sRFPrNEBZ0KlpoxcGKGmwtacCWSD8KBA2uiPnYXFet278AdZly+JPOH//PXDaacCrrwL77BPv6N6ggY2CshNLrfuhde1xz0UF0wAJWNEWAguEHwVCIJ31IeQ8LM5LG6Bvvom/7DxzJnDYYYB5Ev+/F1JtJJSZWGrdD61rj3suCpgGSMCKthBYIPwoEALp0AAF9h0gs6h51CigWzdgzZp1OOywajC7un/1FXD88eabSMBWW9koJ3uxrG9+1Dftcc9FJTthgNq2bRvt23XKKaeI1+WkCaa2EFgg/CgQNhok5/5zbsyP2bh07FhjfmJ1mI8bmmOnneK3vTbf3EY12Yyl1v3Quva456KanTBA1113HR599FF8//330Ual5513Hvbff39n8NIWAguEHwXCRqDk3H/OR4womfnZWBk1agDDh5uNmG1Uk81Yat0PrWuPey6q2QkDVALMq6++iuHDh0d7dZkPFZpZoc6dO5f5pk8xQNQWAguEHwXCRovk3H/OW7YEpk4FKvp4rpkJatECmDLFRjXZjKXW/dC69rjnopqdMkAlAH300Ufo1KkT3n333ejV9o4dO+KGG26ocNuKNEDVFgILhB8FwkZ75Nx/zs1bXQsWVK4K8/t582xUk81Yat0PrWuPey6q2RkDtHz5cvzjH/+IZoDeeOMNnHHGGejRo0f0fZ+bb745+sihMUTFOLSFwALhR4Gw0SI595/z3XYD5s6tWBWcAbLpLdmN9amfa497LrLqhAEyj7qM+dl3332j9T/msddWpV6VWLNmTbSv108//VQUDLWF4FMnsSUk1NxDzdvow/fczeLnK64Abrut8t7ANUC2lSKb8T5pXXvcc5FRJwyQ2ZfLzPbst99+lWI0d+7caDaoGIe2EHzqJLZ8hJp7qHmHYIAefhg4/3zAbD948MHAK6+UfQvMfO25fXtg9Gg/v/xcvgZQ637MdmqPe7ZjRRrxThigNBIt5B7aQmCB8KNA2GiKnPvL+erV8a7uv/sdsNdeZb8D1LJlNfTqBXTuHIb5CcHwVtXvfern2uOeTb1MK9YZAzRq1Ci8/PLLWLx4MczO7iXHWPNRjSIf2kLwqZPYUhNq7qHm7euAaD5saBY8/+pXlfeAUDkPNW/ftK497tmOFWnEO2GAzK7sDzzwQLT25/7778fFF1+MESNGRP991113pYFDlffQFgILhL+zAZUJiZz7w/nHHwOtWwM//gi88QZgFj9XdITKeah50wAVfai2boATBsis7XnqqadwwAEHoG7duli6dCmmTp2KW265BePGjbNOSvsEGiA9REMtjqHm7dugMH06cOqpwOLF8Vefhw0DatemASqNALXuh9nXHvf0RhG9KzlhgOrUqYMffvghymq77bbDwoULoy0xSsyQXrr5XUlbCCwQfhQIGzWR8+xz/swzQMeOwM8/A/36AbfeWvW6nlA5DzVv38y+9rhnUy/TinXCAJltL/75z3+iSZMmaNmyJXr16oX69evjwgsvxPz589PCotL7aAuBBSL7g6GtKMl5tjl/6CHgoovit7uM8bnsstwKCJXzUPOmAcrdJ1yLcMIAjRw5Ettssw1OOukkTJw4EWeeeSZWrlyJe++9FxeZqlPkgwZIj4BQi2OoefswKJh3MsxbXOZ9DPPKu3Q/r1A5DzVvH7ReutJrj3t6o4jelZwwQOXTWbVqVWSAttxyS71MC7iSthBYILI9G5CPlMh5tjlfuRJ45x2geXM5+6FyHmreNEDyvuFKpFMGaPXq1fjZPGAvdZj1QcU+aID0GAi1OIaad1YHheXLgd69gf79gSq+z1plxwiV81DzzqrWKxOx9rinN4roXckJAzRt2rTo1ff//Oc/678BZL4FZAgw22AU+9AWAgtEtmcD8tEjOc8O50uWAKefDrz2GvDrXwOTJ+fDuP9bgFSGCrWeHa1XpWztcS+/XpTsWU4YoKZNm+Lss8+Ovvuz+eabl8l41113TRYBwdW1hcAC4UeBEEhnfQg5zwbnX3wRf+Pnww+Bww8Hxo83b6baML0hNlTOQ82bM0D59ZNinuWEAapXrx6WLFkSzfi4eNAA6bESanEMNe8sDQrvvQe0aQOYF09PPhkYMwbYYov8tR8q56HmnSWtS1StPe5J7pl2jBMGyLz23qpVK5xxxhlp5y+6n7YQWCCyMRsgEocwiJy7zfl//gO0bAl8/328sen99wM1awrJrSQsVM5DzZsGqLD+UoyznTBAZvanefPm2HbbbbHjjjuWwYF7gRVDFsndM9TiGGreWRkUVq0CTjsNOOwwYPBgQGMyOlTOQ807K1qXVnftP/yl900zzgkDdMopp+Dzzz+H+Xf5NUADBgxIE48K76UtBBYIt2cDkhAcOXeTc7OlxbbbxoybXd0LnfUprZ1QOQ81bxqgJCpnstd0wgCZ7/0sWLAALrzyXhHcNEB6Igy1OIaat6uDgvm44dVXx3t5vf565RuaFqL8UDkPNW9XtZ6vhrXHvXzbkeR5Thigww8/PNoKo0GDBknmmve1tYXAAuHmbEDeAhGcSM7d4dw87rrgAuCRR4C6dYEJE+w+cCigOwoJlfNQ8/aNc+1xT9pv0oxzwgDdfPPNGD16NHr37r3RGqDTzQc5inxoC4EFwp3BMC1pkXM3OP/pJ6BDB2DiRGCXXYDnnsv/Q4e5tBMq56HmTQOUq0e493snDNBuu+1WITLGePz3v/8tOmo0QHoUhFocQ83bpUHh66+BU04BZswAmjWLZ36MCUrqCJXzUPN2SesamtYe9zTapH0NJwyQdlLa19MWAguEG7MB2jqp6nrkvPicX3IJcO+9wDHHmMdT8eOvJI9QOQ81bxqgJHtTMtemARLgSgMkAEkYEmpxDDXvYgwKa9cCo0YBQ4YAc+cCjRvH+3q1bQv85S/AVVcBm24qFGwBYaFyHmrexdB6AfLMear2uJfzhkUIcMIAmUdgFX0Funbt2mjUqBE6duyI888/v2hfitYWAgtE8WcD0u5r5Dwdzo356dQJGDsWKNlG0HzTp3p1oH17YPTo+Oc0jlA5DzVvGqA0epXuPZwwQDfddBMefPBB9OzZMzI85ptAf/vb33DuueeiZs2auOeee6LNUq+99lrd7IVXowESAiUIC7U4hpp32oPCiBFAt24bzE9pSdaoAQwfDnTpIhCqQkionIead9paV5BolZfQHveSbm8+13fCAB122GEYNWoUmjRpsj6HOXPm4JxzzsGbb76JGTNm4KyzziragmhtIbBApDMbkE+HSOoccp4O52Y7i6lTAfOdn/KHmQlq0QKYMiUplsteN1TOQ82bBiidfqV5FycM0NZbb41FixahVq1a63NbsWJF9Er80qVLo/9nPpb4k3mHtQgHDZAe6KEWx1DzTntQ2HlnYOHCyvVqPjU2b56enqu6Uqich5p32lpPWsXa417S7c3n+k4YILMRqlkHZL4HVLIz/NVXX41PP/0UL7zwAj766CO0adOGM0D5MOzYOaEWx1DzTnNQ+PbbeMFzZX8ncQYonWJAracz25k0mzRASSP8v+vPnz8fnTt3xmuvvYZNN90UZvanZcuWGDlyJHbZZRe888470QyRMUrFOLSFwALhR4Gw0SI5T57zX34BDjwQmD27Yma4BshGsfnHUuvJaz1/duRnao978junF+nEDFBJul9++SUWLlyInXfeOTI+rhzaQmCB8KNA2OiTnCfH+c8/A5tvHrOxZAlw4YXxd37MG2FmLRDfArNRauGx1HpyWi+cHfkVtMc9+Z3Ti3TKAKWXtt2dtIXAAuFHgbBRETlPhvO77wZuvTXe0LRkK8GS7wANHbrhO0C9egGdO6f3Cnyaj/5sdJhGLLWejNbT4K70PbTHvbTbL7lf0QzQUUcdhSn/ex3j4IMPrvQbP2+//bYkj0RjtIXAAuFHgbARHTnX5Xz1aqBv3/jLzrVrx9/9OflkG0aSjw2V81Dz9s30ao97yfc4+zsUzQCZ9T3mNXdzDDcf56jk6GY+6lHkQ1sILBC6g2GR5SG6PTnX4/z774Gzz443NN1++/hxV/PmIhpSDQqV81DzpgFKtXup3KxoBqh06x966CEcfvjhaNasGd59993oA4ibbLIJhg0bhv33318l0UIuQgNUCHplzw21OIaat/ag8NlnwKmnAh98EG9o+vTT8ZtfLh6hch5q3tpaL7amtce9YudT0f2dMEC77747pk+fju222w6tW7fGAQccEH3356WXXor+KfahLQQWCL3Z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tIXAApFOgTDmx+zbNXYssGbNxkT37Qvcfntysz6l70jO0+Fc0J1TCwmV81Dz9m2mV3vcS63jWdyIBkgAlrYQWCDSGQzNYmazhUVF5sd84PCRR4AuXQQCUAgh5+lwrkCV2iVC5TzUvGmA1LpOahfyxgDdc889GDZsGN577z20adMG48aNWw/iqlWr0K9fP4wcOTL6f126dMEdd9yBmpJtvGFmCKphnflIjNLBApHOYNiyJTB1KlARdWYfrxYtgClTlEjNcRlyng7n6bApu0uonIeaNw2QrF+4FOWNARo7diyqV6+OSZMmYd68eWUM0IABA6JFqBMmTIiwNwapffv2uPbaa0Vc0ACJYBIFpVEcP/kEeP/9eMPSBQsqb1aDBsC8eaJmFxyURt4FNzKhC4SaO/NOSFAOX9YnzrXHPRdp88YAlYA7cOBAzJw5s4wBatiwYTTj06FDhyjsiSeeQP/+/fH555+LONEWgk+dRARgqaCkcjd7d5lJvwceACZPBurUiTcvNd/44QyQLUu68UlxrttK/asxb31MXb+iT5xrj3sucue9Afruu+9Qv359zJkzB02aNIk4MD/vtddeWLp0KbbeeuucvGgLwadOkhO8cgHauc+ZA/ztb/FbXYsWxTczHzO84AJgp53irztXtAbIfOHZbHvBNUC2DNrHa3Nu34LinMG8i4N7Me/qE+fa414xeans3t4boC+//BKNGjXCokWLsK358AvMQLkI22+/Pczvdtlll42wMbNIgwYNKvP/S68pcpHIUNt0442H4403dkL16mtx2GFfo1WruTjooG+iLSzMW2C33noopk3bCevWmXVc1VCt2rron+bNF6J//7fW7/YeKn7MmwgQASJQEQLt2rVTXfvqIsreG6CSGaBPPvkEe+yxR8SB+XnPPffkDFARFFnIX0hml3Yz27PrrvGGpeZ46SXg9deB884Ddt5544RKvgM0dOiG7wD16hXv9G7eBEvrKCTvtNqY1H1CzZ15J6Uod6/rE+ecAXJXZ5W2rLI1QHfeeSfONHsdAHjyySdx6aWX4osvvhBlqC0EnzqJCMBSQba5r1wZf8fHrO15+eX4QuZJpjFD5k2urBy2eWclL0k7Q82deUvU4VeMT5xrj3suMu3NDNDq1ath/rn++usxa9YsjBkzJnorrFatWtHbXuPHj8ezzz4bcXDyySfDTO/x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L81rsetb2hpz5X40QK4wwXYQASJABIgAESACqSFAA5Qa1LwRESACRIAIEAEi4AoCNECuMMF2EAEiQASIABEgAqkhQAOUGtS8EREgAkSACBABIuAKAjRArjDBdhABIkAEiAARIAKpIUADlBrUvBERIAJEgAgQASLgCgI0QK4wwXYQASJABIgAESACqSFAA5Qa1LwRESACRIAIEAEi4AoCNECuMMF2EAEiQASIABEgAqkhQAOUGtS8EREgAoUiYDbJPfvss6OvRZ900knRliE8iAARIAL5IEADlA9qPIcIBIpA6c1Yly9fHm3Rsskmm0RoHH300ZgwYUL08z333IOhQ4fis88+g9np/dRTT8WNN96IHXbYIfr93Llzsdtuu220u/38+fNReift8jCbvbReeeUVTJw4MdpLiwcRIAJEIF8EaIDyRY7nEYHAETjuuOOiTYDNXnalj/79++PJJ5/Eww8/jKOOOgpfffUVLr/8csyYMSOauTEGp8QAfffdd6hbt64YyR49ekSGyuy9V9Fh9rEqMWTiizKQCBCBIBGgAQqSdiZNBApHoCID9N///hdmV/d///vfaNmy5fqbmA1emzVrFj2+MptE5mOAzjrrLIwbNw7VqlWLdlG/6667UKNGjcgMnXbaaXjggQdwzDHHRI/FRo8eHc04ffHFF1F7TGyLFi2i9hiTdN1110U7zS9dujRqp9lceOeddy4cFF6BCBCBzCBAA5QZqthQIuAWAhUZoPvvvx833HBDZDzKH3/6058wefJkvP7663kZIHO97t27RzNGJTNAw4YNwwUXXIABAwbg//7v/7B69epoh/WLLroITz31FA466KDINF144YX4+OOPsc022+CKK66IZqMee+yx6L+vvvpqvPHGG5Fp40EEiEA4CNAAhcM1MyUCqghUZICM+Xn66acxbdq0je5l1gTdfvvtmDNnznoDVKdOnWhGxxxt27bF8OHDq2xjRQbosssug1kcXbIm6JRTTkGrVq3whz/8Yf21zCxPz5490bVr1+gR2muvvYYDDzww+v2KFSuitUhmVqphw4aqGPFiRIAIuIsADZC73LBlRMBpBFyZATKmatasWeux2m+//SIzU3otkHnsZWagzBqi7bffHqWNlzlx5cqV0exUyWMyp4Fn44gAEVBBgAZIBUZehAiEh0BFBuiTTz5B06ZNK10D1LFjRwwaNEj1EZh5HDZz5sz1BLRu3TpanG1mfMofa9eujWaAzCOwvffeOzzSmDERIALrEaABohiIABHIC4HK3gLr168f/vnPf8KszzGPnsxbYGbdzfTp0yPjUa9evUQN0Pjx46PHX2PGjMGvfvUrmNf1zbqjfffdN1robB6ZzZ49O1r4bB55ffvtt9HsjzFnPIgAEQgHARqgcLhmpkRAFYHKDNC6devw17/+NTIY5lGUmXEx63Juuukm7LjjjlEb8nkLzJxX0Rqg8jNAJs68CWbuZ95Kq127No444ggMGTIEu+yyC3755Rf8+c9/jtYbGXNmFkKbNUPmLTIeRIAIhIMADVA4XDNTIkAEiAARIAJE4H8I0ABRCkSACBABIkAEiEBwCNAABUc5EyYC7iJgPk548cUXV9hA8x0ffqzQXe7YMiKQNQRogLLGGNtLBIgAESACRIAIFIwADVDBEPICRIAIEAEiWUu9ggAAAH5JREFUQASIQNYQoAHKGmNsLxEgAkSACBABIlAwAjRABUPICxABIkAEiAARIAJZQ4AGKGuMsb1EgAgQASJABIhAwQjQABUMIS9ABIgAESACRIAIZA0BGqCsMcb2EgEiQASIABEgAgUjEBmggq/CCxABIkAEiAARIAJEIGMI/D+fX+ViR6gAxwAAAABJRU5ErkJggg==\" width=\"640.0000169542105\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"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(990), y=np.arange(950), 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",
"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": 164,
"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(\"<div id='\" + id + \"'></div>\");\n if (!fig.cell_info) {\n console.error('Failed to find cell for figure', id, fig);\n return;\n }\n fig.cell_info[0].output_area.element.on(\n 'cleared',\n { fig: fig },\n fig._remove_fig_handler\n );\n};\n\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 '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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 '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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 = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n // Add the status bar.\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message pull-right';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n\n // Add the close button to the window.\n var buttongrp = document.createElement('div');\n buttongrp.classList = 'btn-group inline pull-right';\n button = document.createElement('button');\n button.classList = 'btn btn-mini btn-primary';\n button.href = '#';\n button.title = 'Stop Interaction';\n button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n button.addEventListener('click', function (_evt) {\n fig.handle_close(fig, {});\n });\n button.addEventListener(\n 'mouseover',\n on_mouseover_closure('Stop Interaction')\n );\n buttongrp.appendChild(button);\n var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n titlebar.insertBefore(buttongrp, titlebar.firstChild);\n};\n\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": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\" width=\"640.0000169542105\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"T = 0.432 ± 0.004 uK\n"
]
}
],
"source": [
"def expansion(x, A, B):\n",
" return np.sqrt(A*x*x+B)\n",
"\n",
"val_truncated = val_mean[3:]\n",
"std_mean_truncated = std_mean[3:]\n",
"\n",
"fitModel_temperature = NewFitModel(expansion)\n",
"fitAnalyser_temperature = FitAnalyser(fitModel_temperature, fitDim=1)\n",
"\n",
"params = fitAnalyser_temperature.fitModel.make_params()\n",
"params.add(name=\"A\", value= 1e6, max = np.inf, min = 1, vary = True)\n",
"params.add(name=\"B\", value= 1000, max = np.inf, min = 0, vary = True)\n",
"\n",
"fitResult_temperature = fitAnalyser_temperature.fit(val_truncated, params, x='TOF_free', dask=\"parallelized\")\n",
"\n",
"val = fitAnalyser_temperature.get_fit_value(fitResult_temperature)\n",
"std = fitAnalyser_temperature.get_fit_std(fitResult_temperature)\n",
"\n",
"fit_vals = tuple([val['A'].item(), val['B'].item()])\n",
"fit_vals_std = tuple([std['A'].item(), std['B'].item()])\n",
"\n",
"tof = (np.arange(2,16,0.1)*1e-3)\n",
"\n",
"fig = plt.figure()\n",
"ax = fig.gca()\n",
"val_mean.plot.errorbar(ax=ax, yerr=std_mean, fmt='or')\n",
"plt.plot(tof, expansion(tof, *fit_vals), 'b--',\n",
" label='fit: A=%.3f, B=%.3f' % tuple(fit_vals))\n",
"plt.xlabel('TOF (s)')\n",
"# plt.ylabel('Cloud Width - Vertical (pixels)')\n",
"plt.ylabel('Cloud Width - Horizontal (pixels)')\n",
"plt.tight_layout()\n",
"plt.grid(visible=1)\n",
"plt.legend()\n",
"\n",
"\n",
"m = 164*1.673e-27\n",
"kb = 1.38e-23\n",
"pixel = 5.86e-6\n",
"M = 2.3513\n",
"\n",
"T = fit_vals[0] * (m/kb) * ((pixel*pixel)/(M*M)) / (1e-6)\n",
"dT = fit_vals_std[0] * (m/kb) * ((pixel*pixel)/(M*M)) / (1e-6)\n",
"\n",
"print('T = %.3f \\u00B1 %.3f uK'% tuple([T,dT]))"
]
},
{
"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": 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": 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": 78,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The detected scaning axes and values are: \n",
"\n",
"{'carrier_freq': array([8.325, 8.33 , 8.335, 8.34 , 8.345, 8.35 , 8.355, 8.36 , 8.365,\n",
" 8.37 , 8.375, 8.38 , 8.385, 8.39 , 8.395, 8.4 , 8.405, 8.41 ,\n",
" 8.415, 8.42 , 8.425, 8.43 , 8.435, 8.44 , 8.445])}\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(\"<div id='\" + id + \"'></div>\");\n if (!fig.cell_info) {\n console.error('Failed to find cell for figure', id, fig);\n return;\n }\n fig.cell_info[0].output_area.element.on(\n 'cleared',\n { fig: fig },\n fig._remove_fig_handler\n );\n};\n\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 '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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 '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\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 = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n button.addEventListener('click', on_click_closure(method_name));\n button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n buttonGroup.appendChild(button);\n }\n\n if (buttonGroup.hasChildNodes()) {\n toolbar.appendChild(buttonGroup);\n }\n\n // Add the status bar.\n var status_bar = document.createElement('span');\n status_bar.classList = 'mpl-message pull-right';\n toolbar.appendChild(status_bar);\n this.message = status_bar;\n\n // Add the close button to the window.\n var buttongrp = document.createElement('div');\n buttongrp.classList = 'btn-group inline pull-right';\n button = document.createElement('button');\n button.classList = 'btn btn-mini btn-primary';\n button.href = '#';\n button.title = 'Stop Interaction';\n button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n button.addEventListener('click', function (_evt) {\n fig.handle_close(fig, {});\n });\n button.addEventListener(\n 'mouseover',\n on_mouseover_closure('Stop Interaction')\n );\n buttongrp.appendChild(button);\n var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n titlebar.insertBefore(buttongrp, titlebar.firstChild);\n};\n\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": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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va3jvffek+985ztyySWXyI033lhoGKP+xGU5bdo0mTRpkuhOn86RFQ1g69ato9tnyt5Co7uoOgfrrn+hHb44VuTENafq9TtbTSrLQltzaAArmUn0B5b1Uti4ceOiBVBdv27R6wuesx16+ezjjz+WzD0deg9LVcePf/xjeeqpp6J7Agv1HiFfLPXeId0l0F0DvdcqDQbQF8uvfe1r8v7770e3KFx11VXyzjvviNam3u6gl90K7fDFUTnde++9ort++hk6BwwdOjQyOoV6xGGp9XXaaadFu6L6BVvvt65oAA888ECZPn169EUkc8yePTva7dcXSRfa4YtjRU5ccyqvHJeaLMQ1hwawknrQb/I33HBDdFlM7wFUk3HttdfK3XffHX2br+5Ys2aN7Ny5U5YvXx5969fLu5XtGur9f/qtb+nSpdF9g4V6+GCp32KVmS6susuqRxoMoA+Wyk4X4d27d4vWD6/XdwAACxFJREFUbmbHT2td63/jxo0FV5q+OOpY1ktIuqOl96mtXr06MtFXXHFF9DBDIR5WlvplumvXrtG9krpbqkdVBlDvwS47d2busdRaLbTDF8eynLjmVL5+u9Rkoa45NICVzCStWrWKzJt+W8ocOqnPmjUruk/K9dA2ev/fqlWryjX59a9/HS0SzzzzjJx44omuckHG+WCphrxz587lLk9+8cUXEZ9atWpFvPWpwUI7fLBURnofpd77p/WYOfTeK700rLstuhtTSIcvjvrQgpobNc6ZQ+cMfQhMvxRqbRbaYWWpt2nofXxlby3Qsas7YPp3evn829/+tqTtErAvjpl645pT9frtUpN6i0whrjk0gJXMyI0aNYoMml6+yRz6Kge9R0Cf7HM99Ak2fZBEL69lDl0cVFsv/epiUeiHD5a6A6C7K2UPfUWPfku75557oh2tQjMt2lcfLFVXb3fQy2t6z1rGpChHvQViw4YNBVeivjjqa53OOeeciFvm0AcW/vM//zMygIV4P6WVpZq9t956q1xN6U7+kiVLZN68edHrh/TBOb29Q8fzwoULS2N1t79BgwYF+RCIL44Kj2uORK9iqmr9dqlJHbuFuObQAFayvOnlRN0NmTJlSnQJWB/o0G/xOpFnJne9H3D9+vXRe/30uP/++6NvrXo/lR76ugK9bPzTn/40Mnx66Ba8XgrSxVZfu5E5Dj30UNH/CvHwxbIiqzRcAvbFUl/50rFjx+gyutar3g+jtX711VdH7wYstMMXR72UqZfOp06dWnoJWL9EqjF85JFHCg1j1J84LCuCqOwS8LJly+SMM86I7r3W93vqw0n6Ja9QXwPjiyPXHLf126UmC3HNoQGsZFrWb55q1PTp0o8++kiaN28e3YuiN8RndpZ0wOrOnt73o4fe/K2GUe+jOuCAA6JLkHrvj74LMLOr0rZt20qfYNMni3QSLMTDF8tCHIzZ8u+TpT6NqU9c6uV1fSel3qNVqE8B++KoD32oYdHbPvTLoT5N/b3vfS/6O925KsQjDkvXxVZ3BNX06c505kXQ+mqtQjx8ceSa47Z+u9Zk2bhC2HSgASzE2YR9IgESIAESIAESIIFqCNAAsjxIgARIgARIgARIIGUEaABTlnB2lwRIgARIgARIgARoAFkDJEACJEACJEACJJAyAjSAKUs4u0sCJEACJEACJEACNICsARIgARIgARIgARJIGQEawJQlnN0lARIgARIgARIgARpA1gAJkAAJkAAJkAAJpIwADWDKEs7ukgAJkAAJkAAJkAANIGuABEiABEAE9JeBunXrJtu2bfP66x8rV66MfoZNf7lFf35S/5cHCZAACVgI0ABaaDGWBEiABKoh8Nlnn8nWrVvliCOOkKKiIm+sBg4cKJs3b5aHHnoo+h3xRo0aefssCpMACRQmARrAwswre0UCJOCJwL/+9S8pLi7eT72qv7eehprIzG+OV9X2xBNPlO985zsyatSoKuVR52M9f8aTAAmEQYAGMIw88SxJgAQSEPjiiy9k/Pjx8uCDD8ratWujHborr7xSfv7zn8uIESNk/vz5sm7dOvnKV74iP/jBD+QXv/hFqckbOXKkLFiwQK6++mq5/fbb5f3335fPP/9catWqJQ888IAsWrRInnnmGRk+fHh0+bfiJeBly5bJjTfeKH/+85+lcePGcv7558sdd9whhxxySNSjtm3byuWXXy6rV6+OzqNv374yY8aMKntbcWfxtttuiy4Ht2vXTh555BGZNGmSLF++PDq3wYMHy7Rp0+TOO++UNWvWRJ+l/bjqqqtK9f/0pz9FLFasWCHHHntsxKRfv37y2muvyfHHH5+AOpuSAAnkMwEawHzODs+NBEgAQkBNnpq/CRMmyGmnnSYbN24UvY9OjZeaum9/+9vSvHlzeeONN+SKK66Q66+/Xn72s59Fn60G8Ne//nXUTo1b7dq15bjjjosMYNOmTaO/O+uss6K/V5NV1gCq3imnnCKjR4+Oduw+/vhj+clPfiKdOnWKjFnGAOo9g7feemtk/vQ48sgjq+z3P/7xDznnnHPk3HPPjUynXgLWy8FqANXg3XXXXdK5c2epU6eO/O53vxM1iPfdd1/0d2rqtH933323XHLJJfLPf/4zaqf918/X87/mmmvkvffeowGEVB5FSCB/CdAA5m9ueGYkQAIAAp988ok0adIkMkFq+LIdulOoO2l/+ctfSg3g2LFjZf369ZFO5tCduGuvvTYylZmj4kMgF198sRx88MEyZcqU0piXXnpJzjzzzMh8HXTQQZFpU3Omu3+uh+7MqVlUc6qH7kqqkZs4cWJk4DJH69atZdy4cXLRRReV/p0a3oULF4ruTE6dOlVuuummaFe0bt26UczkyZNl6NChNICuyWAcCQRKgAYw0MTxtEmABNwI6CXOLl26RLtaapIqHvPmzYuMk16C3blzp+zdu1fq168vH330UakBfPjhh+Wdd94p11QN4KxZs6JLxlUZwGOOOSbSLXvPYElJiezatUveeust+frXvx4ZQN2V00uvrkdVBlDN5amnnhrJ6G6j7lCqAdXdysyh/TvssMNk06ZNct1118lf//pXWbJkSem/659Vn5eAXbPBOBIIkwANYJh541mTAAk4EtDLsN/4xjcqNYB6r5xe2tWHKXr27BkZo7lz50aXUbdv315qAPUewIqvWlEDmLlnryoDqAave/fu0X13FQ/dndOHPdQA6k6i/ud6VGUAy5o2NXh6T6OaVDXAZQ+9XK1mWD/zb3/7Gw2gK3jGkUABEaABLKBksiskQAL7E9i9e7c0bNhQ/uu//mu/S8Bq9PShiXfffbe0oV4m1l1BhAHU3UG9Z+/ZZ5+tMjW+DKB+YMuWLaMHPPT+vsqOzCVgfQBGdwr10MvVP/rRj7gDyMFEAgVOgAawwBPM7pEACUi0w3fPPfdEl3r1EqleHn3zzTejp3IvuOACmTlzpnzrW9+KHprQWH3KF2EAdXeta9eu0dO4eplXn/zVp20XL14s9957b5QanwbwN7/5TbT7qA+q9OrVS/bs2RPd26gPneiDLnrJW3cCdZfylltuie4l1HsI9bI1LwFz5JBAYROgASzs/LJ3JEACIqKvgVETpE8Cb9iwQZo1axbtcukDEPq0r75QWc2RPqmrhk0frkAYQIWvr3/R+/v+8Ic/iN7/1759e9EXOd98883eDaB+wOzZs6NX4Og9h2pA9QlmvfSrr6PRQy+DKws1ph07dox2C/v3708DyJFDAgVOgAawwBPM7pEACZCAhUDmiWLuAFqoMZYEwiNAAxheznjGJEACJOCNAA2gN7QUJoG8IkADmFfp4MmQAAmknYC+c1D/q+w4/fTTo18e8XnQAPqkS20SyB8CNID5kwueCQmQAAnI1q1bo/8qO/RJ3RYtWpASCZAACSQmQAOYGCEFSIAESIAESIAESCAsAjSAYeWLZ0sCJEACJEACJEACiQnQACZGSAESIAESIAESIAESCIsADWBY+eLZkgAJkAAJkAAJkEBiAjSAiRFSgARIgARIgARIgATCIkADGFa+eLYkQAIkQAIkQAIkkJgADWBihBQgARIgARIgARIggbAI0ACGlS+eLQmQAAmQAAmQAAkkJkADmBghBUiABEiABEiABEggLAI0gGHli2dLAiRAAiRAAiRAAokJ0AAmRkgBEiABEiABEiABEgiLAA1gWPni2ZIACZAACZAACZBAYgI0gIkRUoAESIAESIAESIAEwiJAAxhWvni2JEACJEACJEACJJCYwP8H/kbrPFobis8AAAAASUVORK5CYII=\" width=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%matplotlib notebook\n",
"shotNum = \"0024\"\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 = (135, 990)\n",
"imageAnalyser.span = (250, 250)\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",
"\n",
"plt.ylabel('NCount')\n",
"plt.tight_layout()\n",
"#plt.ylim([0, 3500])\n",
"plt.grid(visible=1)\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 81,
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[0.002, 0.003, 0.004, 0.005, 0.006, 0.007, 0.008, 0.009, 0.01, 0.011, 0.012, 0.013, 0.014, 0.015]\n",
"14\n"
]
},
{
"data": {
"text/plain": [
"0.008499999999999999"
]
},
"execution_count": 81,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"l = list(np.arange(2e-3, 16e-3, 1e-3))\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": [
"10.6 / 1e3"
]
},
{
"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)\n"
]
},
{
"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",
"Delta = 2 * np.pi * 100 * 1e3\n",
"\n",
"Bz = (Delta*hbar) / (muB*gJ)\n",
"print(Bz * 1e4)"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## ODT 1 Calibration"
]
},
{
"cell_type": "code",
"execution_count": 165,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"14.912\n",
"1.171\n",
"299.302\n"
]
}
],
"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))"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## ODT 2 Power Calibration"
]
},
{
"cell_type": "code",
"execution_count": 166,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1.874\n"
]
}
],
"source": [
"v = 0.842\n",
"P_arm2 = 2.302 * v - 0.06452\n",
"print(round(P_arm2, 3))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.12"
},
"vscode": {
"interpreter": {
"hash": "c05913ad4f24fdc6b2418069394dc5835b1981849b107c9ba6df693aafd66650"
}
}
},
"nbformat": 4,
"nbformat_minor": 2
}