- {
- “cells”: [
- {
“cell_type”: “markdown”, “metadata”: {
“pycharm”: {}}, “source”: [
“McsPyDataTools Tutorial for CMOS-MEA files<a id=’Top’></a>n”, “=======================n”, “n”, “This tutorial focuses on the HDF5 files generated by the MCS CMOS-MEA software (V. 2.0 and newer) and the usage of the McsPyDataTools toolbox to interact with these files.n”, “n”, “- ### <a href=’#McsPy’>The McsPy module for MCS CMOS-MEA file handling</a>n”, “- ### <a href=’#Mcs-HDF5’>Structure of the CMOS-MEA HDF5 files</a>n”, “n”, “- ### <a href=’#McsData Module’>McsData Classes and Inheritance</a>n”, “——————————————————————————————-n”, ” n”, “- ### <a href=’#Accessing your Data with McsData’>Accessing your Data with McsData</a>n”, ” - #### <a href=’#Req’>Requirements</a>n”, ” - #### <a href=’#naming’>Naming</a>n”, “- ### <a href=’#RawData’>Raw Data Files (.cmcr)</a>n”, ” - #### <a href=’#acquisition’>Acquisition</a>n”, ” - #### <a href=’#channelStream’>ChannelStream</a>n”, ” - #### <a href=’#sensorStream’>SensorStream</a>n”, ” - #### <a href=’#eventStream’>EventStream</a>n”, “- ### <a href=’#processedData’>Processed Data Files (.cmtr)</a>n”, ” - #### <a href=’#filterTool’>Filter Tool</a>n”, ” - #### <a href=’#spikeExplorer’>Spike Explorer</a>n”, ” - #### <a href=’#networkExplorer’>Network Explorer</a>n”, ” - #### <a href=’#spikeSorter’>Spike Sorter</a>n”, “n”, “The McsPy module for MCS CMOS-MEA file handling<a id=’McsPy’></a>n”, “—————————————————n”, “With the`h5py`
package, a powerful tool for accessing HDF5 files in python already exists. This toolbox builds upon h5py by subclassing its central`h5py.Group`
and`h5py.Dataset`
classes as`McsGroup`
and`McsDataset`
respectively. Thus the McsPy classes feature all attributes and methods you might be used to from working with`h5py`
, and simply extend them with MCS specific features. So if you are new to HDF5 in python you can always refer to the h5py documentation and discussions. Likewise, if you have worked with`h5py`
previously you will find yourself in an at least familiar environment.n”, “If you prefer to work with h5py functionalities at any point in your analysis, feel free to retrieve the h5py base object from the McsPy object attribute`.h5py_object`
n”, “n”, “`python\n", " h5py_object = self.h5py_object\n", "`
n”, “n”, “Structure of the HDF5 MCS-CMOS-MEA file system<a id=’Mcs-HDF5’></a>n”, “—————————————————n”, “n”, “A MCS-CMOS-MEA filesystem typically consists of two seperate files. A MCS CMOS-MEA RawData (RD) HDF5 file and a MCS CMOS-MEA ProcessedData (PD) HDF5 file.n”, “The RD file holds all raw data generated in a CMOS-MEA experiment with the CMOS-MEA-Control software, i.e. mainly different MCS data streams. The corresponding file extension is ‘.cmcr’.n”, “The PD file contains all data generated in post-processing raw data with the CMOS-MEA-Tools software. Each tool in the CMOS-MEA-Tools software (Filter Tool, STA or Network Explorer, Spike Explorer, and Spike Sorter) stores its results and settings in its own subgroup. Furthermore, the CMOS-MEA-Tools make use of the HDF5 capabilities to mount HDF5 files into each other. In that sense, the PD file mounts the RD file into the “Acquisition” subgroup of its own hierarchy tree. Thus, given the link in the PD file correctly points to the RD file, this toolbox provides a set of intuitive access tools for both RD and PD via just the PD file. The corresponding file extension is ‘.cmtr’.n”, “n”, “As the McsPyDataTools toolbox works with the underlying, strictly hierarchical HDF5 structure, the starting point of every data exploration with the McsPyDataTools toolbox is the`McsData`
object. As the docstrings of the class already imply, this class was designed to hold the information of a complete CMOS-MEA HDF5 file system.n”, “n”, “`python\n", " data = McsCMOSMEA.McsData('path to your data')\n", "`
n”, “n”, “We highly recommend the supplementary use of the HDF Group’s HDFView software to help visualize and understand the structure of HDF5 files. This makes accessing the data much easier.n”, “n”, “<a href=’#Top’>Back to index</a>n”, “n”, “McsData Classes and Inheritance <a id=’McsData Module’></a>n”, “—————————————————————————————n”, “n”, “Generally, the McsPyDataTools toolbox creates a structure that, upon navigation through the file, reflects the CMOS-MEA HDF5 file structure, e.g. just as the CMOS-MEA HDF5 file system holds raw data in the “Acquisition” subgroup, the McsData object has an attribute`data.Acquisition`
. Therefore, you can refer to the following graphical representation of the CMOS-MEA HDF5 file hierarchy for easy navigation through the python objects.n”, “n”, “Note: The subgroups of the root will not be accessible if they do not exist in the loaded CMOS-MEA file system.n”, “n”, “<a id=’file_structure_graphic’></a>n”, “<img src=”./Cmos_Hierarchy_short.png”>n”, “n”, “Upon initialization with the path to your datan”, “n”, “`python\n", " data = McsCMOSMEA.McsData('path to your data')\n", "`
n”, “n”, “member methods of this class will check if the provided file meets the version requirements to be further processed. This is neccessary, as not only the way how MCS programs handle the HDF5 formatted files may change, but the file format itself can undergo changes.n”, “n”, “Afterwards all information about the data stored in the file is retrieved from the HDF5 attributes, decoded and saved in the attribute`.attributes`
as a dictionary. The`.attributes`
dictionary is created for every McsPy object.n”, “n”, “`python\n", " data.attributes\n", "`
n”, “n”, “An access request on one of the subgroups or datasets (i.e. Acquisition, Filter Tool, STA Explorer, Network Explorer, Spike Explorer, Spike Sorter) readies the respective data:n”, “n”, “`python\n", " aquisition_data = data.Aquisition\n", "`
n”, “n”, “This instantiates a new McsPy object holding the all data about the requested subgroup.n”, “n”, “<a href=’#Top’>Back to index</a>”]
}, {
“cell_type”: “markdown”, “metadata”: {
“pycharm”: {}}, “source”: [
“## Accessing your Data with McsData<a id=’Accessing your Data with McsData’></a>n”, “n”, “Now that the general structure of a HDF5 file and the McsPy package with its McsData class is clear, we can walk through some quick and easy examples of how to access and visualize your data.n”, “n”, “n”, “Navigation through McsPy objects implements two central concepts:n”, “1. Groups work like dictionaries or classes.n”, “2. Datasets work like numpy arrays.n”, “n”, “### Naming<a id=’naming’></a>n”, “n”, “Wherever possible, McsPy names instances and attributes as found in the CMOS-MEA HDF5 file system. However, some systematic substitutions in group, dataset, and attribute naming are necessary to ensure python compatibility:n”, “n”, “n”, “| HDF5 MCS-CMOS-MEA | McsPyDataTools toolbox |\n", "|———————–|----------------------------|n”, “| whitespace | _ |\n", "| . | _ |\n", "| , | _ |\n", "| @ | at |\n", "| ( | (character removed) |\n", "| ) | (character removed) |\n", "| : | (character removed) |”]
}, {
“cell_type”: “markdown”, “metadata”: {
“pycharm”: {}}, “source”: [
“### Requirements <a id=’Req’></a>n”, “n”, “So let’s dig in and get an impression of working with MCS CMOS-MEA data.n”, “n”, “First some modules need to be imported:”]
}, {
“cell_type”: “code”, “execution_count”: 1, “metadata”: {
- “pycharm”: {
- “is_executing”: false
}
}, “outputs”: [], “source”: [
“# These are the imports of the McsData modulen”, “import sys, importlib, osn”, “n”, “import McsPyn”, “import McsPy.McsCMOSMEA as McsCMOSMEAn”, “n”, “# matplotlib.pyplot will be used in these examples to generate the plots visualizing the datan”, “import matplotlib.pyplot as pltn”, “from matplotlib.figure import Figuren”, “from matplotlib.widgets import Slider, AxesWidgetn”, “import matplotlib.animation as animationn”, “from IPython.display import HTMLn”, “# These adjustments only need to be made so that the plot gets displayed inside the notebookn”, “%matplotlib inlinen”, “# %config InlineBackend.figure_formats = {‘png’, ‘retina’}n”, “n”, “# numpy is numpy & pandas os pandasn”, “import numpy as npn”, “import pandas as pdn”, “n”, “# bokeh adds more interactivity to the plots within notebooks. Adds toolbar at the top-right corner of the plot.n”, “# Allows zooming, panning and saving of the plotn”, “import bokeh.ion”, “import bokeh.plottingn”, “n”, “# IMPORT cv2 to write a videon”, “from cv2 import VideoWriter, VideoWriter_fourccn”, “n”, “#import widgetsn”, “from ipywidgets import *n”, “from ipywebrtc import VideoStreamn”, “n”, “# autoreload modulesn”, “%load_ext autoreloadn”, “%autoreload 2”]
}, {
“cell_type”: “markdown”, “metadata”: {
“pycharm”: {}}, “source”: [
“Then, we need to define where the test data is located. This needs to be adjusted to your local setup! The McsPyDataTools toolbox includes a set of small test files in its tests/TestData folder. An archive with larger test files can be downloaded from the [Multi Channel DataManager](https://www.multichannelsystems.com/software/multi-channel-datamanager) page.”]
}, {
“cell_type”: “code”, “execution_count”: 2, “metadata”: {
- “pycharm”: {
- “is_executing”: false
}
}, “outputs”: [], “source”: [
“path2TestData = r’..\McsPyDataTools\McsPy\tests\TestData’ # adjust this!”]
}, {
“cell_type”: “markdown”, “metadata”: {
“pycharm”: {}}, “source”: [
“Sometimes running Python applications in the background can interfere with the functionalities of this notebook. To make sure that all plots are created correctly you are best advised to exit any other Python related processes.”]
}, {
“cell_type”: “markdown”, “metadata”: {}, “source”: [
“## Raw Data Files (.cmcr)<a id=’RawData’></a>”]
}, {
“cell_type”: “markdown”, “metadata”: {
“pycharm”: {}}, “source”: [
“In order to access a raw data file with extension .cmcr, we need to initialize an instance of the McsData class from the McsData module with the path to the file:”]
}, {
“cell_type”: “code”, “execution_count”: 3, “metadata”: {
- “pycharm”: {
- “is_executing”: false
}
}, “outputs”: [], “source”: [
“path2TestDataFile1 = os.path.join(path2TestData, “V200-SensorRoi-3Aux-Dig-Stim2-DiginEvts-5kHz.cmcr”)n”, “data = McsCMOSMEA.McsData(path2TestDataFile1)”]
}, {
“cell_type”: “markdown”, “metadata”: {
“pycharm”: {}}, “source”: [
“Note: The`McsData`
call actually determines the type of MCS HDF5 file system which you have called, and returns an instance of an appropriate class. Do not be confused if the return is not an instance of`McsData`
as you have maybe expected.n”, “n”, “To check if we got access to the file we can simply print the object. This gives a rough overview of the contents of the CMOS MEA RawData, or CMOS MEA ProcessedData file. In general, all McsGroup objects provide some information about themselves and a table of all subgroups or datasets (which you can check against the file hierarchy image) upon printing. The table also provides the McsPy access name of all contents.”]
}, {
“cell_type”: “code”, “execution_count”: 4, “metadata”: {
- “pycharm”: {
- “is_executing”: false
}
}, “outputs”: [
- {
“name”: “stdout”, “output_type”: “stream”, “text”: [
“<McsCMOSMEAData instance at 0x246d6401ef0>n”, “n”, “This object represents the Mcs CMOS MEA file:n”, “Filename: V200-SensorRoi-3Aux-Dig-Stim2-DiginEvts-5kHz.cmcrn”, “n”, “Date Program Version n”, “——————- ————————– ———-n”, “10.10.2017 10:08:46 CMOS-MEA-Control 2.0.0.0 n”, “n”, “n”, “Content:n”, “n”, “| Mcs Type | HDF5 name | McsPy name |\n", "===============================================================================\n", "Groups:\n", "| Acquisition | Acquisition | Acquisition |n”, “——————————————————————————-n”, “Datasets:n”, ” Nonen”, “n”]
}
], “source”: [
“print(data)”]
}, {
“cell_type”: “markdown”, “metadata”: {
“pycharm”: {}}, “source”: [
“The root object holds information about the Date of the recording, the Program which was used as well as its Version.n”, “n”, “Feel free to browse the`self.attributes`
on any instance of`McsGroup`
or`McsDataset`
for more detailed information. And finally, you can call`McsGroup.tree(self)`
for an ‘indent-tree’ of the current HDF5 Group and all its descendants. Feel free to check the output against the file hierarchy image <a href=’#file_structure_graphic’>above</a>.n”, “n”, “Note: As file trees may become very large very quickly, you are advised to print the instance rather than the tree once you are familiar with the MCS HDF5 file system.”]
}, {
“cell_type”: “code”, “execution_count”: 5, “metadata”: {
- “pycharm”: {
- “is_executing”: false
}
}, “outputs”: [
- {
“name”: “stdout”, “output_type”: “stream”, “text”: [
“/n”, ” Acquisition n”, ” Analog_Data n”, ” ChannelData_1 n”, ” ChannelMeta n”, ” Digital_Data n”, ” ChannelData_1 n”, ” ChannelMeta n”, ” Digital_Data_Events n”, ” EventData n”, ” EventMeta n”, ” STG_Sideband_Events n”, ” EventData n”, ” EventMeta n”, ” StimulationSites n”, ” STG_Waveform n”, ” ChannelData_1 n”, ” ChannelMeta n”, ” StimulationSites n”, ” Sensor_Data n”, ” SensorData_1_1 n”, ” SensorMeta n”, “n”]
}
], “source”: [
“print(data.tree())”]
}, {
“cell_type”: “markdown”, “metadata”: {
“pycharm”: {}}, “source”: [
“<a href=’#Top’>Back to index</a>”]
}, {
“cell_type”: “markdown”, “metadata”: {
“pycharm”: {}}, “source”: [
“### Accessing Acquisition Data<a id=’acquisition’></a>n”, “n”, “From the table we see that we can access the RawData, which is stored in the ‘Acquisition’ group of the MCS HDF5 file by simply calling the acquisition attribute on our`data`
instance. Let’s go ahead and get a glimpse of the raw data streams in the file.”]
}, {
“cell_type”: “code”, “execution_count”: 6, “metadata”: {
- “pycharm”: {
- “is_executing”: false
}
}, “outputs”: [
- {
“name”: “stdout”, “output_type”: “stream”, “text”: [
“——————————————————————————-n”, “Parent Group: <class ‘McsPyDataTools.McsPy.McsCMOSMEA.Acquisition’ object at 0x246d64201d0>n”, “n”, “——————————————————————————-n”, “n”, “n”, “| Subtype | HDF5 name | McsPy name |\n", "===============================================================================\n", "ChannelStream\n", "| Auxiliary | Analog Data | Analog_Data |\n", "| Digital | Digital Data | Digital_Data |\n", "| StgWaveform | STG Waveform | STG_Waveform |\n", "-------------------------------------------------------------------------------\n", "EventStream\n", "| DigitalPort | Digital Data Events | Digital_Data_Events |\n", "| StgSideband | STG Sideband Events | STG_Sideband_Events |\n", "-------------------------------------------------------------------------------\n", "SensorStream\n", "| CMosSensor | Sensor Data | Sensor_Data |n”, “——————————————————————————-n”, “n”]
}
], “source”: [
“print(data.Acquisition)”]
}, {
“cell_type”: “markdown”, “metadata”: {
“pycharm”: {}}, “source”: [
“#### Channel Streams<a id=’channelStream’></a>n”, “We can navigate further to start and work with some channel data.”]
}, {
“cell_type”: “code”, “execution_count”: 7, “metadata”: {
- “pycharm”: {
- “is_executing”: false
}
}, “outputs”: [
- {
“name”: “stdout”, “output_type”: “stream”, “text”: [
“——————————————————————————-n”, “Parent Group: <class ‘McsPyDataTools.McsPy.McsCMOSMEA.McsChannelStream’ object at 0x246d64205c0>n”, “——————————————————————————-n”, “n”, “n”, “| Mcs Type | HDF5 name | McsPy name |\n", "===============================================================================\n", "Groups:\n", " None\n", "-------------------------------------------------------------------------------\n", "Datasets:\n", "| ChannelData | ChannelData 1 | ChannelData_1 |\n", "| ChannelMeta | ChannelMeta | ChannelMeta |\n", "| Sites | StimulationSites | StimulationSites |n”, “n”]
}
], “source”: [
“print(data.Acquisition.STG_Waveform)”]
}, {
“cell_type”: “markdown”, “metadata”: {
“pycharm”: {}}, “source”: [
“The Channel Stream ‘Digital Data’ object contains the two data sets`ChannelData_1`
and`ChannelMeta`
. The objects we obtain upon access are not arrays, but subclasses of`h5py.Dataset`
. However, ```h5py.Dataset```s can be accessed, sliced and manipulated just as numpy arrays. So ```h5py.Dataset```s have a shape, a size, and a data type. For more information on working with Datasets please refer to the h5py <a href=’https://readthedocs.org/projects/h5py/’>documentation</a>.”]
}, {
“cell_type”: “code”, “execution_count”: 8, “metadata”: {
- “pycharm”: {
- “is_executing”: false
}
}, “outputs”: [
- {
“name”: “stdout”, “output_type”: “stream”, “text”: [
“Shape: (1, 10000)n”, “Size: 10000n”, “Type: int32n”]
}
], “source”: [
“print(‘Shape:’.ljust(10)+str(data.Acquisition.STG_Waveform.ChannelData_1.shape))n”, “print(‘Size:’.ljust(10)+str(data.Acquisition.STG_Waveform.ChannelData_1.size))n”, “print(‘Type:’.ljust(10)+str(data.Acquisition.STG_Waveform.ChannelData_1.dtype))”]
}, {
“cell_type”: “markdown”, “metadata”: {
“pycharm”: {}}, “source”: [
“Now, let’s go ahead and visual the signal of a channel we recorded:”]
}, {
“cell_type”: “code”, “execution_count”: 9, “metadata”: {
- “pycharm”: {
- “is_executing”: false
}
}, “outputs”: [
- {
- “data”: {
- “text/plain”: [
- “Text(0.5, 1.0, ‘Signal recorded by Channel 2’)”
]
}, “execution_count”: 9, “metadata”: {}, “output_type”: “execute_result”
}, {
- “data”: {
“image/png”: “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”, “text/plain”: [
“<Figure size 980.64x472.32 with 1 Axes>”]
}, “metadata”: {
“needs_background”: “light”}, “output_type”: “display_data”
}
], “source”: [
“channeldata_1 = data.Acquisition.STG_Waveform.ChannelData_1n”, “exponent = data.Acquisition.STG_Waveform.ChannelData_1.Meta[‘Exponent’][0]n”, “channel_id = data.Acquisition.STG_Waveform.ChannelData_1.Meta[‘ChannelID’][0]n”, “n”, “plt.figure(figsize=(0.681*20, 0.328*20))n”, “plt.plot(channeldata_1[0,2000:3000])n”, “plt.ylabel(‘Voltage [Ve’+str(exponent)+’]’)n”, “plt.xlabel(‘Time in timesteps’)n”, “plt.title(‘Signal recorded by Channel ‘+str(channel_id), fontweight=’bold’)”]
}, {
“cell_type”: “markdown”, “metadata”: {
“pycharm”: {}}, “source”: [
“#### Sensor Streams<a id=’sensorStream’></a>n”, “Alternatively we can investigate a Sensor Stream.”]
}, {
“cell_type”: “code”, “execution_count”: 10, “metadata”: {
- “pycharm”: {
- “is_executing”: false
}
}, “outputs”: [
- {
“name”: “stdout”, “output_type”: “stream”, “text”: [
“——————————————————————————-n”, “Parent Group: <class ‘McsPyDataTools.McsPy.McsCMOSMEA.McsSensorStream’ object at 0x246d6507400>n”, “——————————————————————————-n”, “n”, “n”, “| Mcs Type | HDF5 name | McsPy name |\n", "===============================================================================\n", "Groups:\n", " None\n", "-------------------------------------------------------------------------------\n", "Datasets:\n", "| SensorData | SensorData 1 1 | SensorData_1_1 |\n", "| SensorMeta | SensorMeta | SensorMeta |n”, “n”]
}
], “source”: [
“print(data.Acquisition.Sensor_Data)”]
}, {
“cell_type”: “markdown”, “metadata”: {
“pycharm”: {}}, “source”: [
“To visualize the sensor data as greyscale images, we can create an animation in matplotlib and play it as a HTML video. You’ll need to have FFmpeg available for this to work.”]
}, {
“cell_type”: “code”, “execution_count”: null, “metadata”: {
- “pycharm”: {
- “is_executing”: false
}
}, “outputs”: [], “source”: [
“images = data.Acquisition.Sensor_Data.SensorData_1_1n”, “n”, “fig = plt.figure()n”, “n”, “im = plt.imshow(images[0], animated=True, cmap=’gray’)n”, “plt.title(‘Sensor Data 1 1’)n”, “plt.box(False)n”, “n”, “def updatefig(i):n”, ” global imagesn”, ” im.set_array(images[i])n”, ” return im,n”, “n”, “ani = animation.FuncAnimation(fig, updatefig, interval=50, blit=True)n”, “n”, “plt.close(ani._fig)n”, “n”, “# Call function to display the animationn”, “HTML(ani.to_html5_video())”]
}, {
“cell_type”: “markdown”, “metadata”: {
“pycharm”: {}}, “source”: [
“We can also take the sensor data and create a simple slider to go through the blocks of sensor data in time:”]
}, {
“cell_type”: “code”, “execution_count”: 13, “metadata”: {
- “pycharm”: {
- “is_executing”: 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 imagesn”, ” // almost always do), so we need to clear the canvas so thatn”, ” // there is no ghosting.n”, ” fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);n”, ” }n”, ” fig.context.drawImage(fig.imageObj, 0, 0);n”, ” };n”, “n”, ” this.imageObj.onunload = function() {n”, ” fig.ws.close();n”, ” }n”, “n”, ” this.ws.onmessage = this._make_on_message_function(this);n”, “n”, ” this.ondownload = ondownload;n”, “}n”, “n”, “mpl.figure.prototype._init_header = function() {n”, ” var titlebar = $(n”, ” ‘<div class=”ui-dialog-titlebar ui-widget-header ui-corner-all ‘ +n”, ” ‘ui-helper-clearfix”/>’);n”, ” var titletext = $(n”, ” ‘<div class=”ui-dialog-title” style=”width: 100%; ‘ +n”, ” ‘text-align: center; padding: 3px;”/>’);n”, ” titlebar.append(titletext)n”, ” this.root.append(titlebar);n”, ” this.header = titletext[0];n”, “}n”, “n”, “n”, “n”, “mpl.figure.prototype._canvas_extra_style = function(canvas_div) {n”, “n”, “}n”, “n”, “n”, “mpl.figure.prototype._root_extra_style = function(canvas_div) {n”, “n”, “}n”, “n”, “mpl.figure.prototype._init_canvas = function() {n”, ” var fig = this;n”, “n”, ” var canvas_div = $(‘<div/>’);n”, “n”, ” canvas_div.attr(‘style’, ‘position: relative; clear: both; outline: 0’);n”, “n”, ” function canvas_keyboard_event(event) {n”, ” return fig.key_event(event, event[‘data’]);n”, ” }n”, “n”, ” canvas_div.keydown(‘key_press’, canvas_keyboard_event);n”, ” canvas_div.keyup(‘key_release’, canvas_keyboard_event);n”, ” this.canvas_div = canvas_divn”, ” 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 bandn”, ” // 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 updatedn”, ” // 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-buttonsn”, ” $( “.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 / mpl.ratio, fig.canvas.height / mpl.ratio);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 butn”, ” * transferred with MIME type text/plain:” errors onn”, ” * Chrome. But how to set the MIME type? It doesn’t seemn”, ” * 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 takesn”, ” // 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-canvasn”, “mpl.findpos = function(e) {n”, ” //this section is from http://www.quirksmode.org/js/events_properties.htmln”, ” 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 bugn”, ” targ = targ.parentNode;n”, “n”, ” // jQuery normalizes the pageX and pageYn”, ” // pageX,Y are the mouse positions relative to the documentn”, ” // offset() returns the position of the element relative to the documentn”, ” 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 keysn”, ” * we need this to avoid circular referencesn”, ” * http://stackoverflow.com/a/24161582/3208463n”, ” /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 ton”, ” * the text insertion cursor when the button is pressed. We wantn”, ” * to control all of the cursor setting manually through then”, ” * ‘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 eventn”, “}n”, “n”, “mpl.figure.prototype.key_event = function(event, name) {n”, “n”, ” // Prevent repeat eventsn”, ” if (name == ‘key_press’)n”, ” {n”, ” if (event.which === this._key)n”, ” return;n”, ” elsen”, ” this._key = event.which;n”, ” }n”, ” if (name == ‘key_release’)n”, ” this._key = null;n”, “n”, ” var value = ‘’;n”, ” if (event.ctrlKey && event.which != 17)n”, ” value += “ctrl+”;n”, ” if (event.altKey && event.which != 18)n”, ” value += “alt+”;n”, ” if (event.shiftKey && event.which != 16)n”, ” value += “shift+”;n”, “n”, ” value += ‘k’;n”, ” value += event.which.toString();n”, “n”, ” this._key_event_extra(event, name);n”, “n”, ” this.send_message(name, {key: value,n”, ” guiEvent: simpleKeys(event)});n”, ” return false;n”, “}n”, “n”, “mpl.figure.prototype.toolbar_button_onclick = function(name) {n”, ” if (name == ‘download’) {n”, ” this.handle_save(this, null);n”, ” } else {n”, ” this.send_message(“toolbar_button”, {name: name});n”, ” }n”, “};n”, “n”, “mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {n”, ” this.message.textContent = tooltip;n”, “};n”, “mpl.toolbar_items = [[“Home”, “Reset original view”, “fa fa-home icon-home”, “home”], [“Back”, “Back to previous view”, “fa fa-arrow-left icon-arrow-left”, “back”], [“Forward”, “Forward to next view”, “fa fa-arrow-right icon-arrow-right”, “forward”], [“”, “”, “”, “”], [“Pan”, “Pan axes with left mouse, zoom with right”, “fa fa-arrows icon-move”, “pan”], [“Zoom”, “Zoom to rectangle”, “fa fa-square-o icon-check-empty”, “zoom”], [“”, “”, “”, “”], [“Download”, “Download plot”, “fa fa-floppy-o icon-save”, “download”]];n”, “n”, “mpl.extensions = [“eps”, “jpeg”, “pdf”, “png”, “ps”, “raw”, “svg”, “tif”];n”, “n”, “mpl.default_extension = “png”;var comm_websocket_adapter = function(comm) {n”, ” // Create a “websocket”-like object which calls the given IPython commn”, ” // object with the appropriate methods. Currently this is a non binaryn”, ” // 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 processn”, ” // 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 Commn”, ” // 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 realn”, ” // 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.ration”, ” 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.ration”, ” 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 son”, ” // 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 = thisn”, ” 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 ‘focusablen”, ” el.attr(‘tabindex’, 0)n”, ” // reach out to IPython and tell the keyboard manager to turn it’s selfn”, ” // off when our div gets focusn”, “n”, ” // location in version 3n”, ” if (IPython.notebook.keyboard_manager) {n”, ” IPython.notebook.keyboard_manager.register_events(el);n”, ” }n”, ” else {n”, ” // location in version 2n”, ” 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+entern”, ” if (event.shiftKey && event.which == 13) {n”, ” this.canvas_div.blur();n”, ” event.shiftKey = false;n”, ” // Send a “J” for go to next celln”, ” event.which = 74;n”, ” event.keyCode = 74;n”, ” manager.command_mode();n”, ” manager.handle_keydown(event);n”, ” }n”, “}n”, “n”, “mpl.figure.prototype.handle_save = function(fig, msg) {n”, ” fig.ondownload(fig, null);n”, “}n”, “n”, “n”, “mpl.find_output_cell = function(html_output) {n”, ” // Return the cell and output element which can be found *uniquely in the notebook.n”, ” // Note - this is a bit hacky, but it is done because the “notebook_saving.Notebook”n”, ” // IPython event is triggered only after the cells have been serialised, which forn”, ” // 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 outputn”, ” 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”: {
- “application/vnd.jupyter.widget-view+json”: {
- “model_id”: “cb2c84c7925f4ca6aaf2676706b6ec24”, “version_major”: 2, “version_minor”: 0
}, “text/plain”: [
“interactive(children=(IntSlider(value=0, description=’Frame’, max=9999), Output()), _dom_classes=(‘widget-inte…”]
}, “metadata”: {}, “output_type”: “display_data”
}
], “source”: [
“%matplotlib notebookn”, “n”, “images = data.Acquisition.Sensor_Data.SensorData_1_1n”, “num_of_images = images.shape[0]-1n”, “n”, “fig = plt.figure(figsize=(0.681*10, 0.328*10))n”, “ax = fig.add_subplot(1,1,1)n”, “plt.title(‘Sensor Data 1 1’)n”, “plt.box(False)n”, “fig.show()n”, “#print(images.shape)n”, “def updateFrame(Frame):n”, ” ax.imshow(images[Frame,::], cmap=”gray”)n”, ” n”, “_ = interact(updateFrame, Frame=widgets.IntSlider(min=0,max=num_of_images,step=1,value=0))”]
}, {
“cell_type”: “markdown”, “metadata”: {
“pycharm”: {}}, “source”: [
“<a href=’#Top’>Back to index</a>”]
}, {
“cell_type”: “markdown”, “metadata”: {
“pycharm”: {}}, “source”: [
“#### EventStream<a id=’eventStream’></a>n”, “n”, “EventStreams can be a wide array of events predefined by the user and stored in this stream. From the beginning/end or the duration of a treatment to periodically recurring stimuli this can be everything.”]
}, {
“cell_type”: “markdown”, “metadata”: {
“pycharm”: {}}, “source”: [
“<a href=’#Top’>Back to index</a>”]
}, {
“cell_type”: “code”, “execution_count”: 14, “metadata”: {
- “pycharm”: {
- “is_executing”: false
}
}, “outputs”: [
- {
“name”: “stdout”, “output_type”: “stream”, “text”: [
“——————————————————————————-n”, “Parent Group: <class ‘McsPyDataTools.McsPy.McsCMOSMEA.McsEventStream’ object at 0x246d9737ef0>n”, “——————————————————————————-n”, “n”, “n”, “| Mcs Type | HDF5 name | McsPy name |\n", "===============================================================================\n", "Groups:\n", " None\n", "-------------------------------------------------------------------------------\n", "Datasets:\n", "| EventData | EventData | EventData |\n", "| EventMeta | EventMeta | EventMeta |\n", "| Sites | StimulationSites | StimulationSites |n”, “n”]
}
], “source”: [
“print(data.Acquisition.STG_Sideband_Events)”]
}, {
“cell_type”: “markdown”, “metadata”: {
“pycharm”: {}}, “source”: [
“We prepare the data:”]
}, {
“cell_type”: “code”, “execution_count”: 16, “metadata”: {
- “pycharm”: {
- “is_executing”: false
}
}, “outputs”: [], “source”: [
“# GET pandas DataFrame FROM MCSHDF5 FORMATn”, “eventData = data.Acquisition.STG_Sideband_Events.EventData.to_pdDataFrame().iloc[:50,:]n”, “eventData = eventData.sort_values(by=’EventID’)n”, “n”, “# EXTRACT EVENT POSITION IN TIMEn”, “eventPosition = eventData.pivot(columns=’EventID’, values=’TimeStamp’)n”, “eventPosition.fillna(method=’ffill’, axis=’index’, inplace=True)n”, “eventPosition.fillna(method=’bfill’, axis=’index’, inplace=True)n”, “n”, “# EXTRACT EVENT DURATIONn”, “eventDuration = eventData.pivot(columns=’EventID’, values=’Duration’)n”, “eventDuration.fillna(method=’ffill’, axis=’index’, inplace=True)n”, “eventDuration.fillna(method=’bfill’, axis=’index’, inplace=True)n”, “eventDuration[eventDuration == 0] += 0.2 # add minimum event durationn”, “n”, “# EXTRACT EVENT DESCRIPTIONn”, “eventMeta = data.Acquisition.STG_Sideband_Events.EventMeta.to_pdDataFrame().iloc[:50,:]n”, “eventMeta = eventMeta.sort_values(by=’EventID’)n”, “eventLabels = eventMeta.loc[eventMeta[‘EventID’].isin(eventData.EventID.unique())][‘Label’].tolist()”]
}, {
“cell_type”: “markdown”, “metadata”: {
“pycharm”: {}}, “source”: [
“And visualize it”]
}, {
“cell_type”: “code”, “execution_count”: 17, “metadata”: {
- “pycharm”: {
- “is_executing”: 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 imagesn”, ” // almost always do), so we need to clear the canvas so thatn”, ” // there is no ghosting.n”, ” fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);n”, ” }n”, ” fig.context.drawImage(fig.imageObj, 0, 0);n”, ” };n”, “n”, ” this.imageObj.onunload = function() {n”, ” fig.ws.close();n”, ” }n”, “n”, ” this.ws.onmessage = this._make_on_message_function(this);n”, “n”, ” this.ondownload = ondownload;n”, “}n”, “n”, “mpl.figure.prototype._init_header = function() {n”, ” var titlebar = $(n”, ” ‘<div class=”ui-dialog-titlebar ui-widget-header ui-corner-all ‘ +n”, ” ‘ui-helper-clearfix”/>’);n”, ” var titletext = $(n”, ” ‘<div class=”ui-dialog-title” style=”width: 100%; ‘ +n”, ” ‘text-align: center; padding: 3px;”/>’);n”, ” titlebar.append(titletext)n”, ” this.root.append(titlebar);n”, ” this.header = titletext[0];n”, “}n”, “n”, “n”, “n”, “mpl.figure.prototype._canvas_extra_style = function(canvas_div) {n”, “n”, “}n”, “n”, “n”, “mpl.figure.prototype._root_extra_style = function(canvas_div) {n”, “n”, “}n”, “n”, “mpl.figure.prototype._init_canvas = function() {n”, ” var fig = this;n”, “n”, ” var canvas_div = $(‘<div/>’);n”, “n”, ” canvas_div.attr(‘style’, ‘position: relative; clear: both; outline: 0’);n”, “n”, ” function canvas_keyboard_event(event) {n”, ” return fig.key_event(event, event[‘data’]);n”, ” }n”, “n”, ” canvas_div.keydown(‘key_press’, canvas_keyboard_event);n”, ” canvas_div.keyup(‘key_release’, canvas_keyboard_event);n”, ” this.canvas_div = canvas_divn”, ” 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 bandn”, ” // 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 updatedn”, ” // 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-buttonsn”, ” $( “.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 / mpl.ratio, fig.canvas.height / mpl.ratio);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 butn”, ” * transferred with MIME type text/plain:” errors onn”, ” * Chrome. But how to set the MIME type? It doesn’t seemn”, ” * 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 takesn”, ” // 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-canvasn”, “mpl.findpos = function(e) {n”, ” //this section is from http://www.quirksmode.org/js/events_properties.htmln”, ” 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 bugn”, ” targ = targ.parentNode;n”, “n”, ” // jQuery normalizes the pageX and pageYn”, ” // pageX,Y are the mouse positions relative to the documentn”, ” // offset() returns the position of the element relative to the documentn”, ” 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 keysn”, ” * we need this to avoid circular referencesn”, ” * http://stackoverflow.com/a/24161582/3208463n”, ” /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 ton”, ” * the text insertion cursor when the button is pressed. We wantn”, ” * to control all of the cursor setting manually through then”, ” * ‘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 eventn”, “}n”, “n”, “mpl.figure.prototype.key_event = function(event, name) {n”, “n”, ” // Prevent repeat eventsn”, ” if (name == ‘key_press’)n”, ” {n”, ” if (event.which === this._key)n”, ” return;n”, ” elsen”, ” this._key = event.which;n”, ” }n”, ” if (name == ‘key_release’)n”, ” this._key = null;n”, “n”, ” var value = ‘’;n”, ” if (event.ctrlKey && event.which != 17)n”, ” value += “ctrl+”;n”, ” if (event.altKey && event.which != 18)n”, ” value += “alt+”;n”, ” if (event.shiftKey && event.which != 16)n”, ” value += “shift+”;n”, “n”, ” value += ‘k’;n”, ” value += event.which.toString();n”, “n”, ” this._key_event_extra(event, name);n”, “n”, ” this.send_message(name, {key: value,n”, ” guiEvent: simpleKeys(event)});n”, ” return false;n”, “}n”, “n”, “mpl.figure.prototype.toolbar_button_onclick = function(name) {n”, ” if (name == ‘download’) {n”, ” this.handle_save(this, null);n”, ” } else {n”, ” this.send_message(“toolbar_button”, {name: name});n”, ” }n”, “};n”, “n”, “mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {n”, ” this.message.textContent = tooltip;n”, “};n”, “mpl.toolbar_items = [[“Home”, “Reset original view”, “fa fa-home icon-home”, “home”], [“Back”, “Back to previous view”, “fa fa-arrow-left icon-arrow-left”, “back”], [“Forward”, “Forward to next view”, “fa fa-arrow-right icon-arrow-right”, “forward”], [“”, “”, “”, “”], [“Pan”, “Pan axes with left mouse, zoom with right”, “fa fa-arrows icon-move”, “pan”], [“Zoom”, “Zoom to rectangle”, “fa fa-square-o icon-check-empty”, “zoom”], [“”, “”, “”, “”], [“Download”, “Download plot”, “fa fa-floppy-o icon-save”, “download”]];n”, “n”, “mpl.extensions = [“eps”, “jpeg”, “pdf”, “png”, “ps”, “raw”, “svg”, “tif”];n”, “n”, “mpl.default_extension = “png”;var comm_websocket_adapter = function(comm) {n”, ” // Create a “websocket”-like object which calls the given IPython commn”, ” // object with the appropriate methods. Currently this is a non binaryn”, ” // 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 processn”, ” // 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 Commn”, ” // 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 realn”, ” // 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.ration”, ” 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.ration”, ” 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 son”, ” // 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 = thisn”, ” 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 ‘focusablen”, ” el.attr(‘tabindex’, 0)n”, ” // reach out to IPython and tell the keyboard manager to turn it’s selfn”, ” // off when our div gets focusn”, “n”, ” // location in version 3n”, ” if (IPython.notebook.keyboard_manager) {n”, ” IPython.notebook.keyboard_manager.register_events(el);n”, ” }n”, ” else {n”, ” // location in version 2n”, ” 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+entern”, ” if (event.shiftKey && event.which == 13) {n”, ” this.canvas_div.blur();n”, ” event.shiftKey = false;n”, ” // Send a “J” for go to next celln”, ” event.which = 74;n”, ” event.keyCode = 74;n”, ” manager.command_mode();n”, ” manager.handle_keydown(event);n”, ” }n”, “}n”, “n”, “mpl.figure.prototype.handle_save = function(fig, msg) {n”, ” fig.ondownload(fig, null);n”, “}n”, “n”, “n”, “mpl.find_output_cell = function(html_output) {n”, ” // Return the cell and output element which can be found *uniquely in the notebook.n”, ” // Note - this is a bit hacky, but it is done because the “notebook_saving.Notebook”n”, ” // IPython event is triggered only after the cells have been serialised, which forn”, ” // 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 outputn”, ” 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”
}, {
}
], “source”: [
“# VISUALIZE EVENTSn”, “fig = plt.figure(figsize=(10, 5))n”, “ax = fig.add_subplot(111)n”, “n”, “colors = [[0, 1, 0], [1, 0, 0]]n”, “n”, “ax.eventplot(eventPosition.values.transpose(), n”, ” linewidth=eventDuration.values.transpose(), n”, ” linelength = 0.62,n”, ” colors=colors)n”, “n”, “ax.set_title(‘Events in STG_Sideband_Events’)n”, “ax.set_xlabel(‘time [ms]’)n”, “ax.set_ylabel(‘Event’)n”, “ax.set_yticks(range(len(eventLabels)))n”, “ax.set_yticklabels(eventLabels)n”, “plt.box(False)”]
}, {
“cell_type”: “markdown”, “metadata”: {
“pycharm”: {}}, “source”: [
“## Processed Data Files (.cmtr)<a id=’processedData’></a>n”, “n”, “Processed data files with the file extension .cmtr are created by the CMOS-MEA-Tools software and contain the analysis results from different data sources. To access them, we need to create an instance of McsData in the same way as for the Raw Data files:”]
}, {
“cell_type”: “code”, “execution_count”: 3, “metadata”: {}, “outputs”: [], “source”: [
“path2TestDataFile2 = os.path.join(path2TestData, “CMOS_MEA_Results.cmtr”)n”, “processed = McsCMOSMEA.McsData(path2TestDataFile2)”]
}, {
“cell_type”: “markdown”, “metadata”: {}, “source”: [
“The easiest way to see the file contents is to print the object”]
}, {
“cell_type”: “code”, “execution_count”: 19, “metadata”: {}, “outputs”: [
- {
“name”: “stdout”, “output_type”: “stream”, “text”: [
“<McsCMOSMEAData instance at 0x246d97f6ba8>n”, “n”, “This object represents the Mcs CMOS MEA file:n”, “Filename: result_file_with_network_explorer.cmtrn”, “n”, “Date Program Version n”, “——————- ————————– ———-n”, “16.12.2019 11:34:19 CMOS-MEA-Tools 2.4.0.0 n”, “n”, “n”, “Content:n”, “n”, “| Mcs Type | HDF5 name | McsPy name |\n", "===============================================================================\n", "Groups:\n", "| Acquisition | Acquisition | Acquisition |\n", "| SummaryTool | Activity Summary | Activity_Summary |\n", "| FilterTool | Filter Tool | Filter_Tool |\n", "| NetworkExplorerTool | Network Explorer | Network_Explorer |\n", "| SpikeExplorerTool | Spike Explorer | Spike_Explorer |\n", "| SpikeSorter | Spike Sorter | Spike_Sorter |n”, “——————————————————————————-n”, “Datasets:n”, ” Nonen”, “n”]
}
], “source”: [
“print(processed)”]
}, {
“cell_type”: “markdown”, “metadata”: {}, “source”: [
“The file contains 5 different data sources: Acquisition, Filter Tool, STA Explorer, Spike Explorer and Spike Sorter. Of these, Acquisition is a special case because it is actually a link to the Acquisition group in the Raw Data file 2017.12.14-18.38.15-GFP8ms_470nm_100pc_10rep_nofilter.cmcr that served as input to the analysis in CMOS-MEA-Tools. Still, you can access the contents of this group as usual:”]
}, {
“cell_type”: “code”, “execution_count”: 20, “metadata”: {}, “outputs”: [
- {
“name”: “stdout”, “output_type”: “stream”, “text”: [
“——————————————————————————-n”, “Parent Group: <class ‘McsPyDataTools.McsPy.McsCMOSMEA.Acquisition’ object at 0x246d9971240>n”, “n”, “——————————————————————————-n”, “n”, “n”, “| Subtype | HDF5 name | McsPy name |\n", "===============================================================================\n", "ChannelStream\n", "| Digital | Digital Data | Digital_Data |\n", "-------------------------------------------------------------------------------\n", "EventStream\n", "| DigitalPort |EventTool @ Digital Data |EventTool_at_Digital_Data|n”, “——————————————————————————-n”, “SensorStreamn”, “| CMosSensor | Sensor Data | Sensor_Data |\n", "-------------------------------------------------------------------------------\n", "\n", "| Subtype | McsPy name | HDF5 name |\n", "=============================================================================================================\n", "SensorStream:\n", "| CMosSensor | Sensor_Data | Sensor Data |n”, “————————————————————————————————————-n”, “n”, “(205584, 65, 65)n”]
}
], “source”: [
“print(processed.Acquisition)n”, “print(processed.Acquisition.SensorStreams)n”, “print(processed.Acquisition.SensorStreams[0].SensorData[0].shape)”]
}, {
“cell_type”: “markdown”, “metadata”: {}, “source”: [
“For more details about the interaction with the Acquisition group, please refer to the <a href=’#RawData’>Raw Data</a> section above. Because it is a link to a different file, it is necessary that a file with the correct name is found in the same folder as the ProcessedData file.n”, “n”, “The other data sources correspond to different tools in the CMOS-MEA-Tools software. Please note that data sources are only present if they had been activated for the analysis in CMOS-MEA-Tools, so it is possible that other .cmtr files contain a different set of data sources.”]
}, {
“cell_type”: “markdown”, “metadata”: {
“pycharm”: {}}, “source”: [
“<a href=’#Top’>Back to index</a>”]
}, {
“cell_type”: “markdown”, “metadata”: {}, “source”: [
“### Filter Tool<a id=’filterTool’></a>n”, “n”, “The Filter_Tool contains the settings for the filter pipeline applied to the raw data in CMOS-MEA-Tools:”]
}, {
“cell_type”: “code”, “execution_count”: 21, “metadata”: {}, “outputs”: [
- {
“name”: “stdout”, “output_type”: “stream”, “text”: [
“——————————————————————————-n”, “Parent Group: <class ‘McsPyDataTools.McsPy.McsCMOSMEA.FilterTool’ object at 0x246d99718d0>n”, “——————————————————————————-n”, “n”, “n”, “| Mcs Type | HDF5 name | McsPy name |\n", "===============================================================================\n", "Groups:\n", "| PipeModel | Pipe | Pipe |\n", "-------------------------------------------------------------------------------\n", "Datasets:\n", "| SettingsFilterTool | SettingsFilterTool | SettingsFilterTool |n”, “n”, “Filter Order: 2n”, “Cutoff Frequency: 300.0 Hzn”]
}
], “source”: [
“print(processed.Filter_Tool)n”, “print(“Filter Order: ” + str(processed.Filter_Tool.Pipe[‘1 High-Pass’][‘Order’][0]))n”, “print(“Cutoff Frequency: ” + str(processed.Filter_Tool.Pipe[‘1 High-Pass’][‘CutOffFrequency’][0]) + ” Hz”)”]
}, {
“cell_type”: “markdown”, “metadata”: {
“pycharm”: {}}, “source”: [
“<a href=’#Top’>Back to index</a>”]
}, {
“cell_type”: “markdown”, “metadata”: {}, “source”: [
“### Spike Explorer<a id=’spikeExplorer’></a>n”, “n”, “The Spike_Explorer holds settings for the channel-wise spike detector in CMOS-MEA-Tools, as well as its detected spikes:”]
}, {
“cell_type”: “code”, “execution_count”: 22, “metadata”: {}, “outputs”: [
- {
“name”: “stdout”, “output_type”: “stream”, “text”: [
“——————————————————————————-n”, “Parent Group: <class ‘McsPyDataTools.McsPy.McsCMOSMEA.SpikeExplorer’ object at 0x246d97f6f60>n”, “——————————————————————————-n”, “n”, “n”, “| Mcs Type | HDF5 name | McsPy name |\n", "===============================================================================\n", "Groups:\n", " None\n", "-------------------------------------------------------------------------------\n", "Datasets:\n", "| SettingsMapCreator | SettingsMapCreator | SettingsMapCreator |\n", "| SettingsSpikeDetector | SettingsSpikeDetector | SettingsSpikeDetector |\n", "| SettingsSpikeExplorer | SettingsSpikeExplorer | SettingsSpikeExplorer |\n", "|SettingsSpikePeakActivity|SettingsSpikePeakActivity|SettingsSpikePeakActivity|n”, “| SpikeData | SpikeData | SpikeData |\n", "| SpikeMeta | SpikeMeta | SpikeMeta |n”, “n”]
}
], “source”: [
“print(processed.Spike_Explorer)”]
}, {
“cell_type”: “markdown”, “metadata”: {}, “source”: [
“The detection threshold and other details for the spike detector can be found in the SettingsSpikeDetector data set:”]
}, {
“cell_type”: “code”, “execution_count”: 23, “metadata”: {}, “outputs”: [
- {
- “data”: {
- “text/plain”: [
- “5.0”
]
}, “execution_count”: 23, “metadata”: {}, “output_type”: “execute_result”
}
], “source”: [
“processed.Spike_Explorer.SettingsSpikeDetector[‘Threshold’][0]”]
}, {
“cell_type”: “markdown”, “metadata”: {}, “source”: [
“The detected spikes are contained in the SpikeData dataset. It stores for each spike the SensorID of the detection location, the TimeStamp as the detection time in µs and an optional signal cutout around the spike timestamp:”]
}, {
“cell_type”: “code”, “execution_count”: 24, “metadata”: {}, “outputs”: [
- {
“name”: “stdout”, “output_type”: “stream”, “text”: [
“Compound McsDataset SpikeDatan”, “n”, “location in hdf5 file: /Spike Explorer/SpikeDatan”, “shape: /Spike Explorer/SpikeData(18486,)n”, “dtype: /Spike Explorer/SpikeData[(‘SensorID’, ‘<i4’), (‘TimeStamp’, ‘<i8’), (‘1’, ‘<f8’), (‘2’, ‘<f8’), (‘3’, ‘<f8’), (‘4’, ‘<f8’), (‘5’, ‘<f8’), (‘6’, ‘<f8’), (‘7’, ‘<f8’), (‘8’, ‘<f8’), (‘9’, ‘<f8’), (‘10’, ‘<f8’), (‘11’, ‘<f8’), (‘12’, ‘<f8’), (‘13’, ‘<f8’), (‘14’, ‘<f8’), (‘15’, ‘<f8’), (‘16’, ‘<f8’), (‘17’, ‘<f8’), (‘18’, ‘<f8’), (‘19’, ‘<f8’), (‘20’, ‘<f8’), (‘21’, ‘<f8’), (‘22’, ‘<f8’), (‘23’, ‘<f8’), (‘24’, ‘<f8’), (‘25’, ‘<f8’), (‘26’, ‘<f8’), (‘27’, ‘<f8’), (‘28’, ‘<f8’), (‘29’, ‘<f8’), (‘30’, ‘<f8’), (‘31’, ‘<f8’), (‘32’, ‘<f8’), (‘33’, ‘<f8’), (‘34’, ‘<f8’), (‘35’, ‘<f8’), (‘36’, ‘<f8’), (‘37’, ‘<f8’), (‘38’, ‘<f8’), (‘39’, ‘<f8’), (‘40’, ‘<f8’), (‘41’, ‘<f8’), (‘42’, ‘<f8’), (‘43’, ‘<f8’), (‘44’, ‘<f8’), (‘45’, ‘<f8’), (‘46’, ‘<f8’), (‘47’, ‘<f8’), (‘48’, ‘<f8’), (‘49’, ‘<f8’), (‘50’, ‘<f8’), (‘51’, ‘<f8’), (‘52’, ‘<f8’), (‘53’, ‘<f8’), (‘54’, ‘<f8’), (‘55’, ‘<f8’), (‘56’, ‘<f8’), (‘57’, ‘<f8’), (‘58’, ‘<f8’), (‘59’, ‘<f8’), (‘60’, ‘<f8’)]n”, “n”]
}
], “source”: [
“print(processed.Spike_Explorer.SpikeData)”]
}, {
“cell_type”: “markdown”, “metadata”: {}, “source”: [
“This allows us to do different visualizations of the spike data:”]
}, {
“cell_type”: “markdown”, “metadata”: {}, “source”: [
“#### Raster Plotn”, “n”, “We can generate a raster plot for one or more sensors:”]
}, {
“cell_type”: “code”, “execution_count”: 26, “metadata”: {}, “outputs”: [
- {
- “data”: {
- “application/javascript”: [
- “/* Put everything inside the global mpl namespace /n”, “window.mpl = {};n”, “n”, “n”, “mpl.get_websocket_type = function() {n”, ” if (typeof(WebSocket) !== ‘undefined’) {n”, ” return WebSocket;n”, ” } else if (typeof(MozWebSocket) !== ‘undefined’) {n”, ” return MozWebSocket;n”, ” } else {n”, ” alert(‘Your browser does not have WebSocket support. ‘ +n”, ” ‘Please try Chrome, Safari or Firefox ≥ 6. ‘ +n”, ” ‘Firefox 4 and 5 are also supported but you ‘ +n”, ” ‘have to enable WebSockets in about:config.’);n”, ” };n”, “}n”, “n”, “mpl.figure = function(figure_id, websocket, ondownload, parent_element) {n”, ” this.id = figure_id;n”, “n”, ” this.ws = websocket;n”, “n”, ” this.supports_binary = (this.ws.binaryType != undefined);n”, “n”, ” if (!this.supports_binary) {n”, ” var warnings = document.getElementById(“mpl-warnings”);n”, ” if (warnings) {n”, ” warnings.style.display = ‘block’;n”, ” warnings.textContent = (n”, ” “This browser does not support binary websocket messages. ” +n”, ” “Performance may be slow.”);n”, ” }n”, ” }n”, “n”, ” this.imageObj = new Image();n”, “n”, ” this.context = undefined;n”, ” this.message = undefined;n”, ” this.canvas = undefined;n”, ” this.rubberband_canvas = undefined;n”, ” this.rubberband_context = undefined;n”, ” this.format_dropdown = undefined;n”, “n”, ” this.image_mode = ‘full’;n”, “n”, ” this.root = $(‘<div/>’);n”, ” this._root_extra_style(this.root)n”, ” this.root.attr(‘style’, ‘display: inline-block’);n”, “n”, ” $(parent_element).append(this.root);n”, “n”, ” this._init_header(this);n”, ” this._init_canvas(this);n”, ” this._init_toolbar(this);n”, “n”, ” var fig = this;n”, “n”, ” this.waiting = false;n”, “n”, ” this.ws.onopen = function () {n”, ” fig.send_message(“supports_binary”, {value: fig.supports_binary});n”, ” fig.send_message(“send_image_mode”, {});n”, ” if (mpl.ratio != 1) {n”, ” fig.send_message(“set_dpi_ratio”, {‘dpi_ratio’: mpl.ratio});n”, ” }n”, ” fig.send_message(“refresh”, {});n”, ” }n”, “n”, ” this.imageObj.onload = function() {n”, ” if (fig.image_mode == ‘full’) {n”, ” // Full images could contain transparency (where diff imagesn”, ” // almost always do), so we need to clear the canvas so thatn”, ” // there is no ghosting.n”, ” fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);n”, ” }n”, ” fig.context.drawImage(fig.imageObj, 0, 0);n”, ” };n”, “n”, ” this.imageObj.onunload = function() {n”, ” fig.ws.close();n”, ” }n”, “n”, ” this.ws.onmessage = this._make_on_message_function(this);n”, “n”, ” this.ondownload = ondownload;n”, “}n”, “n”, “mpl.figure.prototype._init_header = function() {n”, ” var titlebar = $(n”, ” ‘<div class=”ui-dialog-titlebar ui-widget-header ui-corner-all ‘ +n”, ” ‘ui-helper-clearfix”/>’);n”, ” var titletext = $(n”, ” ‘<div class=”ui-dialog-title” style=”width: 100%; ‘ +n”, ” ‘text-align: center; padding: 3px;”/>’);n”, ” titlebar.append(titletext)n”, ” this.root.append(titlebar);n”, ” this.header = titletext[0];n”, “}n”, “n”, “n”, “n”, “mpl.figure.prototype._canvas_extra_style = function(canvas_div) {n”, “n”, “}n”, “n”, “n”, “mpl.figure.prototype._root_extra_style = function(canvas_div) {n”, “n”, “}n”, “n”, “mpl.figure.prototype._init_canvas = function() {n”, ” var fig = this;n”, “n”, ” var canvas_div = $(‘<div/>’);n”, “n”, ” canvas_div.attr(‘style’, ‘position: relative; clear: both; outline: 0’);n”, “n”, ” function canvas_keyboard_event(event) {n”, ” return fig.key_event(event, event[‘data’]);n”, ” }n”, “n”, ” canvas_div.keydown(‘key_press’, canvas_keyboard_event);n”, ” canvas_div.keyup(‘key_release’, canvas_keyboard_event);n”, ” this.canvas_div = canvas_divn”, ” 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 bandn”, ” // 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 updatedn”, ” // 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-buttonsn”, ” $( “.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 / mpl.ratio, fig.canvas.height / mpl.ratio);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 butn”, ” * transferred with MIME type text/plain:” errors onn”, ” * Chrome. But how to set the MIME type? It doesn’t seemn”, ” * 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 takesn”, ” // 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-canvasn”, “mpl.findpos = function(e) {n”, ” //this section is from http://www.quirksmode.org/js/events_properties.htmln”, ” 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 bugn”, ” targ = targ.parentNode;n”, “n”, ” // jQuery normalizes the pageX and pageYn”, ” // pageX,Y are the mouse positions relative to the documentn”, ” // offset() returns the position of the element relative to the documentn”, ” 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 keysn”, ” * we need this to avoid circular referencesn”, ” * http://stackoverflow.com/a/24161582/3208463n”, ” /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 ton”, ” * the text insertion cursor when the button is pressed. We wantn”, ” * to control all of the cursor setting manually through then”, ” * ‘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 eventn”, “}n”, “n”, “mpl.figure.prototype.key_event = function(event, name) {n”, “n”, ” // Prevent repeat eventsn”, ” if (name == ‘key_press’)n”, ” {n”, ” if (event.which === this._key)n”, ” return;n”, ” elsen”, ” this._key = event.which;n”, ” }n”, ” if (name == ‘key_release’)n”, ” this._key = null;n”, “n”, ” var value = ‘’;n”, ” if (event.ctrlKey && event.which != 17)n”, ” value += “ctrl+”;n”, ” if (event.altKey && event.which != 18)n”, ” value += “alt+”;n”, ” if (event.shiftKey && event.which != 16)n”, ” value += “shift+”;n”, “n”, ” value += ‘k’;n”, ” value += event.which.toString();n”, “n”, ” this._key_event_extra(event, name);n”, “n”, ” this.send_message(name, {key: value,n”, ” guiEvent: simpleKeys(event)});n”, ” return false;n”, “}n”, “n”, “mpl.figure.prototype.toolbar_button_onclick = function(name) {n”, ” if (name == ‘download’) {n”, ” this.handle_save(this, null);n”, ” } else {n”, ” this.send_message(“toolbar_button”, {name: name});n”, ” }n”, “};n”, “n”, “mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {n”, ” this.message.textContent = tooltip;n”, “};n”, “mpl.toolbar_items = [[“Home”, “Reset original view”, “fa fa-home icon-home”, “home”], [“Back”, “Back to previous view”, “fa fa-arrow-left icon-arrow-left”, “back”], [“Forward”, “Forward to next view”, “fa fa-arrow-right icon-arrow-right”, “forward”], [“”, “”, “”, “”], [“Pan”, “Pan axes with left mouse, zoom with right”, “fa fa-arrows icon-move”, “pan”], [“Zoom”, “Zoom to rectangle”, “fa fa-square-o icon-check-empty”, “zoom”], [“”, “”, “”, “”], [“Download”, “Download plot”, “fa fa-floppy-o icon-save”, “download”]];n”, “n”, “mpl.extensions = [“eps”, “jpeg”, “pdf”, “png”, “ps”, “raw”, “svg”, “tif”];n”, “n”, “mpl.default_extension = “png”;var comm_websocket_adapter = function(comm) {n”, ” // Create a “websocket”-like object which calls the given IPython commn”, ” // object with the appropriate methods. Currently this is a non binaryn”, ” // 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 processn”, ” // 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 Commn”, ” // 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 realn”, ” // 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.ration”, ” 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.ration”, ” 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 son”, ” // 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 = thisn”, ” 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 ‘focusablen”, ” el.attr(‘tabindex’, 0)n”, ” // reach out to IPython and tell the keyboard manager to turn it’s selfn”, ” // off when our div gets focusn”, “n”, ” // location in version 3n”, ” if (IPython.notebook.keyboard_manager) {n”, ” IPython.notebook.keyboard_manager.register_events(el);n”, ” }n”, ” else {n”, ” // location in version 2n”, ” 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+entern”, ” if (event.shiftKey && event.which == 13) {n”, ” this.canvas_div.blur();n”, ” event.shiftKey = false;n”, ” // Send a “J” for go to next celln”, ” event.which = 74;n”, ” event.keyCode = 74;n”, ” manager.command_mode();n”, ” manager.handle_keydown(event);n”, ” }n”, “}n”, “n”, “mpl.figure.prototype.handle_save = function(fig, msg) {n”, ” fig.ondownload(fig, null);n”, “}n”, “n”, “n”, “mpl.find_output_cell = function(html_output) {n”, ” // Return the cell and output element which can be found *uniquely in the notebook.n”, ” // Note - this is a bit hacky, but it is done because the “notebook_saving.Notebook”n”, ” // IPython event is triggered only after the cells have been serialised, which forn”, ” // 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 outputn”, ” 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”
}, {
}
], “source”: [
“sensors_to_plot = [611, 977, 1772, 4150]n”, “timestamps = processed.Spike_Explorer.get_spike_timestamps_at_sensors(sensors_to_plot)n”, “plt.figure(figsize=(12,5))n”, “_ = plt.eventplot(timestamps.values(), linelengths=0.8, colors=’k’)n”, “_ = plt.xlabel(‘Time (microsecond)’)n”, “_ = plt.ylabel(‘Sensor IDs’)n”, “_ = plt.yticks(labels=[str(s) for s in timestamps.keys()], ticks=range(len(sensors_to_plot)))n”, “_ = plt.title(‘Raster plot of spike timestamps’)”]
}, {
“cell_type”: “markdown”, “metadata”: {}, “source”: [
“#### Spike Countsn”, “n”, “Another option is to plot the spike counts for all sensors… the lighter, the more spikes were detected on the sensor:”]
}, {
“cell_type”: “code”, “execution_count”: 27, “metadata”: {}, “outputs”: [
- {
- “data”: {
- “application/javascript”: [
- “/* Put everything inside the global mpl namespace /n”, “window.mpl = {};n”, “n”, “n”, “mpl.get_websocket_type = function() {n”, ” if (typeof(WebSocket) !== ‘undefined’) {n”, ” return WebSocket;n”, ” } else if (typeof(MozWebSocket) !== ‘undefined’) {n”, ” return MozWebSocket;n”, ” } else {n”, ” alert(‘Your browser does not have WebSocket support. ‘ +n”, ” ‘Please try Chrome, Safari or Firefox ≥ 6. ‘ +n”, ” ‘Firefox 4 and 5 are also supported but you ‘ +n”, ” ‘have to enable WebSockets in about:config.’);n”, ” };n”, “}n”, “n”, “mpl.figure = function(figure_id, websocket, ondownload, parent_element) {n”, ” this.id = figure_id;n”, “n”, ” this.ws = websocket;n”, “n”, ” this.supports_binary = (this.ws.binaryType != undefined);n”, “n”, ” if (!this.supports_binary) {n”, ” var warnings = document.getElementById(“mpl-warnings”);n”, ” if (warnings) {n”, ” warnings.style.display = ‘block’;n”, ” warnings.textContent = (n”, ” “This browser does not support binary websocket messages. ” +n”, ” “Performance may be slow.”);n”, ” }n”, ” }n”, “n”, ” this.imageObj = new Image();n”, “n”, ” this.context = undefined;n”, ” this.message = undefined;n”, ” this.canvas = undefined;n”, ” this.rubberband_canvas = undefined;n”, ” this.rubberband_context = undefined;n”, ” this.format_dropdown = undefined;n”, “n”, ” this.image_mode = ‘full’;n”, “n”, ” this.root = $(‘<div/>’);n”, ” this._root_extra_style(this.root)n”, ” this.root.attr(‘style’, ‘display: inline-block’);n”, “n”, ” $(parent_element).append(this.root);n”, “n”, ” this._init_header(this);n”, ” this._init_canvas(this);n”, ” this._init_toolbar(this);n”, “n”, ” var fig = this;n”, “n”, ” this.waiting = false;n”, “n”, ” this.ws.onopen = function () {n”, ” fig.send_message(“supports_binary”, {value: fig.supports_binary});n”, ” fig.send_message(“send_image_mode”, {});n”, ” if (mpl.ratio != 1) {n”, ” fig.send_message(“set_dpi_ratio”, {‘dpi_ratio’: mpl.ratio});n”, ” }n”, ” fig.send_message(“refresh”, {});n”, ” }n”, “n”, ” this.imageObj.onload = function() {n”, ” if (fig.image_mode == ‘full’) {n”, ” // Full images could contain transparency (where diff imagesn”, ” // almost always do), so we need to clear the canvas so thatn”, ” // there is no ghosting.n”, ” fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);n”, ” }n”, ” fig.context.drawImage(fig.imageObj, 0, 0);n”, ” };n”, “n”, ” this.imageObj.onunload = function() {n”, ” fig.ws.close();n”, ” }n”, “n”, ” this.ws.onmessage = this._make_on_message_function(this);n”, “n”, ” this.ondownload = ondownload;n”, “}n”, “n”, “mpl.figure.prototype._init_header = function() {n”, ” var titlebar = $(n”, ” ‘<div class=”ui-dialog-titlebar ui-widget-header ui-corner-all ‘ +n”, ” ‘ui-helper-clearfix”/>’);n”, ” var titletext = $(n”, ” ‘<div class=”ui-dialog-title” style=”width: 100%; ‘ +n”, ” ‘text-align: center; padding: 3px;”/>’);n”, ” titlebar.append(titletext)n”, ” this.root.append(titlebar);n”, ” this.header = titletext[0];n”, “}n”, “n”, “n”, “n”, “mpl.figure.prototype._canvas_extra_style = function(canvas_div) {n”, “n”, “}n”, “n”, “n”, “mpl.figure.prototype._root_extra_style = function(canvas_div) {n”, “n”, “}n”, “n”, “mpl.figure.prototype._init_canvas = function() {n”, ” var fig = this;n”, “n”, ” var canvas_div = $(‘<div/>’);n”, “n”, ” canvas_div.attr(‘style’, ‘position: relative; clear: both; outline: 0’);n”, “n”, ” function canvas_keyboard_event(event) {n”, ” return fig.key_event(event, event[‘data’]);n”, ” }n”, “n”, ” canvas_div.keydown(‘key_press’, canvas_keyboard_event);n”, ” canvas_div.keyup(‘key_release’, canvas_keyboard_event);n”, ” this.canvas_div = canvas_divn”, ” 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 bandn”, ” // 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 updatedn”, ” // 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-buttonsn”, ” $( “.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 / mpl.ratio, fig.canvas.height / mpl.ratio);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 butn”, ” * transferred with MIME type text/plain:” errors onn”, ” * Chrome. But how to set the MIME type? It doesn’t seemn”, ” * 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 takesn”, ” // 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-canvasn”, “mpl.findpos = function(e) {n”, ” //this section is from http://www.quirksmode.org/js/events_properties.htmln”, ” 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 bugn”, ” targ = targ.parentNode;n”, “n”, ” // jQuery normalizes the pageX and pageYn”, ” // pageX,Y are the mouse positions relative to the documentn”, ” // offset() returns the position of the element relative to the documentn”, ” 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 keysn”, ” * we need this to avoid circular referencesn”, ” * http://stackoverflow.com/a/24161582/3208463n”, ” /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 ton”, ” * the text insertion cursor when the button is pressed. We wantn”, ” * to control all of the cursor setting manually through then”, ” * ‘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 eventn”, “}n”, “n”, “mpl.figure.prototype.key_event = function(event, name) {n”, “n”, ” // Prevent repeat eventsn”, ” if (name == ‘key_press’)n”, ” {n”, ” if (event.which === this._key)n”, ” return;n”, ” elsen”, ” this._key = event.which;n”, ” }n”, ” if (name == ‘key_release’)n”, ” this._key = null;n”, “n”, ” var value = ‘’;n”, ” if (event.ctrlKey && event.which != 17)n”, ” value += “ctrl+”;n”, ” if (event.altKey && event.which != 18)n”, ” value += “alt+”;n”, ” if (event.shiftKey && event.which != 16)n”, ” value += “shift+”;n”, “n”, ” value += ‘k’;n”, ” value += event.which.toString();n”, “n”, ” this._key_event_extra(event, name);n”, “n”, ” this.send_message(name, {key: value,n”, ” guiEvent: simpleKeys(event)});n”, ” return false;n”, “}n”, “n”, “mpl.figure.prototype.toolbar_button_onclick = function(name) {n”, ” if (name == ‘download’) {n”, ” this.handle_save(this, null);n”, ” } else {n”, ” this.send_message(“toolbar_button”, {name: name});n”, ” }n”, “};n”, “n”, “mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {n”, ” this.message.textContent = tooltip;n”, “};n”, “mpl.toolbar_items = [[“Home”, “Reset original view”, “fa fa-home icon-home”, “home”], [“Back”, “Back to previous view”, “fa fa-arrow-left icon-arrow-left”, “back”], [“Forward”, “Forward to next view”, “fa fa-arrow-right icon-arrow-right”, “forward”], [“”, “”, “”, “”], [“Pan”, “Pan axes with left mouse, zoom with right”, “fa fa-arrows icon-move”, “pan”], [“Zoom”, “Zoom to rectangle”, “fa fa-square-o icon-check-empty”, “zoom”], [“”, “”, “”, “”], [“Download”, “Download plot”, “fa fa-floppy-o icon-save”, “download”]];n”, “n”, “mpl.extensions = [“eps”, “jpeg”, “pdf”, “png”, “ps”, “raw”, “svg”, “tif”];n”, “n”, “mpl.default_extension = “png”;var comm_websocket_adapter = function(comm) {n”, ” // Create a “websocket”-like object which calls the given IPython commn”, ” // object with the appropriate methods. Currently this is a non binaryn”, ” // 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 processn”, ” // 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 Commn”, ” // 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 realn”, ” // 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.ration”, ” 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.ration”, ” 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 son”, ” // 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 = thisn”, ” 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 ‘focusablen”, ” el.attr(‘tabindex’, 0)n”, ” // reach out to IPython and tell the keyboard manager to turn it’s selfn”, ” // off when our div gets focusn”, “n”, ” // location in version 3n”, ” if (IPython.notebook.keyboard_manager) {n”, ” IPython.notebook.keyboard_manager.register_events(el);n”, ” }n”, ” else {n”, ” // location in version 2n”, ” 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+entern”, ” if (event.shiftKey && event.which == 13) {n”, ” this.canvas_div.blur();n”, ” event.shiftKey = false;n”, ” // Send a “J” for go to next celln”, ” event.which = 74;n”, ” event.keyCode = 74;n”, ” manager.command_mode();n”, ” manager.handle_keydown(event);n”, ” }n”, “}n”, “n”, “mpl.figure.prototype.handle_save = function(fig, msg) {n”, ” fig.ondownload(fig, null);n”, “}n”, “n”, “n”, “mpl.find_output_cell = function(html_output) {n”, ” // Return the cell and output element which can be found *uniquely in the notebook.n”, ” // Note - this is a bit hacky, but it is done because the “notebook_saving.Notebook”n”, ” // IPython event is triggered only after the cells have been serialised, which forn”, ” // 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 outputn”, ” 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”
}, {
}
], “source”: [
“ids_with_spikes, spike_counts = np.unique(processed.Spike_Explorer.SpikeData[‘SensorID’], return_counts=True)n”, “sensor_counts = np.zeros((65, 65))n”, “for i in range(len(ids_with_spikes)):n”, ” sensor = ids_with_spikes[i]n”, ” count = spike_counts[i]n”, ” row,col = (sensor-1) % 65, (sensor-1) // 65n”, ” sensor_counts[row,col] = countn”, “n”, “plt.figure(figsize=(10,10))n”, “_ = plt.imshow(sensor_counts)n”, “plt.set_cmap(“gray”)n”, “plt.title(‘Spike Counts’)n”, “plt.show()”]
}, {
“cell_type”: “markdown”, “metadata”: {}, “source”: [
“#### Spike Cutoutsn”, “n”, “Finally, we can also check out an overlay of the spike cutouts of a sensor:”]
}, {
“cell_type”: “code”, “execution_count”: 28, “metadata”: {}, “outputs”: [
- {
- “data”: {
- “application/javascript”: [
- “/* Put everything inside the global mpl namespace /n”, “window.mpl = {};n”, “n”, “n”, “mpl.get_websocket_type = function() {n”, ” if (typeof(WebSocket) !== ‘undefined’) {n”, ” return WebSocket;n”, ” } else if (typeof(MozWebSocket) !== ‘undefined’) {n”, ” return MozWebSocket;n”, ” } else {n”, ” alert(‘Your browser does not have WebSocket support. ‘ +n”, ” ‘Please try Chrome, Safari or Firefox ≥ 6. ‘ +n”, ” ‘Firefox 4 and 5 are also supported but you ‘ +n”, ” ‘have to enable WebSockets in about:config.’);n”, ” };n”, “}n”, “n”, “mpl.figure = function(figure_id, websocket, ondownload, parent_element) {n”, ” this.id = figure_id;n”, “n”, ” this.ws = websocket;n”, “n”, ” this.supports_binary = (this.ws.binaryType != undefined);n”, “n”, ” if (!this.supports_binary) {n”, ” var warnings = document.getElementById(“mpl-warnings”);n”, ” if (warnings) {n”, ” warnings.style.display = ‘block’;n”, ” warnings.textContent = (n”, ” “This browser does not support binary websocket messages. ” +n”, ” “Performance may be slow.”);n”, ” }n”, ” }n”, “n”, ” this.imageObj = new Image();n”, “n”, ” this.context = undefined;n”, ” this.message = undefined;n”, ” this.canvas = undefined;n”, ” this.rubberband_canvas = undefined;n”, ” this.rubberband_context = undefined;n”, ” this.format_dropdown = undefined;n”, “n”, ” this.image_mode = ‘full’;n”, “n”, ” this.root = $(‘<div/>’);n”, ” this._root_extra_style(this.root)n”, ” this.root.attr(‘style’, ‘display: inline-block’);n”, “n”, ” $(parent_element).append(this.root);n”, “n”, ” this._init_header(this);n”, ” this._init_canvas(this);n”, ” this._init_toolbar(this);n”, “n”, ” var fig = this;n”, “n”, ” this.waiting = false;n”, “n”, ” this.ws.onopen = function () {n”, ” fig.send_message(“supports_binary”, {value: fig.supports_binary});n”, ” fig.send_message(“send_image_mode”, {});n”, ” if (mpl.ratio != 1) {n”, ” fig.send_message(“set_dpi_ratio”, {‘dpi_ratio’: mpl.ratio});n”, ” }n”, ” fig.send_message(“refresh”, {});n”, ” }n”, “n”, ” this.imageObj.onload = function() {n”, ” if (fig.image_mode == ‘full’) {n”, ” // Full images could contain transparency (where diff imagesn”, ” // almost always do), so we need to clear the canvas so thatn”, ” // there is no ghosting.n”, ” fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);n”, ” }n”, ” fig.context.drawImage(fig.imageObj, 0, 0);n”, ” };n”, “n”, ” this.imageObj.onunload = function() {n”, ” fig.ws.close();n”, ” }n”, “n”, ” this.ws.onmessage = this._make_on_message_function(this);n”, “n”, ” this.ondownload = ondownload;n”, “}n”, “n”, “mpl.figure.prototype._init_header = function() {n”, ” var titlebar = $(n”, ” ‘<div class=”ui-dialog-titlebar ui-widget-header ui-corner-all ‘ +n”, ” ‘ui-helper-clearfix”/>’);n”, ” var titletext = $(n”, ” ‘<div class=”ui-dialog-title” style=”width: 100%; ‘ +n”, ” ‘text-align: center; padding: 3px;”/>’);n”, ” titlebar.append(titletext)n”, ” this.root.append(titlebar);n”, ” this.header = titletext[0];n”, “}n”, “n”, “n”, “n”, “mpl.figure.prototype._canvas_extra_style = function(canvas_div) {n”, “n”, “}n”, “n”, “n”, “mpl.figure.prototype._root_extra_style = function(canvas_div) {n”, “n”, “}n”, “n”, “mpl.figure.prototype._init_canvas = function() {n”, ” var fig = this;n”, “n”, ” var canvas_div = $(‘<div/>’);n”, “n”, ” canvas_div.attr(‘style’, ‘position: relative; clear: both; outline: 0’);n”, “n”, ” function canvas_keyboard_event(event) {n”, ” return fig.key_event(event, event[‘data’]);n”, ” }n”, “n”, ” canvas_div.keydown(‘key_press’, canvas_keyboard_event);n”, ” canvas_div.keyup(‘key_release’, canvas_keyboard_event);n”, ” this.canvas_div = canvas_divn”, ” 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 bandn”, ” // 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 updatedn”, ” // 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-buttonsn”, ” $( “.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 / mpl.ratio, fig.canvas.height / mpl.ratio);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 butn”, ” * transferred with MIME type text/plain:” errors onn”, ” * Chrome. But how to set the MIME type? It doesn’t seemn”, ” * 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 takesn”, ” // 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-canvasn”, “mpl.findpos = function(e) {n”, ” //this section is from http://www.quirksmode.org/js/events_properties.htmln”, ” 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 bugn”, ” targ = targ.parentNode;n”, “n”, ” // jQuery normalizes the pageX and pageYn”, ” // pageX,Y are the mouse positions relative to the documentn”, ” // offset() returns the position of the element relative to the documentn”, ” 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 keysn”, ” * we need this to avoid circular referencesn”, ” * http://stackoverflow.com/a/24161582/3208463n”, ” /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 ton”, ” * the text insertion cursor when the button is pressed. We wantn”, ” * to control all of the cursor setting manually through then”, ” * ‘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 eventn”, “}n”, “n”, “mpl.figure.prototype.key_event = function(event, name) {n”, “n”, ” // Prevent repeat eventsn”, ” if (name == ‘key_press’)n”, ” {n”, ” if (event.which === this._key)n”, ” return;n”, ” elsen”, ” this._key = event.which;n”, ” }n”, ” if (name == ‘key_release’)n”, ” this._key = null;n”, “n”, ” var value = ‘’;n”, ” if (event.ctrlKey && event.which != 17)n”, ” value += “ctrl+”;n”, ” if (event.altKey && event.which != 18)n”, ” value += “alt+”;n”, ” if (event.shiftKey && event.which != 16)n”, ” value += “shift+”;n”, “n”, ” value += ‘k’;n”, ” value += event.which.toString();n”, “n”, ” this._key_event_extra(event, name);n”, “n”, ” this.send_message(name, {key: value,n”, ” guiEvent: simpleKeys(event)});n”, ” return false;n”, “}n”, “n”, “mpl.figure.prototype.toolbar_button_onclick = function(name) {n”, ” if (name == ‘download’) {n”, ” this.handle_save(this, null);n”, ” } else {n”, ” this.send_message(“toolbar_button”, {name: name});n”, ” }n”, “};n”, “n”, “mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {n”, ” this.message.textContent = tooltip;n”, “};n”, “mpl.toolbar_items = [[“Home”, “Reset original view”, “fa fa-home icon-home”, “home”], [“Back”, “Back to previous view”, “fa fa-arrow-left icon-arrow-left”, “back”], [“Forward”, “Forward to next view”, “fa fa-arrow-right icon-arrow-right”, “forward”], [“”, “”, “”, “”], [“Pan”, “Pan axes with left mouse, zoom with right”, “fa fa-arrows icon-move”, “pan”], [“Zoom”, “Zoom to rectangle”, “fa fa-square-o icon-check-empty”, “zoom”], [“”, “”, “”, “”], [“Download”, “Download plot”, “fa fa-floppy-o icon-save”, “download”]];n”, “n”, “mpl.extensions = [“eps”, “jpeg”, “pdf”, “png”, “ps”, “raw”, “svg”, “tif”];n”, “n”, “mpl.default_extension = “png”;var comm_websocket_adapter = function(comm) {n”, ” // Create a “websocket”-like object which calls the given IPython commn”, ” // object with the appropriate methods. Currently this is a non binaryn”, ” // 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 processn”, ” // 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 Commn”, ” // 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 realn”, ” // 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.ration”, ” 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.ration”, ” 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 son”, ” // 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 = thisn”, ” 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 ‘focusablen”, ” el.attr(‘tabindex’, 0)n”, ” // reach out to IPython and tell the keyboard manager to turn it’s selfn”, ” // off when our div gets focusn”, “n”, ” // location in version 3n”, ” if (IPython.notebook.keyboard_manager) {n”, ” IPython.notebook.keyboard_manager.register_events(el);n”, ” }n”, ” else {n”, ” // location in version 2n”, ” 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+entern”, ” if (event.shiftKey && event.which == 13) {n”, ” this.canvas_div.blur();n”, ” event.shiftKey = false;n”, ” // Send a “J” for go to next celln”, ” event.which = 74;n”, ” event.keyCode = 74;n”, ” manager.command_mode();n”, ” manager.handle_keydown(event);n”, ” }n”, “}n”, “n”, “mpl.figure.prototype.handle_save = function(fig, msg) {n”, ” fig.ondownload(fig, null);n”, “}n”, “n”, “n”, “mpl.find_output_cell = function(html_output) {n”, ” // Return the cell and output element which can be found *uniquely in the notebook.n”, ” // Note - this is a bit hacky, but it is done because the “notebook_saving.Notebook”n”, ” // IPython event is triggered only after the cells have been serialised, which forn”, ” // 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 outputn”, ” 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”
}, {
}
], “source”: [
“cutouts = processed.Spike_Explorer.get_spike_cutouts_at_sensor(611)n”, “plt.figure(figsize=(12,8))n”, “_ = plt.plot(np.transpose(cutouts*1e-3), color=’k’, alpha=0.2)n”, “plt.xlabel(‘Samples’)n”, “plt.ylabel(‘Voltage (µV)’)n”, “plt.title(‘Spike Cutout Overlay’)n”, “plt.show()”]
}, {
“cell_type”: “markdown”, “metadata”: {
“pycharm”: {}}, “source”: [
“<a href=’#Top’>Back to index</a>”]
}, {
“cell_type”: “markdown”, “metadata”: {}, “source”: [
“### Network Explorer / STA Explorer<a id=’networkExplorer’></a>n”, “n”, “The Network_Explorer (this tool was called the STA_Explorer in earlier versions) contains datasets with spike-triggered averages. They represent the averaged activation on all sensors on the chip relative to the spiking activity of a single sensor/neuron and can be very useful to detect axonal propagation of spiking activity across the chip. n”, “n”, “The results of either the Spike_Explorer or the Spike_Sorter can serve as input to the Network_Explorer.n”, “n”, “The STA data is a block of data with dimensions samples x sensors_Y x sensors_X and can be visualized as a stack of 2-dimensional frames of a movie. “]
}, {
“cell_type”: “code”, “execution_count”: 29, “metadata”: {}, “outputs”: [
- {
- “data”: {
- “application/javascript”: [
- “/* Put everything inside the global mpl namespace /n”, “window.mpl = {};n”, “n”, “n”, “mpl.get_websocket_type = function() {n”, ” if (typeof(WebSocket) !== ‘undefined’) {n”, ” return WebSocket;n”, ” } else if (typeof(MozWebSocket) !== ‘undefined’) {n”, ” return MozWebSocket;n”, ” } else {n”, ” alert(‘Your browser does not have WebSocket support. ‘ +n”, ” ‘Please try Chrome, Safari or Firefox ≥ 6. ‘ +n”, ” ‘Firefox 4 and 5 are also supported but you ‘ +n”, ” ‘have to enable WebSockets in about:config.’);n”, ” };n”, “}n”, “n”, “mpl.figure = function(figure_id, websocket, ondownload, parent_element) {n”, ” this.id = figure_id;n”, “n”, ” this.ws = websocket;n”, “n”, ” this.supports_binary = (this.ws.binaryType != undefined);n”, “n”, ” if (!this.supports_binary) {n”, ” var warnings = document.getElementById(“mpl-warnings”);n”, ” if (warnings) {n”, ” warnings.style.display = ‘block’;n”, ” warnings.textContent = (n”, ” “This browser does not support binary websocket messages. ” +n”, ” “Performance may be slow.”);n”, ” }n”, ” }n”, “n”, ” this.imageObj = new Image();n”, “n”, ” this.context = undefined;n”, ” this.message = undefined;n”, ” this.canvas = undefined;n”, ” this.rubberband_canvas = undefined;n”, ” this.rubberband_context = undefined;n”, ” this.format_dropdown = undefined;n”, “n”, ” this.image_mode = ‘full’;n”, “n”, ” this.root = $(‘<div/>’);n”, ” this._root_extra_style(this.root)n”, ” this.root.attr(‘style’, ‘display: inline-block’);n”, “n”, ” $(parent_element).append(this.root);n”, “n”, ” this._init_header(this);n”, ” this._init_canvas(this);n”, ” this._init_toolbar(this);n”, “n”, ” var fig = this;n”, “n”, ” this.waiting = false;n”, “n”, ” this.ws.onopen = function () {n”, ” fig.send_message(“supports_binary”, {value: fig.supports_binary});n”, ” fig.send_message(“send_image_mode”, {});n”, ” if (mpl.ratio != 1) {n”, ” fig.send_message(“set_dpi_ratio”, {‘dpi_ratio’: mpl.ratio});n”, ” }n”, ” fig.send_message(“refresh”, {});n”, ” }n”, “n”, ” this.imageObj.onload = function() {n”, ” if (fig.image_mode == ‘full’) {n”, ” // Full images could contain transparency (where diff imagesn”, ” // almost always do), so we need to clear the canvas so thatn”, ” // there is no ghosting.n”, ” fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);n”, ” }n”, ” fig.context.drawImage(fig.imageObj, 0, 0);n”, ” };n”, “n”, ” this.imageObj.onunload = function() {n”, ” fig.ws.close();n”, ” }n”, “n”, ” this.ws.onmessage = this._make_on_message_function(this);n”, “n”, ” this.ondownload = ondownload;n”, “}n”, “n”, “mpl.figure.prototype._init_header = function() {n”, ” var titlebar = $(n”, ” ‘<div class=”ui-dialog-titlebar ui-widget-header ui-corner-all ‘ +n”, ” ‘ui-helper-clearfix”/>’);n”, ” var titletext = $(n”, ” ‘<div class=”ui-dialog-title” style=”width: 100%; ‘ +n”, ” ‘text-align: center; padding: 3px;”/>’);n”, ” titlebar.append(titletext)n”, ” this.root.append(titlebar);n”, ” this.header = titletext[0];n”, “}n”, “n”, “n”, “n”, “mpl.figure.prototype._canvas_extra_style = function(canvas_div) {n”, “n”, “}n”, “n”, “n”, “mpl.figure.prototype._root_extra_style = function(canvas_div) {n”, “n”, “}n”, “n”, “mpl.figure.prototype._init_canvas = function() {n”, ” var fig = this;n”, “n”, ” var canvas_div = $(‘<div/>’);n”, “n”, ” canvas_div.attr(‘style’, ‘position: relative; clear: both; outline: 0’);n”, “n”, ” function canvas_keyboard_event(event) {n”, ” return fig.key_event(event, event[‘data’]);n”, ” }n”, “n”, ” canvas_div.keydown(‘key_press’, canvas_keyboard_event);n”, ” canvas_div.keyup(‘key_release’, canvas_keyboard_event);n”, ” this.canvas_div = canvas_divn”, ” 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 bandn”, ” // 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 updatedn”, ” // 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-buttonsn”, ” $( “.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 / mpl.ratio, fig.canvas.height / mpl.ratio);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 butn”, ” * transferred with MIME type text/plain:” errors onn”, ” * Chrome. But how to set the MIME type? It doesn’t seemn”, ” * 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 takesn”, ” // 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-canvasn”, “mpl.findpos = function(e) {n”, ” //this section is from http://www.quirksmode.org/js/events_properties.htmln”, ” 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 bugn”, ” targ = targ.parentNode;n”, “n”, ” // jQuery normalizes the pageX and pageYn”, ” // pageX,Y are the mouse positions relative to the documentn”, ” // offset() returns the position of the element relative to the documentn”, ” 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 keysn”, ” * we need this to avoid circular referencesn”, ” * http://stackoverflow.com/a/24161582/3208463n”, ” /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 ton”, ” * the text insertion cursor when the button is pressed. We wantn”, ” * to control all of the cursor setting manually through then”, ” * ‘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 eventn”, “}n”, “n”, “mpl.figure.prototype.key_event = function(event, name) {n”, “n”, ” // Prevent repeat eventsn”, ” if (name == ‘key_press’)n”, ” {n”, ” if (event.which === this._key)n”, ” return;n”, ” elsen”, ” this._key = event.which;n”, ” }n”, ” if (name == ‘key_release’)n”, ” this._key = null;n”, “n”, ” var value = ‘’;n”, ” if (event.ctrlKey && event.which != 17)n”, ” value += “ctrl+”;n”, ” if (event.altKey && event.which != 18)n”, ” value += “alt+”;n”, ” if (event.shiftKey && event.which != 16)n”, ” value += “shift+”;n”, “n”, ” value += ‘k’;n”, ” value += event.which.toString();n”, “n”, ” this._key_event_extra(event, name);n”, “n”, ” this.send_message(name, {key: value,n”, ” guiEvent: simpleKeys(event)});n”, ” return false;n”, “}n”, “n”, “mpl.figure.prototype.toolbar_button_onclick = function(name) {n”, ” if (name == ‘download’) {n”, ” this.handle_save(this, null);n”, ” } else {n”, ” this.send_message(“toolbar_button”, {name: name});n”, ” }n”, “};n”, “n”, “mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {n”, ” this.message.textContent = tooltip;n”, “};n”, “mpl.toolbar_items = [[“Home”, “Reset original view”, “fa fa-home icon-home”, “home”], [“Back”, “Back to previous view”, “fa fa-arrow-left icon-arrow-left”, “back”], [“Forward”, “Forward to next view”, “fa fa-arrow-right icon-arrow-right”, “forward”], [“”, “”, “”, “”], [“Pan”, “Pan axes with left mouse, zoom with right”, “fa fa-arrows icon-move”, “pan”], [“Zoom”, “Zoom to rectangle”, “fa fa-square-o icon-check-empty”, “zoom”], [“”, “”, “”, “”], [“Download”, “Download plot”, “fa fa-floppy-o icon-save”, “download”]];n”, “n”, “mpl.extensions = [“eps”, “jpeg”, “pdf”, “png”, “ps”, “raw”, “svg”, “tif”];n”, “n”, “mpl.default_extension = “png”;var comm_websocket_adapter = function(comm) {n”, ” // Create a “websocket”-like object which calls the given IPython commn”, ” // object with the appropriate methods. Currently this is a non binaryn”, ” // 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 processn”, ” // 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 Commn”, ” // 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 realn”, ” // 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.ration”, ” 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.ration”, ” 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 son”, ” // 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 = thisn”, ” 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 ‘focusablen”, ” el.attr(‘tabindex’, 0)n”, ” // reach out to IPython and tell the keyboard manager to turn it’s selfn”, ” // off when our div gets focusn”, “n”, ” // location in version 3n”, ” if (IPython.notebook.keyboard_manager) {n”, ” IPython.notebook.keyboard_manager.register_events(el);n”, ” }n”, ” else {n”, ” // location in version 2n”, ” 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+entern”, ” if (event.shiftKey && event.which == 13) {n”, ” this.canvas_div.blur();n”, ” event.shiftKey = false;n”, ” // Send a “J” for go to next celln”, ” event.which = 74;n”, ” event.keyCode = 74;n”, ” manager.command_mode();n”, ” manager.handle_keydown(event);n”, ” }n”, “}n”, “n”, “mpl.figure.prototype.handle_save = function(fig, msg) {n”, ” fig.ondownload(fig, null);n”, “}n”, “n”, “n”, “mpl.find_output_cell = function(html_output) {n”, ” // Return the cell and output element which can be found *uniquely in the notebook.n”, ” // Note - this is a bit hacky, but it is done because the “notebook_saving.Notebook”n”, ” // IPython event is triggered only after the cells have been serialised, which forn”, ” // 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 outputn”, ” 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”: {
- “application/vnd.jupyter.widget-view+json”: {
- “model_id”: “38439d1047814efab300a1a31c8ec201”, “version_major”: 2, “version_minor”: 0
}, “text/plain”: [
“interactive(children=(IntSlider(value=0, description=’Frame’, max=79), Output()), _dom_classes=(‘widget-intera…”]
}, “metadata”: {}, “output_type”: “display_data”
}
], “source”: [
“%matplotlib notebookn”, “n”, “sta = processed.Network_Explorer.get_sta_entity_by_sourceID(14)n”, “n”, “images = sta.datan”, “num_of_images = images.shape[0]-1n”, “n”, “fig = plt.figure(figsize=(6,6))n”, “ax = fig.add_subplot(1,1,1)n”, “plt.title(‘STA Unit 14’)n”, “plt.box(False)n”, “fig.show()n”, “n”, “def updateFrame(Frame):n”, ” ax.imshow(np.transpose(images[Frame,::]), cmap=”gray”, vmin=np.amin(images), vmax=np.amax(images))n”, ” n”, “_ = interact(updateFrame, Frame=widgets.IntSlider(min=0,max=num_of_images,step=1,value=0))”]
}, {
“cell_type”: “markdown”, “metadata”: {}, “source”: [
“Network_Explorer data sources in files created by CMOS-MEA-Tools Version 2.4 and newer may contain axon tracking results in the processed.Network_Explorer.NeuralNetwork property. The extracted axon paths for individual units can be visualized like this:”]
}, {
“cell_type”: “code”, “execution_count”: 30, “metadata”: {}, “outputs”: [
- {
- “data”: {
- “application/javascript”: [
- “/* Put everything inside the global mpl namespace /n”, “window.mpl = {};n”, “n”, “n”, “mpl.get_websocket_type = function() {n”, ” if (typeof(WebSocket) !== ‘undefined’) {n”, ” return WebSocket;n”, ” } else if (typeof(MozWebSocket) !== ‘undefined’) {n”, ” return MozWebSocket;n”, ” } else {n”, ” alert(‘Your browser does not have WebSocket support. ‘ +n”, ” ‘Please try Chrome, Safari or Firefox ≥ 6. ‘ +n”, ” ‘Firefox 4 and 5 are also supported but you ‘ +n”, ” ‘have to enable WebSockets in about:config.’);n”, ” };n”, “}n”, “n”, “mpl.figure = function(figure_id, websocket, ondownload, parent_element) {n”, ” this.id = figure_id;n”, “n”, ” this.ws = websocket;n”, “n”, ” this.supports_binary = (this.ws.binaryType != undefined);n”, “n”, ” if (!this.supports_binary) {n”, ” var warnings = document.getElementById(“mpl-warnings”);n”, ” if (warnings) {n”, ” warnings.style.display = ‘block’;n”, ” warnings.textContent = (n”, ” “This browser does not support binary websocket messages. ” +n”, ” “Performance may be slow.”);n”, ” }n”, ” }n”, “n”, ” this.imageObj = new Image();n”, “n”, ” this.context = undefined;n”, ” this.message = undefined;n”, ” this.canvas = undefined;n”, ” this.rubberband_canvas = undefined;n”, ” this.rubberband_context = undefined;n”, ” this.format_dropdown = undefined;n”, “n”, ” this.image_mode = ‘full’;n”, “n”, ” this.root = $(‘<div/>’);n”, ” this._root_extra_style(this.root)n”, ” this.root.attr(‘style’, ‘display: inline-block’);n”, “n”, ” $(parent_element).append(this.root);n”, “n”, ” this._init_header(this);n”, ” this._init_canvas(this);n”, ” this._init_toolbar(this);n”, “n”, ” var fig = this;n”, “n”, ” this.waiting = false;n”, “n”, ” this.ws.onopen = function () {n”, ” fig.send_message(“supports_binary”, {value: fig.supports_binary});n”, ” fig.send_message(“send_image_mode”, {});n”, ” if (mpl.ratio != 1) {n”, ” fig.send_message(“set_dpi_ratio”, {‘dpi_ratio’: mpl.ratio});n”, ” }n”, ” fig.send_message(“refresh”, {});n”, ” }n”, “n”, ” this.imageObj.onload = function() {n”, ” if (fig.image_mode == ‘full’) {n”, ” // Full images could contain transparency (where diff imagesn”, ” // almost always do), so we need to clear the canvas so thatn”, ” // there is no ghosting.n”, ” fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);n”, ” }n”, ” fig.context.drawImage(fig.imageObj, 0, 0);n”, ” };n”, “n”, ” this.imageObj.onunload = function() {n”, ” fig.ws.close();n”, ” }n”, “n”, ” this.ws.onmessage = this._make_on_message_function(this);n”, “n”, ” this.ondownload = ondownload;n”, “}n”, “n”, “mpl.figure.prototype._init_header = function() {n”, ” var titlebar = $(n”, ” ‘<div class=”ui-dialog-titlebar ui-widget-header ui-corner-all ‘ +n”, ” ‘ui-helper-clearfix”/>’);n”, ” var titletext = $(n”, ” ‘<div class=”ui-dialog-title” style=”width: 100%; ‘ +n”, ” ‘text-align: center; padding: 3px;”/>’);n”, ” titlebar.append(titletext)n”, ” this.root.append(titlebar);n”, ” this.header = titletext[0];n”, “}n”, “n”, “n”, “n”, “mpl.figure.prototype._canvas_extra_style = function(canvas_div) {n”, “n”, “}n”, “n”, “n”, “mpl.figure.prototype._root_extra_style = function(canvas_div) {n”, “n”, “}n”, “n”, “mpl.figure.prototype._init_canvas = function() {n”, ” var fig = this;n”, “n”, ” var canvas_div = $(‘<div/>’);n”, “n”, ” canvas_div.attr(‘style’, ‘position: relative; clear: both; outline: 0’);n”, “n”, ” function canvas_keyboard_event(event) {n”, ” return fig.key_event(event, event[‘data’]);n”, ” }n”, “n”, ” canvas_div.keydown(‘key_press’, canvas_keyboard_event);n”, ” canvas_div.keyup(‘key_release’, canvas_keyboard_event);n”, ” this.canvas_div = canvas_divn”, ” 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 bandn”, ” // 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 updatedn”, ” // 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-buttonsn”, ” $( “.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 / mpl.ratio, fig.canvas.height / mpl.ratio);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 butn”, ” * transferred with MIME type text/plain:” errors onn”, ” * Chrome. But how to set the MIME type? It doesn’t seemn”, ” * 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 takesn”, ” // 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-canvasn”, “mpl.findpos = function(e) {n”, ” //this section is from http://www.quirksmode.org/js/events_properties.htmln”, ” 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 bugn”, ” targ = targ.parentNode;n”, “n”, ” // jQuery normalizes the pageX and pageYn”, ” // pageX,Y are the mouse positions relative to the documentn”, ” // offset() returns the position of the element relative to the documentn”, ” 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 keysn”, ” * we need this to avoid circular referencesn”, ” * http://stackoverflow.com/a/24161582/3208463n”, ” /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 ton”, ” * the text insertion cursor when the button is pressed. We wantn”, ” * to control all of the cursor setting manually through then”, ” * ‘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 eventn”, “}n”, “n”, “mpl.figure.prototype.key_event = function(event, name) {n”, “n”, ” // Prevent repeat eventsn”, ” if (name == ‘key_press’)n”, ” {n”, ” if (event.which === this._key)n”, ” return;n”, ” elsen”, ” this._key = event.which;n”, ” }n”, ” if (name == ‘key_release’)n”, ” this._key = null;n”, “n”, ” var value = ‘’;n”, ” if (event.ctrlKey && event.which != 17)n”, ” value += “ctrl+”;n”, ” if (event.altKey && event.which != 18)n”, ” value += “alt+”;n”, ” if (event.shiftKey && event.which != 16)n”, ” value += “shift+”;n”, “n”, ” value += ‘k’;n”, ” value += event.which.toString();n”, “n”, ” this._key_event_extra(event, name);n”, “n”, ” this.send_message(name, {key: value,n”, ” guiEvent: simpleKeys(event)});n”, ” return false;n”, “}n”, “n”, “mpl.figure.prototype.toolbar_button_onclick = function(name) {n”, ” if (name == ‘download’) {n”, ” this.handle_save(this, null);n”, ” } else {n”, ” this.send_message(“toolbar_button”, {name: name});n”, ” }n”, “};n”, “n”, “mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {n”, ” this.message.textContent = tooltip;n”, “};n”, “mpl.toolbar_items = [[“Home”, “Reset original view”, “fa fa-home icon-home”, “home”], [“Back”, “Back to previous view”, “fa fa-arrow-left icon-arrow-left”, “back”], [“Forward”, “Forward to next view”, “fa fa-arrow-right icon-arrow-right”, “forward”], [“”, “”, “”, “”], [“Pan”, “Pan axes with left mouse, zoom with right”, “fa fa-arrows icon-move”, “pan”], [“Zoom”, “Zoom to rectangle”, “fa fa-square-o icon-check-empty”, “zoom”], [“”, “”, “”, “”], [“Download”, “Download plot”, “fa fa-floppy-o icon-save”, “download”]];n”, “n”, “mpl.extensions = [“eps”, “jpeg”, “pdf”, “png”, “ps”, “raw”, “svg”, “tif”];n”, “n”, “mpl.default_extension = “png”;var comm_websocket_adapter = function(comm) {n”, ” // Create a “websocket”-like object which calls the given IPython commn”, ” // object with the appropriate methods. Currently this is a non binaryn”, ” // 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 processn”, ” // 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 Commn”, ” // 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 realn”, ” // 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.ration”, ” 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.ration”, ” 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 son”, ” // 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 = thisn”, ” 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 ‘focusablen”, ” el.attr(‘tabindex’, 0)n”, ” // reach out to IPython and tell the keyboard manager to turn it’s selfn”, ” // off when our div gets focusn”, “n”, ” // location in version 3n”, ” if (IPython.notebook.keyboard_manager) {n”, ” IPython.notebook.keyboard_manager.register_events(el);n”, ” }n”, ” else {n”, ” // location in version 2n”, ” 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+entern”, ” if (event.shiftKey && event.which == 13) {n”, ” this.canvas_div.blur();n”, ” event.shiftKey = false;n”, ” // Send a “J” for go to next celln”, ” event.which = 74;n”, ” event.keyCode = 74;n”, ” manager.command_mode();n”, ” manager.handle_keydown(event);n”, ” }n”, “}n”, “n”, “mpl.figure.prototype.handle_save = function(fig, msg) {n”, ” fig.ondownload(fig, null);n”, “}n”, “n”, “n”, “mpl.find_output_cell = function(html_output) {n”, ” // Return the cell and output element which can be found *uniquely in the notebook.n”, ” // Note - this is a bit hacky, but it is done because the “notebook_saving.Notebook”n”, ” // IPython event is triggered only after the cells have been serialised, which forn”, ” // 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 outputn”, ” 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”: {
- “application/vnd.jupyter.widget-view+json”: {
- “model_id”: “cd31ecab59334d92980f6c65b7cbc9ee”, “version_major”: 2, “version_minor”: 0
}, “text/plain”: [
“interactive(children=(IntSlider(value=0, description=’Frame’, max=79), Output()), _dom_classes=(‘widget-intera…”]
}, “metadata”: {}, “output_type”: “display_data”
}
], “source”: [
“%matplotlib notebookn”, “n”, “import matplotlib.lines as mlinesn”, “n”, “sta = processed.Network_Explorer.get_sta_entity_by_sourceID(14)n”, “n”, “images = sta.datan”, “num_of_images = images.shape[0]-1n”, “n”, “fig = plt.figure(figsize=(6,6))n”, “ax = fig.add_subplot(1,1,1)n”, “plt.title(‘STA Unit 14’)n”, “plt.box(False)n”, “fig.show()n”, “n”, “def updateFrame(Frame):n”, ” last_sensor = (sta.sensor_coordinates[1], sta.sensor_coordinates[0])n”, ” ax.imshow(np.transpose(images[Frame,::]), cmap=”gray”, vmin=np.amin(images), vmax=np.amax(images))n”, ” ax.add_artist(plt.Circle(last_sensor, 2))n”, ” for step in sta.axon:n”, ” ax.add_line(mlines.Line2D([last_sensor[0]-1, step[0]-1], [last_sensor[1]-1, step[1]-1]))n”, ” last_sensor = stepn”, ” n”, “_ = interact(updateFrame, Frame=widgets.IntSlider(min=0,max=num_of_images,step=1,value=0))”]
}, {
“cell_type”: “markdown”, “metadata”: {
“pycharm”: {}}, “source”: [
“<a href=’#Top’>Back to index</a>”]
}, {
“cell_type”: “markdown”, “metadata”: {}, “source”: [
“### Spike Sorter<a id=’spikeSorter’></a>n”, “n”, “The Spike_Sorter data source contains neuronal units as the result of the CMOS-MEA-Tools spike sorting. Each unit is represented by its own group in the data source, while quality measures and other meta data for all units are contained in the Spike_Sorter.Units data set. “]
}, {
“cell_type”: “code”, “execution_count”: 31, “metadata”: {}, “outputs”: [
- {
“name”: “stdout”, “output_type”: “stream”, “text”: [
“——————————————————————————-n”, “Parent Group: <class ‘McsPyDataTools.McsPy.McsCMOSMEA.SpikeSorter’ object at 0x246dcd71080>n”, “——————————————————————————-n”, “n”, “n”, “| Mcs Type | HDF5 name | McsPy name |\n", "===============================================================================\n", "Groups:\n", "| SingleUnit | Unit 1 | Unit_1 |\n", "| SingleUnit | Unit 10 | Unit_10 |\n", "| SingleUnit | Unit 11 | Unit_11 |\n", "| SingleUnit | Unit 12 | Unit_12 |\n", "| SingleUnit | Unit 13 | Unit_13 |\n", "| SingleUnit | Unit 14 | Unit_14 |\n", "| SingleUnit | Unit 15 | Unit_15 |\n", "| SingleUnit | Unit 16 | Unit_16 |\n", "| SingleUnit | Unit 17 | Unit_17 |\n", "| SingleUnit | Unit 18 | Unit_18 |\n", "| SingleUnit | Unit 19 | Unit_19 |\n", "| SingleUnit | Unit 2 | Unit_2 |\n", "| SingleUnit | Unit 20 | Unit_20 |\n", "| SingleUnit | Unit 21 | Unit_21 |\n", "| SingleUnit | Unit 22 | Unit_22 |\n", "| SingleUnit | Unit 23 | Unit_23 |\n", "| SingleUnit | Unit 24 | Unit_24 |\n", "| SingleUnit | Unit 25 | Unit_25 |\n", "| SingleUnit | Unit 26 | Unit_26 |\n", "| SingleUnit | Unit 27 | Unit_27 |\n", "| SingleUnit | Unit 28 | Unit_28 |\n", "| SingleUnit | Unit 29 | Unit_29 |\n", "| SingleUnit | Unit 3 | Unit_3 |\n", "| SingleUnit | Unit 30 | Unit_30 |\n", "| SingleUnit | Unit 31 | Unit_31 |\n", "| SingleUnit | Unit 32 | Unit_32 |\n", "| SingleUnit | Unit 33 | Unit_33 |\n", "| SingleUnit | Unit 34 | Unit_34 |\n", "| SingleUnit | Unit 35 | Unit_35 |\n", "| SingleUnit | Unit 36 | Unit_36 |\n", "| SingleUnit | Unit 37 | Unit_37 |\n", "| SingleUnit | Unit 38 | Unit_38 |\n", "| SingleUnit | Unit 39 | Unit_39 |\n", "| SingleUnit | Unit 4 | Unit_4 |\n", "| SingleUnit | Unit 40 | Unit_40 |\n", "| SingleUnit | Unit 41 | Unit_41 |\n", "| SingleUnit | Unit 42 | Unit_42 |\n", "| SingleUnit | Unit 43 | Unit_43 |\n", "| SingleUnit | Unit 44 | Unit_44 |\n", "| SingleUnit | Unit 45 | Unit_45 |\n", "| SingleUnit | Unit 46 | Unit_46 |\n", "| SingleUnit | Unit 47 | Unit_47 |\n", "| SingleUnit | Unit 48 | Unit_48 |\n", "| SingleUnit | Unit 49 | Unit_49 |\n", "| SingleUnit | Unit 5 | Unit_5 |\n", "| SingleUnit | Unit 50 | Unit_50 |\n", "| SingleUnit | Unit 51 | Unit_51 |\n", "| SingleUnit | Unit 52 | Unit_52 |\n", "| SingleUnit | Unit 53 | Unit_53 |\n", "| SingleUnit | Unit 54 | Unit_54 |\n", "| SingleUnit | Unit 55 | Unit_55 |\n", "| SingleUnit | Unit 56 | Unit_56 |\n", "| SingleUnit | Unit 57 | Unit_57 |\n", "| SingleUnit | Unit 58 | Unit_58 |\n", "| SingleUnit | Unit 59 | Unit_59 |\n", "| SingleUnit | Unit 6 | Unit_6 |\n", "| SingleUnit | Unit 60 | Unit_60 |\n", "| SingleUnit | Unit 61 | Unit_61 |\n", "| SingleUnit | Unit 62 | Unit_62 |\n", "| SingleUnit | Unit 63 | Unit_63 |\n", "| SingleUnit | Unit 64 | Unit_64 |\n", "| SingleUnit | Unit 65 | Unit_65 |\n", "| SingleUnit | Unit 66 | Unit_66 |\n", "| SingleUnit | Unit 67 | Unit_67 |\n", "| SingleUnit | Unit 68 | Unit_68 |\n", "| SingleUnit | Unit 69 | Unit_69 |\n", "| SingleUnit | Unit 7 | Unit_7 |\n", "| SingleUnit | Unit 70 | Unit_70 |\n", "| SingleUnit | Unit 71 | Unit_71 |\n", "| SingleUnit | Unit 72 | Unit_72 |\n", "| SingleUnit | Unit 73 | Unit_73 |\n", "| SingleUnit | Unit 74 | Unit_74 |\n", "| SingleUnit | Unit 75 | Unit_75 |\n", "| SingleUnit | Unit 76 | Unit_76 |\n", "| SingleUnit | Unit 77 | Unit_77 |\n", "| SingleUnit | Unit 78 | Unit_78 |\n", "| SingleUnit | Unit 79 | Unit_79 |\n", "| SingleUnit | Unit 8 | Unit_8 |\n", "| SingleUnit | Unit 80 | Unit_80 |\n", "| SingleUnit | Unit 81 | Unit_81 |\n", "| SingleUnit | Unit 82 | Unit_82 |\n", "| SingleUnit | Unit 83 | Unit_83 |\n", "| SingleUnit | Unit 84 | Unit_84 |\n", "| SingleUnit | Unit 85 | Unit_85 |\n", "| SingleUnit | Unit 86 | Unit_86 |\n", "| SingleUnit | Unit 87 | Unit_87 |\n", "| SingleUnit | Unit 88 | Unit_88 |\n", "| SingleUnit | Unit 89 | Unit_89 |\n", "| SingleUnit | Unit 9 | Unit_9 |\n", "| SingleUnit | Unit 90 | Unit_90 |\n", "-------------------------------------------------------------------------------\n", "Datasets:\n", "| Projection Matrix | Projection Matrix | Projection_Matrix |\n", "| SettingsPeakDetection | SettingsPeakDetection | SettingsPeakDetection |\n", "| SettingsPostProcessing | SettingsPostProcessing | SettingsPostProcessing |\n", "| SettingsRoiDetection | SettingsRoiDetection | SettingsRoiDetection |\n", "| SettingsSorterComputing | SettingsSorterComputing | SettingsSorterComputing |\n", "| SettingsSorterGeneral | SettingsSorterGeneral | SettingsSorterGeneral |\n", "| SettingsSpikeSorter | SettingsSpikeSorter | SettingsSpikeSorter |\n", "| Units | Units | Units |n”, “n”]
}
], “source”: [
“print(processed.Spike_Sorter)”]
}, {
“cell_type”: “markdown”, “metadata”: {}, “source”: [
“For ease of use, some convenience functions are available to access units and quality measures:”]
}, {
“cell_type”: “code”, “execution_count”: 38, “metadata”: {}, “outputs”: [
- {
- “data”: {
- “text/plain”: [
- “[‘SDScore’,n”, ” ‘AmplitudeSD’,n”, ” ‘RSTD’,n”, ” ‘Separability’,n”, ” ‘IsoINN’,n”, ” ‘IsoIBg’,n”, ” ‘NoiseStd’,n”, ” ‘SNR’,n”, ” ‘Skewness’,n”, ” ‘Kurtosis’,n”, ” ‘IcaConverged’,n”, ” ‘IcaIterations’]”
]
}, “execution_count”: 38, “metadata”: {}, “output_type”: “execute_result”
}
], “source”: [
“processed.Spike_Sorter.get_units_by_id() # lists all units, ordered by unit idn”, “processed.Spike_Sorter.get_units_by_measure(‘Kurtosis’) # lists all units ordered by the given quality measuren”, “processed.Spike_Sorter.get_unit_measures() # lists all quality measures”]
}, {
“cell_type”: “markdown”, “metadata”: {}, “source”: [
“Each unit contains 5 data sets:n”, “- Peaks: Contains all peaks detected in the Source signal, including peaks below the spike detection threshold. This is necessary for the automatic spike threshold estimation in the CMOS-MEA-Tools Spike Sorter. For peaks larger than the spike detection threshold, their ‘IncludePeak’ flag is set to 1.n”, “- RoiSTAs: Contains the spike triggered averages for the subset of sensors comprising the “ROI” of the unit. The spike-triggered average is computed by taking the timestamp of all Peaks where ‘IncludePeak’ is set, extracting a signal cutout for all sensors in the unit ROI around each timestamp and averaging these cutouts over all timestamps. The STA dimensions are channels x samples.n”, “- Source: Contains the dimensionless source signal for the unit in ICA space.n”, “- Unit_Info: Contains the meta data for the unit, including its quality measuresn”, “- Unmixing: Contains a channels x embedding matrix that represents the projection from raw channel data to ICA space. Creating embedding many sample-shifted copies of the raw data for all channels in the unit ROI and then multiplying this with the Unmixing matrix will create the Source signal.”]
}, {
“cell_type”: “code”, “execution_count”: 4, “metadata”: {}, “outputs”: [
- {
- “data”: {
- “text/plain”: [
- “7.64561711669349”
]
}, “execution_count”: 4, “metadata”: {}, “output_type”: “execute_result”
}
], “source”: [
“unit = processed.Spike_Sorter.get_unit(14) # get unit by unit idn”, “unit.get_measure(‘Separability’)”]
}, {
“cell_type”: “markdown”, “metadata”: {
“pycharm”: {}}, “source”: [
“<a href=’#Top’>Back to index</a>”]
}, {
“cell_type”: “markdown”, “metadata”: {}, “source”: [
“#### Sourcen”, “n”, “The source signal has no associated units but can be drawn like any other sampled signal.”]
}, {
“cell_type”: “code”, “execution_count”: 13, “metadata”: {}, “outputs”: [
- {
- “data”: {
“image/png”: “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G7arr75a27Tuuece1KpVS9v0/KpZs2bcIQTGcwBl+r//+7+4QyDNhg8fHncIoXNTePpDRDqLSLmSf50B/Bl2YPlsr732KvX3ueeei3vuucd2+NWrV4cdkhHq1asXdwgFIR9uwJKqZcuWoU27fHmnbvv+x+sb3tQblxYtWniOKYhx48Zh2bJlvsc/++yztcVSsWJF9OrVK+dwp512mrZ5WmnUqFGo0w/Lr7/+GncIgbBWhH7t2rUDULr2CZmlefPmvsZLbVsAePTRR3WFYxQ3haerAVyC4g5ylwO4qOQ78kkpVerv888/P1HVmTp27JioeE115ZVXxjLfoUOHonLlyrHMO84L5Q033KB1eldccYXncY444gjP41SrVs3VcJlP9P3Mx8n06dPx+eefa51mLqeddhr2339/X+P+9NNP6NixIwYNGqQlluOOOw4VKlTARRdd5DicmwJWECKCjRs3aplWUVGRlum4sd9++0Uyn/fffz/wNPbee+8y340bNy7wdAtJuXLlXA/LN5HmGjNmTPqzl+1UoUKF9Oc+ffpojckUOQtPSqnFSqm2SqkaSqn9lFIXKKUWRRFcocguTFkJ+6J8+OGHux5WRLB161Yt861SpYqW6aR07dq11N9RFPJOPvnkMt+1bds253iZVRajctVVV+G8887DvHnztE+7SZMmjr/feuutxtyE6Die/Fz0/RRaFy5c6Gq4zHiuueYaV8O5dfTRR6Nq1aquh7/00ks9TT/7uA2qcePGANwXPHNxu86OOuooLfNziiO75kKQaTVo0EDLtDLdd9992qfpxqOPPor27dsHns65555b5rsaNWrg888/d/1msUePHjmH6d69u6uq6p06dXI1Ty+uuuoq7dMMKvOG24mu/T/Tzp07tU/Ti+OOOy70ebi5z8ym+/4sn9gWnkTkXod//aIMMt/42YkvvfTSUuP94x//8D3/888/v8x3Bx54YJnv+vfvX+a7SpUqoW/fvpbT3WOPPTzHcv/99wPIfVNZu3ZtV9PLXrdRvGE56KCDynx3+eWX5xzP7Q2jrrYWr7zyCoYOHep7fKv9JlOuuutPPfUU6tSp43v+2Z555hnf4w4YMMD1sDVqWDfx9FMI6dy5M+6//34ccID7hKVeCi0plSpV8nU8+nXBBReU+vuEE06IbN5O/va3v2md3rPPPlvq7+yHAWE/RXcz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Cgrw73//27H0yF1nn3220b3oUbA0b94cX375pe4wfC0vL493eYkCyrXKk1JqUBpf+wBAq5j3LQFU7d/0UwANRKSWdfcp3jxElIbS0lIcOHBAdxiuKSsrQ35+vu4wXJGXlwcAaNiwoeZIiOiLL77QHQIRucS0ZntPAbhERHJFpA2ADgDKYmdQkcuvLwG4yJo0AUCiO1lEaevUqROAyPNZVV1//fXIysrCgAEDvA7LVdu2bcOnn36qOwzX9O7dG8XFxbrDcEWPHj2wbNkyrFy5UncoRKFXu3Zt9sJIFFBaul0SkdEAHgDQCMCzIlKulBqilNorImsB7APwHYCpSqlj1neeAzBRKfUhgBkA1ojIzwH8GcD/6lgPCrbJkyejW7duOOOMM6p91qdPHxw7dkxDVETxiQgmTZqkOwwiIqJA01J5Uko9AeCJBJ/dCeDOONOHxfz/Lqr0wkepa9o08kjahAkTNEdiJhGJW3EiIr1WrFiBGTNmoKCgQHcoREQUMhzwI8QKCwvx3//+l+O+UChFBzjt04fXYfxm3LhxGDdunO4wiIgohHjWHHI5OTm6QyDSIicnB2VlZSgqKso4rdzcXAciIiIiItOx8kREodW7d++M09i3bx9OPPFEB6IhIiIi07HyRES+cNVVV2Ho0KG6w6imc+fOukMgIiIij7DyRES+8NBDD+kOgYiIqEKjRo0AsOl22LDyRERERESUol//+tdYs2YNTjvtNN2hkIdYeSIiIiIiSlFhYSGmTJmiOwzyWJbuAIiIiIiIiPyAlSciIiIiIiIbWHkiIiIiIiKygZUnIiKiKrKzs3WHQEREBmKHEUQOKisrw5YtW3SHQURpysnJwezZs3HhhRfqDoWIiAwkSindMXimV69easeOHbrDICIiIiIiQ4nITqVUr3ifsdkeERERERGRDaw8ERERERER2cDKExERERERkQ2sPBEREREREdnAyhMREREREZENrDwRERERERHZwMoTERERERGRDaw8ERERERER2cDKExERERERkQ2sPBEREREREdnAyhMREREREZENrDwRERERERHZwMoTERERERGRDaKU0h2DZ0TkEwD/pzsOS0MAn+oOgigFzLPkN8yz5CfMr+Q3Qc6zrZVSjeJ9EKrKk0lEZIdSqpfuOIjsYp4lv2GeJT9hfiW/CWueZbM9IiIiIiIiG1h5IiIi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n”, “text/plain”: [
“<Figure size 1008x432 with 1 Axes>”]
}, “metadata”: {
“needs_background”: “light”}, “output_type”: “display_data”
}
], “source”: [
“plt.figure(figsize=(14, 6))n”, “plt.plot(unit.Source, ‘k’)n”, “plt.ylabel(‘No Unit’)n”, “plt.xlabel(‘Time in timesteps’)n”, “_ = plt.title(‘Source Signal’)”]
}, {
“cell_type”: “markdown”, “metadata”: {
“pycharm”: {}}, “source”: [
“<a href=’#Top’>Back to index</a>”]
}, {
“cell_type”: “markdown”, “metadata”: {}, “source”: [
“#### Peaksn”, “n”, “We can easily visualize the detected peaks in the source signal as a cutout overlay”]
}, {
“cell_type”: “code”, “execution_count”: 7, “metadata”: {}, “outputs”: [
- {
- “data”: {
“image/png”: “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n”, “text/plain”: [
“<Figure size 576x432 with 1 Axes>”]
}, “metadata”: {
“needs_background”: “light”}, “output_type”: “display_data”
}
], “source”: [
“cutouts = unit.get_peaks_cutouts()n”, “plt.figure(figsize=(8,6))n”, “_ = plt.plot(np.transpose(cutouts*1e-3), color=’k’, alpha=0.2)n”, “plt.xlabel(‘Samples’)n”, “plt.ylabel(‘No Unit’)n”, “plt.title(‘Spike Cutout Overlay’)n”, “plt.show()”]
}, {
“cell_type”: “markdown”, “metadata”: {
“pycharm”: {}}, “source”: [
“<a href=’#Top’>Back to index</a>”]
}
], “metadata”: {
- “kernelspec”: {
- “display_name”: “Python 3”, “language”: “python”, “name”: “python3”
}, “language_info”: {
- “codemirror_mode”: {
- “name”: “ipython”, “version”: 3
}, “file_extension”: “.py”, “mimetype”: “text/x-python”, “name”: “python”, “nbconvert_exporter”: “python”, “pygments_lexer”: “ipython3”, “version”: “3.7.0”
}
}, “nbformat”: 4, “nbformat_minor”: 1
}