summaryrefslogtreecommitdiff
path: root/prototype
diff options
context:
space:
mode:
authorjaseg <git-bigdata-wsl-arch@jaseg.de>2021-03-15 11:24:23 +0100
committerjaseg <git-bigdata-wsl-arch@jaseg.de>2021-03-15 11:24:23 +0100
commit2fe4df744e89bfa43de62340a66375c5c9cadc13 (patch)
tree06de8b615184150f18c07bd2aea040d20bca5037 /prototype
parentdf2d79189c3295f01dcb36d4e738fddccab8ece8 (diff)
downloadihsm-2fe4df744e89bfa43de62340a66375c5c9cadc13.tar.gz
ihsm-2fe4df744e89bfa43de62340a66375c5c9cadc13.tar.bz2
ihsm-2fe4df744e89bfa43de62340a66375c5c9cadc13.zip
Update notebooks
Diffstat (limited to 'prototype')
-rw-r--r--prototype/sensor-analysis/Accelerometer Data Analysis.ipynb3360
-rwxr-xr-xprototype/sensor-analysis/test_run.sqlite3bin114688 -> 4272128 bytes
2 files changed, 3247 insertions, 113 deletions
diff --git a/prototype/sensor-analysis/Accelerometer Data Analysis.ipynb b/prototype/sensor-analysis/Accelerometer Data Analysis.ipynb
index f25f4cb..75f0751 100644
--- a/prototype/sensor-analysis/Accelerometer Data Analysis.ipynb
+++ b/prototype/sensor-analysis/Accelerometer Data Analysis.ipynb
@@ -2,7 +2,7 @@
"cells": [
{
"cell_type": "code",
- "execution_count": 182,
+ "execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
@@ -16,6 +16,8 @@
"import scipy.fftpack\n",
"import scipy.signal\n",
"from matplotlib import pyplot as plt\n",
+ "from matplotlib import ticker\n",
+ "import matplotlib.dates\n",
"import scipy.optimize\n",
"%matplotlib notebook"
]
@@ -38,7 +40,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Last run was ID #2 with 1759 packets total, 504 distinct over 409.4534661769867s\n"
+ "Last run was ID #42 with 1745 packets total, 256 distinct over 217.80828976631165s\n"
]
}
],
@@ -53,7 +55,17 @@
},
{
"cell_type": "code",
- "execution_count": 4,
+ "execution_count": 39,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Override\n",
+ "last_run = 40"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 40,
"metadata": {},
"outputs": [],
"source": [
@@ -64,10 +76,8 @@
},
{
"cell_type": "code",
- "execution_count": 201,
- "metadata": {
- "scrolled": false
- },
+ "execution_count": 41,
+ "metadata": {},
"outputs": [
{
"data": {
@@ -1030,7 +1040,7 @@
{
"data": {
"text/html": [
- "<img src=\"data:image/png;base64,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etp95ERE9iYAzUMA+oAANAf++ONvr7/EDJqK/+HjtcopPqjknBIlzi1Uv2nr9D9Jy3TXmKW6efCChvBzXE89J6+I2HkJQPMQgD4gAM2BP/742+svMYPG8N958LjeytupId5mPZy0XP81dFFY4J1rtX9mnv775Wz1f3+DSoPHI3YtBKB5COswiW0AACAASURBVEAfEIDmwB9//O31l5hBtP237K1SuwHzzhl5XUYu0Z/fWaUXPtysSVnblbq2XDnFB7V131FV154ycj0EoHkIQB8QgObAH3/87fWXmEG0/T/cUNEQfAmzN2nayjKtKDmkqpONM38C0DwEoA8IQHPgjz/+9vpLzCDa/mnrdstxPf329WVROd+FIADNQwD6gAA0B/7442+vv8QMou0/a20oAB9OWh6V810IAtA8BKAPCEBz4I8//vb6S8wg2v4z15TLcT31SI7cd/L6gQA0DwHoAwLQHPjjj7+9/hIziLb/jFW7Iv6jXPxAAJqHAPQBAWgO/PHH315/iRlE23/6ylAA/uHNlVE534UgAM1DAPqAADQH/vjjb6+/xAyi7Z+yokyO6+mPb62KyvkuBAFoHgLQBwSgOfDHH397/SVmEG3/KctL5bie/vQ2AWgLBKAPCEBz4I8//vb6S8wg2v7v5O+U43rq9e7qqJzvQhCA5iEAfUAAmgN//PG3119iBtH2fysvFICPT1kTlfNdCALQPASgDwhAc+CPP/72+kvMINr+k3NL5Lie/jKVALQFAtAHBKA58Mcff3v9JWYQbf+k7B1yXE993lsblfNdCALQPASgDwhAc+CPP/72+kvMINr+r2eFArDftHVROd+FIADNQwD6gAA0B/7442+vv8QMou0/cel2Oa6nv01fH5XzXQgC0DwEoA8IQHPgjz/+9vpLzCDa/hMyt8lxPf19BgFoCwSgDwhAc+CPP/72+kvMINr+4xYXy3E99X9/Q1TOdyEIQPMQgD4gAM2BP/742+svMYNo+7+yKBSA8TM3RuV8F4IANA8B6AMC0Bz444+/vf4SM4i2/0sZW+W4ngakEoC2QAD6gAA0B/7442+vv8QMou0/ekGRHNfTs2kFUTnfhSAAzUMA+oAANAf++ONvr7/EDKLtPyo9FIAJszdF5XwXggA0DwHoAwLQHPjjj7+9/hIziLb/8Plb5LienptDANoCAegDAtAc+OOP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GhS1a/9XSUhIaHirq23btnrooYca/qW7Y8cOBQIBrV27Nuw53bt31+9+9ztJse//cWpra/WlL31JiYmJDcea8/0/+y+/SN3v5ORkXXnllZ8435VXXqnJkydHWsMXFxMAGRkZuuSSS8J++0PXrl315S9/WV/60pd0/fXX66mnngp7lTRWZnC+APT7OR/L/h9n3759uuyyyzR16tSw483l/jdFCMAmREVFhQKBgPLy8sKOJyYmqn379o10VZGnvr5e999/v77//e+HHZ82bZo8z1NBQYHmzJmjm2++WTfccEPDT4KfOnWqWrVq9Yn97rrrLv35z3+OyrX7Yd68efrggw+0ceNGZWRkqGvXrvrqV7+qYDCovLw8BQKBT3z905/+9CfdfffdkmLf/+NMnz5dLVq0CPNtzvf/7L/8InW/ExMT1a5du088pl27dho6dGgkFXxzoQA4efKkbr31Vj388MNhx19//XVlZGSooKBA7733ntq2batu3bo1fDxWZnAu/0h8zsey/8cZMWKE/u3f/k0nT54MO95c7n9ThABsQnwUgPn5+WHHhwwZog4dOjTSVUWexx9/XI7jXPCL9/fs2aOWLVtq5syZks7/P8Nu3brpscceM3KtJjl+/Li++tWvavTo0Q1BsGfPnrDHPProo7rnnnskNS//u++++4Jfo9Oc7v/5AtDv/T7fPw6vu+46DRs2LJIKvvm0AKirq9MDDzygW2655YK/+3X16tUKBAJas2aNpNiZwcW8AvqvfM43F/8OHTroiSeeuOA+sXr/myIEYBPChreAn3jiCV199dUqKSm5qMdfd911DV8nFctvAZ6Pbt26qVevXla9BVxaWqpLL71UaWlpF3xsc7n/vAV8/gCoq6vTgw8+qJtuuknBYPCC+9TX14d9XVyszOBiAlD67J/zzcE/OztbgUBA69evv+A+sXr/myIEYBOjc+fO6t27d9ixTp06xfw3gdTX1+svf/mLvv71r6u4uPiinhMMBtW6dWu9/fbbkv75BdHTp09veMyePXti4psAzkVNTY2+8Y1vaPDgwQ3fFDBixIiGj9fW1p7zmwJi3T8hIUFf+9rXdOrUqU99XHO6/+f7JhC/9/ujL4BfsWJFw2OW//927tgltTCM47iLhsVBEIIosaElCAPbWhwaokEa2sLhzEFE4NDc1tQW4RD9B20NQaBTCkEnkIIgOuHeEIIREr87neBcSy73Cvecnu9ntJLe9z3Id/B9Wq1IfgH+qwAI4m9hYSF0I36YdrsdukAWlz34kwD8m2f+J6zfdd2B29/fiev5RxEBGDHBGJiTkxPd399rd3dXExMTen5+/t//2j/Z2tpSJpNRo9EIXefv9XqSpG63q2q1qqurK/m+r3q9ruXlZc3MzAyMxcjlcrq8vNTNzY1WVlYiOwbkd9VqVY1GQ09PT2q1WiqXy3Ic5/NsDw4OlMlkdHZ2pna7rc3NzS/HgsR1/ZL08fGhfD6vvb290Os/8fy73a48z5PneUokEjo8PJTneZ83XEd13mtra1pcXFSz2VSz2VShUIjMCIxhe9Dv97W+vq5cLqfb29vQ58L7+7sk6fHxUfv7+7q+vpbv+zo/P9f8/LyKxWIs9mDY+kf5zMdx/YHX11eNj4/r+Ph44O/jfv5RRwBG0NHRkWZnZ5VKpbS0tBQalRJX3w38PD09lST1ej2trq5qcnJSyWRS+Xxeruuq0+mE3uft7U3b29vKZrNKp9Mql8sDvxNVwZy3ZDKp6elpbWxs6O7u7vPnwWDgqakpjY2NqVQqhW5JS/FevyRdXFwokUjo4eEh9PpPPP96vf7lM++6rqTRnffLy4sqlYocx5HjOKpUKpEZgjtsD3zf//ZzIZgN2el0VCqVlM1mlUqlNDc3p52dnYFZeVHdg2HrH+UzH8f1B2q1mtLp9MBsPyn+5x91BCAAAIAxBCAAAIAxBCAAAIAxBCAAAIAxBCAAAIAxBCAAAIAxBCAAAIAxBCAAAIAxBCAAAIAxBCAAAIAxBCAAAIAxBCAAAIAxBCAAAIAxBCAAAIAxBCAAAIAxBCAAAIAxBCAAAIAxBCAAAIAxBCAAAIAxBCAAAIAxBCAAAIAxBCAAAIAxBCAAAIAxBCAAAIAxBCAAAIAxBCAAAIAxBCAAAIAxBCAAAIAxBCAAAIAxBCAAAIAxBCAAAIAxBCAAAIAxvwDHZMgi9rF7ggAAAABJRU5ErkJggg==\" width=\"640\">"
+ "<img src=\"data:image/png;base64,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VUX8OY+9c0aPHq3MzEwe9wQ6efKkSktLLevmm2/WPffco9LSUh57JDUCMMkEvgZm4cKFKi8v18MPP6wBAwZo//79bt+0lHHq1CmVlJSopKREPp9PL730kkpKSoJfpfPss89q4MCBWrp0qUpLS/XjH/844tcyXHXVVfr444+1fft2jR49OuLXMtx4443asGGDNmzYoBtuuMHTX8swceJEDRw4UPn5+aqvrw+us2fPBo/hsU+MRx55RIWFhdq3b5927typ6dOn68ILL9SaNWsk8bg7KfQlYInHHsmLAExCc+fOVUZGhvr166dhw4YFv0YDscnLy5PP5+uyMjMzJZ3/YtYrrrhC/fv312233Rb8pGpAc3OzHnroIf35n/+5/uzP/kxjx47VgQMHLMccP35cd999d/DLd++++25PfzFrpMfc5/Np0aJFwWN47BPj3nvvDf434/LLL9eYMWOC8SfxuDspPAB57JGsCEAAAACPIQABAAA8hgAEAADwGAIQAADAYwhAAAAAjyEAAQAAPIYABAAA8BgCEAAAwGMIQAAAAI8hAAEAADyGAAQAAPAYAhAAAMBjCEAAAACPIQABAAA8hgAEAADwGAIQAADAYwhAAAAAjyEAAQAAPIYABAAA8BgCEAAAwGMIQAAAAI8hAAEAADyGAAQAAPAYAhAAAMBjCEAAAACPIQABAAA8hgAEAADwGAIQAADAYwhAAAAAjyEAAQAAPIYABAAA8BgCEAAAwGP+f70wGG4QsxY6AAAAAElFTkSuQmCC\" width=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
@@ -1042,45 +1052,22 @@
{
"data": {
"text/plain": [
- "[<matplotlib.lines.Line2D at 0x7f9ceadd2610>]"
+ "[<matplotlib.lines.Line2D at 0x7f3e53e41670>]"
]
},
- "execution_count": 201,
+ "execution_count": 41,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fig, ax = plt.subplots()\n",
- "ax.grid()\n",
- "ax.plot(sorted(deltas)[:-2])"
+ "ax.plot(deltas)"
]
},
{
"cell_type": "code",
- "execution_count": 72,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Average speed of rotation: 7.94 Hz / 476 rpm\n"
- ]
- }
- ],
- "source": [
- "def fun(x, args):\n",
- " deltas, = args # poor api\n",
- " return np.sqrt(np.mean([ ((val + 0.5*x[0]) % x[0] - 0.5*x[0])**2 for val in deltas ]))\n",
- "res = scipy.optimize.minimize(fun, 0.1, args=[sorted(deltas)[:-2]])\n",
- "interval = np.abs(res.x[0])\n",
- "print(f'Average speed of rotation: {1/interval:.2f} Hz / {60 / interval:.0f} rpm')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 78,
+ "execution_count": 42,
"metadata": {},
"outputs": [
{
@@ -1100,25 +1087,26 @@
},
{
"cell_type": "code",
- "execution_count": 97,
+ "execution_count": 43,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Very approximate lower bound on baudrate: 92476.55870407648 bd\n"
+ "Very approximate lower bound on baudrate: 129032.25806451612 bd\n"
]
}
],
"source": [
- "approx_baudrate = 1.0 / (np.mean([ x for x in deltas if x < interval*0.1 ]) / (packet_len*10))\n",
+ "#approx_baudrate = 1.0 / (np.mean([ x for x in deltas if x < interval*0.02]) / (packet_len*10))\n",
+ "approx_baudrate = 1.0 / (0.0031 / (packet_len*10))\n",
"print(f'Very approximate lower bound on baudrate: {approx_baudrate} bd')"
]
},
{
"cell_type": "code",
- "execution_count": 152,
+ "execution_count": 44,
"metadata": {},
"outputs": [],
"source": [
@@ -1131,48 +1119,11 @@
},
{
"cell_type": "code",
- "execution_count": 154,
+ "execution_count": 45,
"metadata": {
"scrolled": false
},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "BUG: Duplicate sequence number\n",
- "Sequence number: 241\n",
- " (-53, -80, -12, 44, 11, -67, -61, 5, 47, -7, -74, -59, 15, 50, -18, -80)\n",
- " (43, 52, -14, -63, -32, 45, 60, -8, -59, -25, 44, 67, -1, -61, -25, 36)\n",
- "BUG: Duplicate sequence number\n",
- "Sequence number: 242\n",
- " (-59, -25, 44, 67, -1, -61, -25, 36, 72, -2, -54, 6, 96, 98, 26, -20)\n",
- " (47, -7, -74, -59, 15, 50, -18, -80, -49, 28, 31, -38, -86, -41, 36, 27)\n",
- "BUG: Duplicate sequence number\n",
- "Sequence number: 243\n",
- " (-49, 28, 31, -38, -86, -41, 36, 27, -50, -74, -18, 39, 26, -61, -74, -1)\n",
- " (72, -2, -54, 6, 96, 98, 26, -20, 21, 88, 73, -14, -26, 50, 95, 54)\n",
- "BUG: Duplicate sequence number\n",
- "Sequence number: 244\n",
- " (-50, -74, -18, 39, 26, -61, -74, -1, 53, 5, -67, -61, 8, 38, -13, -74)\n",
- " (21, 88, 73, -14, -26, 50, 95, 54, -32, -24, 22, 92, 30, -29, -8, 62)\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "<ipython-input-154-25bc058f475a>:7: UserWarning: BUG: Duplicate sequence number 241 for 2 payloads!\n",
- " warnings.warn(f'BUG: Duplicate sequence number {seq} for {len(set(le_packets))} payloads!')\n",
- "<ipython-input-154-25bc058f475a>:7: UserWarning: BUG: Duplicate sequence number 242 for 2 payloads!\n",
- " warnings.warn(f'BUG: Duplicate sequence number {seq} for {len(set(le_packets))} payloads!')\n",
- "<ipython-input-154-25bc058f475a>:7: UserWarning: BUG: Duplicate sequence number 243 for 2 payloads!\n",
- " warnings.warn(f'BUG: Duplicate sequence number {seq} for {len(set(le_packets))} payloads!')\n",
- "<ipython-input-154-25bc058f475a>:7: UserWarning: BUG: Duplicate sequence number 244 for 2 payloads!\n",
- " warnings.warn(f'BUG: Duplicate sequence number {seq} for {len(set(le_packets))} payloads!')\n"
- ]
- }
- ],
+ "outputs": [],
"source": [
"# group packets by sequence number\n",
"by_seq = { k: list(g) for k, g in itertools.groupby(packets, key=lambda x: x[0]) }\n",
@@ -1189,14 +1140,14 @@
},
{
"cell_type": "code",
- "execution_count": 155,
+ "execution_count": 46,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Sequence number range: 1 ... 510\n"
+ "Sequence number range: 739 ... 1457\n"
]
}
],
@@ -1207,18 +1158,22 @@
},
{
"cell_type": "code",
- "execution_count": 166,
+ "execution_count": 47,
"metadata": {},
"outputs": [],
"source": [
"# FIXME this is only approximate, doesn't consider sequence numbers properly!!!\n",
- "reassembled_values = np.array([ val for (_seq, values), *_rest in by_seq.values() for val in values[:8] ])"
+ "# Negate values: Our sensor is mounted such that -X points outwards,\n",
+ "# so by negating we get larger centrifugal force -> higher value\n",
+ "reassembled_values = np.array([ -val for (_seq, values), *_rest in by_seq.values() for val in values[:8] ])"
]
},
{
"cell_type": "code",
- "execution_count": 206,
- "metadata": {},
+ "execution_count": 97,
+ "metadata": {
+ "scrolled": false
+ },
"outputs": [
{
"data": {
@@ -2181,7 +2136,7 @@
{
"data": {
"text/html": [
- "<img src=\"data:image/png;base64,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7cI555wTcZmkBeDAgQPx1FNPtbt+37596NWrFwBg3bp16NevX6JXLWYYgMahn/pId7S7X0cB2ORmAGpId5ToV+9iABph/PjxuOyyyzB27FicfPLJ2LNnDwCguLgYp512WsRlkhaARUVF6NWrF4YNG4YdO3YAADweDx555BFkZGQAaI3BUzP3Y2UAACAASURBVE89NVmrGBUGoHHopz7SHe3u11EAHmMA6kh3lOhX5/IwAA0QCATwwgsvYODAgZg0aZJ+/QcffIBLL7004jJJ/RzAoqIiXHfddejWrRt69uyJk08+GT179sTMmTMBALNnz8a3v/3tZK5ipzAAjUM/9ZHuaHe/jgKwsTm29bW7XzyQ7ijRr7aJARhPXnrpJTz33HMRv2aLD4Lev38/5s2bh9zcXBw8eFC/ftWqVfj000+TuGadwwA0Dv3UR7qj3f20HeT3n17MAOwA6Y4S/Y4yABNGQgNw69at8Ptj+zNFQOsRQjt/WDQD0Dj0Ux/pjnb303aQA8ICsIEBqCPdUaJfzTE3A9AAdXV1mDRpEh5//HG8+eabyM/PR1NTU6fLJDQAu3fv3qWPdenVqxdKSkosXCNzMACNQz/1ke5od7/gALx1ytf65frjDEAN6Y4S/XYdamQAGmDw4ME466yz8Otf/xrf//730aNHD5x00kno378/7rrrrojLJDQAu3XrhgcffBCPPfZYTJOWlsYAFPSDHQz91Ee6o939ggMw+LPT6l0MQA3pjhL97vnPWgagAU477TRs2LBBv+x2u7Fp0ya89957GD16dMRlEhqAgwYNwnXXXdelqaqqSuQqdgkGoHHopz7SHe3upwegczFafH79cp3LE9PydveLB9IdJfoNemkZA9AA1157LTZt2tSlZWzxJhBVYQAah37qI93R7n4dBWBtEwNQQ7qjRL+hr67Un8t/nbGBARgjy5cvx29+8xs0NzfHvAwD0AQMQOPQT32kO9rdT9tJXuZcDJ8/oF8+ygDUke4o0e/G11bpz+VX83YxAGNk//79+MUvfoF+/frhiSeeQE5ODsrKyjpdhgFoAgagceinPtId7e4XHID+oACsOeaOaXm7+8UD6Y4S/RiAxrj66qvRr18//PnPf8b111+PM888E927d0efPn0wePDgiMswAE3AADQO/dRHuqPd/YIDMBBgAEZCuqNEPwagMU499VRs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\" width=\"640\">"
+ "<img src=\"data:image/png;base64,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Y+NGFfkdQGbhGVdZxMfHo2rVqvjoo49w9uxZLF++HEFBQU5vPGAW3uEqi549e6Jt27bYs2cPkpOTsWbNGtSoUcPpXIDMgjzBAugDK1asQNOmTVGtWjVERERg3759juvKTgQdHByM6tWrIzIyEklJSU63v/EdXUDpST179OiB6tWrIzg4GP/4xz9ueVLPTp06oVq1amjWrBlP6vlft8sjJSUFQohbzp49exy3Zx7eU96xcaOKvAsYYBaecpVFXFwcWrZsiRo1aqBDhw43nXeOWXhPeVmYTCb83//9H0JCQlCjRg20atUKixYtcrpfmQV5ggWQiIiISGdYAImIiIh0hgWQiIiISGdYAImIiIh0hgWQiIiISGdYAImIiIh0hgWQiIiISGdYAImIiIh0hgWQiIiISGdYAImIiIh0hgWQiIiISGdYAImIiIh0hgWQiIiISGdYAImIiIh0hgWQiIiISGdYAImIiIh0hgWQiIiISGdYAImIiIh0hgWQiIiISGdYAImIiIh0hgWQiIiISGdYAImIiIh0hgWQiIiISGdYAImIiIh0hgWQiIiISGdYAImIiIh0hgWQiIiISGdYAImIiIh0hgWQiIiISGdYAImIiIh0hgWQiIiISGdYAImIiIh05v8B5I24FCxcWXkAAAAASUVORK5CYII=\" width=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
@@ -2191,23 +2146,87 @@
"output_type": "display_data"
},
{
- "data": {
- "text/plain": [
- "Text(0, 0.5, '$a\\\\; [ms^{-1}]$')"
- ]
- },
- "execution_count": 206,
- "metadata": {},
- "output_type": "execute_result"
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Found sensor offset: 0.57 g / 5.55 m/s^2\n",
+ "\n",
+ "Centrifugal acceleration at 6.49 Hz:\n",
+ " Theory: 2.16 g / 21.14 m/s^2\n",
+ " Measurement: 1.90 g / 18.586194313627637 m/s^2\n",
+ " Rel. Error: 13.72 %\n",
+ " Abs. Error: 0.26 g / 2.55 m/s^2\n",
+ "\n",
+ "Centrifugal acceleration at 6.49 Hz:\n",
+ " Theory: 6.82 g / 66.88 m/s^2\n",
+ " Measurement: 6.60 g / 64.67817413725541 m/s^2\n",
+ " Rel. Error: 3.41 %\n",
+ " Abs. Error: 0.22 g / 2.20 m/s^2\n",
+ "\n",
+ "Centrifugal acceleration at 6.49 Hz:\n",
+ " Theory: 14.89 g / 146.00 m/s^2\n",
+ " Measurement: 14.82 g / 145.35641444809548 m/s^2\n",
+ " Rel. Error: 0.44 %\n",
+ " Abs. Error: 0.07 g / 0.64 m/s^2\n",
+ "\n",
+ "Centrifugal acceleration at 6.49 Hz:\n",
+ " Theory: 23.04 g / 225.90 m/s^2\n",
+ " Measurement: 23.11 g / 226.6766272456559 m/s^2\n",
+ " Rel. Error: -0.34 %\n",
+ " Abs. Error: -0.08 g / -0.77 m/s^2\n",
+ "\n",
+ "Centrifugal acceleration at 6.49 Hz:\n",
+ " Theory: 34.60 g / 339.27 m/s^2\n",
+ " Measurement: 34.80 g / 341.26606334638393 m/s^2\n",
+ " Rel. Error: -0.59 %\n",
+ " Abs. Error: -0.20 g / -2.00 m/s^2\n",
+ "\n",
+ "Centrifugal acceleration at 6.49 Hz:\n",
+ " Theory: 53.88 g / 528.41 m/s^2\n",
+ " Measurement: 51.75 g / 507.51233891199473 m/s^2\n",
+ " Rel. Error: 4.12 %\n",
+ " Abs. Error: 2.13 g / 20.90 m/s^2\n",
+ "\n",
+ "Centrifugal acceleration at 6.49 Hz:\n",
+ " Theory: 81.62 g / 800.43 m/s^2\n",
+ " Measurement: 82.09 g / 805.0345119987545 m/s^2\n",
+ " Rel. Error: -0.57 %\n",
+ " Abs. Error: -0.47 g / -4.60 m/s^2\n",
+ "\n",
+ "Centrifugal acceleration at 6.49 Hz:\n",
+ " Theory: 29.79 g / 292.17 m/s^2\n",
+ " Measurement: 29.71 g / 291.36536349393447 m/s^2\n",
+ " Rel. Error: 0.28 %\n",
+ " Abs. Error: 0.08 g / 0.81 m/s^2\n",
+ "\n",
+ "Centrifugal acceleration at 6.49 Hz:\n",
+ " Theory: 9.33 g / 91.46 m/s^2\n",
+ " Measurement: 9.21 g / 90.28568973827844 m/s^2\n",
+ " Rel. Error: 1.30 %\n",
+ " Abs. Error: 0.12 g / 1.17 m/s^2\n",
+ "\n"
+ ]
}
],
"source": [
+ "sampling_rate = 10 # sps, set in firmware\n",
"mems_lsb_per_g = 68 # LSBs per 1g for our accelerometer\n",
"\n",
+ "ivl_start, ivl_end = 0.5, 1\n",
+ "ivl_start, ivl_end = int(ivl_start*60*sampling_rate), int(ivl_end*60*sampling_rate)\n",
+ "\n",
"fig, ax = plt.subplots()\n",
- "ax.plot(reassembled_values / mems_lsb_per_g )\n",
+ "#ax.axvspan(ivl_start/60/sampling_rate, ivl_end/60/sampling_rate, color='orange', alpha=0.5)\n",
+ "\n",
"ax.grid()\n",
"\n",
+ "ts = np.arange(0, len(reassembled_values)) / sampling_rate / 60\n",
+ "ax.plot(ts, reassembled_values / mems_lsb_per_g, color='darkblue', alpha=0.2)\n",
+ "#ax.plot(ts, scipy.signal.savgol_filter(reassembled_values / mems_lsb_per_g, 21, 2) )\n",
+ "sos = scipy.signal.butter(8, 0.5, 'lp', fs=10, output='sos')\n",
+ "filtered = scipy.signal.sosfiltfilt(sos, reassembled_values / mems_lsb_per_g)\n",
+ "ax.plot(ts, filtered, color='darkblue')\n",
+ "\n",
"g = 9.8066\n",
"g_to_ms = lambda x: x * g\n",
"ms_to_g = lambda x: x / g\n",
@@ -2215,19 +2234,1097 @@
"ax.set_ylabel(r'$a\\; [g]$')\n",
"secax_y = ax.secondary_yaxis(\n",
" 'right', functions=(g_to_ms, ms_to_g))\n",
- "secax_y.set_ylabel(r'$a\\; [ms^{-1}]$')"
+ "secax_y.set_ylabel(r'$a\\; [ms^{-1}]$')\n",
+ "\n",
+ "formatter = ticker.FuncFormatter(lambda tick, _pos: f'{int(tick):02d}:{tick*60%60:02.0f}')\n",
+ "ax.xaxis.set_major_formatter(formatter)\n",
+ "\n",
+ "r_mems = 55e-3 # radius of our sensor from the axis of rotation in m\n",
+ "le_data = [(0, 50, 3.12), (1,50,5.55), (2,40, 8.2), (3, 30, 10.2), (4,15, 12.5), (5,10, 15.6),\n",
+ " (6,10, 19.2), (7,11, 11.6), (8,15, 6.49)]\n",
+ "avg_include = [True, True, True, True, True, False, True, True, True]\n",
+ "acc_theory = []\n",
+ "acc_meas = []\n",
+ "\n",
+ "for ts_m, ts_s, f_actual in le_data:\n",
+ " omegan = 2*np.pi*f_actual # angular velocity\n",
+ " acc = omegan**2 * r_mems # m/s^2\n",
+ " acc_theory.append(acc / g)\n",
+ " \n",
+ " ts_abs = ts_m + ts_s/60\n",
+ " ivl_w = 0.5\n",
+ " idx = (ts_abs - ivl_w/2 < ts) & (ts < ts_abs + ivl_w/2)\n",
+ " ivl_avg = (reassembled_values / mems_lsb_per_g)[idx].mean()\n",
+ " acc_meas.append(ivl_avg)\n",
+ "\n",
+ "# Calculate offset correction. The offset is due to manufacturing imperfections inherent to the device.\n",
+ "# Note that while in the \"0Hz\" still part of the line at the beginning and end of the trace we see a\n",
+ "# fraction of earth's gravity due to the sensor's position inside the device and the way the device lies\n",
+ "# on the workbench, this offset cancels out once the device is rotating.\n",
+ "#\n",
+ "# Our sensor is specified to have up to +/- 1.0 g offset. This is due to its large +/- 120 g range\n",
+ "# and we're well within that.\n",
+ "#\n",
+ "# The sensor's nonlinearity error is specified as +/- 2 %FS and we're well within that as well.\n",
+ "\n",
+ "def fun(x, *args):\n",
+ " return np.sqrt(np.mean([ (meas - x[0] - theory)**2\n",
+ " for theory, meas, inc in zip(acc_theory, acc_meas, avg_include)\n",
+ " if inc ]))\n",
+ "res = scipy.optimize.minimize(fun, 1)\n",
+ "sensor_offx = np.abs(res.x[0])\n",
+ "\n",
+ "print(f'Found sensor offset: {sensor_offx:.2f} g / {sensor_offx*g:.2f} m/s^2')\n",
+ "print()\n",
+ "\n",
+ "for theory, meas in zip(acc_theory, acc_meas):\n",
+ " ax.axhline(theory - sensor_offx, color='orange', alpha=1, zorder=1)\n",
+ " meas += sensor_offx\n",
+ " \n",
+ " print(f'Centrifugal acceleration at {f_actual:.2f} Hz:')\n",
+ " print(f' Theory: {theory:.2f} g / {theory*g:.2f} m/s^2')\n",
+ " print(f' Measurement: {meas:.2f} g / {meas*g} m/s^2')\n",
+ " print(f' Rel. Error: {(theory/meas - 1.0) * 100:.2f} %')\n",
+ " print(f' Abs. Error: {theory-meas:.2f} g / {(theory-meas)*g:.2f} m/s^2')\n",
+ " print()"
]
},
{
"cell_type": "code",
- "execution_count": 210,
+ "execution_count": 14,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Largest peak at 3.1162324649298596 Hz / 186.97394789579158 rpm\n"
+ "Average speed of rotation: 19.12 Hz / 1147 rpm\n"
+ ]
+ }
+ ],
+ "source": [
+ "speed_ivl_min, speed_ivl_max = ivl_start, ivl_end\n",
+ "\n",
+ "def fun(x, args):\n",
+ " deltas, = args # poor api\n",
+ " return np.sqrt(np.mean([ ((val + 0.5*x[0]) % x[0] - 0.5*x[0])**2 for val in deltas ]))\n",
+ "res = scipy.optimize.minimize(fun, 0.05, args=[sorted(deltas[speed_ivl_min:speed_ivl_max])[:-2]])\n",
+ "interval = np.abs(res.x[0])\n",
+ "print(f'Average speed of rotation: {1/interval:.2f} Hz / {60 / interval:.0f} rpm')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {
+ "scrolled": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "/* Put everything inside the global mpl namespace */\n",
+ "/* global mpl */\n",
+ "window.mpl = {};\n",
+ "\n",
+ "mpl.get_websocket_type = function () {\n",
+ " if (typeof WebSocket !== 'undefined') {\n",
+ " return WebSocket;\n",
+ " } else if (typeof MozWebSocket !== 'undefined') {\n",
+ " return MozWebSocket;\n",
+ " } else {\n",
+ " alert(\n",
+ " 'Your browser does not have WebSocket support. ' +\n",
+ " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
+ " 'Firefox 4 and 5 are also supported but you ' +\n",
+ " 'have to enable WebSockets in about:config.'\n",
+ " );\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
+ " this.id = figure_id;\n",
+ "\n",
+ " this.ws = websocket;\n",
+ "\n",
+ " this.supports_binary = this.ws.binaryType !== undefined;\n",
+ "\n",
+ " if (!this.supports_binary) {\n",
+ " var warnings = document.getElementById('mpl-warnings');\n",
+ " if (warnings) {\n",
+ " warnings.style.display = 'block';\n",
+ " warnings.textContent =\n",
+ " 'This browser does not support binary websocket messages. ' +\n",
+ " 'Performance may be slow.';\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.imageObj = new Image();\n",
+ "\n",
+ " this.context = undefined;\n",
+ " this.message = undefined;\n",
+ " this.canvas = undefined;\n",
+ " this.rubberband_canvas = undefined;\n",
+ " this.rubberband_context = undefined;\n",
+ " this.format_dropdown = undefined;\n",
+ "\n",
+ " this.image_mode = 'full';\n",
+ "\n",
+ " this.root = document.createElement('div');\n",
+ " this.root.setAttribute('style', 'display: inline-block');\n",
+ " this._root_extra_style(this.root);\n",
+ "\n",
+ " parent_element.appendChild(this.root);\n",
+ "\n",
+ " this._init_header(this);\n",
+ " this._init_canvas(this);\n",
+ " this._init_toolbar(this);\n",
+ "\n",
+ " var fig = this;\n",
+ "\n",
+ " this.waiting = false;\n",
+ "\n",
+ " this.ws.onopen = function () {\n",
+ " fig.send_message('supports_binary', { value: fig.supports_binary });\n",
+ " fig.send_message('send_image_mode', {});\n",
+ " if (fig.ratio !== 1) {\n",
+ " fig.send_message('set_dpi_ratio', { dpi_ratio: fig.ratio });\n",
+ " }\n",
+ " fig.send_message('refresh', {});\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onload = function () {\n",
+ " if (fig.image_mode === 'full') {\n",
+ " // Full images could contain transparency (where diff images\n",
+ " // almost always do), so we need to clear the canvas so that\n",
+ " // there is no ghosting.\n",
+ " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
+ " }\n",
+ " fig.context.drawImage(fig.imageObj, 0, 0);\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onunload = function () {\n",
+ " fig.ws.close();\n",
+ " };\n",
+ "\n",
+ " this.ws.onmessage = this._make_on_message_function(this);\n",
+ "\n",
+ " this.ondownload = ondownload;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_header = function () {\n",
+ " var titlebar = document.createElement('div');\n",
+ " titlebar.classList =\n",
+ " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
+ " var titletext = document.createElement('div');\n",
+ " titletext.classList = 'ui-dialog-title';\n",
+ " titletext.setAttribute(\n",
+ " 'style',\n",
+ " 'width: 100%; text-align: center; padding: 3px;'\n",
+ " );\n",
+ " titlebar.appendChild(titletext);\n",
+ " this.root.appendChild(titlebar);\n",
+ " this.header = titletext;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._init_canvas = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var canvas_div = (this.canvas_div = document.createElement('div'));\n",
+ " canvas_div.setAttribute(\n",
+ " 'style',\n",
+ " 'border: 1px solid #ddd;' +\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'clear: both;' +\n",
+ " 'min-height: 1px;' +\n",
+ " 'min-width: 1px;' +\n",
+ " 'outline: 0;' +\n",
+ " 'overflow: hidden;' +\n",
+ " 'position: relative;' +\n",
+ " 'resize: both;'\n",
+ " );\n",
+ "\n",
+ " function on_keyboard_event_closure(name) {\n",
+ " return function (event) {\n",
+ " return fig.key_event(event, name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'keydown',\n",
+ " on_keyboard_event_closure('key_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'keyup',\n",
+ " on_keyboard_event_closure('key_release')\n",
+ " );\n",
+ "\n",
+ " this._canvas_extra_style(canvas_div);\n",
+ " this.root.appendChild(canvas_div);\n",
+ "\n",
+ " var canvas = (this.canvas = document.createElement('canvas'));\n",
+ " canvas.classList.add('mpl-canvas');\n",
+ " canvas.setAttribute('style', 'box-sizing: content-box;');\n",
+ "\n",
+ " this.context = canvas.getContext('2d');\n",
+ "\n",
+ " var backingStore =\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " this.context.webkitBackingStorePixelRatio ||\n",
+ " this.context.mozBackingStorePixelRatio ||\n",
+ " this.context.msBackingStorePixelRatio ||\n",
+ " this.context.oBackingStorePixelRatio ||\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " 1;\n",
+ "\n",
+ " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
+ "\n",
+ " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
+ " 'canvas'\n",
+ " ));\n",
+ " rubberband_canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n",
+ " );\n",
+ "\n",
+ " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
+ " if (this.ResizeObserver === undefined) {\n",
+ " if (window.ResizeObserver !== undefined) {\n",
+ " this.ResizeObserver = window.ResizeObserver;\n",
+ " } else {\n",
+ " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
+ " this.ResizeObserver = obs.ResizeObserver;\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
+ " var nentries = entries.length;\n",
+ " for (var i = 0; i < nentries; i++) {\n",
+ " var entry = entries[i];\n",
+ " var width, height;\n",
+ " if (entry.contentBoxSize) {\n",
+ " if (entry.contentBoxSize instanceof Array) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " width = entry.contentBoxSize[0].inlineSize;\n",
+ " height = entry.contentBoxSize[0].blockSize;\n",
+ " } else {\n",
+ " // Firefox implements old version of spec.\n",
+ " width = entry.contentBoxSize.inlineSize;\n",
+ " height = entry.contentBoxSize.blockSize;\n",
+ " }\n",
+ " } else {\n",
+ " // Chrome <84 implements even older version of spec.\n",
+ " width = entry.contentRect.width;\n",
+ " height = entry.contentRect.height;\n",
+ " }\n",
+ "\n",
+ " // Keep the size of the canvas and rubber band canvas in sync with\n",
+ " // the canvas container.\n",
+ " if (entry.devicePixelContentBoxSize) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " canvas.setAttribute(\n",
+ " 'width',\n",
+ " entry.devicePixelContentBoxSize[0].inlineSize\n",
+ " );\n",
+ " canvas.setAttribute(\n",
+ " 'height',\n",
+ " entry.devicePixelContentBoxSize[0].blockSize\n",
+ " );\n",
+ " } else {\n",
+ " canvas.setAttribute('width', width * fig.ratio);\n",
+ " canvas.setAttribute('height', height * fig.ratio);\n",
+ " }\n",
+ " canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'width: ' + width + 'px; height: ' + height + 'px;'\n",
+ " );\n",
+ "\n",
+ " rubberband_canvas.setAttribute('width', width);\n",
+ " rubberband_canvas.setAttribute('height', height);\n",
+ "\n",
+ " // And update the size in Python. We ignore the initial 0/0 size\n",
+ " // that occurs as the element is placed into the DOM, which should\n",
+ " // otherwise not happen due to the minimum size styling.\n",
+ " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
+ " fig.request_resize(width, height);\n",
+ " }\n",
+ " }\n",
+ " });\n",
+ " this.resizeObserverInstance.observe(canvas_div);\n",
+ "\n",
+ " function on_mouse_event_closure(name) {\n",
+ " return function (event) {\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " rubberband_canvas.addEventListener(\n",
+ " 'mousedown',\n",
+ " on_mouse_event_closure('button_press')\n",
+ " );\n",
+ " rubberband_canvas.addEventListener(\n",
+ " 'mouseup',\n",
+ " on_mouse_event_closure('button_release')\n",
+ " );\n",
+ " // Throttle sequential mouse events to 1 every 20ms.\n",
+ " rubberband_canvas.addEventListener(\n",
+ " 'mousemove',\n",
+ " on_mouse_event_closure('motion_notify')\n",
+ " );\n",
+ "\n",
+ " rubberband_canvas.addEventListener(\n",
+ " 'mouseenter',\n",
+ " on_mouse_event_closure('figure_enter')\n",
+ " );\n",
+ " rubberband_canvas.addEventListener(\n",
+ " 'mouseleave',\n",
+ " on_mouse_event_closure('figure_leave')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener('wheel', function (event) {\n",
+ " if (event.deltaY < 0) {\n",
+ " event.step = 1;\n",
+ " } else {\n",
+ " event.step = -1;\n",
+ " }\n",
+ " on_mouse_event_closure('scroll')(event);\n",
+ " });\n",
+ "\n",
+ " canvas_div.appendChild(canvas);\n",
+ " canvas_div.appendChild(rubberband_canvas);\n",
+ "\n",
+ " this.rubberband_context = rubberband_canvas.getContext('2d');\n",
+ " this.rubberband_context.strokeStyle = '#000000';\n",
+ "\n",
+ " this._resize_canvas = function (width, height, forward) {\n",
+ " if (forward) {\n",
+ " canvas_div.style.width = width + 'px';\n",
+ " canvas_div.style.height = height + 'px';\n",
+ " }\n",
+ " };\n",
+ "\n",
+ " // Disable right mouse context menu.\n",
+ " this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ " });\n",
+ "\n",
+ " function set_focus() {\n",
+ " canvas.focus();\n",
+ " canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " window.setTimeout(set_focus, 100);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'mpl-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " var button = (fig.buttons[name] = document.createElement('button'));\n",
+ " button.classList = 'mpl-widget';\n",
+ " button.setAttribute('role', 'button');\n",
+ " button.setAttribute('aria-disabled', 'false');\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ "\n",
+ " var icon_img = document.createElement('img');\n",
+ " icon_img.src = '_images/' + image + '.png';\n",
+ " icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
+ " icon_img.alt = tooltip;\n",
+ " button.appendChild(icon_img);\n",
+ "\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " var fmt_picker = document.createElement('select');\n",
+ " fmt_picker.classList = 'mpl-widget';\n",
+ " toolbar.appendChild(fmt_picker);\n",
+ " this.format_dropdown = fmt_picker;\n",
+ "\n",
+ " for (var ind in mpl.extensions) {\n",
+ " var fmt = mpl.extensions[ind];\n",
+ " var option = document.createElement('option');\n",
+ " option.selected = fmt === mpl.default_extension;\n",
+ " option.innerHTML = fmt;\n",
+ " fmt_picker.appendChild(option);\n",
+ " }\n",
+ "\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function (type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function () {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1], msg['forward']);\n",
+ " fig.send_message('refresh', {});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
+ " var x0 = msg['x0'] / fig.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
+ " var x1 = msg['x1'] / fig.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0,\n",
+ " 0,\n",
+ " fig.canvas.width / fig.ratio,\n",
+ " fig.canvas.height / fig.ratio\n",
+ " );\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
+ " var cursor = msg['cursor'];\n",
+ " switch (cursor) {\n",
+ " case 0:\n",
+ " cursor = 'pointer';\n",
+ " break;\n",
+ " case 1:\n",
+ " cursor = 'default';\n",
+ " break;\n",
+ " case 2:\n",
+ " cursor = 'crosshair';\n",
+ " break;\n",
+ " case 3:\n",
+ " cursor = 'move';\n",
+ " break;\n",
+ " }\n",
+ " fig.rubberband_canvas.style.cursor = cursor;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function (fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
+ " for (var key in msg) {\n",
+ " if (!(key in fig.buttons)) {\n",
+ " continue;\n",
+ " }\n",
+ " fig.buttons[key].disabled = !msg[key];\n",
+ " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
+ " if (msg['mode'] === 'PAN') {\n",
+ " fig.buttons['Pan'].classList.add('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " } else if (msg['mode'] === 'ZOOM') {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.add('active');\n",
+ " } else {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message('ack', {});\n",
+ "};\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function (fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " evt.data.type = 'image/png';\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src\n",
+ " );\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " evt.data\n",
+ " );\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " } else if (\n",
+ " typeof evt.data === 'string' &&\n",
+ " evt.data.slice(0, 21) === 'data:image/png;base64'\n",
+ " ) {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig['handle_' + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"No handler for the '\" + msg_type + \"' message type: \",\n",
+ " msg\n",
+ " );\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
+ " e,\n",
+ " e.stack,\n",
+ " msg\n",
+ " );\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "};\n",
+ "\n",
+ "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
+ "mpl.findpos = function (e) {\n",
+ " //this section is from http://www.quirksmode.org/js/events_properties.html\n",
+ " var targ;\n",
+ " if (!e) {\n",
+ " e = window.event;\n",
+ " }\n",
+ " if (e.target) {\n",
+ " targ = e.target;\n",
+ " } else if (e.srcElement) {\n",
+ " targ = e.srcElement;\n",
+ " }\n",
+ " if (targ.nodeType === 3) {\n",
+ " // defeat Safari bug\n",
+ " targ = targ.parentNode;\n",
+ " }\n",
+ "\n",
+ " // pageX,Y are the mouse positions relative to the document\n",
+ " var boundingRect = targ.getBoundingClientRect();\n",
+ " var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n",
+ " var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n",
+ "\n",
+ " return { x: x, y: y };\n",
+ "};\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * http://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys(original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object') {\n",
+ " obj[key] = original[key];\n",
+ " }\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function (event, name) {\n",
+ " var canvas_pos = mpl.findpos(event);\n",
+ "\n",
+ " if (name === 'button_press') {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " var x = canvas_pos.x * this.ratio;\n",
+ " var y = canvas_pos.y * this.ratio;\n",
+ "\n",
+ " this.send_message(name, {\n",
+ " x: x,\n",
+ " y: y,\n",
+ " button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event),\n",
+ " });\n",
+ "\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We want\n",
+ " * to control all of the cursor setting manually through the\n",
+ " * 'cursor' event from matplotlib */\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function (event, name) {\n",
+ " // Prevent repeat events\n",
+ " if (name === 'key_press') {\n",
+ " if (event.which === this._key) {\n",
+ " return;\n",
+ " } else {\n",
+ " this._key = event.which;\n",
+ " }\n",
+ " }\n",
+ " if (name === 'key_release') {\n",
+ " this._key = null;\n",
+ " }\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.which !== 17) {\n",
+ " value += 'ctrl+';\n",
+ " }\n",
+ " if (event.altKey && event.which !== 18) {\n",
+ " value += 'alt+';\n",
+ " }\n",
+ " if (event.shiftKey && event.which !== 16) {\n",
+ " value += 'shift+';\n",
+ " }\n",
+ "\n",
+ " value += 'k';\n",
+ " value += event.which.toString();\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
+ " if (name === 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message('toolbar_button', { name: name });\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "\n",
+ "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
+ "// prettier-ignore\n",
+ "var _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\n",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
+ "\n",
+ "mpl.default_extension = \"png\";/* global mpl */\n",
+ "\n",
+ "var comm_websocket_adapter = function (comm) {\n",
+ " // Create a \"websocket\"-like object which calls the given IPython comm\n",
+ " // object with the appropriate methods. Currently this is a non binary\n",
+ " // socket, so there is still some room for performance tuning.\n",
+ " var ws = {};\n",
+ "\n",
+ " ws.close = function () {\n",
+ " comm.close();\n",
+ " };\n",
+ " ws.send = function (m) {\n",
+ " //console.log('sending', m);\n",
+ " comm.send(m);\n",
+ " };\n",
+ " // Register the callback with on_msg.\n",
+ " comm.on_msg(function (msg) {\n",
+ " //console.log('receiving', msg['content']['data'], msg);\n",
+ " // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
+ " ws.onmessage(msg['content']['data']);\n",
+ " });\n",
+ " return ws;\n",
+ "};\n",
+ "\n",
+ "mpl.mpl_figure_comm = function (comm, msg) {\n",
+ " // This is the function which gets called when the mpl process\n",
+ " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
+ "\n",
+ " var id = msg.content.data.id;\n",
+ " // Get hold of the div created by the display call when the Comm\n",
+ " // socket was opened in Python.\n",
+ " var element = document.getElementById(id);\n",
+ " var ws_proxy = comm_websocket_adapter(comm);\n",
+ "\n",
+ " function ondownload(figure, _format) {\n",
+ " window.open(figure.canvas.toDataURL());\n",
+ " }\n",
+ "\n",
+ " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
+ "\n",
+ " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
+ " // web socket which is closed, not our websocket->open comm proxy.\n",
+ " ws_proxy.onopen();\n",
+ "\n",
+ " fig.parent_element = element;\n",
+ " fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
+ " if (!fig.cell_info) {\n",
+ " console.error('Failed to find cell for figure', id, fig);\n",
+ " return;\n",
+ " }\n",
+ " fig.cell_info[0].output_area.element.on(\n",
+ " 'cleared',\n",
+ " { fig: fig },\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_close = function (fig, msg) {\n",
+ " var width = fig.canvas.width / fig.ratio;\n",
+ " fig.cell_info[0].output_area.element.off(\n",
+ " 'cleared',\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
+ "\n",
+ " // Update the output cell to use the data from the current canvas.\n",
+ " fig.push_to_output();\n",
+ " var dataURL = fig.canvas.toDataURL();\n",
+ " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
+ " // the notebook keyboard shortcuts fail.\n",
+ " IPython.keyboard_manager.enable();\n",
+ " fig.parent_element.innerHTML =\n",
+ " '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
+ " fig.close_ws(fig, msg);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.close_ws = function (fig, msg) {\n",
+ " fig.send_message('closing', msg);\n",
+ " // fig.ws.close()\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
+ " // Turn the data on the canvas into data in the output cell.\n",
+ " var width = this.canvas.width / this.ratio;\n",
+ " var dataURL = this.canvas.toDataURL();\n",
+ " this.cell_info[1]['text/html'] =\n",
+ " '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Tell IPython that the notebook contents must change.\n",
+ " IPython.notebook.set_dirty(true);\n",
+ " this.send_message('ack', {});\n",
+ " var fig = this;\n",
+ " // Wait a second, then push the new image to the DOM so\n",
+ " // that it is saved nicely (might be nice to debounce this).\n",
+ " setTimeout(function () {\n",
+ " fig.push_to_output();\n",
+ " }, 1000);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'btn-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " var button;\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " button = fig.buttons[name] = document.createElement('button');\n",
+ " button.classList = 'btn btn-default';\n",
+ " button.href = '#';\n",
+ " button.title = name;\n",
+ " button.innerHTML = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " // Add the status bar.\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message pull-right';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = document.createElement('div');\n",
+ " buttongrp.classList = 'btn-group inline pull-right';\n",
+ " button = document.createElement('button');\n",
+ " button.classList = 'btn btn-mini btn-primary';\n",
+ " button.href = '#';\n",
+ " button.title = 'Stop Interaction';\n",
+ " button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n",
+ " button.addEventListener('click', function (_evt) {\n",
+ " fig.handle_close(fig, {});\n",
+ " });\n",
+ " button.addEventListener(\n",
+ " 'mouseover',\n",
+ " on_mouseover_closure('Stop Interaction')\n",
+ " );\n",
+ " buttongrp.appendChild(button);\n",
+ " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
+ " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._remove_fig_handler = function (event) {\n",
+ " var fig = event.data.fig;\n",
+ " if (event.target !== this) {\n",
+ " // Ignore bubbled events from children.\n",
+ " return;\n",
+ " }\n",
+ " fig.close_ws(fig, {});\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (el) {\n",
+ " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (el) {\n",
+ " // this is important to make the div 'focusable\n",
+ " el.setAttribute('tabindex', 0);\n",
+ " // reach out to IPython and tell the keyboard manager to turn it's self\n",
+ " // off when our div gets focus\n",
+ "\n",
+ " // location in version 3\n",
+ " if (IPython.notebook.keyboard_manager) {\n",
+ " IPython.notebook.keyboard_manager.register_events(el);\n",
+ " } else {\n",
+ " // location in version 2\n",
+ " IPython.keyboard_manager.register_events(el);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
+ " var manager = IPython.notebook.keyboard_manager;\n",
+ " if (!manager) {\n",
+ " manager = IPython.keyboard_manager;\n",
+ " }\n",
+ "\n",
+ " // Check for shift+enter\n",
+ " if (event.shiftKey && event.which === 13) {\n",
+ " this.canvas_div.blur();\n",
+ " // select the cell after this one\n",
+ " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
+ " IPython.notebook.select(index + 1);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " fig.ondownload(fig, null);\n",
+ "};\n",
+ "\n",
+ "mpl.find_output_cell = function (html_output) {\n",
+ " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
+ " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
+ " // IPython event is triggered only after the cells have been serialised, which for\n",
+ " // our purposes (turning an active figure into a static one), is too late.\n",
+ " var cells = IPython.notebook.get_cells();\n",
+ " var ncells = cells.length;\n",
+ " for (var i = 0; i < ncells; i++) {\n",
+ " var cell = cells[i];\n",
+ " if (cell.cell_type === 'code') {\n",
+ " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
+ " var data = cell.output_area.outputs[j];\n",
+ " if (data.data) {\n",
+ " // IPython >= 3 moved mimebundle to data attribute of output\n",
+ " data = data.data;\n",
+ " }\n",
+ " if (data['text/html'] === html_output) {\n",
+ " return [cell, data, j];\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "// Register the function which deals with the matplotlib target/channel.\n",
+ "// The kernel may be null if the page has been refreshed.\n",
+ "if (IPython.notebook.kernel !== null) {\n",
+ " IPython.notebook.kernel.comm_manager.register_target(\n",
+ " 'matplotlib',\n",
+ " mpl.mpl_figure_comm\n",
+ " );\n",
+ "}\n"
+ ],
+ "text/plain": [
+ "<IPython.core.display.Javascript object>"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4nOy9e3xV9Z2vv52QoHK0v2nra+rxyMLjBbDtOFJrrVWpThWs2M7U0dqpDIfRTrEzAnZaV7gZUIigEkQEFYRUgRREIOriIigQJOEqQcGEu4QA4RIlASMhkrx/fzDG7ibRfFwr7O8mz/N6vf9gZ7H36mPaPmaxFjEBAAAAQKsilugTAAAAAIBTCwEIAAAA0MogAAEAAABaGQQgAAAAQCuDAAQAAABoZRCAAAAAAK0MAhAAAACglUEAAgAAALQyCEAAAACAVgYBCAAAANDKIAABAAAAWhkEIAAAAEArgwAEAAAAaGUQgAAAAACtDAIQAAAAoJVBAAIAAAC0MghAAAAAgFYGAQgAAADQyiAAAQAAAFoZBCAAAABAK4MABAAAAGhlEIAAAAAArQwCEAAAAKCVQQACAAAAtDIIQAAAAIBWBgEIAAAA0MogAAEAAABaGQQgAAAAQCuDAAQAAABoZRCAAAAAAK0MAhAAAACglUEAAgAAALQyCEAAAACAVgYBCAAAANDKIAABAAAAWhkEIAAAAEArgwAEAAAAaGUQgAAAAACtDAIQAAAAoJVBAAIAAAC0MghAAAAAgFYGAQgAAADQyiAAAQAAAFoZBCAAAABAK4MABAAAAGhlEIAAAAAArQwCEAAAAKCVQQACAAAAtDIIQAAAAIBWBgEIAAAA0MogAAEAAABaGQQgAAAAQCuDAAQAAABoZRCAAAAAAK0MAhAAAACglUEAAgAAALQyCMAQ1NbWqrS0VBUVFaqsrGSMMcZYEqyiokKlpaWqra1NdEokDAIwBKWlpYrFYowxxhhLwpWWliY6JRIGARiCioqK+m+gqP/tpLy8XDk5OSovL0/4vym5PlzhC1/uDF/4SgZfn/0Ap6KiItEpkTAIwBBUVlYqFoupsrIy8veuqalRbm6uampqIn/v0w1c2cCXDXzZwJcNfNmIyldL/v93skAAhoAAdANc2cCXDXzZwJcNfNkgAKODAAwBAegGuLKBLxv4soEvG/iyQQBGBwEYAgLQDXBlA1828GUDXzbwZYMAjA4CMAQEoBvgyga+bODLBr5s4MsGARgdBGAICEA3wJUNfNnAlw182cCXDQIwOgjAEBCAboArG/iygS8b+LKBLxsEYHQQgCEgAN0AVzbwZQNfNvBlA182CMDoIABDQAC6Aa5s4MsGvmzgywa+bBCA0UEAhoAAdANc2cCXDXzZwJcNfNkgAKODAAwBAegGuLKBLxv4soEvG/iyQQBGBwEYAgLQDXBlA1828GUDXzbwZYMAjA4CMAT130Af7pM+/TjS1XxyWK/PnaGaTw5H/t6n23CFL3y5M3zhKxl8VX64jwBM9AkkM/UBOCkmTWeMMcZYMqxyUowATPQJJDMEIGOMMZZ8IwAJwFBwCdiN4Qpf+HJn+MJXMvjiEjABGApuAnEDXNnAlw182cCXDXzZ4CaQ6CAAQ0AAugGubODLBr5s4MsGvmwQgNFBAIaAAHQDXNnAlw182cCXDXzZIACjgwAMAQHoBriygS8b+LKBLxv4skEARgcBGAIC0A1wZQNfNvBlA1828GWDAIwOAjAEBKAb4MoGvmzgywa+bODLBgEYHQRgCHgMjBvDFb7w5c7wha9k8MVjYAjAUPAgaMYYYyz5xoOgCcBQEICMMcZY8o0AJABDwSVgN4YrfOHLneELX8ngi0vABGAouAnEDXBlA1828GUDXzbwZYObQKKDAAwBAegGuLKBLxv4soEvG/iyQQBGBwEYAgLQDXBlA1828GUDXzbwZYMAjA4CMAQEoBvgyga+bODLBr5s4MsGARgdBGAICEA3wJUNfNnAlw182cCXDQIwOgjAEHAXsBvDFb7w5c7wha9k8MVdwARgKHgOIGOMMZZ84zmABGAoCEDGGGMs+UYAJkkA5uXlqUePHjr//PMVi8U0d+7cLzy+V69eisViDXb55ZfXH5Odnd3oMceOHWv2eXEJ2I3hCl/4cmf4wlcy+OIScJIE4Pz58zVo0CDNnj27WQFYUVGhsrKy+pWWlurrX/+6MjIy6o/Jzs7WueeeG3dcWVmZ6by4CcQNcGUDXzbwZQNfNvBlg5tAoiMpAvAvaU4A/jVz587VGWecoV27dtW/lp2dra997WuhzoUAdANc2cCXDXzZwJcNfNkgAKOjVQRgjx49dPPNN8e9lp2drZSUFLVv314XXHCBbrvtNq1fv/4L36e6ulqVlZX1Ky0tVSwWU3l5uWpqaiJdVVWVcnNzVVVVFfl7n27DFb7w5c7wha9k8FVeXk4AJvoErFgDcN++fUpJSdHMmTPjXl+5cqWmTp2qDRs2aPny5brjjjt01llnaevWrU2+V0ZGRqN/bjAnJ0e5ubmMMcYYS4Ll5OQQgIk+ASvWAMzMzNQ3vvENHT9+/AuPq62t1RVXXKEHHnigyWP4CaCbwxW+8OXO8IWvZPDFTwBP8wCsq6vTJZdcov79+zfr+Pvuu0/du3dv9rlwF7AbwxW+8OXO8IWvZPDFXcCneQAuXbpUsVhMGzdu/NJj6+rqdNVVV6l3797NPheeA8gYY4wl33gOYJIE4NGjR1VYWKjCwkLFYjFlZWWpsLBQJSUlkqT09HT17Nmzwe+755579IMf/KDR9xw6dKgWLlyoHTt2qLCwUL1791abNm20evXqZp8XAcgYY4wl3wjAJAnAz36S99fr1auXpJMPfu7atWvc76moqNBZZ52liRMnNvqe/fv3V/v27ZWWlqbzzjtPt9xyiwoKCkznxSVgN4YrfOHLneELX8ngi0vASRKArsJzAN0AVzbwZQNfNvBlA182ovLFcwAJwFAQgG6AKxv4soEvG/iygS8bBGB0EIAhIADdAFc28GUDXzbwZQNfNgjA6CAAQ0AAugGubODLBr5s4MsGvmwQgNFBAIaAAHQDXNnAlw182cCXDXzZIACjgwAMAQHoBriygS8b+LKBLxv4skEARgcBGAIeA+PGcIUvfLkzfOErGXzxGBgCMBQ8CJoxxhhLvvEgaAIwFAQgY4wxlnwjAAnAUHAJ2I3hCl/4cmf4wlcy+OISMAEYCm4CcQNc2cCXDXzZwJcNfNngJpDoIABDQAC6Aa5s4MsGvmzgywa+bBCA0UEAhoAAdANc2cCXDXzZwJcNfNkgAKODAAwBAegGuLKBLxv4soEvG/iyQQBGBwEYAgLQDXBlA1828GUDXzbwZYMAjA4CMATcBezGcIUvfLkzfOErGXxxFzABGAqeA8gYY4wl33gOIAEYCgKQMcYYS74RgARgKLgE7MZwhS98uTN84SsZfHEJmAAMBTeBuAGubODLBr5s4MsGvmxwE0h0EIAhIADdAFc28GUDXzbwZQNfNgjA6CAAQ0AAugGubODLBr5s4MsGvmwQgNFBAIaAAHQDXNnAlw182cCXDXzZIACjgwAMAQHoBriygS8b+LKBLxv4skEARgcBGALuAnZjuMIXvtwZvvCVDL64C5gADAXPAWSMMcaSbzwHkAAMBQHIGGOMJd8IQAIwFFwCdmO4whe+3Bm+8JUMvrgETACGgptA3ABXNvBlA1828GUDXza4CSQ6CMAQEIBugCsb+LKBLxv4soEvGwRgdBCAISAA3QBXNvBlA1828GUDXzYIwOggAENAALoBrmzgywa+bODLBr5sEIDRQQCGgAB0A1zZwJcNfNnAlw182SAAo4MADAEB6Aa4soEvG/iygS8b+LJBAEZHUgRgXl6eevToofPPP1+xWExz5879wuOXLl2qWCzWYMXFxXHHvfLKK+rcubPS0tLUuXNnzZkzx3RePAbGjeEKX/hyZ/jCVzL44jEwSRKA8+fP16BBgzR79mxTAG7ZskVlZWX1O3HiRP0xBQUFSklJUWZmpoqLi5WZmak2bdpo1apVzT4vHgTNGGOMJd94EHSSBOBfYgnAw4cPN3nMXXfdpe7du8e91q1bN919993NPhcCkDHGGEu+EYCneQB26NBB3/rWt3TTTTdpyZIlccdceOGFysrKinstKytL7du3b/a5cAnYjeEKX/hyZ/jCVzL44hLwaRqAmzdv1sSJE/XOO++ooKBA999/v8444wzl5eXVH5Oamqrp06fH/b7p06crLS2tyfetrq5WZWVl/UpLSxWLxVReXq6amppIV1VVpdzcXFVVVUX+3qfbcIUvfLkzfOErGXyVl5cTgIk+ASvNCcDG6NGjh26//fb6X6empionJyfumGnTpqlt27ZNvkdGRkajN5fk5OQoNzeXMcYYY0mwnJwcAjDRJ2Dlqwbg8OHD1alTp/pff5VLwPwE0M3hCl/4cmf4wlcy+OIngK0oAO+44w7deOON9b++6667dOutt8Yd07179692EwjPAUwouLKBLxv4soEvG/iyEZUvngOYJAF49OhRFRYWqrCwULFYTFlZWSosLFRJSYkkKT09XT179qw/fsyYMZo7d662bt2qTZs2KT09XbFYTLNnz64/Jj8/XykpKRo5cqSKi4s1cuTIr/4YGAIwoeDKBr5s4MsGvmzgywYBGB1JEYBNPdi5V69ekqRevXqpa9eu9cePGjVKF198sc4880z97d/+ra677jrNmzevwfvOmjVLHTt2VGpqqjp16hQXiM2Bu4DdGK7whS93hi98JYMv7gJOkgB0FZ4DyBhjjCXfeA4gARgKApAxxhhLvhGABGAouATsxnCFL3y5M3zhKxl8cQmYAAwFN4G4Aa5s4MsGvmzgywa+bHATSHQQgCEgAN0AVzbwZQNfNvBlA182CMDo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\" width=\"640\">"
+ ],
+ "text/plain": [
+ "<IPython.core.display.HTML object>"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/plain": [
+ "[<matplotlib.lines.Line2D at 0x7f3e53ef33d0>]"
+ ]
+ },
+ "execution_count": 15,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "fig, ax = plt.subplots()\n",
+ "ax.grid()\n",
+ "for i in range(int(max(deltas[speed_ivl_min:speed_ivl_max])//interval)):\n",
+ " ax.axhline(i*interval, color='orange')\n",
+ "ax.plot(sorted(deltas[speed_ivl_min:speed_ivl_max])[:-2])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 77,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Largest peak at 1.68 Hz / 101 rpm\n",
+ "Mixing product 1 at 8.32 Hz / 499 rpm\n",
+ "Mixing product 2 at 11.68 Hz / 701 rpm\n",
+ "Mixing product 3 at 18.32 Hz / 1099 rpm\n",
+ "Mixing product 4 at 21.68 Hz / 1301 rpm\n",
+ "Mixing product 5 at 28.32 Hz / 1699 rpm\n",
+ "Mixing product 6 at 31.68 Hz / 1901 rpm\n"
]
},
{
@@ -3191,7 +4288,7 @@
{
"data": {
"text/html": [
- "<img src=\"data:image/png;base64,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\" width=\"640\">"
+ "<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4nOzdeXxV1b3//xP4OSLX+rDqQ+t1I60DToAKtUqhCq1WUUsnrdcr1k5qe6te+72bScOsgqCI4oSiiAEHTCCbEAghJEAYJSEhhCRAhgNk4GTOyUSS9++Pg0EK2tC91+fkrPV+Ph77cW9Rzjq+PS5fYkAfiIiIiMgovnC/ASIiIiKSxQAkIiIiMgwDkIiIiMgwDEAiIiIiwzAAiYiIiAzDACQiIiIyDAOQiIiIyDAMQCIiIiLDMACJiIiIDMMAJCIiIjIMA5CIiIjIMAxAIiIiIsMwAImIiIgMwwAkIiIiMgwDkIiIiMgwDEAiIiIiwzAAiYiIiAzDACQiIiIyDAOQiIiIyDAMQCIiIiLDMACJiIiIDMMAJCIiIjIMA5CIiIjIMAxAIiIiIsMwAImIiIgMwwAkIiIiMgwDkIiIiMgwDEAiIiIiwzAAiYiIiAzDACQiIiIyDAOQiIiIyDAMQCIiIiLDMACJiIiIDMMAJCIiIjIMA5CIiIjIMAxAIiIiIsMwAImIiIgMwwAkIiIiMgwDkIiIiMgwDEAiIiIiwzAAiYiIiAzDACQiIiIyDAOQiIiIyDAMQCIiIiLDMACJiIiIDMMAJCIiIjIMA5CIiIjIMAxAIiIiIsMwAImIiIgMwwAkIiIiMgwDkIiIiMgwDEAiIiIiwzAAiYiIiAzDACQiIiIyDAOQiIiIyDAMQCIiIiLDMABdaG9vh9/vR01NDWpra/nw4cOHDx8+EfDU1NTA7/ejvb093CkRNgxAF/x+P3w+Hx8+fPjw4cMnAh+/3x/ulAgbBqALNTU1nR8gr//pJBAIICYmBoFAIOz/pKTzY9zOlYdQ+64v9FQe4s6aPdyZO+v0qNz5qx/AqampCXdKhA0D0IXa2lr4fD7U1tZ6/tqtra2Ii4tDa2ur569Nxxi385EG4GNf6DnSIHascTuHCXeWwZ1lqNxZ5d+/IwUD0AUGYOQzbmcGoNa4swzuLIMBqBYD0AUGYOQzbmcGoNa4swzuLIMBqBYD0AUGYOQzbmcGoNa4swzuLIMBqBYD0AUGYOQzbmcGoNa4swzuLIMBqBYD0AUGYOQzbmcGoNa4swzuLIMBqBYD0AUGYOQzbmcGoNa4swzuLIMBqBYD0AUGYOQzbmcGoNa4swzuLIMBqBYD0AUGYOQzbmcGoNa4swzuLIMBqBYD0AUGYOQzbmcGoNa4swzuLIMBqBYD0AUGYOQzbmcGoNa4swzuLIMBqBYD0AUGYOQzbmcGoNa4swzuLIMBqBYD0AUGYOQzbmcGoNa4swzuLIMBqBYD0AVVH6CV2Yfwt4+3Y8w7y3jBKGbcRc4A1Bp3lsGdZTAA1WIAuqDqA/RKUh4s28FDs5fzglHMuIucAag17iyDO8tgAKrFAHRB1QfojZQCWLaD37zMAFTNuIucAag17iyDO8tgAKrFAHRB1Qdo/vr9sGwHo2YwAFUz7iJnAGqNO8vgzjIYgGoxAF1Q9QFauKkIlu3g3pcYgKoZd5EzALXGnWVwZxkMQLUYgC6o+gB9srUElu3g5y8wAFUz7iJnAGqNO8vgzjIYgGoxAF1Q9QGK3XEAlu3gp9MZgKoZd5EzALXGnWVwZxkMQLUYgC6o+gAlZB2CZTu4fWo8LxjFjLvIGYBa484yuLMMBqBaDEAXVH2A1uwug2U7+PFkBqBqxl3kDECtcWcZ3FkGA1AtBqALqj5AafkVsGwHP5rEAFTNuIucAag17iyDO8tgAKrFAHRB1Qdo874ALNvBoGgGoGrGXeQMQK1xZxncWQYDUC0GoAuqPkAZJdWwbAcDn2cAqmbcRc4A1Bp3lsGdZTAA1WIAuqDqA5RzsBaW7eD6CQxA1Yy7yBmAWuPOMrizDAagWsYGYHR0NHw+33HPRRdddEqvoeoDVFBeD8t20G8cA1A14y5yBqDWuLMM7iyDAaiW0QF47bXXorS0tPOpqKg4pddQ9QEqqQzCsh38YCwDUDXjLnIGoNa4swzuLIMBqJbRAdi/f39Xr6HqA1Re2wTLdtDHZgCqZtxFzgDUGneWwZ1lMADVMjoAzz77bFx88cXo06cPHnjgAezbt++UXkPVB6g62ALLdmDZDhqbmj19bTqecRc5A1Br3FkGd5bBAFTL2ABMSEjA559/jqysLCQlJWHYsGG46KKLEAgEvvH7NDc3o7a2tvPx+/3w+XwIBAJobW317KlpaOwMwMPVdZ6+Np/jn2AwiLi4OASDwbC/F5GnsbozAFsbq7mzZg935s46PSp3DgQCDMBwv4HuoqGhARdddBFmzZr1jb/PyX7iiM/nQ0xMDOLi4jx7lsbGdQbgx59597p8+MTHLukMwPjYJWF/P3z48OETjicmJoYBGO430J2MGDECjz/++Df+dqkfAWxtbUXfMStg2Q4Ky6rC/k9hOj/G/ZM8fwRQ64c7c2edHv4IoFoMwKOam5vxve99D5MmTery91H5NQRXT0iAZTvYV17j+WvTMa2thn0tD78GUGvcWQZ3lqFyZ34NoMEB+Oyzz2LdunXYv38/Nm/ejJEjR6J3794oKirq8muo/ADdMDERlu0g92C1569Nxxh3kTMAtcadZXBnGQxAtYwNwAceeAAXX3wxTjvtNFxyySX45S9/iZycnFN6DZUfoEFTk2DZDjKLv/knpZB7xl3kDECtcWcZ3FkGA1AtYwPQCyo/QLe9sAaW7WDrvlP7xanp1Bh3kTMAtcadZXBnGQxAtRiALqj8AN0+cy0s28GG/DLPX5uOMe4iZwBqjTvL4M4yGIBqMQBdUPkBunP2Oli2g7W7Sz1/bTrGuIucAag17iyDO8tgAKrFAHRB5Qfo3rlpsGwHK7MOeP7adIxxFzkDUGvcWQZ3lsEAVIsB6ILKD9Cv5m2AZTtYtqPE89emY4y7yBmAWuPOMrizDAagWgxAF1R+gH73Tjos28Fn24o9f206xriLnAGoNe4sgzvLYACqxQB0QeUHaPR7m0P/KbhNhZ6/Nh1j3EXOANQad5bBnWUwANViALqg8gP05w+3wrIdLFi/1/PXpmOMu8gZgFrjzjK4swwGoFoMQBdUfoD+9vF2WLaDt9cVeP7adIxxFzkDUGvcWQZ3lsEAVIsB6ILKD9D/frIDlu1g7po8z1+bjjHuImcAao07y+DOMhiAajEAXVD5ARrzeSYs28GsxFzPX5uOMe4iZwBqjTvL4M4yGIBqMQBdUPkBio7LgmU7mO6c2n+fmE6NcRc5A1Br3FkGd5bBAFSLAeiCyg/QNGcXLNvBxGXZnr82HWPcRc4A1Bp3lsGdZTAA1WIAuqDyAzRz5W5YtoNxS3d6/tp0jHEXOQNQa9xZBneWwQBUiwHogsoP0JykPbBsB//4NMPz16ZjjLvIGYBa484yuLMMBqBaDEAXVH6A3krJh2U7+J+Pv/T8tekY4y5yBqDWuLMM7iyDAagWA9AFlR+g99fvhWU7+MvCbZ6/Nh1j3EXOANQad5bBnWUwANViALqg8gO0KH0/LNvB79/f4vlr0zHGXeQMQK1xZxncWQYDUC0GoAsqP0Cfbi2CZTv4r3c3ef7adIxxFzkDUGvcWQZ3lsEAVIsB6ILKD9CyHSWwbAe/fnOj569Nxxh3kTMAtcadZXBnGQxAtRiALqj8AK3ceQCW7eC+ues9f206xriLnAGoNe4sgzvLYACqxQB0QeUHKDnnECzbwV2vpHr+2nSMcRc5A1Br3FkGd5bBAFSLAeiCyg/Q+rwyWLaDO15O8fy16RjjLnIGoNa4swzuLIMBqBYD0AWVH6At+ypg2Q5uezHZ89emY4y7yBmAWuPOMrizDAagWgxAF1R+gDKKArBsB4OnJnn+2nSMcRc5A1Br3FkGd5bBAFSLAeiCyg9QzoEqWLaDAZNWef7adIxxFzkDUGvcWQZ3lsEAVIsB6ILKD1BBWQ0s20G/51Z6/tp0jHEXOQNQa9xZBneWwQBUiwHogsoPUEmgDpbt4PtjV3j+2nSMcRc5A1Br3FkGd5bBAFSLAeiCyg9QWXUDLNuBZTtob+/w/PUpxLiLnAGoNe4sgzvLYACqxQB0QeUHqKq+sTMAm1rbPH99CjHuImcAao07y+DOMhiAajEAXVD5AWpobO4MwJogLxlVjLvIGYBa484yuLMMBqBaDEAXVH6AWlpa0MeOh2U7KK9r8vz1KcS4i5wBqDXuLIM7y2AAqsUAdEHlB6i1tRU/GBMKQH9V0PPXpxDjLnIGoNa4swzuLIMBqBYD0AXVAXj1uFAA7quo9/z1KcS4i5wBqDXuLIM7y2AAqsUAdEF1AF47IRSAuw+Z+wFVzbiLnAGoNe4sgzvLYACqxQB0QXUADnguFICZJdWevz6FGHeRMwC1xp1lcGcZDEC1GIAuqA7Am6NDAbi1sNLz16cQ4y5yBqDWuLMM7iyDAagWA9AF1QF4y8RQAG4oOOz561OIcRc5A1Br3FkGd5bBAFSLAeiC6gAcMjkUgMm5ZZ6/PoUYd5EzALXGnWVwZxkMQLUYgC6oDsCfTA0F4MrsQ56/PoUYd5EzALXGnWVwZxkMQLUYgC6oDsAR05bDsh3EZRzw/PUpxLiLnAGoNe4sgzvLYACqxQB0QXUA3vVCKAA/3Vbi+etTiHEXOQNQa9xZBneWwQBUiwHoguoAHPliKAA/2lTk+etTiHEXOQNQa9xZBneWwQBUiwHoguoAHDUjFIDvrd/v+etTiHEXOQNQa9xZBneWwQBUiwHoguoA/M3LoQB8c91ez1+fQoy7yBmAWuPOMrizDAagWgxAF1QH4O9mhQJwzpp8z1+fQoy7yBmAWuPOMrizDAagWgxAF1QH4H+/EgrAGYm5nr8+hRh3kTMAtcadZXBnGQxAtRiALqgOwN/PCQXgVCfH89enEOMucgag1rizDO4sgwGoFgPQBdUB+KfXQgH4fFy2569PIcZd5AxArXFnGdxZBgNQLQagC6oD8InXl8GyHYxZutPz16cQ4y5yBqDWuLMM7iyDAagWA9AF1QH4P2+EAvCZJRmevz6FGHeRMwC1xp1lcGcZDEC1GIAuqA7A/30zFIBPfvyl569PIcZd5AxArXFnGdxZBgNQLQagC6oD8P/eDgXgHz/c5vnrU4hxFzkDUGvcWQZ3lsEAVIsB6ILqABz3TigAH3lvi+evTyHGXeQMQK1xZxncWQYDUC0G4FHTp0+Hz+fDU0891eXvozoAn58fCsAH3k73/PUpxLiLnAGoNe4sgzvLYACqxQAEsHXrVvTp0wc33HBDtwrAye+HAnDUGxs8f30KMe4iZwBqjTvL4M4yGIBqGR+A9fX1uOKKK5CUlIRhw4Z1qwCcviAUgPe8lub561OIcRc5A1Br3FkGd5bBAFTL+AB85JFH8PTTTwNAtwvAGR+GAvCns9d5/voUYtxFzgDUGneWwZ1lMADVMjoAFy9ejOuuuw5NTU0A/nUANjc3o7a2tvPx+/3w+XwIBAJobW319AkGg5i9MA6W7eDHLyV7/vp8ju0cFxeHYDAY9vci8jRWdwZga2M1d9bs4c7cWadH5c6BQIABGO43EC4lJSW48MILkZmZ2flt/yoAo6Oj4fP5TnhiYmIQFxfn+TN3USgA+z8Xr+T1+Zj3xMcu6QzA+NglYX8/fPjw4ROOJyYmhgEY7jcQLrGxsfD5fOjZs2fn4/P5EBUVhZ49e6Ktre2E7yP9I4DzYkIBOHDyqrD/k5iuj3H/JM8fAdT64c7cWaeHPwKolrEBWFdXh+zs7OOem2++GQ8//DCys7O79BqqvwbwncWhALzu+UTPX59CWlsN+1oefg2g1rizDO4sQ+XO/BpAgwPwZLrbTwJZ8EkoAK8Yl+D561OIcRc5A1Br3FkGd5bBAFSLAfg13S0AP/osFICW7aCjo8PzM8jAi5wBqDXuLIM7y2AAqsUAdEF1AC7+/FgANh858WsSyT3jLnIGoNa4swzuLIMBqBYD0AXVAfjZF8cCsK6JF40Kxl3kDECtcWcZ3FkGA1AtBqALqgMwNvZYAB6ub/b8DDLwImcAao07y+DOMhiAajEAXVAdgHFxcfjBuBWwbAcHqxs9P4MMvMgZgFrjzjK4swwGoFoMQBckAvCa51fCsh0UHpb7m7VJjLvIGYBa484yuLMMBqBaDEAXJAJwwKRVsGwHeWV1np9BBl7kDECtcWcZ3FkGA1AtBqALEgH4w2lJsGwHWf4az88gAy9yBqDWuLMM7iyDAagWA9AFiQD88UvJsGwH24sqPT+DDLzIGYBa484yuLMMBqBaDEAXJAJw+MspsGwHG/ce9vwMMvAiZwBqjTvL4M4yGIBqMQBdkAjAn7+aCst2kLKn3PMzyMCLnAGoNe4sgzvLYACqxQB0QSIAf/H6eli2g8RdpZ6fQQZe5AxArXFnGdxZBgNQLQagCxIB+Nu3NsKyHSzPPOj5GWTgRc4A1Bp3lsGdZTAA1WIAuiARgA+/uwmW7eDz7X7PzyADL3IGoNa4swzuLIMBqBYD0AWJAHxswRZYtoOYLcWen0EGXuQMQK1xZxncWQYDUC0GoAsSAfjER9tg2Q4WbNjv+Rlk4EXOANQad5bBnWUwANViALogEYBPxXwJy3bwdupez88gAy9yBqDWuLMM7iyDAagWA9AFiQD8f59mwLIdzE3O9/wMMvAiZwBqjTvL4M4yGIBqMQBdkAjA8V/shGU7mLVqj+dnkIEXOQNQa9xZBneWwQBUiwHogkQATl6eDct2MH3Fbs/PIAMvcgag1rizDO4sgwGoFgPQBYkAfHFFDizbQfSyXZ6fQQZe5AxArXFnGdxZBgNQLQagCxIBOGtVLizbwdgvsjw/gwy8yBmAWuPOMrizDAagWgxAFyQCcO6aPFi2g2c/zfT8DDLwImcAao07y+DOMhiAajEAXZAIwDdT8mHZDp5ekuH5GWTgRc4A1Bp3lsGdZTAA1WIAuiARgO+mFsCyHfz14y89P4MMvMgZgFrjzjK4swwGoFoMQBckAnDBhn2wbAd/Wbjd8zPIwIucAag17iyDO8tgAKrFAHRBIgAXpe+HZTv4wwdbPT+DDLzIGYBa484yuLMMBqBaDEAXJAJw8eZCWLaD0e9v8fwMMvAiZwBqjTvL4M4yGIBqMQBdkAjAz7YVw7Id/Ne7mz0/gwy8yBmAWuPOMrizDAagWgxAFyQCMO7LEli2g9++le75GWTgRc4A1Bp3lsGdZTAA1WIAuiARgE6mH5bt4JfzNnp+Bhl4kTMAtcadZXBnGQxAtRiALkgEYGL2QVi2g/vmrvf8DDLwImcAao07y+DOMhiAajEAXZAIwDU5h2DZDu6ek+b5GWTgRc4A1Bp3lsGdZTAA1WIAuiARgOtyS2HZDn42O9XzM8jAi5wBqDXuLIM7y2AAqsUAdEEiADfkl8GyHdz+cornZ5CBFzkDUGvcWQZ3lsEAVIsB6IJEAG7ZWwHLdvDjl9Z6fgYZeJEzALXGnWVwZxkMQLUiIgAHDhx4Ss+NN96IAwcOKH9fEgG4ff9hWLaDW19I9vwMMvAiZwBqjTvL4M4yGIBqRUQARkVF4R//+AcmTpz4L5/o6GicccYZ2Ldvn/L3JRGAmcUBWLaDQVOTPD+DDLzIGYBa484yuLMMBqBaEROA5eXlXf79zznnHG0CMMdfBct2MHDyas/PIAMvcgag1rizDO4sgwGoVkQEYFFRETo6Orr8+5eUlKCtrU3hOwqRCMC8Q9WwbAfXRSd6fgYZeJEzALXGnWVwZxkMQLUiIgC7K4kA3FdeA8t2cPWElZ6fQQZe5AxArXFnGdxZBgNQrYgLwJ07d570ycrKQn5+Ppqbm8Xei0QAFh+ug2U7uGJcgudnkIEXOQNQa9xZBneWwQBUK+ICMCoqCj169PjG54wzzsAjjzyCpqYm5e9FIgAPVtbDsh30GeN4fgYZeJEzALXGnWVwZxkMQLUiLgDj4uJw1VVXYf78+cjKysLOnTsxf/589OvXD0uWLMGiRYtw6aWX4tlnn1X+XiQCsLymAZbtwLIdtLV3/esgqWuMu8gZgFrjzjK4swwGoFoRF4CDBg1CYuKJPyEiMTERgwYNAgDExsaib9++yt+LRABW1jV2BmBTq/qf2GIa4y5yBqDWuLMM7iyDAahWxAXgmWeeidzc3BO+PTc3F2eeeSYAoLCwEGeddZby9yIRgLUNTZ0B2NB8xPNzTGfcRc4A1Bp3lsGdZTAA1Yq4ABwwYABGjx6NlpaWzm9rbW3F6NGjMWDAAADAhg0b0KdPH+XvRSIAg03NnQFYE+Rl4zXjLnIGoNa4swzuLIMBqFbEBeDGjRtx/vnn44ILLsDw4cMxYsQIXHjhhTj//POxadMmAMDChQsxY8YM5e9FIgBbWlo6A/BwvdzPcDaFcRc5A1Br3FkGd5bBAFQr4gIQAOrr6/Hmm2/imWeewdNPP4233noLdXV14u9DIgBbW1vx/bErYNkOSmvU/8xm0xh3kTMAtcadZXBnGQxAtSIyALsLqQC8akICLNtBSWXQ83NMZ9xFzgDUGneWwZ1lMADViogAXLZs2Sl9AFasWIHGxkaF7yhEKgCvfT4Rlu2g8LDc37BNYdxFzgDUGneWwZ1lMADViogA7NGjByoqKrr8+/fu3Rv79u1T+I5CpAKw/6RVsGwHBeXy/5pbd8Zd5AxArXFnGdxZBgNQrYgIwKioKNx9990YNWpUl57TTjtNqwC8aUoSLNvB7kPmflBVMe4iZwBqjTvL4M4yGIBqRUQAPvroo6f8HD58WPn7kgrAW6avgWU7yPLXeH6O6Yy7yBmAWuPOMrizDAagWhERgN2VVADe9mIyLNvBjuIqz88xnXEXOQNQa9xZBneWwQBUy9gAnDdvHq6//nr07t0bvXv3xi233IKEhIRTeg2pAPzJzBRYtoOthZWen2M64y5yBqDWuLMM7iyDAaiWsQG4fPlyrFixAnl5ecjLy8O4ceNw2mmnYdeuXV1+DakAHDFrHSzbwca96v+1tmmMu8gZgFrjzjK4swwGoFrGBuDJnHfeeZg/f36Xf3+pALzr1TRYtoPUvK7/TGjqGuMucgag1rizDO4sgwGoFgMQQFtbGxYvXozTTz8dOTk5Xf5+UgF479z1sGwHybllnp9jOuMucgag1rizDO4sgwGoVkQHYFOTu/80WlZWFnr16oWePXvi3HPPxYoVK771929ubkZtbW3n4/f74fP5EAgE0Nra6ukTDAYRFxeHYDCI+18PBWDCzgOen2P68/Wdw/1eRJ7G6s4AbG2s5s6aPdyZO+v0qNw5EAgwAMP9Bk5Ve3s7Jk+ejEsuuQQ9e/bs/PX+JkyYcEr/+hYAWlpaUFBQgG3btmHMmDH47ne/+60/AhgdHQ2fz3fCExMTg7i4OGXPHVPjYdkOJr63TOk5fPR/4mOXdAZgfOySsL8fPnz48AnHExMTwwAM9xs4VZMmTULfvn2xaNEinHXWWZ0B+Mknn+CWW25x9drDhw/Hn//852/87eH6EcAH306HZTtYur047P9Epttj3D/J80cAtX64M3fW6eGPAKoVcQH4/e9/H2vWrAEAnHPOOZ0BmJubi+985zuuXvuOO+7A6NGju/z7S30N4H+/twWW7eDz7X7PzzHd13c2Ar8GUGvcWQZ3lqFyZ34NYAQG4JlnnomioiIAxwdgTk4OevXq1eXXGTt2LNLS0lBYWIisrCyMGzcOPXr0wOrVq7v8GlIB+PsFW2HZDj7ZWuL5OaYz7iJnAGqNO8vgzjIYgGpFXADedNNN+OijjwAcH4ATJ07EkCFDuvw6jz32GCzLwumnn44LLrgAw4cPP6X4A+QC8E8fboNlO1i0ucjzc0xn3EXOANQad5bBnWUwANWKuABcvnw5zj33XLz44os4++yzMXPmTPzxj3/E6aeffsoB55ZUAD656EtYtoMPNhZ6fo7pjLvIGYBa484yuLMMBqBaEReAAJCYmIihQ4eiV69eOOuss3Dbbbdh1apV4u9DKgD/vngHLNvBu2n7PD/HdMZd5AxArXFnGdxZBgNQrYgMwO5CKgCf+SQDlu3gzXV7PT/HdMZd5AxArXFnGdxZBgNQLQagC1IB+H+f7YRlO3h9bYHn55jOuIucAag17iyDO8tgAKoVEQH4ne98B+edd16XHklSATjuiyxYtoNXkvI8P8d0xl3kDECtcWcZ3FkGA1CtiAjADz74oPOZNWsWzjvvPDz44IOYM2cO5syZgwcffBDnnXceZs+eLfq+pAIwetkuWLaDmYl7PD/HdMZd5AxArXFnGdxZBgNQrYgIwK/75S9/iblz557w7XPnzsX9998v+l6kAnBKfA4s28H0hN2en2M64y5yBqDWuLMM7iyDAahWxAVgr169UFBw4tfC5efnn9IvBO0FqQCcnrAblu1gSvw3/3eK6d9j3EXOANQad5bBnWUwANWKuAC87LLLMGPGjBO+fcaMGbjssstE34tUAM5M3APLdhC9bJfn55jOuIucAag17iyDO8tgAKoVcQG4YMEC9OjRA3fffTemTJmCKVOm4J577kHPnj2xYMEC0fciFYCvJOXBsh2M+yLL83NMZ9xFzgDUGneWwZ1lMADVirgABIDNmzfjoYcewsCBAzFgwAA89NBD2Lx5s/j7kArA19cWwLId/N9nOz0/x3TGXeQMQK1xZxncWQYDUK2IDMDuQioA31y3F5bt4JlPMjw/x3TGXeQMQK1xZxncWQYDUK2IC8Di4uJvfSRJBeC7aftg2Q7+vniH5+eYzriLnAGoNe4sgzvLYACqFXEBGBUVhR49enzjI0kqAD/YWAjLdvDkoi89P8d0xl3kDECtcWcZ3FkGA1CtiAvAzMzM455t27bhnXfewdVXX42lS5eKvhepAFy0uQiW7eBPH27z/BzTGXeRMwC1xp1lcGcZDEC1Ii4Av4njOBg2bJjomVIB+MnWEli2g98v2Or5OaYz7iJnAGqNO8vgzjIYgGppE4D5+YHCFAwAACAASURBVPk4++yzRc+UCsDPt/th2Q7++70tnp9jOuMucgag1rizDO4sgwGoVsQFYG1t7XFPTU0NcnNz8cADD6B///7i70UiAOMyDsCyHfzunU2en2M64y5yBqDWuLMM7iyDAahWxAXgyX4SSFRUFC677DKkp6eLvhepAFyRdQiW7eA3b8r+8ZnAuIucAag17iyDO8tgAKoVcQG4bt264560tDTk5ubiyJEj4u9FKgBX7SqFZTv4xRsbPD/HdMZd5AxArXFnGdxZBgNQrYgLwNTU1JPG3pEjR5Camir6XqQCMDm3DJbtYORr6z0/x3TGXeQMQK1xZxncWQYDUK2IC8AePXqgvLz8hG8PBALa/jqAqXkVsGwHd72a5vk5pjPuImcAao07y+DOMhiAakVcAEZFRaGiouKEb8/Ly0Pv3r1F34tUAG7cexiW7WDErHWen2M64y5yBqDWuLMM7iyDAahWxATgqFGjMGrUKPTo0QN333135/8eNWoU7rvvPvTp0wd33nmn6HuSCsCthZWwbAc/mZni+TmmM+4iZwBqjTvL4M4yGIBqRUwAPvroo3j00UcRFRWFBx54oPN/P/roo/jzn/+M6dOn4/Dhw6LvSSoAdxRXwbId3PZisufnmM64i5wBqDXuLIM7y2AAqhUxAfiViRMnoqFB7m9c30YqALP8NbBsB7dMX+P5OaYz7iJnAGqNO8vgzjIYgGpFXAB2J1IBuPtQLSzbwU1Tkjw/x3TGXeQMQK1xZxncWQYDUK2ICMCBAweiqqoKADBgwAAMHDjwGx9JUgFYUF4Hy3bQf9Iqz88xnXEXOQNQa9xZBneWwQBUKyICcOLEiQgGg53//7c9kqQCsPBwAyzbwbXPJ3p+jumMu8gZgFrjzjK4swwGoFoREYDdlVQAllQGYdkOrpqQ4Pk5pjPuImcAao07y+DOMhiAakVsALa0tMDv96O4uPi4R5JUAJbWNMGyHXx/7ArPzzGdcRc5A1Br3FkGd5bBAFQr4gIwLy8PQ4YMQY8ePY57oqKitP0vgRyub4ZlO7BsBx0dHZ6fZTLjLnIGoNa4swzuLIMBqFbEBeCtt96KoUOHIiEhARkZGcjMzDzukSQVgDXB1s4AbG1r9/wskxl3kTMAtcadZXBnGQxAtSIuAM8++2zk5uaG+20AkAvAhuYjnQHY2NLm+VkmM+4iZwBqjTvL4M4yGIBqRVwA3nzzzVi/fn243wYAuQBsam3rDMC6Jl44XjLuImcAao07y+DOMhiAakVcACYnJ+NHP/oRUlJSEAgEUFtbe9wjSSoA29o7OgOwqqHF87NMZtxFzgDUGneWwZ1lMADVirgAjIqK6vwJH6b8JBAA6DMmFIDldU2en2Uy4y5yBqDWuLMM7iyDAahWxAXgunXrvvWRJBmAV4xLgGU7OFjd6PlZJjPuImcAao07y+DOMhiAakVcAHYnkgF49YSVsGwHJZVBz88ymXEXOQNQa9xZBneWwQBUK+ICcOfOnSd9srKykJ+fj+bmZrH3IhmA10UnwrId7Kuo9/wskxl3kTMAtcadZXBnGQxAtSIuAE/29X9ff8444ww88sgjaGpS/7VykgE4cPJqWLaDvLI6z88ymXEXOQNQa9xZBneWwQBUK+ICMC4uDldddRXmz5+PrKws7Ny5E/Pnz0e/fv2wZMkSLFq0CJdeeimeffZZ5e9FMgAHTU2CZTvYdbDG87NMZtxFzgDUGneWwZ1lMADVirgAHDRoEBITE0/49sTERAwaNAgAEBsbi759+yp/L5IBeOsLybBsB5kl1Z6fZTLjLnIGoNa4swzuLIMBqFbEBeCZZ5550v8SSG5uLs4880wAQGFhIc466yzl70UyAH/80lpYtoPtRVWen2Uy4y5yBqDWuLMM7iyDAahWxAXggAEDMHr0aLS0HPsFkVtbWzF69GgMGDAAALBhwwb06dNH+XuRDMDbX06BZTvYvC/g+VkmM+4iZwBqjTvL4M4yGIBqRVwAbty4Eeeffz4uuOACDB8+HCNGjMCFF16I888/H5s2bQIALFy4EDNmzFD+XiQD8GezU2HZDjYUHPb8LJMZd5EzALXGnWVwZxkMQLUiLgABoL6+Hm+++SaeeeYZPP3003jrrbdQVyf/s2MlA/DuOWmwbAcpe8o9P8tkxl3kDECtcWcZ3FkGA1CtiAzA7kIyAO+bux6W7WDN7jLPzzKZcRc5A1Br3FkGd5bBAFQrYgMwJycHK1euxLJly457JEkG4C/nbYRlO1iZXer5WSYz7iJnAGqNO8vgzjIYgGpFXADu27cPN9xwQ+cvCB0VFXXcLw4tSTIAf/tWOizbQfzOg56fZTLjLnIGoNa4swzuLIMBqFbEBeDIkSNx//33o6KiAueccw52796N9evXY/DgwUhLSxN9L5IB+F/vboZlO4jdccDzs0xm3EXOANQad5bBnWUwANWKuAA8//zzsXPnTgDAf/zHf2DPnj0AgOTk5M5fBkaKZACOfn8LLNvBp9tKPD/LZMZd5AxArXFnGdxZBgNQrYgLwO985zvYt28fAKBv375Yu3YtAGDv3r0iv/jz10kG4B8+2ArLdrB4S7HnZ5nMuIucAag17iyDO8tgAKoVcQE4ZMgQxMbGAgB+97vf4a677sKGDRvwyCOP4NprrxV9L5IB+JeF22HZDhZuKvL8LJMZd5EzALXGnWVwZxkMQLUiLgATExOxdOlSAKGfENKvXz9ERUXhu9/9LpKTk7v8OtOnT8fNN9+Mc845BxdccAHuv//+zn+d3FWSAfjXj7+EZTt4f8N+z88ymXEXOQNQa9xZBneWwQBUK+IC8GQqKyvR0dFxSt/nzjvvxIIFC7Br1y5kZmbinnvuwWWXXYaGhq7/TVEyAJ9ekgHLdvBO6j7PzzKZcRc5A1Br3FkGd5bBAFRLiwD0QkVFBXw+H1JTU7v8fSQD8NlPM2HZDual7PX8LJMZd5EzALXGnWVwZxkMQLUiJgB///vfd+n5dxUUFMDn8yE7O7vL30cyAMcs3QnLdvDamnzPzzKZcRc5A1Br3FkGd5bBAFQrYgIwKioKffr0wahRo/CLX/ziG59/R0dHB+69914MGTLkW3+/5uZm1NbWdj5+vx8+nw+BQACtra2ePsFgEHFxcQgGg2htbcW4owE4c+Vuz88y+fnnnbV/Gqs7A7C1sZo7a/ZwZ+6s06Ny50AgwAAM9xvoqieeeALnnXce+vfvjzlz5qCystKz137yySdhWRb8fv+3/n7R0dHw+XwnPDExMYiLi1P6PPLKcli2gz+8tlz5WXz0feJjl3QGYHzskrC/Hz58+PAJxxMTE8MADPcbOBXNzc2IiYnBiBEjcPbZZ+M3v/kNEhMTT/kngHzd3/72N1x66aXYv/9f/+zacP4I4OTl2bBsB5OXZ4f9n8p0eoz7J3n+CKDWD3fmzjo9/BFAtSIqAL+uqKgIEydORN++ffGf//mfqK+vP6Xv39HRgb/+9a+45JJLkJ//731dneTXAL64MheW7WDS8hzPzzLZP++sPX4NoNa4swzuLEPlzvwawAgOwOLiYkyaNAmXX345vve9751yAD7xxBM499xzsW7dOpSWlnY+jY2NXX4NyQCctWoPLNvBc3Fd/0kq9K8Zd5EzALXGnWVwZxkMQLUiKgC//q+AzzzzTPz617/GihUr0N7efsqvdbKv5fP5fFiwYEGXX0MyAOesyYdlOxizNMvzs0xm3EXOANQad5bBnWUwANWKmAD8+k8CefXVVxEIBML9lkQD8I2UAli2g398mun5WSYz7iJnAGqNO8vgzjIYgGpFTABGRUXBsiz84he/wKhRo77xkSQZgG+n7oVlO3hmSYbnZ5nMuIucAag17iyDO8tgAKoVMQE4evRoPProo//ykSQZgO+t3w/LdvC3mB2en2Uy4y5yBqDWuLMM7iyDAahWxARgdyQZgAvTC2HZDh7/aLvnZ5nMuIucAag17iyDO8tgAKrFAHRBMgBjthSHfiHoD7Z5fpbJjLvIGYBa484yuLMMBqBaDEAXJAPwk20lsGwHo9/f4vlZJjPuImcAao07y+DOMhiAajEAXZAMwC92+GHZDh6ev9nzs0xm3EXOANQad5bBnWUwANViALogGYDLMw/Csh088Ha652eZzLiLnAGoNe4sgzvLYACqxQB0QTIAV2YfgmU7+NW8jZ6fZTLjLnIGoNa4swzuLIMBqBYD0AXJAEzKKYNlO7jv9Q2en2Uy4y5yBqDWuLMM7iyDAagWA9AFyQBcu6cclu3gntfSPD/LZMZd5AxArXFnGdxZBgNQLQagC5IBuD7/MCzbwZ2vpHp+lsmMu8gZgFrjzjK4swwGoFoMQBckA3DTvgAs28EdL6d4fpbJjLvIGYBa484yuLMMBqBaDEAXJANwe1ElLNvB0BlrPT/LZMZd5AxArXFnGdxZBgNQLQagC5IBmFFSDct2cOsLyZ6fZTLjLnIGoNa4swzuLIMBqBYD0AXJAMw+UAPLdjB4WpLnZ5nMuIucAag17iyDO8tgAKrFAHRBMgD3lNbBsh3cOHm152eZzLiLnAGoNe4sgzvLYACqxQB0QTIA91bUw7IdXB+d6PlZJjPuImcAao07y+DOMhiAajEAXZAMwOJAEJbtoN9zKz0/y2TGXeQMQK1xZxncWQYDUC0GoAuSAXiguhGW7eCK8Qmen2Uy4y5yBqDWuLMM7iyDAagWA9AFyQAsr22CZTu4fIzj+VkmM+4iZwBqjTvL4M4yGIBqMQBdkAzAyoYWWLYDy3bQ3t7h+XmmMu4iZwBqjTvL4M4yGIBqMQBdkAzA2qbWzgBsPtLm+XmmMu4iZwBqjTvL4M4yGIBqMQBdkAzAYMuRzgBsaD7i+XmmMu4iZwBqjTvL4M4yGIBqMQBdkAzAliPtnQFY08hLxyvGXeQMQK1xZxncWQYDUC0GoAuSAdjR0dEZgIH6Zs/PM5VxFzkDUGvcWQZ3lsEAVIsB6IJkAAJA37ErYNkOymqbPD/PVMZd5AxArXFnGdxZBgNQLQagC9IBeOX4BFi2A39V0PPzTGXcRc4A1Bp3lsGdZTAA1WIAuiAdgNc8txKW7aAoIPc3bt0Zd5EzALXGnWVwZxkMQLUYgC5IB+ANE1fBsh0UlNd7fp6pjLvIGYBa484yuLMMBqBaDEAXpAPwpimrYdkOckvN/cB6zbiLnAGoNe4sgzvLYACqxQB0QToAfzhtDSzbQfaBGs/PM5VxFzkDUGvcWQZ3lsEAVIsB6IJ0AN76QjIs28GO4irPzzOVcRc5A1Br3FkGd5bBAFSLAeiCdAAOm7EWlu1gW2Gl5+eZyriLnAGoNe4sgzvLYACqxQB0QToAh89aB8t2kL434Pl5pjLuImcAao07y+DOMhiAajEAXZAOwDtfSYVlO0jLr/D8PFMZd5EzALXGnWVwZxkMQLUYgC5IB+DI19bDsh2szS33/DxTGXeRMwC1xp1lcGcZDEC1GIAuSAfg/a9vgGU7WJ1T5vl5pjLuImcAao07y+DOMhiAajEAXZAOwF+/uRGW7SAh65Dn55nKuIucAag17iyDO8tgAKrFAHRBOgAffHsTLNvBssyDnp9nKuMucgag1rizDO4sgwGoFgPQBekAfHj+Zli2g6Vf+j0/z1TGXeQMQK1xZxncWQYDUC0GoAvSAfjo+1tg2Q4+2Vri+XmmMu4iZwBqjTvL4M4yGIBqMQBdkA7AP364DZbt4OPNxZ6fZyrjLnIGoNa4swzuLIMBqBYD0AXpAHxi0XZYtoMP0ws9P89Uxl3kDECtcWcZ3FkGA1AtBqAL0gH4PzE7YNkO5q/f7/l5pjLuImcAao07y+DOMhiAajEAXZAOwGc+yYBlO3hr3V7PzzOVcRc5A1Br3FkGd5bBAFSLAeiCdAD+v88yYdkOXl9b4Pl5pjLuImcAao07y+DOMhiAajEAXZAOwLFfZMGyHbyalO/5eaYy7iJnAGqNO8vgzjIYgGoxAF2QDsDn47Jh2Q5eXrXH8/NMZdxFzgDUGneWwZ1lMADVYgC6IB2Ak+NzYNkOXkjI9fw8Uxl3kTMAtcadZXBnGQxAtRiALkgH4PQVu2HZDqbE53h+nqmMu8gZgFrjzjK4swwGoFoMQBekA3BGYi4s20H0sl2en2cq4y5yBqDWuLMM7iyDAagWA9AF6QCcvToPlu1gfGyW5+eZyriLnAGoNe4sgzvLYACqxQB0QToA5ybnw7Id2J/v9Pw8Uxl3kTMAtcadZXBnGQxAtYwOwNTUVIwcORIXX3wxfD4fYmNjT+n7Swfgm+v2wrId/O8nmZ6fZyrjLnIGoNa4swzuLIMBqJbRAZiQkIDx48dj6dKlERGA76btg2U7+J+YHZ6fZyrjLnIGoNa4swzuLIMBqJbRAfh1kRCAMVuKYdkO/vDBVs/PM5VxFzkDUGvcWQZ3lsEAVIsBeFQkBOCyzIOwbAcPvJ3u+XmmMu4iZwBqjTvL4M4yGIBqMQCP6koANjc3o7a2tvPx+/3w+XwIBAJobW319AkGg4iLi0MwGOz8tlXZoQAc+Vqa5+eZ+pxsZ62fxurOAGxtrObOmj3cmTvr9KjcORAIMADD/Qa6i64EYHR0NHw+3wlPTEwM4uLilD8vfxgHy3YwKDpe5Dw++j3xsUs6AzA+dknY3w8fPnz4hOOJiYlhAIb7DXQXkfAjgBlFAVi2g8FTk8L+T2a6PMb9kzx/BFDrhztzZ50e/gigWgzAoyLhawD3H26AZTu47vlEz88z1cl21hq/BlBr3FkGd5ahcmd+DaDhAVhfX4+MjAxkZGTA5/Nh9uzZyMjIQHFxcZe+v3QAltc2wbIdXD7GQUdHh+dnmsi4i5wBqDXuLIM7y2AAqmV0AKakpJz0a/pGjx7dpe8vHYANzUdg2Q4s20Gw5YjnZ5rIuIucAag17iyDO8tgAKpldAC6JR2A7e0d6DMmFIAVdc2en2ki4y5yBqDWuLMM7iyDAagWA9AF6QAEgGueWwnLdlB4WO5v3joz7iJnAGqNO8vgzjIYgGoxAF0IRwAOmpoEy3aQfaDG8zNNZNxFzgDUGneWwZ1lMADVYgC6EI4AvH1mCizbwZb9lZ6faSLjLnIGoNa4swzuLIMBqBYD0IVwBOA9r6XBsh2szS33/EwTGXeRMwC1xp1lcGcZDEC1GIAuhCMAf/tWOizbwfLMg56faSLjLnIGoNa4swzuLIMBqBYD0IVwBOBjC7bCsh0s2dq1X6uQvp1xFzkDUGvcWQZ3lsEAVIsB6EI4AvBvMTtg2Q7mr9/v+ZkmMu4iZwBqjTvL4M4yGIBqMQBdCEcAjlm6E5btYM6afM/PNJFxFzkDUGvcWQZ3lsEAVIsB6EI4AnBKfA4s28H0hN2en2ki4y5yBqDWuLMM7iyDAagWA9CFcATgrNV5sGwH42OzPD/TRMZd5AxArXFnGdxZBgNQLQagC+EIwLdT98KyHTy9JMPzM01k3EXOANQad5bBnWUwANViALoQjgBctLkIlu3gjx9u8/xMExl3kTMAtcadZXBnGQxAtRiALoQjAOMyDsCyHTz07ibPzzSRcRc5A1Br3FkGd5bBAFSLAehCOAJwdU4ZLNvBfa9v8PxMExl3kTMAtcadZXBnGQxAtRiALoQjADfuPQzLdjB81jrPzzSRcRc5A1Br3FkGd5bBAFSLAehCOAJwp78alu3gR9PXeH6miYy7yBmAWuPOMrizDAagWgxAF8IRgAXl9bBsB9dHJ3p+pomMu8gZgFrjzjK4swwGoFoMQBfCEYClNU2wbAd9x65AR0eH5+eaxriLnAGoNe4sgzvLYACqxQB0IRwBWNfUCst2YNkOmlrbPD/XNMZd5AxArXFnGdxZBgNQLQagC+EIwLb2js4ADNQ3e36uaYy7yBmAWuPOMrizDAagWgxAF8IRgABw9YSVsGwHxYGg5+eaxriLnAGoNe4sgzvLYACqxQB0IVwBeNOUJFi2g92HzP3gesW4i5wBqDXuLIM7y2AAqsUAdCFcATh0xlpYtoNthZWen2sa4y5yBqDWuLMM7iyDAagWA9CFcAXgz19Ng2U7SNlT7vm5pjHuImcAao07y+DOMhiAajEAXQhXAP7mzXRYtoMVWYc8P9c0xl3kDECtcWcZ3FkGA1AtBqAL4QrA0e9vgWU7+GRbiefnmsa4i5wBqDXuLIM7y2AAqsUAdCFcAfjkx1/Csh28v2G/5+eaxriLnAGoNe4sgzvLYACqxQB0IVwB+H+f7YRlO3h9bYHn55rGuIucAag17iyDO8tgAKrFAHQhXAE4cfkuWLaDF1fmen6uaYy7yBmAWuPOMrizDAagWgxAF8IVgC+v2gPLdvBcXLbn55rGuIucAag17iyDO8tgAKrFAHQhXAH45rq9sGwH//tJpufnmsa4i5wBqDXuLIM7y2AAqsUAdCFcAbgwvRCW7eAvC7d7fq5pjLvIGYBa484yuLMMBqBaDEAXwhWAS7/0w7IdPDx/s+fnmsa4i5wBqDXuLIM7y2AAqsUAdCFcAZi4qxSW7WDUGxs8P9c0xl3kDECtcWcZ3FkGA1AtBqAL4QrA9fmHYdkOfjY71fNzTWPcRc4A1Bp3lsGdZTAA1WIAuhCuANxRXAXLdnDrC8men2sa4y5yBqDWuLMM7iyDAagWA9CFcAVgflkdLNtB/0mrPD/XNMZd5AxArXFnGdxZBgNQLQagC+EKwAPVjbBsB1eMS/D8XNMYd5EfaUDdwrNwZFEPBqCGuLMM7iyDAagWA9CFcAVgTbAVlu3Ash20HGn3/GyTmHaRb993ENeO/RR3R7+KxqDcxWfazuHCnWVwZxkMQLUYgC6EKwBb29o7A7CqocXzs01i0kV+qKYRN01Z1fnZGbd0h9jZJu0cTtxZBneWwQBUiwHoQrgCEACuGJ8Ay3bgrwp6frZJTLnIm1rbMPK19bBsB7dNmN8ZgUk5ZSLnm7JzuHFnGdxZBgNQLQagC+EMwIGTV8OyHewprfP8bJOYcJF3dHTgqcU7YNkOBkxKRMmCizB15mOwbAcDJ69GeV2T8vdgws7dAXeWwZ1lMADVYgC6EM4AHPJSMizbwfaiKs/PNokJF/m6vApYtoO+Y1dgY54f+NiH5o/+P9z1Sgos28FjC7Yqfw8m7NwdcGcZ3FkGA1AtBqAL4QzAO19JhWU7SMuv8Pxsk5hwkT/y3hZYtoPoZbuO+2Vg8g+W4/IxoX8VXFBer/Q9mLBzd8CdZXBnGQxAtRiALoQzAH85byMs28HK7EOen20S3S/ygvLQrxnZZ4yD4kDwhF8H8A8fbIVlO5jq5Ch9H7rv3F1wZxncWQYDUC0GoAvhDMD/PvqjOp9t93t+tkl0v8jHfpEFy3bwpw+3hb7hnwIwKaes82sBm4+0KXsfuu/cXXBnGdxZBgNQLQagC+EMwMc/2g7LdvBheqHnZ5tE54u8qqEFV00I/WzxTfsCoW/8pwA80taOwdOSYNkOnJ3qfjRZ5527E+4sgzvLYACqxQB0IZwB+OynmbBsB2+kFHh+tkl0vsjfSCmAZTv4+atp6OjoCH3jSf5TcDMT98CyHTw8f7Oy96Lzzt0Jd5bBnWUwANViALoQzgCMXrYLlu1gRmKu52ebRNeLvLWtHT+ctgaW7eDzr3+ZwEkCsKQy2PnrApZUqvl1JXXdubvhzjK4swwGoFoMQBfCGYAvrcw99jM76d+m60W+ML0Qlu3gpilJx39t30kCEAAenr8Zlu1gZuIeJe9H1527G+4sgzvLYACqxQB0IZwB+Pra0L/e+8enmZ6fbRIdL/LqYAv6Twr9J98W/vPXiH5DADo7Dx39haJXoSjQAK/puHN3xJ1lcGcZDEC1GIAuhDMAY7YUw7Id3PlKKtrbOzw/3xQ6XuTPxWV3fjaOtLUf/xu/IQBbjrTj7jlpsGwHQ15KRnmtt/91EB137o64swzuLIMBqBYD0IVwBmBVQwuuez4Rlu1gWeZBz883hW4XeW5pbecv7py+N3Di7/ANAQgA5XVNGDpjbWc81gS920S3nbsr7iyDO8tgAKplfAC+8cYb6NOnD8444wzceOONSEtL6/L3DWcAAsCcNfmwbAfDZqxF6z//SA91iU4XeVt7Bx54Ox2W7eCJRdtP/jt9SwACQHEgiJunJnV+/eDD8zfjubhsvLluLz7ZWoLVOWXIPlCDYMuRU3pvOu3cnXFnGdxZBgNQLaMDcMmSJTjttNPw7rvvYvfu3XjqqafQq1cvFBcXd+n7hzsAG5qP4MbJq2HZDhZtLvL8PZgg0i7yjo4OBFuOoKy2CTWNrejo6EBrWzs+3VaCn8wM/bd9rxyf8M0/m/dfBCAA7D5U2/m5+rbn1heS8d/vbcGk5TlYtLkIWwsrUdd08h0jbedIxZ1lcGcZDEC1jA7AwYMH4/HHHz/u266++mqMGTOmS98/3AEIAO9v2A/LdjB4WhKaWtX9lxxO1ZG2djQ0H0GgvhkHqxtRXtvUpffX2tZ+7PvUNaE62ILGlrZjv46dB9rbO9B8pA3NR9pQ39iMz76IQ30w9P6+/jS2HHuCLUc6n668n5Yj7ThY3YjMkmqs2V2GxVuK8dqafDwXl43HP9qOX83biJ/MTMFtLybjR9PX4IfT1mDQ1CTcNGU1Bk5ejZunJuHWF5IxdMZa3PZiMgZPS8KASavwg3ErjouwvmNX4OoJKzv/d/9JqxC748A3v7EuBCAQ+oeLbYWV+GRbCV5IyMUzSzLw6PtbcN/c9Rj4L+JwyEvJeGzBVkxcvgsLNuzHql2l2FRQjrcXx6H4cB2KA0EUlNcjt7QWWf4afFlchS37K7Gh4DBS9pRjdU4ZErIOIS7jAOIyDmBl9iGs3VOOtPwKrNkd+m3xOw9i1a5SpOwpR/reALYXVSH7QA1yS2uRWVLd+Xpb9ldiR3Hot+WV1aHwcAMOfO2zFWw5gta29lP6fDW2tKHwcAO2F1Vip78aBeX1pXX1ogAAF1BJREFUOFDdiOJAEHlldZ1/zj/eXIw5a/Lx+toCLNiwH59sK0FafgWKA8ETvzbTIye7Nzo6OtBypB3BliOoaWxFffORf+v8r16j5cip7XUyR9racbi+GQXlob12H6rF3op6lFQGUV4b+nNT33wEdU2tqG1qRU2wFVUNLahsaEGgvhlVDS2dfyyNLaG/Xlvb2l19PXRbe+gfrmqCrWhq/fa/xsMVgG3tHahtasWhmkbkl9WhoLwOpTVNqGtq7VZfC97e3oGG5iOdT2NL23Hvr/lIGw7VNCKvrA77j/41WdnQgrZ/+mNgAKplbAC2tLSgZ8+e+OKLL4779r///e8YOnToSb9Pc3MzamtrOx+/3w+fz4dAIIDW1lZPn2AwiLi4OASDwW/9/eobm3HrC6Ff723w1CTc+sIaDJ4W+r/DZqzFiFkp+Pmrqbhv7nr8at4G/PatjXjw7XT87p10PPTOJjz87iY8Mn8zRr+3Gb9/fwv+sGAL/vjBVvzpw634y8JteOKjbXhy0Xb87ePteHzhNvz+/S146J1N+NW8DRj5Whp+Omsdhr60Fj88Gij9nluJvmNXfGMcXDUhAYOnJmHErBT8at4G/PrNjfjZ7HW4ZfoaXPPcym/8ft8fuwIDJq3CD6cl4eYpqzFw8ircMDER1zy/EldNSEC/51Zi8NQk3PFyCu6ek4qfzlqHYTPW4tYX1uDmKatxw8RE9HtuJb7/Le/tVJ7Lxzi49vlEDJ6WhNtnpuDe19Lwq3kbMPzlFPSfuMqTM77t6TPm+P994+TVeGNtHqrqG7/9s9VY3RmArY3V//bns6y6AekF5fgofT8mLcvGI/M344dH/4sikfj0GePgB+NW4IrxCbhyfELnZ+qa51bimudX4trnE3FddOjz5sV5fceuQL/nQq97w8REDJi0CjdOXo1BU5Pww6N//Q55MRnDZqzF7TPXYvjLKbhz9jrcPScV985Nw8jX0nDnK6kY/nIKhs1Yi9uO/nV/4+RV6Dc+Htc8txJXjk/41r8WfzBuBa59PhE3T1mN215MxvCXUzDy6Of4V/M24M5XUnHbi8kYMGkVrhifcNI/hivHJ+Ca51ei/8RVuGnKavxwWhJuezEZPzl699z1SirufS0No97YgPvmrsfQl9bi+uhE5X8++45dgR+MC72/b9p58LQkDJy8Ctc8f/J74fIxDq55fiUGTU3CsBlrcdcrqfj5q6m465VU/Gx2Cm6ZFI8Rs1Iw/OUU3PFyCm6fmYKfzFiLYTPWYuhLa/Hjl5Lxs9nr8Kt5G/DIe5vx4NvpuPOVVNwyfQ0GTFqF66NDd9KASaswbMZa3Ds3Db99ayMeeid0J//u7XTc+1oabp+5FoOmJn3r/fjVc83Re/DHLyXjjqOfmXvmpOH+10P3/y/fCP15/fFLybhl+hrcMn0NfnT0ufWFNbjtq+fFZAw5+vz4pWQMfSn0xzRsxlr85Ohz+8y1uH1m6I/7jpdTOj+LAyat6vw65H9+rpqQ8K1/DfUZ46D/xFX48UvJR7dMxqDoeLyTkuf532MDgQADMNxvIFwOHjwIn8+HjRs3Hvft06ZNw5VXXnnS7xMdHQ2fz3fCExMTg7i4uLA9E95dFva/gX7rZTwmHn3s+FP+PuF+326fy8fEo/9z8RgyOR53v7gcD8xajj+9thz/++YyTHxvGV5eGIdXP4rDa4viMHdRHF7/OA7zPo7DvJjQ/z9nURxmH/19Xv84Dm/GxGHBJ3FYsjQOsbFx+OyLOHz4aRzeign9/135rMTHLukMwPjYJZ5/Fj/+LA4zP1yGf7y1DL9/dTnufWk5hk6Jx03Px+PqcfHoOyYeV46NR79x8bhuQmifG5+Px6DoeNwyMR63TY7H0CnxuGNqPEZMW46fTl+On0wNffstk0Jb/mRq6LcPmxL69sETQ69xw4R4XDshHgOeO/Z6g6KP/bZrxsfjqnHx+L4Hn60rxoZet/9zoT+Wr/64rhl/7M/5PS8ux4OzluO3Ly/HL2Ysx10vLMfgid6cr8vTb1xor+smhD4fPxh76neFiU/fMfHoNz70XB6hn6fLx3T9r8m/zF3m+V0VExPDAAz3GwiXrwIwPT39uG+fOnUqrrrqqpN+n+74I4BfPVklldi8twLb9h/GjsIAtu0/jPSCcqTuKcWanENYufMAlu0oQeyXJVi6vRifbSvGZ1uL8MmWIizeXIiPNxXi40378VH6fny4cR8WbNiH99fvxXtpe/FuagHeXleA99fvxceb9uOzbcVYnuHHquyDSN1Tis17K5BRFEDOgSrsLavBgcp6HK4Noi7YhObmFrS2tqK5uQWVdUHsK69BRlEA63JLO99P8u5D2L7/MApKa1Be04DGpma0traipaUFjU3NqKpvRPHhOuT4q/Bl4WHsLK7ELn8lcg9Wo6C0BvvLa1FQFnrd9XllSNoVel/pBeXYvj/0++cerMa+8hqUBOpQVt2AyrogKusaUV5ViyWfx6GiqhZV9Y2oqm9E9deemoZjT21DE2obmlBV34iDlfXIO1SNHYWhM1dmHUDslyVYl1uKHH8VymsaOv/Yu9Xj0Y8Aqv48q35aWloQbGpGTUMjDtcGcbCyHkUVtSisqMX+8lrsK6/B3rIaFJTVoKC0Bvml1cg7VI380mpU1gXR0vLv/7ltbm6BP1CHvWWh1809WI0cfxWySyqRWRzo/Ot3y94KpBeUY31eGVL3lGLt7lIk7TqIlVkHsCr7IJJ3H0LanjKkF5Rj674K7CgMYMf+crwVE4fd/sMorKiFP1CH0qrQX4/V9Y2ob2xGbUMTymsaUHy4DnmHqrGzuBJb9lUgbU8ZVmUfxLIdJVie4Ufy7kPYsrcCOf4qFFXU4nBtEDUNjQjUBlFa3QB/oA6FFbUoKK3B7gNVyCqpxI7CALbsq8DG/NDdk5xzCInZB+Fk+rEi8wDSC8qx+0AVSquP/XX+TX9uahuaUB9sQn1jM4JNzWhqbkFLS+hpam5BQ2Mz6oJNqGloRGVd6M9jWXUDDlXVwx+oQ/Hh0Ps7bucDx3bOKAogx1+FgrLQvVBe04CahkYEj945ByrrkV9ajYyiANILyrEm5xCSdh1Ecs4hrM7y46UPlmFNth+pe0qxPq8M6/PKsDG/HOkF5dhUUI7Neyuwdnfonvt4UyE+31aM5JxD2Lb/MHb5K7HnYDUKymqQXVKJDfllSNgZukM+21qEmM2h3z8x+yDW55UhoyiAgrIalFY3oL6x+YS96oNNKK2qR0Fp6B7cdPRzs3Z3KVbvOogVmQeO+/O6eW8Fviw83Pls338Y244+W/dVYMtXz94KbD76bCoI/bGlF5RjY345NuSXYUN+Wecf+1d//Dn+KhyorEdNQyPqgk2oCzahur4RpVX12F9ei/zSahyuPfGvocamZpRWNyDnQBU2HT0jdfdBvLwwDvkHKz2/A/gjgAYH4L/zr4D/WXf4GkByx7idu/g1gF4zbucw4c4yuLMMlTvzawANDkAg9JNAnnjiieO+rV+/fhH1k0DIHeN2ZgBqjTvL4M4yGIBqGR2AX/0yMO+99x52796Np59+Gr169UJRUdd+SRUGYOQzbmcGoNa4swzuLIMBqJbRAQiEfiFoy7Jw+umn48Ybb0RqamqXvy8DMPIZtzMDUGvcWQZ3lsEAVMv4AHSDARj5jNuZAag17iyDO8tgAKrFAHSBARj5jNuZAag17iyDO8tgAKrFAHSBARj5jNuZAag17iyDO8tgAKrFAHSBARj5jNuZAag17iyDO8tgAKrFAHSBARj5jNuZAag17iyDO8tgAKrFAHSBARj5jNuZAag17iyDO8tgAKrFAHSBARj5jNuZAag17iyDO8tgAKrFAHSBARj5jNuZAag17iyDO8tgAKrFAHSBARj5jNuZAag17iyDO8tgAKrFAHSBARj5jNuZAag17iyDO8tgAKrFAHShpqYGPp8Pfr8ftbW1nj6BQAAxMTEIBAKevzYfg3euPITad32hp/IQd9bs4c7cWadH5c5+vx8+nw81NTXhTomwYQC68NUHiA8fPnz48OETeY/f7w93SoQNA9CF9vZ2+P1+1NTUKPunExU/usiHO3NnPR/uzJ11elTuXFNTA7/fj/b29nCnRNgwALup2lp+fYIE7iyDO8vgzjK4swzurBYDsJviB18Gd5bBnWVwZxncWQZ3VosB2E3xgy+DO8vgzjK4swzuLIM7q8UA7Kaam5sRHR2N5ubmcL8VrXFnGdxZBneWwZ1lcGe1GIBEREREhmEAEhERERmGAUhERERkGAYgERERkWEYgERERESGYQB2Q2+88Qb69OmDM844AzfeeCPS0tLC/Za0k5qaipEjR+Liiy+Gz+dDbGxsuN+SdqZPn46bb74Z55xzDi644ALcf//92LNnT7jflpbmzZuH66+/Hr1790bv3r1xyy23ICEhIdxvS3vTp0+Hz+fDU089Fe63opXo6OgT/pNtF110UbjflnYYgN3MkiVLcNppp+Hdd9/F7t278dRTT6FXr14oLi4O91vTSkJCAsaPH4+lS5cyABW58847sWDBAuzatQuZmZm45557cNlll6GhoSHcb007y5cvx4oVK5CXl4e8vDyMGzcOp512Gnbt2hXut6atrVu3ok+fPrjhhhsYgB6Ljo7Gtddei9LS0s6noqIi3G9LOwzAbmbw4MF4/PHHj/u2q6++GmPGjAnTO9IfA1BGRUUFfD4fUlNTw/1WjHDeeedh/vz54X4bWqqvr8cVV1yBpKQkDBs2jAHosejoaPTv3z/cb0N7DMBupKWlBT179sQXX3xx3Lf//e9/x9ChQ8P0rvTHAJRRUFAAn8+H7OzscL8VrbW1tWHx4sU4/fTTkZOTE+63o6VHHnkETz/9NAAwABWIjo7G2WefjYsvvhh9+vTBAw88gH379oX7bWmHAdiNHDx4ED6fDxs3bjzu26dNm4Yrr7wyTO9KfwxA9To6OnDvvfdiyJAh4X4r2srKykKvXr3Qs2dPnHvuuVixYkW435KWFi9ejOuuuw5NTU0AGIAqJCQk4PPPP0dWVlbnj7JedNFFCAQC4X5rWmEAdiNfBWB6evpx3z516lRcddVVYXpX+mMAqvfkk0/Csiz4/f5wvxVttbS0oKCgANu2bcOYMWPw3e9+lz8C6LGSkhJceOGFyMzM7Pw2BqB6DQ0NuOiiizBr1qxwvxWtMAC7Ef4r4PBgAKr1t7/9DZdeein2798f7rdilOHDh+PPf/5zuN+GVmJjY+Hz+dCzZ8/Ox+fzISoqCj179kRbW1u436K2RowYccLXx5M7DMBuZvDgwXjiiSeO+7Z+/frxJ4EoxABUo6OjA3/9619xySWXID8/P9xvxzh33HEHRo8eHe63oZW6ujpkZ2cf99x88814+OGH+bWtCjU3N+N73/seJk2aFO63ohUGYDfz1S8D895772H37t14+umn0atXLxQVFYX7rWmlvr4eGRkZyMjIgM/nw+zZs5GRkcFfbsdDTzzxBM4991ysW7fuuF/OobGxMdxvTTtjx45FWloaCgsLkZWVhXHjxqFHjx5YvXp1uN+a9vivgL337LPPYt26ddi/fz82b96MkSNHonfv3vz7oMcYgN3QG2+8AcuycPrpp+PGG2/kL5uhQEpKygm/0KjP5+OPmHjoZPv6fD4sWLAg3G9NO4899ljnnXHBBRfg/2/v7kKa6gM4jp+1l9qOpc2XVLSgkplX0kXdZfYiJrZo2IxhraJoGVi78KLIq+hG67ICqewyIRYoCNagkAgkynDUsjVHqFsRRjVfNjN/z4Vw2Gmutp49pc/5feBctP7/c/6eqy9n55zt3LmT8feHMADTr76+HgUFBdBqtSgsLITFYuH9rP8BBiARERGRwjAAiYiIiBSGAUhERESkMAxAIiIiIoVhABIREREpDAOQiIiISGEYgEREREQKwwAkIiIiUhgGIBHRX2S326WXZKf7JwljX3i+b9++tO6biJY2BiARpVVs0MRuPp/vby9tUbLb7aiurkYoFEIkEpE+TxSEdrs96ZiLRqMIhUKwWq0MQCKSYQASUVrFBk3sNjs7Gzc2Go3+hRUuLomCLh0B+G/mENH/GwOQiNLqZ7FRUVGB06dPw+l0Ijs7G9u2bQMAvHz5Env27IEoisjLy0NDQwM+fvwozZuYmMChQ4cgiiLy8/Nx+fLluN9gXSiYMjMzZb89PDo6CqvViqysLBiNRpjNZgQCgbi1t7W1IT8/H0ajEY2NjZiZmZHGRCIRNDc3o6ioCDqdDhs3bsSNGzcwNzeHDRs2oK2tTbYGj8cDlUqFt2/fpnS+kgnAQCCw4NXWioqKpI5BRMrFACSitPpVAGZkZKC5uRmvX7+G1+tFMBhETk4Ozp07B6/Xi+fPn2P37t2orKyU5p06dQpFRUW4f/8+BgcHUVtbi4yMjJQCcHJyEiUlJTh27BgGBwfx6tUr2Gw2mEwm6Uqk3W7HqlWr4HA44PV60d3dDYPBgPb2dmmfVqsVxcXFcLlc8Pv9cLvduHPnDgDg0qVLKCsrk63B6XRKoZvK+UomAGdnZ2VXWQcGBpCdnY2WlpakjkFEysUAJKK0stvtUKvVEEVR2urq6gDMB2B5eblsfEtLC6qqqmSfjYyMQBAEDA0NIRwOQ6fTSZEFAOPj49Dr9SkF4M2bN2EymTA3Nyf9fzQahV6vR29vr7T2devWyb6uPnDgAOrr6wEAQ0NDEAQBDx48WPBvDwaDUKvV6O/vBwDMzMwgNzcXt2/f/un5ShSAK1askJ1HURSh0WgWHD89PY2tW7eitrYW379/T+oYRKRcDEAiSiu73Y5du3bB5/NJWzAYBDAfgMePH5eNr6mpgVarjQsdQRDQ09ODFy9eQBAEvHv3TjavvLw8pQBsbGyMC1NRFKFSqXDt2jVp7TU1NbJ9NDU1SVcjOzs7oVarZV8J/8hsNuPkyZMAAJfLhZUrV2JycvKn5ytRAF6/fl12Hn0+HywWy4LjbTYbysrK8PXr16SPQUTKxQAkorT61VfAsdEGANXV1bBYLHGh4/P5MDExgYGBgaQCUKVSweVyycYYDAYpAB0OB7Zs2bLgcT5//pxw7WfOnJHuqevq6vplAHZ1dSEzMxNTU1PYu3dvXPD+KB0PgVy8eBFGozHl+wyJSLkYgESUVqkG4Pnz52EymfDt27cF54TDYWi1WnR2dkqfffr0CQaDQbavvLw8XL16Vfr3mzdvIAiCFIDt7e1YvXo1vnz5ktLaYwMwEAhApVIl/AoYmL8vr7CwEFeuXIFGo8GTJ08Sjk10TCD5ALx79y60Wi3cbnfKxyAi5WIAElFapRqAY2NjyM3NRV1dHfr7++H3+9Hb24ujR49K9+I5HA6sXbsWbrcbHo8HZrM57iGQgwcPYtOmTXj27BmePn2KHTt2QKvVxj0Esn37dvT19WF4eBiPHj1CU1MTRkZGEq49NgAB4MiRIyguLsa9e/cwPDyMhw8fyuIUmI9anU6H0tLS3z5fyQSgx+OBwWDAhQsXZA+DjI+PJ3UMIlIuBiARpVWqAQjMX63bv38/srKyoNfrUVpairNnz0oPbITDYTQ0NMBgMGDNmjVobW2N29fY2BiqqqogiiJKSkrQ09MT9xqYUCiEw4cPIycnB8uXL8f69etx4sQJ6apgMgE4PT0Np9OJgoIC6TUwt27dks3x+/0QBAGtra2/fb6SCcCOjg6+BoaIfgsDkIiWpEQxuRg8fvwYGo0G79+//+XYPxFnDEAi+hEDkIiWpMUYgJFIBD6fD5WVlbDZbEnNiX1tTnd3d1rX09fX99NXxxCRcjEAiWhJWowB2NHRgWXLlmHz5s0YHR1Nas6HDx9kTz2n09TUlLTvUCiU1n0T0dLGACQiIiJSGAYgERERkcIwAImIiIgUhgFIREREpDAMQCIiIiKFYQASERERKQwDkIiIiEhhGIBERERECsMAJCIiIlIYBiARERGRwvwDYX4e4FjtiosAAAAASUVORK5CYII=\" width=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
@@ -3206,57 +4303,1036 @@
"Text(0.5, 0, 'Frequency [Hz]')"
]
},
- "execution_count": 210,
+ "execution_count": 77,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
- "sampling_rate = 10 # sps, set in firmware\n",
- "\n",
- "N = 1000\n",
+ "N = ivl_end - ivl_start\n",
"T = 1/sampling_rate\n",
"x = np.linspace(0.0, N*T, N)\n",
- "y = reassembled_values[500:2000] / mems_lsb_per_g # cut out beginning and that time we tapped the thing\n",
+ "y = reassembled_values[ivl_start:ivl_end] / mems_lsb_per_g # cut out beginning and that time we tapped the thing\n",
+ "y *= scipy.signal.windows.blackmanharris(len(y))\n",
"yf = scipy.fftpack.fft(y)\n",
"xf = np.linspace(0.0, 1/(2*T), N//2)\n",
"mag = 2/N * np.abs(yf[:N//2])\n",
"\n",
"peaks, _ = scipy.signal.find_peaks(mag, height=.1, distance=1/T)\n",
- "assert peaks\n",
+ "assert peaks.any()\n",
"\n",
"peak_data = sorted([ (-mag[idx], xf[idx]) for idx in peaks ])\n",
"largest_peak_f = peak_data[0][1]\n",
- "print(f'Largest peak at {largest_peak_f:.2} Hz / {largest_peak_f * 60:.0} rpm')\n",
+ "print(f'Largest peak at {largest_peak_f:.2f} Hz / {largest_peak_f * 60:.0f} rpm')\n",
+ "for i in range(1,4):\n",
+ " mix1 = i*sampling_rate - largest_peak_f\n",
+ " mix2 = i*sampling_rate + largest_peak_f\n",
+ " print(f'Mixing product {2*i-1} at {mix1:.2f} Hz / {mix1 * 60:.0f} rpm')\n",
+ " print(f'Mixing product {2*i} at {mix2:.2f} Hz / {mix2 * 60:.0f} rpm')\n",
"\n",
"fig, ax = plt.subplots()\n",
"ax.grid()\n",
"ax.axvline(xf[peaks], color='orange')\n",
"ax.plot(xf, mag)\n",
"ax.set_ylabel('Magnitude [g]')\n",
- "ax.set_xlabel('Frequency [Hz]')\n"
+ "ax.set_xlabel('Frequency [Hz]')"
]
},
{
"cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
+ "execution_count": 78,
+ "metadata": {
+ "scrolled": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "/* Put everything inside the global mpl namespace */\n",
+ "/* global mpl */\n",
+ "window.mpl = {};\n",
+ "\n",
+ "mpl.get_websocket_type = function () {\n",
+ " if (typeof WebSocket !== 'undefined') {\n",
+ " return WebSocket;\n",
+ " } else if (typeof MozWebSocket !== 'undefined') {\n",
+ " return MozWebSocket;\n",
+ " } else {\n",
+ " alert(\n",
+ " 'Your browser does not have WebSocket support. ' +\n",
+ " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
+ " 'Firefox 4 and 5 are also supported but you ' +\n",
+ " 'have to enable WebSockets in about:config.'\n",
+ " );\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
+ " this.id = figure_id;\n",
+ "\n",
+ " this.ws = websocket;\n",
+ "\n",
+ " this.supports_binary = this.ws.binaryType !== undefined;\n",
+ "\n",
+ " if (!this.supports_binary) {\n",
+ " var warnings = document.getElementById('mpl-warnings');\n",
+ " if (warnings) {\n",
+ " warnings.style.display = 'block';\n",
+ " warnings.textContent =\n",
+ " 'This browser does not support binary websocket messages. ' +\n",
+ " 'Performance may be slow.';\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.imageObj = new Image();\n",
+ "\n",
+ " this.context = undefined;\n",
+ " this.message = undefined;\n",
+ " this.canvas = undefined;\n",
+ " this.rubberband_canvas = undefined;\n",
+ " this.rubberband_context = undefined;\n",
+ " this.format_dropdown = undefined;\n",
+ "\n",
+ " this.image_mode = 'full';\n",
+ "\n",
+ " this.root = document.createElement('div');\n",
+ " this.root.setAttribute('style', 'display: inline-block');\n",
+ " this._root_extra_style(this.root);\n",
+ "\n",
+ " parent_element.appendChild(this.root);\n",
+ "\n",
+ " this._init_header(this);\n",
+ " this._init_canvas(this);\n",
+ " this._init_toolbar(this);\n",
+ "\n",
+ " var fig = this;\n",
+ "\n",
+ " this.waiting = false;\n",
+ "\n",
+ " this.ws.onopen = function () {\n",
+ " fig.send_message('supports_binary', { value: fig.supports_binary });\n",
+ " fig.send_message('send_image_mode', {});\n",
+ " if (fig.ratio !== 1) {\n",
+ " fig.send_message('set_dpi_ratio', { dpi_ratio: fig.ratio });\n",
+ " }\n",
+ " fig.send_message('refresh', {});\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onload = function () {\n",
+ " if (fig.image_mode === 'full') {\n",
+ " // Full images could contain transparency (where diff images\n",
+ " // almost always do), so we need to clear the canvas so that\n",
+ " // there is no ghosting.\n",
+ " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
+ " }\n",
+ " fig.context.drawImage(fig.imageObj, 0, 0);\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onunload = function () {\n",
+ " fig.ws.close();\n",
+ " };\n",
+ "\n",
+ " this.ws.onmessage = this._make_on_message_function(this);\n",
+ "\n",
+ " this.ondownload = ondownload;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_header = function () {\n",
+ " var titlebar = document.createElement('div');\n",
+ " titlebar.classList =\n",
+ " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
+ " var titletext = document.createElement('div');\n",
+ " titletext.classList = 'ui-dialog-title';\n",
+ " titletext.setAttribute(\n",
+ " 'style',\n",
+ " 'width: 100%; text-align: center; padding: 3px;'\n",
+ " );\n",
+ " titlebar.appendChild(titletext);\n",
+ " this.root.appendChild(titlebar);\n",
+ " this.header = titletext;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._init_canvas = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var canvas_div = (this.canvas_div = document.createElement('div'));\n",
+ " canvas_div.setAttribute(\n",
+ " 'style',\n",
+ " 'border: 1px solid #ddd;' +\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'clear: both;' +\n",
+ " 'min-height: 1px;' +\n",
+ " 'min-width: 1px;' +\n",
+ " 'outline: 0;' +\n",
+ " 'overflow: hidden;' +\n",
+ " 'position: relative;' +\n",
+ " 'resize: both;'\n",
+ " );\n",
+ "\n",
+ " function on_keyboard_event_closure(name) {\n",
+ " return function (event) {\n",
+ " return fig.key_event(event, name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'keydown',\n",
+ " on_keyboard_event_closure('key_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'keyup',\n",
+ " on_keyboard_event_closure('key_release')\n",
+ " );\n",
+ "\n",
+ " this._canvas_extra_style(canvas_div);\n",
+ " this.root.appendChild(canvas_div);\n",
+ "\n",
+ " var canvas = (this.canvas = document.createElement('canvas'));\n",
+ " canvas.classList.add('mpl-canvas');\n",
+ " canvas.setAttribute('style', 'box-sizing: content-box;');\n",
+ "\n",
+ " this.context = canvas.getContext('2d');\n",
+ "\n",
+ " var backingStore =\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " this.context.webkitBackingStorePixelRatio ||\n",
+ " this.context.mozBackingStorePixelRatio ||\n",
+ " this.context.msBackingStorePixelRatio ||\n",
+ " this.context.oBackingStorePixelRatio ||\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " 1;\n",
+ "\n",
+ " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
+ "\n",
+ " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
+ " 'canvas'\n",
+ " ));\n",
+ " rubberband_canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n",
+ " );\n",
+ "\n",
+ " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
+ " if (this.ResizeObserver === undefined) {\n",
+ " if (window.ResizeObserver !== undefined) {\n",
+ " this.ResizeObserver = window.ResizeObserver;\n",
+ " } else {\n",
+ " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
+ " this.ResizeObserver = obs.ResizeObserver;\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
+ " var nentries = entries.length;\n",
+ " for (var i = 0; i < nentries; i++) {\n",
+ " var entry = entries[i];\n",
+ " var width, height;\n",
+ " if (entry.contentBoxSize) {\n",
+ " if (entry.contentBoxSize instanceof Array) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " width = entry.contentBoxSize[0].inlineSize;\n",
+ " height = entry.contentBoxSize[0].blockSize;\n",
+ " } else {\n",
+ " // Firefox implements old version of spec.\n",
+ " width = entry.contentBoxSize.inlineSize;\n",
+ " height = entry.contentBoxSize.blockSize;\n",
+ " }\n",
+ " } else {\n",
+ " // Chrome <84 implements even older version of spec.\n",
+ " width = entry.contentRect.width;\n",
+ " height = entry.contentRect.height;\n",
+ " }\n",
+ "\n",
+ " // Keep the size of the canvas and rubber band canvas in sync with\n",
+ " // the canvas container.\n",
+ " if (entry.devicePixelContentBoxSize) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " canvas.setAttribute(\n",
+ " 'width',\n",
+ " entry.devicePixelContentBoxSize[0].inlineSize\n",
+ " );\n",
+ " canvas.setAttribute(\n",
+ " 'height',\n",
+ " entry.devicePixelContentBoxSize[0].blockSize\n",
+ " );\n",
+ " } else {\n",
+ " canvas.setAttribute('width', width * fig.ratio);\n",
+ " canvas.setAttribute('height', height * fig.ratio);\n",
+ " }\n",
+ " canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'width: ' + width + 'px; height: ' + height + 'px;'\n",
+ " );\n",
+ "\n",
+ " rubberband_canvas.setAttribute('width', width);\n",
+ " rubberband_canvas.setAttribute('height', height);\n",
+ "\n",
+ " // And update the size in Python. We ignore the initial 0/0 size\n",
+ " // that occurs as the element is placed into the DOM, which should\n",
+ " // otherwise not happen due to the minimum size styling.\n",
+ " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
+ " fig.request_resize(width, height);\n",
+ " }\n",
+ " }\n",
+ " });\n",
+ " this.resizeObserverInstance.observe(canvas_div);\n",
+ "\n",
+ " function on_mouse_event_closure(name) {\n",
+ " return function (event) {\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " rubberband_canvas.addEventListener(\n",
+ " 'mousedown',\n",
+ " on_mouse_event_closure('button_press')\n",
+ " );\n",
+ " rubberband_canvas.addEventListener(\n",
+ " 'mouseup',\n",
+ " on_mouse_event_closure('button_release')\n",
+ " );\n",
+ " // Throttle sequential mouse events to 1 every 20ms.\n",
+ " rubberband_canvas.addEventListener(\n",
+ " 'mousemove',\n",
+ " on_mouse_event_closure('motion_notify')\n",
+ " );\n",
+ "\n",
+ " rubberband_canvas.addEventListener(\n",
+ " 'mouseenter',\n",
+ " on_mouse_event_closure('figure_enter')\n",
+ " );\n",
+ " rubberband_canvas.addEventListener(\n",
+ " 'mouseleave',\n",
+ " on_mouse_event_closure('figure_leave')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener('wheel', function (event) {\n",
+ " if (event.deltaY < 0) {\n",
+ " event.step = 1;\n",
+ " } else {\n",
+ " event.step = -1;\n",
+ " }\n",
+ " on_mouse_event_closure('scroll')(event);\n",
+ " });\n",
+ "\n",
+ " canvas_div.appendChild(canvas);\n",
+ " canvas_div.appendChild(rubberband_canvas);\n",
+ "\n",
+ " this.rubberband_context = rubberband_canvas.getContext('2d');\n",
+ " this.rubberband_context.strokeStyle = '#000000';\n",
+ "\n",
+ " this._resize_canvas = function (width, height, forward) {\n",
+ " if (forward) {\n",
+ " canvas_div.style.width = width + 'px';\n",
+ " canvas_div.style.height = height + 'px';\n",
+ " }\n",
+ " };\n",
+ "\n",
+ " // Disable right mouse context menu.\n",
+ " this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ " });\n",
+ "\n",
+ " function set_focus() {\n",
+ " canvas.focus();\n",
+ " canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " window.setTimeout(set_focus, 100);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'mpl-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " var button = (fig.buttons[name] = document.createElement('button'));\n",
+ " button.classList = 'mpl-widget';\n",
+ " button.setAttribute('role', 'button');\n",
+ " button.setAttribute('aria-disabled', 'false');\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ "\n",
+ " var icon_img = document.createElement('img');\n",
+ " icon_img.src = '_images/' + image + '.png';\n",
+ " icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
+ " icon_img.alt = tooltip;\n",
+ " button.appendChild(icon_img);\n",
+ "\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " var fmt_picker = document.createElement('select');\n",
+ " fmt_picker.classList = 'mpl-widget';\n",
+ " toolbar.appendChild(fmt_picker);\n",
+ " this.format_dropdown = fmt_picker;\n",
+ "\n",
+ " for (var ind in mpl.extensions) {\n",
+ " var fmt = mpl.extensions[ind];\n",
+ " var option = document.createElement('option');\n",
+ " option.selected = fmt === mpl.default_extension;\n",
+ " option.innerHTML = fmt;\n",
+ " fmt_picker.appendChild(option);\n",
+ " }\n",
+ "\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function (type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function () {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1], msg['forward']);\n",
+ " fig.send_message('refresh', {});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
+ " var x0 = msg['x0'] / fig.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
+ " var x1 = msg['x1'] / fig.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0,\n",
+ " 0,\n",
+ " fig.canvas.width / fig.ratio,\n",
+ " fig.canvas.height / fig.ratio\n",
+ " );\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
+ " var cursor = msg['cursor'];\n",
+ " switch (cursor) {\n",
+ " case 0:\n",
+ " cursor = 'pointer';\n",
+ " break;\n",
+ " case 1:\n",
+ " cursor = 'default';\n",
+ " break;\n",
+ " case 2:\n",
+ " cursor = 'crosshair';\n",
+ " break;\n",
+ " case 3:\n",
+ " cursor = 'move';\n",
+ " break;\n",
+ " }\n",
+ " fig.rubberband_canvas.style.cursor = cursor;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function (fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
+ " for (var key in msg) {\n",
+ " if (!(key in fig.buttons)) {\n",
+ " continue;\n",
+ " }\n",
+ " fig.buttons[key].disabled = !msg[key];\n",
+ " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
+ " if (msg['mode'] === 'PAN') {\n",
+ " fig.buttons['Pan'].classList.add('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " } else if (msg['mode'] === 'ZOOM') {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.add('active');\n",
+ " } else {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message('ack', {});\n",
+ "};\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function (fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " evt.data.type = 'image/png';\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src\n",
+ " );\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " evt.data\n",
+ " );\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " } else if (\n",
+ " typeof evt.data === 'string' &&\n",
+ " evt.data.slice(0, 21) === 'data:image/png;base64'\n",
+ " ) {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig['handle_' + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"No handler for the '\" + msg_type + \"' message type: \",\n",
+ " msg\n",
+ " );\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
+ " e,\n",
+ " e.stack,\n",
+ " msg\n",
+ " );\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "};\n",
+ "\n",
+ "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
+ "mpl.findpos = function (e) {\n",
+ " //this section is from http://www.quirksmode.org/js/events_properties.html\n",
+ " var targ;\n",
+ " if (!e) {\n",
+ " e = window.event;\n",
+ " }\n",
+ " if (e.target) {\n",
+ " targ = e.target;\n",
+ " } else if (e.srcElement) {\n",
+ " targ = e.srcElement;\n",
+ " }\n",
+ " if (targ.nodeType === 3) {\n",
+ " // defeat Safari bug\n",
+ " targ = targ.parentNode;\n",
+ " }\n",
+ "\n",
+ " // pageX,Y are the mouse positions relative to the document\n",
+ " var boundingRect = targ.getBoundingClientRect();\n",
+ " var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n",
+ " var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n",
+ "\n",
+ " return { x: x, y: y };\n",
+ "};\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * http://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys(original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object') {\n",
+ " obj[key] = original[key];\n",
+ " }\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function (event, name) {\n",
+ " var canvas_pos = mpl.findpos(event);\n",
+ "\n",
+ " if (name === 'button_press') {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " var x = canvas_pos.x * this.ratio;\n",
+ " var y = canvas_pos.y * this.ratio;\n",
+ "\n",
+ " this.send_message(name, {\n",
+ " x: x,\n",
+ " y: y,\n",
+ " button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event),\n",
+ " });\n",
+ "\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We want\n",
+ " * to control all of the cursor setting manually through the\n",
+ " * 'cursor' event from matplotlib */\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function (event, name) {\n",
+ " // Prevent repeat events\n",
+ " if (name === 'key_press') {\n",
+ " if (event.which === this._key) {\n",
+ " return;\n",
+ " } else {\n",
+ " this._key = event.which;\n",
+ " }\n",
+ " }\n",
+ " if (name === 'key_release') {\n",
+ " this._key = null;\n",
+ " }\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.which !== 17) {\n",
+ " value += 'ctrl+';\n",
+ " }\n",
+ " if (event.altKey && event.which !== 18) {\n",
+ " value += 'alt+';\n",
+ " }\n",
+ " if (event.shiftKey && event.which !== 16) {\n",
+ " value += 'shift+';\n",
+ " }\n",
+ "\n",
+ " value += 'k';\n",
+ " value += event.which.toString();\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
+ " if (name === 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message('toolbar_button', { name: name });\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "\n",
+ "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
+ "// prettier-ignore\n",
+ "var _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\n",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
+ "\n",
+ "mpl.default_extension = \"png\";/* global mpl */\n",
+ "\n",
+ "var comm_websocket_adapter = function (comm) {\n",
+ " // Create a \"websocket\"-like object which calls the given IPython comm\n",
+ " // object with the appropriate methods. Currently this is a non binary\n",
+ " // socket, so there is still some room for performance tuning.\n",
+ " var ws = {};\n",
+ "\n",
+ " ws.close = function () {\n",
+ " comm.close();\n",
+ " };\n",
+ " ws.send = function (m) {\n",
+ " //console.log('sending', m);\n",
+ " comm.send(m);\n",
+ " };\n",
+ " // Register the callback with on_msg.\n",
+ " comm.on_msg(function (msg) {\n",
+ " //console.log('receiving', msg['content']['data'], msg);\n",
+ " // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
+ " ws.onmessage(msg['content']['data']);\n",
+ " });\n",
+ " return ws;\n",
+ "};\n",
+ "\n",
+ "mpl.mpl_figure_comm = function (comm, msg) {\n",
+ " // This is the function which gets called when the mpl process\n",
+ " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
+ "\n",
+ " var id = msg.content.data.id;\n",
+ " // Get hold of the div created by the display call when the Comm\n",
+ " // socket was opened in Python.\n",
+ " var element = document.getElementById(id);\n",
+ " var ws_proxy = comm_websocket_adapter(comm);\n",
+ "\n",
+ " function ondownload(figure, _format) {\n",
+ " window.open(figure.canvas.toDataURL());\n",
+ " }\n",
+ "\n",
+ " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
+ "\n",
+ " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
+ " // web socket which is closed, not our websocket->open comm proxy.\n",
+ " ws_proxy.onopen();\n",
+ "\n",
+ " fig.parent_element = element;\n",
+ " fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
+ " if (!fig.cell_info) {\n",
+ " console.error('Failed to find cell for figure', id, fig);\n",
+ " return;\n",
+ " }\n",
+ " fig.cell_info[0].output_area.element.on(\n",
+ " 'cleared',\n",
+ " { fig: fig },\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_close = function (fig, msg) {\n",
+ " var width = fig.canvas.width / fig.ratio;\n",
+ " fig.cell_info[0].output_area.element.off(\n",
+ " 'cleared',\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
+ "\n",
+ " // Update the output cell to use the data from the current canvas.\n",
+ " fig.push_to_output();\n",
+ " var dataURL = fig.canvas.toDataURL();\n",
+ " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
+ " // the notebook keyboard shortcuts fail.\n",
+ " IPython.keyboard_manager.enable();\n",
+ " fig.parent_element.innerHTML =\n",
+ " '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
+ " fig.close_ws(fig, msg);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.close_ws = function (fig, msg) {\n",
+ " fig.send_message('closing', msg);\n",
+ " // fig.ws.close()\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
+ " // Turn the data on the canvas into data in the output cell.\n",
+ " var width = this.canvas.width / this.ratio;\n",
+ " var dataURL = this.canvas.toDataURL();\n",
+ " this.cell_info[1]['text/html'] =\n",
+ " '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Tell IPython that the notebook contents must change.\n",
+ " IPython.notebook.set_dirty(true);\n",
+ " this.send_message('ack', {});\n",
+ " var fig = this;\n",
+ " // Wait a second, then push the new image to the DOM so\n",
+ " // that it is saved nicely (might be nice to debounce this).\n",
+ " setTimeout(function () {\n",
+ " fig.push_to_output();\n",
+ " }, 1000);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'btn-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " var button;\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " button = fig.buttons[name] = document.createElement('button');\n",
+ " button.classList = 'btn btn-default';\n",
+ " button.href = '#';\n",
+ " button.title = name;\n",
+ " button.innerHTML = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " // Add the status bar.\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message pull-right';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = document.createElement('div');\n",
+ " buttongrp.classList = 'btn-group inline pull-right';\n",
+ " button = document.createElement('button');\n",
+ " button.classList = 'btn btn-mini btn-primary';\n",
+ " button.href = '#';\n",
+ " button.title = 'Stop Interaction';\n",
+ " button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n",
+ " button.addEventListener('click', function (_evt) {\n",
+ " fig.handle_close(fig, {});\n",
+ " });\n",
+ " button.addEventListener(\n",
+ " 'mouseover',\n",
+ " on_mouseover_closure('Stop Interaction')\n",
+ " );\n",
+ " buttongrp.appendChild(button);\n",
+ " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
+ " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._remove_fig_handler = function (event) {\n",
+ " var fig = event.data.fig;\n",
+ " if (event.target !== this) {\n",
+ " // Ignore bubbled events from children.\n",
+ " return;\n",
+ " }\n",
+ " fig.close_ws(fig, {});\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (el) {\n",
+ " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (el) {\n",
+ " // this is important to make the div 'focusable\n",
+ " el.setAttribute('tabindex', 0);\n",
+ " // reach out to IPython and tell the keyboard manager to turn it's self\n",
+ " // off when our div gets focus\n",
+ "\n",
+ " // location in version 3\n",
+ " if (IPython.notebook.keyboard_manager) {\n",
+ " IPython.notebook.keyboard_manager.register_events(el);\n",
+ " } else {\n",
+ " // location in version 2\n",
+ " IPython.keyboard_manager.register_events(el);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
+ " var manager = IPython.notebook.keyboard_manager;\n",
+ " if (!manager) {\n",
+ " manager = IPython.keyboard_manager;\n",
+ " }\n",
+ "\n",
+ " // Check for shift+enter\n",
+ " if (event.shiftKey && event.which === 13) {\n",
+ " this.canvas_div.blur();\n",
+ " // select the cell after this one\n",
+ " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
+ " IPython.notebook.select(index + 1);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " fig.ondownload(fig, null);\n",
+ "};\n",
+ "\n",
+ "mpl.find_output_cell = function (html_output) {\n",
+ " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
+ " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
+ " // IPython event is triggered only after the cells have been serialised, which for\n",
+ " // our purposes (turning an active figure into a static one), is too late.\n",
+ " var cells = IPython.notebook.get_cells();\n",
+ " var ncells = cells.length;\n",
+ " for (var i = 0; i < ncells; i++) {\n",
+ " var cell = cells[i];\n",
+ " if (cell.cell_type === 'code') {\n",
+ " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
+ " var data = cell.output_area.outputs[j];\n",
+ " if (data.data) {\n",
+ " // IPython >= 3 moved mimebundle to data attribute of output\n",
+ " data = data.data;\n",
+ " }\n",
+ " if (data['text/html'] === html_output) {\n",
+ " return [cell, data, j];\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "// Register the function which deals with the matplotlib target/channel.\n",
+ "// The kernel may be null if the page has been refreshed.\n",
+ "if (IPython.notebook.kernel !== null) {\n",
+ " IPython.notebook.kernel.comm_manager.register_target(\n",
+ " 'matplotlib',\n",
+ " mpl.mpl_figure_comm\n",
+ " );\n",
+ "}\n"
+ ],
+ "text/plain": [
+ "<IPython.core.display.Javascript object>"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "<img src=\"data:image/png;base64,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\" width=\"640\">"
+ ],
+ "text/plain": [
+ "<IPython.core.display.HTML object>"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
"source": [
"fig, ax = plt.subplots()\n",
- "ax.magnitude_spectrum(reassembled_values[500:2000]/mems_lsb_per_g)"
+ "ax.grid()\n",
+ "ax.magnitude_spectrum(reassembled_values[ivl_start:ivl_end]/mems_lsb_per_g, Fs=10);"
]
},
{
"cell_type": "code",
- "execution_count": 217,
+ "execution_count": 80,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Centrifugal acceleration at 3.12 Hz: 21.09 m/s^2 / 2.15 g\n"
+ "Centrifugal acceleration at 1.68 Hz: 6.11 m/s^2 / 0.62 g\n",
+ "Centrifugal acceleration at 8.35 Hz: 151.53 m/s^2 / 15.45 g\n"
]
}
],
@@ -3265,7 +5341,1065 @@
"f = largest_peak_f\n",
"omega = 2*np.pi*f # angular velocity\n",
"centrifugal_acceleration = omega**2 * r_mems # m/s^2\n",
- "print(f'Centrifugal acceleration at {largest_peak_f:.2f} Hz: {centrifugal_acceleration:.2f} m/s^2 / {centrifugal_acceleration/g:.2f} g')"
+ "\n",
+ "f2 = 1/interval\n",
+ "omega2 = 2*np.pi*f2 # angular velocity\n",
+ "centrifugal_acceleration2 = omega2**2 * r_mems # m/s^2\n",
+ "\n",
+ "print(f'Centrifugal acceleration at {largest_peak_f:.2f} Hz: {centrifugal_acceleration:.2f} m/s^2 / {centrifugal_acceleration/g:.2f} g')\n",
+ "print(f'Centrifugal acceleration at {f2:.2f} Hz: {centrifugal_acceleration2:.2f} m/s^2 / {centrifugal_acceleration2/g:.2f} g')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 81,
+ "metadata": {
+ "scrolled": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Centrifugal acceleration at 0.10 Hz: 0.02 m/s^2 / 0.00 g\n",
+ "Centrifugal acceleration at 0.20 Hz: 0.09 m/s^2 / 0.01 g\n",
+ "Centrifugal acceleration at 0.50 Hz: 0.54 m/s^2 / 0.06 g\n",
+ "Centrifugal acceleration at 1.00 Hz: 2.17 m/s^2 / 0.22 g\n",
+ "Centrifugal acceleration at 1.50 Hz: 4.89 m/s^2 / 0.50 g\n",
+ "Centrifugal acceleration at 2.00 Hz: 8.69 m/s^2 / 0.89 g\n",
+ "Centrifugal acceleration at 2.50 Hz: 13.57 m/s^2 / 1.38 g\n",
+ "Centrifugal acceleration at 3.00 Hz: 19.54 m/s^2 / 1.99 g\n",
+ "Centrifugal acceleration at 3.50 Hz: 26.60 m/s^2 / 2.71 g\n",
+ "Centrifugal acceleration at 4.00 Hz: 34.74 m/s^2 / 3.54 g\n",
+ "Centrifugal acceleration at 4.50 Hz: 43.97 m/s^2 / 4.48 g\n",
+ "Centrifugal acceleration at 5.00 Hz: 54.28 m/s^2 / 5.54 g\n",
+ "Centrifugal acceleration at 6.00 Hz: 78.17 m/s^2 / 7.97 g\n",
+ "Centrifugal acceleration at 7.00 Hz: 106.39 m/s^2 / 10.85 g\n",
+ "Centrifugal acceleration at 8.00 Hz: 138.96 m/s^2 / 14.17 g\n",
+ "Centrifugal acceleration at 9.00 Hz: 175.88 m/s^2 / 17.93 g\n",
+ "Centrifugal acceleration at 10.00 Hz: 217.13 m/s^2 / 22.14 g\n",
+ "Centrifugal acceleration at 11.00 Hz: 262.73 m/s^2 / 26.79 g\n",
+ "Centrifugal acceleration at 12.00 Hz: 312.67 m/s^2 / 31.88 g\n",
+ "Centrifugal acceleration at 13.00 Hz: 366.95 m/s^2 / 37.42 g\n",
+ "Centrifugal acceleration at 14.00 Hz: 425.58 m/s^2 / 43.40 g\n",
+ "Centrifugal acceleration at 15.00 Hz: 488.55 m/s^2 / 49.82 g\n",
+ "Centrifugal acceleration at 16.00 Hz: 555.86 m/s^2 / 56.68 g\n",
+ "Centrifugal acceleration at 17.00 Hz: 627.51 m/s^2 / 63.99 g\n",
+ "Centrifugal acceleration at 18.00 Hz: 703.51 m/s^2 / 71.74 g\n",
+ "Centrifugal acceleration at 19.00 Hz: 783.84 m/s^2 / 79.93 g\n",
+ "Centrifugal acceleration at 20.00 Hz: 868.53 m/s^2 / 88.57 g\n"
+ ]
+ }
+ ],
+ "source": [
+ "for fn in [0.1, 0.2, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0,\n",
+ " 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0]:\n",
+ "\n",
+ " omegan = 2*np.pi*fn # angular velocity\n",
+ " acc = omegan**2 * r_mems # m/s^2\n",
+ " print(f'Centrifugal acceleration at {fn:.2f} Hz: {acc:.2f} m/s^2 / {acc/g:.2f} g')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 83,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "application/javascript": [
+ "/* Put everything inside the global mpl namespace */\n",
+ "/* global mpl */\n",
+ "window.mpl = {};\n",
+ "\n",
+ "mpl.get_websocket_type = function () {\n",
+ " if (typeof WebSocket !== 'undefined') {\n",
+ " return WebSocket;\n",
+ " } else if (typeof MozWebSocket !== 'undefined') {\n",
+ " return MozWebSocket;\n",
+ " } else {\n",
+ " alert(\n",
+ " 'Your browser does not have WebSocket support. ' +\n",
+ " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
+ " 'Firefox 4 and 5 are also supported but you ' +\n",
+ " 'have to enable WebSockets in about:config.'\n",
+ " );\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
+ " this.id = figure_id;\n",
+ "\n",
+ " this.ws = websocket;\n",
+ "\n",
+ " this.supports_binary = this.ws.binaryType !== undefined;\n",
+ "\n",
+ " if (!this.supports_binary) {\n",
+ " var warnings = document.getElementById('mpl-warnings');\n",
+ " if (warnings) {\n",
+ " warnings.style.display = 'block';\n",
+ " warnings.textContent =\n",
+ " 'This browser does not support binary websocket messages. ' +\n",
+ " 'Performance may be slow.';\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.imageObj = new Image();\n",
+ "\n",
+ " this.context = undefined;\n",
+ " this.message = undefined;\n",
+ " this.canvas = undefined;\n",
+ " this.rubberband_canvas = undefined;\n",
+ " this.rubberband_context = undefined;\n",
+ " this.format_dropdown = undefined;\n",
+ "\n",
+ " this.image_mode = 'full';\n",
+ "\n",
+ " this.root = document.createElement('div');\n",
+ " this.root.setAttribute('style', 'display: inline-block');\n",
+ " this._root_extra_style(this.root);\n",
+ "\n",
+ " parent_element.appendChild(this.root);\n",
+ "\n",
+ " this._init_header(this);\n",
+ " this._init_canvas(this);\n",
+ " this._init_toolbar(this);\n",
+ "\n",
+ " var fig = this;\n",
+ "\n",
+ " this.waiting = false;\n",
+ "\n",
+ " this.ws.onopen = function () {\n",
+ " fig.send_message('supports_binary', { value: fig.supports_binary });\n",
+ " fig.send_message('send_image_mode', {});\n",
+ " if (fig.ratio !== 1) {\n",
+ " fig.send_message('set_dpi_ratio', { dpi_ratio: fig.ratio });\n",
+ " }\n",
+ " fig.send_message('refresh', {});\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onload = function () {\n",
+ " if (fig.image_mode === 'full') {\n",
+ " // Full images could contain transparency (where diff images\n",
+ " // almost always do), so we need to clear the canvas so that\n",
+ " // there is no ghosting.\n",
+ " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
+ " }\n",
+ " fig.context.drawImage(fig.imageObj, 0, 0);\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onunload = function () {\n",
+ " fig.ws.close();\n",
+ " };\n",
+ "\n",
+ " this.ws.onmessage = this._make_on_message_function(this);\n",
+ "\n",
+ " this.ondownload = ondownload;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_header = function () {\n",
+ " var titlebar = document.createElement('div');\n",
+ " titlebar.classList =\n",
+ " 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
+ " var titletext = document.createElement('div');\n",
+ " titletext.classList = 'ui-dialog-title';\n",
+ " titletext.setAttribute(\n",
+ " 'style',\n",
+ " 'width: 100%; text-align: center; padding: 3px;'\n",
+ " );\n",
+ " titlebar.appendChild(titletext);\n",
+ " this.root.appendChild(titlebar);\n",
+ " this.header = titletext;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
+ "\n",
+ "mpl.figure.prototype._init_canvas = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var canvas_div = (this.canvas_div = document.createElement('div'));\n",
+ " canvas_div.setAttribute(\n",
+ " 'style',\n",
+ " 'border: 1px solid #ddd;' +\n",
+ " 'box-sizing: content-box;' +\n",
+ " 'clear: both;' +\n",
+ " 'min-height: 1px;' +\n",
+ " 'min-width: 1px;' +\n",
+ " 'outline: 0;' +\n",
+ " 'overflow: hidden;' +\n",
+ " 'position: relative;' +\n",
+ " 'resize: both;'\n",
+ " );\n",
+ "\n",
+ " function on_keyboard_event_closure(name) {\n",
+ " return function (event) {\n",
+ " return fig.key_event(event, name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " canvas_div.addEventListener(\n",
+ " 'keydown',\n",
+ " on_keyboard_event_closure('key_press')\n",
+ " );\n",
+ " canvas_div.addEventListener(\n",
+ " 'keyup',\n",
+ " on_keyboard_event_closure('key_release')\n",
+ " );\n",
+ "\n",
+ " this._canvas_extra_style(canvas_div);\n",
+ " this.root.appendChild(canvas_div);\n",
+ "\n",
+ " var canvas = (this.canvas = document.createElement('canvas'));\n",
+ " canvas.classList.add('mpl-canvas');\n",
+ " canvas.setAttribute('style', 'box-sizing: content-box;');\n",
+ "\n",
+ " this.context = canvas.getContext('2d');\n",
+ "\n",
+ " var backingStore =\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " this.context.webkitBackingStorePixelRatio ||\n",
+ " this.context.mozBackingStorePixelRatio ||\n",
+ " this.context.msBackingStorePixelRatio ||\n",
+ " this.context.oBackingStorePixelRatio ||\n",
+ " this.context.backingStorePixelRatio ||\n",
+ " 1;\n",
+ "\n",
+ " this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
+ "\n",
+ " var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
+ " 'canvas'\n",
+ " ));\n",
+ " rubberband_canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n",
+ " );\n",
+ "\n",
+ " // Apply a ponyfill if ResizeObserver is not implemented by browser.\n",
+ " if (this.ResizeObserver === undefined) {\n",
+ " if (window.ResizeObserver !== undefined) {\n",
+ " this.ResizeObserver = window.ResizeObserver;\n",
+ " } else {\n",
+ " var obs = _JSXTOOLS_RESIZE_OBSERVER({});\n",
+ " this.ResizeObserver = obs.ResizeObserver;\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.resizeObserverInstance = new this.ResizeObserver(function (entries) {\n",
+ " var nentries = entries.length;\n",
+ " for (var i = 0; i < nentries; i++) {\n",
+ " var entry = entries[i];\n",
+ " var width, height;\n",
+ " if (entry.contentBoxSize) {\n",
+ " if (entry.contentBoxSize instanceof Array) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " width = entry.contentBoxSize[0].inlineSize;\n",
+ " height = entry.contentBoxSize[0].blockSize;\n",
+ " } else {\n",
+ " // Firefox implements old version of spec.\n",
+ " width = entry.contentBoxSize.inlineSize;\n",
+ " height = entry.contentBoxSize.blockSize;\n",
+ " }\n",
+ " } else {\n",
+ " // Chrome <84 implements even older version of spec.\n",
+ " width = entry.contentRect.width;\n",
+ " height = entry.contentRect.height;\n",
+ " }\n",
+ "\n",
+ " // Keep the size of the canvas and rubber band canvas in sync with\n",
+ " // the canvas container.\n",
+ " if (entry.devicePixelContentBoxSize) {\n",
+ " // Chrome 84 implements new version of spec.\n",
+ " canvas.setAttribute(\n",
+ " 'width',\n",
+ " entry.devicePixelContentBoxSize[0].inlineSize\n",
+ " );\n",
+ " canvas.setAttribute(\n",
+ " 'height',\n",
+ " entry.devicePixelContentBoxSize[0].blockSize\n",
+ " );\n",
+ " } else {\n",
+ " canvas.setAttribute('width', width * fig.ratio);\n",
+ " canvas.setAttribute('height', height * fig.ratio);\n",
+ " }\n",
+ " canvas.setAttribute(\n",
+ " 'style',\n",
+ " 'width: ' + width + 'px; height: ' + height + 'px;'\n",
+ " );\n",
+ "\n",
+ " rubberband_canvas.setAttribute('width', width);\n",
+ " rubberband_canvas.setAttribute('height', height);\n",
+ "\n",
+ " // And update the size in Python. We ignore the initial 0/0 size\n",
+ " // that occurs as the element is placed into the DOM, which should\n",
+ " // otherwise not happen due to the minimum size styling.\n",
+ " if (fig.ws.readyState == 1 && width != 0 && height != 0) {\n",
+ " fig.request_resize(width, height);\n",
+ " }\n",
+ " }\n",
+ " });\n",
+ " this.resizeObserverInstance.observe(canvas_div);\n",
+ "\n",
+ " function on_mouse_event_closure(name) {\n",
+ " return function (event) {\n",
+ " return fig.mouse_event(event, name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " rubberband_canvas.addEventListener(\n",
+ " 'mousedown',\n",
+ " on_mouse_event_closure('button_press')\n",
+ " );\n",
+ " rubberband_canvas.addEventListener(\n",
+ " 'mouseup',\n",
+ " on_mouse_event_closure('button_release')\n",
+ " );\n",
+ " // Throttle sequential mouse events to 1 every 20ms.\n",
+ " rubberband_canvas.addEventListener(\n",
+ " 'mousemove',\n",
+ " on_mouse_event_closure('motion_notify')\n",
+ " );\n",
+ "\n",
+ " rubberband_canvas.addEventListener(\n",
+ " 'mouseenter',\n",
+ " on_mouse_event_closure('figure_enter')\n",
+ " );\n",
+ " rubberband_canvas.addEventListener(\n",
+ " 'mouseleave',\n",
+ " on_mouse_event_closure('figure_leave')\n",
+ " );\n",
+ "\n",
+ " canvas_div.addEventListener('wheel', function (event) {\n",
+ " if (event.deltaY < 0) {\n",
+ " event.step = 1;\n",
+ " } else {\n",
+ " event.step = -1;\n",
+ " }\n",
+ " on_mouse_event_closure('scroll')(event);\n",
+ " });\n",
+ "\n",
+ " canvas_div.appendChild(canvas);\n",
+ " canvas_div.appendChild(rubberband_canvas);\n",
+ "\n",
+ " this.rubberband_context = rubberband_canvas.getContext('2d');\n",
+ " this.rubberband_context.strokeStyle = '#000000';\n",
+ "\n",
+ " this._resize_canvas = function (width, height, forward) {\n",
+ " if (forward) {\n",
+ " canvas_div.style.width = width + 'px';\n",
+ " canvas_div.style.height = height + 'px';\n",
+ " }\n",
+ " };\n",
+ "\n",
+ " // Disable right mouse context menu.\n",
+ " this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ " });\n",
+ "\n",
+ " function set_focus() {\n",
+ " canvas.focus();\n",
+ " canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " window.setTimeout(set_focus, 100);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'mpl-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'mpl-button-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " var button = (fig.buttons[name] = document.createElement('button'));\n",
+ " button.classList = 'mpl-widget';\n",
+ " button.setAttribute('role', 'button');\n",
+ " button.setAttribute('aria-disabled', 'false');\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ "\n",
+ " var icon_img = document.createElement('img');\n",
+ " icon_img.src = '_images/' + image + '.png';\n",
+ " icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
+ " icon_img.alt = tooltip;\n",
+ " button.appendChild(icon_img);\n",
+ "\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " var fmt_picker = document.createElement('select');\n",
+ " fmt_picker.classList = 'mpl-widget';\n",
+ " toolbar.appendChild(fmt_picker);\n",
+ " this.format_dropdown = fmt_picker;\n",
+ "\n",
+ " for (var ind in mpl.extensions) {\n",
+ " var fmt = mpl.extensions[ind];\n",
+ " var option = document.createElement('option');\n",
+ " option.selected = fmt === mpl.default_extension;\n",
+ " option.innerHTML = fmt;\n",
+ " fmt_picker.appendChild(option);\n",
+ " }\n",
+ "\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function (type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function () {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1], msg['forward']);\n",
+ " fig.send_message('refresh', {});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
+ " var x0 = msg['x0'] / fig.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
+ " var x1 = msg['x1'] / fig.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0,\n",
+ " 0,\n",
+ " fig.canvas.width / fig.ratio,\n",
+ " fig.canvas.height / fig.ratio\n",
+ " );\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
+ " var cursor = msg['cursor'];\n",
+ " switch (cursor) {\n",
+ " case 0:\n",
+ " cursor = 'pointer';\n",
+ " break;\n",
+ " case 1:\n",
+ " cursor = 'default';\n",
+ " break;\n",
+ " case 2:\n",
+ " cursor = 'crosshair';\n",
+ " break;\n",
+ " case 3:\n",
+ " cursor = 'move';\n",
+ " break;\n",
+ " }\n",
+ " fig.rubberband_canvas.style.cursor = cursor;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function (fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
+ " for (var key in msg) {\n",
+ " if (!(key in fig.buttons)) {\n",
+ " continue;\n",
+ " }\n",
+ " fig.buttons[key].disabled = !msg[key];\n",
+ " fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
+ " if (msg['mode'] === 'PAN') {\n",
+ " fig.buttons['Pan'].classList.add('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " } else if (msg['mode'] === 'ZOOM') {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.add('active');\n",
+ " } else {\n",
+ " fig.buttons['Pan'].classList.remove('active');\n",
+ " fig.buttons['Zoom'].classList.remove('active');\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message('ack', {});\n",
+ "};\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function (fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " evt.data.type = 'image/png';\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src\n",
+ " );\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " evt.data\n",
+ " );\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " } else if (\n",
+ " typeof evt.data === 'string' &&\n",
+ " evt.data.slice(0, 21) === 'data:image/png;base64'\n",
+ " ) {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig['handle_' + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"No handler for the '\" + msg_type + \"' message type: \",\n",
+ " msg\n",
+ " );\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\n",
+ " \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
+ " e,\n",
+ " e.stack,\n",
+ " msg\n",
+ " );\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "};\n",
+ "\n",
+ "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
+ "mpl.findpos = function (e) {\n",
+ " //this section is from http://www.quirksmode.org/js/events_properties.html\n",
+ " var targ;\n",
+ " if (!e) {\n",
+ " e = window.event;\n",
+ " }\n",
+ " if (e.target) {\n",
+ " targ = e.target;\n",
+ " } else if (e.srcElement) {\n",
+ " targ = e.srcElement;\n",
+ " }\n",
+ " if (targ.nodeType === 3) {\n",
+ " // defeat Safari bug\n",
+ " targ = targ.parentNode;\n",
+ " }\n",
+ "\n",
+ " // pageX,Y are the mouse positions relative to the document\n",
+ " var boundingRect = targ.getBoundingClientRect();\n",
+ " var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n",
+ " var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n",
+ "\n",
+ " return { x: x, y: y };\n",
+ "};\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * http://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys(original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object') {\n",
+ " obj[key] = original[key];\n",
+ " }\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function (event, name) {\n",
+ " var canvas_pos = mpl.findpos(event);\n",
+ "\n",
+ " if (name === 'button_press') {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " var x = canvas_pos.x * this.ratio;\n",
+ " var y = canvas_pos.y * this.ratio;\n",
+ "\n",
+ " this.send_message(name, {\n",
+ " x: x,\n",
+ " y: y,\n",
+ " button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event),\n",
+ " });\n",
+ "\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We want\n",
+ " * to control all of the cursor setting manually through the\n",
+ " * 'cursor' event from matplotlib */\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function (event, name) {\n",
+ " // Prevent repeat events\n",
+ " if (name === 'key_press') {\n",
+ " if (event.which === this._key) {\n",
+ " return;\n",
+ " } else {\n",
+ " this._key = event.which;\n",
+ " }\n",
+ " }\n",
+ " if (name === 'key_release') {\n",
+ " this._key = null;\n",
+ " }\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.which !== 17) {\n",
+ " value += 'ctrl+';\n",
+ " }\n",
+ " if (event.altKey && event.which !== 18) {\n",
+ " value += 'alt+';\n",
+ " }\n",
+ " if (event.shiftKey && event.which !== 16) {\n",
+ " value += 'shift+';\n",
+ " }\n",
+ "\n",
+ " value += 'k';\n",
+ " value += event.which.toString();\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
+ " return false;\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
+ " if (name === 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message('toolbar_button', { name: name });\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "\n",
+ "///////////////// REMAINING CONTENT GENERATED BY embed_js.py /////////////////\n",
+ "// prettier-ignore\n",
+ "var _JSXTOOLS_RESIZE_OBSERVER=function(A){var t,i=new WeakMap,n=new WeakMap,a=new WeakMap,r=new WeakMap,o=new Set;function s(e){if(!(this instanceof s))throw new TypeError(\"Constructor requires 'new' operator\");i.set(this,e)}function h(){throw new TypeError(\"Function is not a constructor\")}function c(e,t,i,n){e=0 in arguments?Number(arguments[0]):0,t=1 in arguments?Number(arguments[1]):0,i=2 in arguments?Number(arguments[2]):0,n=3 in arguments?Number(arguments[3]):0,this.right=(this.x=this.left=e)+(this.width=i),this.bottom=(this.y=this.top=t)+(this.height=n),Object.freeze(this)}function d(){t=requestAnimationFrame(d);var s=new WeakMap,p=new Set;o.forEach((function(t){r.get(t).forEach((function(i){var r=t instanceof window.SVGElement,o=a.get(t),d=r?0:parseFloat(o.paddingTop),f=r?0:parseFloat(o.paddingRight),l=r?0:parseFloat(o.paddingBottom),u=r?0:parseFloat(o.paddingLeft),g=r?0:parseFloat(o.borderTopWidth),m=r?0:parseFloat(o.borderRightWidth),w=r?0:parseFloat(o.borderBottomWidth),b=u+f,F=d+l,v=(r?0:parseFloat(o.borderLeftWidth))+m,W=g+w,y=r?0:t.offsetHeight-W-t.clientHeight,E=r?0:t.offsetWidth-v-t.clientWidth,R=b+v,z=F+W,M=r?t.width:parseFloat(o.width)-R-E,O=r?t.height:parseFloat(o.height)-z-y;if(n.has(t)){var k=n.get(t);if(k[0]===M&&k[1]===O)return}n.set(t,[M,O]);var S=Object.create(h.prototype);S.target=t,S.contentRect=new c(u,d,M,O),s.has(i)||(s.set(i,[]),p.add(i)),s.get(i).push(S)}))})),p.forEach((function(e){i.get(e).call(e,s.get(e),e)}))}return s.prototype.observe=function(i){if(i instanceof window.Element){r.has(i)||(r.set(i,new Set),o.add(i),a.set(i,window.getComputedStyle(i)));var n=r.get(i);n.has(this)||n.add(this),cancelAnimationFrame(t),t=requestAnimationFrame(d)}},s.prototype.unobserve=function(i){if(i instanceof window.Element&&r.has(i)){var n=r.get(i);n.has(this)&&(n.delete(this),n.size||(r.delete(i),o.delete(i))),n.size||r.delete(i),o.size||cancelAnimationFrame(t)}},A.DOMRectReadOnly=c,A.ResizeObserver=s,A.ResizeObserverEntry=h,A}; // eslint-disable-line\n",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
+ "\n",
+ "mpl.default_extension = \"png\";/* global mpl */\n",
+ "\n",
+ "var comm_websocket_adapter = function (comm) {\n",
+ " // Create a \"websocket\"-like object which calls the given IPython comm\n",
+ " // object with the appropriate methods. Currently this is a non binary\n",
+ " // socket, so there is still some room for performance tuning.\n",
+ " var ws = {};\n",
+ "\n",
+ " ws.close = function () {\n",
+ " comm.close();\n",
+ " };\n",
+ " ws.send = function (m) {\n",
+ " //console.log('sending', m);\n",
+ " comm.send(m);\n",
+ " };\n",
+ " // Register the callback with on_msg.\n",
+ " comm.on_msg(function (msg) {\n",
+ " //console.log('receiving', msg['content']['data'], msg);\n",
+ " // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
+ " ws.onmessage(msg['content']['data']);\n",
+ " });\n",
+ " return ws;\n",
+ "};\n",
+ "\n",
+ "mpl.mpl_figure_comm = function (comm, msg) {\n",
+ " // This is the function which gets called when the mpl process\n",
+ " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
+ "\n",
+ " var id = msg.content.data.id;\n",
+ " // Get hold of the div created by the display call when the Comm\n",
+ " // socket was opened in Python.\n",
+ " var element = document.getElementById(id);\n",
+ " var ws_proxy = comm_websocket_adapter(comm);\n",
+ "\n",
+ " function ondownload(figure, _format) {\n",
+ " window.open(figure.canvas.toDataURL());\n",
+ " }\n",
+ "\n",
+ " var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
+ "\n",
+ " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
+ " // web socket which is closed, not our websocket->open comm proxy.\n",
+ " ws_proxy.onopen();\n",
+ "\n",
+ " fig.parent_element = element;\n",
+ " fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
+ " if (!fig.cell_info) {\n",
+ " console.error('Failed to find cell for figure', id, fig);\n",
+ " return;\n",
+ " }\n",
+ " fig.cell_info[0].output_area.element.on(\n",
+ " 'cleared',\n",
+ " { fig: fig },\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_close = function (fig, msg) {\n",
+ " var width = fig.canvas.width / fig.ratio;\n",
+ " fig.cell_info[0].output_area.element.off(\n",
+ " 'cleared',\n",
+ " fig._remove_fig_handler\n",
+ " );\n",
+ " fig.resizeObserverInstance.unobserve(fig.canvas_div);\n",
+ "\n",
+ " // Update the output cell to use the data from the current canvas.\n",
+ " fig.push_to_output();\n",
+ " var dataURL = fig.canvas.toDataURL();\n",
+ " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
+ " // the notebook keyboard shortcuts fail.\n",
+ " IPython.keyboard_manager.enable();\n",
+ " fig.parent_element.innerHTML =\n",
+ " '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
+ " fig.close_ws(fig, msg);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.close_ws = function (fig, msg) {\n",
+ " fig.send_message('closing', msg);\n",
+ " // fig.ws.close()\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
+ " // Turn the data on the canvas into data in the output cell.\n",
+ " var width = this.canvas.width / this.ratio;\n",
+ " var dataURL = this.canvas.toDataURL();\n",
+ " this.cell_info[1]['text/html'] =\n",
+ " '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function () {\n",
+ " // Tell IPython that the notebook contents must change.\n",
+ " IPython.notebook.set_dirty(true);\n",
+ " this.send_message('ack', {});\n",
+ " var fig = this;\n",
+ " // Wait a second, then push the new image to the DOM so\n",
+ " // that it is saved nicely (might be nice to debounce this).\n",
+ " setTimeout(function () {\n",
+ " fig.push_to_output();\n",
+ " }, 1000);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function () {\n",
+ " var fig = this;\n",
+ "\n",
+ " var toolbar = document.createElement('div');\n",
+ " toolbar.classList = 'btn-toolbar';\n",
+ " this.root.appendChild(toolbar);\n",
+ "\n",
+ " function on_click_closure(name) {\n",
+ " return function (_event) {\n",
+ " return fig.toolbar_button_onclick(name);\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " function on_mouseover_closure(tooltip) {\n",
+ " return function (event) {\n",
+ " if (!event.currentTarget.disabled) {\n",
+ " return fig.toolbar_button_onmouseover(tooltip);\n",
+ " }\n",
+ " };\n",
+ " }\n",
+ "\n",
+ " fig.buttons = {};\n",
+ " var buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " var button;\n",
+ " for (var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " /* Instead of a spacer, we start a new button group. */\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ " buttonGroup = document.createElement('div');\n",
+ " buttonGroup.classList = 'btn-group';\n",
+ " continue;\n",
+ " }\n",
+ "\n",
+ " button = fig.buttons[name] = document.createElement('button');\n",
+ " button.classList = 'btn btn-default';\n",
+ " button.href = '#';\n",
+ " button.title = name;\n",
+ " button.innerHTML = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n",
+ " button.addEventListener('click', on_click_closure(method_name));\n",
+ " button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
+ " buttonGroup.appendChild(button);\n",
+ " }\n",
+ "\n",
+ " if (buttonGroup.hasChildNodes()) {\n",
+ " toolbar.appendChild(buttonGroup);\n",
+ " }\n",
+ "\n",
+ " // Add the status bar.\n",
+ " var status_bar = document.createElement('span');\n",
+ " status_bar.classList = 'mpl-message pull-right';\n",
+ " toolbar.appendChild(status_bar);\n",
+ " this.message = status_bar;\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = document.createElement('div');\n",
+ " buttongrp.classList = 'btn-group inline pull-right';\n",
+ " button = document.createElement('button');\n",
+ " button.classList = 'btn btn-mini btn-primary';\n",
+ " button.href = '#';\n",
+ " button.title = 'Stop Interaction';\n",
+ " button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n",
+ " button.addEventListener('click', function (_evt) {\n",
+ " fig.handle_close(fig, {});\n",
+ " });\n",
+ " button.addEventListener(\n",
+ " 'mouseover',\n",
+ " on_mouseover_closure('Stop Interaction')\n",
+ " );\n",
+ " buttongrp.appendChild(button);\n",
+ " var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
+ " titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._remove_fig_handler = function (event) {\n",
+ " var fig = event.data.fig;\n",
+ " if (event.target !== this) {\n",
+ " // Ignore bubbled events from children.\n",
+ " return;\n",
+ " }\n",
+ " fig.close_ws(fig, {});\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function (el) {\n",
+ " el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function (el) {\n",
+ " // this is important to make the div 'focusable\n",
+ " el.setAttribute('tabindex', 0);\n",
+ " // reach out to IPython and tell the keyboard manager to turn it's self\n",
+ " // off when our div gets focus\n",
+ "\n",
+ " // location in version 3\n",
+ " if (IPython.notebook.keyboard_manager) {\n",
+ " IPython.notebook.keyboard_manager.register_events(el);\n",
+ " } else {\n",
+ " // location in version 2\n",
+ " IPython.keyboard_manager.register_events(el);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
+ " var manager = IPython.notebook.keyboard_manager;\n",
+ " if (!manager) {\n",
+ " manager = IPython.keyboard_manager;\n",
+ " }\n",
+ "\n",
+ " // Check for shift+enter\n",
+ " if (event.shiftKey && event.which === 13) {\n",
+ " this.canvas_div.blur();\n",
+ " // select the cell after this one\n",
+ " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
+ " IPython.notebook.select(index + 1);\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
+ " fig.ondownload(fig, null);\n",
+ "};\n",
+ "\n",
+ "mpl.find_output_cell = function (html_output) {\n",
+ " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
+ " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
+ " // IPython event is triggered only after the cells have been serialised, which for\n",
+ " // our purposes (turning an active figure into a static one), is too late.\n",
+ " var cells = IPython.notebook.get_cells();\n",
+ " var ncells = cells.length;\n",
+ " for (var i = 0; i < ncells; i++) {\n",
+ " var cell = cells[i];\n",
+ " if (cell.cell_type === 'code') {\n",
+ " for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
+ " var data = cell.output_area.outputs[j];\n",
+ " if (data.data) {\n",
+ " // IPython >= 3 moved mimebundle to data attribute of output\n",
+ " data = data.data;\n",
+ " }\n",
+ " if (data['text/html'] === html_output) {\n",
+ " return [cell, data, j];\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "// Register the function which deals with the matplotlib target/channel.\n",
+ "// The kernel may be null if the page has been refreshed.\n",
+ "if (IPython.notebook.kernel !== null) {\n",
+ " IPython.notebook.kernel.comm_manager.register_target(\n",
+ " 'matplotlib',\n",
+ " mpl.mpl_figure_comm\n",
+ " );\n",
+ "}\n"
+ ],
+ "text/plain": [
+ "<IPython.core.display.Javascript object>"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "<img src=\"data:image/png;base64,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\" width=\"640\">"
+ ],
+ "text/plain": [
+ "<IPython.core.display.HTML object>"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "sampling_rate = 10 # sps, set in firmware\n",
+ "mems_lsb_per_g = 68 # LSBs per 1g for our accelerometer\n",
+ "\n",
+ "fig, ax = plt.subplots()\n",
+ "ax.axvspan(ivl_start/60/sampling_rate, ivl_end/60/sampling_rate, color='orange', alpha=0.5)\n",
+ "ax.axhline(centrifugal_acceleration/g, color='orange')\n",
+ "ax.axhline(centrifugal_acceleration2/g, color='orange')\n",
+ "interval\n",
+ "ts = np.arange(0, len(reassembled_values)) / sampling_rate / 60\n",
+ "ax.plot(ts, reassembled_values / mems_lsb_per_g )\n",
+ "ax.grid()\n",
+ "\n",
+ "g = 9.8066\n",
+ "g_to_ms = lambda x: x * g\n",
+ "ms_to_g = lambda x: x / g\n",
+ "\n",
+ "ax.set_ylabel(r'$a\\; [g]$')\n",
+ "secax_y = ax.secondary_yaxis(\n",
+ " 'right', functions=(g_to_ms, ms_to_g))\n",
+ "secax_y.set_ylabel(r'$a\\; [ms^{-1}]$')\n",
+ "\n",
+ "formatter = ticker.FuncFormatter(lambda tick, _pos: f'{tick:02.0f}:{tick*60%1:02.0f}')\n",
+ "ax.xaxis.set_major_formatter(formatter)"
]
}
],
diff --git a/prototype/sensor-analysis/test_run.sqlite3 b/prototype/sensor-analysis/test_run.sqlite3
index d177eab..e570594 100755
--- a/prototype/sensor-analysis/test_run.sqlite3
+++ b/prototype/sensor-analysis/test_run.sqlite3
Binary files differ