diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 42b79b6a..6d579490 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -55,6 +55,23 @@ jobs: uses: codecov/codecov-action@v3 with: fail_ci_if_error: false + + examples: + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v2 + - name: Set up Python 3.9 + uses: actions/setup-python@v2 + with: + python-version: "3.9" + - name: Install dependencies + run: | + python -m pip install --upgrade pip setuptools + pip install tox-gh-actions + - name: Run tox + run: | + tox -e examples + docs: runs-on: ubuntu-22.04 steps: diff --git a/.gitignore b/.gitignore index 2d5b6ec6..e1249fdf 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,4 @@ bin *.ipynb_checkpoints lib fllog.txt +*.DS_Store \ No newline at end of file diff --git a/examples/basic/basic_notebook1.ipynb b/examples/basic/basic_notebook1.ipynb index c5f10581..650e0d35 100644 --- a/examples/basic/basic_notebook1.ipynb +++ b/examples/basic/basic_notebook1.ipynb @@ -1,6 +1,7 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -12,6 +13,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": { "collapsed": false @@ -22,45 +24,38 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Requirement already satisfied (use --upgrade to upgrade): efel in /usr/local/lib/python2.7/site-packages\r\n", - "Requirement already satisfied (use --upgrade to upgrade): json2html in /usr/local/lib/python2.7/site-packages\r\n", - "Requirement already satisfied (use --upgrade to upgrade): numpy>=1.6 in /usr/local/lib/python2.7/site-packages (from efel)\r\n" - ] - } - ], + "outputs": [], "source": [ "!pip install efel json2html\n", "import efel\n", "\n", - "import urllib, numpy, IPython\n", + "import numpy, IPython\n", "from json2html import *\n", "\n", "%matplotlib notebook\n", + "%matplotlib inline\n", "from matplotlib import pyplot as plt\n", "plt.rcParams['figure.figsize'] = 10, 10" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ - "## Fetching the data" + "## Loading the data" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ - "We will fetch the data from the test directory in the eFEL Github repository. The data consists of a text file with the first column being the time points and the second the membrane voltage (in respectively, ms and mV)" + "The data consists of a text file with the first column being the time points and the second the membrane voltage (in respectively, ms and mV)" ] }, { @@ -69,13 +64,14 @@ "metadata": {}, "outputs": [], "source": [ - "test_url = 'https://raw.githubusercontent.com/BlueBrain/eFEL/master/tests/testdata/allfeatures/testdata.txt'\n", - "test_data = numpy.loadtxt(urllib.request.urlopen(test_url))\n", + "test_url = '../../tests/testdata/allfeatures/testdata.txt'\n", + "test_data = numpy.loadtxt(test_url)\n", "time = test_data[:,0]\n", "voltage = test_data[:, 1]" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -91,21 +87,9 @@ "outputs": [ { "data": { - "application/javascript": "/* Put everything inside the global mpl namespace */\nwindow.mpl = {};\n\nmpl.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\nmpl.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 = $('
');\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 fig.send_message(\"refresh\", {});\n }\n\n this.imageObj.onload = function() {\n if (fig.image_mode == 'full') {\n // Full images could contain transparency (where diff images\n // almost always do), so we need to clear the canvas so that\n // there is no ghosting.\n fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n }\n fig.context.drawImage(fig.imageObj, 0, 0);\n };\n\n this.imageObj.onunload = function() {\n this.ws.close();\n }\n\n this.ws.onmessage = this._make_on_message_function(this);\n\n this.ondownload = ondownload;\n}\n\nmpl.figure.prototype._init_header = function() {\n var titlebar = $(\n '
');\n var titletext = $(\n '
');\n titlebar.append(titletext)\n this.root.append(titlebar);\n this.header = titletext[0];\n}\n\n\n\nmpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n\n}\n\n\nmpl.figure.prototype._root_extra_style = function(canvas_div) {\n\n}\n\nmpl.figure.prototype._init_canvas = function() {\n var fig = this;\n\n var canvas_div = $('
');\n\n canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n\n function canvas_keyboard_event(event) {\n return fig.key_event(event, event['data']);\n }\n\n canvas_div.keydown('key_press', canvas_keyboard_event);\n canvas_div.keyup('key_release', canvas_keyboard_event);\n this.canvas_div = canvas_div\n this._canvas_extra_style(canvas_div)\n this.root.append(canvas_div);\n\n var canvas = $('');\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 rubberband = $('');\n rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n\n var pass_mouse_events = true;\n\n canvas_div.resizable({\n start: function(event, ui) {\n pass_mouse_events = false;\n },\n resize: function(event, ui) {\n fig.request_resize(ui.size.width, ui.size.height);\n },\n stop: function(event, ui) {\n pass_mouse_events = true;\n fig.request_resize(ui.size.width, ui.size.height);\n },\n });\n\n function mouse_event_fn(event) {\n if (pass_mouse_events)\n return fig.mouse_event(event, event['data']);\n }\n\n rubberband.mousedown('button_press', mouse_event_fn);\n rubberband.mouseup('button_release', mouse_event_fn);\n // Throttle sequential mouse events to 1 every 20ms.\n rubberband.mousemove('motion_notify', mouse_event_fn);\n\n rubberband.mouseenter('figure_enter', mouse_event_fn);\n rubberband.mouseleave('figure_leave', mouse_event_fn);\n\n canvas_div.on(\"wheel\", function (event) {\n event = event.originalEvent;\n event['data'] = 'scroll'\n if (event.deltaY < 0) {\n event.step = 1;\n } else {\n event.step = -1;\n }\n mouse_event_fn(event);\n });\n\n canvas_div.append(canvas);\n canvas_div.append(rubberband);\n\n this.rubberband = rubberband;\n this.rubberband_canvas = rubberband[0];\n this.rubberband_context = rubberband[0].getContext(\"2d\");\n this.rubberband_context.strokeStyle = \"#000000\";\n\n this._resize_canvas = function(width, height) {\n // Keep the size of the canvas, canvas container, and rubber band\n // canvas in synch.\n canvas_div.css('width', width)\n canvas_div.css('height', height)\n\n canvas.attr('width', width);\n canvas.attr('height', height);\n\n rubberband.attr('width', width);\n rubberband.attr('height', height);\n }\n\n // Set the figure to an initial 600x600px, this will subsequently be updated\n // upon first draw.\n this._resize_canvas(600, 600);\n\n // Disable right mouse context menu.\n $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n return false;\n });\n\n function set_focus () {\n canvas.focus();\n canvas_div.focus();\n }\n\n window.setTimeout(set_focus, 100);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('
')\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 = $('');\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 = $('');\n nav_element.append(status_bar);\n this.message = status_bar[0];\n\n // Add the close button to the window.\n var buttongrp = $('
');\n var 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\nmpl.figure.prototype._root_extra_style = function(el){\n var fig = this\n el.on(\"remove\", function(){\n\tfig.close_ws(fig, {});\n });\n}\n\nmpl.figure.prototype._canvas_extra_style = function(el){\n // this is important to make the div 'focusable\n el.attr('tabindex', 0)\n // reach out to IPython and tell the keyboard manager to turn it's self\n // off when our div gets focus\n\n // location in version 3\n if (IPython.notebook.keyboard_manager) {\n IPython.notebook.keyboard_manager.register_events(el);\n }\n else {\n // location in version 2\n IPython.keyboard_manager.register_events(el);\n }\n\n}\n\nmpl.figure.prototype._key_event_extra = function(event, name) {\n var manager = IPython.notebook.keyboard_manager;\n if (!manager)\n manager = IPython.keyboard_manager;\n\n // Check for shift+enter\n if (event.shiftKey && event.which == 13) {\n this.canvas_div.blur();\n event.shiftKey = false;\n // Send a \"J\" for go to next cell\n event.which = 74;\n event.keyCode = 74;\n manager.command_mode();\n manager.handle_keydown(event);\n }\n}\n\nmpl.figure.prototype.handle_save = function(fig, msg) {\n fig.ondownload(fig, null);\n}\n\n\nmpl.find_output_cell = function(html_output) {\n // Return the cell and output element which can be found *uniquely* in the notebook.\n // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n // IPython event is triggered only after the cells have been serialised, which for\n // our purposes (turning an active figure into a static one), is too late.\n var cells = IPython.notebook.get_cells();\n var ncells = cells.length;\n for (var i=0; i= 3 moved mimebundle to data attribute of output\n data = data.data;\n }\n if (data['text/html'] == html_output) {\n return [cell, data, j];\n }\n }\n }\n }\n}\n\n// Register the function which deals with the matplotlib target/channel.\n// The kernel may be null if the page has been refreshed.\nif (IPython.notebook.kernel != null) {\n IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n}\n", + "image/png": "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13/+53/qsMMOU319vX7zm99o2bJlmjp1qlpaWiRJ9fX1gz6vvr4+cV9LS4vGjBkz6P7CwkJVV1cnHoPRl473VpKuuOIKfehDH1J1dbVefvllXXfdddq+fbvuvPPOUf16EHOw93U4Wlpa5PF49rmw7/3eY3Sl472VpC984QuaOHGixo0bp1WrVumaa67RunXr9Pjjj2eweuxPsu9rX1+frrnmGp1zzjkqLy+XxHU2G6XjfZW4xmaj4b63Tz75pD7/+c8rEAho7NixevbZZ1VbWyspe/7O0qkaZb/+9a9lmqbGjx8vr9ern/70pzrnnHPkcvFW5Lp0vLdXXnmlTj75ZM2ZM0eXXnqpfvjDH+pnP/uZgsFgBivHgfB31rnS8d5ecsklWrhwoWbPnq0vfvGLeuihh/SHP/xB7733XgYrx4EM930Nh8M666yzZJqmfvGLX9hULYYrHe8r19jsNJz39pRTTtGKFSv08ssv66Mf/ajOOuss7dixw8aq98W/CkbZIYccohdeeEE9PT3avHmzXn31VYXDYU2ZMkUNDQ2StM9UsNbW1sR9DQ0N+/xP1N/fr/b29sRjYI9U39uhHH300erv79cHH3yQydJxAAd6X4ejoaFBoVBIHR0dg24/2HuPzEv1vR3K0UcfLUnasGFDuspEkobzvlr/8N60aZOeffbZQd0MrrPZKdX3dShcY7PDcN5bn8+nqVOn6phjjtF9992nwsJC3XfffZKy5+8socomPp9PY8eO1e7du/X000/rk5/8pCZPnqyGhgY999xzicd1dXXplVde0fz58yVJ8+fPV0dHh954443EY55//nlFo9HExRz2Gul7O5QVK1bI5XLt09bG6BvqfR2OI488Um63e9B7v27dOjU3Nx/wvcfoGel7OxRr7PrYsWPTVB1Gan/vq/UP7/Xr1+tvf/ubampqBn0e19nsNtL3dShcY7NLMt+Lo9FoosOYLX9nDdM0zVF7Nejpp5+WaZqaMWOGNmzYoKuvvlpFRUVaunSp3G63vve97+n222/Xgw8+qMmTJ+uGG27QqlWrtHbt2sQmvjPOOEOtra26++67FQ6HdeGFF+qoo47SI488YvNXl99SfW+XLVumV155RaeccorKysq0bNkyLV68WGeccYYefPBBu7+8vHWw97W9vV3Nzc3atm2bPv7xj+t///d/NWPGDDU0NCR+QvaVr3xFf/nLX/TAAw+ovLw8McL35ZdftvNLy3upvrfvvfeeHnnkEX3sYx9TTU2NVq1apcWLF6uxsVEvvPCC3V9e3jrQ+ypJn/3sZ7V8+XI9+eSTg/a5VldXy+PxSOI6m41SfV+5xmavA723oVBIt9xyi84880yNHTtWu3bt0l133aVHHnlEb7zxhmbNmiUpS/7OjtqcQZimaZqPPvqoOWXKFNPj8ZgNDQ3mZZddZnZ0dCTuj0aj5g033GDW19ebXq/XPO2008x169YNeo62tjbznHPOMUtLS83y8nLzwgsvNLu7u0f7S8FeUn1v33jjDfPoo482KyoqzKKiIvOwww4zb731VrOvr8+OLwdxB3tff/WrX5mS9vm46aabEo/p7e01v/rVr5pVVVVmSUmJ+elPf9rcvn27DV8N9pTqe9vc3GyeeOKJZnV1ten1es2pU6eaV199tdnZ2WnTVwTTPPD7ao3HH+pjyZIliefgOpt9Un1fucZmrwO9t729veanP/1pc9y4cabH4zHHjh1rnnnmmearr7466Dmy4e8snSoAAAAASAF7qgAAAAAgBYQqAAAAAEgBoQoAAAAAUkCoAgAAAIAUEKoAAAAAIAWEKgAAAABIAaEKAAAAAFJAqAIAAACAFBCqAAA55YILLtCnPvUp217/vPPO06233pqx51+7dq0aGxvl9/sz9hoAgPQyTNM07S4CAABJMgzjgPffdNNNWrx4sUzTVGVl5egUtYeVK1fq1FNP1aZNm1RaWpqx1/nsZz+ruXPn6oYbbsjYawAA0odQBQDIGi0tLYlfP/roo7rxxhu1bt26xG2lpaUZDTMH8+Uvf1mFhYW6++67M/o6f/7zn3XxxRerublZhYWFGX0tAEDqWP4HAMgaDQ0NiY+KigoZhjHottLS0n2W/5188sm6/PLL9fWvf11VVVWqr6/XvffeK7/frwsvvFBlZWWaOnWqnnrqqUGv9dZbb+mMM85QaWmp6uvrdd5552nXrl37rS0Siej3v/+9PvGJTwy6fdKkSbr55pt1/vnnq7S0VBMnTtT//d//aefOnfrkJz+p0tJSzZkzR6+//nriczZt2qRPfOITqqqqks/n06xZs/SXv/wlcf9HPvIRtbe364UXXkjxTxQAMBoIVQCAnPfggw+qtrZWr776qi6//HJ95Stf0ec+9zkde+yxWr58uU4//XSdd955CgQCkqSOjg6deuqpOuKII/T666/rr3/9q1pbW3XWWWft9zVWrVqlzs5OHXXUUfvc96Mf/UjHHXec3nzzTX384x/Xeeedp/PPP1/nnnuuli9frkMOOUTnn3++rMUhl112mYLBoF588UWtXr1a3/ve9wZ14Dwej+bNm6elS5em+U8KAJAJhCoAQM6bO3euvvWtb2natGm67rrrVFRUpNraWl188cWaNm2abrzxRrW1tWnVqlWSpJ///Oc64ogjdOutt+rQQw/VEUccofvvv19LlizRu+++O+RrbNq0SQUFBRozZsw+933sYx/Tv//7vydeq6urS//yL/+iz33uc5o+fbquueYavf3222ptbZUkNTc367jjjtPs2bM1ZcoU/eu//qtOPPHEQc85btw4bdq0Kc1/UgCATCBUAQBy3pw5cxK/LigoUE1NjWbPnp24rb6+XpK0Y8cOSbGBE0uWLEns0SotLdWhhx4qSXrvvfeGfI3e3l55vd4hh2ns+frWax3o9a+44grdfPPNOu6443TTTTclwt6eiouLE501AEB2I1QBAHKe2+0e9HvDMAbdZgWhaDQqSerp6dEnPvEJrVixYtDH+vXr9+kYWWpraxUIBBQKhQ74+tZrHej1v/zlL+v999/Xeeedp9WrV+uoo47Sz372s0HP2d7errq6uuH9AQAAbEWoAgDknQ996ENas2aNJk2apKlTpw768Pl8Q37OvHnzJMXOkUqHpqYmXXrppXr88cd11VVX6d577x10/1tvvaUjjjgiLa8FAMgsQhUAIO9cdtllam9v1znnnKPXXntN7733np5++mldeOGFikQiQ35OXV2dPvShD+mll15K+fW//vWv6+mnn9bGjRu1fPlyLVmyRIcddlji/g8++EBbt27VggULUn4tAEDmEaoAAHln3Lhx+sc//qFIJKLTTz9ds2fP1te//nVVVlbK5dr/pfHLX/6yHn744ZRfPxKJ6LLLLtNhhx2mj370o5o+fbr+67/+K3H/b37zG51++umaOHFiyq8FAMg8Dv8FAGCYent7NWPGDD366KOaP39+Rl4jFApp2rRpeuSRR3Tcccdl5DUAAOlFpwoAgGEqLi7WQw89dMBDglPV3Nys//f//h+BCgByCJ0qAAAAAEgBnSoAAAAASAGhCgAAAABSQKgCAAAAgBQQqgAAAAAgBYQqAAAAAEgBoQoAAAAAUkCoAgAAAIAUEKoAAAAAIAWEKgAAAABIwf8HkZdJc4n/Gb8AAAAASUVORK5CYII=", "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "" - ], - "text/plain": [ - "" + "
" ] }, "metadata": {}, @@ -169,6 +142,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -176,6 +150,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -198,6 +173,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -214,7 +190,7 @@ { "data": { "text/html": [ - "
AP_amplitude
  • 72.5782441262
  • 46.3672552618
  • 41.1546679158
  • 39.7631750953
  • 36.1614653031
  • 37.8489295737
AP_begin_time
  • 706.8
  • 909.8
  • 1404.3
  • 1710.3
  • 2385.7
  • 2636.0
peak_voltage
  • 18.7490200995
  • 9.26229141264
  • 5.71846652014
  • 5.84323464261
  • 3.56232022925
  • 4.47506990872
AP_begin_width
  • 4.7
  • 4.4
  • 4.7
  • 4.6
  • 4.8
  • 5.0
mean_frequency
  • 3.09629476726
AP_begin_voltage
  • -53.8292240267
  • -37.1049638492
  • -35.4362013957
  • -33.9199404527
  • -32.5991450739
  • -33.373859665
peak_time
  • 708.0
  • 911.3
  • 1406.0
  • 1712.0
  • 2387.5
  • 2637.8
" + "
AP_amplitude
  • 72.57824412616736
  • 46.36725526181844
  • 41.154667915823914
  • 39.76317509528857
  • 36.161465303116316
  • 37.848929573728334
peak_time
  • 708.0000000000924
  • 911.3000000001387
  • 1405.9999999998167
  • 1711.9999999995384
  • 2387.499999998924
  • 2637.7999999986964
peak_voltage
  • 18.74902009950373
  • 9.262291412641208
  • 5.71846652014266
  • 5.843234642606939
  • 3.562320229253816
  • 4.475069908715679
AP_begin_time
  • 706.8000000000922
  • 909.8000000001383
  • 1404.2999999998183
  • 1710.29999999954
  • 2385.6999999989257
  • 2635.999999998698
AP_begin_width
  • 4.700000000001069
  • 4.4000000000010004
  • 4.699999999995725
  • 4.599999999995816
  • 4.799999999995634
  • 4.9999999999954525
AP_begin_voltage
  • -53.82922402666364
  • -37.10496384917723
  • -35.43620139568125
  • -33.91994045268163
  • -32.5991450738625
  • -33.37385966501265
mean_frequency
  • 3.096294767263926
" ], "text/plain": [ "" @@ -233,6 +209,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -241,28 +218,16 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "data": { - "application/javascript": "/* Put everything inside the global mpl namespace */\nwindow.mpl = {};\n\nmpl.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\nmpl.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 = $('
');\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 fig.send_message(\"refresh\", {});\n }\n\n this.imageObj.onload = function() {\n if (fig.image_mode == 'full') {\n // Full images could contain transparency (where diff images\n // almost always do), so we need to clear the canvas so that\n // there is no ghosting.\n fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n }\n fig.context.drawImage(fig.imageObj, 0, 0);\n };\n\n this.imageObj.onunload = function() {\n this.ws.close();\n }\n\n this.ws.onmessage = this._make_on_message_function(this);\n\n this.ondownload = ondownload;\n}\n\nmpl.figure.prototype._init_header = function() {\n var titlebar = $(\n '
');\n var titletext = $(\n '
');\n titlebar.append(titletext)\n this.root.append(titlebar);\n this.header = titletext[0];\n}\n\n\n\nmpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n\n}\n\n\nmpl.figure.prototype._root_extra_style = function(canvas_div) {\n\n}\n\nmpl.figure.prototype._init_canvas = function() {\n var fig = this;\n\n var canvas_div = $('
');\n\n canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n\n function canvas_keyboard_event(event) {\n return fig.key_event(event, event['data']);\n }\n\n canvas_div.keydown('key_press', canvas_keyboard_event);\n canvas_div.keyup('key_release', canvas_keyboard_event);\n this.canvas_div = canvas_div\n this._canvas_extra_style(canvas_div)\n this.root.append(canvas_div);\n\n var canvas = $('');\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 rubberband = $('');\n rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n\n var pass_mouse_events = true;\n\n canvas_div.resizable({\n start: function(event, ui) {\n pass_mouse_events = false;\n },\n resize: function(event, ui) {\n fig.request_resize(ui.size.width, ui.size.height);\n },\n stop: function(event, ui) {\n pass_mouse_events = true;\n fig.request_resize(ui.size.width, ui.size.height);\n },\n });\n\n function mouse_event_fn(event) {\n if (pass_mouse_events)\n return fig.mouse_event(event, event['data']);\n }\n\n rubberband.mousedown('button_press', mouse_event_fn);\n rubberband.mouseup('button_release', mouse_event_fn);\n // Throttle sequential mouse events to 1 every 20ms.\n rubberband.mousemove('motion_notify', mouse_event_fn);\n\n rubberband.mouseenter('figure_enter', mouse_event_fn);\n rubberband.mouseleave('figure_leave', mouse_event_fn);\n\n canvas_div.on(\"wheel\", function (event) {\n event = event.originalEvent;\n event['data'] = 'scroll'\n if (event.deltaY < 0) {\n event.step = 1;\n } else {\n event.step = -1;\n }\n mouse_event_fn(event);\n });\n\n canvas_div.append(canvas);\n canvas_div.append(rubberband);\n\n this.rubberband = rubberband;\n this.rubberband_canvas = rubberband[0];\n this.rubberband_context = rubberband[0].getContext(\"2d\");\n this.rubberband_context.strokeStyle = \"#000000\";\n\n this._resize_canvas = function(width, height) {\n // Keep the size of the canvas, canvas container, and rubber band\n // canvas in synch.\n canvas_div.css('width', width)\n canvas_div.css('height', height)\n\n canvas.attr('width', width);\n canvas.attr('height', height);\n\n rubberband.attr('width', width);\n rubberband.attr('height', height);\n }\n\n // Set the figure to an initial 600x600px, this will subsequently be updated\n // upon first draw.\n this._resize_canvas(600, 600);\n\n // Disable right mouse context menu.\n $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n return false;\n });\n\n function set_focus () {\n canvas.focus();\n canvas_div.focus();\n }\n\n window.setTimeout(set_focus, 100);\n}\n\nmpl.figure.prototype._init_toolbar = function() {\n var fig = this;\n\n var nav_element = $('
')\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 = $('