Skip to content
Snippets Groups Projects
AdjustedPhase1GenerationTool.ipynb 493 KiB
Newer Older
  • Learn to ignore specific revisions
  •    "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,
    
       },
       "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",
    
        "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."
    
       "execution_count": 21,
    
        "collapsed": false,
        "scrolled": true
    
          "application/javascript": [
           "/* Put everything inside the global mpl namespace */\n",
           "window.mpl = {};\n",
           "\n",
    
           "mpl.get_websocket_type = function() {\n",
           "    if (typeof(WebSocket) !== 'undefined') {\n",
           "        return WebSocket;\n",
           "    } else if (typeof(MozWebSocket) !== 'undefined') {\n",
           "        return MozWebSocket;\n",
           "    } else {\n",
           "        alert('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>"
    
         "output_type": "display_data"
    
           "<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",
    
        "# 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",
    
        "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",
    
        "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",
    
        "pl.plot(dt_test, raw_delta_f,'b')\n",
    
        "pl.ylim(raw_delta_f_med - 20.,raw_delta_f_med + 20.)\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."
    
       "execution_count": 22,
    
        "collapsed": false,
        "scrolled": true
    
          "application/javascript": [
           "/* Put everything inside the global mpl namespace */\n",
           "window.mpl = {};\n",
           "\n",
    
           "mpl.get_websocket_type = function() {\n",
           "    if (typeof(WebSocket) !== 'undefined') {\n",
           "        return WebSocket;\n",
           "    } else if (typeof(MozWebSocket) !== 'undefined') {\n",
           "        return MozWebSocket;\n",
           "    } else {\n",
           "        alert('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",