diff --git a/docs/examples/driver_examples/Qcodes example with Rohde Schwarz ZN20.ipynb b/docs/examples/driver_examples/Qcodes example with Rohde Schwarz ZN20.ipynb deleted file mode 100644 index e0e2acad4721..000000000000 --- a/docs/examples/driver_examples/Qcodes example with Rohde Schwarz ZN20.ipynb +++ /dev/null @@ -1,2452 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Qcodes example with Rohde Schwarz ZN20" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "C:\\Anaconda3\\lib\\site-packages\\IPython\\kernel\\__init__.py:13: ShimWarning: The `IPython.kernel` package has been deprecated. You should import from ipykernel or jupyter_client instead.\n", - " \"You should import from ipykernel or jupyter_client instead.\", ShimWarning)\n" - ] - }, - { - "data": { - "application/javascript": [ - "/*\r\n", - " * Qcodes Jupyter/IPython widgets\r\n", - " */\r\n", - "require([\r\n", - " 'nbextensions/widgets/widgets/js/widget',\r\n", - " 'nbextensions/widgets/widgets/js/manager'\r\n", - "], function (widget, manager) {\r\n", - "\r\n", - " var UpdateView = widget.DOMWidgetView.extend({\r\n", - " render: function() {\r\n", - " window.MYWIDGET = this;\r\n", - " this._interval = 0;\r\n", - " this.update();\r\n", - " },\r\n", - " update: function() {\r\n", - " this.display(this.model.get('_message'));\r\n", - " this.setInterval();\r\n", - " },\r\n", - " display: function(message) {\r\n", - " /*\r\n", - " * display method: override this for custom display logic\r\n", - " */\r\n", - " this.el.innerHTML = message;\r\n", - " },\r\n", - " remove: function() {\r\n", - " clearInterval(this._updater);\r\n", - " },\r\n", - " setInterval: function(newInterval) {\r\n", - " var me = this;\r\n", - " if(newInterval===undefined) newInterval = me.model.get('interval');\r\n", - " if(newInterval===me._interval) return;\r\n", - "\r\n", - " me._interval = newInterval;\r\n", - "\r\n", - " if(me._updater) clearInterval(me._updater);\r\n", - "\r\n", - " if(me._interval) {\r\n", - " me._updater = setInterval(function() {\r\n", - " me.send({myupdate: true});\r\n", - " if(!me.model.comm_live) {\r\n", - " console.log('missing comm, canceling widget updates', me);\r\n", - " clearInterval(me._updater);\r\n", - " }\r\n", - " }, me._interval * 1000);\r\n", - " }\r\n", - " }\r\n", - " });\r\n", - " manager.WidgetManager.register_widget_view('UpdateView', UpdateView);\r\n", - "\r\n", - " var HiddenUpdateView = UpdateView.extend({\r\n", - " display: function(message) {\r\n", - " this.$el.hide();\r\n", - " }\r\n", - " });\r\n", - " manager.WidgetManager.register_widget_view('HiddenUpdateView', HiddenUpdateView);\r\n", - "\r\n", - " var SubprocessView = UpdateView.extend({\r\n", - " render: function() {\r\n", - " var me = this;\r\n", - " me._interval = 0;\r\n", - " me._minimize = '';\r\n", - " me._restore = '';\r\n", - "\r\n", - " // max lines of output to show\r\n", - " me.maxOutputLength = 500;\r\n", - "\r\n", - " // in case there is already an outputView present,\r\n", - " // like from before restarting the kernel\r\n", - " $('.qcodes-output-view').not(me.$el).remove();\r\n", - "\r\n", - " me.$el\r\n", - " .addClass('qcodes-output-view')\r\n", - " .attr('qcodes-state', 'docked')\r\n", - " .html(\r\n", - " '
' +\r\n", - " '
' +\r\n", - " '' +\r\n", - " '' +\r\n", - " '' +\r\n", - " '' +\r\n", - " '' +\r\n", - " '' +\r\n", - " '
' +\r\n", - " '
'\r\n",
-       "                );\r\n",
-       "\r\n",
-       "            me.clearButton = me.$el.find('.qcodes-clear-output');\r\n",
-       "            me.minButton = me.$el.find('.qcodes-minimize');\r\n",
-       "            me.outputArea = me.$el.find('pre');\r\n",
-       "            me.subprocessList = me.$el.find('.qcodes-process-list');\r\n",
-       "            me.abortButton = me.$el.find('.qcodes-abort-loop');\r\n",
-       "            me.processLinesButton = me.$el.find('.qcodes-processlines')\r\n",
-       "\r\n",
-       "            me.outputLines = [];\r\n",
-       "\r\n",
-       "            me.clearButton.click(function() {\r\n",
-       "                me.outputArea.html('');\r\n",
-       "                me.clearButton.addClass('disabled');\r\n",
-       "            });\r\n",
-       "\r\n",
-       "            me.abortButton.click(function() {\r\n",
-       "                me.send({abort: true});\r\n",
-       "            });\r\n",
-       "\r\n",
-       "            me.processLinesButton.click(function() {\r\n",
-       "                // toggle multiline process list display\r\n",
-       "                me.subprocessesMultiline = !me.subprocessesMultiline;\r\n",
-       "                me.showSubprocesses();\r\n",
-       "            });\r\n",
-       "\r\n",
-       "            me.$el.find('.js-state').click(function() {\r\n",
-       "                var state = this.className.substr(this.className.indexOf('qcodes'))\r\n",
-       "                        .split('-')[1].split(' ')[0];\r\n",
-       "                me.model.set('_state', state);\r\n",
-       "            });\r\n",
-       "\r\n",
-       "            $(window)\r\n",
-       "                .off('resize.qcodes')\r\n",
-       "                .on('resize.qcodes', function() {me.clipBounds();});\r\n",
-       "\r\n",
-       "            me.update();\r\n",
-       "        },\r\n",
-       "\r\n",
-       "        updateState: function() {\r\n",
-       "            var me = this,\r\n",
-       "                oldState = me.$el.attr('qcodes-state'),\r\n",
-       "                state = me.model.get('_state');\r\n",
-       "\r\n",
-       "            if(state === oldState) return;\r\n",
-       "\r\n",
-       "            setTimeout(function() {\r\n",
-       "                // not sure why I can't pop it out of the widgetarea in render, but it seems that\r\n",
-       "                // some other bit of code resets the parent after render if I do it there.\r\n",
-       "                // To be safe, just do it on every state click.\r\n",
-       "                me.$el.appendTo('body');\r\n",
-       "\r\n",
-       "                if(oldState === 'floated') {\r\n",
-       "                    console.log('here');\r\n",
-       "                    me.$el.draggable('destroy').css({left:'', top: ''});\r\n",
-       "                }\r\n",
-       "\r\n",
-       "                me.$el.attr('qcodes-state', state);\r\n",
-       "\r\n",
-       "                if(state === 'floated') {\r\n",
-       "                    me.$el\r\n",
-       "                        .draggable({stop: function() { me.clipBounds(); }})\r\n",
-       "                        .css({\r\n",
-       "                            left: window.innerWidth - me.$el.width() - 15,\r\n",
-       "                            top: window.innerHeight - me.$el.height() - 10\r\n",
-       "                        });\r\n",
-       "                }\r\n",
-       "\r\n",
-       "                // any previous highlighting is now moot\r\n",
-       "                me.$el.removeClass('qcodes-highlight');\r\n",
-       "            }, 0);\r\n",
-       "\r\n",
-       "        },\r\n",
-       "\r\n",
-       "        clipBounds: function() {\r\n",
-       "            var me = this;\r\n",
-       "            if(me.$el.attr('qcodes-state') === 'floated') {\r\n",
-       "                var bounds = me.$el[0].getBoundingClientRect(),\r\n",
-       "                    minVis = 40,\r\n",
-       "                    maxLeft = window.innerWidth - minVis,\r\n",
-       "                    minLeft = minVis - bounds.width,\r\n",
-       "                    maxTop = window.innerHeight - minVis;\r\n",
-       "\r\n",
-       "                if(bounds.left > maxLeft) me.$el.css('left', maxLeft);\r\n",
-       "                else if(bounds.left < minLeft) me.$el.css('left', minLeft);\r\n",
-       "\r\n",
-       "                if(bounds.top > maxTop) me.$el.css('top', maxTop);\r\n",
-       "                else if(bounds.top < 0) me.$el.css('top', 0);\r\n",
-       "            }\r\n",
-       "        },\r\n",
-       "\r\n",
-       "        display: function(message) {\r\n",
-       "            var me = this;\r\n",
-       "            if(message) {\r\n",
-       "                var initialScroll = me.outputArea.scrollTop();\r\n",
-       "                me.outputArea.scrollTop(me.outputArea.prop('scrollHeight'));\r\n",
-       "                var scrollBottom = me.outputArea.scrollTop();\r\n",
-       "\r\n",
-       "                if(me.$el.attr('qcodes-state') === 'minimized') {\r\n",
-       "                    // if we add text and the box is minimized, highlight the\r\n",
-       "                    // title bar to alert the user that there are new messages.\r\n",
-       "                    // remove then add the class, so we get the animation again\r\n",
-       "                    // if it's already highlighted\r\n",
-       "                    me.$el.removeClass('qcodes-highlight');\r\n",
-       "                    setTimeout(function(){\r\n",
-       "                        me.$el.addClass('qcodes-highlight');\r\n",
-       "                    }, 0);\r\n",
-       "                }\r\n",
-       "\r\n",
-       "                var newLines = message.split('\\n'),\r\n",
-       "                    out = me.outputLines,\r\n",
-       "                    outLen = out.length;\r\n",
-       "                if(outLen) out[outLen - 1] += newLines[0];\r\n",
-       "                else out.push(newLines[0]);\r\n",
-       "\r\n",
-       "                for(var i = 1; i < newLines.length; i++) {\r\n",
-       "                    out.push(newLines[i]);\r\n",
-       "                }\r\n",
-       "\r\n",
-       "                if(out.length > me.maxOutputLength) {\r\n",
-       "                    out.splice(0, out.length - me.maxOutputLength + 1,\r\n",
-       "                        '<<< Output clipped >>>');\r\n",
-       "                }\r\n",
-       "\r\n",
-       "                me.outputArea.text(out.join('\\n'));\r\n",
-       "                me.clearButton.removeClass('disabled');\r\n",
-       "\r\n",
-       "                // if we were scrolled to the bottom initially, make sure\r\n",
-       "                // we stay that way.\r\n",
-       "                me.outputArea.scrollTop(initialScroll === scrollBottom ?\r\n",
-       "                    me.outputArea.prop('scrollHeight') : initialScroll);\r\n",
-       "            }\r\n",
-       "\r\n",
-       "            me.showSubprocesses();\r\n",
-       "            me.updateState();\r\n",
-       "        },\r\n",
-       "\r\n",
-       "        showSubprocesses: function() {\r\n",
-       "            var me = this,\r\n",
-       "                replacer = me.subprocessesMultiline ? '
' : ', ',\r\n", - " processes = (me.model.get('_processes') || '')\r\n", - " .replace(/\\n/g, '>' + replacer + '<');\r\n", - "\r\n", - " if(processes) processes = '<' + processes + '>';\r\n", - " else processes = 'No subprocesses';\r\n", - "\r\n", - " me.abortButton.toggleClass('disabled', processes.indexOf('Measurement')===-1);\r\n", - "\r\n", - " me.subprocessList.html(processes);\r\n", - " }\r\n", - " });\r\n", - " manager.WidgetManager.register_widget_view('SubprocessView', SubprocessView);\r\n", - "});\r\n" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "%matplotlib nbagg\n", - "import matplotlib.pyplot as plt\n", - "\n", - "from imp import reload\n", - "\n", - "import qcodes as qc\n", - "\n", - "qc.set_mp_method('spawn') # force Windows behavior on mac\n", - "\n", - "# this makes a widget in the corner of the window to show and control\n", - "# subprocesses and any output they would print to the terminal\n", - "qc.show_subprocess_widget()" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import qcodes.instrument_drivers.rohde_schwarz.ZNB20 as vna; reload(vna)" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Connected to: Rohde-Schwarz ZNB20-2Port (serial:1311601062101551, firmware:2.10) in 0.04s\n" - ] - } - ], - "source": [ - "v1 =vna.ZNB20('VNA', 'TCPIP0::172.20.2.234::inst0::INSTR', server_name=None)" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "station = qc.Station(v1)" - ] - }, - { - "cell_type": "code", - "execution_count": 54, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "([0.9895826882081791,\n", - " 0.9869094348257063,\n", - " 0.9857022207845295,\n", - " 0.9849716811324213,\n", - " 0.9851777067679051,\n", - " 0.9842607626269199,\n", - " 0.9829348381629962,\n", - " 0.9816473088019041,\n", - " 0.9786861283846768,\n", - " 0.977592036189242,\n", - " 0.97576729729163,\n", - " 0.9740934018474197,\n", - " 0.9729518103133459,\n", - " 0.9721370921861145,\n", - " 0.9713039723260913,\n", - " 0.9709207543511132,\n", - " 0.9708230438550919,\n", - " 0.9703666979337292,\n", - " 0.9703414381126192,\n", - " 0.9700908859391326,\n", - " 0.9699112711672869,\n", - " 0.9694166657814337,\n", - " 0.968903093853172,\n", - " 0.9682554312580419,\n", - " 0.9678450187387361,\n", - " 0.9671028614781024,\n", - " 0.9664735489036151,\n", - " 0.965510156267443,\n", - " 0.9649242678857383,\n", - " 0.9649892999018361,\n", - " 0.9644816933427587,\n", - " 0.9641921319025079,\n", - " 0.963669775695679,\n", - " 0.9631865143768873,\n", - " 0.963223910382565,\n", - " 0.963030553862949,\n", - " 0.9624009542078145,\n", - " 0.9622513785770892,\n", - " 0.9620348386109799,\n", - " 0.961453672750619,\n", - " 0.9604823245357286,\n", - " 0.9601940834710165,\n", - " 0.9594606244612337,\n", - " 0.9593216823689693,\n", - " 0.9589108029090968,\n", - " 0.9578873673683236,\n", - " 0.9573589291476022,\n", - " 0.9569588227170734,\n", - " 0.9564502087571111,\n", - " 0.955669859967192,\n", - " 0.9549499221478315,\n", - " 0.9540578765671092,\n", - " 0.9530129876524023,\n", - " 0.9517121031522534,\n", - " 0.9513873939731231,\n", - " 0.9504770541287781,\n", - " 0.9514052798363227,\n", - " 0.9519324122396933,\n", - " 0.9502438823700848,\n", - " 0.943213062343683,\n", - " 0.9371787503752951,\n", - " 0.9361742294777097,\n", - " 0.9394688962970474,\n", - " 0.9445367130494726,\n", - " 0.9472092623822433,\n", - " 0.9479792705463528,\n", - " 0.9480799944513731,\n", - " 0.9473828821678538,\n", - " 0.9455337460737451,\n", - " 0.9457087929324874,\n", - " 0.9462239698094738,\n", - " 0.9461226512723114,\n", - " 0.9455034078803901,\n", - " 0.9443907659225531,\n", - " 0.94365363844252,\n", - " 0.9430770510774368,\n", - " 0.9420973162820626,\n", - " 0.9406199004439628,\n", - " 0.9393153552545652,\n", - " 0.9383821996868444,\n", - " 0.9380895206348119,\n", - " 0.9368862835566656,\n", - " 0.9344415030119433,\n", - " 0.9311402924887935,\n", - " 0.9262748633155682,\n", - " 0.9212472780821491,\n", - " 0.9193006436522684,\n", - " 0.9201060562261194,\n", - " 0.9239782946171617,\n", - " 0.9266855495081732,\n", - " 0.9256206644137215,\n", - " 0.9230752335742844,\n", - " 0.9203336283158239,\n", - " 0.9171825974615793,\n", - " 0.9155916002239227,\n", - " 0.9154638000567723,\n", - " 0.9156386345594286,\n", - " 0.915411675480082,\n", - " 0.914080287388952,\n", - " 0.9107595174729219,\n", - " 0.9038962008036946,\n", - " 0.8927686431493355,\n", - " 0.8758581077844744,\n", - " 0.8534214948797171,\n", - " 0.8260045725743231,\n", - " 0.7947028544404089,\n", - " 0.7599259059113547,\n", - " 0.7225393521464759,\n", - " 0.6823648596301773,\n", - " 0.6393656639277121,\n", - " 0.5931113543704739,\n", - " 0.5441506885467429,\n", - " 0.4935484833551584,\n", - " 0.44340326569642374,\n", - " 0.3952782959903659,\n", - " 0.35100264189785674,\n", - " 0.31151834258445116,\n", - " 0.27700917333421426,\n", - " 0.24721802127630774,\n", - " 0.22213474407679737,\n", - " 0.20066032690466426,\n", - " 0.18234508982200742,\n", - " 0.16670859050017847,\n", - " 0.1530462944576956,\n", - " 0.1413275026823718,\n", - " 0.13058719359036725,\n", - " 0.12087065818962711,\n", - " 0.11172748051132558,\n", - " 0.10290008431824464,\n", - " 0.09465149248317925,\n", - " 0.08666126323379829,\n", - " 0.07946789030378242,\n", - " 0.0725860300638041,\n", - " 0.06631945966880881,\n", - " 0.06068450429465256,\n", - " 0.05523756855252659,\n", - " 0.05048916409687119,\n", - " 0.046112634791750706,\n", - " 0.04252924175208469,\n", - " 0.039214999209167094,\n", - " 0.03632221589554925,\n", - " 0.033960487109423926,\n", - " 0.03160439859699994,\n", - " 0.029940075621481918,\n", - " 0.02796992271519951,\n", - " 0.026643014513012757,\n", - " 0.025244254189062704,\n", - " 0.023820806664581567,\n", - " 0.022447139371216618,\n", - " 0.021050545597438262,\n", - " 0.019874088905746982,\n", - " 0.018645562732940713,\n", - " 0.01727799703196309,\n", - " 0.016002710865995674,\n", - " 0.01503032327152424,\n", - " 0.013987715380044643,\n", - " 0.01310755688557064,\n", - " 0.012115593481965576,\n", - " 0.011412071313340755,\n", - " 0.010654009997301088,\n", - " 0.009989801855445736,\n", - " 0.009477542474530308,\n", - " 0.00895126947691363,\n", - " 0.008475730814023537,\n", - " 0.008023368159711393,\n", - " 0.007653496379647708,\n", - " 0.007230465955946998,\n", - " 0.006854537670863554,\n", - " 0.006594801721280584,\n", - " 0.006223036608081843,\n", - " 0.006032662337093347,\n", - " 0.005710267944673411,\n", - " 0.0054625256725857035,\n", - " 0.005182030628555568,\n", - " 0.004905518766564076,\n", - " 0.0046588769261585745,\n", - " 0.0043293071704507005,\n", - " 0.004052557827013329,\n", - " 0.0038341147896325907,\n", - " 0.0036112055308751634,\n", - " 0.0033927249044489443,\n", - " 0.0031880555712037926,\n", - " 0.0029939316028082855,\n", - " 0.0029020418309596368,\n", - " 0.002771223631302068,\n", - " 0.002645519992786253,\n", - " 0.0025457635648588333,\n", - " 0.002479129374286534,\n", - " 0.002376064201398493,\n", - " 0.0022786035577616643,\n", - " 0.0022308097785247146,\n", - " 0.002109930637083628,\n", - " 0.0020136527194443863,\n", - " 0.001906772783176855,\n", - " 0.0018292625864839147,\n", - " 0.001689509801043019,\n", - " 0.0015958608326242783,\n", - " 0.0015611211728045495,\n", - " 0.0014947999199123089,\n", - " 0.0014254963667496704,\n", - " 0.001330926232424635],\n", - " [-0.4637218035133345,\n", - " -0.6447678115627552,\n", - " -0.8231987038344319,\n", - " -1.005804636348533,\n", - " -1.1882935648852178,\n", - " -1.3691429237764958,\n", - " -1.5501365959864954,\n", - " -1.7318710619900028,\n", - " -1.9112238200978167,\n", - " -2.090251428805007,\n", - " -2.270426256251092,\n", - " -2.4503739923681915,\n", - " -2.6297055657459634,\n", - " -2.8096638874119417,\n", - " -2.989713608670389,\n", - " 3.114134012350575,\n", - " 2.933951309345143,\n", - " 2.7535528475439186,\n", - " 2.573724473324577,\n", - " 2.3921071348300385,\n", - " 2.2111013152935564,\n", - " 2.029675538192421,\n", - " 1.8490448702823405,\n", - " 1.6675329087276884,\n", - " 1.4862310265845533,\n", - " 1.30481106145617,\n", - " 1.1238499741204908,\n", - " 0.9419879730263643,\n", - " 0.7599432241785905,\n", - " 0.578023071372694,\n", - " 0.39572932365602964,\n", - " 0.2134962483220875,\n", - " 0.03221498371449915,\n", - " -0.14953955285881196,\n", - " -0.3327929653419456,\n", - " -0.51564614920525,\n", - " -0.6982052258600608,\n", - " -0.8813233462194436,\n", - " -1.0649083152488747,\n", - " -1.250962462159386,\n", - " -1.43452833522854,\n", - " -1.6179507116440404,\n", - " -1.8019172913015926,\n", - " -1.9852294528292043,\n", - " -2.165698517660056,\n", - " -2.3487423107423595,\n", - " -2.535057992685882,\n", - " -2.7216737022961035,\n", - " -2.911143633789084,\n", - " -3.099483457041719,\n", - " 2.997380309490084,\n", - " 2.8129135867365944,\n", - " 2.6274016434130973,\n", - " 2.4407574694932386,\n", - " 2.2540668201412193,\n", - " 2.0676436180305604,\n", - " 1.8805714687074337,\n", - " 1.6924983298403085,\n", - " 1.506379287093013,\n", - " 1.316522817990967,\n", - " 1.1285859712859345,\n", - " 0.9430229614399827,\n", - " 0.7544675543855067,\n", - " 0.561407170424298,\n", - " 0.37187845683006154,\n", - " 0.18204462982356642,\n", - " -0.009185311839872331,\n", - " -0.20121323075174838,\n", - " -0.395215188944158,\n", - " -0.5892489776971399,\n", - " -0.7840904833928506,\n", - " -0.9788691849876674,\n", - " -1.1742991845436888,\n", - " -1.3694082648677244,\n", - " -1.566090331445052,\n", - " -1.7634382871097927,\n", - " -1.9619593125415025,\n", - " -2.161584877084847,\n", - " -2.362519614981662,\n", - " -2.5640987969249416,\n", - " -2.7649350836896023,\n", - " -2.966673830171186,\n", - " 3.1154444808759694,\n", - " 2.91490203419451,\n", - " 2.712423055065066,\n", - " 2.5071488143700265,\n", - " 2.3030465495064876,\n", - " 2.097088732293975,\n", - " 1.8879208728389256,\n", - " 1.6768425673161458,\n", - " 1.4661728615561327,\n", - " 1.252490772547974,\n", - " 1.0362722080809879,\n", - " 0.8180699652393353,\n", - " 0.5981768941025124,\n", - " 0.37713970887469733,\n", - " 0.15242661132471982,\n", - " -0.07693161148689913,\n", - " -0.31178895916639765,\n", - " -0.5525239192125634,\n", - " -0.7994954845539253,\n", - " -1.051127006802208,\n", - " -1.3066996237302078,\n", - " -1.5641618627388874,\n", - " -1.8230201362843257,\n", - " -2.083562947844965,\n", - " -2.343956440953144,\n", - " -2.6053730278673286,\n", - " -2.8683519178696817,\n", - " -3.132152578823861,\n", - " 2.8872920953776977,\n", - " 2.6256610329712435,\n", - " 2.370652630686787,\n", - " 2.125004799211656,\n", - " 1.8905925632084184,\n", - " 1.6691819655543654,\n", - " 1.4592803138877657,\n", - " 1.2596139542773384,\n", - " 1.0691587884262208,\n", - " 0.8873064258216831,\n", - " 0.707508835586725,\n", - " 0.5328184901807979,\n", - " 0.36144053283622934,\n", - " 0.18987860634411735,\n", - " 0.01709917167703673,\n", - " -0.15873454633721307,\n", - " -0.3352062958570742,\n", - " -0.5149910998180319,\n", - " -0.696433516908304,\n", - " -0.8750539939475772,\n", - " -1.0527366877700064,\n", - " -1.231903705283048,\n", - " -1.404871568357883,\n", - " -1.5713943458855526,\n", - " -1.7353126371336791,\n", - " -1.8964828297641938,\n", - " -2.049993269190271,\n", - " -2.203707853911233,\n", - " -2.3523604545372736,\n", - " -2.4964254305150853,\n", - " -2.6372490611548,\n", - " -2.7763903012229925,\n", - " -2.917266393033113,\n", - " -3.0577780761105644,\n", - " 3.0807529782061907,\n", - " 2.930705937428023,\n", - " 2.775350053502727,\n", - " 2.6200312491092115,\n", - " 2.4593025944789892,\n", - " 2.295699743465874,\n", - " 2.138590317088304,\n", - " 1.982356416900639,\n", - " 1.8202116829819857,\n", - " 1.6720486152538656,\n", - " 1.512464468900243,\n", - " 1.371308781495767,\n", - " 1.2375597191527623,\n", - " 1.0767866005800673,\n", - " 0.9368242043807584,\n", - " 0.7943621153773274,\n", - " 0.6538999347279995,\n", - " 0.5188922036965969,\n", - " 0.38959452139157347,\n", - " 0.24513175512537463,\n", - " 0.11132974138554518,\n", - " -0.04274015501516999,\n", - " -0.16993756552221392,\n", - " -0.3069346539085933,\n", - " -0.44679321649734777,\n", - " -0.5971430038889,\n", - " -0.7485228461463075,\n", - " -0.8899898307589587,\n", - " -1.0387652880075307,\n", - " -1.1891912793457242,\n", - " -1.3600087554236135,\n", - " -1.5001991227564042,\n", - " -1.641892938892661,\n", - " -1.796905939130636,\n", - " -1.9317395407644775,\n", - " -2.0653263071332564,\n", - " -2.2032368918755725,\n", - " -2.344697883843954,\n", - " -2.4644733459138664,\n", - " -2.6101505914591283,\n", - " -2.7193594592940613,\n", - " -2.862680284501814,\n", - " -2.9965949633329236,\n", - " 3.138945021791405,\n", - " 3.0332380708322284,\n", - " 2.874815043594395,\n", - " 2.724193928724211,\n", - " 2.6034833484710624,\n", - " 2.4433131117179867,\n", - " 2.273076475329651,\n", - " 2.142631961520665,\n", - " 1.9975653095579686,\n", - " 1.865871925122896,\n", - " 1.6868536330810981,\n", - " 1.5988409429506418,\n", - " 1.4429123365656216,\n", - " 1.2923650088441336])" - ] - }, - "execution_count": 54, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "v1.trace()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "v1.start(10e6)\n", - "v1.stop(800e6)\n", - "v1.avg(2)\n", - "v1.npts(100)" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "DataSet:\n", - " mode = DataMode.LOCAL\n", - " location = '2016-07-07/14-59-21'\n", - " | | | \n", - " Setpoint | VNA_power_set | power | (14,)\n", - " Measured | frequency | frequency | (14, 201)\n", - " Measured | VNA_magnitude | magnitude | (14, 201)\n", - " Measured | VNA_phase | phase | (14, 201)\n", - "started at 2016-07-07 14:59:22\n" - ] - } - ], - "source": [ - "data1 = qc.Loop(v1.power[-15:-1:1]).each(v1.trace).run(background = False)" - ] - }, - { - "cell_type": "code", - "execution_count": 55, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "application/javascript": [ - "/* Put everything inside the global mpl namespace */\n", - "window.mpl = {};\n", - "\n", - "mpl.get_websocket_type = function() {\n", - " if (typeof(WebSocket) !== 'undefined') {\n", - " return WebSocket;\n", - " } else if (typeof(MozWebSocket) !== 'undefined') {\n", - " return MozWebSocket;\n", - " } else {\n", - " alert('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", - " 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", - " fig.waiting = false;\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 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", - "\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('Close figure', toolbar_mouse_event);\n", - " buttongrp.append(button);\n", - " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", - " titlebar.prepend(buttongrp);\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", - " 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", - "\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" - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 53, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "qc.MatPlot(data1.VNA_magnitude)" - ] - }, - { - "cell_type": "code", - "execution_count": 48, - "metadata": {}, - "outputs": [], - "source": [ - "qc.QtPlot(data1.VNA_magnitude)" - ] - } - ], - "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.5.3" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/docs/examples/driver_examples/Qcodes example with Rohde Schwarz ZNB 20.ipynb b/docs/examples/driver_examples/Qcodes example with Rohde Schwarz ZNB 20.ipynb new file mode 100644 index 000000000000..d43ef5c6c032 --- /dev/null +++ b/docs/examples/driver_examples/Qcodes example with Rohde Schwarz ZNB 20.ipynb @@ -0,0 +1,3553 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Qcodes example with Rohde Schwarz ZN20" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "%matplotlib nbagg\n", + "import matplotlib.pyplot as plt\n", + "\n", + "import qcodes as qc" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import qcodes.instrument_drivers.rohde_schwarz.ZNB20 as vna" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Connected to: Rohde-Schwarz ZNB20-2Port (serial:1311601062101551, firmware:2.82) in 0.17s\n" + ] + } + ], + "source": [ + "vna = vna.ZNB20('VNA', 'TCPIP0::192.168.15.100::inst0::INSTR', server_name=None)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "station = qc.Station(vna)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The QCoDes driver for the Rohde Schwarz ZNB 20 is setup with 4 channels each containing one trace and reprecenting the 4 standars S parameters (S11, S12, S21 and S22). For each S parameter you can define a frequency sweep as and the power of the rf source i.e for s11 sweep from 100 KHz to 6 MHz in 100 steps:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "vna.start11(100e3)\n", + "vna.stop11(6e6)\n", + "vna.npts11(100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With a power of -30 dBm" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "vna.power11(-30)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can meassure a frequency trace, first remembering to turn on the rf source. This produces both a linear magnitude and phase" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "DataSet:\n", + " location = 'data/2017-05-24/#047_{name}_14-35-53'\n", + " | | | \n", + " Setpoint | frequency_set | frequency | (100,)\n", + " Measured | VNA_s11_magnitude | s11_magnitude | (100,)\n", + " Measured | VNA_s11_phase | s11_phase | (100,)\n", + "acquired at 2017-05-24 14:35:53\n" + ] + } + ], + "source": [ + "vna.rf_on()\n", + "data = qc.Measure(vna.trace11).run()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "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": [ + "data = qc.Measure(vna.trace11).run()\n", + "plot = qc.MatPlot(subplots=(1,2))\n", + "plot.add(data.VNA_s11_magnitude, subplot=1)\n", + "plot.add(data.VNA_s11_phase, subplot=2)\n", + "plot.fig.tight_layout(rect=(0, 0, 1, 0.95))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can also measure the magniture in dB." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "DataSet:\n", + " location = 'data/2017-05-24/#049_{name}_14-35-58'\n", + " | | | \n", + " Measured | VNA_tracedb11 | tracedb11 | (100,)\n", + "acquired at 2017-05-24 14:35:58\n" + ] + }, + { + "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": [ + "plot = qc.MatPlot(subplots=(1,2))\n", + "plot.add(data1.VNA_s11_magnitude, subplot=1)\n", + "plot.add(data1.VNA_s11_phase, subplot=2)\n", + "plot.fig.tight_layout(rect=(0, 0, 1, 0.95))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "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.5.3" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/qcodes/instrument_drivers/rohde_schwarz/ZNB20.py b/qcodes/instrument_drivers/rohde_schwarz/ZNB20.py index 1131115c5914..a98177594357 100644 --- a/qcodes/instrument_drivers/rohde_schwarz/ZNB20.py +++ b/qcodes/instrument_drivers/rohde_schwarz/ZNB20.py @@ -1,45 +1,72 @@ +from functools import partial +import logging + from qcodes import VisaInstrument from qcodes.utils import validators as vals from cmath import phase import numpy as np -from qcodes import MultiParameter, Parameter +from qcodes import MultiParameter, ArrayParameter +log = logging.getLogger(__name__) -class FrequencySweep(MultiParameter): +class FrequencySweepMagPhase(MultiParameter): """ Hardware controlled parameter class for Rohde Schwarz RSZNB20 trace. Instrument returns an list of transmission data in the form of a list of complex numbers taken from a frequency sweep. + This is a multiparameter containing both amplitude and phase + + Args: + name: parameter name + instrument: instrument the parameter belongs to + start: starting frequency of sweep + stop: ending frequency of sweep + npts: number of points in frequency sweep + channel: channel number. This maps to a hardware channel on znb + sindex: (tuple of ints) Which s'parameter this corresponds to. Only used for labels + + Methods: + set_sweep(start, stop, npts): sets the shapes and + setpoint arrays of the parameter to correspond with the sweep + get(): executes a sweep and returns magnitude and phase arrays + TODO: - - ability to choose for abs or db in magnitude return + - ability to choose for linear or db in magnitude return """ - def __init__(self, name, instrument, start, stop, npts): + def __init__(self, name, instrument, start, stop, npts, channel, sindex): super().__init__(name, names=("", ""), shapes=((), ())) self._instrument = instrument self.set_sweep(start, stop, npts) - self.names = ('magnitude', 'phase') - self.units = ('dBm', 'rad') + self._channel = channel + self._sindex = sindex + sname = 's' + str(sindex[0]) + str(sindex[1]) + self.names = ('{}_magnitude'.format(sname) , '{}_phase'.format(sname)) + self.labels = ('{} magnitude'.format(sname), '{} phase'.format(sname)) + self.units = ('', 'rad') + self.setpoint_units = (('Hz',), ('Hz',)) self.setpoint_names = (('frequency',), ('frequency',)) def set_sweep(self, start, stop, npts): - # needed to update config of the software parameter on sweep chage + # needed to update config of the software parameter on sweep change # freq setpoints tuple as needs to be hashable for look up f = tuple(np.linspace(int(start), int(stop), num=npts)) self.setpoints = ((f,), (f,)) self.shapes = ((npts,), (npts,)) def get(self): - self._instrument.write('SENS1:AVER:STAT ON') - self._instrument.write('AVER:CLE') + if not self._instrument.rf_power(): + log.warning("RF output is off") + self._instrument.write('SENS{}:AVER:STAT ON'.format(self._channel)) + self._instrument.write('SENS{}:AVER:CLE'.format(self._channel)) self._instrument.cont_meas_off() # instrument averages over its last 'avg' number of sweeps # need to ensure averaged result is returned - for avgcount in range(self._instrument.avg()): + for avgcount in range(getattr(self._instrument, 'avg{}{}'.format(*self._sindex))()): self._instrument.write('INIT:IMM; *WAI') - data_str = self._instrument.ask('CALC:DATA? SDAT').split(',') + data_str = self._instrument.ask('CALC{}:DATA? SDAT'.format(self._channel)).split(',') data_list = [float(v) for v in data_str] # data_list of complex numbers [re1,im1,re2,im2...] @@ -53,6 +80,68 @@ def get(self): return mag_array, phase_array +class FrequencySweep(ArrayParameter): + """ + Hardware controlled parameter class for Rohde Schwarz RSZNB20 trace. + + Instrument returns an array of transmission or reflection data depending on the + active measurement. + + Args: + name: parameter name + instrument: instrument the parameter belongs to + start: starting frequency of sweep + stop: ending frequency of sweep + npts: number of points in frequency sweep + channel: channel number. This maps to a hardware channel on znb + sindex: (tuple of ints) Which s'parameter this corresponds to. Only used for labels + + Methods: + set_sweep(start, stop, npts): sets the shapes and + setpoint arrays of the parameter to correspond with the sweep + get(): executes a sweep and returns magnitude and phase arrays + + """ + def __init__(self, name, instrument, start, stop, npts, channel, sindex): + sname = 's' + str(sindex[0]) + str(sindex[1]) + super().__init__(name, shape=(npts,), + instrument=instrument, + unit='dB', + label='{} magnitude'.format(sname), + setpoint_units=('Hz',), + setpoint_names=('frequency',)) + self.set_sweep(start, stop, npts) + self._channel = channel + self._sindex = sindex + + def set_sweep(self, start, stop, npts): + # needed to update config of the software parameter on sweep change + # freq setpoints tuple as needs to be hashable for look up + f = tuple(np.linspace(int(start), int(stop), num=npts)) + self.setpoints = (f,) + self.shape = (npts,) + + def get(self): + if not self._instrument.rf_power(): + log.warning("RF output is off") + format_param = getattr(self._instrument, 'format{}{}'.format(*self._sindex)) + old_format = format_param() + format_param('dB') + self._instrument.write('SENS{}:AVER:STAT ON'.format(self._channel)) + self._instrument.write('SENS{}:AVER:CLE'.format(self._channel)) + self._instrument.cont_meas_off() + + # instrument averages over its last 'avg' number of sweeps + # need to ensure averaged result is returned + for avgcount in range(getattr(self._instrument, 'avg{}{}'.format(*self._sindex))()): + self._instrument.write('INIT:IMM; *WAI') + data_str = self._instrument.ask('CALC{}:DATA? FDAT'.format(self._channel)) + data = np.array(data_str.rstrip().split(',')).astype('float64') + + self._instrument.cont_meas_on() + format_param(old_format) + return data + class ZNB20(VisaInstrument): """ qcodes driver for the Rohde & Schwarz ZNB20 virtual network analyser @@ -60,57 +149,104 @@ class ZNB20(VisaInstrument): Requires FrequencySweep parameter for taking a trace TODO: - - centre/span settable for frequwncy sweep + - centre/span settable for frequency sweep - check initialisation settings and test functions """ def __init__(self, name, address, **kwargs): super().__init__(name=name, address=address, **kwargs) + n = 1 + self._sindex_to_channel = {} + self._channel_to_sindex = {} + self._max_freq = 20e9 + self._min_freq = 100e3 + for i in range(1,3): + self._sindex_to_channel[i] = {} + for j in range(1,3): + self.add_parameter(name='power{}{}'.format(i, j), + label='Power{}{}'.format(i, j), + unit='dBm', + get_cmd='SOUR{}:POW?'.format(n), + set_cmd='SOUR{}'.format(n)+':POW {:.4f}', + get_parser=int, + vals=vals.Numbers(-150, 25)) + self.add_parameter(name='bandwidth{}{}'.format(i, j), + label='Bandwidth{}{}'.format(i, j), + unit='Hz', + get_cmd='SENS{}:BAND?'.format(n), + set_cmd='SENS{}'.format(n)+':BAND {:.4f}', + get_parser=int, + vals=vals.Numbers(1, 1e6)) + self.add_parameter(name='avg{}{}'.format(i ,j), + label='Averages{}{}'.format(i ,j), + unit='', + get_cmd='SENS{}:AVER:COUN?'.format(n), + set_cmd='SENS{}'.format(n)+':AVER:COUN {:.4f}', + get_parser=int, + vals=vals.Numbers(1, 5000)) + self.add_parameter(name='start{}{}'.format(i ,j), + get_cmd='SENS{}:FREQ:START?'.format(n), + set_cmd=partial(self._set_start, channel=n), + get_parser=float, + vals=vals.Numbers(self._min_freq, self._max_freq-10)) + self.add_parameter(name='stop{}{}'.format(i ,j), + get_cmd='SENS{}:FREQ:STOP?'.format(n), + set_cmd=partial(self._set_stop, channel=n), + get_parser=float, + vals = vals.Numbers(self._min_freq+1, self._max_freq)) + self.add_parameter(name='center{}{}'.format(i ,j), + get_cmd='SENS{}:FREQ:CENT?'.format(n), + set_cmd=partial(self._set_center, channel=n), + get_parser=float, + vals=vals.Numbers(self._min_freq + 0.5, self._max_freq-10)) + self.add_parameter(name='span{}{}'.format(i ,j), + get_cmd = 'SENS{}:FREQ:SPAN?'.format(n), + set_cmd=partial(self._set_span, channel=n), + get_parser=float, + vals = vals.Numbers(1, self._max_freq - self._min_freq)) + self.add_parameter(name='npts{}{}'.format(i ,j), + get_cmd='SENS:SWE:POIN?', + set_cmd=partial(self._set_npts, channel=n), + get_parser=int) + self.add_parameter(name='format{}{}'.format(i ,j), + get_cmd='CALC{}:FORM?'.format(n), + set_cmd='CALC{}:FORM {{}}'.format(n), + val_mapping={'dB': 'MLOG\n', + 'Linear Magnitude': 'MLIN\n', + 'Phase': 'PHAS\n', + 'Unwr Phase': 'UPH\n', + 'Polar': 'POL\n', + 'Smith': 'SMIT\n', + 'Inverse Smith': 'ISM\n', + 'SWR': 'SWR\n', + 'Real': 'REAL\n', + 'Imaginary': 'IMAG\n', + 'Delay': "GDEL\n", + 'Complex': "COMP\n" + }) - self.add_parameter(name='power', - label='Power', - unit='dBm', - get_cmd='SOUR:POW?', - set_cmd='SOUR:POW {:.4f}', - get_parser=int, - vals=vals.Numbers(-150, 25)) - - self.add_parameter(name='bandwidth', - label='Bandwidth', - unit='Hz', - get_cmd='SENS:BAND?', - set_cmd='SENS:BAND {:.4f}', - get_parser=int, - vals=vals.Numbers(1, 1e6)) - - self.add_parameter(name='avg', - label='Averages', - unit='', - get_cmd='AVER:COUN?', - set_cmd='AVER:COUN {:.4f}', - get_parser=int, - vals=vals.Numbers(1, 5000)) - - self.add_parameter(name='start', - get_cmd='SENS:FREQ:START?', - set_cmd=self._set_start, - get_parser=int) - - self.add_parameter(name='stop', - get_cmd='SENS:FREQ:STOP?', - set_cmd=self._set_stop, - get_parser=int) - - self.add_parameter(name='npts', - get_cmd='SENS:SWE:POIN?', - set_cmd=self._set_npts, - get_parser=int) - - self.add_parameter(name='trace', - start=self.start(), - stop=self.stop(), - npts=self.npts(), - parameter_class=FrequencySweep) + self.add_parameter(name='trace{}{}'.format(i, j), + start=getattr(self, 'start{}{}'.format(i, j))(), + stop=getattr(self, 'stop{}{}'.format(i, j))(), + npts=getattr(self, 'npts{}{}'.format(i, j))(), + channel=n, + sindex=(i, j), + parameter_class=FrequencySweepMagPhase) + self.add_parameter(name='tracedb{}{}'.format(i, j), + start=getattr(self, 'start{}{}'.format(i, j))(), + stop=getattr(self, 'stop{}{}'.format(i, j))(), + npts=getattr(self, 'npts{}{}'.format(i, j))(), + channel=n, + sindex=(i, j), + parameter_class=FrequencySweep) + self._sindex_to_channel[i][j] = n + self._channel_to_sindex[n] = (i, j) + n += 1 + + self.add_parameter(name='rf_power', + get_cmd='OUTP1?', + set_cmd='OUTP1 {}', + val_mapping={True: '1\n', False: '0\n'}) self.add_function('reset', call_cmd='*RST') self.add_function('tooltip_on', call_cmd='SYST:ERR:DISP ON') @@ -120,35 +256,115 @@ def __init__(self, name, address, **kwargs): self.add_function('update_display_once', call_cmd='SYST:DISP:UPD ONCE') self.add_function('update_display_on', call_cmd='SYST:DISP:UPD ON') self.add_function('update_display_off', call_cmd='SYST:DISP:UPD OFF') + self.add_function('display_sij_split', call_cmd='DISP:LAY GRID;:DISP:LAY:GRID 2,2') + self.add_function('display_sij_overlay', call_cmd='DISP:LAY GRID;:DISP:LAY:GRID 1,1') self.add_function('rf_off', call_cmd='OUTP1 OFF') self.add_function('rf_on', call_cmd='OUTP1 ON') + self._setup_s_channels() self.initialise() + self.autoscale_all() self.connect_message() - def _set_start(self, val): - self.write('SENS:FREQ:START {:.4f}'.format(val)) + + def autoscale_all(self): + for i in range(1,5): + self.write('DISPlay:TRACe1:Y:SCALe:AUTO ONCE, "Trc{}"'.format(i)) + + def _setup_s_channels(self): + """ + Sets up 4 channels with a single trace in each. + Each channel will contain one trace. + """ + for i in range(1,3): + for j in range(1,3): + n = self._sindex_to_channel[i][j] + self.write("CALC{}:PAR:SDEF 'Trc{}', 'S{}{}'".format(n, n, i, j)) + + def _set_start(self, val, channel): + self.write('SENS{}:FREQ:START {:.4f}'.format(channel, val)) + i, j = self._channel_to_sindex[channel] + stop = getattr(self, 'stop{}{}'.format(i, j))() + npts = getattr(self, 'npts{}{}'.format(i, j))() + + if val >= stop: + raise ValueError("Stop frequency must be larger than start frequency.") + # we get start as the vna may not be able to set it to the exact value provided + start = getattr(self, 'start{}{}'.format(i, j))() + if val != start: + log.warning("Could not set start to {} setting it to {}".format(val, start)) # update setpoints for FrequencySweep param - self.trace.set_sweep(val, self.stop(), self.npts()) + trace = getattr(self, 'trace{}{}'.format(i, j)) + trace.set_sweep(start, stop, npts) + tracedb = getattr(self, 'tracedb{}{}'.format(i, j)) + tracedb.set_sweep(start, stop, npts) - def _set_stop(self, val): - self.write('SENS:FREQ:STOP {:.4f}'.format(val)) + def _set_stop(self, val, channel): + i, j = self._channel_to_sindex[channel] + start = getattr(self, 'start{}{}'.format(i, j))() + npts = getattr(self, 'npts{}{}'.format(i, j))() + trace = getattr(self, 'trace{}{}'.format(i, j)) + if val <= start: + raise ValueError("Stop frequency must be larger than start frequency.") + self.write('SENS{}:FREQ:STOP {:.4f}'.format(channel, val)) + # we get stop as the vna may not be able to set it to the exact value provided + stop = getattr(self, 'stop{}{}'.format(i, j))() + if val != stop: + log.warning("Could not set stop to {} setting it to {}".format(val, stop)) # update setpoints for FrequencySweep param - self.trace.set_sweep(self.start(), val, self.npts()) + trace.set_sweep(start, stop, npts) + tracedb = getattr(self, 'tracedb{}{}'.format(i, j)) + tracedb.set_sweep(start, stop, npts) - def _set_npts(self, val): - self.write('SENS:SWE:POIN {:.4f}'.format(val)) + def _set_npts(self, val, channel): + self.write('SENS{}:SWE:POIN {:.4f}'.format(channel, val)) + i, j = self._channel_to_sindex[channel] + start = getattr(self, 'start{}{}'.format(i, j))() + stop = getattr(self, 'stop{}{}'.format(i, j))() + trace = getattr(self, 'trace{}{}'.format(i, j)) # update setpoints for FrequencySweep param - self.trace.set_sweep(self.start(), self.stop(), val) + trace.set_sweep(start, stop, val) + tracedb = getattr(self, 'tracedb{}{}'.format(i, j)) + tracedb.set_sweep(start, stop, val) + + def _set_span(self, val, channel): + self.write('SENS{}:FREQ:SPAN {:.4f}'.format(channel, val)) + i, j = self._channel_to_sindex[channel] + start = getattr(self, 'start{}{}'.format(i, j))() + stop = getattr(self, 'stop{}{}'.format(i, j))() + npts = getattr(self, 'npts{}{}'.format(i, j))() + trace = getattr(self, 'trace{}{}'.format(i, j)) + trace.set_sweep(start, stop, npts) + tracedb = getattr(self, 'tracedb{}{}'.format(i, j)) + tracedb.set_sweep(start, stop, npts) + + def _set_center(self, val, channel): + self.write('SENS{}:FREQ:CENT {:.4f}'.format(channel, val)) + i, j = self._channel_to_sindex[channel] + start = getattr(self, 'start{}{}'.format(i, j))() + stop = getattr(self, 'stop{}{}'.format(i, j))() + npts = getattr(self, 'npts{}{}'.format(i, j))() + trace = getattr(self, 'trace{}{}'.format(i, j)) + trace.set_sweep(start, stop, npts) + tracedb = getattr(self, 'tracedb{}{}'.format(i, j)) + tracedb.set_sweep(start, stop, npts) + + def _set_default_values(self): + for i in range(1,3): + for j in range(1,3): + getattr(self, 'start{}{}'.format(i,j))(1e6) + getattr(self, 'stop{}{}'.format(i, j))(2e6) + getattr(self, 'npts{}{}'.format(i, j))(10) + getattr(self, 'power{}{}'.format(i, j))(-50) def initialise(self): self.write('*RST') - self.write('SENS1:SWE:TYPE LIN') - self.write('SENS1:SWE:TIME:AUTO ON') - self.write('TRIG1:SEQ:SOUR IMM') - self.write('SENS1:AVER:STAT ON') + for n in range(1,5): + self.write('SENS{}:SWE:TYPE LIN'.format(n)) + self.write('SENS{}:SWE:TIME:AUTO ON'.format(n)) + self.write('TRIG{}:SEQ:SOUR IMM'.format(n)) + self.write('SENS{}:AVER:STAT ON'.format(n)) self.update_display_on() - self.start(1e6) - self.stop(2e6) - self.npts(10) - self.power(-50) + self._set_default_values() + self.rf_off() + self.display_sij_split() \ No newline at end of file