From 4c8cf48c913f763bdb216d88c505958e9eb17a76 Mon Sep 17 00:00:00 2001 From: jaseg Date: Fri, 18 May 2018 11:02:17 +0200 Subject: [PATCH] Add one more RGB spectrum run --- firmware/Spectrum Measurement.ipynb | 3570 ++------------------------- firmware/measure_spectrum.py | 12 +- firmware/spectra.sqlite3 | Bin 12288 -> 98304 bytes 3 files changed, 159 insertions(+), 3423 deletions(-) diff --git a/firmware/Spectrum Measurement.ipynb b/firmware/Spectrum Measurement.ipynb index 66818a9..516321b 100644 --- a/firmware/Spectrum Measurement.ipynb +++ b/firmware/Spectrum Measurement.ipynb @@ -33,939 +33,90 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 71, "metadata": { "collapsed": true }, "outputs": [], "source": [ - "def load_run(run_id):\n", - " data = db.execute('SELECT step, voltage, voltage_stdev FROM measurements WHERE run_id = ? AND led_on = 1 ORDER BY step ASC', (run_id,)).fetchall()\n", - " return zip(*data)" + "def load_run(capture_id, gain, zero_cal=False):\n", + " if zero_cal:\n", + " data = db.execute('SELECT a.step, a.voltage, a.voltage_stdev, b.voltage, b.voltage_stdev '\n", + " 'FROM measurements a JOIN measurements b USING (step) '\n", + " 'WHERE a.capture_id = ?1 AND a.led_on = 1 AND b.capture_id = ?1 AND b.led_on = 0 '\n", + " 'ORDER BY step ASC', (capture_id,)).fetchall()\n", + " steps, voltages, voltage_stdevs, zero_voltages, zero_stdevs = map(np.array, zip(*data))\n", + " else:\n", + " data = db.execute('SELECT step, voltage, voltage_stdev '\n", + " 'FROM measurements '\n", + " 'WHERE capture_id = ? AND led_on = 1 '\n", + " 'ORDER BY step ASC', (capture_id,)).fetchall()\n", + " steps, voltages, voltage_stdevs = map(np.array, zip(*data))\n", + " zero_voltages = zero_stdevs = np.zeros(len(steps))\n", + " \n", + " return (steps,\n", + " (voltages-zero_voltages)/gain*1e9, # nanoamps\n", + " np.sqrt(np.square(voltage_stdevs) + np.square(zero_stdevs))/gain*1e9) #nanoamps" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 94, "metadata": { "collapsed": true }, "outputs": [], "source": [ - "def load_run_zero_cal(run_id, max_stdev=1e10):\n", - " data = db.execute('SELECT a.step, a.voltage, a.voltage_stdev, b.voltage, b.voltage_stdev '\n", - " 'FROM measurements a JOIN measurements b USING (step) '\n", - " 'WHERE a.run_id = ?1 AND a.led_on = 1 AND b.run_id = ?1 AND b.led_on = 0 '\n", - " 'AND a.voltage_stdev < ?2 AND b.voltage_stdev < ?2'\n", - " 'ORDER BY step ASC', (run_id, max_stdev)).fetchall()\n", - " steps, voltages, voltage_stdevs, zero_voltages, zero_stdevs = map(np.array, zip(*data))\n", - " return steps, voltages-zero_voltages, np.sqrt(np.square(voltage_stdevs) + np.square(zero_stdevs))" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "def plot_rgb(id_r, id_g, id_b, loader=load_run):\n", - " fig, ax = plt.subplots(1, 1)\n", - " fig.suptitle('Runs {}, {}, {} at {:%y-%m-%d %H:%M:%S}'.format(id_r, id_g, id_b, datetime.now()))\n", - " for run_id, color in [(id_g, 'green'), (id_r, 'red'), (id_b, 'blue')]:\n", - " steps, values, stdev = loader(run_id)\n", - " ax.errorbar(steps, values, yerr=stdev, color=color)\n", - " #ax.set_ylim([2.2, 5])\n", - " #plt.close(fig)\n", - " #return fig" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "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 = $('
');\n", - " this._root_extra_style(this.root)\n", - " this.root.attr('style', 'display: inline-block');\n", - "\n", - " $(parent_element).append(this.root);\n", - "\n", - " this._init_header(this);\n", - " this._init_canvas(this);\n", - " this._init_toolbar(this);\n", - "\n", - " var fig = this;\n", - "\n", - " this.waiting = false;\n", - "\n", - " this.ws.onopen = function () {\n", - " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", - " fig.send_message(\"send_image_mode\", {});\n", - " if (mpl.ratio != 1) {\n", - " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", - " }\n", - " fig.send_message(\"refresh\", {});\n", - " }\n", - "\n", - " this.imageObj.onload = function() {\n", - " if (fig.image_mode == 'full') {\n", - " // Full images could contain transparency (where diff images\n", - " // almost always do), so we need to clear the canvas so that\n", - " // there is no ghosting.\n", - " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", - " }\n", - " fig.context.drawImage(fig.imageObj, 0, 0);\n", - " };\n", - "\n", - " this.imageObj.onunload = function() {\n", - " this.ws.close();\n", - " }\n", - "\n", - " this.ws.onmessage = this._make_on_message_function(this);\n", - "\n", - " this.ondownload = ondownload;\n", - "}\n", - "\n", - "mpl.figure.prototype._init_header = function() {\n", - " var titlebar = $(\n", - " '
');\n", - " var titletext = $(\n", - " '
');\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 = $('
');\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 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 = $('');\n", - " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", - "\n", - " var pass_mouse_events = true;\n", - "\n", - " canvas_div.resizable({\n", - " start: function(event, ui) {\n", - " pass_mouse_events = false;\n", - " },\n", - " resize: function(event, ui) {\n", - " fig.request_resize(ui.size.width, ui.size.height);\n", - " },\n", - " stop: function(event, ui) {\n", - " pass_mouse_events = true;\n", - " fig.request_resize(ui.size.width, ui.size.height);\n", - " },\n", - " });\n", - "\n", - " function mouse_event_fn(event) {\n", - " if (pass_mouse_events)\n", - " return fig.mouse_event(event, event['data']);\n", - " }\n", - "\n", - " rubberband.mousedown('button_press', mouse_event_fn);\n", - " rubberband.mouseup('button_release', mouse_event_fn);\n", - " // Throttle sequential mouse events to 1 every 20ms.\n", - " rubberband.mousemove('motion_notify', mouse_event_fn);\n", - "\n", - " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", - " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", - "\n", - " canvas_div.on(\"wheel\", function (event) {\n", - " event = event.originalEvent;\n", - " event['data'] = 'scroll'\n", - " if (event.deltaY < 0) {\n", - " event.step = 1;\n", - " } else {\n", - " event.step = -1;\n", - " }\n", - " mouse_event_fn(event);\n", - " });\n", - "\n", - " canvas_div.append(canvas);\n", - " canvas_div.append(rubberband);\n", - "\n", - " this.rubberband = rubberband;\n", - " this.rubberband_canvas = rubberband[0];\n", - " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", - " this.rubberband_context.strokeStyle = \"#000000\";\n", - "\n", - " this._resize_canvas = function(width, height) {\n", - " // Keep the size of the canvas, canvas container, and rubber band\n", - " // canvas in synch.\n", - " canvas_div.css('width', width)\n", - " canvas_div.css('height', height)\n", - "\n", - " canvas.attr('width', width * mpl.ratio);\n", - " canvas.attr('height', height * mpl.ratio);\n", - " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", - "\n", - " rubberband.attr('width', width);\n", - " rubberband.attr('height', height);\n", - " }\n", - "\n", - " // Set the figure to an initial 600x600px, this will subsequently be updated\n", - " // upon first draw.\n", - " this._resize_canvas(600, 600);\n", - "\n", - " // Disable right mouse context menu.\n", - " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", - " return false;\n", - " });\n", - "\n", - " function set_focus () {\n", - " canvas.focus();\n", - " canvas_div.focus();\n", - " }\n", - "\n", - " window.setTimeout(set_focus, 100);\n", - "}\n", - "\n", - "mpl.figure.prototype._init_toolbar = function() {\n", - " var fig = this;\n", - "\n", - " var nav_element = $('
')\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", - "\n", - "mpl.figure.prototype._root_extra_style = function(el){\n", - " var fig = this\n", - " el.on(\"remove\", function(){\n", - "\tfig.close_ws(fig, {});\n", - " });\n", - "}\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function(el){\n", - " // this is important to make the div 'focusable\n", - " el.attr('tabindex', 0)\n", - " // reach out to IPython and tell the keyboard manager to turn it's self\n", - " // off when our div gets focus\n", - "\n", - " // location in version 3\n", - " if (IPython.notebook.keyboard_manager) {\n", - " IPython.notebook.keyboard_manager.register_events(el);\n", - " }\n", - " else {\n", - " // location in version 2\n", - " IPython.keyboard_manager.register_events(el);\n", - " }\n", - "\n", - "}\n", - "\n", - "mpl.figure.prototype._key_event_extra = function(event, name) {\n", - " var manager = IPython.notebook.keyboard_manager;\n", - " if (!manager)\n", - " manager = IPython.keyboard_manager;\n", - "\n", - " // Check for shift+enter\n", - " if (event.shiftKey && event.which == 13) {\n", - " this.canvas_div.blur();\n", - " // select the cell after this one\n", - " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n", - " IPython.notebook.select(index + 1);\n", - " }\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_save = function(fig, msg) {\n", - " fig.ondownload(fig, null);\n", - "}\n", - "\n", - "\n", - "mpl.find_output_cell = function(html_output) {\n", - " // Return the cell and output element which can be found *uniquely* in the notebook.\n", - " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", - " // IPython event is triggered only after the cells have been serialised, which for\n", - " // our purposes (turning an active figure into a static one), is too late.\n", - " var cells = IPython.notebook.get_cells();\n", - " var ncells = cells.length;\n", - " for (var i=0; i= 3 moved mimebundle to data attribute of output\n", - " data = data.data;\n", - " }\n", - " if (data['text/html'] == html_output) {\n", - " return [cell, data, j];\n", - " }\n", - " }\n", - " }\n", - " }\n", - "}\n", - "\n", - "// Register the function which deals with the matplotlib target/channel.\n", - "// The kernel may be null if the page has been refreshed.\n", - "if (IPython.notebook.kernel != null) {\n", - " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", - "}\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "live_plot_rgb_splines(42, 43, 40, spline_s=0.01, max_stdev=1.0, live=False)" - ] - }, - { - "cell_type": "code", - "execution_count": 119, - "metadata": { - "scrolled": 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 = $('
');\n", - " this._root_extra_style(this.root)\n", - " this.root.attr('style', 'display: inline-block');\n", - "\n", - " $(parent_element).append(this.root);\n", - "\n", - " this._init_header(this);\n", - " this._init_canvas(this);\n", - " this._init_toolbar(this);\n", - "\n", - " var fig = this;\n", - "\n", - " this.waiting = false;\n", - "\n", - " this.ws.onopen = function () {\n", - " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", - " fig.send_message(\"send_image_mode\", {});\n", - " if (mpl.ratio != 1) {\n", - " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", - " }\n", - " fig.send_message(\"refresh\", {});\n", - " }\n", - "\n", - " this.imageObj.onload = function() {\n", - " if (fig.image_mode == 'full') {\n", - " // Full images could contain transparency (where diff images\n", - " // almost always do), so we need to clear the canvas so that\n", - " // there is no ghosting.\n", - " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", - " }\n", - " fig.context.drawImage(fig.imageObj, 0, 0);\n", - " };\n", - "\n", - " this.imageObj.onunload = function() {\n", - " this.ws.close();\n", - " }\n", - "\n", - " this.ws.onmessage = this._make_on_message_function(this);\n", - "\n", - " this.ondownload = ondownload;\n", - "}\n", - "\n", - "mpl.figure.prototype._init_header = function() {\n", - " var titlebar = $(\n", - " '
');\n", - " var titletext = $(\n", - " '
');\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 = $('
');\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 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 = $('');\n", - " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", - "\n", - " var pass_mouse_events = true;\n", - "\n", - " canvas_div.resizable({\n", - " start: function(event, ui) {\n", - " pass_mouse_events = false;\n", - " },\n", - " resize: function(event, ui) {\n", - " fig.request_resize(ui.size.width, ui.size.height);\n", - " },\n", - " stop: function(event, ui) {\n", - " pass_mouse_events = true;\n", - " fig.request_resize(ui.size.width, ui.size.height);\n", - " },\n", - " });\n", - "\n", - " function mouse_event_fn(event) {\n", - " if (pass_mouse_events)\n", - " return fig.mouse_event(event, event['data']);\n", - " }\n", - "\n", - " rubberband.mousedown('button_press', mouse_event_fn);\n", - " rubberband.mouseup('button_release', mouse_event_fn);\n", - " // Throttle sequential mouse events to 1 every 20ms.\n", - " rubberband.mousemove('motion_notify', mouse_event_fn);\n", - "\n", - " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", - " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", - "\n", - " canvas_div.on(\"wheel\", function (event) {\n", - " event = event.originalEvent;\n", - " event['data'] = 'scroll'\n", - " if (event.deltaY < 0) {\n", - " event.step = 1;\n", - " } else {\n", - " event.step = -1;\n", - " }\n", - " mouse_event_fn(event);\n", - " });\n", - "\n", - " canvas_div.append(canvas);\n", - " canvas_div.append(rubberband);\n", - "\n", - " this.rubberband = rubberband;\n", - " this.rubberband_canvas = rubberband[0];\n", - " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", - " this.rubberband_context.strokeStyle = \"#000000\";\n", - "\n", - " this._resize_canvas = function(width, height) {\n", - " // Keep the size of the canvas, canvas container, and rubber band\n", - " // canvas in synch.\n", - " canvas_div.css('width', width)\n", - " canvas_div.css('height', height)\n", - "\n", - " canvas.attr('width', width * mpl.ratio);\n", - " canvas.attr('height', height * mpl.ratio);\n", - " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", - "\n", - " rubberband.attr('width', width);\n", - " rubberband.attr('height', height);\n", - " }\n", - "\n", - " // Set the figure to an initial 600x600px, this will subsequently be updated\n", - " // upon first draw.\n", - " this._resize_canvas(600, 600);\n", - "\n", - " // Disable right mouse context menu.\n", - " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", - " return false;\n", - " });\n", - "\n", - " function set_focus () {\n", - " canvas.focus();\n", - " canvas_div.focus();\n", - " }\n", - "\n", - " window.setTimeout(set_focus, 100);\n", - "}\n", - "\n", - "mpl.figure.prototype._init_toolbar = function() {\n", - " var fig = this;\n", - "\n", - " var nav_element = $('
')\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", - "\n", - "mpl.figure.prototype._root_extra_style = function(el){\n", - " var fig = this\n", - " el.on(\"remove\", function(){\n", - "\tfig.close_ws(fig, {});\n", - " });\n", - "}\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function(el){\n", - " // this is important to make the div 'focusable\n", - " el.attr('tabindex', 0)\n", - " // reach out to IPython and tell the keyboard manager to turn it's self\n", - " // off when our div gets focus\n", - "\n", - " // location in version 3\n", - " if (IPython.notebook.keyboard_manager) {\n", - " IPython.notebook.keyboard_manager.register_events(el);\n", - " }\n", - " else {\n", - " // location in version 2\n", - " IPython.keyboard_manager.register_events(el);\n", - " }\n", - "\n", - "}\n", - "\n", - "mpl.figure.prototype._key_event_extra = function(event, name) {\n", - " var manager = IPython.notebook.keyboard_manager;\n", - " if (!manager)\n", - " manager = IPython.keyboard_manager;\n", - "\n", - " // Check for shift+enter\n", - " if (event.shiftKey && event.which == 13) {\n", - " this.canvas_div.blur();\n", - " // select the cell after this one\n", - " var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n", - " IPython.notebook.select(index + 1);\n", - " }\n", - "}\n", - "\n", - "mpl.figure.prototype.handle_save = function(fig, msg) {\n", - " fig.ondownload(fig, null);\n", - "}\n", - "\n", - "\n", - "mpl.find_output_cell = function(html_output) {\n", - " // Return the cell and output element which can be found *uniquely* in the notebook.\n", - " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", - " // IPython event is triggered only after the cells have been serialised, which for\n", - " // our purposes (turning an active figure into a static one), is too late.\n", - " var cells = IPython.notebook.get_cells();\n", - " var ncells = cells.length;\n", - " for (var i=0; i= 3 moved mimebundle to data attribute of output\n", - " data = data.data;\n", - " }\n", - " if (data['text/html'] == html_output) {\n", - " return [cell, data, j];\n", - " }\n", - " }\n", - " }\n", - " }\n", - "}\n", - "\n", - "// Register the function which deals with the matplotlib target/channel.\n", - "// The kernel may be null if the page has been refreshed.\n", - "if (IPython.notebook.kernel != null) {\n", - " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", - "}\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "live_plot_rgb_splines(51, 54, 55, 61, spline_s=0.05, max_stdev=1.0, live=False)" - ] - }, { "cell_type": "code", "execution_count": 121, @@ -5049,32 +1800,20 @@ }, { "cell_type": "code", - "execution_count": 166, + "execution_count": 97, "metadata": { "collapsed": true }, "outputs": [], "source": [ - "def plot_rgb_bar(data_rgb, ids_rgb, spline_s=1, show_label=True, save_svg=None):\n", + "def plot_rgb_calibrated(data_rgb, spline_s=1, save_svg=None):\n", " fig, ax = plt.subplots(1, 1)\n", - " if show_label:\n", - " fig.suptitle('Runs {}(R), {}(G), {}(B) at {:%y-%m-%d %H:%M:%S}'.format(*ids_rgb, datetime.now()))\n", "\n", - " #colors = [\n", - " # ((1,0,0), (1,0.8,0.8)),\n", - " # ((0,1,0), (0.8,1,0.8)),\n", - " # ((0,0,1), (0.8,0.8,1))\n", - " #]\n", - " colors = [\n", - " (('#fe3ea0', '#ffd2e9')) #ff99cc\n", - " ] * 4\n", - " print('spline_s', spline_s)\n", - "\n", - " for (steps, values, stdev), (color_dark, color_bright) in zip(data_rgb, colors):\n", - " ax.errorbar(steps, values, yerr=stdev, color=color_bright, zorder=1)\n", + " for steps, values, stdev in data_rgb:\n", + " ax.errorbar(steps, values, yerr=stdev, color='#ffd2e9', zorder=1)\n", " \n", " spline = inter.UnivariateSpline(steps, values, s=spline_s)\n", - " ax.plot(steps, spline(steps), color=color_dark, zorder=2)\n", + " ax.plot(steps, spline(steps), color='#fe3ea0', zorder=2)\n", " \n", " ax.spines['top'].set_visible(False)\n", " ax.spines['right'].set_visible(False)\n", @@ -5096,7 +1835,7 @@ }, { "cell_type": "code", - "execution_count": 124, + "execution_count": 127, "metadata": {}, "outputs": [ { @@ -5879,7 +2618,7 @@ { "data": { "text/html": [ - "" + "" ], "text/plain": [ "" @@ -5887,16 +2626,6 @@ }, "metadata": {}, "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "(380, 720)" - ] - }, - "execution_count": 124, - "metadata": {}, - "output_type": "execute_result" } ], "source": [ @@ -5905,13 +2634,28 @@ "Λ_sfh2701 = np.poly1d(np.polyfit(λ_sfh2701, S_sfh2701, 5))\n", "r = np.arange(380, 720)\n", "fig, ax = plt.subplots(1, 1)\n", - "ax.plot(r, Λ_sfh2701(r))\n", - "ax.set_xlim([380, 720])" + "ax.plot(r, Λ_sfh2701(r), color='#fe3ea0')\n", + "ax.set_xlim([380, 720])\n", + "\n", + "ax.spines['top'].set_visible(False)\n", + "ax.spines['right'].set_visible(False)\n", + "ax.spines['bottom'].set_color('#08bdf9')\n", + "ax.spines['left'].set_color('#08bdf9')\n", + "ax.tick_params(axis='x', colors='#01769D')\n", + "ax.tick_params(axis='y', colors='#01769D')\n", + "ax.xaxis.label.set_color('#01769D')\n", + "ax.yaxis.label.set_color('#01769D')\n", + "ax.grid(color='#08bdf9', linestyle=':')\n", + "\n", + "ax.set_xlim([380, 720])\n", + "ax.set_xlabel('$\\lambda\\;[nm]$')\n", + "ax.set_ylabel('$S_{rel,820nm}\\;[1]$')\n", + "fig.savefig('/tmp/photodiode_sensitivity.svg')" ] }, { "cell_type": "code", - "execution_count": 168, + "execution_count": 112, "metadata": { "scrolled": false }, @@ -5920,16 +2664,15 @@ "name": "stdout", "output_type": "stream", "text": [ - "Poly for run 45:\n", - " 2\n", - "2.282e-06 x - 0.001576 x + 0.4019\n", - "Poly for run 46:\n", - " 2\n", - "6.886e-07 x - 0.0005388 x + 0.1561\n", - "Poly for run 44:\n", - " 2\n", - "1.258e-06 x - 0.001514 x + 0.5252\n", - "[297, 228, 117] [339, 270, 210]\n" + "Poly for red channel\n", + " \n", + "-0.0001301 x + 0.4955\n", + "Poly for green channel\n", + " \n", + "-3.846e-05 x + 0.4401\n", + "Poly for blue channel\n", + " \n", + "-0.000189 x + 0.5092\n" ] }, { @@ -6712,7 +3455,7 @@ { "data": { "text/html": [ - "" + "" ], "text/plain": [ "" @@ -6720,96 +3463,93 @@ }, "metadata": {}, "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "spline_s 0.5\n" - ] } ], "source": [ - "ids = (45, 46, 44) # Run IDs of runs for R, G and B channel\n", + "captures = find_captures('cheap_rgb')\n", "\n", "# Approximate bands of interest for R, G and B channelsfor offset and stray light correction.\n", - "bands = [(260,410), (150,330), (100,260)] # [step]\n", + "bands = {\n", + " 'red': (260,410), # [step]\n", + " 'green': (150,330),\n", + " 'blue': (100,260)\n", + "}\n", "\n", "# The wavelengths are from a random RGB LED datasheet and are just preliminary starting values.\n", "# https://www.sparkfun.com/datasheets/Components/YSL-R596CR3G4B5C-C10.pdf\n", - "λ_led = [623, 518, 466] # [nm] Assumed wavelengths of R, G and B spectral peaks.\n", + "λ_led = {'red': 623, 'green': 518, 'blue': 466} # [nm] Assumed wavelengths of R, G and B spectral peaks.\n", "λ_be = 400 # [nm] Approximate short-λ edge of blue band\n", "y_edge_min = 0.5\n", "transimpedance = 630e6 # Ohms.\n", "\n", - "poly_degree = 2 # degree of polynomial for stray light and offset correction. Should be 1 or 2.\n", + "poly_degree = 1 # degree of polynomial for stray light and offset correction. Should be 1 or 2.\n", "\n", - "max_stdev = 1.0 # [V] Nerved value that has been used for outlier removal in earlier tries\n", - "\n", - "remove_thresh = 0.05 # [V] standard deviation delta threshold for outlier removal\n", + "#remove_thresh = 10.0 # [V] standard deviation delta threshold for outlier removal\n", "\n", "# ---\n", - "data_rgb = []\n", - "for run_id, (l, r) in zip(ids, bands):\n", + "data_rgb = {}\n", + "for capture_id, color, gain in captures:\n", " # Load this channel from the database\n", - " steps, values, stdev = load_run_zero_cal(run_id, max_stdev)\n", + " steps, values, stdev = load_run(capture_id, gain)\n", " \n", " # Remove outlier values whose standard deviation is much larger than that of their right and left neighbors\n", - " idxs = (np.abs(stdev[1:-1] - stdev[0:-2]) < remove_thresh) |\\\n", - " (np.abs(stdev[1:-1] - stdev[2:]) < remove_thresh)\n", - " idxs = np.hstack([np.array([True]), idxs, np.array([True])])\n", - " steps, values, stdev = steps[idxs], values[idxs], stdev[idxs]\n", + " #idxs = (np.abs(stdev[1:-1] - stdev[0:-2]) < remove_thresh) |\\\n", + " # (np.abs(stdev[1:-1] - stdev[2:]) < remove_thresh)\n", + " #idxs = np.hstack([np.array([True]), idxs, np.array([True])])\n", + " #steps, values, stdev = steps[idxs], values[idxs], stdev[idxs]\n", " \n", " # Remove offset and stray light by fitting a second-order polynomial over the parts of the curve\n", " # that are clearly *not* part of the primary peak.\n", + " l, r = bands[color]\n", " idxs = (steps < l) | (steps > r)\n", " poly = np.poly1d(np.polyfit(steps[idxs], values[idxs], poly_degree))\n", - " print('Poly for run {}:'.format(run_id))\n", + " print('Poly for', color, 'channel')\n", " print(poly)\n", " values -= poly(steps)\n", " \n", - " data_rgb.append((steps, values, stdev))\n", + " data_rgb[color] = (steps, values, stdev)\n", "\n", "\n", "# Produce a first estimate for wavelength scaling. Use the short-wavelength edge of the blue band and the red peak\n", "# for this, as both can be assumed to remain stable even after photodiode response compensation. Then apply photodiode\n", "# response compensation and do another, second round of wavelength scaling estimation but this time using all three\n", "# peaks and a proper least-squares fit.\n", - "peaks = [ x[np.argmax(y)] for x, y, σ2 in data_rgb ]\n", - "edgesl = [ x[np.argmax(y > y_edge_min)] for x, y, σ2 in data_rgb ]\n", - "print(edgesl, peaks)\n", + "peaks = { color: x[np.argmax(y)] for color, (x, y, σ2) in data_rgb.items() }\n", + "edgesl = { color: x[np.argmax(y > y_edge_min)] for color, (x, y, σ2) in data_rgb.items() }\n", "\n", - "Λ_est = np.poly1d(np.polyfit([edgesl[2], peaks[0]], [λ_be, λ_led[0]], 1))\n", + "Λ_est = np.poly1d(np.polyfit([edgesl['blue'], peaks['red']], [λ_be, λ_led['red']], 1))\n", "\n", - "data_tmp = [ (x, Λ_est(x), y, σ2) for x, y, σ2 in data_rgb ]\n", - "data_tmp = [ (x, λ, y/Λ_sfh2701(λ), σ2) for x, λ, y, σ2 in data_tmp ]\n", + "data_tmp = { color: (x, Λ_est(x), y, σ2) for color, (x, y, σ2) in data_rgb.items() }\n", + "data_tmp = { color: (x, λ, y/Λ_sfh2701(λ), σ2) for color, (x, λ, y, σ2) in data_tmp.items() }\n", "# Limit wavelength range\n", - "data_tmp = [ (x[λ > 380], λ[λ > 380], y[λ > 380], σ2[λ > 380]) for x, λ, y, σ2 in data_tmp ]\n", + "data_tmp = { color: (x[λ > 380], λ[λ > 380], y[λ > 380], σ2[λ > 380]) for color, (x, λ, y, σ2) in data_tmp.items() }\n", "\n", "# Calibrate wavelength axis using assumed peaks for r, g and b. Use least-squares polyfit for getting coefficients.\n", - "peaks = [ x[np.argmax(y)] for x, λ, y, σ2 in data_tmp ]\n", - "Λ = np.poly1d(np.polyfit(peaks, λ_led, 1))\n", + "peaks = { color: x[np.argmax(y)] for color, (x, λ, y, σ2) in data_tmp.items() }\n", + "Λ = np.poly1d(np.polyfit(\n", + " [peaks['red'], peaks['green'], peaks['blue']],\n", + " [λ_led['red'], λ_led['green'], λ_led['blue']], 1))\n", "\n", - "data_rgb = [ (Λ(x), y, σ2) for x, y, σ2 in data_rgb ]\n", - "data_rgb = [ (λ, y/Λ_sfh2701(λ), σ2) for λ, y, σ2 in data_rgb ]\n", + "data_rgb = { color: (Λ(x), y, σ2) for color, (x, y, σ2) in data_rgb.items() }\n", + "data_rgb = { color: (λ, y/Λ_sfh2701(λ), σ2) for color, (λ, y, σ2) in data_rgb.items() }\n", "\n", "# Limit wavelength range to slightly-larger-than visible range. We're getting improbably large values in the\n", "# utraviolet region that are probably caused by stray light.\n", - "data_rgb = [ (λ[λ > 380], y[λ > 380], σ2[λ > 380]) for λ, y, σ2 in data_rgb ]\n", + "data_rgb = { color: (λ[λ > 380], y[λ > 380], σ2[λ > 380]) for color, (λ, y, σ2) in data_rgb.items() }\n", "\n", "# Normalize amplitude data to brightest channel for ease of reading\n", "#max_val = max(np.max(y) for λ, y, σ2 in data_rgb)\n", "#data_rgb = [ (λ, y/max_val, σ2/max_val) for λ, y, σ2 in data_rgb ]\n", "\n", "# Convert amplitude data to current in nanoampère\n", - "data_rgb = [ (λ, y/transimpedance / 1e-9, σ2/transimpedance / 1e-9) for λ, y, σ2 in data_rgb ]\n", + "data_rgb = { color: (λ, y/transimpedance / 1e-9, σ2/transimpedance / 1e-9) for color, (λ, y, σ2) in data_rgb.items() }\n", "\n", - "plot_rgb_bar(data_rgb, ids, spline_s=0.5, show_label=False, save_svg='/tmp/processed_plot_cheap_rgb.svg')" + "plot_rgb_calibrated(data_rgb.values(), spline_s=0.005, save_svg='/tmp/processed_plot_cheap_rgb.svg')" ] }, { "cell_type": "code", - "execution_count": 58, + "execution_count": 114, "metadata": { "collapsed": true }, @@ -6825,49 +3565,51 @@ }, { "cell_type": "code", - "execution_count": 59, + "execution_count": 119, "metadata": { "collapsed": true }, "outputs": [], "source": [ - "def integrate_tristimulus_response(data, colorspace='cie_xyz_1931'):\n", + "def integrate_tristimulus_response(data, channels=('red', 'green', 'blue'), colorspace='cie_xyz_1931'):\n", " a = np.array([[\n", " integrate.simps(\n", - " np.multiply(CMFs[colorspace][j](data[i][0]), data[i][1]),\n", - " data[i][0])\n", + " np.multiply(CMFs[colorspace][j](data[color][0]), data[color][1]), data[color][0])\n", " for j in range(3) ]\n", - " for i in range(len(data)) ])\n", + " for color in channels ])\n", " # normalize by largest component\n", " return a / np.max(np.sum(a, axis=0))" ] }, { "cell_type": "code", - "execution_count": 60, + "execution_count": 120, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "array([[ 3.46142003e-01, 1.73335974e-01, -7.18827590e-05],\n", - " [ 9.01721797e-02, 1.69512416e-01, 2.15830281e-02],\n", - " [ 1.75128165e-01, 2.49230694e-01, 9.78488855e-01]])" + "array([[ 0.06995882, 0.02007191, -0.0260505 ],\n", + " [ 0.05310356, 0.0995779 , 0.03458726],\n", + " [ 0.16122952, 0.16639874, 0.99146324]])" ] }, - "execution_count": 60, + "execution_count": 120, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tristimulus_data = integrate_tristimulus_response(data_rgb)\n", - "tristimulus_data" + "tristimulus_data\n", + "#array([[ 3.46142003e-01, 1.73335974e-01, -7.18827590e-05],\n", + "# [ 9.01721797e-02, 1.69512416e-01, 2.15830281e-02],\n", + "# [ 1.75128165e-01, 2.49230694e-01, 9.78488855e-01]])" ] }, { "cell_type": "code", - "execution_count": 61, + "execution_count": 121, "metadata": { "collapsed": true }, @@ -6882,16 +3624,16 @@ }, { "cell_type": "code", - "execution_count": 62, + "execution_count": 122, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "array([ 0.72869072, 0.1386238 , 0.20139265])" + "array([ 2.96363627, 1.00231926, 0.24462504])" ] }, - "execution_count": 62, + "execution_count": 122, "metadata": {}, "output_type": "execute_result" } diff --git a/firmware/measure_spectrum.py b/firmware/measure_spectrum.py index 47df7b3..70f4e9b 100644 --- a/firmware/measure_spectrum.py +++ b/firmware/measure_spectrum.py @@ -77,19 +77,13 @@ if __name__ == '__main__': bp = BPState(args.port) - run_name = args.run_name - if not str.isnumeric(args.run_name[-1]): - names = [ n[len(run_name):] for n, in db.execute( - 'SELECT name FROM runs WHERE name LIKE ?||"%"', (run_name,)).fetchall() ] - names.append('0') # in case we get no results - run_name += str(1+max(int(n) if str.isnumeric(n) else 0 for n in names)) with db: cur = db.cursor() cur.execute('INSERT INTO runs(name, comment, color, gain, timestamp) VALUES (?, ?, ?, ?, ?)', - (run_name, args.comment, args.color, args.gain*1e6, time.time())) + (args.run_name, args.comment, args.color, args.gain*1e6, time.time())) capture_id = cur.lastrowid - print('Starting run {} "{}" at {:%y-%m-%d %H:%M:%S:%f}'.format(capture_id, run_name, datetime.now())) + print('Starting capture {} "{}" at {:%y-%m-%d %H:%M:%S:%f}'.format(capture_id, args.run_name, datetime.now())) print('[measurement id] " " [step number] " " [reading (V)]') bp.stepper_direction('down') @@ -98,7 +92,7 @@ if __name__ == '__main__': bp.stepper_direction('up') for step in range(0, args.steps+args.skip, args.skip): # Run one skip past end to capture both interval boundaries - for led_val in [0, 1]: + for led_val in [1]: # This can be used for self-calibration. try: bp.led(led_val) time.sleep(args.wait) diff --git a/firmware/spectra.sqlite3 b/firmware/spectra.sqlite3 index fe9be416cf747002eecf59b2b93d94704c3e67d0..00fa710bee919f6bf56f3ce6c97919c84b9f66f9 100644 GIT binary patch literal 98304 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�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 ZpoNXcA$L9WB_4GDrvol?CWrj$002|Z@Dl(4 delta 61 zcmZo@U~5R2AjQUD!@$76JW;`piNR)L!V-QqMt%bZeuK@93Tph54dgGd^D;0nSaO(8 RW;ZC_Sh$ycv$@4db^xkc4(I>?