{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Adjusted Phase 1  Generation Tool\n",
    "Below are packages imported during development, most of which are used below.\n",
    "Read through the worksheet, and enter any values in the cells headed 'Enter' below.  Then click 'Cell' in the menu above, and 'Run All.'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "#%matplotlib inline\n",
    "%matplotlib notebook\n",
    "\n",
    "import matplotlib as mp\n",
    "\n",
    "import pandas as pd\n",
    "\n",
    "import numpy as np\n",
    "\n",
    "import scipy as sp\n",
    "\n",
    "import scipy.linalg as spl\n",
    "\n",
    "import glob\n",
    "\n",
    "import json\n",
    "\n",
    "import urllib2\n",
    "\n",
    "from datetime import datetime \n",
    "\n",
    "import dateutil.parser as dp\n",
    "\n",
    "import matplotlib.pyplot as pl\n",
    "\n",
    "import re\n",
    "\n",
    "import obspy\n",
    "\n",
    "from obspy.core import UTCDateTime\n",
    "\n",
    "import geomagio\n",
    "\n",
    "from geomagio.edge import EdgeFactory\n",
    "\n",
    "#from geomagio.Algorithm import DeltaFAlgorithm"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Example url for baseline web service"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "https://geomag.usgs.gov/baselines/observation.json.php?observatory=BOU&starttime=2016-01-01&endtime=2016-10-07"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Enter the Observatory in the cell below as a string, similar to the following example:\n",
    "\n",
    "```python\n",
    "obs_code = 'BOU'\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "obs_code = 'BOU'"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Enter the start date and end date for which you'd like to request baseline measurements\n",
    "If you choose a year's worth, that will result in the mean delta F for adjusted data being closest to 0, but will amplify the daily variation.  If you choose a shorter time period closer to the present, the daily variation will remain small, but the mean delta F will be biased by seasonal variation.  If the baseline service is called without dates, it will return the last one month's baseline measurements.\n",
    "\n",
    "NOTE: the datetimes used to index sets of Absolutes in the database are not necessarily associated with the datetimes of the actual measurements made, although they seem to be reliably on the same day at least. A github ticket was submitted to change this web service behavior, but for now, assume the start_date and end_date below are somewhat fuzzy, or just limit the search to whole days."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "start_date = '2015-01-01T00:00:00Z'\n",
    "\n",
    "# convert to unix epoch time (seconds since 1/1/1970)\n",
    "start_epoch = (dp.parse(start_date, ignoretz=True) - datetime.utcfromtimestamp(0)).total_seconds()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "end_date = '2016-01-01T00:00:00Z'\n",
    "\n",
    "# convert to unix epoch time (seconds since 1/1/1970)\n",
    "end_epoch = (dp.parse(end_date, ignoretz=True) - datetime.utcfromtimestamp(0)).total_seconds()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# pull baseline info from USGS Geomagnetism Program's web service\n",
    "baseline_url = 'https://geomag.usgs.gov/baselines/observation.json.php'\n",
    "full_url = baseline_url + '?observatory=' + obs_code + '&starttime=' + start_date + '&endtime=' + end_date\n",
    "response = urllib2.urlopen(full_url)\n",
    "parsed_response = json.load(response)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# extract only complete and validated baseline sets; also,\n",
    "# filter on times to partially address issues with database time stamps\n",
    "h_abs = []\n",
    "d_abs = []\n",
    "z_abs = []\n",
    "h_ord = []\n",
    "d_ord = []\n",
    "z_ord = []\n",
    "h_t = []\n",
    "d_t = []\n",
    "z_t = []\n",
    "\n",
    "for datum in parsed_response['data']:\n",
    "    for reading in datum['readings']:\n",
    "        if (reading['H']['absolute'] is not None\n",
    "           and reading['D']['absolute'] is not None\n",
    "           and reading['Z']['absolute'] is not None\n",
    "           and reading['H']['baseline'] is not None\n",
    "           and reading['D']['baseline'] is not None\n",
    "           and reading['Z']['baseline'] is not None\n",
    "           and reading['H']['valid'] is True\n",
    "           and reading['D']['valid'] is True\n",
    "           and reading['Z']['valid'] is True\n",
    "           and reading['H']['end'] >= start_epoch\n",
    "           and reading['D']['end'] >= start_epoch\n",
    "           and reading['Z']['end'] >= start_epoch\n",
    "           and reading['H']['end'] <= end_epoch\n",
    "           and reading['D']['end'] <= end_epoch\n",
    "           and reading['Z']['end'] <= end_epoch):\n",
    "            h_abs.append(reading['H']['absolute'])\n",
    "            d_abs.append(reading['D']['absolute'])\n",
    "            z_abs.append(reading['Z']['absolute'])\n",
    "            h_ord.append(reading['H']['absolute'] - reading['H']['baseline'])\n",
    "            d_ord.append(reading['D']['absolute'] - reading['D']['baseline'])\n",
    "            z_ord.append(reading['Z']['absolute'] - reading['Z']['baseline'])\n",
    "            h_t.append(reading['H']['end'])\n",
    "            d_t.append(reading['D']['end'])\n",
    "            z_t.append(reading['Z']['end'])\n",
    "\n",
    "# perhaps a separate pier_correction  should be associated with each datum...\n",
    "# revisit and fix if necessary -EJR\n",
    "last_datum = parsed_response['data'][-1]\n",
    "pier_correction = float(last_datum['pier']['correction'])\n",
    "\n",
    "# convert unix times to Python datetimes\n",
    "h_dt = [datetime.utcfromtimestamp(ut) for ut in h_t]\n",
    "d_dt = [datetime.utcfromtimestamp(ut) for ut in d_t]\n",
    "z_dt = [datetime.utcfromtimestamp(ut) for ut in z_t]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-22.0\n"
     ]
    }
   ],
   "source": [
    "print pier_correction"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Plot of H absolutes, ordinates, baselines\n",
    "Absolutes represent the field magnitude as measured by the overhauser (with the pier correction applied), and field direction measured by the theodolite.  Ordinates represent the variometer's reading of the field corresponding to the nearest times absolute measurements were taken. Baselines, or the difference between absolutes and ordinates, are presented in the bottom plot. All vertical axis units are nanoteslas."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "/* Put everything inside the global mpl namespace */\n",
       "window.mpl = {};\n",
       "\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('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",
       "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 = $('<div/>');\n",
       "    this._root_extra_style(this.root)\n",
       "    this.root.attr('style', 'display: inline-block');\n",
       "\n",
       "    $(parent_element).append(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 (mpl.ratio != 1) {\n",
       "                fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.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",
       "        this.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 = $(\n",
       "        '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
       "        'ui-helper-clearfix\"/>');\n",
       "    var titletext = $(\n",
       "        '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
       "        'text-align: center; padding: 3px;\"/>');\n",
       "    titlebar.append(titletext)\n",
       "    this.root.append(titlebar);\n",
       "    this.header = titletext[0];\n",
       "}\n",
       "\n",
       "\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_canvas = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var canvas_div = $('<div/>');\n",
       "\n",
       "    canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
       "\n",
       "    function canvas_keyboard_event(event) {\n",
       "        return fig.key_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    canvas_div.keydown('key_press', canvas_keyboard_event);\n",
       "    canvas_div.keyup('key_release', canvas_keyboard_event);\n",
       "    this.canvas_div = canvas_div\n",
       "    this._canvas_extra_style(canvas_div)\n",
       "    this.root.append(canvas_div);\n",
       "\n",
       "    var canvas = $('<canvas/>');\n",
       "    canvas.addClass('mpl-canvas');\n",
       "    canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
       "\n",
       "    this.canvas = canvas[0];\n",
       "    this.context = canvas[0].getContext(\"2d\");\n",
       "\n",
       "    var backingStore = this.context.backingStorePixelRatio ||\n",
       "\tthis.context.webkitBackingStorePixelRatio ||\n",
       "\tthis.context.mozBackingStorePixelRatio ||\n",
       "\tthis.context.msBackingStorePixelRatio ||\n",
       "\tthis.context.oBackingStorePixelRatio ||\n",
       "\tthis.context.backingStorePixelRatio || 1;\n",
       "\n",
       "    mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
       "\n",
       "    var rubberband = $('<canvas/>');\n",
       "    rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
       "\n",
       "    var pass_mouse_events = true;\n",
       "\n",
       "    canvas_div.resizable({\n",
       "        start: function(event, ui) {\n",
       "            pass_mouse_events = false;\n",
       "        },\n",
       "        resize: function(event, ui) {\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "        stop: function(event, ui) {\n",
       "            pass_mouse_events = true;\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "    });\n",
       "\n",
       "    function mouse_event_fn(event) {\n",
       "        if (pass_mouse_events)\n",
       "            return fig.mouse_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    rubberband.mousedown('button_press', mouse_event_fn);\n",
       "    rubberband.mouseup('button_release', mouse_event_fn);\n",
       "    // Throttle sequential mouse events to 1 every 20ms.\n",
       "    rubberband.mousemove('motion_notify', mouse_event_fn);\n",
       "\n",
       "    rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
       "    rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
       "\n",
       "    canvas_div.on(\"wheel\", function (event) {\n",
       "        event = event.originalEvent;\n",
       "        event['data'] = 'scroll'\n",
       "        if (event.deltaY < 0) {\n",
       "            event.step = 1;\n",
       "        } else {\n",
       "            event.step = -1;\n",
       "        }\n",
       "        mouse_event_fn(event);\n",
       "    });\n",
       "\n",
       "    canvas_div.append(canvas);\n",
       "    canvas_div.append(rubberband);\n",
       "\n",
       "    this.rubberband = rubberband;\n",
       "    this.rubberband_canvas = rubberband[0];\n",
       "    this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
       "    this.rubberband_context.strokeStyle = \"#000000\";\n",
       "\n",
       "    this._resize_canvas = function(width, height) {\n",
       "        // Keep the size of the canvas, canvas container, and rubber band\n",
       "        // canvas in synch.\n",
       "        canvas_div.css('width', width)\n",
       "        canvas_div.css('height', height)\n",
       "\n",
       "        canvas.attr('width', width * mpl.ratio);\n",
       "        canvas.attr('height', height * mpl.ratio);\n",
       "        canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
       "\n",
       "        rubberband.attr('width', width);\n",
       "        rubberband.attr('height', height);\n",
       "    }\n",
       "\n",
       "    // Set the figure to an initial 600x600px, this will subsequently be updated\n",
       "    // upon first draw.\n",
       "    this._resize_canvas(600, 600);\n",
       "\n",
       "    // Disable right mouse context menu.\n",
       "    $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\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 nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\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",
       "            // put a spacer in here.\n",
       "            continue;\n",
       "        }\n",
       "        var button = $('<button/>');\n",
       "        button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
       "                        'ui-button-icon-only');\n",
       "        button.attr('role', 'button');\n",
       "        button.attr('aria-disabled', 'false');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "\n",
       "        var icon_img = $('<span/>');\n",
       "        icon_img.addClass('ui-button-icon-primary ui-icon');\n",
       "        icon_img.addClass(image);\n",
       "        icon_img.addClass('ui-corner-all');\n",
       "\n",
       "        var tooltip_span = $('<span/>');\n",
       "        tooltip_span.addClass('ui-button-text');\n",
       "        tooltip_span.html(tooltip);\n",
       "\n",
       "        button.append(icon_img);\n",
       "        button.append(tooltip_span);\n",
       "\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    var fmt_picker_span = $('<span/>');\n",
       "\n",
       "    var fmt_picker = $('<select/>');\n",
       "    fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
       "    fmt_picker_span.append(fmt_picker);\n",
       "    nav_element.append(fmt_picker_span);\n",
       "    this.format_dropdown = fmt_picker[0];\n",
       "\n",
       "    for (var ind in mpl.extensions) {\n",
       "        var fmt = mpl.extensions[ind];\n",
       "        var option = $(\n",
       "            '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
       "        fmt_picker.append(option)\n",
       "    }\n",
       "\n",
       "    // Add hover states to the ui-buttons\n",
       "    $( \".ui-button\" ).hover(\n",
       "        function() { $(this).addClass(\"ui-state-hover\");},\n",
       "        function() { $(this).removeClass(\"ui-state-hover\");}\n",
       "    );\n",
       "\n",
       "    var status_bar = $('<span class=\"mpl-message\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\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",
       "\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",
       "\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]);\n",
       "        fig.send_message(\"refresh\", {});\n",
       "    };\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
       "    var x0 = msg['x0'] / mpl.ratio;\n",
       "    var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
       "    var x1 = msg['x1'] / mpl.ratio;\n",
       "    var y1 = (fig.canvas.height - msg['y1']) / mpl.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, 0, fig.canvas.width, fig.canvas.height);\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",
       "    {\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.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",
       "            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
       "                evt.data);\n",
       "            fig.updated_canvas_event();\n",
       "            fig.waiting = false;\n",
       "            return;\n",
       "        }\n",
       "        else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\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(\"No handler for the '\" + msg_type + \"' message type: \", msg);\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(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\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",
       "    if (e.target)\n",
       "        targ = e.target;\n",
       "    else if (e.srcElement)\n",
       "        targ = e.srcElement;\n",
       "    if (targ.nodeType == 3) // defeat Safari bug\n",
       "        targ = targ.parentNode;\n",
       "\n",
       "    // jQuery normalizes the pageX and pageY\n",
       "    // pageX,Y are the mouse positions relative to the document\n",
       "    // offset() returns the position of the element relative to the document\n",
       "    var x = e.pageX - $(targ).offset().left;\n",
       "    var y = e.pageY - $(targ).offset().top;\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",
       "    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",
       "    {\n",
       "        this.canvas.focus();\n",
       "        this.canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    var x = canvas_pos.x * mpl.ratio;\n",
       "    var y = canvas_pos.y * mpl.ratio;\n",
       "\n",
       "    this.send_message(name, {x: x, y: y, button: event.button,\n",
       "                             step: event.step,\n",
       "                             guiEvent: simpleKeys(event)});\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",
       "\n",
       "    // Prevent repeat events\n",
       "    if (name == 'key_press')\n",
       "    {\n",
       "        if (event.which === this._key)\n",
       "            return;\n",
       "        else\n",
       "            this._key = event.which;\n",
       "    }\n",
       "    if (name == 'key_release')\n",
       "        this._key = null;\n",
       "\n",
       "    var value = '';\n",
       "    if (event.ctrlKey && event.which != 17)\n",
       "        value += \"ctrl+\";\n",
       "    if (event.altKey && event.which != 18)\n",
       "        value += \"alt+\";\n",
       "    if (event.shiftKey && event.which != 16)\n",
       "        value += \"shift+\";\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,\n",
       "                             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",
       "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\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"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\";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 overriden (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 = $(\"#\" + id);\n",
       "    var ws_proxy = comm_websocket_adapter(comm)\n",
       "\n",
       "    function ondownload(figure, format) {\n",
       "        window.open(figure.imageObj.src);\n",
       "    }\n",
       "\n",
       "    var fig = new mpl.figure(id, ws_proxy,\n",
       "                           ondownload,\n",
       "                           element.get(0));\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.get(0);\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",
       "\n",
       "    var output_index = fig.cell_info[2]\n",
       "    var cell = fig.cell_info[0];\n",
       "\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_close = function(fig, msg) {\n",
       "    var width = fig.canvas.width/mpl.ratio\n",
       "    fig.root.unbind('remove')\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).html('<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/mpl.ratio\n",
       "    var dataURL = this.canvas.toDataURL();\n",
       "    this.cell_info[1]['text/html'] = '<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 () { fig.push_to_output() }, 1000);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\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) { continue; };\n",
       "\n",
       "        var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    // Add the status bar.\n",
       "    var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\n",
       "\n",
       "    // Add the close button to the window.\n",
       "    var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
       "    var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
       "    button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
       "    button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
       "    buttongrp.append(button);\n",
       "    var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
       "    titlebar.prepend(buttongrp);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(el){\n",
       "    var fig = this\n",
       "    el.on(\"remove\", function(){\n",
       "\tfig.close_ws(fig, {});\n",
       "    });\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(el){\n",
       "    // this is important to make the div 'focusable\n",
       "    el.attr('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",
       "    }\n",
       "    else {\n",
       "        // location in version 2\n",
       "        IPython.keyboard_manager.register_events(el);\n",
       "    }\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",
       "    // 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",
       "\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('matplotlib', mpl.mpl_figure_comm);\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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O9u6PSYoSB5yyCH2yU9+0mbOnGmtra327LPPdgWusEBY2Cv46quv2o033minn3669enTxy644AIzMzvvvPPshBNOKHpsPhDOnu21NpcGwuHDh9sVV1xR9JhDDz20bCDs06eP/epXv7Jly5Z1K9u2eb93Z2en3XXXXTZq1CjbZ5997Nhjj/XtMYxzoaC0zWWoVNiCAEhGrVepq2UPocuFWi2GfBZefA4fHf4aVLIIVFCAC7rIvPqhpWXnYbouluEa8PKvmetCJk4XwmX2IcxzmZtaCb85gEFD1INWe44aUmu5mmyUxVWC1PpvRVivpUuPeVgDhd9og7lt6wIbDMKey/W1y7/24x9tCz0HlJsLXA8ujT1JzyckEALuEplDWDi34obHVvgGuzXrN4b2/r2xcbPv497YuLnofuvWrSsKZ2beXDyVBML88FAzb8jokCFDim4rNH78eNttt93MrLIho0cddZRdeOGFXV9v2LDB+vbtWxQId9llF7vtttuKnve4446zM888M/T1LbRkyRKTZE899VS378W9cmyUFQWT5npR1Ei9nVlUiwvOUrVc6MDlZ9VqkSXXnteom8D7teDnLzaDjv3y+/0bSiqZhxnUCxn0mrn2lDm/vgH7EBaKqyfL9fdu7+gMrNfCUm4z90oaV8IeU6vPUi3/VrgsCBQWOss1UPgdY6WvQ7n6KP3++EfaQj9TadviwaXxJum/pQRCwF1iq4zmT2wbN7/jG+zK9f6te/Nt3/use7M4OG7bts322GMP++pXv2rLli2zWbNm2ZFHHtktEL773e+2qVOn2vPPP2/f/va3rX///vbaa6+ZmdlPfvITu/POO23ZsmX27LPP2oknnmhHHXWUmXmLyuy77772+c9/3hYvXmwPPfSQHXDAAaGLyowZM8b22Wcfmz17ti1atMhOOeUU69+/f1EgPOigg+zss8+2tWvX2vr13knzvvvus549e9q4cePs2WeftdbWVvvzn/9sP/7xj83M7MYbb7Trr7/eFi9ebMuXL7eLLrrI+vbt27U4TqFG3kokTNRFYkoXrCh30YXaiWNBlVr2ELoEhWqH1UUV1JP0U599Q4Na8PPHFnTsVa3sWSKoFzIoGAVdfMf9+ta6JyvK7z1p7srA99qER9vsojsWOfUMutaZ6wqu9dpWoFyDnsuCQEFBJGhuX7749QpX8zoENZxU2hhWqyH7tViUx6X3nx5CIL0S34fwzU1bnANhYe+faw+hmdmDDz5oI0aMsN69e9vhhx9ujzzySLdAeMstt9hRRx1lvXr1skMPPdQeeuihrsf//Oc/txEjRljfvn1t0KBBdvLJJ9uKFSu6vh9124kNGzbYF7/4RWtpabEhQ4bYTTfd1G0O4d13320HHnig9ezZs2jbifvuu8+OO+4469u3r7W0tNhRRx3VtZLoHXfcYUcffbS1tLRYv3797JhjjrGZM2f6vu7NGAgrmd+Utn2UmklcW5jUagVI156BKEM+qxWlN8slcAcde60CkusQ0PzFsN9nsmixihhf31r2ZF34lwXOgTA/RL2a1zzSe3XMjte13GPiWk01iGsvWD4YBQ37DxruWy4QBtV9rV+HuFcXDhOlpzFs8apyQ0aZQwikW+KBcPM727qGhkYJhFHmEKK7ZgyEUReJSeM+Ss0kzt61WrSkR+11qfViO0Fcg4PrSoelx17LobxRFpXJf+78Lr6TfH1r0XsSJRCW7uNXSSh1WRgn6uqZhY9L4rWv5H0XdUGgsAaKcgG8lq9DvRY0i3JOcznPlDYw1HsVagIh4C7xQGiWXy20IzdfsMNe/ccmp7DnusooumvGQBh1kRh6COsvyd61SiTdQ+LKJThEWfq+UK17L0rr+Nf3+i+hXzoUN6kAWHqshcdUaX0HXfCffPVfI4UQVy4L47gM8Ttr8vyaHE8lKnnfRW3UCwrF//dksp/revUQur5eUUYiFH5W6/W5zSMQAu7qEgjN8vsJvtMV+lzDXunj4KYZA2Eli0Ok9YK/mdT7IqKctB9fkEqH5MYxlLfwNYxrqLCvjpe8PQlDFpUpPEa/46q0ZzToZ8WxIJfLuc91gZ/xj7bV7LiiqOR9UUmjXmEDRb4kvUhLvRY0c+1RjWvl3bgRCAF3dQuEfgh78UlrIHTdULtSlczDyeoFPxCm0iG5cS+Uk1jvyFMTd+xFOG73wG0n8n436wXf47pqVmWbwUfZnqMWyp37XLcAGV7lSr+VqvR9V0mj3oLV67uGN7oGyVqq13QF16CX1RW4CYSAu1QFQsQnjXWa1P6Fad4SA0hSpUNy4xzKG8d2I91E2Jg+77wpT/teBH/v1so3g0+6sSns3FfJfM6kVfq+i/o613v+eL2mK0QJelncb5hACLgjEDaJtNVpVlscgayrNJTEGWZi31NtxaPFYTBfVswOfEjUBUqyyGWV0TRseB53iE7D/PF6TVeIEvSy1rhKIATcEQibRNrqNKtzEgDEI9YL/wp6CM2aY1/S/OseNIS03oEwKWmYP16v6QpZC3quCISAOwJhk0hbnTZD6zuAFHlqohcC82GwzBzCvJmta502g8+6sCGkzYiMPucAACAASURBVLL1DvPHu5vZutZ+NHVhJt//BELAHYGwSaStTus9ZwNA83llTZstfuwee2VNfVbOTLvxj3QfucHWO80r6z3kBELAHYGwSaStTtMwZwNA84h9nmKDOPvm+ZlbPAS11wijeAiEgDsCYYixY8faEUcc0fX1yJEj7eSTT67jEVUujXWahjkbABofDVBueJ2Q96OpC30D4UV3LKr3oTkjEALuCIQhSgNhR0eHvfHGGzV9jhtvvNEGDBhQ05/pJ611ypwNAHFjiLobXifk0UMINJemD4Tbt2+3d955x/d7pYEwDs0eCAEgbmxz44YeQhRiDiHQPJIJhB0veftAlVniu1befvttGzVqlO21117Wu3dv+/CHP2zz5s0zM7OHH37YJNmMGTPsn/7pn2yXXXaxhx9+2MzMfvGLX9i73vUu69+/v5155pk2evTo0CGjxx9/vI0aNcouvPBCGzhwoO299942duzYomO5/PLL7X3ve5/tuuuutv/++9vZZ59tb775ZtGxFJb8499++2274IILbL/99rNdd93VjjrqqK7jNDN78cUX7cQTT7Tdd9/ddt11Vzv00ENt+vTpga8JgRBAs6Lnyx1D+VEoy6vsEggBd/EHwqcm7tj/adzuzkt9V+N//ud/bL/99rMZM2bYc889ZyNHjrSBAwfa66+/3hXCDj/8cHvggQesra3NXn/9dbv11lutd+/edv3119uSJUvsxz/+se22225lA2FLS4uNGzfOli5dahMnTrQePXrYAw880HWf3/72t/bQQw/ZihUrbNasWXbIIYfY2WefbWZmmzdvtiuvvNJaWlps7dq1tnbt2q6w+M1vftOOO+44mz17trW1tdlll11mvXv3tqVLl5qZ2Wc+8xn7xCc+YYsWLbLly5fbPffcY48++mjga0IgBNCs6PmKhqH8aAQEQsBdvIGwws2Aq/HWW2/ZLrvsYn/605+6btuyZYvtt99+9utf/7orEN55551Fjzv22GPtO9/5TtFtRx99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\" width=\"900\">"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "pl.figure(figsize=(9,3))\n",
    "pl.subplot(2,1,1)\n",
    "pl.plot(h_dt,h_abs,'.',h_dt,h_ord,'.')\n",
    "pl.legend(('absolutes','ordinates'))\n",
    "pl.subplot(2,1,2)\n",
    "pl.plot(h_dt,np.asarray(h_abs) - np.asarray(h_ord),'.')\n",
    "pl.legend(('baselines',))\n",
    "\n",
    "# re-formats dates for better presentation\n",
    "pl.gcf().autofmt_xdate()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Plot of D absolutes, ordinates, baselines\n",
    "Absolutes represent the field magnitude as measured by the overhauser (with the pier correction applied), and field direction measured by the theodolite.  Ordinates represent the variometer's reading of the field corresponding to the nearest times absolute measurements were taken. Baselines, or the difference between absolutes and ordinates, are presented in the bottom plot. All vertical axis units are degrees from surveyed geographic north."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "/* Put everything inside the global mpl namespace */\n",
       "window.mpl = {};\n",
       "\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('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",
       "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 = $('<div/>');\n",
       "    this._root_extra_style(this.root)\n",
       "    this.root.attr('style', 'display: inline-block');\n",
       "\n",
       "    $(parent_element).append(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 (mpl.ratio != 1) {\n",
       "                fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.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",
       "        this.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 = $(\n",
       "        '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
       "        'ui-helper-clearfix\"/>');\n",
       "    var titletext = $(\n",
       "        '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
       "        'text-align: center; padding: 3px;\"/>');\n",
       "    titlebar.append(titletext)\n",
       "    this.root.append(titlebar);\n",
       "    this.header = titletext[0];\n",
       "}\n",
       "\n",
       "\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_canvas = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var canvas_div = $('<div/>');\n",
       "\n",
       "    canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
       "\n",
       "    function canvas_keyboard_event(event) {\n",
       "        return fig.key_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    canvas_div.keydown('key_press', canvas_keyboard_event);\n",
       "    canvas_div.keyup('key_release', canvas_keyboard_event);\n",
       "    this.canvas_div = canvas_div\n",
       "    this._canvas_extra_style(canvas_div)\n",
       "    this.root.append(canvas_div);\n",
       "\n",
       "    var canvas = $('<canvas/>');\n",
       "    canvas.addClass('mpl-canvas');\n",
       "    canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
       "\n",
       "    this.canvas = canvas[0];\n",
       "    this.context = canvas[0].getContext(\"2d\");\n",
       "\n",
       "    var backingStore = this.context.backingStorePixelRatio ||\n",
       "\tthis.context.webkitBackingStorePixelRatio ||\n",
       "\tthis.context.mozBackingStorePixelRatio ||\n",
       "\tthis.context.msBackingStorePixelRatio ||\n",
       "\tthis.context.oBackingStorePixelRatio ||\n",
       "\tthis.context.backingStorePixelRatio || 1;\n",
       "\n",
       "    mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
       "\n",
       "    var rubberband = $('<canvas/>');\n",
       "    rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
       "\n",
       "    var pass_mouse_events = true;\n",
       "\n",
       "    canvas_div.resizable({\n",
       "        start: function(event, ui) {\n",
       "            pass_mouse_events = false;\n",
       "        },\n",
       "        resize: function(event, ui) {\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "        stop: function(event, ui) {\n",
       "            pass_mouse_events = true;\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "    });\n",
       "\n",
       "    function mouse_event_fn(event) {\n",
       "        if (pass_mouse_events)\n",
       "            return fig.mouse_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    rubberband.mousedown('button_press', mouse_event_fn);\n",
       "    rubberband.mouseup('button_release', mouse_event_fn);\n",
       "    // Throttle sequential mouse events to 1 every 20ms.\n",
       "    rubberband.mousemove('motion_notify', mouse_event_fn);\n",
       "\n",
       "    rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
       "    rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
       "\n",
       "    canvas_div.on(\"wheel\", function (event) {\n",
       "        event = event.originalEvent;\n",
       "        event['data'] = 'scroll'\n",
       "        if (event.deltaY < 0) {\n",
       "            event.step = 1;\n",
       "        } else {\n",
       "            event.step = -1;\n",
       "        }\n",
       "        mouse_event_fn(event);\n",
       "    });\n",
       "\n",
       "    canvas_div.append(canvas);\n",
       "    canvas_div.append(rubberband);\n",
       "\n",
       "    this.rubberband = rubberband;\n",
       "    this.rubberband_canvas = rubberband[0];\n",
       "    this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
       "    this.rubberband_context.strokeStyle = \"#000000\";\n",
       "\n",
       "    this._resize_canvas = function(width, height) {\n",
       "        // Keep the size of the canvas, canvas container, and rubber band\n",
       "        // canvas in synch.\n",
       "        canvas_div.css('width', width)\n",
       "        canvas_div.css('height', height)\n",
       "\n",
       "        canvas.attr('width', width * mpl.ratio);\n",
       "        canvas.attr('height', height * mpl.ratio);\n",
       "        canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
       "\n",
       "        rubberband.attr('width', width);\n",
       "        rubberband.attr('height', height);\n",
       "    }\n",
       "\n",
       "    // Set the figure to an initial 600x600px, this will subsequently be updated\n",
       "    // upon first draw.\n",
       "    this._resize_canvas(600, 600);\n",
       "\n",
       "    // Disable right mouse context menu.\n",
       "    $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\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 nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\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",
       "            // put a spacer in here.\n",
       "            continue;\n",
       "        }\n",
       "        var button = $('<button/>');\n",
       "        button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
       "                        'ui-button-icon-only');\n",
       "        button.attr('role', 'button');\n",
       "        button.attr('aria-disabled', 'false');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "\n",
       "        var icon_img = $('<span/>');\n",
       "        icon_img.addClass('ui-button-icon-primary ui-icon');\n",
       "        icon_img.addClass(image);\n",
       "        icon_img.addClass('ui-corner-all');\n",
       "\n",
       "        var tooltip_span = $('<span/>');\n",
       "        tooltip_span.addClass('ui-button-text');\n",
       "        tooltip_span.html(tooltip);\n",
       "\n",
       "        button.append(icon_img);\n",
       "        button.append(tooltip_span);\n",
       "\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    var fmt_picker_span = $('<span/>');\n",
       "\n",
       "    var fmt_picker = $('<select/>');\n",
       "    fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
       "    fmt_picker_span.append(fmt_picker);\n",
       "    nav_element.append(fmt_picker_span);\n",
       "    this.format_dropdown = fmt_picker[0];\n",
       "\n",
       "    for (var ind in mpl.extensions) {\n",
       "        var fmt = mpl.extensions[ind];\n",
       "        var option = $(\n",
       "            '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
       "        fmt_picker.append(option)\n",
       "    }\n",
       "\n",
       "    // Add hover states to the ui-buttons\n",
       "    $( \".ui-button\" ).hover(\n",
       "        function() { $(this).addClass(\"ui-state-hover\");},\n",
       "        function() { $(this).removeClass(\"ui-state-hover\");}\n",
       "    );\n",
       "\n",
       "    var status_bar = $('<span class=\"mpl-message\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\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",
       "\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",
       "\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]);\n",
       "        fig.send_message(\"refresh\", {});\n",
       "    };\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
       "    var x0 = msg['x0'] / mpl.ratio;\n",
       "    var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
       "    var x1 = msg['x1'] / mpl.ratio;\n",
       "    var y1 = (fig.canvas.height - msg['y1']) / mpl.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, 0, fig.canvas.width, fig.canvas.height);\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",
       "    {\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.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",
       "            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
       "                evt.data);\n",
       "            fig.updated_canvas_event();\n",
       "            fig.waiting = false;\n",
       "            return;\n",
       "        }\n",
       "        else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\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(\"No handler for the '\" + msg_type + \"' message type: \", msg);\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(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\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",
       "    if (e.target)\n",
       "        targ = e.target;\n",
       "    else if (e.srcElement)\n",
       "        targ = e.srcElement;\n",
       "    if (targ.nodeType == 3) // defeat Safari bug\n",
       "        targ = targ.parentNode;\n",
       "\n",
       "    // jQuery normalizes the pageX and pageY\n",
       "    // pageX,Y are the mouse positions relative to the document\n",
       "    // offset() returns the position of the element relative to the document\n",
       "    var x = e.pageX - $(targ).offset().left;\n",
       "    var y = e.pageY - $(targ).offset().top;\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",
       "    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",
       "    {\n",
       "        this.canvas.focus();\n",
       "        this.canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    var x = canvas_pos.x * mpl.ratio;\n",
       "    var y = canvas_pos.y * mpl.ratio;\n",
       "\n",
       "    this.send_message(name, {x: x, y: y, button: event.button,\n",
       "                             step: event.step,\n",
       "                             guiEvent: simpleKeys(event)});\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",
       "\n",
       "    // Prevent repeat events\n",
       "    if (name == 'key_press')\n",
       "    {\n",
       "        if (event.which === this._key)\n",
       "            return;\n",
       "        else\n",
       "            this._key = event.which;\n",
       "    }\n",
       "    if (name == 'key_release')\n",
       "        this._key = null;\n",
       "\n",
       "    var value = '';\n",
       "    if (event.ctrlKey && event.which != 17)\n",
       "        value += \"ctrl+\";\n",
       "    if (event.altKey && event.which != 18)\n",
       "        value += \"alt+\";\n",
       "    if (event.shiftKey && event.which != 16)\n",
       "        value += \"shift+\";\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,\n",
       "                             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",
       "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\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"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\";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 overriden (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 = $(\"#\" + id);\n",
       "    var ws_proxy = comm_websocket_adapter(comm)\n",
       "\n",
       "    function ondownload(figure, format) {\n",
       "        window.open(figure.imageObj.src);\n",
       "    }\n",
       "\n",
       "    var fig = new mpl.figure(id, ws_proxy,\n",
       "                           ondownload,\n",
       "                           element.get(0));\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.get(0);\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",
       "\n",
       "    var output_index = fig.cell_info[2]\n",
       "    var cell = fig.cell_info[0];\n",
       "\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_close = function(fig, msg) {\n",
       "    var width = fig.canvas.width/mpl.ratio\n",
       "    fig.root.unbind('remove')\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).html('<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/mpl.ratio\n",
       "    var dataURL = this.canvas.toDataURL();\n",
       "    this.cell_info[1]['text/html'] = '<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 () { fig.push_to_output() }, 1000);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\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) { continue; };\n",
       "\n",
       "        var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    // Add the status bar.\n",
       "    var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\n",
       "\n",
       "    // Add the close button to the window.\n",
       "    var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
       "    var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
       "    button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
       "    button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
       "    buttongrp.append(button);\n",
       "    var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
       "    titlebar.prepend(buttongrp);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(el){\n",
       "    var fig = this\n",
       "    el.on(\"remove\", function(){\n",
       "\tfig.close_ws(fig, {});\n",
       "    });\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(el){\n",
       "    // this is important to make the div 'focusable\n",
       "    el.attr('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",
       "    }\n",
       "    else {\n",
       "        // location in version 2\n",
       "        IPython.keyboard_manager.register_events(el);\n",
       "    }\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",
       "    // 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",
       "\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('matplotlib', mpl.mpl_figure_comm);\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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6urMbE8gfOSRR2zo0KFWVVVln/3sZ+31119vef3mzZvtrLPOst69e1unTp3skEMOsXvuuafl+UWLFtnXvvY169Spk/Xq1ct++MMf2ocfftjyfGYg7N+/v91yyy1pfTz66KNt7NixLc/LCWQmyfr3798y3DPPPGNf+MIXrKqqygYOHGg1NTX2ySd7bmcxduxY69evn3Xs2NEOOuggGzlypOc0IRAC+UEgBAAAiZfPQJjtvpaF8MQTT9iTTz5py5cvt/nz59upp55qRx55pO3ataslEB588MH2xBNPWG1trZ1//vnWvXv3lvsuXnTRRfb5z3/e5syZY6tXr7ZXXnnFnnvuOTMz27p1q/Xp08e+9a1v2eLFi23q1Kk2cOBAGz58eMv4owbC999/3yTZvffeaw0NDfb++++bmdlf//pXq66utvvuu89WrlxpL7/8sg0YMMBqamrMzOzxxx+36upqmzx5sq1du9ZmzZpl48aN85wmBEIgPwiEAAAg8fIVCOsbm1rCYKoNGjOp6Pe3TAWuxYsXtwTC3//+9y3Pf/LJJ3bwwQfbddddZ2Zmp556qo0YMcLzvcaNG2c9e/a0jz76qOWxSZMm2d57723vvfeemUUPhGbeh4yecMIJds0116Q99sADD9hBBx1kZmY33XSTHXbYYbZjx46s04BACOQHgRAAACRevgLhjLqNaWEw1WbWbcpTT70tX77cvve979nAgQOte/fu1rVrV5NkkyZNagmE06ZNS3vN6aefbueee66ZmU2ePNk6d+5sRx99tI0aNcpmzJjRMtyll15qxx9/fNprGxsb094zX4Ewdchq165dW1qnTp1Mkm3dutXWrVtn/fr1s4MPPtjOP/98e+qpp9IOJ3UjEAL5QSAEAACJF/c9hIcffrh94xvfsClTplhtba0tWbKkJXAFBUL3XsH333/f7r33Xjv77LOtU6dOdtlll5mZ2SWXXGJf+9rX0l6bCoTTp083s9aBcODAgXbzzTenveaII47IGgg7depk1113na1YsaJV27Vrl5mZNTU12bPPPmsjR460Aw880IYOHeq5x5BACOQHgRAAACRevs8hHDRmUksYLPQ5hJs2bUoLZ2bOuXjKCISpw0PNnENG+/Xrl/aY21133WXdu3c3s9wOGR0yZIiNGjWq5e8tW7ZY586d0wJhhw4d7Iknnkgb73HHHWfnnXde6M++dOlSk2Rz585t9RyBEMgPAiEAAEi8QlxldGbdpqKcO7hr1y7bd9997ZxzzrEVK1bY1KlT7ZhjjmkVCD/1qU/ZU089Ze+884796Ec/sm7dutnGjRvNzOyKK66wZ555xlasWGFLliyxU045xYYMGWJmzkVlDjroIPv2t79tixcvtldffdUGDRoUeFGZMWPG2IEHHmjTp0+3RYsW2emnn27dunVLC4SHHnqoXXjhhdbQ0GCbN282M7MXX3zR2rdvbzU1NbZkyRKrra21Rx55xH7961+bmdm9995rd999ty1evNhWrlxpl19+uXXu3Lnl4jhuBEIgPwiEAAAg8eJ+H8JXXnnFBg8ebFVVVXbUUUfZ66+/3ioQPvzwwzZkyBDr2LGjHXHEEfbqq6+2vP6qq66ywYMHW+fOna1Xr1522mmn2apVq1qej3rbiS1bttiZZ55p1dXV1q9fP7vvvvtanUP43HPP2SGHHGLt27dPu+3Eiy++aMcdd5x17tzZqqurbciQIS1XEn366aft2GOPterqauvatat96UtfsilTpnhOEwIhkB8EQgAAkHhxD4RojUAI5AeBEAAAJB6BMHkIhEB+EAgBAEDiEQiTh0AI5AeBEAAAJB6BMHkIhEB+EAgBAEDiEQiTh0AI5AeBEAAAJB6BMHkIhEB+EAgBAEDiEQiTh0AI5AeBEAAAJB6BMHkIhEB+EAgBAEDiEQiTh0AI5AeBEAAAJB6B0Gzs2LF29NFHt/w9fPhwO+2000rYo7YhEAL5QSAEAACJRyBsHQgbGxvtH//4R17Hce+991qPHj3y+p5+CISAVCNnRne3pRHfg0AIAAASr1IC4e7du+2TTz7xfC4zEBYCgRAorhpJSyQd6Gq9I74HgRAAACRenAPhxx9/bCNHjrT99tvPqqqq7Mtf/rLNnj3bzMxee+01k2STJ0+2f/mXf7EOHTrYa6+9ZmZm1157re2///7WrVs3O++882z06NGBh4wOGzbMRo4caaNGjbKePXvaAQccYGPHjk3ry0033WSf+9znrEuXLnbwwQfbhRdeaB9++GFaX9wt9fqPP/7YLrvsMuvTp4916dLFhgwZ0tJPM7M1a9bYKaecYvvss4916dLFjjjiCJs0aVLgdCEQAk4gXNDG9yAQAgCAxMt7IGzcYLZqmvNvgf30pz+1Pn362OTJk+3tt9+24cOHW8+ePe2DDz5oCWFHHXWUvfzyy1ZXV2cffPCBPfroo1ZVVWV33323LV261H79619b9+7dswbC6upqq6mpseXLl9v9999ve+21l7388sstw9xyyy326quv2qpVq2zq1Kl2+OGH24UXXmhmZtu3b7dbb73VqqurraGhwRoaGlrC4vnnn2/HHXecTZ8+3erq6uyGG26wqqoqW758uZmZnXzyyXbiiSfaokWLbOXKlfb888/btGnTAqcLgRBwAuFWSfWSVkl6SNKnIr4HgRAAACReXgPh3PvNavYxG1vt/Dv3/ra/p4+PPvrIOnToYA899FDLYzt27LA+ffrY9ddf3xIIn3nmmbTXDR061H784x+nPXbsscdmDYT/9m//lvaaY445xkaPHu3bv8cff9z23Xfflr+9Dhldu3attWvXzt599920x0844QT75S9/aWZmRx55pNXU1PiOxwuBEJD+U9J3JB0l6SRJMyWtldQ94DVVcr4YqdZXBEIAAJBweQuEjRv2hMFUq+lZsD2FCxcuNEm2Zs2atMdPP/10GzFiREsg3LAhffz77LOP3X9/elC95JJLsgbCzBD5zW9+00aMGNHy9yuvvGJf//rXrU+fPtatWzfr1KmTSbKPPvrIzLwD4cSJE02Sde3aNa21b9/ezjzzTDMz+/Of/2zt27e34447zq688kpbuHBh1mlDIARa20fSFkn/GzBMjVpfiIZACAAAEi1vgXDVtPQwmGqrpuenoxkWLFhgkmzt2rVpj5922ml23nnntQTCzKuF7rPPPjZ+/Pi0x8IEwosvvrjVeIYPH25mZqtXr7aqqiq75JJL7M0337Rly5bZX/7yl7TxewXCCRMmWLt27Wzp0qW2YsWKtNbQ0NAy3Lp16+zOO++0M844wzp06GC33XZb4LQhEALe5ki6NuB59hACAICKE9c9hB999JF17Nix1SGjffv2tRtuuME3EHodMvqlL32pTYHwiSeesPbt29uuXbtanr/qqqvSxv/QQw9Zt27d0t5j2bJlJsmmTw8fmseMGWNHHnlk4DAEQqC1bpI2S/pphNdwDiEAAEi8/J9D2HNPGCzgOYRmZhdffLH16dPHXnjhhbSLymzevNk3EE6YMME6depk99xzjy1btsyuvPLKUBeVCQqEqb2Vt956q61cudLGjx9vffv2TRv/jBkzTJJNmTLFNm7c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VUYBuBEIk4NACOQHgRBA4tU3NtnMuk3sGQQQ60A4bNgwu/jii0s2/uHDh9tpp51WNv0hEAL5QSAEAAAVg0CYu8xA+MEHH9g///nPkvWHQAjkB4EQAABUDAJh7jIDYakRCIH8IBACAICKkc9AWN/YZDPqNhbtcPRhw4bZRRddZBdddJFVV1fbvvvua5dffnnLzdkfeOAB++IXv2jdunWzAw44wL7//e/b3//+95bXb9682c466yzr3bu3derUyQ455BC75557Wp5ft26dfec737EePXpYr1697Jvf/KatXr265flsh4z279/frr76ahsxYoR169bN+vXrZ3/605/SPkO2cbz22mt2zDHHWJcuXaxHjx523HHH2Zo1azynB4EQyA8CIQAAqBj5CoQTZq9tuYrxwDETi3LBqmHDhlm3bt3s4osvtqVLl9qDDz5oXbp0sXHjxpmZ2V/+8hebPHmyrVy50t58800bOnSo/ed//mfL6y+66CL7/Oc/b3PmzLHVq1fbK6+8Ys8995yZme3YscMGDx5s5513ni1atMhqa2vtrLPOssMPP9y2b99uZuECYa9evewPf/iDrVixwq699lrbe++97Z133gk1jk8++cR69OhhP//5z62urs5qa2vtvvvus7VrvactgRDIDwIhAACoGPkIhKW6pc2wYcNs8ODBLXsEzcxGjx5tgwcP9hx+zpw5Jsk+/PBDMzM79dRTbcSIEZ7DPvDAA3b44Yenvff27dutc+fO9tJLL5lZuEB4zjnntPy9e/du23///e3OO+8MNY4PPvjAJNnrr78eanoQCIH8IBACAICKkY9AOKNuY1oYTLWZdZvy2NPWhg0b1irQPfPMM9a+fXvbuXOnvfXWW3bKKadYv379rFu3btalSxeTZG+//baZmU2ePNk6d+5sRx99tI0aNcpmzJjR8j4///nPrV27dta1a9e0ttdee9kf//hHMwsXCK+//vq0/h111FH2m9/8JvQ4zj33XKuqqrJTTjnFbr31Vquvr/edHgRCID8IhAAAoGLEfQ+hXyD86KOPbN9997WzzjrLpk+fbu+884699NJLJsnmz5/fMvz7779v9957r5199tnWqVMnu+yyy8zM7IILLrAhQ4bYihUrWrXGxkYzCxcIb7nllrT+HX300TZ27NjQ4zAzmzdvnl1zzTU2dOhQ69atm7355pue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\" width=\"900\">"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "pl.figure(figsize=(9,3))\n",
    "pl.subplot(2,1,1)\n",
    "pl.plot(d_dt,d_abs,'.',d_dt,d_ord,'.')\n",
    "pl.legend(('absolutes','ordinates'))\n",
    "pl.subplot(2,1,2)\n",
    "pl.plot(d_dt,np.asarray(d_abs) - np.asarray(d_ord),'.')\n",
    "pl.legend(('baselines',))\n",
    "\n",
    "# re-formats dates for better presentation\n",
    "pl.gcf().autofmt_xdate()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Plot of Z absolutes, ordinates, baselines\n",
    "Absolutes represent the field magnitude as measured by the overhauser (with the pier correction applied), and field direction measured by the theodolite.  Ordinates represent the variometer's reading of the field corresponding to the nearest times absolute measurements were taken. Baselines, or the difference between absolutes and ordinates, are presented in the bottom plot. All vertical axis units are nanoteslas."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "/* Put everything inside the global mpl namespace */\n",
       "window.mpl = {};\n",
       "\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('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",
       "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 = $('<div/>');\n",
       "    this._root_extra_style(this.root)\n",
       "    this.root.attr('style', 'display: inline-block');\n",
       "\n",
       "    $(parent_element).append(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 (mpl.ratio != 1) {\n",
       "                fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.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",
       "        this.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 = $(\n",
       "        '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
       "        'ui-helper-clearfix\"/>');\n",
       "    var titletext = $(\n",
       "        '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
       "        'text-align: center; padding: 3px;\"/>');\n",
       "    titlebar.append(titletext)\n",
       "    this.root.append(titlebar);\n",
       "    this.header = titletext[0];\n",
       "}\n",
       "\n",
       "\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_canvas = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var canvas_div = $('<div/>');\n",
       "\n",
       "    canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
       "\n",
       "    function canvas_keyboard_event(event) {\n",
       "        return fig.key_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    canvas_div.keydown('key_press', canvas_keyboard_event);\n",
       "    canvas_div.keyup('key_release', canvas_keyboard_event);\n",
       "    this.canvas_div = canvas_div\n",
       "    this._canvas_extra_style(canvas_div)\n",
       "    this.root.append(canvas_div);\n",
       "\n",
       "    var canvas = $('<canvas/>');\n",
       "    canvas.addClass('mpl-canvas');\n",
       "    canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
       "\n",
       "    this.canvas = canvas[0];\n",
       "    this.context = canvas[0].getContext(\"2d\");\n",
       "\n",
       "    var backingStore = this.context.backingStorePixelRatio ||\n",
       "\tthis.context.webkitBackingStorePixelRatio ||\n",
       "\tthis.context.mozBackingStorePixelRatio ||\n",
       "\tthis.context.msBackingStorePixelRatio ||\n",
       "\tthis.context.oBackingStorePixelRatio ||\n",
       "\tthis.context.backingStorePixelRatio || 1;\n",
       "\n",
       "    mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
       "\n",
       "    var rubberband = $('<canvas/>');\n",
       "    rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
       "\n",
       "    var pass_mouse_events = true;\n",
       "\n",
       "    canvas_div.resizable({\n",
       "        start: function(event, ui) {\n",
       "            pass_mouse_events = false;\n",
       "        },\n",
       "        resize: function(event, ui) {\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "        stop: function(event, ui) {\n",
       "            pass_mouse_events = true;\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "    });\n",
       "\n",
       "    function mouse_event_fn(event) {\n",
       "        if (pass_mouse_events)\n",
       "            return fig.mouse_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    rubberband.mousedown('button_press', mouse_event_fn);\n",
       "    rubberband.mouseup('button_release', mouse_event_fn);\n",
       "    // Throttle sequential mouse events to 1 every 20ms.\n",
       "    rubberband.mousemove('motion_notify', mouse_event_fn);\n",
       "\n",
       "    rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
       "    rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
       "\n",
       "    canvas_div.on(\"wheel\", function (event) {\n",
       "        event = event.originalEvent;\n",
       "        event['data'] = 'scroll'\n",
       "        if (event.deltaY < 0) {\n",
       "            event.step = 1;\n",
       "        } else {\n",
       "            event.step = -1;\n",
       "        }\n",
       "        mouse_event_fn(event);\n",
       "    });\n",
       "\n",
       "    canvas_div.append(canvas);\n",
       "    canvas_div.append(rubberband);\n",
       "\n",
       "    this.rubberband = rubberband;\n",
       "    this.rubberband_canvas = rubberband[0];\n",
       "    this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
       "    this.rubberband_context.strokeStyle = \"#000000\";\n",
       "\n",
       "    this._resize_canvas = function(width, height) {\n",
       "        // Keep the size of the canvas, canvas container, and rubber band\n",
       "        // canvas in synch.\n",
       "        canvas_div.css('width', width)\n",
       "        canvas_div.css('height', height)\n",
       "\n",
       "        canvas.attr('width', width * mpl.ratio);\n",
       "        canvas.attr('height', height * mpl.ratio);\n",
       "        canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
       "\n",
       "        rubberband.attr('width', width);\n",
       "        rubberband.attr('height', height);\n",
       "    }\n",
       "\n",
       "    // Set the figure to an initial 600x600px, this will subsequently be updated\n",
       "    // upon first draw.\n",
       "    this._resize_canvas(600, 600);\n",
       "\n",
       "    // Disable right mouse context menu.\n",
       "    $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\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 nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\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",
       "            // put a spacer in here.\n",
       "            continue;\n",
       "        }\n",
       "        var button = $('<button/>');\n",
       "        button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
       "                        'ui-button-icon-only');\n",
       "        button.attr('role', 'button');\n",
       "        button.attr('aria-disabled', 'false');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "\n",
       "        var icon_img = $('<span/>');\n",
       "        icon_img.addClass('ui-button-icon-primary ui-icon');\n",
       "        icon_img.addClass(image);\n",
       "        icon_img.addClass('ui-corner-all');\n",
       "\n",
       "        var tooltip_span = $('<span/>');\n",
       "        tooltip_span.addClass('ui-button-text');\n",
       "        tooltip_span.html(tooltip);\n",
       "\n",
       "        button.append(icon_img);\n",
       "        button.append(tooltip_span);\n",
       "\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    var fmt_picker_span = $('<span/>');\n",
       "\n",
       "    var fmt_picker = $('<select/>');\n",
       "    fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
       "    fmt_picker_span.append(fmt_picker);\n",
       "    nav_element.append(fmt_picker_span);\n",
       "    this.format_dropdown = fmt_picker[0];\n",
       "\n",
       "    for (var ind in mpl.extensions) {\n",
       "        var fmt = mpl.extensions[ind];\n",
       "        var option = $(\n",
       "            '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
       "        fmt_picker.append(option)\n",
       "    }\n",
       "\n",
       "    // Add hover states to the ui-buttons\n",
       "    $( \".ui-button\" ).hover(\n",
       "        function() { $(this).addClass(\"ui-state-hover\");},\n",
       "        function() { $(this).removeClass(\"ui-state-hover\");}\n",
       "    );\n",
       "\n",
       "    var status_bar = $('<span class=\"mpl-message\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\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",
       "\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",
       "\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]);\n",
       "        fig.send_message(\"refresh\", {});\n",
       "    };\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
       "    var x0 = msg['x0'] / mpl.ratio;\n",
       "    var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
       "    var x1 = msg['x1'] / mpl.ratio;\n",
       "    var y1 = (fig.canvas.height - msg['y1']) / mpl.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, 0, fig.canvas.width, fig.canvas.height);\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",
       "    {\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.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",
       "            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
       "                evt.data);\n",
       "            fig.updated_canvas_event();\n",
       "            fig.waiting = false;\n",
       "            return;\n",
       "        }\n",
       "        else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\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(\"No handler for the '\" + msg_type + \"' message type: \", msg);\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(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\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",
       "    if (e.target)\n",
       "        targ = e.target;\n",
       "    else if (e.srcElement)\n",
       "        targ = e.srcElement;\n",
       "    if (targ.nodeType == 3) // defeat Safari bug\n",
       "        targ = targ.parentNode;\n",
       "\n",
       "    // jQuery normalizes the pageX and pageY\n",
       "    // pageX,Y are the mouse positions relative to the document\n",
       "    // offset() returns the position of the element relative to the document\n",
       "    var x = e.pageX - $(targ).offset().left;\n",
       "    var y = e.pageY - $(targ).offset().top;\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",
       "    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",
       "    {\n",
       "        this.canvas.focus();\n",
       "        this.canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    var x = canvas_pos.x * mpl.ratio;\n",
       "    var y = canvas_pos.y * mpl.ratio;\n",
       "\n",
       "    this.send_message(name, {x: x, y: y, button: event.button,\n",
       "                             step: event.step,\n",
       "                             guiEvent: simpleKeys(event)});\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",
       "\n",
       "    // Prevent repeat events\n",
       "    if (name == 'key_press')\n",
       "    {\n",
       "        if (event.which === this._key)\n",
       "            return;\n",
       "        else\n",
       "            this._key = event.which;\n",
       "    }\n",
       "    if (name == 'key_release')\n",
       "        this._key = null;\n",
       "\n",
       "    var value = '';\n",
       "    if (event.ctrlKey && event.which != 17)\n",
       "        value += \"ctrl+\";\n",
       "    if (event.altKey && event.which != 18)\n",
       "        value += \"alt+\";\n",
       "    if (event.shiftKey && event.which != 16)\n",
       "        value += \"shift+\";\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,\n",
       "                             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",
       "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\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"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\";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 overriden (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 = $(\"#\" + id);\n",
       "    var ws_proxy = comm_websocket_adapter(comm)\n",
       "\n",
       "    function ondownload(figure, format) {\n",
       "        window.open(figure.imageObj.src);\n",
       "    }\n",
       "\n",
       "    var fig = new mpl.figure(id, ws_proxy,\n",
       "                           ondownload,\n",
       "                           element.get(0));\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.get(0);\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",
       "\n",
       "    var output_index = fig.cell_info[2]\n",
       "    var cell = fig.cell_info[0];\n",
       "\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_close = function(fig, msg) {\n",
       "    var width = fig.canvas.width/mpl.ratio\n",
       "    fig.root.unbind('remove')\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).html('<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/mpl.ratio\n",
       "    var dataURL = this.canvas.toDataURL();\n",
       "    this.cell_info[1]['text/html'] = '<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 () { fig.push_to_output() }, 1000);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\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) { continue; };\n",
       "\n",
       "        var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    // Add the status bar.\n",
       "    var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\n",
       "\n",
       "    // Add the close button to the window.\n",
       "    var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
       "    var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
       "    button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
       "    button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
       "    buttongrp.append(button);\n",
       "    var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
       "    titlebar.prepend(buttongrp);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(el){\n",
       "    var fig = this\n",
       "    el.on(\"remove\", function(){\n",
       "\tfig.close_ws(fig, {});\n",
       "    });\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(el){\n",
       "    // this is important to make the div 'focusable\n",
       "    el.attr('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",
       "    }\n",
       "    else {\n",
       "        // location in version 2\n",
       "        IPython.keyboard_manager.register_events(el);\n",
       "    }\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",
       "    // 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",
       "\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('matplotlib', mpl.mpl_figure_comm);\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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e/TRR+2xxx6zFStW2MKFC+3kk0+2I444wnbu3NkSCA844AB79NFHra6uzs455xzr1atXy76L559/vn3qU5+y+fPn25o1a+y5556zp556yszMtm7dav3797dvfvObtnTpUps1a5YNGTLERo4c2XL+qIHwnXfeMUl2zz332MaNG+2dd94xM7O//e1vVl1dbffee6+tWrXKZsyYYYMHD7aamhozM3vkkUesurrapk2bZg0NDfbKK6/Y+PHjfZ8TAiGQHwRCAABQ8fIVCBubmlvCYLIcOHZq0XoKk5KBa+nSpS2B8He/+13L9R999JEdcMABdu2115qZ2cknn2xnnXWW732NHz/e+vTpYx988EHLZVOnTrXddtvN3n77bTOLHgjN/IeMfulLX7Krr7467bKJEyfa/vvvb2ZmN9xwg3384x+37du3Z30OCIRAfhAIAQBAxctXIJxT/25aGEyWufWb8lRTfytWrLDTTz/dhgwZYr169bIePXqYJJs6dWpLIHzxxRfTbnPqqafaj370IzMzmzZtmnXr1s2GDRtmo0ePtjlz5rQcd9FFF9nnP//5tNs2NTWl3We+AmFyyGqPHj1aSteuXU2Sbd261datW2cDBw60Aw44wM455xybPHly2nDSVARCID8IhAAAoOLFvYfw0EMPtRNOOMFmzpxpdXV1tmzZspbAFRYIU3sF33nnHbvnnnvszDPPtK5du9oll1xiZmYXXnihfeELX0i7bTIQ1tbWmlnbQDhkyBC78cYb025z2GGHZQ2EXbt2tWuvvdZWrlzZpuzcudPMzJqbm+3JJ5+0UaNG2X777WcjRozw7TEkEAL5QSAEAAAVL99zCA8cO7UlDBZ6DuGmTZvSwpmZNxdPGYEwOTzUzBsyOnDgwLTLUt1+++3Wq1cvM8ttyOjw4cNt9OjRLT9v2bLFunXrlhYI99hjD3v00UfTznvsscfa2Wef7fzYly9fbpLstddea3MdgRDIDwIhAACoeIVYZXRu/aaizB3cuXOn7bXXXvb973/fVq5cabNmzbKjjjqqTSD82Mc+ZpMnT7Y33njDfvKTn1jPnj3t3XffNTOzyy+/3J544glbuXKlLVu2zE466SQbPny4mXmLyuy///72rW99y5YuXWrPP/+8HXjggaGLyowdO9b2228/q62ttSVLltipp55qPXv2TAuEhxxyiJ133nm2ceNG27x5s5mZPfvss9a5c2erqamxZcuWWV1dnf31r3+1X//612Zmds8999idd95pS5cutVWrVtlll11m3bp1a1kcJxWBEMgPAiEAAKh4cd+H8LnnnrOhQ4daVVWVHXnkkTZ79uw2gfDBBx+04cOHW5cuXeywww6z559/vuX2V155pQ0dOtS6detmffv2tVNOOcVWr17dcn3UbSe2bNli3/nOd6y6utoGDhxo9957b5s5hE899ZQdfPDB1rlz57RtJ5599lk79thjrVu3blZdXW3Dhw9vWUn08ccft6OPPtqqq6utR48edswxx9jMmTN9nxMCIZAfBEIAAFDx4h4I0RaBEMgPAiEAAKh4BMLKQyAE8oNACAAAKh6BsPIQCIH8IBACAICKRyCsPARCID8IhAAAoOIRCCsPgRDIDwIhAACoeATCykMgBPKDQAgAACoegbDyEAiB/CAQAgCAikcgrDwEQiA/CIQAAKDiEQgrD4EQyA8CIQAAqHgEwspDIATyg0AIAAAqHoHQbNy4cTZs2LCWn0eOHGmnnHJKCWvUPgRCID8IhAAAoOIRCNsGwqamJvvnP/+Z13Pcc8891rt377zeZxACIZAfBEIAAFDxOkog3LVrl3300Ue+12UGwkIgEALxQyAEAAAVL++BsGmD2eoXvX8L7N///reNGjXK9t57b6uqqrLjjjvO5s2bZ2ZmL7zwgkmyadOm2X/8x3/YHnvsYS+88IKZmV1zzTW2zz77WM+ePe3ss8+2MWPGhA4ZPf74423UqFE2evRo69Onj+277742bty4tLrccMMN9slPftK6d+9uBxxwgJ133nn2/vvvp9UltSRv/+9//9suueQS69+/v3Xv3t2GDx/eUk8zs7Vr19pJJ51ke+65p3Xv3t0OO+wwmzp1aujzQiAE8oNACAAAKl5eA+FrE8xq9jQbV+39+9qE9t9niJ///OfWv39/mzZtmr3++us2cuRI69Onj7333nstIezII4+0GTNmWH19vb333nv20EMPWVVVld155522fPly+/Wvf229evXKGgirq6utpqbGVqxYYRMmTLBOnTrZjBkzWo656aab7Pnnn7fVq1fbrFmz7NBDD7XzzjvPzMw+/PBDu/nmm626uto2btxoGzdubAmL55xzjh177LFWW1tr9fX19vvf/96qqqpsxYoVZmZ24okn2le+8hVb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r23XcOr33Lr+btDjjkpDIATcVVwgPP744+2CCy4o2flHjhxpp5xyStnUxyze7YnK4PqhP2iRjWz3XW7hqT3KceXUoDrlq1cprKd30rwGGzy29fVw8UMLIz8/UXoIsw3XvOzxJb71D+uNC11lNPH/sDl4xQpr9LijkhAIAXcEwjzLDITvvfee/etf/ypZfczi3Z6oHNk+bPoGQodhcS7hIJ+hMZeVKl2VYy9Ntj308lVfv94sl7l0LudznR/X2NRs455cGno+v5U9sy1YE3Z+1168YoW1SuxxR8dEIATcEQjzLDMQloM4tycqS9iHzai9Ta5hJJ89brmsVBlFMeZxRQ3H2epUyOekvattpspWz9TXSVA57baX2tyvS9jMV7sS1gB3BELAXUUGwvPPP9/OP/98q66utr322ssuu+yyln34Jk6caJ/5zGesZ8+etu+++9r3vvc9+8c//tFy+82bN9sZZ5xh/fr1s65du9rBBx9sd999d8v169ats29/+9vWu3dv69u3r33jG9+wNWvWtFyfbcjooEGD7KqrrrKzzjrLevbsaQMHDrS//OUvaY8h2zleeOEFO+qoo6x79+7Wu3dvO/bYY23t2rWBz0mc2xMdR9TeJpcP2fnswcplpcqoCt1DmLlQye2z633rkDlfL5cewpl1G+3SyYsD98rL5He86358rm2QuUJm6mPOFgbHv9j2uTJzG45ajj2/QKUjEALuihIIiznH5/jjj7eePXvaBRdcYMuXL7f777/funfvbuPHjzczs7vuusumTZtmq1atspdfftlGjBhhX//611tuf/7559unPvUpmz9/vq1Zs8aee+45e+qpp8zMbPv27TZ06FA7++yzbcmSJVZXV2dnnHGGHXroofbhhx+amVsg7Nu3r9122222cuVKu+aaa2y33XazN954w+kcH330kfXu3dt+8YtfWH19vdXV1dm9995rDQ3BvR4EQsRFlGFxxeyZMcttpcpcFKrHLSj03J4SdIJ6U4PaJej5/fINs0N71jL/Jpx220tpx5/4h1ozc9sMfdCY1pU5c5Vtn8CwocuuXxQwPw8oLgIh4K7ggbDYCyQcf/zxNnTo0JYeQTOzMWPG2NChQ32Pnz9/vkmy999/38zMTj75ZDvrrLN8j504caIdeuihaff94YcfWrdu3Wz69Olm5hYIv//977f8vGvXLttn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\" width=\"900\">"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "pl.figure(figsize=(9,3))\n",
    "pl.subplot(2,1,1)\n",
    "pl.plot(z_dt,z_abs,'.',z_dt,z_ord,'.')\n",
    "pl.legend(('absolutes', 'ordinates'))\n",
    "pl.subplot(2,1,2)\n",
    "pl.plot(z_dt,np.asarray(z_abs) - np.asarray(z_ord),'.')\n",
    "pl.legend(('baselines',))\n",
    "\n",
    "# re-formats dates for better presentation\n",
    "pl.gcf().autofmt_xdate()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Note about averaging\n",
    "The baselines have up to four values, corresponding to the up to four sets measured by the observer.  Pre-averaging these does not improve the transformation matrix calculated by the least squares solver in scipy/numpy."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Calculate $(h,e,Z)_{variometer}$ from $(H,D,Z)_{ordinate}$ and $(X,Y,Z)_{absolute}$ from $(H,D,Z)_{absolute}$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# convert to NumPy arrays for convenience\n",
    "h_abs_n = np.asarray(h_abs)\n",
    "d_abs_n = np.asarray(d_abs)\n",
    "z_abs_n = np.asarray(z_abs)\n",
    "h_ord_n = np.asarray(h_ord)\n",
    "d_ord_n = np.asarray(d_ord)\n",
    "z_ord_n = np.asarray(z_ord)\n",
    "z_t_n = np.asarray(z_t)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# convert to Cartesian coordinates\n",
    "x_a = h_abs_n*np.cos(d_abs_n*np.pi/180)\n",
    "y_a = h_abs_n*np.sin(d_abs_n*np.pi/180)\n",
    "z_a = z_abs_n\n",
    "h_o = h_ord_n*np.cos(d_ord_n*np.pi/180)\n",
    "e_o = h_ord_n*np.sin(d_ord_n*np.pi/180)\n",
    "z_o = z_ord_n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Calculate Transform matrix"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "This cell contains code to constrain M to impose a uniform scaling factor. \n",
    "Its contents may be copy-pasted into an actual **code** cell if this is desirable.\n",
    "\n",
    "---\n",
    "\n",
    "```python\n",
    "\n",
    "# LHS, or dependent variables\n",
    "abs_st = np.vstack([x_a,y_a,z_a])\n",
    "abs_st_r = abs_st.T.ravel()\n",
    "\n",
    "# RHS, or independent variables\n",
    "# (reduces degrees of freedom by 6:\n",
    "#  - 2 for the common scaling factors, and\n",
    "#  - 4 for the last row of zeros and a one)\n",
    "ord_st = np.vstack([h_o,e_o,z_o])\n",
    "ord_st_r = ord_st.T.ravel()\n",
    "ord_st_m = np.zeros((10, ord_st_r.size))\n",
    "ord_st_m[0] = ord_st_r\n",
    "ord_st_m[1,0::3] = ord_st_r[1::3]\n",
    "ord_st_m[2,0::3] = ord_st_r[2::3]\n",
    "ord_st_m[3,0::3] = 1.\n",
    "ord_st_m[4,1::3] = ord_st_r[0::3]\n",
    "ord_st_m[5,1::3] = ord_st_r[2::3]\n",
    "ord_st_m[6,1::3] = 1.\n",
    "ord_st_m[7,2::3] = ord_st_r[0::3]\n",
    "ord_st_m[8,2::3] = ord_st_r[1::3]\n",
    "ord_st_m[9,2::3] = 1.\n",
    "\n",
    "# regression matrix M that minimizes L2 norm\n",
    "M_r, res, rank, sigma = spl.lstsq(ord_st_m.T,abs_st_r.T)\n",
    "\n",
    "M = np.zeros((4,4))\n",
    "M[0,0] = M_r[0]\n",
    "M[0,1] = M_r[1]\n",
    "M[0,2] = M_r[2]\n",
    "M[0,3] = M_r[3]\n",
    "M[1,0] = M_r[4]\n",
    "M[1,1] = M_r[0]\n",
    "M[1,2] = M_r[5]\n",
    "M[1,3] = M_r[6]\n",
    "M[2,0] = M_r[7]\n",
    "M[2,1] = M_r[8]\n",
    "M[2,2] = M_r[0]\n",
    "M[2,3] = M_r[9]\n",
    "M[3,:] = [0,0,0,1]     \n",
    "\n",
    "print np.array_str(M, precision=3)\n",
    "```\n",
    "\n",
    "---"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "This cell constrains M to rotate about the z-axis only, with a uniform \n",
    "scaling in the x,y plane. Its contents may be copy-pasted into an actual \n",
    "**code** cell if this is desirable.\n",
    "\n",
    "---\n",
    "\n",
    "```python\n",
    "\n",
    "# LHS, or dependent variables\n",
    "abs_st = np.vstack([x_a,y_a,z_a])\n",
    "abs_st_r = abs_st.T.ravel()\n",
    "\n",
    "# RHS, or independent variables\n",
    "# (reduces degrees of freedom by 11:\n",
    "#  - 2 for making x,y independent of z;\n",
    "#  - 3 for making z independent of x,y\n",
    "#  - 2 for not allowing shear in x,y; and\n",
    "#  - 4 for the last row of zeros and a one)\n",
    "ord_st = np.vstack([h_o,e_o,z_o])\n",
    "ord_st_r = ord_st.T.ravel()\n",
    "ord_st_m = np.zeros((6, ord_st_r.size))\n",
    "ord_st_m[0,0::3] = ord_st_r[0::3]\n",
    "ord_st_m[0,1::3] = ord_st_r[1::3]\n",
    "ord_st_m[1,0::3] = ord_st_r[1::3]\n",
    "ord_st_m[1,1::3] = -ord_st_r[0::3]\n",
    "ord_st_m[2,0::3] = 1.\n",
    "ord_st_m[3,1::3] = 1.\n",
    "ord_st_m[4,2::3] = ord_st_r[2::3]\n",
    "ord_st_m[5,2::3] = 1.\n",
    "\n",
    "# regression matrix M that minimizes L2 norm\n",
    "M_r, res, rank, sigma = spl.lstsq(ord_st_m.T,abs_st_r.T)\n",
    "\n",
    "M = np.zeros((4,4))\n",
    "M[0,0] = M_r[0]\n",
    "M[0,1] = M_r[1]\n",
    "M[0,2] = 0.0\n",
    "M[0,3] = M_r[2]\n",
    "M[1,0] = -M_r[1]\n",
    "M[1,1] = M_r[0]\n",
    "M[1,2] = 0.0\n",
    "M[1,3] = M_r[3]\n",
    "M[2,0] = 0.0\n",
    "M[2,1] = 0.0\n",
    "M[2,2] = M_r[4]\n",
    "M[2,3] = M_r[5]\n",
    "M[3,:] = [0,0,0,1]     \n",
    "\n",
    "print np.array_str(M, precision=3)\n",
    "```\n",
    "\n",
    "---"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[  9.878e-01  -1.461e-01   2.521e-02  -1.262e+03]\n",
      " [  1.682e-01   1.000e+00  -1.532e-02   4.615e+02]\n",
      " [ -1.663e-02  -5.521e-03   1.007e+00   6.099e+02]\n",
      " [  0.000e+00   0.000e+00  -0.000e+00   1.000e+00]]\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/erigler/local/lib/python2.7/site-packages/scipy/linalg/basic.py:1018: RuntimeWarning: internal gelsd driver lwork query error, required iwork dimension not returned. This is likely the result of LAPACK bug 0038, fixed in LAPACK 3.2.2 (released July 21, 2010). Falling back to 'gelss' driver.\n",
      "  warnings.warn(mesg, RuntimeWarning)\n"
     ]
    }
   ],
   "source": [
    "# No constraints, allow all degrees of freedom for M\n",
    "\n",
    "# LHS, or dependent variables\n",
    "abs_st = np.vstack([x_a,y_a,z_a,np.ones_like(x_a)])\n",
    "\n",
    "# RHS, or independent variables\n",
    "ord_st = np.vstack([h_o,e_o,z_o,np.ones_like(h_o)])\n",
    "\n",
    "# regression matrix M that minimizes L2 norm\n",
    "M, res, rank, sigma = spl.lstsq(ord_st.T,abs_st.T)\n",
    "\n",
    "# clean up a bit by applying a threshold...this is mostly for aesthetics\n",
    "tol = 1e-9\n",
    "maskM = np.abs(M) > tol\n",
    "M = maskM * M\n",
    "\n",
    "# transpose matrix to operate on data whose vector components are stored\n",
    "# as column vectors (this is NOT a universal standard, but common enough)\n",
    "M = M.T\n",
    "\n",
    "print np.array_str(M, precision=3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Enter path to save adjusted statefile"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "path = './'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "data = {\n",
    "            'M11': M[0,0],\n",
    "            'M12': M[0,1],\n",
    "            'M13': M[0,2],\n",
    "            'M14': M[0,3],\n",
    "            'M21': M[1,0],\n",
    "            'M22': M[1,1],\n",
    "            'M23': M[1,2],\n",
    "            'M24': M[1,3],\n",
    "            'M31': M[2,0],\n",
    "            'M32': M[2,1],\n",
    "            'M33': M[2,2],\n",
    "            'M34': M[2,3],\n",
    "            'M41': M[3,0],\n",
    "            'M42': M[3,1],\n",
    "            'M43': M[3,2],\n",
    "            'M44': M[3,3],\n",
    "            'PC':  pier_correction\n",
    "        }\n",
    "with open(path + 'adj' + obs_code + '_state_.json', 'w') as f:\n",
    "            f.write(json.dumps(data))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Enter Start and End Times for Test month(s)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "start2=UTCDateTime('2015-03-01T00:00:00Z')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "end2=UTCDateTime('2015-03-31T23:59:59Z')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# pull raw data from Edge server\n",
    "factory = EdgeFactory()\n",
    "\n",
    "hezf = factory.get_timeseries(observatory=obs_code,\n",
    "        interval='minute',\n",
    "        type='variation',\n",
    "        channels=('H', 'E', 'Z', 'F'),\n",
    "        starttime=start2,\n",
    "        endtime=end2)\n",
    "\n",
    "dt_test = np.array([(hezf[0].stats.starttime + second).datetime for second in hezf[0].times()])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# apply affine transformation matrix to raw data to generate Adjusted Data\n",
    "raw = np.vstack([hezf[0].data,hezf[1].data,hezf[2].data,np.ones_like(hezf[0].data)])\n",
    "adj = np.dot(M,raw)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# generate averaged static baselines, then estimate an alternate Adjusted Data stream\n",
    "# (this amounts to the traditional method for [Quasi]Definitive Data processing)\n",
    "h_pqqm = np.mean(h_abs_n - h_ord_n)\n",
    "d_pqqm = np.mean(d_abs_n - d_ord_n)\n",
    "z_pqqm = np.mean(z_abs_n - z_ord_n)\n",
    "\n",
    "def_h = (raw[0]**2 + raw[1]**2)**0.5 + h_pqqm\n",
    "def_d = np.arctan2(raw[1], raw[0]) * 180./np.pi + d_pqqm\n",
    "def_z = raw[2] + z_pqqm\n",
    "def_f = (def_h**2 + def_z**2)**0.5\n",
    "def_x = def_h * np.cos(def_d * np.pi/180.)\n",
    "def_y = def_h * np.sin(def_d * np.pi/180.)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Plot of $\\Delta F$ Over the Test Period\n",
    "The left plot (black) shows adjusted delta F, the cyan shows adjusted delta F using average baselines over the period (instead of the transformation).  The blue on the right shows raw delta F."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "collapsed": false,
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "/* Put everything inside the global mpl namespace */\n",
       "window.mpl = {};\n",
       "\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('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",
       "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 = $('<div/>');\n",
       "    this._root_extra_style(this.root)\n",
       "    this.root.attr('style', 'display: inline-block');\n",
       "\n",
       "    $(parent_element).append(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 (mpl.ratio != 1) {\n",
       "                fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.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",
       "        this.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 = $(\n",
       "        '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
       "        'ui-helper-clearfix\"/>');\n",
       "    var titletext = $(\n",
       "        '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
       "        'text-align: center; padding: 3px;\"/>');\n",
       "    titlebar.append(titletext)\n",
       "    this.root.append(titlebar);\n",
       "    this.header = titletext[0];\n",
       "}\n",
       "\n",
       "\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_canvas = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var canvas_div = $('<div/>');\n",
       "\n",
       "    canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
       "\n",
       "    function canvas_keyboard_event(event) {\n",
       "        return fig.key_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    canvas_div.keydown('key_press', canvas_keyboard_event);\n",
       "    canvas_div.keyup('key_release', canvas_keyboard_event);\n",
       "    this.canvas_div = canvas_div\n",
       "    this._canvas_extra_style(canvas_div)\n",
       "    this.root.append(canvas_div);\n",
       "\n",
       "    var canvas = $('<canvas/>');\n",
       "    canvas.addClass('mpl-canvas');\n",
       "    canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
       "\n",
       "    this.canvas = canvas[0];\n",
       "    this.context = canvas[0].getContext(\"2d\");\n",
       "\n",
       "    var backingStore = this.context.backingStorePixelRatio ||\n",
       "\tthis.context.webkitBackingStorePixelRatio ||\n",
       "\tthis.context.mozBackingStorePixelRatio ||\n",
       "\tthis.context.msBackingStorePixelRatio ||\n",
       "\tthis.context.oBackingStorePixelRatio ||\n",
       "\tthis.context.backingStorePixelRatio || 1;\n",
       "\n",
       "    mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
       "\n",
       "    var rubberband = $('<canvas/>');\n",
       "    rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
       "\n",
       "    var pass_mouse_events = true;\n",
       "\n",
       "    canvas_div.resizable({\n",
       "        start: function(event, ui) {\n",
       "            pass_mouse_events = false;\n",
       "        },\n",
       "        resize: function(event, ui) {\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "        stop: function(event, ui) {\n",
       "            pass_mouse_events = true;\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "    });\n",
       "\n",
       "    function mouse_event_fn(event) {\n",
       "        if (pass_mouse_events)\n",
       "            return fig.mouse_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    rubberband.mousedown('button_press', mouse_event_fn);\n",
       "    rubberband.mouseup('button_release', mouse_event_fn);\n",
       "    // Throttle sequential mouse events to 1 every 20ms.\n",
       "    rubberband.mousemove('motion_notify', mouse_event_fn);\n",
       "\n",
       "    rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
       "    rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
       "\n",
       "    canvas_div.on(\"wheel\", function (event) {\n",
       "        event = event.originalEvent;\n",
       "        event['data'] = 'scroll'\n",
       "        if (event.deltaY < 0) {\n",
       "            event.step = 1;\n",
       "        } else {\n",
       "            event.step = -1;\n",
       "        }\n",
       "        mouse_event_fn(event);\n",
       "    });\n",
       "\n",
       "    canvas_div.append(canvas);\n",
       "    canvas_div.append(rubberband);\n",
       "\n",
       "    this.rubberband = rubberband;\n",
       "    this.rubberband_canvas = rubberband[0];\n",
       "    this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
       "    this.rubberband_context.strokeStyle = \"#000000\";\n",
       "\n",
       "    this._resize_canvas = function(width, height) {\n",
       "        // Keep the size of the canvas, canvas container, and rubber band\n",
       "        // canvas in synch.\n",
       "        canvas_div.css('width', width)\n",
       "        canvas_div.css('height', height)\n",
       "\n",
       "        canvas.attr('width', width * mpl.ratio);\n",
       "        canvas.attr('height', height * mpl.ratio);\n",
       "        canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
       "\n",
       "        rubberband.attr('width', width);\n",
       "        rubberband.attr('height', height);\n",
       "    }\n",
       "\n",
       "    // Set the figure to an initial 600x600px, this will subsequently be updated\n",
       "    // upon first draw.\n",
       "    this._resize_canvas(600, 600);\n",
       "\n",
       "    // Disable right mouse context menu.\n",
       "    $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\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 nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\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",
       "            // put a spacer in here.\n",
       "            continue;\n",
       "        }\n",
       "        var button = $('<button/>');\n",
       "        button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
       "                        'ui-button-icon-only');\n",
       "        button.attr('role', 'button');\n",
       "        button.attr('aria-disabled', 'false');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "\n",
       "        var icon_img = $('<span/>');\n",
       "        icon_img.addClass('ui-button-icon-primary ui-icon');\n",
       "        icon_img.addClass(image);\n",
       "        icon_img.addClass('ui-corner-all');\n",
       "\n",
       "        var tooltip_span = $('<span/>');\n",
       "        tooltip_span.addClass('ui-button-text');\n",
       "        tooltip_span.html(tooltip);\n",
       "\n",
       "        button.append(icon_img);\n",
       "        button.append(tooltip_span);\n",
       "\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    var fmt_picker_span = $('<span/>');\n",
       "\n",
       "    var fmt_picker = $('<select/>');\n",
       "    fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
       "    fmt_picker_span.append(fmt_picker);\n",
       "    nav_element.append(fmt_picker_span);\n",
       "    this.format_dropdown = fmt_picker[0];\n",
       "\n",
       "    for (var ind in mpl.extensions) {\n",
       "        var fmt = mpl.extensions[ind];\n",
       "        var option = $(\n",
       "            '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
       "        fmt_picker.append(option)\n",
       "    }\n",
       "\n",
       "    // Add hover states to the ui-buttons\n",
       "    $( \".ui-button\" ).hover(\n",
       "        function() { $(this).addClass(\"ui-state-hover\");},\n",
       "        function() { $(this).removeClass(\"ui-state-hover\");}\n",
       "    );\n",
       "\n",
       "    var status_bar = $('<span class=\"mpl-message\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\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",
       "\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",
       "\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]);\n",
       "        fig.send_message(\"refresh\", {});\n",
       "    };\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
       "    var x0 = msg['x0'] / mpl.ratio;\n",
       "    var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
       "    var x1 = msg['x1'] / mpl.ratio;\n",
       "    var y1 = (fig.canvas.height - msg['y1']) / mpl.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, 0, fig.canvas.width, fig.canvas.height);\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",
       "    {\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.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",
       "            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
       "                evt.data);\n",
       "            fig.updated_canvas_event();\n",
       "            fig.waiting = false;\n",
       "            return;\n",
       "        }\n",
       "        else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\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(\"No handler for the '\" + msg_type + \"' message type: \", msg);\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(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\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",
       "    if (e.target)\n",
       "        targ = e.target;\n",
       "    else if (e.srcElement)\n",
       "        targ = e.srcElement;\n",
       "    if (targ.nodeType == 3) // defeat Safari bug\n",
       "        targ = targ.parentNode;\n",
       "\n",
       "    // jQuery normalizes the pageX and pageY\n",
       "    // pageX,Y are the mouse positions relative to the document\n",
       "    // offset() returns the position of the element relative to the document\n",
       "    var x = e.pageX - $(targ).offset().left;\n",
       "    var y = e.pageY - $(targ).offset().top;\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",
       "    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",
       "    {\n",
       "        this.canvas.focus();\n",
       "        this.canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    var x = canvas_pos.x * mpl.ratio;\n",
       "    var y = canvas_pos.y * mpl.ratio;\n",
       "\n",
       "    this.send_message(name, {x: x, y: y, button: event.button,\n",
       "                             step: event.step,\n",
       "                             guiEvent: simpleKeys(event)});\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",
       "\n",
       "    // Prevent repeat events\n",
       "    if (name == 'key_press')\n",
       "    {\n",
       "        if (event.which === this._key)\n",
       "            return;\n",
       "        else\n",
       "            this._key = event.which;\n",
       "    }\n",
       "    if (name == 'key_release')\n",
       "        this._key = null;\n",
       "\n",
       "    var value = '';\n",
       "    if (event.ctrlKey && event.which != 17)\n",
       "        value += \"ctrl+\";\n",
       "    if (event.altKey && event.which != 18)\n",
       "        value += \"alt+\";\n",
       "    if (event.shiftKey && event.which != 16)\n",
       "        value += \"shift+\";\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,\n",
       "                             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",
       "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\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"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\";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 overriden (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 = $(\"#\" + id);\n",
       "    var ws_proxy = comm_websocket_adapter(comm)\n",
       "\n",
       "    function ondownload(figure, format) {\n",
       "        window.open(figure.imageObj.src);\n",
       "    }\n",
       "\n",
       "    var fig = new mpl.figure(id, ws_proxy,\n",
       "                           ondownload,\n",
       "                           element.get(0));\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.get(0);\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",
       "\n",
       "    var output_index = fig.cell_info[2]\n",
       "    var cell = fig.cell_info[0];\n",
       "\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_close = function(fig, msg) {\n",
       "    var width = fig.canvas.width/mpl.ratio\n",
       "    fig.root.unbind('remove')\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).html('<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/mpl.ratio\n",
       "    var dataURL = this.canvas.toDataURL();\n",
       "    this.cell_info[1]['text/html'] = '<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 () { fig.push_to_output() }, 1000);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\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) { continue; };\n",
       "\n",
       "        var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    // Add the status bar.\n",
       "    var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\n",
       "\n",
       "    // Add the close button to the window.\n",
       "    var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
       "    var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
       "    button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
       "    button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
       "    buttongrp.append(button);\n",
       "    var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
       "    titlebar.prepend(buttongrp);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(el){\n",
       "    var fig = this\n",
       "    el.on(\"remove\", function(){\n",
       "\tfig.close_ws(fig, {});\n",
       "    });\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(el){\n",
       "    // this is important to make the div 'focusable\n",
       "    el.attr('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",
       "    }\n",
       "    else {\n",
       "        // location in version 2\n",
       "        IPython.keyboard_manager.register_events(el);\n",
       "    }\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",
       "    // 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",
       "\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('matplotlib', mpl.mpl_figure_comm);\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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Smm77VL6+9+7rp8/v3WbDz00d5RSymc6m+1z5JH115o5s1ocrrii+/bFXLjSKx0dKb30UkrrrZfSyy/nddddl9I11+TH5fdfe+3c8X//+1P6zGfyunJ6ufLKlO67r/V7LVzY/vPvt9+S/V4Ez/dSJRYIGhDjx49P2267bdp9993TggULUkoprXLrrYmxY9P80jU1K3/kIy07Fo1ef/319NGGTtI555yTnnjiibTuuuu27aRMnDgxzZ8/f7GdsFNPPbVfOncDsZxyyild4lXedtddd3Xb/+abb276Or/85S/TN77xjUH/PEA6++yzO3/uzZnF4AWC+T64xoL+fe/L6x96qL5uwYLuhfnRR+f9dtqpbzp8i1uqmDix+Wu8+mrePnduShdckDtg//3f9e2f/nTXM1zTp6e0116t23TKKT1r+4svDkyMIKU99+wai1tvzevPPz+lFVfMP6+1VveYzZ+f0g03pHT88SmtsUZKH/1oXn/AAX3Trp7EKqVqr7niitV+L1IKn++lSiwQhqGOjo40ZsyYBKTXXnuts4BmMf/T7rvvvmmXXXbpfHzHHXcs9nnlTtVee+2VOjo60rPPPtt5eeAtt9ySbm04Q9Rl+dWvEl/7WuvtPWh74z7T5s1LP29yCeNRTS65bNynGLX0yCOPTGeffXZKKaWbbrqpyz69PgP5+c8nDjkkrb7DDp3rNthgg3T11Venm266KV39wgtp41/+MvFv/9a712+zDFTHdp11100bbbZZ+tW11/b7e53xxz+2/X1uJniBYL4fYv7xj5Q+/OF8diallE44IaWzzkrplVfy45kz85msp57KHbkPfCAXzyuvXL93jcUU2vvs0/8dlwsuSOmRR1L65Cd7tn8r992Xz96V9UX7br554Dpxfb3Mm7f4fV55ZfH7rLHG4H+WdktvLhAJnu+lSiwQholZs2alxx9/PN14441FAmy7bLvttunNb35z2m677dLzzz/fZdCTVsuxxx6bVl999R69/hIvu+/e5XG7OfhuvfXWtPLKK6d//vOfKaWUGDs2Lzvu2OU1/nL33SmllC6dOjV9b9Kk9IspUzq3vW2ffdLvnn46rfbXv6aZtTOYn3rwwfprFa9z7rmd62YvXFjfXrrXr3P57ncTP/tZ+tBFF9X3a7G8+667uq8v7kNcZZXE+99ff90rr8zLG984MN9Fs6VZJ/6ssxI33ZS4+ebucYPEn/6UuP76xK9/nagdsAASI0b0qg13FKcAKgheIJjvlwIdHSk99lj+d/bslP7yl5Suvz6lyy9P6fHH8z4vvbT4AvkrXxn8Ir3V8uKLKX3iE/nne+/t+vl//vPFP7+Zr3+9+34zZgz+Z13S5dRT8xm7lFKaMiWlZZdd/HM+//nBb3dfLh0d+XLjhx+uf9/l7aXhAyoJnu+lSnpVIEydOjXtt99+ab/99kuHHHJIt5ERC+UpA+6uFePRTJo0Kd15551d1pXj0s4ee+yRDjvssC7rnnjiiTR16tTOx/fdd18677zzOl9v2CzlDhD1+8oK0+bN69J5emn+/NTR0ZHWvuOO+vryJZAjR+bOSmOn66c/TeyzT+KWWxbbaVvsUrzXaac1f6++Xho7/3vtVf+5Bx18IJ+hHTs28b731df95jeJsWPTz55+OnHddV33L79/Ob433ND7z7HzzvXXueaa+vpbbskdyLFj8/fX0I5FvThkHLxAGLIdwmnTBrsFda+/Xn3kyEJ5UJAlWdZZp/fP/a//Suk731n8foVW2085Jd9LmFLXEUPf/vbFx+Hqq1N6+unWr9/ohz/sm7hVWS66qHXHPKV8Seq116b0q1/lDt2f/tR839rxxTR9ekrbbNN12w9+0P2znnBC132OOKL7Pj25/7AnyxprpDRiRPPPd955+edVV82P998/P7788vz4ssvyAD6XXFK/9LYxBvfc073tP/hB131OPrn578i4ca1/H3oqeL6XKulVgbDVVlsVf2SdSzON+yxatCgdddRRCeic2624/G7EiBFN53srRms8pNVd4v1oxowZXYbRv+OOO9IOO+zQ48nKywNxXHjhhZ3rG+NSXo4//vjU0dGRtt566851/9YPlxD26TJ6dM/2O//8xDXXpH+79950zAUXtN/35z/v9rtTWPP226t1OK65pt6x6M/lhhv65H1+Mnly+v0LL6T9Hn007TR+fPv9P/e5HKMbbkgUI69+8pP17Y1n8op47LRT4tJL+z8mPVluvjmx666Jc85puv3op55KO99/f/0zXHxxuv+113r9N03cAmGJO4QvvZTS5Mnt93nhhTzARm2A2SW25ppLXhj2leef7148F+MvzZ2b0gorpHTSSd1Hi+zrZdttW2/bc8/m6xv/2zr77O77NLPddovfZ0lsuGH3dpSP9fSk89q4nHpq620TJ9Y7aWee2XyfxmPcr75a33bDDa0/S/k1Wh00KB8UOOmk7tsff7y+/cknW7/Xb37T9f2aDZRz/vndP9uUKSkdc0wekbXw2c82f53eHPiYObN+SXMrixYtPo/0heD5XqqkVwUCiyn8U0rp+eefb7vPlltu2XLb5ZdfntZaa6106aWXdln/5je/OT333HP9kTe6mDVrVpf3LQZBadbW//qv/0qnn356Siml1157La244oqLjc+ALNdfn/j0p/PPxx+fi+vGfU44IZ8ha/b8xsscf/e7xEor5W3FJX433tj1bE55/+J1Lr88feLBB1NKKS1sOKPTtv0Nl2CmlNIjr7+efvvcc4PSafnztGlp/qJF6Z4ZM/KZs9K212vVw7xFi9K0UtW10d13d9lvh/Hj06vFtUEppfmLFqV5ixZ12aeZxrbMW7Soc8TN4t/33XNP4sADE297W77ctg8/++G1yr54/HDtcHDx+Mpp01JHR0e6e8aMNHHWrPT30lyMzV6n3O5mn6/VaKLF9p8sQSURvEDodYdw0aJ8eWNRND76aOt9ixEWR41q/5oXXti9WH344dwZaFakQ/+cKVy4MKU77sgDajz6aH1gjmKZNCnvt/vurdu1666tt/V2OfHElE47LaUPfSh3ssvK+738ch4g5bvfzWehUuo+x18zr7+++H0KO+6YUun28j71lrd0/+zlzkrVuC27bP25HR15+cMf8rYDDuj+/o3Pb2XOnPqom6184xv5NcaNa79f8V5/+1vz7QsWLP6eufIInY89tvj3+sUv2r/e7NkDM13HQAqe76VK+qVDeOedd/auE1Nh2WmnnZqu76kLL7wwbbbZZk3P9h1wwAH93v4+Xfbfv+cF/k035Uskf//7xNix6d7XXksvzZ+f3v2zn+UzRkcc0Xnm6G+1Av/J0tjWjR2YG15+OV3/8stpdsMh1Rdql3QeX1wXtJjfo8unTauPZLnddok//7m+/Y1vTA/PnFmpE7P9Aw90/jx+5sy0qKMjdXR0pAmvv56emTMn3T1jRjr3+ee7tenal17q8jpfmDChadufmj07MXZs+nGbQ7jPzp3b+TovlTqCjU599tm2HcIX581Lv5gyJS1YzOHadh2r4uet7rmnyz7HPf10umP69PSzhu+p2L7Srbe2fc+e6Ml0EffMmJEe6OVZvyqCFwi97hD+5392LZp32KH7Po88ku+FW375rh288tstWFCf0LvV0q7jBfVCeY896oVusW2vvbq2acGCeocupa5nTG67reeXcB54YN929mq3O3dT3qediy7K+zROi1D2+9+373SklNLee+d9vvrV9u/Xn5qdATz77DyATONolX//e/vfi3a/2pMnNzS3GBUAAB6SSURBVD/jddxx3X+3+tvEifWBgnqrPBrs4jqqUQXP91IllQuE8ePHD34HqAfLjTfemFJKadGiRemll17q8hkaJxL/1re+lYB0wgknpNVWW63v29NsAI7DDkt873v1x7fc0n2ff/3Xro9vuCFxwQWJU05JnHxyHljk4ovTaaWzZm+89db0g8cf73w8vTi72dBZuKM4lFzSuE8rN7/ySmLs2HRWq6qmglnFTSgppblz56ZrrrkmnfHEE4nyKJV77tm009fR0ZE+eO+93dZfXjuNsMndd6f33HVXerHiYc/vPPZYetNf/9qre9QaPTV7dprag/efPGdOl+k3euOnkycnxo5NX33kkZb7dHR0dMapJ+0aboIXCL3uELbr3Myf37PBPR57rG87Ve2WVVapd4gGaylPpN0431orv/1t3n7LLb345e6lNseqBsTUqd0vgf3pT7vHs7jXrHH9e97TftL34arcIVzcJZpRBc/3UiWVC4TnnnuuZcfn+9//frd1v//979t2lmbMmJEue/HF+tmr4n60d7+7vt811+QO08Ybt32tdssmm2yS3t8wUMkSL1/4QvP1Bx2UB+O4/PLeXaZXHpDkyitzx/H669t+L9vcd1/aZDED9yyuo1ceNXNOi4GCBsr95U776ad3i9GsWvueq52FW2fcuPSBe+9Ndw/BATP6StEh3PMf/xjspiy1ghcIveoQjh7dvx2n4rhL4/qTTkrpzjvz9sWdVRyoZd99u56NaXYv3/HHtz5TNVBnoIaixc3fV/yXdMcdedTJz30upZEju9/vF0VHRz4D//DDcWOwOMHzvVRJrwqEL113Xb7HbIUV8h/bzjvnIeXHju3aMSoGrSgejxyZuOKKPIjE2Wf3biTGQw+tv97//m9e99//nfjgB/u2swd5cI7DD68/vuSS7u255ZY8FcGXvpS3X3lljz7HHo880vnzSS0m2H5l/vzOfV4IeDanM+4NHetLyjeYqNNZ//xn2vxvf0tHtBuJILjgBUKv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\" width=\"900\">"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "pl.figure(figsize=(9,3))\n",
    "\n",
    "pl.subplot(1,2,1)\n",
    "\n",
    "# plot \"definitive\" delta-F\n",
    "def_delta_f = (def_f - hezf[3].data )\n",
    "def_delta_f_med = np.nanmedian(def_delta_f)\n",
    "pl.plot(dt_test, def_delta_f,'c')\n",
    "\n",
    "# over-plot Adjusted Data delta-F\n",
    "adj_delta_f = (adj[0]**2 + adj[1]**2 + adj[2]**2)**(0.5) - hezf[3].data\n",
    "adj_delta_f_med = np.nanmedian(adj_delta_f)\n",
    "pl.plot(dt_test, adj_delta_f,'k')\n",
    "\n",
    "pl.ylim(adj_delta_f_med - 20., adj_delta_f_med + 20.)\n",
    "pl.title('adjusted')\n",
    "\n",
    "pl.subplot(1,2,2)\n",
    "\n",
    "# plot raw delta-F\n",
    "raw_delta_f = (((hezf[0].data)**2 + (hezf[1].data)**2 + \n",
    "                (hezf[2].data)**2)**(0.5) - hezf[3].data)\n",
    "raw_delta_f_med = np.nanmedian(raw_delta_f)\n",
    "\n",
    "pl.plot(dt_test, raw_delta_f,'b')\n",
    "\n",
    "pl.ylim(raw_delta_f_med - 20.,raw_delta_f_med + 20.)\n",
    "\n",
    "pl.title('raw')\n",
    "\n",
    "# re-formats dates for better presentation\n",
    "pl.gcf().autofmt_xdate()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Plots of Adjusted X using Static Baseline, Affine Transform, and '$\\Delta x$'\n",
    "\n",
    "This is not quite the same comparison presented for $\\Delta F$, because $\\Delta x$ is a comparison of two derived quantities."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "collapsed": false,
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "/* Put everything inside the global mpl namespace */\n",
       "window.mpl = {};\n",
       "\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('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",
       "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 = $('<div/>');\n",
       "    this._root_extra_style(this.root)\n",
       "    this.root.attr('style', 'display: inline-block');\n",
       "\n",
       "    $(parent_element).append(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 (mpl.ratio != 1) {\n",
       "                fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.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",
       "        this.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 = $(\n",
       "        '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
       "        'ui-helper-clearfix\"/>');\n",
       "    var titletext = $(\n",
       "        '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
       "        'text-align: center; padding: 3px;\"/>');\n",
       "    titlebar.append(titletext)\n",
       "    this.root.append(titlebar);\n",
       "    this.header = titletext[0];\n",
       "}\n",
       "\n",
       "\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_canvas = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var canvas_div = $('<div/>');\n",
       "\n",
       "    canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
       "\n",
       "    function canvas_keyboard_event(event) {\n",
       "        return fig.key_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    canvas_div.keydown('key_press', canvas_keyboard_event);\n",
       "    canvas_div.keyup('key_release', canvas_keyboard_event);\n",
       "    this.canvas_div = canvas_div\n",
       "    this._canvas_extra_style(canvas_div)\n",
       "    this.root.append(canvas_div);\n",
       "\n",
       "    var canvas = $('<canvas/>');\n",
       "    canvas.addClass('mpl-canvas');\n",
       "    canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
       "\n",
       "    this.canvas = canvas[0];\n",
       "    this.context = canvas[0].getContext(\"2d\");\n",
       "\n",
       "    var backingStore = this.context.backingStorePixelRatio ||\n",
       "\tthis.context.webkitBackingStorePixelRatio ||\n",
       "\tthis.context.mozBackingStorePixelRatio ||\n",
       "\tthis.context.msBackingStorePixelRatio ||\n",
       "\tthis.context.oBackingStorePixelRatio ||\n",
       "\tthis.context.backingStorePixelRatio || 1;\n",
       "\n",
       "    mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
       "\n",
       "    var rubberband = $('<canvas/>');\n",
       "    rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
       "\n",
       "    var pass_mouse_events = true;\n",
       "\n",
       "    canvas_div.resizable({\n",
       "        start: function(event, ui) {\n",
       "            pass_mouse_events = false;\n",
       "        },\n",
       "        resize: function(event, ui) {\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "        stop: function(event, ui) {\n",
       "            pass_mouse_events = true;\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "    });\n",
       "\n",
       "    function mouse_event_fn(event) {\n",
       "        if (pass_mouse_events)\n",
       "            return fig.mouse_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    rubberband.mousedown('button_press', mouse_event_fn);\n",
       "    rubberband.mouseup('button_release', mouse_event_fn);\n",
       "    // Throttle sequential mouse events to 1 every 20ms.\n",
       "    rubberband.mousemove('motion_notify', mouse_event_fn);\n",
       "\n",
       "    rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
       "    rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
       "\n",
       "    canvas_div.on(\"wheel\", function (event) {\n",
       "        event = event.originalEvent;\n",
       "        event['data'] = 'scroll'\n",
       "        if (event.deltaY < 0) {\n",
       "            event.step = 1;\n",
       "        } else {\n",
       "            event.step = -1;\n",
       "        }\n",
       "        mouse_event_fn(event);\n",
       "    });\n",
       "\n",
       "    canvas_div.append(canvas);\n",
       "    canvas_div.append(rubberband);\n",
       "\n",
       "    this.rubberband = rubberband;\n",
       "    this.rubberband_canvas = rubberband[0];\n",
       "    this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
       "    this.rubberband_context.strokeStyle = \"#000000\";\n",
       "\n",
       "    this._resize_canvas = function(width, height) {\n",
       "        // Keep the size of the canvas, canvas container, and rubber band\n",
       "        // canvas in synch.\n",
       "        canvas_div.css('width', width)\n",
       "        canvas_div.css('height', height)\n",
       "\n",
       "        canvas.attr('width', width * mpl.ratio);\n",
       "        canvas.attr('height', height * mpl.ratio);\n",
       "        canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
       "\n",
       "        rubberband.attr('width', width);\n",
       "        rubberband.attr('height', height);\n",
       "    }\n",
       "\n",
       "    // Set the figure to an initial 600x600px, this will subsequently be updated\n",
       "    // upon first draw.\n",
       "    this._resize_canvas(600, 600);\n",
       "\n",
       "    // Disable right mouse context menu.\n",
       "    $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\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 nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\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",
       "            // put a spacer in here.\n",
       "            continue;\n",
       "        }\n",
       "        var button = $('<button/>');\n",
       "        button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
       "                        'ui-button-icon-only');\n",
       "        button.attr('role', 'button');\n",
       "        button.attr('aria-disabled', 'false');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "\n",
       "        var icon_img = $('<span/>');\n",
       "        icon_img.addClass('ui-button-icon-primary ui-icon');\n",
       "        icon_img.addClass(image);\n",
       "        icon_img.addClass('ui-corner-all');\n",
       "\n",
       "        var tooltip_span = $('<span/>');\n",
       "        tooltip_span.addClass('ui-button-text');\n",
       "        tooltip_span.html(tooltip);\n",
       "\n",
       "        button.append(icon_img);\n",
       "        button.append(tooltip_span);\n",
       "\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    var fmt_picker_span = $('<span/>');\n",
       "\n",
       "    var fmt_picker = $('<select/>');\n",
       "    fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
       "    fmt_picker_span.append(fmt_picker);\n",
       "    nav_element.append(fmt_picker_span);\n",
       "    this.format_dropdown = fmt_picker[0];\n",
       "\n",
       "    for (var ind in mpl.extensions) {\n",
       "        var fmt = mpl.extensions[ind];\n",
       "        var option = $(\n",
       "            '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
       "        fmt_picker.append(option)\n",
       "    }\n",
       "\n",
       "    // Add hover states to the ui-buttons\n",
       "    $( \".ui-button\" ).hover(\n",
       "        function() { $(this).addClass(\"ui-state-hover\");},\n",
       "        function() { $(this).removeClass(\"ui-state-hover\");}\n",
       "    );\n",
       "\n",
       "    var status_bar = $('<span class=\"mpl-message\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\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",
       "\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",
       "\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]);\n",
       "        fig.send_message(\"refresh\", {});\n",
       "    };\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
       "    var x0 = msg['x0'] / mpl.ratio;\n",
       "    var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
       "    var x1 = msg['x1'] / mpl.ratio;\n",
       "    var y1 = (fig.canvas.height - msg['y1']) / mpl.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, 0, fig.canvas.width, fig.canvas.height);\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",
       "    {\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.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",
       "            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
       "                evt.data);\n",
       "            fig.updated_canvas_event();\n",
       "            fig.waiting = false;\n",
       "            return;\n",
       "        }\n",
       "        else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\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(\"No handler for the '\" + msg_type + \"' message type: \", msg);\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(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\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",
       "    if (e.target)\n",
       "        targ = e.target;\n",
       "    else if (e.srcElement)\n",
       "        targ = e.srcElement;\n",
       "    if (targ.nodeType == 3) // defeat Safari bug\n",
       "        targ = targ.parentNode;\n",
       "\n",
       "    // jQuery normalizes the pageX and pageY\n",
       "    // pageX,Y are the mouse positions relative to the document\n",
       "    // offset() returns the position of the element relative to the document\n",
       "    var x = e.pageX - $(targ).offset().left;\n",
       "    var y = e.pageY - $(targ).offset().top;\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",
       "    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",
       "    {\n",
       "        this.canvas.focus();\n",
       "        this.canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    var x = canvas_pos.x * mpl.ratio;\n",
       "    var y = canvas_pos.y * mpl.ratio;\n",
       "\n",
       "    this.send_message(name, {x: x, y: y, button: event.button,\n",
       "                             step: event.step,\n",
       "                             guiEvent: simpleKeys(event)});\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",
       "\n",
       "    // Prevent repeat events\n",
       "    if (name == 'key_press')\n",
       "    {\n",
       "        if (event.which === this._key)\n",
       "            return;\n",
       "        else\n",
       "            this._key = event.which;\n",
       "    }\n",
       "    if (name == 'key_release')\n",
       "        this._key = null;\n",
       "\n",
       "    var value = '';\n",
       "    if (event.ctrlKey && event.which != 17)\n",
       "        value += \"ctrl+\";\n",
       "    if (event.altKey && event.which != 18)\n",
       "        value += \"alt+\";\n",
       "    if (event.shiftKey && event.which != 16)\n",
       "        value += \"shift+\";\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,\n",
       "                             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",
       "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\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"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\";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 overriden (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 = $(\"#\" + id);\n",
       "    var ws_proxy = comm_websocket_adapter(comm)\n",
       "\n",
       "    function ondownload(figure, format) {\n",
       "        window.open(figure.imageObj.src);\n",
       "    }\n",
       "\n",
       "    var fig = new mpl.figure(id, ws_proxy,\n",
       "                           ondownload,\n",
       "                           element.get(0));\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.get(0);\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",
       "\n",
       "    var output_index = fig.cell_info[2]\n",
       "    var cell = fig.cell_info[0];\n",
       "\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_close = function(fig, msg) {\n",
       "    var width = fig.canvas.width/mpl.ratio\n",
       "    fig.root.unbind('remove')\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).html('<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/mpl.ratio\n",
       "    var dataURL = this.canvas.toDataURL();\n",
       "    this.cell_info[1]['text/html'] = '<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 () { fig.push_to_output() }, 1000);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\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) { continue; };\n",
       "\n",
       "        var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    // Add the status bar.\n",
       "    var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\n",
       "\n",
       "    // Add the close button to the window.\n",
       "    var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
       "    var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
       "    button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
       "    button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
       "    buttongrp.append(button);\n",
       "    var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
       "    titlebar.prepend(buttongrp);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(el){\n",
       "    var fig = this\n",
       "    el.on(\"remove\", function(){\n",
       "\tfig.close_ws(fig, {});\n",
       "    });\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(el){\n",
       "    // this is important to make the div 'focusable\n",
       "    el.attr('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",
       "    }\n",
       "    else {\n",
       "        // location in version 2\n",
       "        IPython.keyboard_manager.register_events(el);\n",
       "    }\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",
       "    // 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",
       "\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('matplotlib', mpl.mpl_figure_comm);\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=\"1200\">"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "pl.figure(figsize=(12,3))\n",
    "pl.subplot(1,3,1)\n",
    "pl.plot(dt_test, def_x,'c')\n",
    "pl.title('static baseline')\n",
    "def_x_med = np.nanmedian(def_x)\n",
    "pl.ylim(def_x_med - 200., def_x_med + 200.)\n",
    "\n",
    "\n",
    "pl.subplot(1,3,2)\n",
    "pl.plot(dt_test, adj[0],'k')\n",
    "pl.title('affine transform')\n",
    "pl.ylim(def_x_med - 200., def_x_med + 200.)\n",
    "\n",
    "\n",
    "pl.subplot(1,3,3)\n",
    "pl.plot(dt_test, def_x - adj[0],'b')\n",
    "pl.title('$\\Delta x$')\n",
    "pl.ylim(- 20.,  20.)\n",
    "\n",
    "# re-formats dates for better presentation\n",
    "pl.gcf().autofmt_xdate()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## ## Plots of Adjusted Y using Static Baseline, Affine Transform, and '$\\Delta y$'\n",
    "\n",
    "This is not quite the same comparison presented for $\\Delta F$, because $\\Delta y$ is a comparison of two derived quantities."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "/* Put everything inside the global mpl namespace */\n",
       "window.mpl = {};\n",
       "\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('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",
       "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 = $('<div/>');\n",
       "    this._root_extra_style(this.root)\n",
       "    this.root.attr('style', 'display: inline-block');\n",
       "\n",
       "    $(parent_element).append(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 (mpl.ratio != 1) {\n",
       "                fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.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",
       "        this.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 = $(\n",
       "        '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
       "        'ui-helper-clearfix\"/>');\n",
       "    var titletext = $(\n",
       "        '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
       "        'text-align: center; padding: 3px;\"/>');\n",
       "    titlebar.append(titletext)\n",
       "    this.root.append(titlebar);\n",
       "    this.header = titletext[0];\n",
       "}\n",
       "\n",
       "\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_canvas = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var canvas_div = $('<div/>');\n",
       "\n",
       "    canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
       "\n",
       "    function canvas_keyboard_event(event) {\n",
       "        return fig.key_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    canvas_div.keydown('key_press', canvas_keyboard_event);\n",
       "    canvas_div.keyup('key_release', canvas_keyboard_event);\n",
       "    this.canvas_div = canvas_div\n",
       "    this._canvas_extra_style(canvas_div)\n",
       "    this.root.append(canvas_div);\n",
       "\n",
       "    var canvas = $('<canvas/>');\n",
       "    canvas.addClass('mpl-canvas');\n",
       "    canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
       "\n",
       "    this.canvas = canvas[0];\n",
       "    this.context = canvas[0].getContext(\"2d\");\n",
       "\n",
       "    var backingStore = this.context.backingStorePixelRatio ||\n",
       "\tthis.context.webkitBackingStorePixelRatio ||\n",
       "\tthis.context.mozBackingStorePixelRatio ||\n",
       "\tthis.context.msBackingStorePixelRatio ||\n",
       "\tthis.context.oBackingStorePixelRatio ||\n",
       "\tthis.context.backingStorePixelRatio || 1;\n",
       "\n",
       "    mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
       "\n",
       "    var rubberband = $('<canvas/>');\n",
       "    rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
       "\n",
       "    var pass_mouse_events = true;\n",
       "\n",
       "    canvas_div.resizable({\n",
       "        start: function(event, ui) {\n",
       "            pass_mouse_events = false;\n",
       "        },\n",
       "        resize: function(event, ui) {\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "        stop: function(event, ui) {\n",
       "            pass_mouse_events = true;\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "    });\n",
       "\n",
       "    function mouse_event_fn(event) {\n",
       "        if (pass_mouse_events)\n",
       "            return fig.mouse_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    rubberband.mousedown('button_press', mouse_event_fn);\n",
       "    rubberband.mouseup('button_release', mouse_event_fn);\n",
       "    // Throttle sequential mouse events to 1 every 20ms.\n",
       "    rubberband.mousemove('motion_notify', mouse_event_fn);\n",
       "\n",
       "    rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
       "    rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
       "\n",
       "    canvas_div.on(\"wheel\", function (event) {\n",
       "        event = event.originalEvent;\n",
       "        event['data'] = 'scroll'\n",
       "        if (event.deltaY < 0) {\n",
       "            event.step = 1;\n",
       "        } else {\n",
       "            event.step = -1;\n",
       "        }\n",
       "        mouse_event_fn(event);\n",
       "    });\n",
       "\n",
       "    canvas_div.append(canvas);\n",
       "    canvas_div.append(rubberband);\n",
       "\n",
       "    this.rubberband = rubberband;\n",
       "    this.rubberband_canvas = rubberband[0];\n",
       "    this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
       "    this.rubberband_context.strokeStyle = \"#000000\";\n",
       "\n",
       "    this._resize_canvas = function(width, height) {\n",
       "        // Keep the size of the canvas, canvas container, and rubber band\n",
       "        // canvas in synch.\n",
       "        canvas_div.css('width', width)\n",
       "        canvas_div.css('height', height)\n",
       "\n",
       "        canvas.attr('width', width * mpl.ratio);\n",
       "        canvas.attr('height', height * mpl.ratio);\n",
       "        canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
       "\n",
       "        rubberband.attr('width', width);\n",
       "        rubberband.attr('height', height);\n",
       "    }\n",
       "\n",
       "    // Set the figure to an initial 600x600px, this will subsequently be updated\n",
       "    // upon first draw.\n",
       "    this._resize_canvas(600, 600);\n",
       "\n",
       "    // Disable right mouse context menu.\n",
       "    $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\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 nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\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",
       "            // put a spacer in here.\n",
       "            continue;\n",
       "        }\n",
       "        var button = $('<button/>');\n",
       "        button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
       "                        'ui-button-icon-only');\n",
       "        button.attr('role', 'button');\n",
       "        button.attr('aria-disabled', 'false');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "\n",
       "        var icon_img = $('<span/>');\n",
       "        icon_img.addClass('ui-button-icon-primary ui-icon');\n",
       "        icon_img.addClass(image);\n",
       "        icon_img.addClass('ui-corner-all');\n",
       "\n",
       "        var tooltip_span = $('<span/>');\n",
       "        tooltip_span.addClass('ui-button-text');\n",
       "        tooltip_span.html(tooltip);\n",
       "\n",
       "        button.append(icon_img);\n",
       "        button.append(tooltip_span);\n",
       "\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    var fmt_picker_span = $('<span/>');\n",
       "\n",
       "    var fmt_picker = $('<select/>');\n",
       "    fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
       "    fmt_picker_span.append(fmt_picker);\n",
       "    nav_element.append(fmt_picker_span);\n",
       "    this.format_dropdown = fmt_picker[0];\n",
       "\n",
       "    for (var ind in mpl.extensions) {\n",
       "        var fmt = mpl.extensions[ind];\n",
       "        var option = $(\n",
       "            '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
       "        fmt_picker.append(option)\n",
       "    }\n",
       "\n",
       "    // Add hover states to the ui-buttons\n",
       "    $( \".ui-button\" ).hover(\n",
       "        function() { $(this).addClass(\"ui-state-hover\");},\n",
       "        function() { $(this).removeClass(\"ui-state-hover\");}\n",
       "    );\n",
       "\n",
       "    var status_bar = $('<span class=\"mpl-message\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\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",
       "\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",
       "\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]);\n",
       "        fig.send_message(\"refresh\", {});\n",
       "    };\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
       "    var x0 = msg['x0'] / mpl.ratio;\n",
       "    var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
       "    var x1 = msg['x1'] / mpl.ratio;\n",
       "    var y1 = (fig.canvas.height - msg['y1']) / mpl.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, 0, fig.canvas.width, fig.canvas.height);\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",
       "    {\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.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",
       "            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
       "                evt.data);\n",
       "            fig.updated_canvas_event();\n",
       "            fig.waiting = false;\n",
       "            return;\n",
       "        }\n",
       "        else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\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(\"No handler for the '\" + msg_type + \"' message type: \", msg);\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(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\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",
       "    if (e.target)\n",
       "        targ = e.target;\n",
       "    else if (e.srcElement)\n",
       "        targ = e.srcElement;\n",
       "    if (targ.nodeType == 3) // defeat Safari bug\n",
       "        targ = targ.parentNode;\n",
       "\n",
       "    // jQuery normalizes the pageX and pageY\n",
       "    // pageX,Y are the mouse positions relative to the document\n",
       "    // offset() returns the position of the element relative to the document\n",
       "    var x = e.pageX - $(targ).offset().left;\n",
       "    var y = e.pageY - $(targ).offset().top;\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",
       "    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",
       "    {\n",
       "        this.canvas.focus();\n",
       "        this.canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    var x = canvas_pos.x * mpl.ratio;\n",
       "    var y = canvas_pos.y * mpl.ratio;\n",
       "\n",
       "    this.send_message(name, {x: x, y: y, button: event.button,\n",
       "                             step: event.step,\n",
       "                             guiEvent: simpleKeys(event)});\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",
       "\n",
       "    // Prevent repeat events\n",
       "    if (name == 'key_press')\n",
       "    {\n",
       "        if (event.which === this._key)\n",
       "            return;\n",
       "        else\n",
       "            this._key = event.which;\n",
       "    }\n",
       "    if (name == 'key_release')\n",
       "        this._key = null;\n",
       "\n",
       "    var value = '';\n",
       "    if (event.ctrlKey && event.which != 17)\n",
       "        value += \"ctrl+\";\n",
       "    if (event.altKey && event.which != 18)\n",
       "        value += \"alt+\";\n",
       "    if (event.shiftKey && event.which != 16)\n",
       "        value += \"shift+\";\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,\n",
       "                             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",
       "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\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"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\";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 overriden (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 = $(\"#\" + id);\n",
       "    var ws_proxy = comm_websocket_adapter(comm)\n",
       "\n",
       "    function ondownload(figure, format) {\n",
       "        window.open(figure.imageObj.src);\n",
       "    }\n",
       "\n",
       "    var fig = new mpl.figure(id, ws_proxy,\n",
       "                           ondownload,\n",
       "                           element.get(0));\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.get(0);\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",
       "\n",
       "    var output_index = fig.cell_info[2]\n",
       "    var cell = fig.cell_info[0];\n",
       "\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_close = function(fig, msg) {\n",
       "    var width = fig.canvas.width/mpl.ratio\n",
       "    fig.root.unbind('remove')\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).html('<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/mpl.ratio\n",
       "    var dataURL = this.canvas.toDataURL();\n",
       "    this.cell_info[1]['text/html'] = '<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 () { fig.push_to_output() }, 1000);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\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) { continue; };\n",
       "\n",
       "        var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    // Add the status bar.\n",
       "    var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\n",
       "\n",
       "    // Add the close button to the window.\n",
       "    var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
       "    var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
       "    button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
       "    button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
       "    buttongrp.append(button);\n",
       "    var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
       "    titlebar.prepend(buttongrp);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(el){\n",
       "    var fig = this\n",
       "    el.on(\"remove\", function(){\n",
       "\tfig.close_ws(fig, {});\n",
       "    });\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(el){\n",
       "    // this is important to make the div 'focusable\n",
       "    el.attr('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",
       "    }\n",
       "    else {\n",
       "        // location in version 2\n",
       "        IPython.keyboard_manager.register_events(el);\n",
       "    }\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",
       "    // 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",
       "\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('matplotlib', mpl.mpl_figure_comm);\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=\"1200\">"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "pl.figure(figsize=(12,3))\n",
    "pl.subplot(1,3,1)\n",
    "pl.plot(dt_test, def_y,'c')\n",
    "pl.title('static baseline')\n",
    "def_y_med = np.nanmedian(def_y)\n",
    "pl.ylim(def_y_med - 200., def_y_med + 200.)\n",
    "\n",
    "\n",
    "pl.subplot(1,3,2)\n",
    "pl.plot(dt_test, adj[1],'k')\n",
    "pl.title('affine transform')\n",
    "pl.ylim(def_y_med - 200., def_y_med + 200.)\n",
    "\n",
    "\n",
    "pl.subplot(1,3,3)\n",
    "pl.plot(dt_test, def_y - adj[1],'b')\n",
    "pl.title('$\\Delta y$')\n",
    "pl.ylim(- 20.,  20.)\n",
    "\n",
    "# re-formats dates for better presentation\n",
    "pl.gcf().autofmt_xdate()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Plots of Adjusted Z using Static Baseline, Affine Transform, and '$\\Delta z$'\n",
    "\n",
    "This is not quite the same comparison presented for $\\Delta F$, because $\\Delta z$ is a comparison of two derived quantities."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "/* Put everything inside the global mpl namespace */\n",
       "window.mpl = {};\n",
       "\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('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",
       "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 = $('<div/>');\n",
       "    this._root_extra_style(this.root)\n",
       "    this.root.attr('style', 'display: inline-block');\n",
       "\n",
       "    $(parent_element).append(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 (mpl.ratio != 1) {\n",
       "                fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.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",
       "        this.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 = $(\n",
       "        '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
       "        'ui-helper-clearfix\"/>');\n",
       "    var titletext = $(\n",
       "        '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
       "        'text-align: center; padding: 3px;\"/>');\n",
       "    titlebar.append(titletext)\n",
       "    this.root.append(titlebar);\n",
       "    this.header = titletext[0];\n",
       "}\n",
       "\n",
       "\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_canvas = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var canvas_div = $('<div/>');\n",
       "\n",
       "    canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
       "\n",
       "    function canvas_keyboard_event(event) {\n",
       "        return fig.key_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    canvas_div.keydown('key_press', canvas_keyboard_event);\n",
       "    canvas_div.keyup('key_release', canvas_keyboard_event);\n",
       "    this.canvas_div = canvas_div\n",
       "    this._canvas_extra_style(canvas_div)\n",
       "    this.root.append(canvas_div);\n",
       "\n",
       "    var canvas = $('<canvas/>');\n",
       "    canvas.addClass('mpl-canvas');\n",
       "    canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
       "\n",
       "    this.canvas = canvas[0];\n",
       "    this.context = canvas[0].getContext(\"2d\");\n",
       "\n",
       "    var backingStore = this.context.backingStorePixelRatio ||\n",
       "\tthis.context.webkitBackingStorePixelRatio ||\n",
       "\tthis.context.mozBackingStorePixelRatio ||\n",
       "\tthis.context.msBackingStorePixelRatio ||\n",
       "\tthis.context.oBackingStorePixelRatio ||\n",
       "\tthis.context.backingStorePixelRatio || 1;\n",
       "\n",
       "    mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
       "\n",
       "    var rubberband = $('<canvas/>');\n",
       "    rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
       "\n",
       "    var pass_mouse_events = true;\n",
       "\n",
       "    canvas_div.resizable({\n",
       "        start: function(event, ui) {\n",
       "            pass_mouse_events = false;\n",
       "        },\n",
       "        resize: function(event, ui) {\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "        stop: function(event, ui) {\n",
       "            pass_mouse_events = true;\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "    });\n",
       "\n",
       "    function mouse_event_fn(event) {\n",
       "        if (pass_mouse_events)\n",
       "            return fig.mouse_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    rubberband.mousedown('button_press', mouse_event_fn);\n",
       "    rubberband.mouseup('button_release', mouse_event_fn);\n",
       "    // Throttle sequential mouse events to 1 every 20ms.\n",
       "    rubberband.mousemove('motion_notify', mouse_event_fn);\n",
       "\n",
       "    rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
       "    rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
       "\n",
       "    canvas_div.on(\"wheel\", function (event) {\n",
       "        event = event.originalEvent;\n",
       "        event['data'] = 'scroll'\n",
       "        if (event.deltaY < 0) {\n",
       "            event.step = 1;\n",
       "        } else {\n",
       "            event.step = -1;\n",
       "        }\n",
       "        mouse_event_fn(event);\n",
       "    });\n",
       "\n",
       "    canvas_div.append(canvas);\n",
       "    canvas_div.append(rubberband);\n",
       "\n",
       "    this.rubberband = rubberband;\n",
       "    this.rubberband_canvas = rubberband[0];\n",
       "    this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
       "    this.rubberband_context.strokeStyle = \"#000000\";\n",
       "\n",
       "    this._resize_canvas = function(width, height) {\n",
       "        // Keep the size of the canvas, canvas container, and rubber band\n",
       "        // canvas in synch.\n",
       "        canvas_div.css('width', width)\n",
       "        canvas_div.css('height', height)\n",
       "\n",
       "        canvas.attr('width', width * mpl.ratio);\n",
       "        canvas.attr('height', height * mpl.ratio);\n",
       "        canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
       "\n",
       "        rubberband.attr('width', width);\n",
       "        rubberband.attr('height', height);\n",
       "    }\n",
       "\n",
       "    // Set the figure to an initial 600x600px, this will subsequently be updated\n",
       "    // upon first draw.\n",
       "    this._resize_canvas(600, 600);\n",
       "\n",
       "    // Disable right mouse context menu.\n",
       "    $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\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 nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\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",
       "            // put a spacer in here.\n",
       "            continue;\n",
       "        }\n",
       "        var button = $('<button/>');\n",
       "        button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
       "                        'ui-button-icon-only');\n",
       "        button.attr('role', 'button');\n",
       "        button.attr('aria-disabled', 'false');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "\n",
       "        var icon_img = $('<span/>');\n",
       "        icon_img.addClass('ui-button-icon-primary ui-icon');\n",
       "        icon_img.addClass(image);\n",
       "        icon_img.addClass('ui-corner-all');\n",
       "\n",
       "        var tooltip_span = $('<span/>');\n",
       "        tooltip_span.addClass('ui-button-text');\n",
       "        tooltip_span.html(tooltip);\n",
       "\n",
       "        button.append(icon_img);\n",
       "        button.append(tooltip_span);\n",
       "\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    var fmt_picker_span = $('<span/>');\n",
       "\n",
       "    var fmt_picker = $('<select/>');\n",
       "    fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
       "    fmt_picker_span.append(fmt_picker);\n",
       "    nav_element.append(fmt_picker_span);\n",
       "    this.format_dropdown = fmt_picker[0];\n",
       "\n",
       "    for (var ind in mpl.extensions) {\n",
       "        var fmt = mpl.extensions[ind];\n",
       "        var option = $(\n",
       "            '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
       "        fmt_picker.append(option)\n",
       "    }\n",
       "\n",
       "    // Add hover states to the ui-buttons\n",
       "    $( \".ui-button\" ).hover(\n",
       "        function() { $(this).addClass(\"ui-state-hover\");},\n",
       "        function() { $(this).removeClass(\"ui-state-hover\");}\n",
       "    );\n",
       "\n",
       "    var status_bar = $('<span class=\"mpl-message\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\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",
       "\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",
       "\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]);\n",
       "        fig.send_message(\"refresh\", {});\n",
       "    };\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
       "    var x0 = msg['x0'] / mpl.ratio;\n",
       "    var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
       "    var x1 = msg['x1'] / mpl.ratio;\n",
       "    var y1 = (fig.canvas.height - msg['y1']) / mpl.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, 0, fig.canvas.width, fig.canvas.height);\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",
       "    {\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.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",
       "            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
       "                evt.data);\n",
       "            fig.updated_canvas_event();\n",
       "            fig.waiting = false;\n",
       "            return;\n",
       "        }\n",
       "        else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\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(\"No handler for the '\" + msg_type + \"' message type: \", msg);\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(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\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",
       "    if (e.target)\n",
       "        targ = e.target;\n",
       "    else if (e.srcElement)\n",
       "        targ = e.srcElement;\n",
       "    if (targ.nodeType == 3) // defeat Safari bug\n",
       "        targ = targ.parentNode;\n",
       "\n",
       "    // jQuery normalizes the pageX and pageY\n",
       "    // pageX,Y are the mouse positions relative to the document\n",
       "    // offset() returns the position of the element relative to the document\n",
       "    var x = e.pageX - $(targ).offset().left;\n",
       "    var y = e.pageY - $(targ).offset().top;\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",
       "    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",
       "    {\n",
       "        this.canvas.focus();\n",
       "        this.canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    var x = canvas_pos.x * mpl.ratio;\n",
       "    var y = canvas_pos.y * mpl.ratio;\n",
       "\n",
       "    this.send_message(name, {x: x, y: y, button: event.button,\n",
       "                             step: event.step,\n",
       "                             guiEvent: simpleKeys(event)});\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",
       "\n",
       "    // Prevent repeat events\n",
       "    if (name == 'key_press')\n",
       "    {\n",
       "        if (event.which === this._key)\n",
       "            return;\n",
       "        else\n",
       "            this._key = event.which;\n",
       "    }\n",
       "    if (name == 'key_release')\n",
       "        this._key = null;\n",
       "\n",
       "    var value = '';\n",
       "    if (event.ctrlKey && event.which != 17)\n",
       "        value += \"ctrl+\";\n",
       "    if (event.altKey && event.which != 18)\n",
       "        value += \"alt+\";\n",
       "    if (event.shiftKey && event.which != 16)\n",
       "        value += \"shift+\";\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,\n",
       "                             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",
       "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\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"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\";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 overriden (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 = $(\"#\" + id);\n",
       "    var ws_proxy = comm_websocket_adapter(comm)\n",
       "\n",
       "    function ondownload(figure, format) {\n",
       "        window.open(figure.imageObj.src);\n",
       "    }\n",
       "\n",
       "    var fig = new mpl.figure(id, ws_proxy,\n",
       "                           ondownload,\n",
       "                           element.get(0));\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.get(0);\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",
       "\n",
       "    var output_index = fig.cell_info[2]\n",
       "    var cell = fig.cell_info[0];\n",
       "\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_close = function(fig, msg) {\n",
       "    var width = fig.canvas.width/mpl.ratio\n",
       "    fig.root.unbind('remove')\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).html('<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/mpl.ratio\n",
       "    var dataURL = this.canvas.toDataURL();\n",
       "    this.cell_info[1]['text/html'] = '<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 () { fig.push_to_output() }, 1000);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\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) { continue; };\n",
       "\n",
       "        var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    // Add the status bar.\n",
       "    var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\n",
       "\n",
       "    // Add the close button to the window.\n",
       "    var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
       "    var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
       "    button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
       "    button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
       "    buttongrp.append(button);\n",
       "    var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
       "    titlebar.prepend(buttongrp);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(el){\n",
       "    var fig = this\n",
       "    el.on(\"remove\", function(){\n",
       "\tfig.close_ws(fig, {});\n",
       "    });\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(el){\n",
       "    // this is important to make the div 'focusable\n",
       "    el.attr('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",
       "    }\n",
       "    else {\n",
       "        // location in version 2\n",
       "        IPython.keyboard_manager.register_events(el);\n",
       "    }\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",
       "    // 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",
       "\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('matplotlib', mpl.mpl_figure_comm);\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=\"1200\">"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "pl.figure(figsize=(12,3))\n",
    "pl.subplot(1,3,1)\n",
    "pl.plot(dt_test, def_z,'c')\n",
    "pl.title('static baseline')\n",
    "def_z_med = np.nanmedian(def_z)\n",
    "pl.ylim(def_z_med - 200., def_z_med + 200.)\n",
    "\n",
    "\n",
    "pl.subplot(1,3,2)\n",
    "pl.plot(dt_test, adj[2],'k')\n",
    "pl.title('affine transform')\n",
    "pl.ylim(def_z_med - 200., def_z_med + 200.)\n",
    "\n",
    "\n",
    "pl.subplot(1,3,3)\n",
    "pl.plot(dt_test, def_z - adj[2],'b')\n",
    "pl.title('$\\Delta z$')\n",
    "pl.ylim(- 20.,  20.)\n",
    "\n",
    "# re-formats dates for better presentation\n",
    "pl.gcf().autofmt_xdate()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}