Skip to content

Instantly share code, notes, and snippets.

@megies
Created July 27, 2017 09:04
Show Gist options
  • Save megies/b64e97cf281cde604a08acad1f62074a to your computer and use it in GitHub Desktop.
Save megies/b64e97cf281cde604a08acad1f62074a to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"%matplotlib nbagg\n",
"from obspy import UTCDateTime\n",
"from obspy.clients.nrl import NRL\n",
"from obspy.io.xseed import Parser"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"nrl = NRL()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"(u'Trillium Compact, 120 s, 754 V/m/s',\n",
" u'http://ds.iris.edu/NRL/sensors/nanometrics/RESP.XX.NS124..BHZ.TrilliumCompact.120.754')"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"nrl.sensors['Nanometrics']['Trillium Compact']['120 s']"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"(u'RT130, gain 1, 200 sps',\n",
" u'http://ds.iris.edu/NRL/dataloggers/reftek/RESP.XX.NR010..HHZ.130.1.200')"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# nrl.dataloggers['REF TEK']['RT 130']['1']['200']\n",
"nrl.dataloggers['REF TEK']['RT 130 & 130-SMA']['1']['200']"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# parser_sensor = Parser(nrl.get_sensor_resp(['Nanometrics', 'Trillium Compact', '120 s']))\n",
"# parser_datalogger = Parser(nrl.get_datalogger_resp(['REF TEK', 'RT 130', '1', '200']))\n",
"# parser_datalogger = Parser(nrl.get_datalogger_resp(['REF TEK', 'RT 130 & 130-SMA', '1', '200']))\n",
"# parser = Parser.combine_sensor_dl_resps(sensor=parser_sensor, datalogger=parser_datalogger)\n",
"response = nrl.get_response(\n",
" datalogger_keys=['REF TEK', 'RT 130 & 130-SMA', '1', '200'],\n",
" sensor_keys=['Nanometrics', 'Trillium Compact', '120 s'])"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# inv = parser.get_inventory()\n",
"# inv"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\n",
"\n",
"\n",
"mpl.get_websocket_type = function() {\n",
" if (typeof(WebSocket) !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert('Your browser does not have WebSocket support.' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.');\n",
" };\n",
"}\n",
"\n",
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = (this.ws.binaryType != undefined);\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById(\"mpl-warnings\");\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent = (\n",
" \"This browser does not support binary websocket messages. \" +\n",
" \"Performance may be slow.\");\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" if (mpl.ratio != 1) {\n",
" fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
" }\n",
" fig.send_message(\"refresh\", {});\n",
" }\n",
"\n",
" this.imageObj.onload = function() {\n",
" if (fig.image_mode == 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function() {\n",
" this.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var backingStore = this.context.backingStorePixelRatio ||\n",
"\tthis.context.webkitBackingStorePixelRatio ||\n",
"\tthis.context.mozBackingStorePixelRatio ||\n",
"\tthis.context.msBackingStorePixelRatio ||\n",
"\tthis.context.oBackingStorePixelRatio ||\n",
"\tthis.context.backingStorePixelRatio || 1;\n",
"\n",
" mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width * mpl.ratio);\n",
" canvas.attr('height', height * mpl.ratio);\n",
" canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
" return false;\n",
" });\n",
"\n",
" function set_focus () {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'] / mpl.ratio;\n",
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
" var x1 = msg['x1'] / mpl.ratio;\n",
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x * mpl.ratio;\n",
" var y = canvas_pos.y * mpl.ratio;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" var width = fig.canvas.width/mpl.ratio\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var width = this.canvas.width/mpl.ratio\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" // select the cell after this one\n",
" var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
" IPython.notebook.select(index + 1);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4nOzdeXhTBdo28LuUUkdHZRyRb0SNGyCIjssI4oLLvO6776ijjuKGzojOq6NOWGQRWWQRVEBAUBahCIikNOxlX8tSlrKXvWUphO7pkiZ5vj+Shra0pcmTNCft/buu55r2ZDvekyY3JznnAEREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREZDhRAO4E0AVAvzBODwBPAYgN7X8uERERUf3WrGHDhnsAyO9+9ztns2bNHFdccUWtT7NmzRyNGzcuASANGjTIAdAhzLkQERER1UnR0dHRqX/6059KlixZIk6nU8Jt+/bt0qFDB1dUVFQBgGvDHRARERFRXdMBgKxcuTLcva+cvLw8iY2NdQLoFu6AiIiIiOqaXhdddFGJy+UKd+c7y5NPPumOiopaHO6AiIiIiOqaodddd50j3GWvMu+8847ExMRsDndARERERHXN0ObNmxdXVcJGjBghJpNJYmNjpW3btpKUlFRtaZs+fbq0bNlSYmNjpU2bNjJnzpxyl3fs2FEAlJtHHnmk0vt69913JSYmZkt44yEiIiKqe6osgL/88os0atRIfvrpJ9mxY4d06tRJGjduLBkZGZUWtjVr1kh0dLQMGjRIdu7cKT169JCYmBhJSUkpVwAfffRROX78uG8yMzNZAImIiIhqUZUFsG3bttK5c2ff7y6XSy6//HIZMGBApYXtxRdflCeeeKLcsnbt2sl7771XrgA+88wzld6eBZCIiIiodlRaAIuLiyU6OlpmzZpVbvnrr78uTz/9dKWF7corr5Rhw4aVW9azZ0+5+eabyxXAiy++WJo0aSItWrSQf/7zn2Kz2VgAiYiIiGpRpQXw6NGjAkDWrFlTbvlnn30mbdu2rbSwxcTESFxcXLllI0eOlMsuu8z3+9SpUyU+Pl62bdsms2bNklatWskdd9xR6fEHWQCJiIiIQsOvAvjpp59Ku3btalwAR4wYIU2bNq30+iIi+/fvFwCSmJjIAkhERERUS2r1I+DKXHrppTJ69GgW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\" width=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Channel Response\n",
"\tFrom M/S (Velocity in Meters per Second) to COUNTS (Digital Counts)\n",
"\tOverall Sensitivity: 629129 defined at 0.050 Hz\n",
"\t10 stages:\n",
"\t\tStage 1: PolesZerosResponseStage from M/S to V, gain: 754.3\n",
"\t\tStage 2: ResponseStage from V to V, gain: 1\n",
"\t\tStage 3: CoefficientsTypeResponseStage from V to COUNTS, gain: 629129\n",
"\t\tStage 4: CoefficientsTypeResponseStage from COUNTS to COUNTS, gain: 1\n",
"\t\tStage 5: CoefficientsTypeResponseStage from COUNTS to COUNTS, gain: 1\n",
"\t\tStage 6: CoefficientsTypeResponseStage from COUNTS to COUNTS, gain: 1\n",
"\t\tStage 7: CoefficientsTypeResponseStage from COUNTS to COUNTS, gain: 1\n",
"\t\tStage 8: CoefficientsTypeResponseStage from COUNTS to COUNTS, gain: 1\n",
"\t\tStage 9: CoefficientsTypeResponseStage from COUNTS to COUNTS, gain: 1\n",
"\t\tStage 10: CoefficientsTypeResponseStage from COUNTS to COUNTS, gain: 1\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/megies/anaconda/envs/master/lib/python2.7/site-packages/matplotlib/axes/_axes.py:545: UserWarning: No labelled objects found. Use label='...' kwarg on individual plots.\n",
" warnings.warn(\"No labelled objects found. \"\n"
]
}
],
"source": [
"# response = parser.get_response()\n",
"response.plot(0.001)\n",
"print(response)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\n",
"\n",
"\n",
"mpl.get_websocket_type = function() {\n",
" if (typeof(WebSocket) !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert('Your browser does not have WebSocket support.' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.');\n",
" };\n",
"}\n",
"\n",
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = (this.ws.binaryType != undefined);\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById(\"mpl-warnings\");\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent = (\n",
" \"This browser does not support binary websocket messages. \" +\n",
" \"Performance may be slow.\");\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" if (mpl.ratio != 1) {\n",
" fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
" }\n",
" fig.send_message(\"refresh\", {});\n",
" }\n",
"\n",
" this.imageObj.onload = function() {\n",
" if (fig.image_mode == 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function() {\n",
" this.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var backingStore = this.context.backingStorePixelRatio ||\n",
"\tthis.context.webkitBackingStorePixelRatio ||\n",
"\tthis.context.mozBackingStorePixelRatio ||\n",
"\tthis.context.msBackingStorePixelRatio ||\n",
"\tthis.context.oBackingStorePixelRatio ||\n",
"\tthis.context.backingStorePixelRatio || 1;\n",
"\n",
" mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width * mpl.ratio);\n",
" canvas.attr('height', height * mpl.ratio);\n",
" canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
" return false;\n",
" });\n",
"\n",
" function set_focus () {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'] / mpl.ratio;\n",
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
" var x1 = msg['x1'] / mpl.ratio;\n",
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x * mpl.ratio;\n",
" var y = canvas_pos.y * mpl.ratio;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" var width = fig.canvas.width/mpl.ratio\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var width = this.canvas.width/mpl.ratio\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" // select the cell after this one\n",
" var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
" IPython.notebook.select(index + 1);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAgAElEQVR4nOzdeXhUhd098BNAaLVa66/VVquDC1otUq2K1VqptdXWWm192/q2tVrr1qq19q06ICqIgAsCFtxBUKpBVCSQYQ2ygyRCWMK+7+uErJNlMjPn98ckIQnZv3cydzLn8zzfp8kkc+fmdJh7vDP3XkBERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERiKgXAJQAeAzAQwKAmZgCA+wB8Mx4rKyIiIiI2X+vUqVMWAHbp0iV0+umnB7/97W83OqeeemowJSUlAiAMYDCiBVJEREREEkGnTp0WffWrXw2lp6czGAyyufx+P/v3708ABPCPeP8dIiIiItI8FwDgxx9/3OziV9dvf/vbyHHHHbcu3n+IiIiIiDTPAykpKZGSkpJWF8DU1NSqvYD/L95/jIiIiIg07YmvfOUroVa3P5KzZ8+uKoDnxvuPEREREZGmPXHiiSdW1Ffs5s+fz5tvvpnf+ta3CICTJk2qtwDOmTNHBVBEREQkgTRYAKdNm8a+ffty4sSJKoAiIiIi7UiDBbAmqACKiIiItBsqgCIiIiJJRgVQREREJMmoAIqIiIgkGRVAERERkSSjAigiIiKSZBosgEVFRVyxYgVXrFhBABw2bBhXrFjBnTt3qgCKiIiIJLAGC+DcuXOril2tueuuu1QARURERBJYs94CbowKoIiIiEhiUQEUERERSTIqgCIiIiJJ5t/HH398yFIAZ86cWVUAu8b5bxERERGRZvgjAO7du7fVBXDEiBEEEAJwQpz/FhERERFphq8BqHj66adbVf5KS0vZo0ePcMeOHWfE+w8RERERkeYbDIB/+ctf6PP5uHz58urz/zU0WVlZHDNmDC+77LJwSkpKGYBr4v1HiIiIiEjzpQB4/LjjjtuFes7718hEOnXqtBhAr3istIiIiIjYpQA4B8BlAC5vYi4B8I34rKaIiIiIiIiIiIg0ywNI6XDEsUHKHuhcgCIiIiKuNjblSydGTr72TlrnxMtvrfpc4E3x/qNEREREpGF3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\" width=\"640\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Channel Response\n",
"\tFrom M/S () to COUNTS ()\n",
"\tOverall Sensitivity: 4.6555e+08 defined at 1.000 Hz\n",
"\t2 stages:\n",
"\t\tStage 1: PolesZerosResponseStage from M/S to V, gain: 740\n",
"\t\tStage 2: CoefficientsTypeResponseStage from V to COUNTS, gain: 629121\n"
]
}
],
"source": [
"from obspy.clients.fdsn import Client as FDSNClient\n",
"\n",
"client = FDSNClient('LMU')\n",
"inv2 = client.get_stations(station='BE1', channel='HHZ', level='response')\n",
"response2 = inv2[0][0][0].response\n",
"response2.plot(0.001)\n",
"print(response2)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.13"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment