Skip to content

Instantly share code, notes, and snippets.

@jasmainak
Last active August 3, 2022 19:09
Show Gist options
  • Save jasmainak/865c56aae4e172d40b3336ae7e091cc1 to your computer and use it in GitHub Desktop.
Save jasmainak/865c56aae4e172d40b3336ae7e091cc1 to your computer and use it in GitHub Desktop.
MNE + HNN
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "caed59b3",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Using notebook 3d backend.\n",
"\n"
]
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "83147ce85b1245bbb8888cdbf5763116",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(Dropdown(layout=Layout(margin='2px 0px 2px 0px', min_width='0px'), options=('Help', 'Show MNE k…"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "31f021eaf3c247e2b198e024ecdf2d07",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(Text(value='', layout=Layout(margin='2px 0px 2px 0px', min_width='0px'), placeholder='Type a fi…"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "7f5bc1132ef6492f928b8bccaea8394a",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(VBox(children=(VBox(children=(HTML(value='<strong>Playback</strong>'), VBox(children=(HTML(valu…"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "0dbf9e04a3364203bb9eeedf424c7a4a",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"HBox(children=(Text(value='Press ? for help', disabled=True, layout=Layout(margin='2px 0px 2px 0px', min_width…"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"/* global mpl */\n",
"window.mpl = {};\n",
"\n",
"mpl.get_websocket_type = function () {\n",
" if (typeof WebSocket !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof MozWebSocket !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert(\n",
" 'Your browser does not have WebSocket support. ' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.'\n",
" );\n",
" }\n",
"};\n",
"\n",
"mpl.figure = function (figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = this.ws.binaryType !== undefined;\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById('mpl-warnings');\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent =\n",
" 'This browser does not support binary websocket messages. ' +\n",
" 'Performance may be slow.';\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = document.createElement('div');\n",
" this.root.setAttribute('style', 'display: inline-block');\n",
" this._root_extra_style(this.root);\n",
"\n",
" parent_element.appendChild(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message('supports_binary', { value: fig.supports_binary });\n",
" fig.send_message('send_image_mode', {});\n",
" if (fig.ratio !== 1) {\n",
" fig.send_message('set_dpi_ratio', { dpi_ratio: fig.ratio });\n",
" }\n",
" fig.send_message('refresh', {});\n",
" };\n",
"\n",
" this.imageObj.onload = function () {\n",
" if (fig.image_mode === 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function () {\n",
" fig.ws.close();\n",
" };\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"};\n",
"\n",
"mpl.figure.prototype._init_header = function () {\n",
" var titlebar = document.createElement('div');\n",
" titlebar.classList =\n",
" 'ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix';\n",
" var titletext = document.createElement('div');\n",
" titletext.classList = 'ui-dialog-title';\n",
" titletext.setAttribute(\n",
" 'style',\n",
" 'width: 100%; text-align: center; padding: 3px;'\n",
" );\n",
" titlebar.appendChild(titletext);\n",
" this.root.appendChild(titlebar);\n",
" this.header = titletext;\n",
"};\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function (_canvas_div) {};\n",
"\n",
"mpl.figure.prototype._root_extra_style = function (_canvas_div) {};\n",
"\n",
"mpl.figure.prototype._init_canvas = function () {\n",
" var fig = this;\n",
"\n",
" var canvas_div = (this.canvas_div = document.createElement('div'));\n",
" canvas_div.setAttribute(\n",
" 'style',\n",
" 'border: 1px solid #ddd;' +\n",
" 'box-sizing: content-box;' +\n",
" 'clear: both;' +\n",
" 'min-height: 1px;' +\n",
" 'min-width: 1px;' +\n",
" 'outline: 0;' +\n",
" 'overflow: hidden;' +\n",
" 'position: relative;' +\n",
" 'resize: both;'\n",
" );\n",
"\n",
" function on_keyboard_event_closure(name) {\n",
" return function (event) {\n",
" return fig.key_event(event, name);\n",
" };\n",
" }\n",
"\n",
" canvas_div.addEventListener(\n",
" 'keydown',\n",
" on_keyboard_event_closure('key_press')\n",
" );\n",
" canvas_div.addEventListener(\n",
" 'keyup',\n",
" on_keyboard_event_closure('key_release')\n",
" );\n",
"\n",
" this._canvas_extra_style(canvas_div);\n",
" this.root.appendChild(canvas_div);\n",
"\n",
" var canvas = (this.canvas = document.createElement('canvas'));\n",
" canvas.classList.add('mpl-canvas');\n",
" canvas.setAttribute('style', 'box-sizing: content-box;');\n",
"\n",
" this.context = canvas.getContext('2d');\n",
"\n",
" var backingStore =\n",
" this.context.backingStorePixelRatio ||\n",
" this.context.webkitBackingStorePixelRatio ||\n",
" this.context.mozBackingStorePixelRatio ||\n",
" this.context.msBackingStorePixelRatio ||\n",
" this.context.oBackingStorePixelRatio ||\n",
" this.context.backingStorePixelRatio ||\n",
" 1;\n",
"\n",
" this.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
" if (this.ratio !== 1) {\n",
" fig.send_message('set_dpi_ratio', { dpi_ratio: this.ratio });\n",
" }\n",
"\n",
" var rubberband_canvas = (this.rubberband_canvas = document.createElement(\n",
" 'canvas'\n",
" ));\n",
" rubberband_canvas.setAttribute(\n",
" 'style',\n",
" 'box-sizing: content-box; position: absolute; left: 0; top: 0; z-index: 1;'\n",
" );\n",
"\n",
" var resizeObserver = new ResizeObserver(function (entries) {\n",
" var nentries = entries.length;\n",
" for (var i = 0; i < nentries; i++) {\n",
" var entry = entries[i];\n",
" var width, height;\n",
" if (entry.contentBoxSize) {\n",
" if (entry.contentBoxSize instanceof Array) {\n",
" // Chrome 84 implements new version of spec.\n",
" width = entry.contentBoxSize[0].inlineSize;\n",
" height = entry.contentBoxSize[0].blockSize;\n",
" } else {\n",
" // Firefox implements old version of spec.\n",
" width = entry.contentBoxSize.inlineSize;\n",
" height = entry.contentBoxSize.blockSize;\n",
" }\n",
" } else {\n",
" // Chrome <84 implements even older version of spec.\n",
" width = entry.contentRect.width;\n",
" height = entry.contentRect.height;\n",
" }\n",
"\n",
" // Keep the size of the canvas and rubber band canvas in sync with\n",
" // the canvas container.\n",
" if (entry.devicePixelContentBoxSize) {\n",
" // Chrome 84 implements new version of spec.\n",
" canvas.setAttribute(\n",
" 'width',\n",
" entry.devicePixelContentBoxSize[0].inlineSize\n",
" );\n",
" canvas.setAttribute(\n",
" 'height',\n",
" entry.devicePixelContentBoxSize[0].blockSize\n",
" );\n",
" } else {\n",
" canvas.setAttribute('width', width * fig.ratio);\n",
" canvas.setAttribute('height', height * fig.ratio);\n",
" }\n",
" canvas.setAttribute(\n",
" 'style',\n",
" 'width: ' + width + 'px; height: ' + height + 'px;'\n",
" );\n",
"\n",
" rubberband_canvas.setAttribute('width', width);\n",
" rubberband_canvas.setAttribute('height', height);\n",
"\n",
" // And update the size in Python. We ignore the initial 0/0 size\n",
" // that occurs as the element is placed into the DOM, which should\n",
" // otherwise not happen due to the minimum size styling.\n",
" if (width != 0 && height != 0) {\n",
" fig.request_resize(width, height);\n",
" }\n",
" }\n",
" });\n",
" resizeObserver.observe(canvas_div);\n",
"\n",
" function on_mouse_event_closure(name) {\n",
" return function (event) {\n",
" return fig.mouse_event(event, name);\n",
" };\n",
" }\n",
"\n",
" rubberband_canvas.addEventListener(\n",
" 'mousedown',\n",
" on_mouse_event_closure('button_press')\n",
" );\n",
" rubberband_canvas.addEventListener(\n",
" 'mouseup',\n",
" on_mouse_event_closure('button_release')\n",
" );\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband_canvas.addEventListener(\n",
" 'mousemove',\n",
" on_mouse_event_closure('motion_notify')\n",
" );\n",
"\n",
" rubberband_canvas.addEventListener(\n",
" 'mouseenter',\n",
" on_mouse_event_closure('figure_enter')\n",
" );\n",
" rubberband_canvas.addEventListener(\n",
" 'mouseleave',\n",
" on_mouse_event_closure('figure_leave')\n",
" );\n",
"\n",
" canvas_div.addEventListener('wheel', function (event) {\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" on_mouse_event_closure('scroll')(event);\n",
" });\n",
"\n",
" canvas_div.appendChild(canvas);\n",
" canvas_div.appendChild(rubberband_canvas);\n",
"\n",
" this.rubberband_context = rubberband_canvas.getContext('2d');\n",
" this.rubberband_context.strokeStyle = '#000000';\n",
"\n",
" this._resize_canvas = function (width, height, forward) {\n",
" if (forward) {\n",
" canvas_div.style.width = width + 'px';\n",
" canvas_div.style.height = height + 'px';\n",
" }\n",
" };\n",
"\n",
" // Disable right mouse context menu.\n",
" this.rubberband_canvas.addEventListener('contextmenu', function (_e) {\n",
" event.preventDefault();\n",
" return false;\n",
" });\n",
"\n",
" function set_focus() {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"};\n",
"\n",
"mpl.figure.prototype._init_toolbar = function () {\n",
" var fig = this;\n",
"\n",
" var toolbar = document.createElement('div');\n",
" toolbar.classList = 'mpl-toolbar';\n",
" this.root.appendChild(toolbar);\n",
"\n",
" function on_click_closure(name) {\n",
" return function (_event) {\n",
" return fig.toolbar_button_onclick(name);\n",
" };\n",
" }\n",
"\n",
" function on_mouseover_closure(tooltip) {\n",
" return function (event) {\n",
" if (!event.currentTarget.disabled) {\n",
" return fig.toolbar_button_onmouseover(tooltip);\n",
" }\n",
" };\n",
" }\n",
"\n",
" fig.buttons = {};\n",
" var buttonGroup = document.createElement('div');\n",
" buttonGroup.classList = 'mpl-button-group';\n",
" for (var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" /* Instead of a spacer, we start a new button group. */\n",
" if (buttonGroup.hasChildNodes()) {\n",
" toolbar.appendChild(buttonGroup);\n",
" }\n",
" buttonGroup = document.createElement('div');\n",
" buttonGroup.classList = 'mpl-button-group';\n",
" continue;\n",
" }\n",
"\n",
" var button = (fig.buttons[name] = document.createElement('button'));\n",
" button.classList = 'mpl-widget';\n",
" button.setAttribute('role', 'button');\n",
" button.setAttribute('aria-disabled', 'false');\n",
" button.addEventListener('click', on_click_closure(method_name));\n",
" button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
"\n",
" var icon_img = document.createElement('img');\n",
" icon_img.src = '_images/' + image + '.png';\n",
" icon_img.srcset = '_images/' + image + '_large.png 2x';\n",
" icon_img.alt = tooltip;\n",
" button.appendChild(icon_img);\n",
"\n",
" buttonGroup.appendChild(button);\n",
" }\n",
"\n",
" if (buttonGroup.hasChildNodes()) {\n",
" toolbar.appendChild(buttonGroup);\n",
" }\n",
"\n",
" var fmt_picker = document.createElement('select');\n",
" fmt_picker.classList = 'mpl-widget';\n",
" toolbar.appendChild(fmt_picker);\n",
" this.format_dropdown = fmt_picker;\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = document.createElement('option');\n",
" option.selected = fmt === mpl.default_extension;\n",
" option.innerHTML = fmt;\n",
" fmt_picker.appendChild(option);\n",
" }\n",
"\n",
" var status_bar = document.createElement('span');\n",
" status_bar.classList = 'mpl-message';\n",
" toolbar.appendChild(status_bar);\n",
" this.message = status_bar;\n",
"};\n",
"\n",
"mpl.figure.prototype.request_resize = function (x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', { width: x_pixels, height: y_pixels });\n",
"};\n",
"\n",
"mpl.figure.prototype.send_message = function (type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"};\n",
"\n",
"mpl.figure.prototype.send_draw_message = function () {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({ type: 'draw', figure_id: this.id }));\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_resize = function (fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] !== fig.canvas.width || size[1] !== fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1], msg['forward']);\n",
" fig.send_message('refresh', {});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function (fig, msg) {\n",
" var x0 = msg['x0'] / fig.ratio;\n",
" var y0 = (fig.canvas.height - msg['y0']) / fig.ratio;\n",
" var x1 = msg['x1'] / fig.ratio;\n",
" var y1 = (fig.canvas.height - msg['y1']) / fig.ratio;\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0,\n",
" 0,\n",
" fig.canvas.width / fig.ratio,\n",
" fig.canvas.height / fig.ratio\n",
" );\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function (fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_cursor = function (fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch (cursor) {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_message = function (fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_draw = function (fig, _msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function (fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_history_buttons = function (fig, msg) {\n",
" for (var key in msg) {\n",
" if (!(key in fig.buttons)) {\n",
" continue;\n",
" }\n",
" fig.buttons[key].disabled = !msg[key];\n",
" fig.buttons[key].setAttribute('aria-disabled', !msg[key]);\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_navigate_mode = function (fig, msg) {\n",
" if (msg['mode'] === 'PAN') {\n",
" fig.buttons['Pan'].classList.add('active');\n",
" fig.buttons['Zoom'].classList.remove('active');\n",
" } else if (msg['mode'] === 'ZOOM') {\n",
" fig.buttons['Pan'].classList.remove('active');\n",
" fig.buttons['Zoom'].classList.add('active');\n",
" } else {\n",
" fig.buttons['Pan'].classList.remove('active');\n",
" fig.buttons['Zoom'].classList.remove('active');\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function () {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message('ack', {});\n",
"};\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function (fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = 'image/png';\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src\n",
" );\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data\n",
" );\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" } else if (\n",
" typeof evt.data === 'string' &&\n",
" evt.data.slice(0, 21) === 'data:image/png;base64'\n",
" ) {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig['handle_' + msg_type];\n",
" } catch (e) {\n",
" console.log(\n",
" \"No handler for the '\" + msg_type + \"' message type: \",\n",
" msg\n",
" );\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\n",
" \"Exception inside the 'handler_\" + msg_type + \"' callback:\",\n",
" e,\n",
" e.stack,\n",
" msg\n",
" );\n",
" }\n",
" }\n",
" };\n",
"};\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function (e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e) {\n",
" e = window.event;\n",
" }\n",
" if (e.target) {\n",
" targ = e.target;\n",
" } else if (e.srcElement) {\n",
" targ = e.srcElement;\n",
" }\n",
" if (targ.nodeType === 3) {\n",
" // defeat Safari bug\n",
" targ = targ.parentNode;\n",
" }\n",
"\n",
" // pageX,Y are the mouse positions relative to the document\n",
" var boundingRect = targ.getBoundingClientRect();\n",
" var x = e.pageX - (boundingRect.left + document.body.scrollLeft);\n",
" var y = e.pageY - (boundingRect.top + document.body.scrollTop);\n",
"\n",
" return { x: x, y: y };\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys(original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object') {\n",
" obj[key] = original[key];\n",
" }\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function (event, name) {\n",
" var canvas_pos = mpl.findpos(event);\n",
"\n",
" if (name === 'button_press') {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x * this.ratio;\n",
" var y = canvas_pos.y * this.ratio;\n",
"\n",
" this.send_message(name, {\n",
" x: x,\n",
" y: y,\n",
" button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event),\n",
" });\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"};\n",
"\n",
"mpl.figure.prototype._key_event_extra = function (_event, _name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"};\n",
"\n",
"mpl.figure.prototype.key_event = function (event, name) {\n",
" // Prevent repeat events\n",
" if (name === 'key_press') {\n",
" if (event.which === this._key) {\n",
" return;\n",
" } else {\n",
" this._key = event.which;\n",
" }\n",
" }\n",
" if (name === 'key_release') {\n",
" this._key = null;\n",
" }\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which !== 17) {\n",
" value += 'ctrl+';\n",
" }\n",
" if (event.altKey && event.which !== 18) {\n",
" value += 'alt+';\n",
" }\n",
" if (event.shiftKey && event.which !== 16) {\n",
" value += 'shift+';\n",
" }\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, { key: value, guiEvent: simpleKeys(event) });\n",
" return false;\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function (name) {\n",
" if (name === 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message('toolbar_button', { name: name });\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function (tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Left button pans, Right button zooms\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\\nx/y fixes axis, CTRL fixes aspect\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
"\n",
"mpl.default_extension = \"png\";/* global mpl */\n",
"\n",
"var comm_websocket_adapter = function (comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function () {\n",
" comm.close();\n",
" };\n",
" ws.send = function (m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function (msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data']);\n",
" });\n",
" return ws;\n",
"};\n",
"\n",
"mpl.mpl_figure_comm = function (comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = document.getElementById(id);\n",
" var ws_proxy = comm_websocket_adapter(comm);\n",
"\n",
" function ondownload(figure, _format) {\n",
" window.open(figure.canvas.toDataURL());\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy, ondownload, element);\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element;\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error('Failed to find cell for figure', id, fig);\n",
" return;\n",
" }\n",
" fig.cell_info[0].output_area.element.one(\n",
" 'cleared',\n",
" { fig: fig },\n",
" fig._remove_fig_handler\n",
" );\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function (fig, msg) {\n",
" var width = fig.canvas.width / fig.ratio;\n",
" fig.cell_info[0].output_area.element.off(\n",
" 'cleared',\n",
" fig._remove_fig_handler\n",
" );\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable();\n",
" fig.parent_element.innerHTML =\n",
" '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
" fig.close_ws(fig, msg);\n",
"};\n",
"\n",
"mpl.figure.prototype.close_ws = function (fig, msg) {\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"};\n",
"\n",
"mpl.figure.prototype.push_to_output = function (_remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var width = this.canvas.width / this.ratio;\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] =\n",
" '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
"};\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function () {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message('ack', {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () {\n",
" fig.push_to_output();\n",
" }, 1000);\n",
"};\n",
"\n",
"mpl.figure.prototype._init_toolbar = function () {\n",
" var fig = this;\n",
"\n",
" var toolbar = document.createElement('div');\n",
" toolbar.classList = 'btn-toolbar';\n",
" this.root.appendChild(toolbar);\n",
"\n",
" function on_click_closure(name) {\n",
" return function (_event) {\n",
" return fig.toolbar_button_onclick(name);\n",
" };\n",
" }\n",
"\n",
" function on_mouseover_closure(tooltip) {\n",
" return function (event) {\n",
" if (!event.currentTarget.disabled) {\n",
" return fig.toolbar_button_onmouseover(tooltip);\n",
" }\n",
" };\n",
" }\n",
"\n",
" fig.buttons = {};\n",
" var buttonGroup = document.createElement('div');\n",
" buttonGroup.classList = 'btn-group';\n",
" var button;\n",
" for (var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" /* Instead of a spacer, we start a new button group. */\n",
" if (buttonGroup.hasChildNodes()) {\n",
" toolbar.appendChild(buttonGroup);\n",
" }\n",
" buttonGroup = document.createElement('div');\n",
" buttonGroup.classList = 'btn-group';\n",
" continue;\n",
" }\n",
"\n",
" button = fig.buttons[name] = document.createElement('button');\n",
" button.classList = 'btn btn-default';\n",
" button.href = '#';\n",
" button.title = name;\n",
" button.innerHTML = '<i class=\"fa ' + image + ' fa-lg\"></i>';\n",
" button.addEventListener('click', on_click_closure(method_name));\n",
" button.addEventListener('mouseover', on_mouseover_closure(tooltip));\n",
" buttonGroup.appendChild(button);\n",
" }\n",
"\n",
" if (buttonGroup.hasChildNodes()) {\n",
" toolbar.appendChild(buttonGroup);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = document.createElement('span');\n",
" status_bar.classList = 'mpl-message pull-right';\n",
" toolbar.appendChild(status_bar);\n",
" this.message = status_bar;\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = document.createElement('div');\n",
" buttongrp.classList = 'btn-group inline pull-right';\n",
" button = document.createElement('button');\n",
" button.classList = 'btn btn-mini btn-primary';\n",
" button.href = '#';\n",
" button.title = 'Stop Interaction';\n",
" button.innerHTML = '<i class=\"fa fa-power-off icon-remove icon-large\"></i>';\n",
" button.addEventListener('click', function (_evt) {\n",
" fig.handle_close(fig, {});\n",
" });\n",
" button.addEventListener(\n",
" 'mouseover',\n",
" on_mouseover_closure('Stop Interaction')\n",
" );\n",
" buttongrp.appendChild(button);\n",
" var titlebar = this.root.querySelector('.ui-dialog-titlebar');\n",
" titlebar.insertBefore(buttongrp, titlebar.firstChild);\n",
"};\n",
"\n",
"mpl.figure.prototype._remove_fig_handler = function (event) {\n",
" var fig = event.data.fig;\n",
" fig.close_ws(fig, {});\n",
"};\n",
"\n",
"mpl.figure.prototype._root_extra_style = function (el) {\n",
" el.style.boxSizing = 'content-box'; // override notebook setting of border-box.\n",
"};\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function (el) {\n",
" // this is important to make the div 'focusable\n",
" el.setAttribute('tabindex', 0);\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" } else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype._key_event_extra = function (event, _name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager) {\n",
" manager = IPython.keyboard_manager;\n",
" }\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which === 13) {\n",
" this.canvas_div.blur();\n",
" // select the cell after this one\n",
" var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
" IPython.notebook.select(index + 1);\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_save = function (fig, _msg) {\n",
" fig.ondownload(fig, null);\n",
"};\n",
"\n",
"mpl.find_output_cell = function (html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i = 0; i < ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code') {\n",
" for (var j = 0; j < cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] === html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"};\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel !== null) {\n",
" IPython.notebook.kernel.comm_manager.register_target(\n",
" 'matplotlib',\n",
" mpl.mpl_figure_comm\n",
" );\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\" width=\"800\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import os.path as op\n",
"import matplotlib.pyplot as plt\n",
"from ipywidgets import VBox, IntSlider\n",
"\n",
"import mne\n",
"from mne.datasets import sample\n",
"from mne.minimum_norm import apply_inverse, read_inverse_operator\n",
"from mne import read_evokeds\n",
"\n",
"mne.viz.set_3d_backend('notebook')\n",
"\n",
"data_path = sample.data_path()\n",
"meg_path = data_path / 'MEG' / 'sample'\n",
"subjects_dir = data_path / 'subjects'\n",
"\n",
"fname_evoked = meg_path / 'sample_audvis-ave.fif'\n",
"fname_stc = meg_path / 'sample_audvis-meg'\n",
"\n",
"stc = mne.read_source_estimate(fname_stc, subject='sample')\n",
"initial_time = 0.1\n",
"brain = stc.plot(subjects_dir=subjects_dir, initial_time=initial_time,\n",
" clim=dict(kind='value', lims=[3, 6, 9]),\n",
" smoothing_steps=7, time_viewer=True);"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "06563f09",
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"def _plot_picked_vertices(brain):\n",
" for hemi in ['lh', 'rh']:\n",
" if hemi not in brain.data:\n",
" continue\n",
" smooth = brain.data[hemi]['smooth_mat']\n",
" data = brain.data[hemi]['array']\n",
" for vertex_id in brain.picked_points[hemi]:\n",
" plot_data = smooth[vertex_id].dot(data)[0]\n",
" plt.plot(brain.data['time'], plot_data)\n",
" plt.show()\n",
"\n",
"def _on_pick(vtk_picker, event):\n",
" brain._on_pick(vtk_picker, event)\n",
" out = gui.plot_outputs_list[0]\n",
" out.clear_output()\n",
" with out:\n",
" _plot_picked_vertices(brain)\n",
"\n",
"brain._renderer._update_picking_callback(brain._on_mouse_move,\n",
" brain._on_button_press,\n",
" brain._on_button_release,\n",
" _on_pick)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "6f20ecdd",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "634348293966417c8110a68a40ab27f8",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"AppLayout(children=(HTML(value=\"<div\\n style='background:#8A2BE2;\\n text-align:center;co…"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from hnn_core.gui import HNNGUI\n",
"\n",
"gui = HNNGUI()\n",
"gui.compose()\n",
"\n",
"# add the MNE STC plot\n",
"viewer = brain._renderer.plotter.show(\n",
" jupyter_backend=\"ipyvtklink\", return_viewer=True)\n",
"viewer.layout.width = '300px'\n",
"\n",
"tab = gui.app_layout.children[2]\n",
"tab.children = list(tab.children) + [viewer]\n",
"tab.set_title(3, 'MEG data')\n",
"\n",
"gui.app_layout"
]
}
],
"metadata": {
"finalized": {
"timestamp": 1659476732651,
"trusted": true
},
"kernelspec": {
"display_name": "Python (hnn)",
"language": "python",
"name": "myenv"
},
"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.8.8"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment