pyFAI/sandbox/JF16_geometry.ipynb

16915 lines
1.4 MiB

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Jungfrau 16M geometry reconstruction\n",
"\n",
"This notebook contains a few tools to rebuild the 2D images from the raw data, apply the pedestal correciton and so on."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2.9.0.post0\n"
]
}
],
"source": [
"#Check HDF5 plugin works ...\n",
"import h5py\n",
"import numpy\n",
"import bitshuffle.h5\n",
"\n",
"print(h5py.__version__) # >= '2.5.0'\n",
"\n",
"f = h5py.File(\"filename.h5\", \"w\")\n",
"\n",
"# block_size = 0 let Bitshuffle choose its value\n",
"block_size = 0\n",
"\n",
"dataset = f.create_dataset(\n",
" \"data\",\n",
" (100, 100, 100),\n",
" compression=bitshuffle.h5.H5FILTER,\n",
" compression_opts=(block_size, bitshuffle.h5.H5_COMPRESS_LZ4),\n",
" dtype='float32',\n",
" )\n",
"\n",
"# create some random data\n",
"array = numpy.random.rand(100, 100, 100)\n",
"array = array.astype('float32')\n",
"\n",
"dataset[:] = array\n",
"\n",
"f.close()\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"None\n",
"(1, 10, 2)\n"
]
}
],
"source": [
"import bitshuffle, os \n",
"print(os.environ.get(\"HDF5_PLUGIN_PATH\"))\n",
"\n",
"import numpy, scipy, pyFAI, h5py, bitshuffle.h5\n",
"print(h5py.version.hdf5_version_tuple)\n",
"%matplotlib nbagg\n",
"from matplotlib.pyplot import subplots"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {},
"outputs": [],
"source": [
"prefix = '/scratch/kieffer/JF16/'\n",
"ped_file = prefix + 'pedestal_20190324_0846.JF07T32V01.h5'\n",
"gain_file = prefix + 'gains_201810.h5'\n",
"img_files = prefix + \"lysoembl_32_1153.JF07T32V01.h5\"\n",
"#%time ref = calc_pedestal(ped_file, 0 , 100)\n",
"with h5py.File(gain_file, \"r\") as h:\n",
" gain = h[\"gains\"][...]"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[42.20000076 42.20000076 42.36162567 ... 40.49427795 40.55762482\n",
" 40.33831787]\n",
" [42.20184708 42.15740585 42.80419159 ... 40.62117767 39.87102127\n",
" 40.61871338]\n",
" [42.23724747 42.45800781 42.09789276 ... 40.28950119 40.78246689\n",
" 40.96500015]\n",
" ...\n",
" [40.81444168 40.93740845 41.11075974 ... 40.85427475 40.30038452\n",
" 40.05840683]\n",
" [41.10281754 41.63383484 41.02978897 ... 41.06227875 41.12207031\n",
" 40.50315857]\n",
" [42.20000076 41.3877182 41.42298508 ... 40.43046951 40.06472778\n",
" 39.78421402]]\n",
"[[-1.42499995 -1.42499995 -1.39686532 ... -1.37109321 -1.37254508\n",
" -1.38444994]\n",
" [-1.41875578 -1.42002005 -1.41433649 ... -1.36555869 -1.37736636\n",
" -1.41221789]\n",
" [-1.41662408 -1.42228047 -1.4124643 ... -1.32779197 -1.40245844\n",
" -1.42515804]\n",
" ...\n",
" [-1.36125355 -1.38601559 -1.39458315 ... -1.36025679 -1.35009144\n",
" -1.35155146]\n",
" [-1.33137309 -1.38245055 -1.38943187 ... -1.36184631 -1.35530838\n",
" -1.34524488]\n",
" [-1.42499995 -1.34156641 -1.3809811 ... -1.34832714 -1.327512\n",
" -1.33679067]]\n"
]
}
],
"source": [
"gains = gain.astype(\"float32\")\n",
"print(gain[0])\n",
"print(gain[1])"
]
},
{
"cell_type": "code",
"execution_count": 158,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 32 ms, sys: 5.23 ms, total: 37.3 ms\n",
"Wall time: 155 ms\n"
]
}
],
"source": [
"%%time \n",
"with h5py.File(ped_file, mode=\"r\") as h:\n",
" k = list(h[\"data\"].keys())[0]\n",
" ds = h[\"data/%s/data\"%k][:, 50, 60]"
]
},
{
"cell_type": "code",
"execution_count": 159,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(3500,)\n"
]
},
{
"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",
" fig.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\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 overridden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + 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",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\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,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4nO3de4zVdX74/w+yzAjqAHZmkYtDvaDdQBdtlIrXfAOCopFouhK0rNUGFmW7GhGUWkvSRBa7G5qNK5bG2x9rIWp0bX+O2IpI1FVW4gBy84bi1EXdIjPiBeTy+v1hPOuRcR36xjnznvN4JO8/+Hze5/DhzWfmPDlzPh+KAACgqhSVPgAAADqXAAQAqDICEACgyghAAIAqIwABAKqMAAQAqDICEACgyghAAIAqIwABAKqMAAQAqDICEACgyghAAIAqIwABAKqMAAQAqDICEACgyghAAIAqIwABAKqMAAQAqDICEACgyghAAIAqIwABAKqMAAQAqDICEACgyghAAIAqIwABAKqMAAQAqDICEACgyghAAIAqIwABAKqMAAQAqDICEACgyghAAIAqIwABAKqMAAQAqDICEACgyghAAIAqIwABAKqMAAQAqDICEACgyghAAIAqIwABAKqMAAQAqDICEACgyghAAIAqIwABAKqMAAQAqDICEACgyghAAIAqIwABAKqMAAQAqDICEACgyghAAIAqIwABAKqMAAQAqDICEACgyghAAIAqIwAT7N27N1paWqK1tTXa2toMwzAMw8hgtLa2RktLS+zdu7fSKVExAjBBS0tLFEVhGIZhGEaGo6WlpdIpUTECMEFra2vpBKr0v2YMwzAMw+jY+OINnNbW1kqnRMUIwARtbW1RFEW0tbVV+lAAgA7y+i0AkziBACA/Xr8FYBInEADkx+u3AEziBAKA/Hj9FoBJnEAAkB+v3wIwiRMIAPLj9VsAJnECAUB+vH4LwCROIADIj9dvAZjECQQA+fH6LQCTOIEAID9evwVgEicQAOTH67cATOIEAoD8eP0WgEmcQACQH6/fAjCJEwgA8uP1WwAmcQIBQH68fgvAJN/2CTT0xv+vbAAA6QSgAEwiAAEgPwJQACYRgACQHwEoAJMIQADIjwAUgEkEIADkRwB2wQCcN29enHLKKXH44YdHQ0NDTJw4MTZt2lQ255xzzomiKMrGj370o7I5W7ZsiQkTJkTv3r2joaEhbrjhhti9e3fZnOXLl8fJJ58cNTU1cdxxx8W99957QMcqAAEgPwKwCwbg+PHj4957741169bF6tWrY8KECdHY2BgfffRRac4555wTU6dOja1bt5bGl/8S9+zZEyNGjIixY8dGc3NzNDU1RX19fcyZM6c0Z/PmzdGnT5+4/vrrY8OGDXH77bdHz549Y+nSpR0+VgEIAPkRgF0wAL/q/fffj6IoYsWKFaVt55xzTlx77bVf+5impqY45JBD4t133y1tu/POO6Ouri527doVERGzZ8+O4cOHlz1u0qRJMX78+A4fmwAEgPwIwAwC8LXXXouiKOLll18ubTvnnHOivr4+/uRP/iSGDx8eN910U3z88cel/bfcckuMHDmy7Hk2b94cRVHESy+9FBERZ5111n4Rec8990RdXV2Hj00AAkB+BGAXD8C9e/fGBRdcEGeccUbZ9kWLFsXSpUtj7dq18atf/SoGDx4cF198cWn/1KlTY9y4cWWP+fjjj6MoimhqaoqIiGHDhsW8efPK5jz22GNRFEV88skn7R7Pzp07o62trTRaWloEIABkRgB28QCcPn16DB06NFpaWv7ovGXLlkVRFPH6669HxLcXgHPnzt3v4hMBCAB5EYBdOABnzJgRQ4YMic2bN3/j3I8++iiKoihdwPFt/QjYO4AAkD8B2AUDcN++fTFjxowYNGhQvPrqqx16zLPPPhtFUcSaNWsi4g8Xgbz33nulOYsWLYq6urrYuXNnRHx+EciIESPKnmfy5MkuAgGAbk4AdsEAvPrqq6Nv377x9NNPl93m5Ysfy77++uvxT//0T7Fq1ap4880349FHH41jjz02zj777NJzfHEbmHHjxsXq1atj6dKl0dDQ0O5tYGbNmhUbN26MO+64w21gAKAKCMAuGIDtfcauKIrSTZrffvvtOPvss+PII4+M2traOP7442PWrFn7/SW+9dZbcf7550fv3r2jvr4+Zs6c2e6NoE866aSoqamJY4891o2gAaAKCMAuGIA5EYAAkB8BKACTCEAAyI8AFIBJBCAA5EcACsAkAhAA8iMABWASAQgA+RGAAjCJAASA/AhAAZhEAAJAfgSgAEwiAAEgPwJQACYRgACQHwEoAJMIQADIjwAUgEkEIADkRwAKwCQCEADyIwAFYBIBCAD5EYACMIkABID8CEABmEQAAkB+BKAATCIAASA/AlAAJhGAAJAfASgAkwhAAMiPABSASQQgAORHAArAJAIQAPIjAAVgEgEIAPkRgAIwiQAEgPwIQAGYRAACQH4EoABMIgABID8CUAAmEYAAkB8BKACTCEAAyI8AFIBJBCAA5EcACsAkAhAA8iMABWASAQgA+RGAAjCJAASA/AhAAZhEAAJAfgSgAEwiAAEgPwJQACYRgACQHwEoAJMIQADIjwAUgEkEIADkRwAKwCQCEADyIwAFYBIBCAD5EYACMIkABID8CEABmEQAAkB+BKAATCIAASA/AlAAJhGAAJAfASgAkwhAAMiPABSASQQgAORHAArAJAIQAPIjAAVgEgEIAPkRgAIwiQAEgPwIQAGYRAACQH4EoABMIgABID8CUAAmEYAAkB8BKACTCEAAyI8AFIBJBCAA5EcACsAkAhAA8iMABWASAQgA+RGAAjCJAASA/AhAAZhEAAJAfgSgAEwiAAEgPwJQACYRgACQHwEoAJMIQADIjwAUgEkEIADkRwB2wQCcN29enHLKKXH44YdHQ0NDTJw4MTZt2lQ259NPP41rrrkmjjzyyDjssMPikksuiXfffbdszpYtW2LChAnRu3fvaGhoiBtuuCF2795dNmf58uVx8sknR01NTRx33HFx7733HtCxCkAAyI8A7IIBOH78+Lj33ntj3bp1sXr16pgwYUI0NjbGRx99VJozffr0OProo2PZsmWxatWqOO200+L0008v7d+zZ0+MGDEixo4dG83NzdHU1BT19fUxZ86c0pzNmzdHnz594vrrr48NGzbE7bffHj179oylS5d2+FgFIADkRwB2wQD8qvfffz+KoogVK1ZERERra2v06tUrHnzwwdKcjRs3RlEU8fzzz0dERFNTUxxyyCFl7wreeeedUVdXF7t27YqIiNmzZ8fw4cPLfq9JkybF+PHjO3xsAhAA8iMAMwjA1157LYqiiJdffjkiIpYtWxZFUcT27dvL5jU2NsaCBQsiIuKWW26JkSNHlu3fvHlzFEURL730UkREnHXWWXHttdeWzbnnnnuirq7ua49l586d0dbWVhotLS0CEAAyIwC7eADu3bs3LrjggjjjjDNK2+6///6oqanZb+6pp54as2fPjoiIqVOnxrhx48r2f/zxx1EURTQ1NUVExLBhw2LevHllcx577LEoiiI++eSTdo9n7ty5URTFfkMAAkA+BGAXD8Dp06fH0KFDo6WlpbStkgHoHUAAyJ8A7MIBOGPGjBgyZEhs3ry5bHslfwT8VT4DCAD5EYBdMAD37dsXM2bMiEGDBsWrr7663/4v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QH4EoABMIgABID8CUAAmEYAAkB8BKACTCEAAyI8AFIBJBCAA5EcACsAkAhAA8iMABWASAQgA+RGAAjCJAASA/AhAAZhEAAJAfgSgAEwiAAEgPwJQACYRgACQHwEoAJMIQADIjwAUgEkEIADkRwAKwCQCEADyIwAFYBIBCAD5EYACMIkABID8CEABmEQAAkB+BKAATCIAASA/AlAAJhGAAJAfASgAkwhAAMiPABSASQQgAORHAArAJAIQAPIjALtoAK5YsSIuvPDCGDhwYBRFEY888kjZ/n379sUtt9wSRx11VBx66KExZsyYePXVV8vmbNu2LS677LI44ogjom/fvnHVVVfFjh07yuasWbMmzjzzzKitrY0hQ4bEbbfddkDHKQABID8CsIsGYFNTU9x8883x8MMPtxuA8+fPj759+8avf/3rWLNmTVx00UVxzDHHxKefflqac95558XIkSPjhRdeiGeeeSaOP/74mDx5cml/W1tbDBgwIC6//PJYt25dLF68OHr37h2LFi3q8HEKQADIjwDsogH4ZV8NwH379sVRRx0VP/vZz0rbWltbo7a2NhYvXhwRERs2bIiiKOLFF18szXn88cejR48e8c4770RExMKFC6N///6xa9eu0pwbb7wxTjzxxA4fmwAEgPwIwAwD8I033oiiKKK5ubls3tlnnx0/+clPIiLi7rvvjn79+pXt3717d/Ts2TMefvjhiIiYMmVKTJw4sWzOU089FUVRxAcffNDusezcuTPa2tpKo6WlRQACQGYEYIYB+Nxzz0VRFPG73/2ubN4PfvCDuPTSSyMi4tZbb40TTjhhv+dqaGiIhQsXRkTEueeeG9OmTSvbv379+iiKIjZs2NDuscydOzeKothvCEAAyIcAFIBl+78pAL0DCAD5E4AZBmAlfwT8VT4DCAD5EYAZBuAXF4H8/Oc/L21ra2tr9yKQVatWleY88cQT7V4E8tlnn5XmzJkzx0UgANDNCcAuGoA7duyI5ubmaG5ujqIoYsGCBdHc3BxbtmyJiM9vA9OvX7949NFHY+3atTFx4sR2bwNz8sknx8qVK+PZZ5+NYcOGld0GprW1NQYMGBBTpkyJdevWxZIlS6JPnz5uAwMA3ZwA7KIBuHz58nYvtrjiiisi4g83gh4wYEDU1tbGmDFj4pVXXil7jm3btsXkyZPj8MMPj7q6urjy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U06Jww8/PBoaGmLixImxadOmsjmffvppXHPNNXHkkUfGYYcdFpdccsl+tx7asmVLTJgwIXr37h0NDQ1xww03xO7du8vmLF++PE4++eSoqamJ4447Lu699979jqcrnpMLFy6MP//zP48jjjgijjjiiDjttNOiqamptL/a1+fr/PSnP42iKCRTRl8AAAm1SURBVOLaa68tbbNW7f8XnSeeeGJpvzX6g//5n/+Jyy+/PI488sg49NBDY8SIEfHiiy+W9vs+Xl0E4EGyZMmSqKmpiXvuuSfWr18fU6dOjX79+sV7771X6UM7KJqamuLmm2+Ohx9+uN0AnD9/fvTt2zd+/etfx5o1a+Kiiy6KY445Jj799NPSnPPOOy9GjhwZL7zwQjzzzDNx/PHHx+TJk0v729raYsCAAXH55ZfHunXrYvHixdG7d+9YtGhRac5zzz0XPXv2jH/+53+ODRs2xD/8wz9Er1694uWXX/72F6EDxo8fH/fee2+sW7cuVq9eHRMmTIjGxsb46KOPSnOmT58eRx99dCxbtixWrVoVp512Wpx++uml/Xv27IkRI0bE2LFjo7m5OZqamqK+vj7mzJlTmrN58+bo06dPXH/99bFhw4a4/fbbo2fPnrF06dLSnK56Tv7Hf/xHPPbYY/Hqq6/GK6+8En//938fvXr1inXr1kWE9WnPb3/72/jTP/3T+P73v18WgNbq8wAcPnx4bN26tTR+//vfl/Zbo8998MEHMXTo0Pibv/mbWLlyZWzevDmeeOKJeP3110tzfB+vLgLwIBk1alTMmDGj9Ou9e/fGoEGDkv5Xka7qqwG4b9++OOqoo+JnP/tZaVtra2vU1tbG4sWLIyJiw4YNURRF2b82H3/88ejRo0e88847EfH5O0P9+/ePXbt2lebceOONZf+av/TSS+OCCy4oO56//Mu/jB/96EcH9w95kLz//vtRFEWsWLEiIj5fl169esWDDz5YmrNx48YoiiKef/75iPg8tg855JCydynuvPPOqKurK63N7NmzY/jw4WW/16RJk2L8+PGlX+d0Tvbv3z/uuusu69OOHTt2xLBhw+K///u/45xzzikFoLX63Ny5c2PkyJHt7rNGf3DjjTfGmWee+bX7fR+vPgLwIPi2/l/hruqrAfjGG29EURTR3NxcNu/ss8+On/zkJxERcffdd0e/fv3K9u/evTt6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\" width=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"(array([2569., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 538., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 393.]),\n",
" array([ 2396., 3007., 3618., 4229., 4840., 5451., 6062., 6673.,\n",
" 7284., 7895., 8506., 9117., 9728., 10339., 10950., 11561.,\n",
" 12172., 12783., 13394., 14005., 14616., 15227., 15838., 16449.,\n",
" 17060., 17671., 18282., 18893., 19504., 20115., 20726., 21337.,\n",
" 21948., 22559., 23170., 23781., 24392., 25003., 25614., 26225.,\n",
" 26836., 27447., 28058., 28669., 29280., 29891., 30502., 31113.,\n",
" 31724., 32335., 32946., 33557., 34168., 34779., 35390., 36001.,\n",
" 36612., 37223., 37834., 38445., 39056., 39667., 40278., 40889.,\n",
" 41500., 42111., 42722., 43333., 43944., 44555., 45166., 45777.,\n",
" 46388., 46999., 47610., 48221., 48832., 49443., 50054., 50665.,\n",
" 51276., 51887., 52498., 53109., 53720., 54331., 54942., 55553.,\n",
" 56164., 56775., 57386., 57997., 58608., 59219., 59830., 60441.,\n",
" 61052., 61663., 62274., 62885., 63496.]),\n",
" <a list of 100 Patch objects>)"
]
},
"execution_count": 159,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"print(ds.shape)\n",
"fig,ax = subplots()\n",
"ax.hist(ds, 100)"
]
},
{
"cell_type": "code",
"execution_count": 160,
"metadata": {},
"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",
" fig.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\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 overridden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + 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",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\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,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4nO3de3xUhZ3//4MpEwkSApsUBUkqitQlFdmVlFgv3/6goOgXfvhb5YFWXe2CVKy6clcxrcrFy9J2uZWuAu0WoWC5KAnxAgG5RiIh5AqBQAghBAiZEHLP5P37I8zomICHOeg5YV7Px+M82mROwpzJ5+Hn5YQZDQEAACCoGHbfAQAAAHy/CEAAAIAgQwACAAAEGQIQAAAgyBCAAAAAQYYABAAACDIEIAAAQJAhAAEAAIIMAQgAABBkCEAAAIAgQwACAAAEGQIQAAAgyBCAAAAAQYYABAAACDIEIAAAQJAhAAEAAIIMAQgAABBkCEAAAIAgQwACAAAEGQIQAAAgyBCAAAAAQYYABAAACDIEIAAAQJAhAAEAAIIMAQgAABBkCEAAAIAgQwACAAAEGQIQAAAgyBCAAAAAQYYABAAACDIEIAAAQJAhAAEAAIIMAQgAABBkCEAAAIAgQwACAAAEGQIQAAAgyBCAAAAAQYYABAAACDIEIAAAQJAhAAEAAIIMAQgAABBkCEAAAIAgQwACAAAEGQIQAAAgyBCAAAAAQYYABAAACDIEIAAAQJAhAAEAAIIMAQgAABBkCEAAAIAgQwACAAAEGQIQAAAgyBCAAAAAQYYABAAACDIEIAAAQJAhAAEAAIIMAWiBx+NRUVGR3G63KioqODg4ODg4ONrA4Xa7VVRUJI/HY3dK2IYAtKCoqEiGYXBwcHBwcHC0waOoqMjulLANAWiB2+32DZDd/zbDwcHBwcHBYe7wPoHjdrvtTgnbEIAWVFRUyDAMVVRU2H1XAACASexvAtASBggAgLaH/U0AWsIAAQDQ9rC/CUBLGCAAANoe9jcBaAkDBABA28P+JgAtYYAAAGh72N8EoCUMEAAAbQ/7mwC0hAECAKDtYX8TgJYwQAAAtD3sbwLQEgYIAIC2h/1NAFrCAAEA0PawvwlASxggAADaHvY3AWgJAwQAQNvD/iYALWGAAABOsy3/lF77KFuvf5St6WszlbAuS79aultvrM9WwrosJazL0kur9+lXS7/QlA8yNHHlXiWsy9KspFwlrMvStNX79LsPs/XbD7N857+xPltvrM/WzMQcvZ2cp4R1WXphRboS1mXp9Y+yNTMpRwnrsjQjMUeP/s8ujZy/TTMTczR7Q65mb8jV6x9la+LKvZqZmKPffdj8fV49f9+83/v1j7L12kfZLf7slLzSy/4Ysb8JQEsYIACAk1TU1OvGaYmKmbL+ijl+/+n+y/84sb8JQCsYIACAk5S4a3zh5H2W7pfv7tLoP+/0Pcs2M6n5mblJq/ZqRmKOfvthln7z/h699lG2ZiTm6I312ZqVlKs3N+Tq7eQ8vbkhVzMSczQjMUevfZStV9dm6qGFO/Tymn1+zxh6n7F79v096v1Skl5dm+l7Nm/a6n0av+xL3zN7b6xvfnZy+tpM3/eemZijmUk5mpXU/Kzhmxty9VZyrrbnn7rsjxP7mwC0hAECADiJNwBveinR7rviaOxvAtASBggA4CQEoDnsbwLQEgYIAOAkBKA57G8C0BIGCADgJASgOexvAtASBggA4CTH3dUEoAnsbwLQEgYIAOAk3gDs/VKS3XfF0djfBKAlDBAAwEkIQHPY3wSgJQwQAMBJCEBz2N8EoCUMEADASQhAc9jfBKAlDBAAwEmKywlAM9jfBKAlDBAAwEl8AfgyAXgx7G8C0BIGCADgJASgOexvAtASBggA4CQEoDnsbxsC8NixY3r00UfVtWtXXX311YqNjdXu3bt9tzc1NWn69Om69tprdfXVV2vQoEE6cOCA3/coKyvTI488ok6dOqlz58566qmnVFlZ6XdORkaG7rzzToWGhur666/Xm2++2eK+rFy5Un369FFoaKhiY2OVmHhpb5zJAAEAnIQANIf9/T0H4JkzZxQTE6N///d/V2pqqgoKCvTxxx/r4MGDvnNmz56tzp07a+3atcrIyNDw4cN1ww03qKamxnfOvffeq379+mnXrl3aunWrbrrpJo0ePdp3e0VFhbp166ZHH31UWVlZWr58uTp06KBFixb5ztm+fbtCQkL01ltvKScnR6+88orat2+vzMxM09fDAAEAnIQANIf9/T0H4JQpU3TnnXde8PampiZde+21evvtt32fc7vdCg0N1fLlyyVJOTk5MgzD71nDDRs2qF27diouLpYkLViwQF26dFFdXZ3fn92nTx/fxw8//LDuv/9+vz//pz/9qZ5++mnT18MAAQCc5BgBaAr7+3sOwFtuuUUvvPCC/u3f/k1RUVG67bbb9Oc//9l3+6FDh2QYhtLT0/2+7u6779Zzzz0nSXrvvfcUERHhd3tDQ4NCQkK0evVqSdJjjz2mESNG+J2zadMmGYahM2fOSJJ69uyp3//+937nvPrqq7r11ltNXw8DBABwEm8A3kwAXhT7+3sOwNDQUIWGhmratGnas2ePFi1apKuvvlpLly6V1PxrWcMwdPz4cb+ve+ihh/Twww9LkmbMmKGbb765xfeOiorSggULJEm/+MUvNHbsWL/bs7OzZRiGcnJyJEnt27fX+++/73fO/Pnz9cMf/vCC97+2tlYVFRW+o6ioKOgHCADgHASgOQTg9xyA7du3V3x8vN/nfvOb32jgwIGSnB+ACQkJMgyjxRHMAwQAcA4C0BwC8HsOwOjoaP3qV7/y+9yCBQvUvXt3Sc7/FTDPAAIAnIwANIcA/J4DcPTo0S1eBPLCCy/4nhX0vgjknXfe8d1eUVHR6otA0tLSfOd8/PHHrb4IpL6+3nfOtGnTWrwI5IEHHvC7L/Hx8bwIBADQZhWdqSIATWB/f88B+MUXX+gHP/iBZsyYofz8fC1btkxhYWH629/+5jtn9uzZioiI0Lp167Rv3z6NGDGi1beB6d+/v1JTU7Vt2zb17t3b721g3G63unXrpscee0xZWVlasWKFwsLCWrwNzA9+8AO98847ys3NVUJCAm8DAwBo07wB2OcVAvBi2N82vBH0Rx99pNjYWIWGhurHP/6x36uApa/eCLpbt24KDQ3VoEGDtH//fr9zysrKNHr0aF1zzTUKDw/Xk08+edE3gu7Ro4dmz57d4r6sXLlSN998s1wul/r27csbQQMA2jQC0Bz2N/8pOEsYIACAkxCA5rC/CUBLGCAAgJMQgOawvwlASxggAICTEIDmsL8JQEsYIACAkxwtIwDNYH8TgJYwQAAAJ/EG4I9f2WD3XXE09jcBaAkDBABwEgLQHPY3AWgJAwQAcBIC0Bz2NwFoCQMEAHASAtAc9jcBaAkDBABwEgLQHPY3AWgJAwQAcBJvAN4ynQC8GPY3AWgJAwQAcBIC0Bz2NwFoCQMEAHASAtAc9jcBaAkDBABwEgLQHPY3AWgJAwQAcBIC0Bz2NwFoCQMEAHCSwtMEoBnsbwLQEgYIAOAk3gD8ZwLwotjfBKAlDBAAwEkIQHPY3wSgJQwQAMBJCEBz2N8EoCUMEADASQhAc9jfBKAlDBAAwEmOnD5HAJrA/iYALWGAAABOQgCaw/4mAC1hgAAATuINwL6vJtt9VxyN/U0AWsIAAQCchAA0h/1NAFrCAAEAnIQANIf9TQBawgABAJyEADSH/U0AWsIAAQCc5PApAtAM9jcBaAkDBABwEm8AxhKAF8X+JgAtYYAAAE5CAJrD/iYALWGAAABOQgCaw/4mAC1hgAAATkIAmsP+JgAtYYAAAE5SQACawv4mAC1hgAAATkIAmsP+JgAtYYAAAE7iC8AEAvBi2N8EoCUMEADASQhAc9jfBKAlDBAAwEkIQHPY3wSgJQwQAMBJCEBz2N8EoCUMEADASQ6drCQATWB/E4CWMEAAACfxBuBPCMCLYn8TgJYwQAAAJyEAzWF/E4CWMEAAACchAM1hfxOAljBAAAAnIQDNYX8TgJYwQAAAJzlIAJrC/iYALWGAAABOQgCaw/4mAC1hgAAATuINwFt/+7Hdd8XR2N8EoCUMEADASQhAc9jfNgRgQkKCDMPwO/r06eO7vaamRs8884y6du2qjh076sEHH9SJEyf8vkdhYaGGDRumDh06KCoqShMnTlRDQ4PfOSkpKerfv79cLpduvPFGLVmypMV9mTdvnmJiYhQaGqq4uDilpqZe0rUwQAAAJyEAzWF/2xSAffv2VUlJie84deqU7/Zx48apZ8+e2rhxo9LS0jRw4EDdcccdvtsbGxsVGxurwYMHKz09XUlJSYqMjNS0adN85xQUFCgsLEwvvviicnJyNHfuXIWEhCg5+au/E7FixQq5XC4tXrxY2dnZGjNmjCIiIlRaWmr6WhggAICTEIDmsL9tCsB+/fq1epvb7Vb79u21atUq3+dyc3NlGIZ27twpSUpKStJVV13l96zgwoULFR4errq6OknS5MmT1bdvX7/vPWrUKA0dOtT3cVxcnMaPH+/72OPxqHv37po1a5bpa2GAAABOkl9KAJrB/rYpAMPCwnTdddfphhtu0COPPKLCwkJJ0saNG2UYhsrLy/2+Jjo6WnPmzJEkTZ8+vUVAFhQUyDAM7dmzR5J011136fnnn/c7Z/HixQoPD5ck1dXVKSQkRGvWrPE75/HHH9fw4cNNXwsDBABwEm8A9vsdAXgx7G8bAjApKUkrV65URkaGkpOTFR8fr+joaJ09e1bLli2Ty+Vq8TUDBgzQ5MmTJUljxozRkCFD/G6vqqqSYRhKSkqSJPXu3VszZ870OycxMVGGYai6ulrFxcUyDEM7duzwO2fSpEmKi4u74H2vra1VRUWF7ygqKgr6AQIAOAcBaA4B6IBXAZeXlys8PFzvvvuu4wOwtRewBPsAAQCcgwA0hwB0QABK0u23366pU6c6/lfAPAMIAHAyAtAcAtABAVhZWakuXbroj3/8o+9FIB988IHv9ry8vFZfBPL1V+suWrRI4eHhqq2tldT8IpDY2Fi/P2f06NEtXgTy7LPP+j72eDzq0aMHLwIBALRZ+aVnCUAT2N82BOCECRO0efNmHT58WNu3b9fgwYMVGRmpkydPSmp+G5jo6Ght2rRJaWlpio+PV3x8vO/rvW8DM2TIEO3du1fJycmKiopq9W1gJk2apNzcXM2fP7/Vt4EJDQ3V0qVLlZOTo7FjxyoiIqLFew5eDAMEAHASAtAc9rcNAThq1Chdd911crlc6tGjh0aNGqWDBw/6bve+EXSXLl0UFhamkSNHqqSkxO97HDlyRPfdd586dOigyMhITZgwodU3gr7tttvkcrnUq1evVt8Ieu7cuYqOjpbL5VJcXJx27dp1SdfCAAEAnMQbgLcRgBfF/nbAr4DbMgYIAOAkBKA57G8C0BIGCADgJASgOexvAtASBggA4CQEoDnsbwLQEgYIAOAkB04QgGawvwlASxggAICTeAOw/2uf2H1XHI39TQBawgABAJyEADSH/U0AWsIAAQCchAA0h/1NAFrCAAEAnIQANIf9TQBawgABAJyEADSH/U0AWsIAAQCcZD8BaAr7mwC0hAECADiJNwD/hQC8KPY3AWgJAwQAcBIC0Bz2NwFoCQMEAHASAtAc9jcBaAkDBABwEgLQHPY3AWgJAwQAcJK8EgLQDPY3AWgJAwQAcBIC0Bz2NwFoCQMEAHASbwD+6+sE4MWwvwlASxggAICTEIDmsL8JQEsYIACAkxCA5rC/CUBLGCAAgJMQgOawvwlASxggAICT5JZUEIAmsL8JQEsYIACAk3wVgJ/afVccjf1NAFrCAAEAnIQANIf9TQBawgABAJyEADSH/U0AWsIAAQCchAA0h/1NAFrCAAEAnCTnOAFoBvubALSEAQIAOAkBaA77mwC0hAECADiJNwBvf4MAvBj2NwFoCQMEAHASAtAc9jcBaAkDBABwEgLQHPY3AWgJAwQAcBIC0Bz2NwFoCQMEAHCS7GIC0Az2NwFoCQMEAHASbwAOIAAviv1NAFrCAAEAnIQANIf9TQBawgABAJyEADSH/U0AWsIAAQCchAA0h/1NAFrCAAEAnCSr2E0AmsD+JgAtYYAAAE5CAJrD/iYALWGAAABO4g3AuBkE4MWwvwlASxggAICTEIDmsL8JQEsYIACAkxCA5rC/CUBLGCAAgJMQgOawvwlASxggAICTZB4jAM1gfxOAljBAAAAn8QbgT2d8ZvddcTT2NwFoCQMEAHASAtAc9rfNAThr1iwZhqHnn3/e97mamho988wz6tq1qzp27KgHH3xQJ06c8Pu6wsJCDRs2TB06dFBUVJQmTpyohoYGv3NSUlLUv39/uVwu3XjjjVqyZEmLP3/evHmKiYlRaGio4uLilJqaekn3nwECADgJAWgO+9vGAPziiy/0ox/9SLfeeqtfAI4bN049e/bUxo0blZaWpoEDB+qOO+7w3d7Y2KjY2FgNHjxY6enpSkpKUmRkpKZNm+Y7p6CgQGFhYXrxxReVk5OjuXPnKiQkRMnJyb5zVqxYIZfLpcWLFys7O1tjxoxRRESESktLTV8DAwQAcBIC0Bz2t00BWFlZqd69e+vTTz/VPffc4wtAt9ut9u3ba9WqVb5zc3NzZRiGdu7cKUlKSkrSVVdd5fes4MKFCxUeHq66ujpJ0uTJk9W3b1+/P3PUqFEaOnSo7+O4uDiNHz/e97HH41H37t01a9Ys09fBAAEAnIQANIf9bVMAPv7443rhhRckyS8AN27cKMMwVF5e7nd+dHS05syZI0maPn26+vXr53d7QUGBDMPQnj17JEl33XWX37OKkrR48WKFh4dLkurq6hQSEqI1a9a0uF/Dhw83fR0MEADASQhAc9jfNgTg8uXLFRsbq5qaGkn+Abhs2TK5XK4WXzNgwABNnjxZkjRmzBgNGTLE7/aqqioZhqGkpCRJUu/evTVz5ky/cxITE2UYhqqrq1VcXCzDMLRjxw6/cyZNmqS4uLgL3vfa2lpVVFT4jqKioqAfIACAc3gDcOBMAvBiCMDvOQCPHj2qH/7wh8rIyPB9ri0FYEJCggzDaHEE8wABAJyDADSHAPyeA3DNmjUyDEMhISG+wzAMtWvXTiEhIfrss88c/StgngEEADgZAWgOAfg9B+DZs2eVmZnpd9x+++365S9/qczMTN+LQD744APf1+Tl5bX6IpCvv1p30aJFCg8PV21traTmF4HExsb6/dmjR49u8SKQZ5991vexx+NRjx49eBEIAKDNIgDNYX874I2gv/4rYKn5bWCio6O1adMmpaWlKT4+XvHx8b7bvW8DM2TIEO3du1fJycmKiopq9W1gJk2apNzcXM2fP7/Vt4EJDQ3V0qVLlZOTo7FjxyoiIqLFew5eDAMEAHCSfUUEoBnsbwcGoPeNoLt06aKwsDCNHDlSJSUlfl9z5MgR3XffferQoYMiIyM1YcKEVt8I+rbbbpPL5VKvXr1afSPouXPnKjo6Wi6XS3Fxcdq1a9cl3XcGCADgJN4AjCcAL4r97YAAbMsYIACAkxCA5rC/CUBLGCAAgJMQgOawvwlASxggAICTEIDmsL8JQEsYIACAk2QUlROAJrC/CUBLGCAAgJMQgOawvwlASxggAICTeAPwjlkb7b4rjsb+JgAtYYAAAE5CAJrD/iYALWGAAABOQgCaw/4mAC1hgAAATkIAmsP+JgAtYYAAAE6y9ygBaAb7mwC0hAECADgJAWgO+5sAtIQBAgA4CQFoDvubALSEAQIAOAkBaA77mwC0hAECADgJAWgO+5sAtIQBAgA4SToBaAr7mwC0hAECADgJAWgO+5sAtIQBAgA4iTcAfzabALwY9jcBaAkDBABwEgLQHPY3AWgJAwQAcBIC0Bz2NwFoCQMEAHASAtAc9jcBaAkDBABwkj2FZwhAE9jfBKAlDBAAwEkIQHPY3wSgJQwQAMBJvAF455sE4MWwvwlASxggAICTEIDmsL8JQEsYIACAkxCA5rC/CUBLGCAAgJN8SQCawv4mAC1hgAAATkIAmsP+JgAtYYAAAE7iDcC73txk911xNPY3AWgJAwQAcBIC0Bz2NwFoCQMEAHASAtAc9jcBaAkDBABwEgLQHPY3AWgJAwQAcJK0IwSgGexvAtASBggA4CQEoDnsbwLQEgYIAOAk3gC8+y0C8GLY3wSgJQwQAMBJCEBz2N8EoCUMEADASQhAc9jfBKAlDBAAwEnSjpQRgCawvwlASxggAICTEIDmsL8JQEsYIACAk3gD8B4C8KLY3wSgJQwQAMBJCEBz2N8EoCUMEADASQhAc9jfBKAlDBAAwEkIQHPY3wSgJQwQAMBJdh8mAM1gfxOAljBAAAAnIQDNYX8TgJYwQAAAJ/EG4P95O8Xuu+Jo7G8bAnDBggX6yU9+ok6dOqlTp04aOHCgkpKSfLfX1NTomWeeUdeuXdWxY0c9+OCDOnHihN/3KCws1LBhw9ShQwdFRUVp4sSJamho8DsnJSVF/fv3l8vl0o033qglS5a0uC/z5s1TTEyMQkNDFRcXp9TU1Eu6FgYIAOAkBKA57G8bAvDDDz9UYmKiDhw4oP379+ull15S+/btlZWVJUkaN26cevbsqY0bNyotLU0DBw7UHXfc4fv6xsZGxcbGavDgwUpPT1dSUpIiIyM1bdo03zkFBQUKCwvTiy++qJycHM2dO1chISFKTk72nbNixQq5XC4tXrxY2dnZGjNmjCIiIlRaWmr6WhggAICTEIDmsL8d8ivgLl266N1335Xb7Vb79u21atUq3225ubkyDEM7d+6UJCUlJemqq67ye1Zw4cKFCg8PV11dnSRp8uTJ6tu3r9+fMWrUKA0dOtT3cVxcnMaPH+/72OPxqHv37po1a5bp+80AAYC9ztbUK7u4QoWnq5RfWqnMY24dPFmpo2VVyjzm1pHT51RcXq0TFTU6Vl6tglPnlHnMraNlVX5H4emvjiOnz+nI6XM6fOqro+D8cehkpe84eP7IL/36cVb5pWd14MRXx/7zR17JV0duSYVySyqUc/yrI7v4qyOr2K2sYrcyj7U8UgvKdPBkpY6VV6voTJWKy6t917A+4zgBaAL72+YAbGxs1PLly+VyuZSdna2NGzfKMAyVl5f7nRcdHa05c+ZIkqZPn65+/fr53V5QUCDDMLRnzx5J0l133aXnn3/e75zFixcrPDxcklRXV6eQkBCtWbPG75zHH39cw4cPN33/GSAAsM+XhWfU55UkxUxZz/GNgwC8OPa3TQG4b98+dezYUSEhIercubMSExMlScuWLZPL5Wpx/oABAzR58mRJ0pgxYzRkyBC/26uqqmQYhu/vEvbu3VszZ870OycxMVGGYai6ulrFxcUyDEM7duzwO2fSpEmKi4u74P2ura1VRUWF7ygqKgr6AQIAu7y7tcAvev55+gb1mpaoPq8k6aaXEn2fv2Hqet04LVG9X/4qFn/8ygbfccv0r45/Pn/0fTXZd8R+/UhoPn7ytePW337sO/r9rvm47WtH/9c+Uf/XPtG/fO3419e/fnyqf339U93+xlfHgK8dcTOaj5/O+ExxMz5VzJT16v1Sku9/e7+UpF7TEnXzy0m65fx9/69P9tv943E0AtCmAKyrq1N+fr7S0tI0depURUZGKjs72/EBmJCQIMMwWhzBPEAAYBdvAP7m/T0XPKepqel7vEffr0bPlXtt3zUC0CF/B3DQoEEaO3as438FzDOAAOAc3gB8bvmFAxBoDQHokAD8+c9/rieeeML3IpAPPvjAd1teXl6rLwL5+qt1Fy1apPDwcNXW1kpqfhFIbGys358xevToFi8CefbZZ30fezwe9ejRgxeBAEAbQQAiUOxvGwJw6tSp2rJliw4fPqx9+/Zp6tSpateunT755BNJzW8DEx0drU2bNiktLU3x8fGKj4/3fb33bWCGDBmivXv3Kjk5WVFRUa2+DcykSZOUm5ur+fPnt/o2MKGhoVq6dKlycnI0duxYRUREtHjPwYthgADAPv/z+SECEAFhf9sQgE899ZRiYmLkcrkUFRWlQYMG+eJP+uqNoLt06aKwsDCNHDlSJSUlft/jyJEjuu+++9ShQwdFRkZqwoQJrb4R9G233SaXy6VevXq1+kbQc+fOVXR0tFwul+Li4rRr165LuhYGCADs4w3A5wlAXCL2t0N+BdxWMUAAYB8CEIFifxOAljBAAGAfAhCBYn8TgJYwQABgHwIQgWJ/E4CWMEAAYB8CEIFifxOAljBAAGAfbwC+sCLd7ruCNob9TQBawgABgH0IQASK/U0AWsIAAYB9CEAEiv1NAFrCAAGAff68hQBEYNjfBKAlDBAA2McbgP9JAOISsb8JQEsYIACwDwGIQLG/CUBLGCAAsA8BiECxvwlASxggALAPAYhAsb8JQEsYIACwz6ItBwlABIT9TQBawgABgH18Afh3AhCXhv1NAFrCAAGAfQhABIr9TQBawgABgH0IQASK/U0AWsIAAYB9/rSZAERg2N8EoCUMEADYxxuAL/59r913BW0M+5sAtIQBAgD7EIAIFPubALSEAQIA+xCACBT7mwC0hAECAPsQgAgU+5sAtIQBAgD7LCQAESD2NwFoCQMEAPbxBuCElQQgLg37mwC0hAECAPsQgAgU+5sAtIQBAgD7EIAIFPubALSEAQIA+xCACBT7mwC0hAECAPssSCEAERj2NwFoCQMEAPbxBuBEAhCXiP1NAFrCAAGAfQhABIr9TQBawgABgH0IQASK/U0AWsIAAYB95qfkE4AICPubALSEAQIA+3gDcNIqAhCXhv1NAFrCAAGAfQhABIr9TQBawgABgH0IQASK/U0AWsIAAYB9CEAEiv1NAFrCAAGAfeZtIgARGPY3AWgJAwQA9vEG4ORVGXbfFbQx7G8C0BIGCADsQwAiUOxvAtASBggA7EMAIlDsbwLQEgYIAOxDACJQ7G8C0BIGCADs4w3AKR8QgLg07G8C0BIGCADsQwAiUOxvAtASBggA7EMAIlDsbwLQEgYIAOxDACJQ7G8C0BIGCADsM3fjAca2jekAACAASURBVAIQAWF/2xCAM2fO1O23365rrrlGUVFRGjFihPLy8vzOqamp0TPPPKOuXbuqY8eOevDBB3XixAm/cwoLCzVs2DB16NBBUVFRmjhxohoaGvzOSUlJUf/+/eVyuXTjjTdqyZIlLe7PvHnzFBMTo9DQUMXFxSk1NdX0tTBAAGAfbwBO/QcBiEvD/rYhAIcOHaolS5YoKytLe/fu1bBhwxQdHa1z5875zhk3bpx69uypjRs3Ki0tTQMHDtQdd9zhu72xsVGxsbEaPHiw0tPTlZSUpMjISE2bNs13TkFBgcLCwvTiiy8qJydHc+fOVUhIiJKTk33nrFixQi6XS4sXL1Z2drbGjBmjiIgIlZaWmroWBggA7EMAIlDsbwf8CvjkyZMyDENbtmyRJLndbrVv316rVq3ynZObmyvDMLRz505JUlJSkq666iq/ZwUXLlyo8PBw1dXVSZImT56svn37+v1Zo0aN0tChQ30fx8XFafz48b6PPR6PunfvrlmzZpm67wwQANiHAESg2N8OCMD8/HwZhqHMzExJ0saNG2UYhsrLy/3Oi46O1pw5cyRJ06dPV79+/fxuLygokGEY2rNnjyTprrvu0vPPP+93zuLFixUeHi5JqqurU0hIiNasWeN3zuOPP67hw4ebuu8MEADYhwBEoNjfNgegx+PR/fffr5/97Ge+zy1btkwul6vFuQMGDNDkyZMlSWPGjNGQIUP8bq+qqpJhGEpKSpIk9e7dWzNnzvQ7JzExUYZhqLq6WsXFxTIMQzt27PA7Z9KkSYqLi2v1/tbW1qqiosJ3FBUVBf0AAYBd/vszAhCBIQBtDsBx48YpJiZGRUVFvs85OQATEhJkGEaLI5gHCADs8lUA7rP7rqCNIQBtDMDx48fr+uuvV0FBgd/nnfwrYJ4BBADnIAARKALQhgBsamrS+PHj1b17dx04cKDF7d4XgXzwwQe+z+Xl5bX6IpCvv1p30aJFCg8PV21traTmF4HExsb6fe/Ro0e3eBHIs88+6/vY4/GoR48evAgEANoAAhCBYn/bEIC//vWv1blzZ23evFklJSW+o7q62nfOuHHjFB0drU2bNiktLU3x8fGKj4/33e59G5ghQ4Zo7969Sk5OVlRUVKtvAzNp0iTl5uZq/vz5rb4NTGhoqJYuXaqcnByNHTtWERERLd5z8EIYIACwzx8JQASI/W1DALb2d+gMw/B7k2bvG0F36dJFYWFhGjlypEpKSvy+z5EjR3TfffepQ4cOioyM1IQJE1p9I+jbbrtNLpdLvXr1avWNoOfOnavo6Gi5XC7FxcVp165dpq+FAQIA+3gDcNpqAhCXhv3tgLeBacsYIACwDwGIQLG/CUBLGCAAsA8BiECxvwlASxggALAPAYhAsb8JQEsYIACwzx8+JQARGPY3AWgJAwQA9vEG4EsEIC4R+5sAtIQBAgD7EIAIFPubALSEAQIA+xCACBT7mwC0hAECAPv8/tP9BCACwv4mAC1hgADAPt4AfHkNAYhLw/4mAC1hgADAPgQgAsX+JgAtYYAAwD4EIALF/iYALWGAAMA+BCACxf4mAC1hgADAPnM+IQARGPY3AWgJAwQA9vEG4CtrMu2+K2hj2N8EoCUMEADYhwBEoNjfBKAlDBAA2IcARKDY3wSgJQwQANjnvwhABIj9TQBawgABgH28ATh9LQGIS8P+JgAtYYAAwD4EIALF/iYALWGAAMA+BCACxf4mAC1hgADAPgQgAsX+JgAtYYAAwD7/9XEeAYiAsL8JQEsYIACwjzcAXyUAcYnY3wSgJQwQANiHAESg2N8EoCUMEADYhwBEoNjfBKAlDBAA2IcARKDY3wSgJQwQANjnHQIQAWJ/E4CWMEAAYB9vACasy7L7rqCNYX8TgJYwQABgHwIQgWJ/E4CWMEAAYB8CEIFifxOAljBAAGCft5MJQASG/U0AWsIAAYB9CEAEiv1NAFrCAAGAfQhABIr9TQBawgABgH0IQASK/U0AWsIAAYB9CEAEiv1NAFrCAAGAfd5KziUAERD2NwFoCQMEAPbxBuBvPyQAcWnY3wSgJQwQANiHAESg2N8EoCUMEADYhwBEoNjfBKAlDBAA2OfNDQQgAsP+JgAtYYAAwD7eAPzdh9l23xW0MexvAtASBggA7EMAIlDsbwLQEgYIAOxDACJQ7G8C0BIGCADsQwAiUOxvAtASBggA7DObAESA2N82BOCWLVv0wAMP6LrrrpNhGFqzZo3f7U1NTZo+fbquvfZaXX311Ro0aJAOHDjgd05ZWZkeeeQRderUSZ07d9ZTTz2lyspKv3MyMjJ05513KjQ0VNdff73efPPNFvdl5cqV6tOnj0JDQxUbG6vExMRLuhYGCADs4w3A1z4iAHFp2N82BGBSUpJefvllrV69utUAnD17tjp37qy1a9cqIyNDw4cP1w033KCamhrfOffee6/69eunXbt2aevWrbrppps0evRo3+0VFRXq1q2bHn30UWVlZWn58uXq0KGDFi1a5Dtn+/btCgkJ0VtvvaWcnBy98sorat++vTIzM01fCwMEAPYhABEo9rfNvwL+ZgA2NTXp2muv1dtvv+37nNvtVmhoqJYvXy5JysnJkWEY2r17t++cDRs2qF27diouLpYkLViwQF26dFFdXZ3vnClTpqhPnz6+jx9++GHdf//9fvfnpz/9qZ5++mnT958BAgD7EIAIFPvbYQF46NAhGYah9PR0v/PuvvtuPffcc5Kk9957TxEREX63NzQ0KCQkRKtXr5YkPfbYYxoxYoTfOZs2bZJhGDpz5owkqWfPnvr973/vd86rr76qW2+91fT9Z4AAwD4EIALF/nZYAG7fvl2GYej48eN+5z300EN6+OGHJUkzZszQzTff3OJ7RUVFacGCBZKkX/ziFxo7dqzf7dnZ2TIMQzk5OZKk9u3b6/333/c7Z/78+frhD394wftbW1uriooK31FUVBT0AwQAdpmVRAAiMAQgAeh3zrcFYEJCggzDaHEE8wABgF28Afg6AYhLRAA6LACd/itgngEEAOcgABEoAtBhAeh9Ecg777zj+1xFRUWrLwJJS0vznfPxxx+3+iKQ+vp63znTpk1r8SKQBx54wO/+xMfH8yIQAGgjCEAEiv1tQwBWVlYqPT1d6enpMgxDc+bMUXp6ugoLCyU1vw1MRESE1q1bp3379mnEiBGtvg1M//79lZqaqm3btql3795+bwPjdrvVrVs3PfbYY8rKytKKFSsUFhbW4m1gfvCDH+idd95Rbm6uEhISeBsYAGhDZiblEIAICPvbhgBMSUlp9e/RPfHEE5K+eiPobt26KTQ0VIMGDdL+/fv9vkdZWZlGjx6ta665RuHh4XryyScv+kbQPXr00OzZs1vcl5UrV+rmm2+Wy+VS3759eSNoAGhDvAH4xnoCEJeG/c1/Cs4SBggA7EMAIlDsbwLQEgYIAOxDACJQ7G8C0BIGCADsQwAiUOxvAtASBggA7DMzkQBEYNjfBKAlDBAA2McbgDMSc+y+K2hj2N8EoCUMEADYhwBEoNjfBKAlDBAA2IcARKDY3wSgJQwQANhnBgGIALG/CUBLGCAAsI83AGcSgLhE7G8C0BIGCADsQwAiUOxvAtASBggA7EMAIlDsbwLQEgYIAOxDACJQ7G8C0BIGCADs88b6bAIQAWF/E4CWMEAAYB9fACYRgLg07G8C0BIGCADsQwAiUOxvAtASBggA7EMAIlDsbwLQEgYIAOxDACJQ7G8C0BIGCADs8/pHBCACw/4mAC1hgADAPt4AnJWUa/ddQRvD/iYALWGAAMA+BCACxf4mAC1hgADAPgQgAsX+JgAtYYAAwD6vEYAIEPubALSEAQIA+3gDcPYGAhCXhv1NAFrCAAGAfQhABIr9TQBawgABgH0IQASK/U0AWsIAAYB9CEAEiv1NAFrCAAGAfX73IQGIwLC/CUBLGCAAsI83AN8kAHGJ2N8EoCUMEADYhwBEoNjfBKAlDBAA2IcARKDY3wSgJQwQANjntx9mEYAICPubALSEAQIA+3gD8K1kAhCXhv1NAFrCAAGAfQhABIr9TQBawgABgH0IQASK/U0AWvJdDlBTU5Nq6htVUVOvhkaPmpqa1NTUpMxjblXXNUqS6hs98niaP++urld1XaM8niYdOlmpszX1qqxtUFNTkw6cOKv80kqdOVenipp6nTlXp8raBp07f7vH06SGRo8qaxvUeP77naqsVXZxhc6cq1Pp2Ro1NTWpvtGjqroGHS2rUunZGp2tqdfeo+U6cvqcMo+55a6qV019o05V1iq/9Kzvz6pr8Kiipl4VNfXKL61UeVWdmpqaVNvQqNOVtXJX1au8qvk+fVl4RnUNHpVW1Oh0Za0aGj2qbWhUTX3z4fE06WxNvU6erVVFTb1qGxpVXdeo4+5q5Ryv0NmaepWdq5O7ql4nKmp0oqJGpyprVdfgUX2jRwdOnFVNfaMOnDirrGK39p//uLahUYWnq5RfWimPp0knKmqUc7xCNfWNOlpWpaxit0rP1qiuweN3nSXuGlXU1KvR06S6Bo/Kq+p0rrZBxeXVamj06Fxtg05U1Cglr1RnztXpyOlzqqprUGVtg05V1urc+Z9DVV2DztbUq8Rd47vepqYmVdU1qLah+f/XNXh0rLxaWcVuna2pV11D88//dGWtjpw+p8LTVb6fbcP5n5W7ql6nK2t1oqL5vtc1eFRT36iTZ2t15lydTlU2P47F5dVKO3JG7up63+NR29Dom6vK2gYVnalSRU29ztbU+37+NfWNvsej7Fyd6s9fc0VNvUrP/5lnztXp8KlzOnL6nI67q3WsvNp3H7w/9zPn6lR2rnkuvI9ncXm1Kmrq5Tn//9/ckKuYKetbHANnfqZ7//C5/t/52/w+/9h7qb7/P/T3W3T7G58qZsp63f3WJsXP/EyjFu3QyPNfM3zeNvX73cctvv7xr32PO2Zt1L++/kmr9yFmynr1mpbo9/H/806Khv5+i3464zP9aGrz53q/lKSYKev187dTmv/cuVsVM2W9bpm+Qff+4XPf1z64YLvv/t/624913x8+1x2zNvpu/8Wczbr3D5/rl+/u8t2n29/4VEPmbGn1vg2ft00j52/T/z3/53nvg/d+PfDfW3XPW5v00xmf+W6/882Nevy9VA2fu1U/fmWDYl9N1sN/2qHRf96p/3P+/n/z6P9a830ZtWiHfjR1ve8+9345SX1eab52758ZM2W97vvD5xr0X5tbPH4DZ36m/zt3q3757q4Wf8YdszbqoYU7NGrRDt/nEtZlXfZ/BuPKRgASgJZ8VwP05y2HLrhkODg4ODj8j//5/NBl/WcwrnwEIAFoyXc1QH/afND2f6BycDj1mJXU/Ezgf/xlt/7jL7u1cPNB/WnzQa3POK4/fHpA/7kiXbM35GrZrkL99sMsjf3rbn24t1ivf5StXy39QgtSDuovOw7rT5sP6u+7j2rOJ/u1aMtB/fpvaRq/7EuN+9803f3WJs3blK/3thZo+NyteuhPO7RkW4Hmp+RrxLxt+uW7u/TYe6kaMW+bpq3ep9F/3qm16cf0m/f36KklX+jh8+e/sCJdbyfnacAbn+qhhTs0PyVfMxJzNHtDrp7+a5qWbj+sX/8tTc8s+1LzNuXrgf9uftbrg7QirUor0v98fki/eX+Plu0q1It/36t5m/L13PI9endrgf77swP6x5dF+t+dR/SrpV/opdX79N7WAt37h8/1q6Vf6Jfv7tJ//j1dr67N1KfZJ5ScVaL1Gcf1/y3YrjfWZ2vyqgwt21WoOZ/s15+3HNLy1ELN25Svl9fs091vbdLibQW++/Hymn16cskXmrcpX2vTj2nRloOavCpDQ+Zs0cLNBzX1H/v0dnKe/uMvuzX2r7u1IOWgnlicquWpX93vV9Zk6sklX+iZZV8qZsp6vf5Rtp5bvkeLthzUnW9u1PPL9+jFv+/Vax9la96mfM1Pyff9fGKmND+L++raTCWsy9I/vizSh3uL9d7WAr2dnKequobL+s9gXPkIQALQku9qgBo9TXpva4FS8kpVcOqcisurtSqtSDnHK3S0rEpfHC7T8tRC7Th4WmlHzijzmFupBWVKySvV2vRjKjxdpUMnK7Vl/0llFbv11x2H9ffdR/X5gZPaeuCUMo+5tS3/lNbtLdY/vizSvE35Wp9xXHM+2a8vC88oJa9Uf915RK99lK2UvFIdLavSZzkntOPgaWUUlWvrgVPakFmijKJybcg8rs8PnNQHaUVat7dYqQVlSi0o09GyKhWXVytp33Ft3n9SaUfKlHnMrVPnfx2ZV3JWqQVl2lfkVvrRcu0pPKOjZVX6x5dFSskrVWpBmXYdOq2UvFJ9kn1Cf9lxWLsOndayXYXalFeqnYdOa93eYs3blK/dh8t0tqZex8qrtWbPMf3h0wPnf+19Vp9mn1DakTKtTT+mlLxSfZbT/L2255/Sp9knlLTvuP535xG9lZyr7ecfkw/3FmvXodOqqKnX5wdOam36Mb32UbbeTy1URlG5Vu8p0u7DZVrxRaG25zc/Fn/afFC7D5cpt6TC9+vi9KPl+rLwjD4/cFKpBWVKP1quzGNuHTpZqT2FZ7Tj4Gnll57V4VPnlFpQpkVbDurt5DztPHRaa9OPacUXhdqWf0ppR8q09cApLdpyUDsOntaGzBIdLavSnsIzyi2pUOYxtzbmnlB+afPPPDmrRJnH3Dp5tlY7Dp7W+ozjyi2pUNGZ5q/xzszS7YeVdqT555VdXKFt+af0ZeEZbc8/5Xtc/vDpAf1991F9cbhMaUfOKK/krApOndPRsirtOHhaOw+d1u7zt5We/1X3joOnfde3+3CZdh8u0+FT57Tz0GmdPNv8Vws+3FusrGK3Ck9X6XRl8/1MySvVp9kntD7juDbllWpP4RntPHRaa/Yc8z0GlbUsegDWEYAEoCUMEAAAbQ/7mwC0hAECAKDtYX8TgJYwQAAAtD3sbwLQEgYIAIC2h/1NAFrCAAEA0PawvwlASxggAADaHvY3AWgJAwQAQNvD/iYANW/ePMXExCg0NFRxcXFKTU01/bUMEAAAbQ/7O8gDcMWKFXK5XFq8eLGys7M1ZswYRUREqLS01NTXM0AAALQ97O8gD8C4uDiNHz/e97HH41H37t01a9YsU1/PAAEA0Pawv4M4AOvq6hQSEqI1a9b4ff7xxx/X8OHDTX0PBggAgLaH/R3EAVhcXCzDMLRjxw6/z0+aNElxcXGtfk1tba0qKip8R1FRUdAPEAAAbQ0BSABeUgAmJCTIMIwWRzAPEAAAbQ0BGMQBGMivgHkGEACAto8ADOIAlJpfBPLss8/6PvZ4POrRo4fpF4G43W4ZhqGioiK/MOTg4ODg4OBw7uF9Asftdn9XieF4QR2AK1asUGhoqJYuXaqcnByNHTtWEREROnHihKmv9w4QBwcHBwcHR9s7ioqKvuPScK6gDkBJmjt3rqKjo+VyuRQXF6ddu3aZ/lqPx6OioiK53e7v7N9OgvXZRa4/uK+fx4Dr5zHg+r/Lx8DtdquoqEgej+c7LAxnC/oAdKqKiuD++wlcf3Bfv8RjEOzXL/EYBPv1SzwG3yUC0KGCfei5/uC+fonHINivX+IxCPbrl3gMvksEoEMF+9Bz/cF9/RKPQbBfv8RjEOzXL/EYfJcIQIeqra1VQkKCamtr7b4rtuD6g/v6JR6DYL9+iccg2K9f4jH4LhGAAAAAQYYABAAACDIEIAAAQJAhAAEAAIIMAQgAABBkCEAHmjdvnmJiYhQaGqq4uDilpqbafZcui4SEhBb/GZ4+ffr4bq+pqdEzzzyjrl27qmPHjnrwwQdb/Gf5CgsLNWzYMHXo0EFRUVGaOHGiGhoavu9LMWXLli164IEHdN1118kwDK1Zs8bv9qamJk2fPl3XXnutrr76ag0aNEgHDhzwO6esrEyPPPKIOnXqpM6dO+upp55SZWWl3zkZGRm68847FRoaquuvv15vvvnmd35tZn3bY/DEE0+0mImhQ4f6ndOWH4OZM2fq9ttv1zXXXKOoqCiNGDFCeXl5fudcrrlPSUlR//795XK5dOONN2rJkiXf9eV9KzPXf88997SYgaefftrvnLZ6/ZK0YMEC/eQnP1GnTp3UqVMnDRw4UElJSb7br+Sfv/Tt13+l//ydjAB0mBUrVsjlcmnx4sXKzs7WmDFjFBERodLSUrvvmmUJCQnq27evSkpKfMepU6d8t48bN049e/bUxo0blZaWpoEDB+qOO+7w3d7Y2KjY2FgNHjxY6enpSkpKUmRkpKZNm2bH5XyrpKQkvfzyy1q9enWr8TN79mx17txZa9euVUZGhoYPH64bbrhBNTU1vnPuvfde9evXT7t27dLWrVt10003afTo0b7bKyoq1K1bNz366KPKysrS8uXL1aFDBy1atOh7u86L+bbH4IknntC9997rNxNnzpzxO6ctPwZDhw7VkiVLlJWVpb1792rYsGGKjo7WuXPnfOdcjrkvKChQWFiYXnzxReXk5Gju3LkKCQlRcnLy93q932Tm+u+55x6NGTPGbwa+/p5vbfn6JenDDz9UYmKiDhw4oP379+ull15S+/btlZWVJenK/vlL3379V/rP38kIQIeJi4vT+PHjfR97PB51795ds2bNsvFeXR4JCQnq169fq7e53W61b99eq1at8n0uNzdXhmFo586dkppj4qqrrvL7t+OFCxcqPDxcdXV13+2dt+ib8dPU1KRrr71Wb7/9tu9zbrdboaGhWr58uSQpJydHhmFo9+7dvnM2bNigdu3aqbi4WFLzv1136dLF7/qnTJni98yqU1woAEeMGHHBr7nSHoOTJ0/KMAxt2bJF0uWb+8mTJ6tv375+f9aoUaNaPJtqt29ev9QcAM8///wFv+ZKun6vLl266N133w26n7+X9/ql4Pz5OwUB6CB1dXUKCQlpsSQff/xxDR8+3KZ7dfkkJCQoLCxM1113nW644QY98sgjKiwslCRt3LhRhmGovLzc72uio6M1Z84cSdL06dNbBGRBQYEMw9CePXu+n4sI0Dfj59ChQzIMQ+np6X7n3X333XruueckSe+9954iIiL8bm9oaFBISIhWr14tSXrsscdaBNSmTZtkGEaLZ9LsdqEA7Ny5s6KionTzzTdr3LhxOn36tO/2K+0xyM/Pl2EYyszMlHT55v6uu+5qsUQXL16s8PDw7+pSAvLN65eaAyAyMlL/9E//pL59+2rq1Kmqqqry3X4lXX9jY6OWL18ul8ul7OzsoPv5f/P6peD6+TsNAeggxcXFMgxDO3bs8Pv8pEmTFBcXZ9O9unySkpK0cuVKZWRkKDk5WfHx8YqOjtbZs2e1bNkyuVyuFl8zYMAATZ48WZI0ZswYDRkyxO/2qqoqGYbh93dKnOib8bN9+3YZhqHjx4/7nffQQw/p4YcfliTNmDFDN998c4vvFRUVpQULFkiSfvGLX2js2LF+t2dnZ8swDOXk5Fzuy7CktQBcvny51q1bp3379mnNmjW65ZZbNGDAADU2Nkq6sh4Dj8ej+++/Xz/72c98n7tcc9+7d2/NnDnT75zExEQZhqHq6urLfSkBae36JWnRokVKTk7Wvn379Le//U09evTQyJEjfbdfCde/b98+dezYUSEhIercubMSExMlBc/P/0LXLwXHz9+pCEAHudID8JvKy8sVHh6ud999lwA8L9gC8Ju8z4x+9tlnkq6sx2DcuHGKiYlRUVGR73PBEgBS69ffGu+zYgcPHpR0ZVx/XV2d8vPzlZaWpqlTpyoyMlLZ2dlB8/O/0PW35kr8+TsVAeggV/qvgFtz++23a+rUqfwK+Lxg+xVwayIjI/WnP/1J0pXzGIwfP17XX3+9CgoK/D4fLL8CvND1t+bcuXMyDMP3F/ivhOv/pkGDBmns2LFB8/P/Ju/1tyYYfv5OQQA6TFxcnJ599lnfxx6PRz169LgiXgTyTZWVlerSpYv++Mc/+v4y9AcffOC7PS8vr9W/DP31V0QvWrRI4eHhjv8PhV/oRSDvvPOO73MVFRWtvggkLS3Nd87HH3/c6gsg6uvrfedMmzbNkS+AMBOARUVFateundatWyep7T8GTU1NGj9+vLp3797iLX4kXba5nzx5smJjY/2+9+jRo23/S/Dfdv2t2bZtmwzDUEZGhqS2ff0X8vOf/1xPPPHEFf/zvxDv9bcmGH7+TkEAOsyKFSsUGhqqpUuXKicnR2PHjlVERESL94VqiyZMmKDNmzfr8OHD2r59uwYPHqzIyEidPHlSUvOviKKjo7Vp0yalpaUpPj5e8fHxvq/3vh3AkCFDtHfvXiUnJysqKsqxbwNTWVmp9PR0paenyzAMzZkzR+np6b4XvsyePVsRERG+vwM3YsSIVt8Gpn///kpNTdW2bdvUu3dvv7dAcbvd6tatmx577DFlZWVpxYoVCgsLc8RboEgXfwwqKys1ceJE7dy5U4cPH9Znn32mf/mXf1Hv3r39gr4tPwa//vWv1blzZ23evNnvbS6+/mupyzH33rfBmDRpknJzczV//nxHvA3Gt13/wYMH9dprryktLU2HDx/WunXr1KtXL919992+79GWr1+Spk6dqi1btujw4cPat2+fpk6dqnbt2umTTz6RdGX//KWLX38w/PydjAB0oLlz5yo6Oloul0txcXHatWuX3Xfpshg1apSuu+46uVwu9ejRQ6NGjfL9PQ/pqzdE7dKli8LCwjRy5EiVlJT4fY8jR47ovvvuU4cOHRQZGakJEyY49o2gU1JSWrzBqWEYvn/z9b4RdLdu3RQaGqpBgwZp//79ft+jrKxMo0eP1jXXXKPw8HA9+eSTF30T5B49emj27Nnf1yV+q4s9BtXV1RoyZIiioqLUvn17xcTEaMyYMS3+ZactPwatXbthGH5vUnu55j4lJUW33XabXC6XevXq5Yg3wv22+/eXRwAAARNJREFU6z969Kjuvvtude3aVaGhobrppps0adIkv/eBk9ru9UvSU089pZiYGLlcLkVFRWnQoEG++JOu7J+/dPHrD4afv5MRgAAAAEGGAAQAAAgyBCAAAECQIQABAACCDAEIAAAQZAhAAACAIEMAAgAABBkCEAAAIMgQgAAAAEGGAAQAAAgyBCAAAECQIQABAACCDAEIAAAQZAhAAACAIEMAAgAABBkCEAAAIMgQgAAAAEGGAAQAAAgyBCAAAECQIQABAACCDAEIAAAQZAhAAACAIEMAAgAABBkCEAAAIMgQgAAAAEGGAAQAAAgyBCAAAECQIQABAACCDAEIAAAQZAhAAACAIEMAAgAABBkCEAAAIMj8/7lU1woQo7ZCAAAAAElFTkSuQmCC\" width=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x7f0af803b630>]"
]
},
"execution_count": 160,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fig,ax = subplots()\n",
"ax.plot(ds)"
]
},
{
"cell_type": "code",
"execution_count": 161,
"metadata": {},
"outputs": [],
"source": [
"dgain = (ds>>14)\n",
"M1 = dgain == 0\n",
"M2 = dgain == 1\n",
"M3 = dgain == 2\n",
"M4 = dgain == 3"
]
},
{
"cell_type": "code",
"execution_count": 162,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2569 538 0 393\n"
]
}
],
"source": [
"print(M1.sum(),M2.sum(),M3.sum(), M4.sum())"
]
},
{
"cell_type": "code",
"execution_count": 163,
"metadata": {},
"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",
" fig.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\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 overridden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + 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",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\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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rk69evXSLbfcosrKSr399tvq1KmTXn755YweL9yBAOgSX3/9tSzL0saNG2MeLy8vV9++fVVbW9sifKxZs0bt27eP+eDqf/u3f1NeXp5OnjwpSSouLtaQIUNitnnTTTdp7NixNh6NN6WyBpLiPtYca5C4eGswZswY3X///a0+h+sgvVJZA4nrIJ3ircGll16qefPmtfqcqqoqWZalP//5z9HH3n//fbVr104HDhyQJL300kvq1q1b9LqQpNmzZ2vw4ME2HAXcjgDoEjt37pRlWaqoqIg+9v333+vCCy/U73//e0ktb7CPPPKIhg0bFrOdPXv2yLIsffbZZ5KkK664osWNe/HixcrLy7PrUDwrlTVoeiw/P18///nPdckll+iVV15RY2Nj9PusQeLircGYMWN09tln6+c//7mGDBmihx9+WN9//330+1wH6ZXKGkhcB+l0+hocOnRIlmXpX//1X1VUVKSePXvqyiuv1EcffRR9ziuvvKKuXbvGbOeHH35QVlaWVq1aJUm67bbbNHHixJg569atk2VZ+u6772w+KrgNAdAFGhoadP3112v06NExj0+fPl133XVX9OvTw8e0adP0q1/9KuY533//vSzL0po1ayRJgwYN0vz582PmvPfee7IsK+ZvR4Iu1TWQpMcee0wff/yxPvvsMz311FPKzs7WCy+8EP0+a5CY1tbg5Zdf1tq1a/X555/rjTfeUN++fTVp0qTo97kO0ifVNZC4DtIl3hps2bJFlmWpe/fuWrx4sT777DM98MADCoVC+vLLLyVJTzzxhC644IIW2+vRo4deeuklSdK1116r6dOnx3x/x44dsixLVVVVNh4V3IgA6AIzZszQgAEDFA6Ho4+tXr1a559/fswf8BIA7ZPqGsTzyCOPqF+/ftGvWYPExFuDeEpLS2VZlnbt2iWJ6yCdUl2DeLgOUhNvDTZt2iTLsmL+rlWS/u7v/k4PP/ywJAIgkkcAdNjMmTPVr18/7dmzJ+bx+++/X+3atVNWVlZ0WJal9u3ba8yYMZL41Ve6mKxBPH/4wx9kWVb0j7NZgzNrbQ3iOXbsmCzLir55gOsgPUzWIB6ug+S1tgZN9fz666/HPD558mTdfPPNkvgVMJJHAHRIY2OjZs6cqfz8/OiP8Jurra1VRUVFzLAsSy+88EL05tD0x++HDh2KPu/ll19WXl5e9KZbXFysoUOHxmx7ypQp/OG10rMG8Tz++OPq1q1b9GvWoHVnWoN4Pv74Y1mWpe3bt0viOjCVjjWIh+sgcWdag8bGRuXn57d4E8jw4cOjPxVsehNIWVlZ9PsffPBB3DeBnDp1Kjpnzpw5vAkkoAiADrnnnnvUpUsXbdiwIeZjE9r6VUhrHwPzq1/9Stu2bdPatWvVo0ePuB9/MWvWLFVXV+vFF1/koxf+v3SswX//93/rP//zP1VRUaGdO3fqpZdeUk5Ojh599NHoHNagdWdag127dumxxx5TWVmZvvrqK61evVrnnnuurrzyyug2uA7MpGMNuA7MJHIveu6555SXl6cVK1Zo586dmjdvnn72s5/F/Br+uuuu04gRI/TJJ5/o448/1qBBg2I+BiYSiahXr1667bbbVFlZqaVLlyonJ4ePgQkoAqBD4n1oatPnaLX1nNP//mzv3r0aN26cOnXqpLPPPlsPPfRQ3A/AHT58uEKhkM4991w+fPX/S8cavP/++xo+fLg6d+6s3NxcDRs2TP/+7/+uhoaGmOexBvGdaQ3279+vK6+8Ut27d1d2drbOP/98zZo1q8Vn0HEdpC4da8B1YCbRe9GTTz6pfv36KScnR0VFRTHvApZ++iDoKVOmqHPnzsrLy9Mdd9zR5gdB9+3bV0899ZTdhweXIgAaaGhoUDgcViQSUV1dHYPBYDAYDA+MSCSicDjc4h8pQUIANBAOh1v9lxuDwWAwGAx3jzO9493PCIAGIpFItICc/tcMg8FgMBiMxEbTD3AikYjTUcIxBEADdXV1sixLdXV1Z54MAABcgf5NADRCAQEA4D30bwKgEQoIAADvoX8TAI1QQADiGTD7DzEDgLvQvwmARiggAPEQAAF3o38TAI1QQADiIQAC7kb/JgAaoYAAxEMABNyN/k0ANEIBAYiHAAi4G/07IAHwySeflGVZuv/++6OPnThxQvfee6+6d++u3Nxc3XjjjTp48GBS26WAAMRDAATcjf4dgAD46aef6pxzztFFF10UEwBnzJih/v37q7S0VGVlZbrssss0atSopLZNAQGIhwAIuBv92+cB8OjRoxo0aJD+9Kc/acyYMdEAGIlE1LFjR61YsSI6t7q6WpZlacuWLQlvnwICEA8BEHA3+rfPA+Dtt9+uBx54QJJiAmBpaaksy9KRI0di5hcUFGjBggUJb58CAhAPARBwN/q3jwPg22+/raFDh+rEiROSYgPgm2++qVAo1OI5l1xyiYqLi1vdZn19fdz/TDrIBQSgJQIg4G4EQJ8GwP3796tnz57avn179LF0BMCSkhJZltViBLmAAK+yM6QRAAF3IwD6NAC+8847sixLWVlZ0WFZltq1a6esrCx9+OGHKf0KmJ8AAv5BAASCiwDo0wD417/+VRUVFTFj5MiRuvXWW1VRURF9E8jKlSujz6mpqeFNIECAEACB4KJ/+zQAxtP8V8DSTx8DU1BQoHXr1qmsrExFRUUqKipKapsUEOBdBEAguOjfAQ6ATR8E3a1bN+Xk5GjSpEmqra1NapsUEOBdBEAguOjfAQqAdqCAAO8iAALBRf8mABqhgADvIgACwUX/JgAaoYCA1J0ekjIdlAiAQHDRvwmARiggIHUEQABOoX8TAI1QQEDqCIAAnEL/JgAaoYCA1BEAATiF/k0ANEIBAakjALb9HIIjYB/6NwHQCAUEpM7pwEMABIKL/k0ANEIBAalzOvAQAIHgon8TAI1QQEDqnA48BEAguOjfBEAjFBCQOqcDDwEQCC76NwHQCAUEpM7pwEMABIKL/k0ANEIBAalzOvAQAIHgon8TAI1QQEDq7Aw8iWyXAAgEF/2bAGiEAgJSRwBs+zkEQMA+9G8CoBEKCEgdAbDt5xAAAfvQvwmARiggIL5EwgwBsO3nEAAB+9C/CYBGKCAgPgIgARBwM/o3AdAIBQTERwAkAAJuRv8mABqhgID4CIAEQMDN6N8EQCMUEBAfAZAACLgZ/ZsAaIQCAuIjABIAATejfxMAjVBAQHwEQAIg4Gb0bwKgEQoIiI8ASAAE3Iz+TQA0QgEB8REACYCAm9G/CYBGKCAgPgIgARBwM/o3AdAIBQTERwAkAAJuRv8mABqhgID4CIAEQMDN6N8EQCMUEBCfnwOgXdsmAAKZQ/8mABqhgID4CIAEQMDN6N8EQCMUEBAfAZAACLgZ/ZsAaIQCAuIjABIAATejfxMAjVBA8LpMBTACYPLbJQAC9qF/EwCNUEDwOgIgARAIIvo3AdAIBQSvIwASAIEgon8TAI1QQPA6AiABEAgi+jcB0AgFBK8jABIAgSCif/s4AM6fP18jR45U586d1aNHD02cOFE1NTUxc06cOKF7771X3bt3V25urm688UYdPHgw4deggOB1BEACIBBE9G8fB8CxY8dqyZIlqqys1LZt2zR+/HgVFBTo2LFj0TkzZsxQ//79VVpaqrKyMl122WUaNWpUwq9BAcHrCIAEQCCI6N8+DoCn+/rrr2VZljZu3ChJikQi6tixo1asWBGdU11dLcuytGXLloS2SQGhOTtDh10IgN4KgE6fV8Av6N8BCoA7d+6UZVmqqKiQJJWWlsqyLB05ciRmXkFBgRYsWJDQNikgNEcAbH27BMDkt0sABOxD/w5IAGxoaND111+v0aNHRx978803FQqFWsy95JJLVFxcHHc79fX1qquri45wOBz4AsLfEABb3y4BMPntEgAB+xAAAxIAZ8yYoQEDBigcDkcfSyUAlpSUyLKsFiPIBYS/cTIAptr0CYAEQCCICIABCIAzZ85Uv379tGfPnpjHU/kVMD8BRFsIgMntDwGw7ecQAAH7EAB9HAAbGxs1c+ZM5efn68svv2zx/aY3gaxcuTL6WE1NDW8CQcoIgMntDwGw7ee4MQASLOEX9G8fB8B77rlHXbp00YYNG1RbWxsdx48fj86ZMWOGCgoKtG7dOpWVlamoqEhFRUUJvwYFhOYIgMntj9NBhQCYPAIg/IL+7eMAGO9v9SzL0pIlS6Jzmj4Iulu3bsrJydGkSZNUW1ub8GtQQGjOrwHQyTCTKgIgARBoC/3bxwEwEyggNEcATG5/nA4qBMDkEQDhF/RvAqARCgjNEQCT2x+ngwoBMHkEQPgF/ZsAaIQCQnMEwOT2x84wQwAkAAJtoX8TAI1QQGiOAJjc/hAA234OARCwD/2bAGiEAkJzBMDk9ocA2PZz/HTOALehfxMAjVBAaI4AmNz+eDXMcM4IgPA++jcB0AgFhOYIgMntj1fDDOeMAAjvo38TAI1QQGiOAJjc/ng1zHDOCIDwPvo3AdAIBYTmCIDJ7Y9XwwznjAAI76N/EwCNUEBojgCY3P54NcxwzgiA8D76NwHQCAWE5giAye2PV8MM54wACO+jfxMAjVBAaI4AmNz+eDXMcM4IgPA++jcB0AgFhOYIgMntj1fDDOeMAAjvo38TAI1QQGiOAJjc/ng1zHDOCIDwPvo3AdAIBeQ9qTbHVLad6px0vLbTTd/PYYZzRgCE99G/CYBGKCDvIQBmZp/9HGY4ZwRAeB/9mwBohALyHgJgZvbZz2GGc5b+4wIyjf5NADRCAXkPATAz++zXMGPntv16zgiAcCP6NwHQCAXkPV4MgH5t+l48Lju37ddzRgCEG9G/CYBGKCDvIQB6a5/ddlx2btuv54wACDeifxMAjVBA3kMA9NY+u+247Ny2X88ZARBuRP8mABqhgLyHAOitfXbbcdm5bb+eMwIg3Ij+TQA0QgF5DwHQW/vstuOyc9t+PWcEQLgR/eGImnUAAB2aSURBVJsAaIQC8h4CoLf22W3HZee2/XrO7NznVF4fkOjfEgHQCAXkPU43Grc1ULfvs9uOy85t+/WcEQDhRvRvAqARCsh7nG40bmugbt9ntx2Xndv26znzYgC0c3/gDvRvAqARCsh7nG40bmugbt9ntx2Xndv26zkjAMKN6N8EQCMUkPc43Wjc1kDdvs9uOy47t+3Xc0YAhBvRvwmARigg76GBemuf3XZcdm7br+eMAAg3on8TAI1QQN5DA/XWPrvtuOzctl/PGQEQbkT/JgAaoYBSk6kbPQ3U+/vstuOyc9t+PWcEQLgR/ZsAaIQCSg0B0D0N1O377LbjsnPbfj1nBEC4Ef2bAGiEAkqN2xtNkBqo2/fZbcdl57b9es78us/wNvo3AdAIBZQatzcaLzYjv+6z247Lzm379Zz5dZ/hbfRvAqARCig1bm80XmxGft1ntx2Xndv26znz6z7D2+jfBEAjFFBq3N5ovNiM/LrPbjsuO7ft13PGPnuLX4/rdPRvAqARCig1br9pB6kZuX2f3XZcdm7br+eMffYWvx7X6ejfBEAtWrRIAwYMUHZ2tgoLC/XJJ58k/Fw/F1CQb9p+PS4v7rPbjsvObfv1nLHPybNru6m8dqZfP1P83L8TFegAuHTpUoVCIS1evFg7duzQtGnT1LVrVx06dCih5/u5gIJ80/brcXlxn912XHZu26/njH1Onl3bTeW1M/36meLn/p2oQAfAwsJCzZw5M/p1Q0OD8vPz9eSTTyb0fLsLyO03Ab/etP16XF7cZ7cdl53b9us5C/I+23lcdkl1n+16fbsQAAMcAE+ePKmsrCy98847MY/ffvvtmjBhQkLbIABy0/bScXlxn912XHZu26/nLMj7bOdx2SXVfbbr9e1CAAxwADxw4IAsy9LmzZtjHp81a5YKCwvjPqe+vl51dXXRsX//flmWpXA4HPN4ukb/B5bHDDteI9HXjvf6icxJ9bjSsd1U99mvx+XFfXbbcXHOqF+3HJddI9V9tuv17XqdcDgsy7IUiUQyETlciQCYRAAsKSmRZVkMBoPBYDB8MMLhcCYihysFNgCm8ivg038CeOTIEe3evVuRSMS2f53Y9dNFhr3/qmTdvDVYN+8N1sybwy3rFolEFA6H1dDQkInI4UqBDYDST28Cue+++6JfNzQ0qG/fvgm/CcROdXX8fYIXsW7exLp5D2vmTaybewQ6AC5dulTZ2dl69dVXVVVVpenTp6tr1646ePCg07vGReJRrJs3sW7ew5p5E+vmHoEOgJK0cOFCFRQUKBQKqbCwUFu3bnV6lyRxkXgV6+ZNrJv3sGbexLq5R+ADoFvV19erpKRE9fX1Tu8KksC6eRPr5j2smTexbu5BAAQAAAgYAiAAAEDAEAABAAAChgAIAAAQMATANNm4caNuuOEG9enTR5ZltfiA6ZKSEg0ePFg5OTnq2rWrrrnmmph3HK9fv77VTyr/9NNPo3MmTJig3r17KycnR8OGDdMbb7zRYl+WL1+uwYMHKzs7W0OHDtV7771n78F7WCbWraamRldddZV69uyp7OxsDRw4UHPnztWpU6diXot1S1wm1q25nTt3qnPnzurSpUuL77FuicvEun311Vdxv79ly5aY12LdEpep662xsVHPPPOMBg0apFAopPz8fD3++OMxr7V+/XqNGDFCoVBI5513npYsWWLrsfsZATBN1qxZo7lz52rVqlVxL5A333xTf/rTn7R7925VVlbqrrvuUl5enr7++mtJP/3PJLW1tTHjN7/5jQYOHKjGxkZJ0hNPPKF58+Zp06ZN2rVrl55//nm1b99e7777bvR1Nm3apKysLP3ud79TVVWV5s2bp44dO6qioiJzJ8NDMrFuu3fv1uLFi7Vt2zbt3btXq1evVs+ePTVnzpzo67BuycnEujU5deqURo4cqXHjxrUIgKxbcjKxbk0B8MMPP4yZ1/wfXKxbcjJ1vf3jP/6jBg8erNWrV2vPnj0qKyvTH//4x+j39+zZo5ycHD344IOqqqrSwoULlZWVpbVr12bmRPgMAdAG8S6Q0zV9FtKHH34Y9/unTp1Sjx499Nhjj7W5nfHjx+uOO+6Ifj158mRdf/31MXMuvfRS3X333QnufXBlct1++9vf6vLLL49+zbqlzu51Ky4u1q233qolS5a0CICsW+rsWremAFheXt7qdlm31Nm1blVVVerQoYNqampa3W5xcbGGDBkS89hNN92ksWPHJnEEaEIAtMGZLpCTJ0/qmWeeUZcuXfTNN9/EnbNy5Uq1b9/+jP9R9ejRo/XQQw9Fv+7fv7+ee+65mDmPPvqoLrrooiSOIJgytW47d+7UhRdeqLlz50YfY91SZ+e6lZaWauDAgaqrq4sbAFm31Nm1bk0BsH///urRo4dGjx6t1atXxzyPdUudXev29NNP64ILLtCzzz6rc845RwMGDNBdd92lw4cPR+dcccUVuv/++2O2tXjxYuXl5RkeVTARAG3Q2gXy7rvvKjc3V+3atVN+fn7cvzVqMm7cOI0bN67N11m2bJlCoZAqKyujj3Xs2FFvvfVWzLwXX3xRPXv2TPIogsfudSsqKlJ2drYsy9L06dNj/hNy1i11dq3bt99+q/79+2vjxo2SFDcAsm6ps2vdvvnmG/3Lv/yLtm7dqk8//VSzZ89Wu3btYkIg65Y6u9bt7rvvVnZ2ti699FL9z//8j9avX6/hw4fr6quvjs4ZNGiQ5s+fH/O89957T5Zl6fjx44ZHFjwEQBu0doEcO3ZMO3fu1JYtW3TnnXfqnHPO0aFDh1rMC4fDat++vVauXNnqa6xbt045OTl67bXXYh7nxpY6u9dt//792rFjh9566y317dtXTz/9dPR7rFvq7Fq3SZMmafbs2dGvCYDplYn7ZJPbbrst5k8uWLfU2bVu06ZNk2VZ+uKLL6KP/e///q8sy4r+WpgAmF4EQBsk8jcSknT++ee3KGZJeuyxx9SjR48W7xJtsmHDBuXm5urll19u8T1+tZE6u9etuddff12dOnXSjz/+KIl1M2HXunXp0kVZWVnR0b59e1mWpaysLL3yyiuSWDcTmbzeFi1apN69e0e/Zt1SZ9e6Pfroo+rQoUPMY8ePH5dlWdE3gvAr4PQiANog0Qvk3HPPVUlJScxjjY2NGjhwYMzf9TW3fv165ebmatGiRXG/P3nyZN1www0xjxUVFfHHzQmwc91O99prr6lDhw7RmyDrljq71q2qqkoVFRXR8fjjj+uss85SRUWFvvvuO0msm4lMXm+/+c1vNGLEiOjXrFvq7Fq3Dz74QJZladeuXdHHtm3bFvNTweLiYg0dOjTmeVOmTOFNICkiAKbJ0aNHVV5ervLyclmWpQULFqi8vFz79u3TsWPHNGfOHG3ZskV79+5VWVmZ7rjjDmVnZ8f8/Z4kffjhh7IsS9XV1S1eo+nXvnPmzIl5O33zP5LdtGmTOnTooGeffVbV1dUqKSnh4w3akIl1e+ONN7Rs2TJVVVVp9+7dWrZsmfLz83XLLbdE57BuycnEup0u3q+AWbfkZGLdXn31Vb311luqrq5WdXW1nnjiCbVv316LFy+OzmHdkpOJdWtoaNDFF1+sK6+8Up999pnKysp06aWX6tprr43OafoYmFmzZqm6ulovvvgiHwNjgACYJq190OXUqVN14sQJTZo0Sfn5+QqFQurTp48mTJgQ949kp0yZolGjRsV9jalTp8Z9jTFjxsTMW758uS644AKFQiENGTKEDzhtQybWbenSpbr44ovVuXNn5ebm6he/+IXmz5+vEydOxMxj3RKXiXU7XbwAKLFuycjEur366qu68MILlZOTo7y8PBUWFmrFihUt5rFuicvU9XbgwAHdeOON6ty5s3r16qV/+Id/iPkBR9O+DB8+XKFQSOeeey4fBG2AAGigoaFB4XBYkUhEdXV1DAaDwWAwPDAikYjC4XDMpzEEDQHQQDgcbvW/t2EwGAwGg+HucabP2vUzAqCBSCQSLSCn/zXDYDAYDAYjsdH0A5xIJOJ0lHAMAdBAXd1P/91NXV2d07sCAAASRP8mABqhgAAA8B76NwHQCAUEAID30L8JgEYoIAAAvIf+TQA0QgEB8KsBs//QYgB+Qf8mABqhgAD4FQEQfkb/JgAaoYAA+BUBEH5G/yYAGqGAAPgVARB+Rv8mABqhgAD4FQEQfkb/JgAaoYAA+BUBEH5G/yYAGqGAAPgVARB+Rv8mABqhgAD4FQEQfkb/JgAaoYAA+BUBEH5G/yYAGqGAAPgVARB+Rv8mABqhgAD4FQEQfkb/JgAaoYAA+BUBEH5G/yYAGqGAAPgVARB+Rv8mABqhgAD4FQEQfkb/JgAaoYAAeDEoJbLPXjwuIFH0bwKgEQoIgBeDEgEQQUf/JgAaoYAAeDEoEQARdPRvAqARCgiAF4MSARBBR/8mABqhgAB4MSgRABF09G8CoBEKCIAXgxIBEEFH/yYAGqGAAHgxKBEAEXT0bwKgEQoIgBeDEgEQQUf/JgAaoYAAeDEoEQARdPRvAqARCgiAF4MSARBBR/8mABqhgAB4MSgRABF09G8CoBEKCIDbglK6wp3bjgtIJ/o3AdAIBQTAbUGJAAicGf2bAGiEAgLgtqBEAATOjP5NADRCAQFwW1AiAAJnRv8mABqhgAC4LSgRAIEzo38TAI1QQADcFpQIgMCZ0b8JgEYoIABuC0oEQODM6N8EQCMUEAC3BSUCIHBm9G8CoBEKCIDbghIBEDgz+jcB0AgFBMBtQYkACJwZ/ZsAaIQCAuC2oEQABM6M/k0ANEIBAchkUMpkuCMAws/o3wRAIxQQAAIg4D30bwKgEQoIAAEQ8B76NwHQCAUEgABojrCJTKN/EwCNUEAA3BaUCIDAmdG/CYBGKCAAbgtKBEDgzOjfBEAjFBAAtwUlvwZAQiLSif7t4wA4f/58jRw5Up07d1aPHj00ceJE1dTUxMw5ceKE7r33XnXv3l25ubm68cYbdfDgwYRfgwIC4MWg5LbA5bb9gf/Rv30cAMeOHaslS5aosrJS27Zt0/jx41VQUKBjx45F58yYMUP9+/dXaWmpysrKdNlll2nUqFEJvwYFBMCLQcltgctt+wP/o3/7OACe7uuvv5ZlWdq4caMkKRKJqGPHjlqxYkV0TnV1tSzL0pYtWxLaJgUEwItByW2By237A/+jfwcoAO7cuVOWZamiokKSVFpaKsuydOTIkZh5BQUFWrBgQdxt1NfXq66uLjrC4XDgCwgIOi8GJbcFLrftD/yPABiQANjQ0KDrr79eo0ePjj725ptvKhQKtZh7ySWXqLi4OO52SkpKZFlWixHkAgKCzotByW2By237A/8jAAYkAM6YMUMDBgxQOByOPpZKAOQngABO58Wg5LbA5bb9gf8RAAMQAGfOnKl+/fppz549MY+n8ivg01FAALwYlNwWuNy2P/A/+rePA2BjY6Nmzpyp/Px8ffnlly2+3/QmkJUrV0Yfq6mp4U0gAJLixaCUycDltv0BJPq35OMAeM8996hLly7asGGDamtro+P48ePROTNmzFBBQYHWrVunsrIyFRUVqaioKOHXoIAAEADds89AoujfPg6A8d6sYVmWlixZEp3T9EHQ3bp1U05OjiZNmqTa2tqEX4MCAkAAdM8+A4mif/s4AGYCBQSAAOiefQYSRf8mABqhgAAQAN2zz0Ci6N8EQCMUEAACoHv2GUgU/ZsAaIQCAhDkAOi2OUCi6N8EQCMUEAACoHvmAImifxMAjVBAALz4q1K/zgESRf8mABqhgAAQAN0zB0gU/ZsAaIQCAkAAdM8cIFH0bwKgEQoIcKdMBgUCoHvmAImifxMAjVBAgDsRAIM5B0gU/ZsAaIQCAtyJABjMOUCi6N8EQCMUEOBO6QoKmQwmbgtTXpwDJIr+TQA0QgEB7kQADOYcIFH0bwKgEQoIcCcCYDDnAImifxMAjVBAgDu5LQAyxz1zEkHY9D/6NwHQCAUEuBMBkDkEQLSF/k0ANEIBAe5EAGQOARBtoX8TAI1QQEB62RXc0rUdp8MLcwiASA/6NwHQCAUEpBcBkDkEQGQC/ZsAaIQCAtIrkwEwlTlOhxfmeCsAEiTdi/5NADRCAQHpRQBkDgEQmUD/JgAaoYCA9CIAMocAiEygfxMAjVBAQHoRAJlDAEQm0L8JgEYoICC9CIDMIQAiE+jfBEAjFBCQXgRA5hAAkQn0bwKgEQoISC8CIHMIgMgE+jcB0AgFBKQXAZA5BEBkAv2bAGiEAgLSiwDIHAIgMoH+TQA0QgEB6UUAZA4BEJlA/yYAGqGAgPQiADKHAIhMoH8TAI1QQEB6EQCZQwBEJtC/CYBGKCAgvQiAzPHKnEQQAN2L/k0ANEIBAelFAGSOV+YkggDoXvRvAqARCghIXLpCWSZfy22hgznumZMIAqB70b8JgEYoICBxBEDm+GlOIgiA7kX/JgAaoYCAxBEAmeOnOYkgALoX/ZsAaIQCAhJHAGSOn+YkggDoXvRvAqARCghIHAGQOX6akwgCoHvRvwmARiggIHEEQOb4aU4iCIDuRf8mABqhgIDE2RXKMjnH6dDBHP/NgTPo3wRAIxQQkDi3h7tE5jgdFpjjvzlwBv2bAGiEAgIS5/Zwl8gcp8MCc/w3B86gfxMAjVBA8Lp0NSe3B7d0zXE6LDCHOQTJ9KB/EwCNUEDwOgIgAZA5/piD5NC/CYBGKCB4HQGQAMgcf8xBcujfBEAjFBC8jgBIAGSOP+YgOfRvAqAWLVqkAQMGKDs7W4WFhfrkk08Sfi4FBK8jABIAmeOPOUgO/TvgAXDp0qUKhUJavHixduzYoWnTpqlr1646dOhQQs+3u4C44L3FbWEqk68VlDlON3nmMMf0mk8HO/c5U8dJAAx4ACwsLNTMmTOjXzc0NCg/P19PPvlkQs8nAKK5dK1XusJLJl8rKHOcbvLMYY7pNZ8Odu5zpo6TABjgAHjy5EllZWXpnXfeiXn89ttv14QJE+I+p76+XnV1ddGxf/9+WZalcDgc83i6Rv8HlscMO16D4b71SmQ7bnutoMyJN485zHHDnEwOO/c5U8cZDodlWZYikUgmIocrBTYAHjhwQJZlafPmzTGPz5o1S4WFhXGfU1JSIsuyGAwGg8Fg+GCEw+FMRA5XIgAmEQBP/wngkSNHtHv3bkUiEUf/Neal0fSvLrt+asrgPHOe/Tc4z5zndI9IJKJwOKyGhoZMRA5XCmwATOVXwDBXV8ffXWQC5zkzOM+ZwXnODM5zsAQ2AEo/vQnkvvvui37d0NCgvn37JvwmECSPG0xmcJ4zg/OcGZznzOA8B0ugA+DSpUuVnZ2tV199VVVVVZo+fbq6du2qgwcPOr1rvsUNJjM4z5nBec4MznNmcJ6DJdABUJIWLlyogoIChUIhFRYWauvWrU7vkq/V19erpKRE9fX1Tu+Kr3GeM4PznBmc58zgPAdL4AMgAABA0BAAAQAAAoYACAAAEDAEQAAAgIAhAAIAAAQMARBt2rhxo2644Qb16dNHlmW1+ODs5u6++25ZlqXnnnsu5vFf//rX6t+/v7Kzs9W7d2/deuutOnDgQMyc7du36/LLL1d2drb69eunp59+usX2ly9frsGDBys7O1tDhw7Ve++9l56DdIFMnOcTJ05o6tSpGjp0qLKysjRx4sS421+/fr1GjBihUCik8847T0uWLEnLMbpFJs71+vXrNWHCBPXu3Vs5OTkaNmyY3njjjRbbp6Z/kup5rqmp0VVXXaWePXsqOztbAwcO1Ny5c3Xq1KmY7XCef2Jyj26yc+dOde7cWV26dGnxPT+fZz8iAKJNa9as0dy5c7Vq1ao2by6rVq3SsGHDlJ+f3+LmsmDBAm3ZskV79+7Vpk2bVFRUpKKiouj36+rq1KtXL91yyy2qrKzU22+/rU6dOunll1+Oztm0aZOysrL0u9/9TlVVVZo3b546duyoiooKew48wzJxno8dO6YZM2boP/7jPzR27Ni4AXDPnj3KycnRgw8+qKqqKi1cuFBZWVlau3Zteg/YQZk410888YTmzZunTZs2adeuXXr++efVvn17vfvuu9E51PRPTM7z7t27tXjxYm3btk179+7V6tWr1bNnT82ZMyc6h/P8E5Pz3OTUqVMaOXKkxo0b1yIA+v08+xEBEAlr7ebyl7/8RX379lVlZaUGDBjQ4uZyutWrV6tdu3bRf6W/9NJL6tatm06ePBmdM3v2bA0ePDj69eTJk3X99dfHbOfSSy/V3XffbXJIrmTXeW5u6tSpcQNgcXGxhgwZEvPYTTfdpLFjxyZ5FN6QiXPdZPz48brjjjuiX1PT9pzn3/72t7r88sujX3Oe03eei4uLdeutt2rJkiUtAmCQzrNfEACRsHg3l4aGBl199dV6/vnnJemMN5fDhw9r8uTJGj16dPSx2267rUUYWbdunSzL0nfffSdJ6t+/f4vtPvroo7rooouMjsmN7DrPzbUWAK+44grdf//9MY8tXrxYeXl5yR6GJ2TiXDcZPXq0HnrooejX1HT6z/POnTt14YUXau7cudHHOM/pOc+lpaUaOHCg6urq4gbAIJ1nvyAAImHxbi7z58/Xtddeq8bGRkmt31yKi4uVk5Mjy7J02WWX6dtvv41+79prr9X06dNj5u/YsUOWZamqqkqS1LFjR7311lsxc1588UX17NkzLcfmJnad5+ZaC4CDBg3S/PnzYx577733ZFmWjh8/nuohuVYmzrUkLVu2TKFQSJWVldHHqOn0neeioiJlZ2fLsixNnz5dDQ0N0e9xns3P87fffqv+/ftr48aNkhQ3AAbpPPsFARAJO/3mUlZWpl69esX8sXBrN5dvvvlGX3zxhf74xz9q9OjRGj9+fPSGRACMZdd5bo4A+JNMnOt169YpJydHr732Wszj1HT6zvP+/fu1Y8cOvfXWW+rbt2/Mm8g4z+bnedKkSZo9e3Z0LgHQHwiASNjpN5fnnntO7dq1U1ZWVnRYlqX27dtrwIABrW4nHA7Lsixt3rxZEr8CPp1d57k5fgX8E7vP9YYNG5SbmxvzhqYm1HR6a7rJ66+/rk6dOunHH3+UxHlOx3nu0qVLzDbat28vy7KUlZWlV155RVKwzrNfEACRsNNvLt9++60qKipiRn5+vmbPnq2amppWt7Nv3z5ZlqX169dL+tubQJr/wfGcOXNavAnkhhtuiNlOUVGRL//A2K7z3FxbbwIZOnRozGNTpkwJzJtA0nmu169fr9zcXC1atCjuc6jp9NZ0k9dee00dOnSI3k84z+bnuaqqKmYbjz/+uM466yxVVFRE/5EepPPsFwRAtOno0aMqLy9XeXm5LMvSggULVF5ern379sWdf/qvF7Zu3aqFCxeqvLxce/fuVWlpqUaNGqXzzjtP9fX1kqRIJKJevXrptttuU2VlpZYuXaqcnJwWHwPToUMHPfvss6qurlZJSYmvPmIgE+dZ+ulX6+Xl5fr1r3+tq666KvqaTZo+BmbWrFmqrq7Wiy++6LuPgcnEuW76te+cOXNUW1sbHYcPH45uh5qOlcp5fuONN7Rs2TJVVVVp9+7dWrZsmfLz83XLLbdEt8N5jpXqvaO5eL8C9vt59iMCINq0fv16WZbVYkydOjXu/NNvLp9//rmuvvpqde/eXdnZ2TrnnHM0Y8YM/eUvf4l5XvMPgu7bt6+eeuqpFttevny5LrjgAoVCIQ0ZMsRXHzKaqfM8YMCAuK9z+r4MHz5coVBI5557ru8+CDoT53rq1KlxX2PMmDEx26am/yaV87x06VJdfPHF6ty5s3Jzc/WLX/xC8+fP14kTJ2K2zXn+m1TvHc3FC4CSv8+zHxEAAQAAAoYACAAAEDAEQAAAgIAhAAIAAAQMARAAACBgCIAAAAABQwAEAAAIGAIgAABAwBAAAQAAAoYACAAAEDAEQAAAgIAhAAIAAAQMARAAACBgCIAAAAABQwAEAAAIGAIgAABAwBAAAQAAAoYACAAAEDAEQAAAgIAhAAIAAAQMARAAACBgCIAAAAABQwAEAAAIGAIgAABAwBAAAQAAAoYACAAAEDAEQAAAgIAhAAIAAAQMARAAACBgCIAAAAABQwAEAAAIGAIgAABAwPw/CTNsBYR0djIAAAAASUVORK5CYII=\" width=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"(array([ 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0.,\n",
" 0., 0., 1., 0., 1., 0., 0., 0., 3., 0., 1., 0., 3.,\n",
" 0., 6., 0., 12., 0., 4., 0., 15., 0., 11., 0., 14., 0.,\n",
" 32., 0., 13., 0., 16., 0., 24., 0., 28., 0., 32., 0., 37.,\n",
" 0., 17., 0., 19., 0., 23., 0., 22., 0., 13., 0., 7., 0.,\n",
" 13., 0., 4., 0., 11., 0., 3., 0., 3., 0., 0., 0., 0.,\n",
" 0., 0., 0., 1., 0., 1., 0., 0., 1.]),\n",
" array([14294. , 14294.5, 14295. , 14295.5, 14296. , 14296.5, 14297. ,\n",
" 14297.5, 14298. , 14298.5, 14299. , 14299.5, 14300. , 14300.5,\n",
" 14301. , 14301.5, 14302. , 14302.5, 14303. , 14303.5, 14304. ,\n",
" 14304.5, 14305. , 14305.5, 14306. , 14306.5, 14307. , 14307.5,\n",
" 14308. , 14308.5, 14309. , 14309.5, 14310. , 14310.5, 14311. ,\n",
" 14311.5, 14312. , 14312.5, 14313. , 14313.5, 14314. , 14314.5,\n",
" 14315. , 14315.5, 14316. , 14316.5, 14317. , 14317.5, 14318. ,\n",
" 14318.5, 14319. , 14319.5, 14320. , 14320.5, 14321. , 14321.5,\n",
" 14322. , 14322.5, 14323. , 14323.5, 14324. , 14324.5, 14325. ,\n",
" 14325.5, 14326. , 14326.5, 14327. , 14327.5, 14328. , 14328.5,\n",
" 14329. , 14329.5, 14330. , 14330.5, 14331. , 14331.5, 14332. ,\n",
" 14332.5, 14333. , 14333.5, 14334. , 14334.5, 14335. , 14335.5,\n",
" 14336. , 14336.5, 14337. , 14337.5, 14338. , 14338.5, 14339. ,\n",
" 14339.5, 14340. , 14340.5, 14341. , 14341.5, 14342. , 14342.5,\n",
" 14343. , 14343.5, 14344. ]),\n",
" <a list of 100 Patch objects>)"
]
},
"execution_count": 163,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fig,ax = subplots(3)\n",
"ax[0].hist(ds[M1], 100)\n",
"ax[1].hist(ds[M2]&((1<<14)-1), 100)\n",
"ax[2].hist(ds[M4]&((1<<14)-1), 100)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"def plot_distrib(fn, pix0=0, pix1=0):\n",
" with h5py.File(fn, \"r\") as h:\n",
" k = list(h[\"data\"].keys())[0]\n",
" ds = h[\"data/%s/data\"%k][slice(None),pix0, pix1]\n",
" dgain = (ds>>14)\n",
" M1 = dgain == 0\n",
" M2 = dgain == 1\n",
" M4 = dgain == 3\n",
" fig,ax = subplots(3)\n",
" ax[0].hist(ds[M1], 100)\n",
" ax[1].hist(ds[M2]&((1<<14)-1), 100)\n",
" ax[2].hist(ds[M4]&((1<<14)-1), 100)\n",
" return ax"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"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",
" fig.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\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 overridden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + 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",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\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,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAEvklEQVR4nO3BAQ0AAADCoPdPbQ43oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4Mwu4AAehrHaUAAAAASUVORK5CYII=\" width=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"array([<matplotlib.axes._subplots.AxesSubplot object at 0x7f0baf6de3c8>,\n",
" <matplotlib.axes._subplots.AxesSubplot object at 0x7f0baf701780>,\n",
" <matplotlib.axes._subplots.AxesSubplot object at 0x7f0baf697cf8>],\n",
" dtype=object)"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"plot_distrib(ped_file, 10, 100)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"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",
" fig.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\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 overridden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + 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",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\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,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAEvklEQVR4nO3BAQ0AAADCoPdPbQ43oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4Mwu4AAehrHaUAAAAASUVORK5CYII=\" width=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x7f0baf4e87b8>]"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fig,ax = subplots()\n",
"ax.plot(numpy.arcsinh(ds))"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"%load_ext Cython"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"%%cython --compile-args=-fopenmp --link-args=-fopenmp\n",
"\n",
"import cython\n",
"import h5py\n",
"import numpy\n",
"cimport numpy as cnumpy\n",
"from cython.parallel import prange\n",
"\n",
"cdef class StatAccumulator:\n",
" cdef:\n",
" readonly int bits\n",
" readonly int frames\n",
" readonly int height\n",
" readonly int width\n",
" readonly cnumpy.uint32_t[:, :, ::1] count # gain is first index\n",
" readonly cnumpy.float64_t[:, :,::1] sum, M2 \n",
" def __cinit__(self, shape, int bits=14):\n",
" self.bits = bits\n",
" ngains = 1<<(16-bits)\n",
" self.frames = 0\n",
" self.height = shape[0]\n",
" self.width = shape[-1]\n",
" self.count = numpy.zeros([ngains, self.height, self.width], dtype=numpy.uint32)\n",
" self.sum = numpy.zeros([ngains, self.height, self.width], dtype=numpy.float64)\n",
" self.M2 = numpy.zeros([ngains, self.height, self.width], dtype=numpy.float64)\n",
" \n",
" def __deallocate(self):\n",
" self.count = None\n",
" self.summ = None\n",
" self.M2 = None\n",
" \n",
" @cython.wraparound(False)\n",
" @cython.boundscheck(False)\n",
" @cython.initializedcheck(False)\n",
" @cython.cdivision(True)\n",
" def feed(self, cnumpy.uint16_t[:, ::1] frame):\n",
" cdef:\n",
" int gain, i, j, mask\n",
" int value, trimmed, cnt\n",
" double to_store, sm, delta\n",
" \n",
" mask = (1<<self.bits) -1\n",
" self.frames += 1 \n",
" for i in prange(self.height, nogil=True):\n",
" for j in range(self.width):\n",
" \n",
" value = frame[i,j]\n",
" gain = value>>self.bits\n",
" trimmed = value & mask\n",
" to_store = <double> trimmed\n",
" cnt = self.count[gain, i, j] + 1 \n",
" self.count[gain, i, j] = cnt\n",
" sm = self.sum[gain, i, j] + to_store\n",
" self.sum[gain, i, j] = sm \n",
" delta = (sm/cnt)-to_store\n",
" self.M2[gain, i, j] = self.M2[gain, i, j] + delta*delta*(cnt-1)/cnt\n",
" \n",
" def stats(self):\n",
" mean = numpy.asarray(self.sum)/numpy.asarray(self.count)\n",
" std = numpy.sqrt(numpy.asarray(self.M2)/(numpy.asarray(self.count)-1))\n",
" return mean, std\n",
"\n",
"@cython.wraparound(False)\n",
"@cython.boundscheck(False)\n",
"@cython.initializedcheck(False)\n",
"@cython.cdivision(True)\n",
"def correct_frame(cnumpy.uint16_t[:,::1] raw, \n",
" cython.floating[:, :,::1] gain, \n",
" cython.floating[:, :,::1] pedestal):\n",
" cdef:\n",
" int n, m, g, i, j, value, mask, nbits=14\n",
" cnumpy.float32_t[:, ::1] result\n",
" cython.floating gain_value\n",
" m = raw.shape[0]\n",
" n = raw.shape[1]\n",
" mask = (1<<nbits)-1\n",
" result = numpy.empty((m,n), dtype=numpy.float32)\n",
" for i in range(m):#, nogil=True):\n",
" for j in range(n):\n",
" value = raw[i, j]\n",
" g = value >> nbits\n",
" if g == 3:\n",
" g = 2\n",
" gain_value = gain[g, i, j]\n",
" result[i, j] = ((value&mask) - pedestal[g, i, j]) / gain_value if gain_value else 0.0\n",
" return numpy.asarray(result)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"def stat_stack(filename, start=0, stop=-1):\n",
" \"A tool to perform some statistics analysis on a bunch of frames\"\n",
" with h5py.File(filename, mode=\"r\") as h:\n",
" k = list(h[\"data\"].keys())[0]\n",
" ds = h[\"data/%s/data\"%k]\n",
" acc = StatAccumulator(ds.shape[-2:])\n",
" if stop == -1:\n",
" stop = ds.shape[-1]\n",
" for i in range(start, stop):\n",
" acc.feed(ds[i])\n",
" return acc.stats()"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/mntdirect/_scisoft/users/jupyter/jupy35/lib/python3.5/site-packages/ipykernel_launcher.py:11: RuntimeWarning: invalid value encountered in true_divide\n",
" # This is added back by InteractiveShellApp.init_path()\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 4min 47s, sys: 18.9 s, total: 5min 6s\n",
"Wall time: 1min 7s\n"
]
},
{
"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",
" fig.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\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 overridden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + 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",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\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,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAEvklEQVR4nO3BAQ0AAADCoPdPbQ43oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4Mwu4AAehrHaUAAAAASUVORK5CYII=\" width=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"19.735823769500087"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%time slices1k = stat_stack(ped_file, 0, 1500)\n",
"fig, ax = subplots()\n",
"ax.imshow(slices1k[1][0].reshape(-1, 4096))\n",
"numpy.nanmean(slices1k[1][0])"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/mntdirect/_scisoft/users/jupyter/jupy35/lib/python3.5/site-packages/ipykernel_launcher.py:11: RuntimeWarning: invalid value encountered in true_divide\n",
" # This is added back by InteractiveShellApp.init_path()\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 1min 39s, sys: 6.9 s, total: 1min 46s\n",
"Wall time: 22.6 s\n"
]
}
],
"source": [
"%time slices2k = stat_stack(ped_file, 2000, 2500)"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"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",
" fig.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\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 overridden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + 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",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\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,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAEvklEQVR4nO3BAQ0AAADCoPdPbQ43oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4Mwu4AAehrHaUAAAAASUVORK5CYII=\" width=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"2544.2862576054904"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fig, ax = subplots()\n",
"ax.imshow(slices2k[0][0].reshape(-1, 4096))\n",
"numpy.nanmean(slices2k[0][0])"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/mntdirect/_scisoft/users/jupyter/jupy35/lib/python3.5/site-packages/ipykernel_launcher.py:11: RuntimeWarning: invalid value encountered in true_divide\n",
" # This is added back by InteractiveShellApp.init_path()\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 1min 41s, sys: 9.71 s, total: 1min 51s\n",
"Wall time: 30.2 s\n"
]
},
{
"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",
" fig.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\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 overridden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + 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",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\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,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAEvklEQVR4nO3BAQ0AAADCoPdPbQ43oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4Mwu4AAehrHaUAAAAASUVORK5CYII=\" width=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"6.7765221608999235"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%time slices3k = stat_stack(ped_file, 2600, 3000)\n",
"fig, ax = subplots()\n",
"ax.imshow(slices3k[1][1].reshape(-1, 4096))\n",
"numpy.nanmean(slices3k[1][1])"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/mntdirect/_scisoft/users/jupyter/jupy35/lib/python3.5/site-packages/ipykernel_launcher.py:11: RuntimeWarning: invalid value encountered in true_divide\n",
" # This is added back by InteractiveShellApp.init_path()\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 1min 24s, sys: 8.56 s, total: 1min 32s\n",
"Wall time: 18.9 s\n"
]
},
{
"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",
" fig.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\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 overridden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + 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",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\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,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAEvklEQVR4nO3BAQ0AAADCoPdPbQ43oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4Mwu4AAehrHaUAAAAASUVORK5CYII=\" width=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"8.836223371290236"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%time slices4k = stat_stack(ped_file, 3110, 3500)\n",
"fig, ax = subplots()\n",
"ax.imshow(slices4k[1][3].reshape(-1, 4096))\n",
"numpy.nanmean(slices4k[1][3])"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(4, 16384, 1024)"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"slices4k[0].shape"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"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",
" fig.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\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 overridden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + 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",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\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,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAEvklEQVR4nO3BAQ0AAADCoPdPbQ43oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4Mwu4AAehrHaUAAAAASUVORK5CYII=\" width=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"fig, ax = subplots(2,2)\n",
"for i,a in enumerate(ax.flat):\n",
" a.imshow(slices4k[0][i].reshape(-1, 4096))\n",
" a.set_title(\"Mean channel %i\"%i)\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 4min 42s, sys: 1.51 s, total: 4min 44s\n",
"Wall time: 27.6 s\n"
]
}
],
"source": [
"%%time \n",
"pedestal_mean = numpy.zeros_like(slices4k[0])\n",
"pedestal_mean[0] = slices2k[0][0]\n",
"pedestal_mean[1] = slices3k[0][1]\n",
"pedestal_mean[2] = slices4k[0][3]\n",
"\n",
"pedestal_std = numpy.zeros_like(slices4k[1])\n",
"pedestal_std[0] = slices2k[1][0]\n",
"pedestal_std[1] = slices3k[1][1]\n",
"pedestal_std[2] = slices4k[1][3]\n",
"\n",
"\n",
"with h5py.File(prefix+\"pedestal_20190324_avg_bs.h5\", \"w\") as f:\n",
" f.create_dataset(\"mean\",\n",
" pedestal_mean.shape,\n",
" compression=bitshuffle.h5.H5FILTER,\n",
" compression_opts=(0, bitshuffle.h5.H5_COMPRESS_LZ4),\n",
" dtype='float32',\n",
" data=pedestal_mean\n",
" )\n",
" f.create_dataset(\"std\",\n",
" pedestal_std.shape,\n",
" compression=bitshuffle.h5.H5FILTER,\n",
" compression_opts=(0, bitshuffle.h5.H5_COMPRESS_LZ4),\n",
" dtype='float32',\n",
" data=pedestal_std\n",
" )\n",
" f.create_dataset(\"gain\",\n",
" gain.shape,\n",
" compression=bitshuffle.h5.H5FILTER,\n",
" compression_opts=(0, bitshuffle.h5.H5_COMPRESS_LZ4),\n",
" dtype='float32',\n",
" data=gain\n",
" )\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [],
"source": [
"from numba import jit\n",
" \n",
"@jit(nopython=True, nogil=True, cache=True)\n",
"def do_corrections(m, n, image, G, P, pede_mask, mask, mask2):\n",
" gain_mask = np.bitwise_and(np.right_shift(image, 14), mask2)\n",
" data = np.bitwise_and(image, mask)\n",
" res = np.empty((m, n), dtype=np.float32)\n",
" \n",
"\n",
" for i in range(m):\n",
" for j in range(n):\n",
" if pede_mask[i][j] != 0:\n",
" res[i][j] = 0\n",
" continue\n",
" gm = gain_mask[i][j]\n",
" if gm == 3:\n",
" gm = 2\n",
" res[i][j] = (data[i][j] - P[gm][i][j]) / G[gm][i][j]\n",
"\n",
" return res\n"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"/mntdirect/_scisoft/users/jupyter/jupy35/lib/python3.5/site-packages/bitshuffle/plugin\n",
"(432, 16384, 1024)\n"
]
}
],
"source": [
"with h5py.File(prefix+\"pedestal_20190324_avg_bs.h5\", \"r\") as h:\n",
" pedestal_mean = h[\"mean\"][...]\n",
" pedestal_std = h[\"std\"][...]\n",
" pedestal_gain = h[\"gain\"][...]\n",
"with h5py.File(img_files, \"r\") as f:\n",
" k = list(f[\"data\"].keys())[0]\n",
" raw = f[\"data/%s/data\"%k][...]\n",
"print(raw.shape)"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [],
"source": [
"#ls /mntdirect/_scisoft/users/jupyter/jupy35/lib/python3.5/site-packages/bitshuffle/plugin"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [],
"source": [
"#%load_ext Cython"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(432, 16384, 1024)\n",
"(4, 16384, 1024)\n",
"(4, 16384, 1024)\n",
"90.4 ms ± 723 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)\n"
]
}
],
"source": [
"print(raw.shape)\n",
"print(gain.shape)\n",
"print(pedestal_mean.shape)\n",
"%timeit correct_frame(raw[0], gain, pedestal_mean)"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib nbagg\n",
"from matplotlib.pylab import subplots\n",
"import numpy"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"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",
" fig.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\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 overridden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + 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",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\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": [
"<div id='3c7f22b3-17fd-42ae-98f9-f77ec9f2deb2'></div>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"<matplotlib.image.AxesImage at 0x7f0b4c9ddeb8>"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fig, ax = subplots()\n",
"img = correct_frame(raw[250], gain, pedestal_mean)\n",
"ax.imshow(img.reshape(-1, 4096).clip(0,100))"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(432, 16384, 1024)\n",
"float32\n"
]
}
],
"source": [
"\n",
"import bitshuffle.h5\n",
"with h5py.File(\"/scratch/kieffer/JF16/lysoembl_32_1153_intensity_corrected_bs.h5\", \"w\") as h5:\n",
" data_grp = h5.require_group(\"data\")\n",
" ds = data_grp.require_dataset(\"data\", \n",
" shape=raw.shape, \n",
" chunks=(1,)+raw.shape[1:], \n",
" compression=bitshuffle.h5.H5FILTER,\n",
" compression_opts=(0, bitshuffle.h5.H5_COMPRESS_LZ4),\n",
" dtype=numpy.float32)\n",
" print(ds.shape)\n",
" print(ds.dtype)\n",
" for idx, frame in enumerate(raw):\n",
" ds[idx] = correct_frame(frame, gain, pedestal_mean)\n"
]
},
{
"cell_type": "code",
"execution_count": 86,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Choose platform:\n",
"[0] <pyopencl.Platform 'NVIDIA CUDA' at 0x561462be7600>\n",
"[1] <pyopencl.Platform 'Intel(R) OpenCL' at 0x561462a6a930>\n",
"[2] <pyopencl.Platform 'AMD Accelerated Parallel Processing' at 0x7f0b4622da18>\n",
"Choice [0]:0\n",
"Set the environment variable PYOPENCL_CTX='0' to avoid being asked again.\n",
"(4, 16384, 1024)\n",
"The pyopencl.ipython_ext extension is already loaded. To reload it, use:\n",
" %reload_ext pyopencl.ipython_ext\n"
]
},
{
"data": {
"text/plain": [
"<pyopencl.Context at 0x561461a368f0 on <pyopencl.Device 'GeForce GTX 1080 Ti' on 'NVIDIA CUDA' at 0x561462431c00>>"
]
},
"execution_count": 86,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#Pedastal calculation using the GPU !\n",
"\n",
"import pyopencl\n",
"from pyopencl import array as cla\n",
"ctx = pyopencl.create_some_context(interactive=True)\n",
"queue = pyopencl.CommandQueue(ctx)\n",
"shape = 16*1024,1024\n",
"frame_d = cla.empty(queue, shape[-2:], dtype=\"uint16\")\n",
"corrected_d = cla.empty(queue, shape[-2:], dtype=\"float32\")\n",
"icorrected_d = cla.empty(queue, shape[-2:], dtype=\"uint32\")\n",
"pedestal_d = cla.to_device(queue, pedestal_mean.astype(\"float32\"))\n",
"error_d = cla.to_device(queue, pedestal_std.astype(\"float32\"))\n",
"gains_d = cla.to_device(queue, gain.astype(\"float32\"))\n",
"\n",
"bits = 14\n",
"ngains = 1<<(16-bits)\n",
"print((ngains, shape[-2], shape[-1]))\n",
"count_d = cla.empty(queue, (ngains, shape[-2], shape[-1]), dtype=\"uint32\")\n",
"sum_d = cla.empty(queue, (ngains, shape[-2], shape[-1]), dtype=\"float32\")\n",
"M2_d = cla.empty(queue, (ngains, shape[-2], shape[-1]), dtype=\"float32\")\n",
"\n",
"%load_ext pyopencl.ipython_ext\n",
"\n",
"ctx"
]
},
{
"cell_type": "code",
"execution_count": 87,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(dtype('uint16'),\n",
" dtype('float32'),\n",
" dtype('float32'),\n",
" dtype('float32'),\n",
" dtype('float32'))"
]
},
"execution_count": 87,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"frame_d.dtype, corrected_d.dtype, pedestal_d.dtype, error_d.dtype, gains_d.dtype"
]
},
{
"cell_type": "code",
"execution_count": 88,
"metadata": {},
"outputs": [],
"source": [
"%%cl_kernel\n",
"\n",
"#define BITS_MANTISSA_FLOAT 23\n",
"\n",
"inline float truncate_precision32(float value, \n",
" uchar prec_bits) \n",
"{\n",
" union{ float f; uint u;} work;\n",
" work.f = value;\n",
" if (prec_bits < BITS_MANTISSA_FLOAT)\n",
" {\n",
" int zeroed_bits = BITS_MANTISSA_FLOAT - prec_bits;\n",
" uint mask = ~((1 << zeroed_bits) - 1);\n",
" work.u &= mask;\n",
" }\n",
" return work.f;\n",
"}\n",
"\n",
"inline float correct_pedestal(global ushort *raw,\n",
" global float *gain,\n",
" global float *pedestal,\n",
" uint size)\n",
"{\n",
" uint idx = get_global_id(0);\n",
" float result = 0.0f;\n",
" if (idx<size)\n",
" {\n",
"\n",
" uint idx = get_global_id(0);\n",
" uint value = raw[idx];\n",
" uint g = value >>14;\n",
" value &= (1<<14)-1;\n",
" g = (g==3)?2:g;\n",
" uint read_at = g*size + idx;\n",
" float gain_value = gain[read_at];\n",
" if (gain_value!=0.0f)\n",
" result = (value - pedestal[read_at]) / gain_value;\n",
" }\n",
" return result;\n",
"}\n",
"inline float correct_pedestal_cutoff(global ushort *raw,\n",
" global float *gain,\n",
" global float *pedestal,\n",
" global float *error,\n",
" uint size,\n",
" uint nsigma)\n",
"{\n",
" uint idx = get_global_id(0);\n",
" float result = 0.0f;\n",
" if (idx<size)\n",
" {\n",
"\n",
" uint idx = get_global_id(0);\n",
" uint value = raw[idx];\n",
" uint g = value >>14;\n",
" value &= (1<<14)-1;\n",
" g = (g==3)?2:g;\n",
" uint read_at = g*size + idx;\n",
" result = value - pedestal[read_at];\n",
" if (g==0 && result<nsigma*error[read_at])\n",
" {\n",
" result = 0.0f;\n",
" }\n",
" else\n",
" {\n",
" float gain_value = gain[read_at];\n",
" if (gain_value!=0.0f)\n",
" {\n",
" result = (value - pedestal[read_at]) / gain_value;\n",
" }\n",
" }\n",
" }\n",
" return result;\n",
"}\n",
"\n",
"\n",
"kernel void ocl_pedestal_simple( global ushort *raw,\n",
" global float *gain,\n",
" global float *pedestal,\n",
" global float *result,\n",
" uint size)\n",
"{\n",
" uint idx = get_global_id(0);\n",
" if (idx<size)\n",
" {\n",
" result[idx] = correct_pedestal(raw, gain, pedestal, size);\n",
" }\n",
"}\n",
"\n",
"kernel void ocl_pedestal_crop14( global ushort *raw,\n",
" global float *gain,\n",
" global float *pedestal,\n",
" global float *result,\n",
" uint size)\n",
"{\n",
" uint idx = get_global_id(0);\n",
" if (idx<size)\n",
" {\n",
" result[idx] = truncate_precision32(correct_pedestal(raw, gain, pedestal, size), 14);\n",
" }\n",
"}\n",
"\n",
"kernel void ocl_pedestal_cutoff( global ushort *raw,\n",
" global float *gain,\n",
" global float *pedestal,\n",
" global float *error,\n",
" global float *result,\n",
" uint size,\n",
" uint nsigma)\n",
"{\n",
" uint idx = get_global_id(0);\n",
" if (idx<size)\n",
" {\n",
" result[idx] = truncate_precision32(correct_pedestal_cutoff(raw, gain, pedestal, error, size, nsigma), 14);\n",
" }\n",
"}\n",
"\n",
"kernel void ocl_pedestal_cutoff_int( global ushort *raw,\n",
" global float *gain,\n",
" global float *pedestal,\n",
" global float *error,\n",
" global uint *result,\n",
" uint size,\n",
" uint nsigma)\n",
"{\n",
" uint idx = get_global_id(0);\n",
" if (idx<size)\n",
" {\n",
" result[idx] = (uint) correct_pedestal_cutoff(raw, gain, pedestal, error, size, nsigma);\n",
" }\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": 76,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(432, 16384, 1024)\n",
"float32\n",
"CPU times: user 11min 25s, sys: 1min 17s, total: 12min 42s\n",
"Wall time: 2min 27s\n"
]
}
],
"source": [
"%%time \n",
"with h5py.File(prefix + \"lysoembl_32_1153_intensity_corrected_bs_gpu.h5\", \"w\") as h5:\n",
" data_grp = h5.require_group(\"data\")\n",
" ds = data_grp.require_dataset(\"data\", \n",
" shape=raw.shape, \n",
" chunks=(1,)+raw.shape[1:], \n",
" compression=bitshuffle.h5.H5FILTER,\n",
" compression_opts=(0, bitshuffle.h5.H5_COMPRESS_LZ4),\n",
" dtype=numpy.float32)\n",
" print(ds.shape)\n",
" print(ds.dtype)\n",
" for idx, frame in enumerate(raw):\n",
" frame_d.set(frame)\n",
" ocl_pedestal_simple(queue, (frame.size,), (1024,), \n",
" frame_d.data,\n",
" gains_d.data,\n",
" pedestal_d.data,\n",
" corrected_d.data,\n",
" numpy.uint32(frame.size))\n",
" ds[idx] = corrected_d.get()\n"
]
},
{
"cell_type": "code",
"execution_count": 77,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(432, 16384, 1024)\n",
"float32\n",
"CPU times: user 12min 39s, sys: 1min 1s, total: 13min 40s\n",
"Wall time: 2min 29s\n"
]
}
],
"source": [
"%%time \n",
"with h5py.File(prefix+\"/lysoembl_32_1153_intensity_corrected_bs_gpu_14b.h5\", \"w\") as h5:\n",
" data_grp = h5.require_group(\"data\")\n",
" ds = data_grp.require_dataset(\"data\", \n",
" shape=raw.shape, \n",
" chunks=(1,)+raw.shape[1:], \n",
" compression=bitshuffle.h5.H5FILTER,\n",
" compression_opts=(0, bitshuffle.h5.H5_COMPRESS_LZ4),\n",
" dtype=numpy.float32)\n",
" print(ds.shape)\n",
" print(ds.dtype)\n",
" for idx, frame in enumerate(raw):\n",
" frame_d.set(frame)\n",
" ocl_pedestal_crop14(queue, (frame.size,), (1024,), \n",
" frame_d.data,\n",
" gains_d.data,\n",
" pedestal_d.data,\n",
" corrected_d.data,\n",
" numpy.uint32(frame.size))\n",
" ds[idx] = corrected_d.get()"
]
},
{
"cell_type": "code",
"execution_count": 90,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(432, 16384, 1024)\n",
"float32\n",
"CPU times: user 19min 29s, sys: 53 s, total: 20min 22s\n",
"Wall time: 3min 18s\n"
]
}
],
"source": [
"%%time \n",
"nsigma=4\n",
"\n",
"with h5py.File(prefix+\"/lysoembl_32_1153_intensity_corrected_bs_gpu_%isigma_14b.h5\"%nsigma, \"w\") as h5:\n",
" data_grp = h5.require_group(\"data\")\n",
" ds = data_grp.require_dataset(\"data\", \n",
" shape=raw.shape, \n",
" chunks=(1,)+raw.shape[1:], \n",
" compression=bitshuffle.h5.H5FILTER,\n",
" compression_opts=(0, bitshuffle.h5.H5_COMPRESS_LZ4),\n",
" dtype=numpy.float32)\n",
" print(ds.shape)\n",
" print(ds.dtype)\n",
" for idx, frame in enumerate(raw):\n",
" frame_d.set(frame)\n",
" ocl_pedestal_cutoff(queue, (frame.size,), (1024,), \n",
" frame_d.data,\n",
" gains_d.data,\n",
" pedestal_d.data,\n",
" error_d.data,\n",
" corrected_d.data,\n",
" numpy.uint32(frame.size),\n",
" numpy.uint32(nsigma))\n",
" ds[idx] = corrected_d.get()"
]
},
{
"cell_type": "code",
"execution_count": 94,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(432, 16384, 1024)\n",
"uint32\n",
"CPU times: user 49 s, sys: 23.6 s, total: 1min 12s\n",
"Wall time: 33.3 s\n"
]
}
],
"source": [
"%%time \n",
"nsigma=4\n",
"with h5py.File(prefix+\"/lysoembl_32_1153_intensity_corrected_bs_gpu_%isigma_int.h5\"%nsigma, \"w\") as h5:\n",
" data_grp = h5.require_group(\"data\")\n",
" ds = data_grp.require_dataset(\"data\", \n",
" shape=raw.shape, \n",
" chunks=(1,)+raw.shape[1:], \n",
" compression=bitshuffle.h5.H5FILTER,\n",
" compression_opts=(0, bitshuffle.h5.H5_COMPRESS_LZ4),\n",
" dtype=numpy.uint32)\n",
" print(ds.shape)\n",
" print(ds.dtype)\n",
" for idx, frame in enumerate(raw):\n",
" frame_d.set(frame)\n",
" ocl_pedestal_cutoff_int(queue, (frame.size,), (1024,), \n",
" frame_d.data,\n",
" gains_d.data,\n",
" pedestal_d.data,\n",
" error_d.data,\n",
" icorrected_d.data,\n",
" numpy.uint32(frame.size),\n",
" numpy.uint32(nsigma))\n",
" ds[idx] = icorrected_d.get()"
]
},
{
"cell_type": "code",
"execution_count": 96,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"7078320\n",
"CPU times: user 1min 38s, sys: 25.8 s, total: 2min 3s\n",
"Wall time: 2min 3s\n"
]
}
],
"source": [
"%%time \n",
"nsigma=4\n",
"\n",
"from scipy.sparse import csr_matrix\n",
"nnz = 0\n",
"start_at=0\n",
"data = []\n",
"indices = []\n",
"indptr = []\n",
"# with h5py.File(prefix+\"/lysoembl_32_1153_intensity_corrected_bs_gpu_%isigma_14b.h5\"%nsigma, \"w\") as h5:\n",
"# data_grp = h5.require_group(\"data\")\n",
"# ds = data_grp.require_dataset(\"data\", \n",
"# shape=raw.shape, \n",
"# chunks=(1,)+raw.shape[1:], \n",
"# compression=bitshuffle.h5.H5FILTER,\n",
"# compression_opts=(0, bitshuffle.h5.H5_COMPRESS_LZ4),\n",
"# dtype=numpy.float32)\n",
"# print(ds.shape)\n",
"# print(ds.dtype)\n",
"for idx, frame in enumerate(raw):\n",
" frame_d.set(frame)\n",
" ocl_pedestal_cutoff(queue, (frame.size,), (1024,), \n",
" frame_d.data,\n",
" gains_d.data,\n",
" pedestal_d.data,\n",
" error_d.data,\n",
" corrected_d.data,\n",
" numpy.uint32(frame.size),\n",
" numpy.uint32(nsigma))\n",
" corrected = corrected_d.get()\n",
" csr = csr_matrix(corrected)\n",
" indptr.append(csr.indptr+start_at)\n",
" indices.append(csr.indices)\n",
" data.append(csr.data)\n",
" start_at+=len(csr.indptr)\n",
"print(start_at)"
]
},
{
"cell_type": "code",
"execution_count": 119,
"metadata": {},
"outputs": [],
"source": [
"indptr2 = [i[1:]-i[0] for i in indptr]\n",
"indptr3 = [numpy.arange(1)]\n",
"for d in indptr2:\n",
" indptr3.append(d+indptr3[-1][-1]) \n",
"with h5py.File(prefix+\"/lysoembl_32_1153_intensity_corrected_bs_sparse_%isigma.h5\"%nsigma, \"w\") as h5:\n",
" data_grp = h5.require_group(\"data\")\n",
" ds = data_grp.require_dataset(\"data\",\n",
" shape=(sum(i.size for i in data),),\n",
" compression=bitshuffle.h5.H5FILTER,\n",
" compression_opts=(0, bitshuffle.h5.H5_COMPRESS_LZ4),\n",
" dtype=numpy.float32,\n",
" data = numpy.concatenate(data).astype(\"float32\") )\n",
" dis = data_grp.require_dataset(\"indices\",\n",
" shape=(sum(i.size for i in indices),),\n",
" compression=bitshuffle.h5.H5FILTER,\n",
" compression_opts=(0, bitshuffle.h5.H5_COMPRESS_LZ4),\n",
" dtype=numpy.uint16,\n",
" data = numpy.concatenate(indices).astype(\"uint16\"))\n",
" dip = data_grp.require_dataset(\"indptr\",\n",
" shape=(sum(i.size for i in indptr3),),\n",
" compression=bitshuffle.h5.H5FILTER,\n",
" compression_opts=(0, bitshuffle.h5.H5_COMPRESS_LZ4),\n",
" dtype=numpy.uint32,\n",
" data = numpy.concatenate(indptr3).astype(\"uint32\"))\n"
]
},
{
"cell_type": "code",
"execution_count": 121,
"metadata": {},
"outputs": [],
"source": [
"# Bitshuffle the raw data\n",
"with h5py.File(prefix+\"/lysoembl_32_1153_raw_bs_uint16.h5\", \"w\") as h5:\n",
" data_grp = h5.require_group(\"data\")\n",
" ds = data_grp.require_dataset(\"data\", \n",
" shape=raw.shape, \n",
" chunks=(1,)+raw.shape[1:], \n",
" compression=bitshuffle.h5.H5FILTER,\n",
" compression_opts=(0, bitshuffle.h5.H5_COMPRESS_LZ4),\n",
" dtype=numpy.int16)\n",
" for idx, frame in enumerate(raw):\n",
" ds[idx] = frame"
]
},
{
"cell_type": "code",
"execution_count": 126,
"metadata": {},
"outputs": [],
"source": [
"from silx.opencl.codec.byte_offset import ByteOffset\n",
"size = numpy.prod(raw.shape[1:])\n",
"bo = ByteOffset(size, size, ctx)\n",
"bo."
]
},
{
"cell_type": "code",
"execution_count": 133,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 4.35 s, sys: 6.34 s, total: 10.7 s\n",
"Wall time: 10.7 s\n"
]
}
],
"source": [
"%%time \n",
"#Compress data to CBF\n",
"nsigma = 0\n",
"import shutil\n",
"dest_dir = prefix+\"CBF\"\n",
"if os.path.exists(dest_dir):\n",
" shutil.rmtree(dest_dir)\n",
"os.makedirs(dest_dir)\n",
"for idx, frame in enumerate(raw):\n",
" frame_d.set(frame)\n",
" ocl_pedestal_cutoff_int(queue, (frame.size,), (1024,), \n",
" frame_d.data,\n",
" gains_d.data,\n",
" pedestal_d.data,\n",
" error_d.data,\n",
" icorrected_d.data,\n",
" numpy.uint32(frame.size),\n",
" numpy.uint32(nsigma))\n",
" with open(dest_dir+\"/frame_%04i.cbf\"%idx,\"wb\") as of:\n",
" of.write(bo.encode_to_bytes(icorrected_d.ravel()))"
]
},
{
"cell_type": "code",
"execution_count": 139,
"metadata": {},
"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",
" fig.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\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 overridden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + 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",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\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,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4nOydeZgU1dX/WzEQlxj1Je/z/PSNZUTUCHGXiFHRxLhgQtTEGJMoRoMaN0yMNqCCgoKooLKIiAKyyKbiMgwDAwz7OuzLIDsM27AOy8CwzJzfH8Op+tatW0tPVU9PzZzP89Sj011UV3ffrvutc8/5ngQJgiAIgiAItYpEpk9AEARBEARBqFpEAAqCIAiCINQyRAAKgiAIgiDUMkQACoIgCIIg1DJEAAqCIAiCINQyRAAKgiAIgiDUMkQACoIgCIIg1DJEAAqCIAiCINQyRAAKgiAIgiDUMkQACoIgCIIg1DJEAAqCIAiCINQyRAAKgiAIgiDUMkQACoIgCIIg1DJEAAqCIAiCINQyRAAKgiAIgiDUMkQACoIgCIIg1DJEAAqCIAiCINQyRAAKgiAIgiDUMkQACoIgCIIg1DJEAAqCIAiCINQyRAAKgiAIgiDUMkQACoIgCIIg1DJEAAqCIAiCINQyRAAKgiAIgiDUMkQACoIgCIIg1DJEAAqCIAiCINQyRAAKgiAIgiDUMkQACoIgCIIg1DJEAAqCIAiCINQyRAAKgiAIgiDUMkQACoIgCIIg1DJEAAqCIAiCINQyRAAKgiAIgiDUMkQACoIgCIIg1DJEAAqCUO0wDINatmyZ6dOodsydO5eaNm1Kp512GiUSCVq4cGGmT0kQhJgiAlAQaiADBgygRCJB9erVo82bNzueb9asGTVq1Mj2mGEYlEgk6JlnnnHsn5eXR4lEgkaNGmU+lkgkfLcOHTpU6vwrKwC3bNlCHTp0qJHC6OjRo2QYBl1yySXUt29fGjx4MO3ZsyfTpyUIQkwRASgINRAWgG6CzksA1qtXj7Zs2WJ7TicABw8e7Lo1aNCAEokEZWdnV+r8KysA582bR4lEggYMGFCp163OFBQUUCKRoH79+mX6VARBqAGIABSEGggLwCuvvFIr6NwEYKNGjeiUU06hZ5991vacTgC60a9fP0okEo5jpEJtFYAHDx50fW7KlCmBvwOv4wiCIBCJABSEGgkLwJEjR2oFnZsAvPvuu+nRRx+lH/7whzbRGFQALlu2jE499VS66qqrqLS01Pc8y8vLqVOnTnTeeefRqaeeSrfccgstW7bMIQB3795NL7zwAjVu3JhOP/10+tGPfkR33nknLVq0yHGO6sZicOrUqfSnP/2JfvrTn1LdunXp//7v/+j555+nQ4cO+Z4nf55Tpkyhxx9/nM455xz60Y9+RA899JB2GTY7O5tuvPFGOu200+iMM86g5s2b07Jly2z7tGzZkk4//XRas2YN3XXXXXTGGWfQH/7wB+3rt2zZ0vG+mjVr5nucoO+Zj7Fx40a6++676fTTT6dzzz2XevXqRURES5YsoVtvvZVOO+00Ov/882no0KGOc9y7dy+1bt2a/u///o/q1q1LDRo0oLfeeovKysp8P19BEKoeEYCCUANhwTJv3jytoPMSgGvXrnWIxiACsKSkhC677DI644wz6Pvvvw90nq+88golEglq3rw59erVix599FE699xzqX79+jYBOG/ePGrQoAG1adOG+vbtSx07dqTzzjuPfvzjH5vva/v27dSxY0dKJBL0+OOPm8vRa9euJSKiZ599lpo3b06dO3emvn370mOPPUZ16tShP/3pT4E/z1/84hd00003UY8ePejpp5+mk08+mW6++WYqLy839x00aBCddNJJdOedd1LPnj2pa9eudMEFF9BZZ51F69evN/dr2bIl1atXjxo0aEAtW7akjz76iAYNGqR9/ZkzZ1K7du0okUjQc889R4MHD6bx48f7Hifoe27ZsiX98Ic/pMsuu4yefPJJ6t27N91www2mgD733HPpxRdfpJ49e1KjRo2oTp06tG7dOvPfl5SU0OWXX07/8z//Q+3ataOPPvqIHn74YTrppJOodevWvp+vIAhVjwhAQaiBoABkQffcc8+Zz3sJQCKif/zjH/TDH/6Qtm7dSkTBBOCjjz5KiUSCPvvss0DnuGPHDqpbty7dfffdNgHFQgcFYGlpqSOStH79eqpXrx517NjRfMxrCVgX6evSpQuddNJJtHHjRs9z5c/zmmuuoaNHj5qPv/3225RIJOibb74hIqIDBw7QWWedRa1atbL9++3bt9OPf/xj2+Mc1WvTpo3nazNu34HXcYK+Zz5G586dzcf27t1Lp556Kp100kk0fPhw8/GVK1c6Cnw6depEp59+Oq1atcr2Wm3atKE6derQpk2bAr1HQRCqDhGAglADQQFI5BR0fgJQFY1+AnDo0KGUSCTooYceCnyOn3/+OSUSCcrJybE9vmPHDocARI4fP067du2inTt30uWXX0733HOP+VzQHMCD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\" width=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"Text(0.5, 1.0, 'NNZ data per frame')"
]
},
"execution_count": 139,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fig, ax = subplots()\n",
"ax.plot([len(i) for i in data])\n",
"ax.set_xlabel(\"frame #\")\n",
"ax.set_ylabel(\"Number of non-zero pixel\")\n",
"ax.set_title(\"NNZ data per frame\")"
]
},
{
"cell_type": "code",
"execution_count": 186,
"metadata": {},
"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",
" fig.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\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 overridden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + 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",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\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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RY888gidffbZ9PWvf53uvPNO2rVrl/KaLVu20C233EJf+9rX6Nxzz6Wnn36aampqWvJP+Upi1KhRdOmll9Lpp59Op59+Ol133XWUnp7ufd9em9aHAQMGUEpKCj3xxBPe1+x1OjFgCWArw/jx46lt27Y0ZswYKioqogceeIDOOussKisrO95v7YRAeno69erViyZPnmwkgAMHDqQzzzyTpk6dSitXrqSuXbvSBRdcQFVVVd5rbrrpJrr88stp8eLF9MUXX9CFF15Id999d0v/KV9J/Pa3v6WxY8fSqlWrKD8/n2655RY6//zz6dChQ95rHnroIfrP//xPmjVrFi1fvpyuu+46uuGGG7zv19bWUocOHejXv/415eXlUXp6Op1zzjnUo0eP4/EnfaUwffp0SktLo7Vr11JJSQn17NmTTjnlFFq1ahUR2WvT2rB06VL6wQ9+QJdddplCAO11OjFgCWArQ8eOHenRRx/1/r+uro6+//3v04ABA47juzoxIQlgLBaj7373uzRkyBDva+Xl5XTqqafSuHHjiIho9erVlJKSQsuWLfNek5GRQSeddBJt37695d78CYLdu3dTSkoKzZ07l4ji1+OUU06hiRMneq8pLi6mlJQUWrRoERHFSf7JJ5+sZDRGjx5NZ5xxBh07dqxl/4ATAN/85jfpnXfesdemlaGyspLatWtH2dnZdOONN3oE0F6nEweWALYiHDt2jNq0aaNlne655x7q2rXrcXpXJy4kAdywYQOlpKRQXl6e8rpf/vKX9PjjjxMR0bvvvktnnXWW8v2amhpq06YNTZ48ufnf9AmGdevWUUpKChUWFhIR0axZsyglJYUOHDigvO7888+n4cOHExFR79696fLLL1e+v3HjRkpJSaHc3NyWeeMnAGpra2ncuHHUtm1bKioqstemleGee+6hJ598kohIIYD2Op04sASwFWH79u2UkpJCCxcuVL7+zDPPUMeOHY/TuzpxIQngggULKCUlhXbs2KG87q677qI//OEPRETUr18/at++vfazzj33XBo1alTzvuETDHV1dXTrrbfSz372M+9rH3/8MbVt21Z77bXXXkvPPvssERE98MAD1KVLF+X7hw8fppSUFKVfzaJxKCgooK9//evUpk0bOvPMMyktLY2I7LVpTRg3bhx16NDBa13hBNBepxMHlgC2IlgC2LpgCWDrxkMPPUSO41Bpaan3Nbt5HX8cO3aM1q1bR8uXL6fu3bvTOeecQ0VFRfbatBJs3bqVvv3tb9PKlSu9r1kCeGLCEsBWBFsCbl2wJeDWi0cffZT+4z/+gzZu3Kh83ZavWh86d+5MDz74oL02rQRTpkyhlJQUatOmjRcpKSl00kknUZs2bWjmzJn2Op0gsASwlaFjx4702GOPef9fV1dH5513nh0COQ4IGgIZOnSo97WKigrjEMjy5cu918yYMcMOgTQRYrEYPfroo/T9739fk98h8hvYP/vsM+9ra9asMTaw88n6t956i8444wxret8M6NSpE91777322rQSHDx4kAoLC5W45ppr6C9/+QsVFhba63QCwRLAVobx48fTqaeeSu+99x6tXr2aHnzwQTrrrLM0DSaL5kFlZSXl5eVRXl4epaSk0PDhwykvL4+2bNlCRHEZmLPOOoumTZtGBQUF1K1bN6MMzJVXXklLliyh+fPnU7t27awMTBPh4YcfpjPPPJPmzJlDO3fu9OLIkSPeax566CE6//zzafbs2bR8+XK6/vrr6frrr/e+DwmLLl26UH5+PmVmZtK5555rJSyaAN27d6e5c+fSpk2bqKCggLp3704nnXQSZWVlEZG9Nq0VvARMZK/TiQJLAFshRo4cSeeffz61bduWOnbsSIsXLz7eb+mEQU5ODqWkpGhx7733EpEvBP2d73yHTj31VOrcuTOVlJQoP2Pfvn1099130ze+8Q0644wz6L777rNC0E0E07VJSUmhsWPHeq+BiO03v/lNOu200+iOO+6gnTt3Kj9n8+bNdPPNN9PXvvY1Ouecc+if//ynFbH9/+3dP2iTeRyA8WibxiaBKMEhtZC6VFBBXBQcVCzaRZAidFEsaCUEkSrqoEiFKi6idXMQiRSKxT+ItLiISitFuoiIYmqqoYMEXRSk4P/nBrnc5U693tnzLrzPBzLkR973/b7J8vAS+M2A7du3k06nqaurY/78+bS0tJTjD/xt/q/+GID+TsFgAEqSJAWMAShJkhQwBqAkSVLAGICSJEkBYwBKkiQFjAEoSZIUMAagJElSwBiAkiRJAWMASqoanz9/ZufOncybN++r+zJLkqbHAJRUNa5fv044HGZ0dJRSqVSVOw9cvHixvK3W6OgoCxcu/I8nkhREBqCkqvHrNonf8+7du580zT+zd+9e9u/fD3zZW3rr1q3/8USSgsgAlFQVOjo6Kvb/TafTwJd9THft2kVXVxfJZJK1a9cCcPLkSZYuXUo0GqWxsZFsNluxJ3MulyORSDA4OEhzczP19fVs3ryZqakpzp8/TzqdZu7cuezevZuPHz+Wj3v79i379u2joaGBaDTKihUruH379rTvY+XKlVy9ehWAjRs3cubMmR//ciTpbzIAJVWF169f09PTQ2NjI6VSiZcvXwJfAjAej3PgwAHy+Tz5fB6A3t5ebt26RbFY5ObNmyxatIhsNls+Xy6XIxwOs379eu7du8fw8DDJZJINGzbQ3t7Oo0ePGBwcpK6ujoGBgfJxnZ2drFq1ipGRESYmJjhx4gSRSIQnT558c/b+/n4SiQSJRIJZs2YRj8dJJBLMnj2bWCxGIpGgv7//X/rmJOnPDEBJVaO3t7f85O9Xa9asYfny5X957KVLl0gmk+X3uVyOUCjExMREeS2TyRCNRiueFLa2tpLJZACYnJykpqaG58+fV5y7paWFgwcPfvPab968oVgscvbsWZYsWUKxWOTatWukUimKxSLFYrHimpL0bzMAJVWNbwVgZ2fnnz5748YN1q1bR0NDA/F4nDlz5hAKhZiamgK+BGA0Gq04pru7m8WLF1esbdu2jba2NgCGhoYIhULEYrGKV21tLe3t7X85fzab5dChQwAcO3aMHTt2TPveJWkmGYCSqsa3ArCrq6tirVgsEolE2LNnD3fv3mV8fJxz584RCoV49eoV8Nt/AH/vyJEjLFu2rGKto6ODTZs2ATAwMEBNTQ35fJ5CoVDxKpVKX515cnKyHIo1NTVEIpFyNNbV1RGLxcpPGCXpZzEAJVWN6Qbg5cuXCYfDfPr0qbx29OjRHw7A8fFxQqEQIyMj0575w4cPFAoF7ty5QyQS4fHjxzx8+JDa2lrGxsYoFAq8ePFi2ueTpJlgAEqqGtMNwPv37xMKhTh9+jRPnz6lr6+PBQsW/HAAAmzZsoWmpiauXLnCs2fPGBsb4/jx4wwNDX139gsXLrB69WoAhoeHaW5u/lv3LkkzyQCUVDWmG4AAp06dIpVKUV9fT2trK319fTMSgO/fv6e7u5umpibC4TCpVIq2tjYePHjw3dkzmQyHDx8GoKen56v/W5Skn8UAlCRJChgDUJIkKWAMQEmSpIAxACVJkgLGAJQkSQoYA1CSJClgDEBJkqSAMQAlSZICxgCUJEkKGANQkiQpYAxASZKkgDEAJUmSAsYAlCRJCphfAOG0/m20AH9PAAAAAElFTkSuQmCC\" width=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"[158358, 158358, 158355, 158360, 158352, 158360, 158382, 159607, 158360, 158369, 158368, 158359, 158362, 158350, 158358, 158366, 158340, 158361, 158366, 158406, 158391, 158373, 158361, 158366, 158353, 159225, 158395, 158352, 158351, 158364, 158490, 158456, 158451, 158887, 158398, 158564, 158357, 158431, 158355, 158349, 158419, 158345, 158353, 158362, 158444, 158830, 158967, 159207, 158384, 158346, 158417, 158856, 158805, 159253, 158347, 158354, 158404, 158348, 159385, 158396, 158451, 158376, 159577, 158352, 158782, 158390, 158352, 158358, 158356, 158362, 158353, 158346, 158342, 158357, 158349, 158363, 158524, 158387, 158357, 158364, 158352, 159074, 158755, 158346, 159160, 158434, 158934, 159149, 158331, 159196, 159037, 158358, 159084, 158344, 158658, 159541, 159127, 158364, 158347, 158366, 158373, 158356, 158807, 158400, 158344, 158355, 158853, 158441, 158417, 158344, 158414, 158640, 158335, 158344, 158871, 158730, 159206, 159118, 159432, 158546, 158352, 159557, 159230, 158356, 159321, 158869, 158406, 158352, 158734, 158360, 158546, 158354, 158349, 158361, 158627, 158775, 158606, 158348, 158582, 158335, 158464, 158345, 158345, 158350, 158356, 158447, 158348, 158502, 158334, 158346, 158339, 158356, 158377, 158349, 159118, 158818, 159264, 158599, 159032, 158519, 158347, 158360, 159325, 159165, 158693, 158925, 158355, 159607, 158473, 158889, 158459, 158358, 158560, 158979, 158351, 158346, 158340, 158349, 158331, 158398, 158443, 158338, 158340, 158345, 158355, 158468, 158574, 158361, 158541, 158597, 158333, 159578, 158416, 158666, 158347, 158510, 158540, 158385, 158825, 158947, 158352, 158403, 158819, 158562, 158357, 158356, 158347, 158357, 158358, 158540, 158462, 158349, 158699, 158347, 158342, 158355, 158414, 158447, 158345, 158375, 158374, 158338, 158338, 158342, 158356, 158352, 158351, 158368, 159325, 158507, 158555, 158654, 158653, 158402, 158777, 159133, 159194, 159208, 158356, 158344, 158362, 158338, 158342, 158358, 158368, 158336, 158342, 158350, 158354, 158462, 158456, 158334, 158360, 158353, 158417, 158407, 158359, 158338, 158360, 158364, 158400, 158433, 158345, 158360, 158746, 159289, 158350, 158451, 158356, 158359, 158362, 158620, 158437, 158771, 158349, 158358, 159482, 158420, 158355, 158351, 158351, 158650, 158417, 158491, 158350, 158354, 158354, 158356, 158355, 158356, 158360, 158496, 158366, 158367, 158474, 158374, 158468, 158353, 158374, 159143, 158763, 158636, 158407, 158418, 158789, 158373, 159384, 159012, 158354, 158350, 159252, 158878, 158872, 159560, 158348, 158646, 158359, 158485, 158359, 158355, 158358, 158363, 158619, 158349, 158350, 158367, 158339, 158345, 158330, 158342, 158342, 158371, 158342, 158387, 158389, 158358, 158426, 158518, 158336, 158359, 158343, 158364, 158417, 158707, 158340, 158361, 158639, 158716, 158347, 158354, 158343, 158354, 158475, 158331, 158353, 158362, 158352, 158371, 158388, 158339, 158351, 158464, 158361, 158331, 158349, 158342, 158331, 158333, 158335, 158334, 158339, 158338, 158337, 158646, 158450, 158342, 158340, 158404, 158535, 158366, 158333, 158341, 158754, 158367, 158356, 158368, 158373, 158456, 158352, 158388, 158548, 158332, 158438, 158421, 158372, 158328, 158331, 158338, 158323, 158609, 159014, 158363, 158551, 158390, 158342, 158343, 158347, 158339, 158336, 158347, 158762, 158531, 158963, 158364, 159261, 158320, 158338, 158332, 158411, 158554, 158334, 158339, 158344, 158341, 158332, 158329, 158351, 158344, 158348, 158329, 158332, 158346]\n"
]
},
{
"data": {
"text/plain": [
"Text(0.5, 1.0, 'NNZ data per frame')"
]
},
"execution_count": 186,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fig, ax = subplots()\n",
"logain = [ (((i&(1<<14))>>14)>0).sum() for i in raw]\n",
"print(logain)\n",
"ax.plot(logain)\n",
"ax.set_xlabel(\"frame #\")\n",
"ax.set_ylabel(\"Number of non-zero pixel\")\n",
"ax.set_title(\"NNZ data per frame\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Geometry description ..."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"ls"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"!cat JF16M.geom"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from collections import OrderedDict\n",
"\n",
"class JungFrauModule:\n",
" shape = (512, 1024)\n",
" def __init__(name, start_x):\n",
" pass\n",
" \n",
"def parse_geometry(fn):\n",
" modules = OrderedDict()\n",
" for line in open(fn):\n",
" if line.startswith(\";\"):\n",
" continue\n",
" elif not line.strip():\n",
" continue\n",
" elif \"=\" in line and line.startswith(\"m\"):\n",
" lhs, rhs = line.split(\"=\",1)\n",
" try:\n",
" m,a = lhs.split(\"/\", 1)\n",
" except:\n",
" print(lhs)\n",
" if m not in modules:\n",
" modules[m] = OrderedDict()\n",
" module = modules[m]\n",
" module[a.strip()] = rhs.strip()\n",
" return modules\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"modules = parse_geometry(\"JF16M.geom\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"fig, ax = subplots()\n",
"xmin=10000\n",
"xmax=-10000\n",
"ymin=10000\n",
"ymax=-10000\n",
"\n",
"for name, module in modules.items():\n",
" #rint(name, module)\n",
" x = float(module[\"corner_x\"])\n",
" y = float(module[\"corner_y\"])\n",
" xmax = max(x, xmax)\n",
" xmin = min(x, xmin)\n",
" ymax = max(y, ymax)\n",
" ymin = min(y, ymin)\n",
" ax.annotate(name, xy=(x,y), xytext=(x + 10, y + 10),\n",
" #weight=\"bold\", size=\"large\", color=\"black\",\n",
" arrowprops=dict(facecolor='red', edgecolor='red'))\n",
"ax.set_ylim(ymin, ymax)\n",
"ax.set_xlim(xmin, xmax)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"sds = numpy.ones((512, 1024), dtype=int)\n",
"sds[255, :] = 2\n",
"sds[256, :] = 2\n",
"sdp = numpy.cumsum(sds, axis = 0)\n",
"print(sdp[-1,-1])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"fds = numpy.ones((512, 1024), dtype=int)\n",
"fds[:, 127] = 2\n",
"fds[:, 128] = 2\n",
"fds[:, 255] = 2\n",
"fds[:, 256] = 2\n",
"fds[:, 383] = 2\n",
"fds[:, 384] = 2\n",
"\n",
"fdp = numpy.cumsum(fds, axis = 1)\n",
"print(fdp[-1,-1])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"ls /scisoft/users/kieffer/workspace/pyFAI/testimages/"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import pyFAI, fabio\n",
"ai = pyFAI.load(\"/scisoft/users/kieffer/workspace/pyFAI/testimages/Pilatus6M.poni\")\n",
"img = fabio.open(\"/scisoft/users/kieffer/workspace/pyFAI/testimages/Pilatus6M.cbf\").data\n",
"from pyFAI.gui import jupyter\n",
"jupyter.display(img)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"amorphous, bragg = ai.separate(img)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"jupyter.display(bragg[500:1000,500:1000])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"jupyter.display(amorphous[500:1000,500:1000])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"#Pedastal calculation using the GPU !\n",
"\n",
"import pyopencl\n",
"from pyopencl import array as cla\n",
"ctx = pyopencl.create_some_context(interactive=True)\n",
"queue = pyopencl.CommandQueue(ctx)\n",
"shape = 16*1024,1024\n",
"frame_d = cla.empty(queue, shape[-2:], dtype=\"uint16\")\n",
"\n",
"bits = 14\n",
"ngains = 1<<(16-bits)\n",
"print((ngains, shape[-2], shape[-1]))\n",
"count_d = cla.empty(queue, (ngains, shape[-2], shape[-1]), dtype=\"uint32\")\n",
"sum_d = cla.empty(queue, (ngains, shape[-2], shape[-1]), dtype=\"float32\")\n",
"M2_d = cla.empty(queue, (ngains, shape[-2], shape[-1]), dtype=\"float32\")\n",
"\n",
"%load_ext pyopencl.ipython_ext\n",
"\n",
"ctx"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"%%cl_kernel\n",
"kernel void memset_uint32(global unsigned int *ary, const int ngains, const int height, const int width)\n",
"{\n",
" uint col = get_global_id(0);\n",
" uint line = get_global_id(1);\n",
" if ((col<width) && (line<height))\n",
" {\n",
" int offset = line*width+col;\n",
" for (int pos=offset; pos<ngains*height*width; pos+=height*width)\n",
" {\n",
" ary[pos] = 0;\n",
" }\n",
" }\n",
"}\n",
"\n",
"kernel void memset_float32(global float *ary, const int ngains, const int height, const int width)\n",
"{\n",
" uint col = get_global_id(0);\n",
" uint line = get_global_id(1);\n",
" if ((col<width) && (line<height))\n",
" {\n",
" int offset = line*width+col;\n",
" for (int pos=offset; pos<ngains*height*width; pos+=height*width)\n",
" {\n",
" ary[pos] = 0.0f;\n",
" }\n",
" }\n",
"}\n",
"\n",
"kernel void feed(global ushort* raw,\n",
" const int bits,\n",
" const int ngains, \n",
" const int height, \n",
" const int width,\n",
" global float *sum_,\n",
" global float *M2,\n",
" global unsigned int *count\n",
" )\n",
"{\n",
" uint col = get_global_id(0);\n",
" uint line = get_global_id(1);\n",
" if ((col<width) && (line<height))\n",
" {\n",
" uint pos = col + width*line;\n",
" ushort value = raw[pos];\n",
" ushort gain = value>>bits;\n",
" if (gain==3) gain=2;\n",
" ushort mask = ((1<<bits) - 1);\n",
" ushort trimmed = value & mask;\n",
" float to_store = (float) trimmed;\n",
" pos += gain * width * height;\n",
" uint cnt = count[pos] + 1;\n",
" count[pos] = cnt;\n",
" float sm = sum_[pos] + to_store;\n",
" sum_[pos] = sm;\n",
" float delta = (sm/cnt)-to_store;\n",
" M2[pos] += delta*delta*(cnt-1)/cnt;\n",
" }\n",
"}\n",
"\n",
"kernel void ocl_pedestal(global ushort *raw,\n",
" global float *gain,\n",
" global float *pedestal,\n",
" global float *result,\n",
" uint size)\n",
"{\n",
" uint idx = get_global_id(0);\n",
" if (idx<size)\n",
" {\n",
" uint value = raw[idx];\n",
" uint g = value >>14;\n",
" value &= (1<<14)-1;\n",
" g = (g==3)?2:g;\n",
" uint read_at = g*size + idx;\n",
" float gain_value = gain[read_at];\n",
" result[idx] = (gain_value==0.0f)?0.0f:(value - pedestal[read_at]) / gain_value;\n",
" }\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"%%timeit\n",
"W=1024\n",
"evt=memset_float32(queue, (shape[-1], shape[-2]), (W, 1), sum_d.data, \n",
" numpy.int32(ngains), numpy.int32(shape[-2]), numpy.int32(shape[-1]))\n",
"evt=memset_uint32(queue, (shape[-1], shape[-2]), (W,1), count_d.data, \n",
" numpy.int32(ngains), numpy.int32(shape[-2]), numpy.int32(shape[-1]))\n",
"evt=memset_float32(queue, (shape[-1], shape[-2]), (W,1), M2_d.data, \n",
" numpy.int32(ngains), numpy.int32(shape[-2]), numpy.int32(shape[-1]))\n",
"\n",
"evt.wait()\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"%%time \n",
"filename = ped_file\n",
"start = 1535\n",
"stop = -1\n",
"cnt = 0\n",
"W=1024\n",
"print(filename)\n",
"evt=memset_float32(queue, (shape[-1], shape[-2]), (W, 1), sum_d.data, \n",
" numpy.int32(ngains), numpy.int32(shape[-2]), numpy.int32(shape[-1]))\n",
"evt=memset_uint32(queue, (shape[-1], shape[-2]), (W,1), count_d.data, \n",
" numpy.int32(ngains), numpy.int32(shape[-2]), numpy.int32(shape[-1]))\n",
"evt=memset_float32(queue, (shape[-1], shape[-2]), (W,1), M2_d.data, \n",
" numpy.int32(ngains), numpy.int32(shape[-2]), numpy.int32(shape[-1]))\n",
"\n",
"with h5py.File(filename, mode=\"r\") as h:\n",
" k = list(h[\"data\"].keys())[0]\n",
" ds = h[\"data/%s/data\"%k]\n",
" print(ds.shape)\n",
" if stop == -1:\n",
" stop = ds.shape[0]\n",
" print(start,stop)\n",
" for i in range(start, stop):\n",
" frame_d.set(ds[i])\n",
" cnt+=1\n",
" feed(queue, (shape[-1], shape[-2]), (W, 1),\n",
" frame_d.data,\n",
" numpy.uint32(bits),\n",
" numpy.uint32(ngains), \n",
" numpy.int32(shape[-2]), \n",
" numpy.int32(shape[-1]),\n",
" sum_d.data,\n",
" M2_d.data,\n",
" count_d.data)\n",
"print(cnt)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"pedestal = (sum_d.get()/count_d.get()).astype(\"float32\")\n",
"print(pedestal.shape, pedestal.dtype)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Predestal correction \n",
"\n",
"With implementation on CPU (parallel cython) and GPU (OpenCL)\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"with h5py.File(img_files, \"r\") as f:\n",
" k = list(f[\"data\"].keys())[0]\n",
" raw = f[\"data/%s/data\"%k][...]\n",
"gain = gain.astype(\"float32\")\n",
"print(raw.shape, raw.dtype)\n",
"print(gain.shape, gain.dtype)\n",
"# with h5py.File(\"pedestal_20190324_avg_bs2.h5\", \"r\") as f:\n",
"# pedestal = f[\"data/mean\"][...]\n",
"# print(pedestal.shape, pedestal.dtype)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"%load_ext Cython"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"%%cython --compile-args=-fopenmp --link-args=-fopenmp\n",
"\n",
"import cython\n",
"import h5py\n",
"import numpy\n",
"cimport numpy as cnumpy\n",
"from cython.parallel import prange\n",
"\n",
"cdef class StatAccumulator:\n",
" cdef:\n",
" readonly int bits\n",
" readonly int frames\n",
" readonly int height\n",
" readonly int width\n",
" readonly cnumpy.uint32_t[:, :, ::1] count # gain is first index\n",
" readonly cnumpy.float64_t[:, :,::1] sum, M2 \n",
" def __cinit__(self, shape, int bits=14):\n",
" self.bits = bits\n",
" ngains = 1<<(16-bits)\n",
" self.frames = 0\n",
" self.height = shape[0]\n",
" self.width = shape[-1]\n",
" self.count = numpy.zeros([ngains, self.height, self.width], dtype=numpy.uint32)\n",
" self.sum = numpy.zeros([ngains, self.height, self.width], dtype=numpy.float64)\n",
" self.M2 = numpy.zeros([ngains, self.height, self.width], dtype=numpy.float64)\n",
" \n",
" def __deallocate(self):\n",
" self.count = None\n",
" self.summ = None\n",
" self.M2 = None\n",
" \n",
" @cython.wraparound(False)\n",
" @cython.boundscheck(False)\n",
" @cython.initializedcheck(False)\n",
" @cython.cdivision(True)\n",
" def feed(self, cnumpy.uint16_t[:, ::1] frame):\n",
" cdef:\n",
" int gain, i, j, mask\n",
" int value, trimmed, cnt\n",
" double to_store, sm, delta\n",
" \n",
" mask = (1<<self.bits) -1\n",
" self.frames += 1 \n",
" for i in prange(self.height, nogil=True):\n",
" for j in range(self.width):\n",
" \n",
" value = frame[i,j]\n",
" gain = value>>self.bits\n",
" trimmed = value & mask\n",
" to_store = <double> trimmed\n",
" cnt = self.count[gain, i, j] + 1 \n",
" self.count[gain, i, j] = cnt\n",
" sm = self.sum[gain, i, j] + to_store\n",
" self.sum[gain, i, j] = sm \n",
" delta = (sm/cnt)-to_store\n",
" self.M2[gain, i, j] = self.M2[gain, i, j] + delta*delta*(cnt-1)/cnt\n",
" \n",
" def stats(self):\n",
" mean = numpy.asarray(self.sum)/numpy.asarray(self.count)\n",
" std = numpy.sqrt(numpy.asarray(self.M2)/(numpy.asarray(self.count)-1))\n",
" return mean, std\n",
"\n",
"@cython.wraparound(False)\n",
"@cython.boundscheck(False)\n",
"@cython.initializedcheck(False)\n",
"@cython.cdivision(True)\n",
"def correct_frame(cnumpy.uint16_t[:,::1] raw, \n",
" cython.floating[:, :,::1] gain, \n",
" cython.floating[:, :,::1] pedestal):\n",
" cdef:\n",
" int n, m, g, i, j, value, mask, nbits=14\n",
" cnumpy.float32_t[:, ::1] result\n",
" cython.floating gain_value\n",
" m = raw.shape[0]\n",
" n = raw.shape[1]\n",
" mask = (1<<nbits)-1\n",
" result = numpy.empty((m,n), dtype=numpy.float32)\n",
" for i in range(m):#, nogil=True):\n",
" for j in range(n):\n",
" value = raw[i, j]\n",
" g = value >> nbits\n",
" if g == 3:\n",
" g = 2\n",
" gain_value = gain[g, i, j]\n",
" result[i, j] = ((value&mask) - pedestal[g, i, j]) / gain_value if gain_value else 0.0\n",
" return numpy.asarray(result)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"%%time\n",
"with h5py.File(prefix+\"lysoembl_32_1153_intensity_cor_gzip.h5\", \"w\") as h5:\n",
" data_grp = h5.require_group(\"data\")\n",
" ds = data_grp.require_dataset(\"data\", \n",
" shape=raw.shape, \n",
" chunks=(1,)+raw.shape[1:], \n",
" compression=\"gzip\",\n",
" compression_opts=2,\n",
" shuffle=True,\n",
" dtype=numpy.float32)\n",
" for idx, frame in enumerate(raw):\n",
" ds[idx] = correct_frame(frame, gain, pedestal)\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"%%time\n",
"import bitshuffle.h5\n",
"with h5py.File(prefix+\"lysoembl_32_1153_intensity_cor_bslz4.h5\", \"w\") as h5:\n",
" data_grp = h5.require_group(\"data\")\n",
" ds = data_grp.require_dataset(\"data\", \n",
" shape=raw.shape, \n",
" chunks=(1,)+raw.shape[1:], \n",
" compression=bitshuffle.h5.H5FILTER,\n",
" compression_opts=(0, bitshuffle.h5.H5_COMPRESS_LZ4),\n",
" dtype=numpy.float32)\n",
" for idx, frame in enumerate(raw):\n",
" ds[idx] = correct_frame(frame, gain, pedestal)\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"%%cl_kernel\n",
"\n",
"#define BITS_MANTISSA_FLOAT 23\n",
"\n",
"inline float truncate_precision32(float value, \n",
" uchar prec_bits) \n",
"{\n",
" union{ float f; uint u;} work;\n",
" work.f = value;\n",
" if (prec_bits < BITS_MANTISSA_FLOAT)\n",
" {\n",
" int zeroed_bits = BITS_MANTISSA_FLOAT - prec_bits;\n",
" uint mask = ~((1 << zeroed_bits) - 1);\n",
" work.u &= mask;\n",
" }\n",
" return work.f;\n",
"}\n",
"\n",
"inline float correct_pedestal(global ushort *raw,\n",
" global float *gain,\n",
" global float *pedestal,\n",
" uint size)\n",
"{\n",
" uint idx = get_global_id(0);\n",
" float result = 0.0f;\n",
" if (idx<size)\n",
" {\n",
"\n",
" uint idx = get_global_id(0);\n",
" uint value = raw[idx];\n",
" uint g = value >>14;\n",
" value &= (1<<14)-1;\n",
" g = (g==3)?2:g;\n",
" uint read_at = g*size + idx;\n",
" float gain_value = gain[read_at];\n",
" if (gain_value!=0.0f)\n",
" result = (value - pedestal[read_at]) / gain_value;\n",
" }\n",
" return result;\n",
"}\n",
"\n",
"\n",
"kernel void ocl_pedestal_simple( global ushort *raw,\n",
" global float *gain,\n",
" global float *pedestal,\n",
" global float *result,\n",
" uint size)\n",
"{\n",
" uint idx = get_global_id(0);\n",
" if (idx<size)\n",
" {\n",
" result[idx] = correct_pedestal(raw, gain, pedestal, size);\n",
" }\n",
"}\n",
"\n",
"kernel void ocl_pedestal_crop14( global ushort *raw,\n",
" global float *gain,\n",
" global float *pedestal,\n",
" global float *result,\n",
" uint size)\n",
"{\n",
" uint idx = get_global_id(0);\n",
" if (idx<size)\n",
" {\n",
" result[idx] = truncate_precision32(correct_pedestal(raw, gain, pedestal, size), 14);\n",
" }\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {},
"outputs": [],
"source": [
"from math import pi\n",
"p32 = numpy.float32(pi)"
]
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'0b1000000010010010000111111011011'"
]
},
"execution_count": 48,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"u32 = p32.view(\"uint32\")\n",
"bin(u32)"
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {},
"outputs": [],
"source": [
"u22 = u32&~numpy.uint32((1<<10)-1)"
]
},
{
"cell_type": "code",
"execution_count": 59,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"3.1413574"
]
},
"execution_count": 59,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"u22.view(\"float32\")"
]
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"1078530011"
]
},
"execution_count": 58,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"u32"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Investigate how to distinguish between Bragg signal and noise\n"
]
},
{
"cell_type": "code",
"execution_count": 142,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/mntdirect/_scisoft/users/jupyter/jupy35/lib/python3.5/site-packages/pyFAI/io/__init__.py:1052: H5pyDeprecationWarning: dataset.value has been deprecated. Use dataset[()] instead.\n",
" self.get_attr(self.h5[grp], \"NX_class\") == \"NXentry\"]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Detector detector from NeXus file: /scratch/kieffer/JF16/Jungfrau_PSI_16M_v1.h5\t PixelSize= 7.500e-05, 7.500e-05 m\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"WARNING:pyFAI.DEPRECATION:Function AzimuthalIntegrator is deprecated since pyFAI version 0.16. Use 'pyFAI.azimuthalIntegrator.AzimuthalIntegrator' instead.\n",
" File \"<ipython-input-142-ad2cddccdb44>\", line 4, in <module>\n",
" ai = pyFAI.AzimuthalIntegrator(1, detector=JF16M)\n"
]
}
],
"source": [
"from pyFAI import detector_factory\n",
"JF16M = detector_factory(prefix+\"Jungfrau_PSI_16M_v1.h5\")\n",
"print(JF16M)\n",
"ai = pyFAI.AzimuthalIntegrator(1, detector=JF16M)\n",
"ai.sigma_clip(raw[25], unit=\"r_mm\",`)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 153,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(4409, 4215)"
]
},
"execution_count": 153,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from pyFAI.distortion import Distortion\n",
"JF16M.mask = numpy.zeros(JF16M.shape, \"int8\")\n",
"dis = Distortion(JF16M,resize=True )\n",
"frame_d.set(raw[25])\n",
"ocl_pedestal_cutoff(queue, (frame.size,), (1024,), \n",
" frame_d.data,\n",
" gains_d.data,\n",
" pedestal_d.data,\n",
" error_d.data,\n",
" corrected_d.data,\n",
" numpy.uint32(frame.size),\n",
" numpy.uint32(nsigma))\n",
"c=dis.correct(corrected_d.get())\n",
"c.shape"
]
},
{
"cell_type": "code",
"execution_count": 156,
"metadata": {},
"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",
" fig.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\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 overridden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + 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",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\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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+zMmfOcVfQ696/LRQVYBmuvnqwii6YcCZGRNeoAW98mqzDDnOjcBZxagoWZ+h1SVW/MFauj4AWJqbvXUOiG/+2F7INssMFDT6ETwXZ9HrtF5jz3WYVPXP5/V2ze1I758cQHgImgFgL9h27lzZ9u1a1d79tln2w9/+MO2cePGts8++7Snn366tfYv8Lf//vu3q6++uj399NPtb/7mb9pdd93VXnjhhbjHm970pnbccce1//Sf/lP79re/3Q477LD2p3/6pwvuSwFgAWABYAFgAWABYAFgtYW0AsBXsR144IHttttua6219nu/93vtkksumffa//bf/lubmZlp/+W//Jf4t6997Wttr732av/jf/yPBT23ALAAsACwALAAsACwALDaQloB4KvQXnrppbZ169a2ZMmS9swzz7Rf/epXbWZmpt10001t3bp17Xd+53faKaec0r797W/Hb26//fb2r//1vx7c59e//nXbe++923333bfH573wwgvtueeei8/Pf/7zNjMz016745xRMW8EYxbNhrBRHyiUM9d65Ozs7ZOI3hAOSR4qBFKWLd7zAWY+RFxDv9SXBeHsRcqPvG9zCMCAXPNtWfGXE4UfvlDi34gAdB8chVxAyvOxHb1jUvkAgci1WbUDrlE/MX4f4w4ACgAxDxFhKD5UzCnjh/JQIe3VXlQBIeQZT+ZFx4h78ptMAXuuSIXMqAixBz87j1QcAGB/b889OIhWt8oa6ifnORp1b2iuslO+fsFAgTLHnkdOfRAVRldv3zSMMO/r1qMnB1GsvU9co+PmPn/85i2PnRMfvssiTN0HkDWjue48C4B+54ocGaNrm/3OPlT/NN6NvzPIjQoglqvzqPs3j+SFZwo47qsfGlXX0ewHDlKeF/Ckr60fQbbuTcbBI111bXq1JYVL+sS4cR9dI3wXEf9yb37PtZkPIP3msD+oEmS5KTMf2Dh49+8Gh7Lu1+uQnQEgfdP9o3B/6Bc2FAAuglYA+AraU0891fbbb7+29957twMOOKDt2rWrtdba97///TYzM9N++7d/u91xxx3tiSeeaOedd15bsmRJe/bZZ1trrV155ZVt1apVo3suX7683XzzzXt87ubNm9vMzMzoUwBYAFgAWABYAFgAWABY7eW0AsBX0F588cX2ox/9qD3++ONt/fr1bdmyZe2ZZ55p3/3ud9vMzEzb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\" width=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"<matplotlib.image.AxesImage at 0x7f0af8162ef0>"
]
},
"execution_count": 156,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fig,ax = subplots()\n",
"ax.imshow(numpy.arcsinh(c))"
]
},
{
"cell_type": "code",
"execution_count": 165,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"WARNING:pyFAI.ext.splitBBoxCSR:Pixel splitting deactivated !\n"
]
},
{
"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",
" fig.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\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 overridden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + 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",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\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,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4nOy9e2xc+XXnKSMIdhd5OAvEg3h2BkYe3Xa6xRKLRbHIIll8qlhkiQ+RFEmxKBLdsJFGJtkAg+xmM/kjCBYBdgeL/DUTZP4wkhjBaBRqpEiWWrLUkkKaiihLMiVBD+itiBLV7bid7u2B47XjPfuH9nP8vbcl9YNu022eA1xQZN2693dvlVgffs8537PBIiIiIiIiIiIi1lVsWOsFRERERERERERE/GgjADAiIiIiIiIiYp1FAGBERERERERExDqLAMCIiIiIiIiIiHUWAYAREREREREREessAgAjIiIiIiIiItZZBABGRERERERERKyzCACMiIiIiIiIiFhnEQAYEREREREREbHOIgAwIiIiIiIiImKdRQBgRERERERERMQ6iwDAiIiIiIiIiIh1FgGAERERERERERHrLAIAIyIiIiIiIiLWWQQARkRERERERESsswgAjIiIiIiIiIhYZxEAGBERERERERGxziIAMCIiIiIiIiJinUUAYERERERERETEOosAwIiIiIiIiIiIdRYBgBERERERERER6ywCACMiIiIiIiIi1lkEAEZERERERERErLMIAIyIiIiIiIiIWGcRABgRERERERERsc4iADAiIiIiIiIiYp1FAGBERERERERExDqLAMCIiIiIiIiIiHUWAYAREREREREREessAgAjIiIiIiIiItZZBABGRERERERERKyzCACMiIiIiIiIiFhnEQAYEREREREREbHOIgAwIiIiIiIiImKdRQBgRERERERERMQ6iwDAiIiIiIiIiIh1FgGAERERERERERHrLAIAIyIiIiIiIiLWWQQARkRERERERESsswgAjIiIiIiIiIhYZxEAGBERERERERGxziIAMCIiIiIiIiJinUUAYERERERERETEOosAwIiIiIiIiIiIdRYBgBERERERERER6ywCACMiIiIiIiIi1lkEAEZERERERERErLMIAIyIiIiIiIiIWGcRABgRERERERERsc4iADAiIiIiIiIiYp1FAGBERERERERExDqLAMCIiIiIiIiIiHUWAYAREREREREREessAgAjIiIiIiIiItZZBABGRERERERERKyzCACMiIiIiIiIiFhnEQC4ivj+979vy8vL9tZbb9nbb78dW2yx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cUbfwe6aX4ob6vY/K6nAJscOtbnJeTY/Jddm9B1sc/rl29zkPJvRd7C9HF9ic/rl24y+g216fLG9kZXuzodzmBw71P6RUOSWWUkFNilmmL0UN9T+HjXCZiYW2qSYYTY1fojNT8m1qqibbHJs8BxfihvqzpufZyYW2svxJe7n/xddai/FDbWp8UNscuxQm5+S685vUswwd0z2PTV+iHvv+sUvTVn+fH2phUIh27dvX3OjRLOFB8AmRENDg4VCIb/4xS9+8Ytf/NICl4aGhuZGiWYLD4BNiCNHjlhDQ4Pt27fP9u/f32IXQLahoaHZz8Vfn78+f33n1nIuX9+5fG3n+vXt27fPGhoa7MiRI82NEs0WHgB92P79x2oZ9+8/N2sh/PW17PDX17LjXL6+c/nazM7962vt4QHQxzn/n9xfX8sOf30tO87l6zuXr83s3L++1h4eAH2c8//J/fW17PDX17LjXL6+c/nazM7962vt4QHQhx06dMjGjx9vhw4dau5TOSPhr69lh7++lh3n8vWdy9dmdu5fX2sPD4A+fPjw4cOHDx+tLDwA+vDhw4cPHz58tLLwAOjDhw8fPnz48NHKwgOgDx8+fPjw4cNHKwsPgD58+PDhw4cPH60sPAC2knjwwQctISHBOnXqZBEREVZSUmJvv/12YJ2MjIzjxuT89Kc/baYz/mYxfvz44879+uuvd88fPHjQbrvtNuvatat17NjRhg0bZu+++24znvE3i549ezY6xui2224zs5b32i1cuNAGDx5sV1xxhYVCIZs6dWrg+aNHj9q9995r3bt3t4suusiysrJs06ZNgXX27t1ro0ePtosvvti6dOlit9xyix04cOD7vIwTxsmu78svv7S77rrL+vTpYx06dLArrrjCxowZY7t27Qrso7HX/A9/+MP3fSmNxqlev8rKyuPOPTc3N7BOS339zOyEY8Uefvhht87Z+vqdzmfB6fy93LFjhxUUFFj79u0tIiLCfvOb39jhw4e/z0vx0cTwANhKIjc31yZMmGDr1q2z2tpaKygosB49etinn37q1snIyLBbb73V9uzZ45aW4v80fvx46927d+DcP/jgA/f8uHHj7Oqrr7YFCxbYypUrrV+/fpaSktKMZ/zN4v333w9c27x58ywUCll1dbWZtbzXbubMmfZv//ZvNmXKlEY/YB966CHr0qWLvfzyy7ZmzRorLi62Xr162cGDB906eXl5Fh0dbcuWLbPXX3/dfvzjH9uoUaO+70tpNE52ffv27bPs7GybOHGivf3227Z06VJLTEy0+Pj4wD569uxp999/f+A11f+vzRmnev0qKystLy8vcO4fffRRYJ2W+vqZWeC69uzZY3/729/svPPOs61bt7p1ztbX73Q+C0719/Krr76yPn36WHZ2ttXU1NjMmTOtW7du9tvf/rY5LsnHtwwPgK003n//fQuFQrZw4UL3WEZGht1xxx3NeFbfPsaPH2/R0dGNPrdv3z678MILbdKkSe6xDRs2WCgUsqVLl35fp/idxh133GE/+tGP7OjRo2bWsl+78A/Yo0ePWvfu3e2RRx5xj+3bt8/atWtnVVVVZma2fv16C4VCtmLFCrfOrFmz7LzzzjtOSWvuaAwgwuPNN9+0UChkO3bscI/17NnTHn/88TN9ek2OEwFgSUnJCbc5116/kpISy8zMDDzWUl6/8M+C0/l7OXPmTDv//PMDquBTTz1lnTt3ti+++OL7vQAf3zo8ALbS2Lx5s4VCIVu7dq17LCMjw7p162aXXXaZ9e7d2+655x777LPPmvEsTz/Gjx/v0mm9evWy0aNHuw/TBQsWWCgUso8//jiwTY8ePeyxxx5rjtNtUnzxxRd22WWX2QMPPOAea8mvXfgH7NatWy0UCllNTU1gvfT0dPvFL35hZmbPP/+8XXLJJYHnDx8+bBdccIFNmTLlzJ/0N4jTAYh58+bZeeedF1Bte/bsaZdffrl17drVYmJi7OGHHz4rU2wnAsAuXbpYRESEXXfddTZu3Dj78MMP3fPn0uv37rvvWps2bezvf/974PGW8vqFfxaczt/Le++997gv3Nu2bbNQKGSrV6/+fk7cR5PDA2ArjCNHjlhhYaGlpqYGHn/mmWds9uzZVldXZy+88IJdeeWVNnTo0GY6y28WM2fOtBdffNHWrFljs2fPtuTkZOvRo4d98skn9ve//93atm173DZ9+/a1u+66qxnOtmkxceJEu+CCCwJKSUt+7cI/YJcsWWKhUMh2794dWO+mm26yESNGmJnZAw88YNddd91x+4qIiLAnn3zyzJ7wN4xTAcTBgwctLi7ORo8eHXj8j3/8o1VXV9uaNWvsqaeesksuucR++ctfnunT/cbR2PVVVVXZtGnTrK6uzqZOnWo33HCD9e3b17766iszO7dev//6r/+ySy+9NFCeYNYyXr/GPgtO5+/lrbfeajk5OYHnP/vsMwuFQjZz5swze9I+vrPwANgKY9y4cdazZ09raGg46Xp8E9yyZcv3dGbfXXz88cfWuXNne+655845AMzJybHBgwefdJ2W9Nq1ZgD88ssvraioyGJjY09Zs/n8889bmzZtzrqxXKejcKLqzp8/38zOndfPzOz666+3n//856fcz9n4+jX2WeABsPWEB8BWFrfffrtdddVVtm3btlOu++mnn1ooFLLZs2d/D2f23UdCQoLdc88951QKePv27Xb++efbyy+/fNL1WtJr11pTwF9++aUNGTLEoqKiAunRE8W6dessFAod17HZ3HE6AGhm1q1bN3v66afN7Nx4/czMFi1aZKFQyGpra0+5n7Pt9TvRZ4FPAbee8ADYSuLo0aN2++232w9+8IPj7DROFIsXL7ZQKGRr1qw5w2f33ceBAwfs0ksvtT/96U+uqHny5Mnu+bfffrtFNoGMHz/eunfvfspaopb02p2oCeTRRx91j+3fv7/RJpCVK1e6debMmdNimgiAv969e9v7779/Wvt54YUX7Pzzzz+um7a543QAsKGhwc477zybNm2ambX814+orKw8rnv7RHG2vH6n+iw4nb+XNIG89957bp1nnnnGOnfufFYpnD5OHh4AW0n87Gc/sy5duthrr70WsCX4/PPPzcxsy5Ytdv/999vKlSutvr7epk2bZtdcc42lp6c385mfXvz617+21157zerr623JkiWWnZ1t3bp1cx+u48aNsx49etirr75qK1eutOTkZEtOTm7ms/5mceTIEevRo4fdfffdgcdb4mt34MABq6mpsZqaGguFQvbYY49ZTU2Na9x56KGH7JJLLnF1ZCUlJY3awMTGxtry5ctt8eLFdu211541NiInu74vv/zSiouL7aqrrrLa2trA/0c6KN944w17/PHHrba21rZu3WovvPCCRURE2NixY5v5yo7Fya7vwIED9pvf/MaWLl1q9fX1Nn/+fIuLi7Nrr702AAct9fUj9u/fbx06dLCnnnrquO3P5tfvVJ8FZqf+e4kNTE5OjtXW1trs2bMtIiLC28C0sPAA2EriRMalEyZMMDOznTt3Wnp6unXt2tXatWtnP/7xj+3OO+88q73kNMrKyuyKK66wtm3b2pVXXmllZWWB+jeMTS+99FLr0KGDDR061Pbs2dOMZ/zNY86cORYKhWzjxo2Bx1via1ddXd3o+7GystLMvjaCvvzyy61du3aWlZV13HXv3bvXRo0aZZ06dbLOnTvbzTfffNYYCZ/s+urr60/4/xFfx1WrVllSUpJ16dLFLrroIrvhhhvswQcfPGvUlZNd3+eff245OTkWERFhF154ofXs2dNuvfXW44yEW+rrRzzzzDPWvn1727dv33Hbn82v36k+C8xO7+/l9u3bLT8/39q3b2/dunWzX//612dll7OPE4cHQB8+fPjw4cOHj1YWHgB9+PDhw4cPHz5aWXgA9OHDhw8fPnz4aGXhAdCHDx8+fPjw4aOVhQdAHz58+PDhw4ePVhYeAH348OHDhw8fPlpZeAD04cOHDx8+fPhoZeEB0IcPHz58+PDho5WFB0AfPnz48OHDh49WFh4Affjw4cOHDx8+Wll4APThw0eLjIyMDLvjjjuO+/lsiA8//NAiIiKsvr7+ez92WVmZPfroo9/7cX348NGywgOgDx8+zlhUVla6WaNt2rSxH/7wh3bnnXfawYMHm7xvhb69e/faJ5980uR9flfxy1/+0n7yk580y7HXrl1rl156aaMzan348OGD8ADow4ePMxaVlZWWl5dne/bssZ07d9rUqVOtc+fOdtdddzV532eD6nf48OHjHvvss8+sc+fOtnTp0mY4o2ORkJBgf/7zn5vt+D58+Dj7wwOgDx8+zlhUVlZaSUlJ4LFhw4ZZbGys+33WrFmWmppqXbp0sa5du1phYaFt2bIlsM2nn35qY8aMsY4dO1r37t3t0UcfPWkKuGfPnvb4448H9hEdHW3jx493v0+aNMn69OljF110kXXt2tWysrLs008/PeG11NfXWygUsokTJ1r//v2tbdu29tJLLx233qRJkywiIqLRbSdPnmxpaWl20UUXWUJCgu3YscMWLVpkSUlJ1r59e8vMzLSPP/64ydv97ne/s/79+5/wWnz48OHDA6APHz7OWIQD4Nq1a6179+6WlJTkHps8ebK99NJLtnnzZqupqbGioiKLjIy0I0eOuHV+9rOfWY8ePWz+/PlWV1dngwcPtosvvvhbA+Du3butTZs29thjj1l9fb3V1dXZX/7yFztw4MAJr+Xll1+2UChkCQkJNnfuXNu8eXOjadZf/OIXlpeX1+i2WVlZ9vrrr9vq1avt6quvtrS0NCsoKLAVK1bYsmXL7LLLLrPHHnusydvNmjXL2rZta4cOHTrh9fjw4aN1hwdAHz58nLGorKy0Cy64wDp27Gjt2rWzUChk559/vk2ePPmE23zwwQcWCoVs7dq1ZmZ24MABa9u2rb344otunb1791r79u2/NQCuWrXKQqGQbd++/bSv5T/+4z+sY8eOp2zsKCkpsVtuueW4bbt27Woffvihe6yiosJ++MMf2meffeYey8vLC6THv+12a9as+cbX58OHj9YVHgB9+PBxxqKystKys7Nt8+bNVltba5WVlfbP//zPgXU2bdpkI0eOtF69etnFF19sHTt2tFAoZK+88oqZmdXW1looFLIdO3YEtouJifnWAPjVV19ZVlaWXXzxxVZaWmrPPvusffTRRye9lqFDh9qoUaNOec05OTl22223Hbdt+HWnp6fb3XffHXjsxhtvtKeeeqrJ223atMlCoZCtX7/+lOfrw4eP1hkeAH348HHGIjwFfOTIEevTp48999xz7rHrr7/ecnJybP78+bZ+/Xpbt26dhUIhmzp1qpl9OwDs1atXICVqdgyStAbw6NGjtnjxYrvvvvssMjLSIiIibNu2bSe8ll69etkzzzxzymsePXr0caDYq1cve/bZZwOPdenSxV2jmdnBgwftggsusDfeeKPJ2y1btsxCoZB98MEHpzxfHz58tM7wAOjDh48zFo01gfzv//6vde/e3T7//HP78MMPLRQK2aJFi9zzr7/+egAADxw4YBdeeGEgBfzRRx9Zhw4dTgiAiYmJduedd7rf9+/fb+3btw8AoMZXX31lV155pf3xj39s9Pn9+/fbeeedZ2+++eYpr/mRRx6x6Ojo47ZdsWKFe2zbtm3HpWjffPNNO//8810d4rfdzszsueees6uuuuqU5+rDh4/WGx4AffjwccaiMQA8fPiwXXnllfbII4/YkSNH7LLLLrOKigrbvHmzLViwwPr27RsAQDOzcePGWc+ePW3BggW2du1aKy4utk6dOp0QAO+55x7r3r27LVq0yOrq6mzIkCHWqVMnB4DLli2zBx54wFasWGE7duywF1980dq2bWszZ85s9DoWLVpkbdq0OS3/wrq6OmvTpo1LKTe27ZQpU6xr166B7Z599lm79tprT3rM09nO7Nh9D69D9OHDhw8ND4A+fPg4Y9EYAJqZ/eEPf7CIiAj79NNPbd68eXbDDTdYu3btLCoqyl577bXjAPDAgQNWUVFhHTp0sMsvv9wefvjhk9rA7N+/38rKyqxz58529dVX23//938HagDXr19vubm5FhERYe3atbPrrrvOnnjiiRNexxNPPGG9e/c+7etOTEy0p59++oTbjh8/3rKysgKP3X777VZaWnrSY57OdgcPHrQuXbo0qw+hDx8+zv7wAOjDhw8f33HMmDHDbrjhhoCVzfcVTz75pA0aNOh7P64PHz5aVngA9OHDh48zEI8//rjt3Lnzez/uX//6V3v77be/9+P68OGjZYUHQB8+fPjw4cOHj1YWHgB9+PDhw4cPHz5aWXgA9OHDhw8fPnz4aGXhAdCHDx8+fPjw4aOVhQdAHz58+PDhw4ePVhYeAH348OHDhw8fPlpZeAD04cOHDx8+fPhoZeEB0IcPHz58+PDho5WFB0AfPnz48OHDh49WFv8fEc4FjPjf+nAAAAAASUVORK5CYII=\" width=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x7f09f0c90e10>"
]
},
"execution_count": 165,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from pyFAI.gui import jupyter\n",
"jupyter.plot2d(ai.integrate2d(corrected_d.get(), 1024, 512, unit=\"r_mm\",method=\"csr_nosplit_gpu\"))"
]
},
{
"cell_type": "code",
"execution_count": 166,
"metadata": {},
"outputs": [],
"source": [
"res = ai.sigma_clip(corrected_d.get(), 1024, 512, unit=\"r_mm\",method=\"csr_nosplit_gpu\")"
]
},
{
"cell_type": "code",
"execution_count": 168,
"metadata": {},
"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",
" fig.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\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 overridden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + 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",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\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=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"<ErrorbarContainer object of 3 artists>"
]
},
"execution_count": 168,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fig,ax = subplots()\n",
"ax.errorbar(*res)\n"
]
},
{
"cell_type": "code",
"execution_count": 187,
"metadata": {},
"outputs": [],
"source": [
"nsigma=10\n",
"minimum = ai.calcfrom1d(res[0], res[1]+nsigma*res[2], dim1_unit=\"r_mm\")"
]
},
{
"cell_type": "code",
"execution_count": 188,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/mntdirect/_scisoft/users/jupyter/jupy35/lib/python3.5/site-packages/ipykernel_launcher.py:1: RuntimeWarning: invalid value encountered in greater\n",
" \"\"\"Entry point for launching an IPython kernel.\n"
]
}
],
"source": [
"valid = (corrected_d.get() - minimum)>0"
]
},
{
"cell_type": "code",
"execution_count": 189,
"metadata": {},
"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",
" fig.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\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 overridden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + 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",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\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=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"<matplotlib.image.AxesImage at 0x7f09d90558d0>"
]
},
"execution_count": 189,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fig,ax = subplots()\n",
"ax.imshow(valid)"
]
},
{
"cell_type": "code",
"execution_count": 176,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[0.69301322, 0.91166489, 1.1302718 , ..., 0.69464527, 0.69906047,\n",
" 0.70506871],\n",
" [0.93140538, 1.15012651, 1.36880289, ..., 0.70640746, 0.71242387,\n",
" 0.71843481],\n",
" [1.1697648 , 1.3885554 , 1.53872429, ..., 0.71976808, 0.7257872 ,\n",
" 0.73180084],\n",
" ...,\n",
" [0.73205165, 0.73201174, 0.73197179, ..., 0.24820807, 0.33206267,\n",
" 0.41591878],\n",
" [0.73196356, 0.73192365, 0.73188372, ..., 0.33940589, 0.419186 ,\n",
" 0.41917236],\n",
" [0.73187548, 0.73183559, 0.73009665, ..., 0.4191848 , 0.41917116,\n",
" 0.41915752]])"
]
},
"execution_count": 176,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"minimum"
]
},
{
"cell_type": "code",
"execution_count": 177,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[0. , 0. , 0.51782227, ..., 0. , 0.01045561,\n",
" 4.2824707 ],\n",
" [0.06653976, 0. , 0. , ..., 0. , 0. ,\n",
" 9.000977 ],\n",
" [0. , 8.813965 , 0. , ..., 0. , 0. ,\n",
" 0.05374908],\n",
" ...,\n",
" [5.1589355 , 0. , 0. , ..., 7.778076 , 0. ,\n",
" 0. ],\n",
" [6.9033203 , 0.41503906, 0. , ..., 0.8022766 , 0. ,\n",
" 0. ],\n",
" [0. , 0. , 0.258255 , ..., 0. , 0.27609253,\n",
" 0.10682297]], dtype=float32)"
]
},
"execution_count": 177,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"corrected_d.get()"
]
},
{
"cell_type": "code",
"execution_count": 201,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0\n",
"100\n",
"200\n",
"300\n",
"400\n"
]
}
],
"source": [
"nb_bragg = []\n",
"nsigma = 6\n",
"for idx, frame in enumerate(raw):\n",
" frame_d.set(frame)\n",
" ocl_pedestal_cutoff(queue, (frame.size,), (1024,), \n",
" frame_d.data,\n",
" gains_d.data,\n",
" pedestal_d.data,\n",
" error_d.data,\n",
" corrected_d.data,\n",
" numpy.uint32(frame.size),\n",
" numpy.uint32(nsigma))\n",
" corrected = corrected_d.get()\n",
" res = ai.sigma_clip(corrected, 1024, 512, unit=\"r_mm\",method=\"csr_nosplit_gpu\")\n",
" minimum = ai.calcfrom1d(res[0], res[1]+nsigma*res[2], dim1_unit=\"r_mm\")\n",
" valid = numpy.nansum(corrected_d.get() - minimum)\n",
" nb_bragg.append(valid)\n",
" if idx%100==0: print(idx)"
]
},
{
"cell_type": "code",
"execution_count": 202,
"metadata": {},
"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",
" fig.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\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 overridden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + 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",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\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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0FNPPUVERD169KCbb77Z9vMjR45QLBaz1asJmVFZWUlnnnkmtWrVitq2bUslJSVEJNcmmxgzZgx17NgxWbqCAlCuU3QQAZhFiADMLkQAZjcPPvggGYZB1dXVye/J5NXy1NfX0/r162np0qVUWFhI5513Hq1atUquTZawbds2+uY3v0nLly9Pfk8EYDQRAZhFyBZwdiFbwNlLr1696Nvf/jZt2rTJ9n3Zvso+OnfuTD179pRrkyUUFRVRLBajVq1aJUcsFqPTTjuNWrVqRdOnT5frFBFEAGYZBQUF9MgjjyS/bmhooIsuukiaQFoApyaQV155Jfm92tpabRPI0qVLk8d8/vnn0gQSEvF4nHr16kUXXnhhiv0OkVXA/vHHHye/t2bNGm0BO3bWjxgxgs455xwJvW8CbrzxRurevbtcmyzh0KFDtGLFCtu4+uqr6b777qMVK1bIdYoQIgCzjLFjx1KbNm1o9OjRVFVVRT179qR27dqleDAJTUNdXR2Vl5dTeXk5xWIxGjx4MJWXl9PWrVuJKGED065dO/rss8+osrKS7rzzTq0NzFVXXUWLFi2iuXPn0mWXXSY2MCHx0EMPUdu2bWn27Nm0c+fO5Dh69GjymAcffJA6dOhAM2fOpKVLl1KnTp2oU6dOyZ+zhcXNN99MFRUVNGXKFGrfvr1YWIRAYWEhlZWV0ebNm6myspIKCwvptNNOo6lTpxKRXJtsBbeAieQ6RQURgFnIG2+8QR06dKDWrVtTQUEBLVy4sKVPKTLMmjWLYrFYyujevTsRWUbQ3/rWt6hNmzbUuXNnWrt2re0x9u/fT/feey+dddZZdM4559D9998vRtAhobs2sViMRo0alTyGTWzPPfdc+vrXv0533XUX7dy50/Y4W7ZsoVtvvZXOOOMMOu+88+iJJ54QE9sQeOCBB8gwDGrdujW1b9+eOnfunBR/RHJtshVVAMp1igYiAAVBEARBECKGCEBBEARBEISIIQJQEARBEAQhYogAFARBEARBiBgiAAVBEARBECKGCEBBEARBEISIIQJQEARBEAQhYogAFARBEARBiBgiAAVBEARBECKGCEBBEARBEISIIQJQEARBEAQhYogAFARBEARBiBgiAAVBEARBECKGCEBBEARBEISIIQJQEARBEAQhYogAFARBEARBiBgiAAVBEARBECKGCEBBEARBEISIIQJQEARBEAQhYogAFARBEARBiBgiAAVBEARBECKGCEBBEARBEISIIQJQEARBEAQhYogAFARBEARBiBgiAAVBEARBECKGCEBBEARBEISIIQJQEARBEAQhYogAFARBEARBiBgiAAVBEARBECKGCEBBEARBEISIIQJQEARBEAQhYogAFARBEARBiBj/H5QcG12ffJKVAAAAAElFTkSuQmCC\" width=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x7f09d8ff6b70>]"
]
},
"execution_count": 202,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"fig, ax = subplots()\n",
"ax.plot(nb_bragg)"
]
},
{
"cell_type": "code",
"execution_count": 192,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[False, False, False, ..., False, False, False],\n",
" [False, False, False, ..., False, False, False],\n",
" [False, False, False, ..., False, False, True],\n",
" ...,\n",
" [False, False, False, ..., False, False, False],\n",
" [False, True, False, ..., False, False, False],\n",
" [False, False, False, ..., False, False, False]])"
]
},
"execution_count": 192,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"valid"
]
},
{
"cell_type": "code",
"execution_count": 200,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"43469424.73380569"
]
},
"execution_count": 200,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"numpy.nansum(corrected_d.get() - minimum)"
]
},
{
"cell_type": "code",
"execution_count": 196,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"nan"
]
},
"execution_count": 196,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"corrected_d.get().sum()"
]
},
{
"cell_type": "code",
"execution_count": 198,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"65419930.5728332"
]
},
"execution_count": 198,
"metadata": {},
"output_type": "execute_result"
}
],
"source": []
},
{
"cell_type": "code",
"execution_count": 203,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'0.18.0'"
]
},
"execution_count": 203,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pyFAI.version"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}