diff --git a/docs/examples/driver_examples/QCodes_example_with_SR86x_with_buffered_readout.ipynb b/docs/examples/driver_examples/QCodes_example_with_SR86x_with_buffered_readout.ipynb index 85cfa18f480..a07453cefde 100644 --- a/docs/examples/driver_examples/QCodes_example_with_SR86x_with_buffered_readout.ipynb +++ b/docs/examples/driver_examples/QCodes_example_with_SR86x_with_buffered_readout.ipynb @@ -1,19 +1,58 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Standford Research SR86x Lock-in Amplifier example (with buffered readout)\n", + "\n", + "This notebook provides a code example of usage of the driver for Standford Research SR86x lock-in amplifier. Special attention is given to reading the captured data from the lock-in's internal buffer.\n", + "\n", + "This notebook covers several capturing modes including starting capture at trigger, and capturing one sample per trigger. For the purpose of this example, a Tektronix AWG5208 will be used to send trigger signals. One can also use `qcodes.instrument_drivers.QuTech.IVVI` with its `trigger` method, or else." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setting up infrastructure for the examples" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Imports" + ] + }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "%matplotlib notebook\n", - "import time \n", "\n", + "# Useful utilities\n", + "import time\n", "import matplotlib.pyplot as plt \n", + "import numpy\n", "\n", + "# QCoDeS\n", "import qcodes\n", - "from qcodes.instrument_drivers.stanford_research.SR860 import SR860\n", - "from qcodes.instrument_drivers.QuTech.IVVI import IVVI" + "\n", + "# Drivers\n", + "from qcodes.instrument_drivers.stanford_research.SR860 \\\n", + " import SR860 # the lock-in amplifier\n", + "from qcodes.instrument_drivers.tektronix.AWG5208 \\\n", + " import AWG5208 # used for sending trigger signals" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Initialize the driver" ] }, { @@ -25,37 +64,40 @@ "name": "stdout", "output_type": "stream", "text": [ - "Connected to: Stanford_Research_Systems SR860 (serial:003101, firmware:V1.47) in 0.12s\n" + "Connected to: Stanford_Research_Systems SR860 (serial:003230, firmware:V1.47) in 0.23s\n" ] } ], "source": [ - "sr = SR860(\"sr\", \"GPIB0::4::INSTR\")" + "lockin = SR860(\"lockin\", \"GPIB0::4::INSTR\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Set capture configuration\n", + "\n", + "The lock-in needs to know what values shall be captured. Let's capture \"X\" and \"Y\"." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Initialized IVVI-rack in 0.02s\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "C:\\Users\\Administrator\\Documents\\development\\qcodes_dev\\qcodes\\instrument\\parameter.py:182: UserWarning: Delay kwarg is deprecated. Replace with inter_delay or post_delay as needed\n", - " warnings.warn(\"Delay kwarg is deprecated. Replace with \"\n" - ] - } - ], + "outputs": [], + "source": [ + "lockin.input_config('a')\n", + "lockin.buffer.capture_config('X,Y')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, "source": [ - "ivvi = IVVI(\"ivvi\", \"COM4\")" + "### Set lock-in parameters\n", + "\n", + "Let's tune the lock-in so that it measures something reasonable. Let's not attach any cables to the lock-in, and try to perform a measurement of the noise that the instrument is capturing. The most obvious noise source is the grid, 50 Hz, hence let's set the frequency of the lock-in amplifier somewhere below that frequency to see modulations instead of a flat value that we could have measured at 50 Hz." ] }, { @@ -64,174 +106,181 @@ "metadata": {}, "outputs": [], "source": [ - "sr.buffer.capture_config(\"X,Y\")\n", - "data = sr.buffer.capture_samples(100)" + "lockin.input_range(10e-3) # V\n", + "\n", + "lockin.sensitivity(500e-3) # V\n", + "lockin.frequency(27.3645) # Hz\n", + "lockin.time_constant(10e-3) # s" ] }, { - "cell_type": "code", - "execution_count": 5, + "cell_type": "markdown", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "99" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], "source": [ - "len(data[\"X\"])" + "### Initialize AWG" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "metadata": {}, "outputs": [ { - "data": { - "image/png": "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\nwgfvcgAAAABJRU5ErkJggg==\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" + "name": "stdout", + "output_type": "stream", + "text": [ + "Connected to: TEKTRONIX AWG5208 (serial:B020205, firmware:FV:6.0.0242.0) in 0.12s\n" + ] } ], "source": [ - "plt.plot(data[\"X\"])\n", - "plt.show()" + "awg = AWG5208(\"awg\", address='TCPIP0::169.254.254.84::inst0::INSTR')" ] }, { - "cell_type": "code", - "execution_count": 7, + "cell_type": "markdown", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaMAAAD8CAYAAADaOstiAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xl8VPW9//HXhyzs+yI7YQlIkE0Ddala0SpUKtyKFuqC\nXlttr/5sq7ZqW7tY2ytutFZt6261Ftcqeq87oFDLEmQRkCWGsAuBBAhL1vn8/pijN00zyQBJTjJ5\nPx+PeWTmO9/lc+aEfPie851zzN0REREJU7OwAxAREVEyEhGR0CkZiYhI6JSMREQkdEpGIiISOiUj\nEREJnZKRiIiETslIRERCp2QkIiKhSw47gMaiS5cunpaWFnYYIiKNytKlS3e7e9ea6ikZxSktLY2s\nrKywwxARaVTMbFM89XSYTkREQqdkJCIioVMyEhGR0CkZiYhI6JSMREQkdEpGIiISOiUjEREJnZKR\niIhUKRJx7nh9Ddm7DtT5WEpGIiJSpb8v28ajCzaybHNBnY+lZCQiIv+msKiU/35jLaP6dODCE3vX\n+Xi6HJCIiPyb+9/bwJ6DxTw2PZNmzazOx9PMSERE/kX2rgM88Y9cLj6pDyP7dKiXMZWMRETkC+7O\nr15bTcvUJH40fki9jatkJCIiX3hnzU7mb9jND88ZTJc2zettXCUjEREBoKi0nF//zxoGH9eGy07p\nV69jawGDiIgA8Oj8HLbkH+av3/4SKUn1O1fRzEhERNi+9zAPzv2UCSd057RBXep9fCUjERHhv99Y\nS8Sdn3xtaCjjKxmJiDRxi3L28NqK7Vxz5kD6dGoVSgxKRiIiTVhZeYRfzF5Nrw4t+d6ZA0OLQ8lI\nRKQJ+9vizaz9rJCfnj+UlqlJocWhZCQi0kTlHyzhnrfXc8qAzkw4oXuosSgZiYg0Ufe+vY4DxWX8\n8oJhmNX99eeqo2QkItIErdq2j2cXb+ayk/sxpHvbsMNRMhIRaWrcnV/OXk2nVqn88KuDww4HUDIS\nEWlyXlm+jaxNBfx4/BDat0wJOxwgzmRkZuPNbJ2ZZZvZLVW839zMngveX2RmaRXeuzUoX2dm59XU\np5n1D/rYEPSZWt0YZtbZzOaa2QEze6BSXPOCMZYHj25B+RVmlleh/NtH8qGJiDRWB4rL+O//XcvI\n3u256KQ+YYfzhRqTkZklAQ8CE4AMYJqZZVSqdhVQ4O6DgJnAjKBtBjAVGAaMBx4ys6Qa+pwBzHT3\ndKAg6DvmGEARcBtwU4xNuMTdRwWPXRXKn6tQ/mhNn4OISCL4w3sb2FVYzC8vGFYvN82LVzwzo7FA\ntrvnuHsJMAuYVKnOJOCp4PmLwNkWXZoxCZjl7sXuvhHIDvqrss+gzbigD4I+J1c3hrsfdPcFRJOS\niIjE8GneAR7/x0YuzuzN6L4dww7nX8STjHoBWyq83hqUVVnH3cuAfUDnatrGKu8M7A36qDxWrDFq\n8kRwKO42+9e1ixea2Uoze9HMGs5cVUSkDkRvmreGFilJ/Hj88WGH82/iSUZVzeM8zjq1VR5vHJVd\n4u7DgdODx2VB+WtAmruPAN7l/2Zc/8LMrjazLDPLysvLq2EoEZGG6501O/lgfV693zQvXvEko61A\nxZlDb2B7rDpmlgy0B/KraRurfDfQIeij8lixxojJ3bcFPwuBZ4keHsTd97h7cVDtEeCkGO0fdvdM\nd8/s2rVrdUOJiDRYRaXl3P56ODfNi1c8yWgJkB6scksluiBhdqU6s4HpwfMpwBx396B8arASrj+Q\nDiyO1WfQZm7QB0Gfr9YwRpXMLNnMugTPU4CJwKrgdY8KVS8APonjcxARaZT+/H4OWwsO88sLhtX7\nTfPiVeOdXt29zMyuA94CkoDH3X21md0OZLn7bOAx4GkzyyY6W5katF1tZs8Da4Ay4Fp3Lweoqs9g\nyJuBWWZ2B7As6JtYYwR95QLtgFQzmwycC2wC3goSURLRw3GPBE2uN7MLgpjygSvi/8hERBqPLfmH\neGheNueP6MGpA+v/pnnxsmomF1JBZmamZ2VlhR2GiMgR+e7TS3l/fR7v3XgmPTu0rPfxzWypu2fW\nVK9hztdEROSYLdiwmzdXf8a1Zw0MJREdCSUjEZEEVFoe4ZevraZvp1Z8+/QBYYdTIyUjEZEE9NSH\nuWTvOsDPJ2bQIiW8m+bFS8lIRCTB5BUW8/t3N/CVIV05e2i3sMOJi5KRiEiCmfHmWorKyvn5xIzQ\nb5oXLyUjEZEE8tHmAl5cupX//HJ/BnRtE3Y4cVMyEhFJEOUR5xevrua4ds25flx62OEcESUjEZEE\n8XzWFj7eto+ffG0orZvXeE2DBkXJSEQkAew9VMJdb65lbP9OXDCyZ9jhHDElIxGRBHDfO+vZd7iU\nX10wrNEsWqhIyUhEpJFbtW0fzyzcxGUn92Noj3Zhh3NUlIxERBqxSMS57dVVdGqdyg3nDgk7nKOm\nZCQi0oi9sHQLyzbv5dYJQ2nfMiXscI6akpGISCNVcLCEO99Yy5i0jnzjxF5hh3NMlIxERBqpu99e\nx/6iMm6fdEKjXLRQkZKRiEgjtHRTPn9bvJnpp6Q12kULFSkZiYg0MiVlEW59+WN6tGvBDecODjuc\nWtG4vqIrIiI8/MGnrN95gEcvz6RNI7vSQiyaGYmINCI5eQe4f0425w/vwTkZx4UdTq1RMhIRaSQi\nEecnf/+Y5snN+MXXM8IOp1YpGYmINBJ/XbSJhTn53DphKN3atQg7nFqlZCQi0gjk7j7Ib/93LWcM\n7sq0sX3CDqfWKRmJiDRw5RHnxhdWkJJk3HXhiEb/naKqJMYyDBGRBPbI/ByWbipg5jdH0r19Yh2e\n+5xmRiIiDdjq7fu47+31jB/WncmjGvclf6oTVzIys/Fmts7Mss3slireb25mzwXvLzKztArv3RqU\nrzOz82rq08z6B31sCPpMrW4MM+tsZnPN7ICZPVAprnnBGMuDR7dK708xMzezzHg+BxGR+lRYVMq1\nf/2Ijq1T+M1/NP5L/lSnxmRkZknAg8AEIAOYZmaV1xReBRS4+yBgJjAjaJsBTAWGAeOBh8wsqYY+\nZwAz3T0dKAj6jjkGUATcBtwUYxMucfdRwWNXhe1qC1wPLKrpMxARqW/uzq0vf8yWgsP8YdqJdG7T\nPOyQ6lQ8M6OxQLa757h7CTALmFSpziTgqeD5i8DZFk3hk4BZ7l7s7huB7KC/KvsM2owL+iDoc3J1\nY7j7QXdfQDQpHYlfA3cdRTsRkTr310WbeX3lDm48dzBj+3cKO5w6F08y6gVsqfB6a1BWZR13LwP2\nAZ2raRurvDOwN+ij8lixxqjJE8EhutuCZIeZjQb6uPvr1TU0s6vNLMvMsvLy8uIYSkTk2K3cupfb\nX1/DmYO78t0zBoYdTr2IJxlVdZDS46xTW+XxxlHZJe4+HDg9eFxmZs2IHua7sYa2uPvD7p7p7pld\nu3atqbqIyDHbub+I7/wli65tmnPfxSNp1ixxzxNVFE8y2gpU/IZVb2B7rDpmlgy0B/KraRurfDfQ\nIeij8lixxojJ3bcFPwuBZ4keHmwLnADMM7Nc4GRgthYxiEjYikrLufovWRQWlfHo9MyEP09UUTzJ\naAmQHqxySyW6IGF2pTqzgenB8ynAHHf3oHxqsBKuP5AOLI7VZ9BmbtAHQZ+v1jBGlcws2cy6BM9T\ngInAKnff5+5d3D3N3dOAhcAF7p4Vx2chIlIn3J2bX1rJiq37mPnNUQlxj6IjUeOXXt29zMyuA94C\nkoDH3X21md0OZLn7bOAx4GkzyyY6W5katF1tZs8Da4Ay4Fp3Lweoqs9gyJuBWWZ2B7As6JtYYwR9\n5QLtgFQzmwycC2wC3goSURLwLvDIUXxGIiJ17v73snl1+XZuOncw5w3rHnY49c6qmVxIBZmZmZ6V\npcmTiNS+55ds4ccvreQbJ/bi3otGJtT3icxsqbvXeBpEV2AQEQnRvHW7uPXvH3N6ehfu/EZiXncu\nHkpGIiIh+XjrPv7rrx8x5Li2/PHSk0hNbrp/kpvulouIhCh390GueGIxHVul8uSVYxLm9uFHS8lI\nRKSe7Sos4vLHFxNx5y9XjU24G+UdjaadikVE6llhUSlXPrGEvMJinv3OlxjYtU3YITUImhmJiNST\nkrII33vmI9Z9VsgfLz2R0X07hh1Sg6GZkYhIPfj8KtwLsndz95QRfGVIt5obNSGaGYmI1IOZ727g\npY+28sNzBnNRZp+aGzQxSkYiInXs+awt3P/eBi7O7M31Zw8KO5wGSclIRKQOLcnN56fBl1p/8x/D\nm+yXWmuiZCQiUke27T3Md59eSp+OrXjgWyeSkqQ/ubHokxERqQOHSsr49lNZlJRHeGR6Ju1bpoQd\nUoOmZCQiUsvcnR+9sJJ1n+3nD9NG67tEcVAyEhGpZU/8I5f/+XgHPx5/vJZwx0nJSESkFi3dlM9v\n//cTzs04jmvOGBB2OI2GkpGISC3Zc6CYa/+6jJ4dWnJ3gt2XqK7pCgwiIrUgEnF+8Nxy8g+V8PL3\nTtWChSOkmZGISC348wc5zN+wm19+fRgn9GofdjiNjpKRiMgxWra5gHvfXsf5w3swbawu9XM0lIxE\nRI7B/qJSrp+1jOPateC339AVFo6WzhmJiBwld+e2V1axfW8Rz19zss4THQPNjEREjtIry7fx6vLt\nfP/sdE7q1ynscBo1JSMRkaOwJf8QP39lNWPSOnLtWboS97FSMhIROULlEeeG55cDcN/Fo0hqpvNE\nx0rnjEREjtAf52WzJLeAmd8cSZ9OrcIOJyHENTMys/Fmts7Mss3slireb25mzwXvLzKztArv3RqU\nrzOz82rq08z6B31sCPpMrW4MM+tsZnPN7ICZPVAprnnBGMuDR7eg/Ltm9nFQtsDMMo7kQxORpmvF\nlr387t0NfH1kTyaP6hV2OAmjxmRkZknAg8AEIAOYVsUf76uAAncfBMwEZgRtM4CpwDBgPPCQmSXV\n0OcMYKa7pwMFQd8xxwCKgNuAm2JswiXuPip47ArKnnX34e4+CrgLuK+mz0FE5FBJGT98bjnd2jbn\njkknaBl3LYpnZjQWyHb3HHcvAWYBkyrVmQQ8FTx/ETjbontpEjDL3YvdfSOQHfRXZZ9Bm3FBHwR9\nTq5uDHc/6O4LiCaluLj7/govWwMeb1sRabru+J9P2LjnIPdePIr2rbSMuzbFk4x6AVsqvN4alFVZ\nx93LgH1A52raxirvDOwN+qg8VqwxavJEcDjuNqvw3xgzu9bMPiU6M7q+qoZmdrWZZZlZVl5eXhxD\niUiiemfNTp5dtJmrzxjAKQPj+dMjRyKeZFTVPLTyTCJWndoqjzeOyi5x9+HA6cHjsi8auj/o7gOB\nm4GfVdXY3R9290x3z+zatWsNQ4lIotpVWMQtL60ko0c7bvjq4LDDSUjxJKOtQMWLLfUGtseqY2bJ\nQHsgv5q2scp3Ax2CPiqPFWuMmNx9W/CzEHiW6OHBymbxf4cCRUT+xed3bT1QXMbvp46ieXJS2CEl\npHiS0RIgPVjllkp0QcLsSnVmA9OD51OAOe7uQfnUYCVcfyAdWByrz6DN3KAPgj5frWGMKplZspl1\nCZ6nABOBVcHr9ApVzwc2xPE5iEgT9NSHuby/Po+fnT+U9OPahh1Owqrxe0buXmZm1wFvAUnA4+6+\n2sxuB7LcfTbwGPC0mWUTna1MDdquNrPngTVAGXCtu5cDVNVnMOTNwCwzuwNYFvRNrDGCvnKBdkCq\nmU0GzgU2AW8FiSgJeBd4JGhynZmdA5QSXbH3eZITEfnCus8K+e0baxl3fDcuPblf2OEkNKtmciEV\nZGZmelZWVthhiEg9KSotZ/KD/2D3gRLe/MHpdGnTPOyQGiUzW+rumTXV0xUYRESqcOcba1n7WSFP\nXDlGiage6Np0IiKVzFm7kyc/zOXK09I4a0i3sMNpEpSMREQq2LW/iJteWMnQHu24ZcLxYYfTZCgZ\niYgEIhHnxhdWcKikjD9M0zLu+qRkJCISeHRBDvM37ObnE4cxqJuWcdcnJSMREaJX477rzXWMH9ad\naWP71NxAapWSkYg0eQeKy7h+1jK6tW3OnRcO19W4Q6Cl3SLS5P381VVsyT/ErKtPoUOr1LDDaZI0\nMxKRJu3vy7by8kfb+H/j0hnbv1PY4TRZSkYi0mTl7j7Iz/6+ijFpHfl/4waFHU6TpmQkIk1SSVmE\n62ctIzmpGb+bOprkJP05DJPOGYlIk3TP2+tYuXUff7r0JHp1aBl2OE2e/isgIk3O++vzePiDHC49\nuS/jT+gedjiCkpGINDG7Cou48fnlDD6uDT87PyPscCSgw3Qi0mREIs4Nz63gQHEZz37nZFqk6HI/\nDYWSkYg0GX/64FMWZO/mzm8MZ7Du2tqg6DCdiDQJSzcVcO/b65k4ogffHKPL/TQ0SkYikvD2Hirh\n+r8to2eHFvz2G7rcT0Okw3QiktAiEefG51ewq7CIF797Ku1apIQdklRBMyMRSWiPzM/hvbW7+OnX\nhjKyT4eww5EYlIxEJGFl5eZz11vr+Nrw7kw/NS3scKQaSkYikpB2FRZx3bPL6N2xJXdeOELniRo4\nnTMSkYRTUhbhv575iL2HS3j5itN0nqgRUDISkYRz++urydpUwP3TRpPRs13Y4Ugc4jpMZ2bjzWyd\nmWWb2S1VvN/czJ4L3l9kZmkV3rs1KF9nZufV1KeZ9Q/62BD0mVrdGGbW2czmmtkBM3ugUlzzgjGW\nB49uQfkNZrbGzFaa2Xtm1u9IPjQRabhmLd7MMws3c82ZA7hgZM+ww5E41ZiMzCwJeBCYAGQA08ys\n8gWdrgIK3H0QMBOYEbTNAKYCw4DxwENmllRDnzOAme6eDhQEfcccAygCbgNuirEJl7j7qOCxKyhb\nBmS6+wjgReCumj4HEWn4PszezW2vruL09C78+Lzjww5HjkA8M6OxQLa757h7CTALmFSpziTgqeD5\ni8DZFj1bOAmY5e7F7r4RyA76q7LPoM24oA+CPidXN4a7H3T3BUSTUlzcfa67HwpeLgR6x9tWRBqm\nT3bs55qnl9K/S2se+NaJJDXTgoXGJJ5k1AvYUuH11qCsyjruXgbsAzpX0zZWeWdgb9BH5bFijVGT\nJ4JDdLdZ1ctprgLeiKMfEWmgtu89zJVPLKFV8ySevHIs7VtqwUJjE08yquoPuMdZp7bK442jskvc\nfThwevC4rOKbZnYpkAncXVVjM7vazLLMLCsvL6+GoUQkDPkHS7jiicUcKC7jySvH0lM3ymuU4klG\nW4GKVxXsDWyPVcfMkoH2QH41bWOV7wY6BH1UHivWGDG5+7bgZyHwLNHDgwR9nAP8FLjA3YtjtH/Y\n3TPdPbNr167VDSUiIdhzoJhvPbKQTXsO8fBlJzG0h1bONVbxJKMlQHqwyi2V6IKE2ZXqzAamB8+n\nAHPc3YPyqcFKuP5AOrA4Vp9Bm7lBHwR9vlrDGFUys2Qz6xI8TwEmAquC16OBPxNNRLti9SEiDdfu\nA8V865FFbNx9kMemj+HUQV3CDkmOQY3fM3L3MjO7DngLSAIed/fVZnY7kOXus4HHgKfNLJvobGVq\n0Ha1mT0PrAHKgGvdvRygqj6DIW8GZpnZHURXvT0WlFc5RtBXLtAOSDWzycC5wCbgrSARJQHvAo8E\nTe4G2gAvBKeRNrv7BfF/bCISps/2FXH544vYnH+Ix68Yw2lKRI2eVTO5kAoyMzM9Kysr7DBEmrw1\n2/fzn08uobColEemZ3LqQCWihszMlrp7Zk31dAUGEWk05q7dxXXPfkS7lim8+L1TdY4ogSgZiUiD\nF4k4D8/P4a431zK0Rzsev2IMx7VrEXZYUouUjESkQdt3qJQbX1jBu5/s5PzhPbhryghaN9efrkSj\nPSoiDdbKrXu59tmP2LG3iF98PYMrTk3TrSASlJKRiDQ4kYjz2IKN3PXWWrq0ac5z15zCSf06hh2W\n1CElIxFpUPYcKObGF1Ywb10e52Ycx11TRtChVWrYYUkdUzISkQZj8cZ8/t/fPqLgUCm/njSMS0/u\np8NyTYSSkYiELhJx/vxBDve8vY6+nVrxxBVjdVO8JkbJSERCdaC4jBueW87ba6Kr5e68cDhtdZvw\nJkfJSERCsyX/EN9+KovsvAP8fGIGV56m1XJNlZKRiIRiUc4evvvMUsojzpNXjuH0dF0ZvylTMhKR\nevfGxzv4/qzl9O7Ukkcvz2RA1zZhhyQhUzISkXr1zMJN3PbqKkb36cDjV4zRsm0BlIxEpJ64O3+Y\nk81976xn3PHdePBbJ9IyNSnssKSBUDISkTrn7tzz9joenPsp3zixFzMuHEFKUjz39pSmQslIROqU\nu/Pb//2ER+ZvZNrYvvxm8gk0a6YVc/KvlIxEpM64O796bQ1PfpjL9FP68csLhmnptlRJyUhE6oS7\nc/vr0UR01Zf787PzhyoRSUw6aCsite7zQ3NP/COXK09LUyKSGikZiUitcndmvLmOR+ZvZPop/fj5\nxAwlIqmRkpGI1Bp359631/On9z/l0pP76hyRxE3JSERqze/f28ADc7OZNrYPt19wghKRxE3JSERq\nxQNzNvC7dzcw5aTe/GbycC3fliOiZCQix+zBudnc8/Z6/mN09AutSkRypJSMROSYPDg3m7vfWsek\nUT25e8oIkpSI5CjElYzMbLyZrTOzbDO7pYr3m5vZc8H7i8wsrcJ7twbl68zsvJr6NLP+QR8bgj5T\nqxvDzDqb2VwzO2BmD1SKa14wxvLg0S0oP8PMPjKzMjObciQfmIj8n4qJ6N6LRpKsS/zIUarxN8fM\nkoAHgQlABjDNzDIqVbsKKHD3QcBMYEbQNgOYCgwDxgMPmVlSDX3OAGa6ezpQEPQdcwygCLgNuCnG\nJlzi7qOCx66gbDNwBfBsTdsvIlV7YM4GJSKpNfH89owFst09x91LgFnApEp1JgFPBc9fBM626DKa\nScAsdy92941AdtBflX0GbcYFfRD0Obm6Mdz9oLsvIJqU4uLuue6+EojE20ZEotyd+95Z/8U5IiUi\nqQ3x/Ab1ArZUeL01KKuyjruXAfuAztW0jVXeGdgb9FF5rFhj1OSJ4BDdbaZ1piLHxN25+6113P9e\ndNXcPUpEUkvi+S2q6g+4x1mntsrjjaOyS9x9OHB68Lishvr/wsyuNrMsM8vKy8s7kqYiCcfd+c3/\nfMJD8z5l2tg+3HWhFitI7YknGW0F+lR43RvYHquOmSUD7YH8atrGKt8NdAj6qDxWrDFicvdtwc9C\noueHxla7pf/e/mF3z3T3zK5dux5JU5GEEok4t726ikcXbOTyU/rpe0RS6+JJRkuA9GCVWyrRBQmz\nK9WZDUwPnk8B5ri7B+VTg5Vw/YF0YHGsPoM2c4M+CPp8tYYxqmRmyWbWJXieAkwEVsWxvSJSQXnE\nufmllTyzcDPXnDGAX10wTIlIal2Nt5Bw9zIzuw54C0gCHnf31WZ2O5Dl7rOBx4CnzSyb6GxlatB2\ntZk9D6wByoBr3b0coKo+gyFvBmaZ2R3AsqBvYo0R9JULtANSzWwycC6wCXgrSERJwLvAI0H9McDf\ngY7A183sV+4+7Mg+OpHEV1oe4YbnV/Daiu18/+x0fnBOui7xI3XCqplcSAWZmZmelZUVdhgi9aao\ntJzrnl3Gu5/s5JYJx/PdMweGHZI0Qma21N0za6qnm+uJyL85XFLO1U9nMX/Dbm6fNIzLT0kLOyRJ\ncEpGIvIv9heVctWTS1i6qYC7p4zgosw+NTcSOUZKRiLyhT0Hirn88cWs31nI/dNGM3FEz7BDkiZC\nyUhEANix7zCXPrqIbXsP8/DlmZw1pFvYIUkTomRUxyKR6AIRLYWVhix7VyHTH1/CvsOl/OU/v8TY\n/p3CDkmaGF3Ho469/vEOJvx+Pm+u2oFWLkpDtHRTAVP+9E+KyyLMuvpkJSIJhZJRHWvbIpnSSITv\nPvMRE/+wgPc+2amkJA3Gu2t2csmjC+nQMoWXv3cqJ/RqH3ZI0kTpMF0dO2tIN04f1IVXlm/n9++t\n56qnshjeqz3XjRvEV4cep8N3Egp3588f5DDjzbUM79Wex68YQ5c2zcMOS5owfek1TrXxpdfS8ggv\nf7SVB+d+yub8QxzfvS3/ddYgzh/eQxeclHpTVFrOT17+mJeXbeP8ET24Z8pIWqYmhR2WJKh4v/Sq\nZBSn2rwCQ1l5hNdWbueBOdl8mneQ/l1a870zBzJ5dC9Sk3XkVOpOTt4BfvDcclZu3ceNXx3MdeMG\n6fI+UqeUjGpZXVwOKBJx3lr9GQ/MzWb19v30aN+C75w+gKlj+9AqVUdQpfa4O39bvIVfv76G1ORm\n3DVlBOcN6x52WNIEKBnVsrq8Np27M299Hn+c+ymLc/Pp2CqF6aemcfkpaXRqnVonY0rTkbv7ILe/\nvoY5a3fx5UFduOeikXRv3yLssKSJUDKqZfV1odSs3Hwemvcpc9buokVKMy46qQ9Xfbk/aV1a1/nY\nklj2HSrl/jkb+Ms/c0lJasaN5w7hylPTtGhG6pWSUS2r76t2r99ZyKPzc3hl2XZKIxHOPr4bV57W\nn1MHdtYxfqnW5j2HeHphLs8t2UJhcRnfzOzDDV8dTLd2mg1J/VMyqmVh3UJi1/4inlm4iWcWbSb/\nYAlDjmvL9FPTmDy6p84ryRf2HSrlvbU7eX3lDuau20UzM8YP6861Zw0io2e7sMOTJkzJqJaFfT+j\notJyZi/fzpMf5rJmx37atUhm2ti+TD81jZ4dWoYWl4TD3Vm/8wDzN+Qxb10eC3P2UBZxurdrwcWZ\nvfnWl/rpvJA0CEpGtSzsZPQ5dydrUwFP/iOXN1d/BsDXhvfgO6f3Z0TvDiFHJ3Vp36FS5mdHk88H\n6/PYVVgMwMCurflqRnfGn9CdEb3a65yQNCi6uV6CMjPGpHViTFonthYc4qkPc5m1eAuvrdjOmYO7\n8v1z0jmxb8eww5Rasu9QKW+u3sFrK3bwz5w9lEec9i1T+HJ6F85M78qX07toZiwJQTOjODWUmVFV\nCotKeXrhJh75IIeCQ6WcObgrP/naUIZ0bxt2aHIU3J0luQU89WEub6/5jNJyJ61zK84f0YNxx3dj\nZO8OJCcgx1teAAAMEklEQVTpy9HSOOgwXS1ryMnocweLy3h64Sb+OO9TCotK+daX+nLDV4fou0qN\nRGl5hFeXb+exBRv5ZMd+2rdM4cITezN5dE+G92qvVZTSKCkZ1bLGkIw+V3CwhN+9u55nFm2mdWoS\nP5uYwUUn9dYfswaqqmsWXnFqGpNG9dI146TRUzKqZY0pGX1uw85CfvrKKhZvzOf09C789j+G06dT\nq7DDkkAk4sxesZ1731nHlvzDjOjdnuvHpXP20G76j4MkDCWjWtYYkxFE/+D9ddEm7nxjLQ784usZ\nXJzZR3/sQuTuzFuXx4w317L2s0IyerTjpvMGc9YQJSFJPFpNJ0D0dueXnZLGWcd340cvrOTmlz5m\nztpd3PmNEXTUuaR699HmAu58Yy2LN+bTt1Mrfj91FF8f0VPLsaXJ08woTo11ZlRRJOI8Mj+He95e\nR8dWqdx78UhOT+8adlhNwvqdhdz79jreWr2TLm1S+f7Z6XxzTF/dMkQSXrwzo7j+JZjZeDNbZ2bZ\nZnZLFe83N7PngvcXmVlahfduDcrXmdl5NfVpZv2DPjYEfaZWN4aZdTazuWZ2wMweqBTXvGCM5cGj\nW03xJrJmzYxrzhzIK9eeRruWKVz22GLueH0NxWXlYYeWsDbtOcgPn1vOeb/7gH9k7+GH5wzm/R+d\nxWWnpCkRiVRQ478GM0sCHgQmABnANDPLqFTtKqDA3QcBM4EZQdsMYCowDBgPPGRmSTX0OQOY6e7p\nQEHQd8wxgCLgNuCmGJtwibuPCh67auirSRjWsz2vXfdlLju5H48u2MjkBz9k7Wf7ww4roeTuPsiP\nXljBuHvf541VO7j6jAHM//FZfP+cdFo319Fxkcri+a/ZWCDb3XPcvQSYBUyqVGcS8FTw/EXgbIue\niZ0EzHL3YnffCGQH/VXZZ9BmXNAHQZ+TqxvD3Q+6+wKiSSleseJtMlqmJvHrySfw2PRMdu0vYuL9\nC7jvnfWUlEXCDq1Ry951gBueX87Z973P7BXbuezkfnzwo7O4dcJQnaMTqUY8/0XrBWyp8Hor8KVY\nddy9zMz2AZ2D8oWV2vYKnlfVZ2dgr7uXVVE/1hi7a4j/CTMrB14C7vDoSbK4+jKzq4GrAfr27VvD\nMI3T2UOP450bzuT211Zz/3sbeHPVDn496QS+NKBz2KE1Kqu27eOhedm8seozmic344pT07jmjAG6\nbYNInOJJRlXNGCqveohVJ1Z5VTOy6urHG0dll7j7NjNrSzQZXQb8Jd6+3P1h4GGILmCoYaxGq1Pr\nVH43dTQXjOrJT/++im8+vJBxx3fjx+OHcHx33X4gFndnYU4+f3r/U95fn0fb5sn811cGcuVp/enS\npnnY4Yk0KvEko61AnwqvewPbY9TZambJQHsgv4a2VZXvBjqYWXIwO6pYP9YYMbn7tuBnoZk9S/Tw\n4F+Opq+mYNzxxzHnxi48+WEuf5yXzYTfz+fcjOOYNrYvp6d3JUnLjwEojzjvrPmMP72fw/Ite+nS\nJpUfnTeES0/uR/uWKWGHJ9IoxZOMlgDpZtYf2EZ0QcK3KtWZDUwH/glMAea4u5vZbOBZM7sP6Amk\nA4uJzkz+rc+gzdygj1lBn69WN0asoIMk08Hdd5tZCjARePdo+mpKWqYm8b2vDGTa2D48/EEOs5Zs\n4a3VO+nVoSUTR/Tg5IGdGZPWiTZN8CT8oZIyXlq6lUcXbGTTnkP07dSKOyafwJSTetMiRZftETkW\ncX3PyMy+BvwOSAIed/ffmNntQJa7zzazFsDTwGiiM4yp7p4TtP0p8J9AGfADd38jVp9B+QCiiagT\nsAy41N2LaxgjF2gHpAJ7gXOBTcAHQEowxrvADe5eXl1fsSTC94yORklZhHfW7GTWks0szNlDabmT\n1MwYfFxb+ndpRb/OrenVoSUdW6XSvmUK7Vom0zIliRYpSTRPaUZqUjNSkpqRnGQkmdHMDDOIOETc\nKY84xWURikrLKSot52BxOQeKyzhYXMaB4jIOl5RzsKSM0vIIn/+qJic1o0PLFDq0SqFzm+b079ya\n9q3qbkaycfdBnv7nJl5YuoXCojJG9enANWcM4Nxh3TVbFKmBLgdUy5pqMqrocEk5SzcV8M+c3azZ\nvp9New6xOf8QZZHwf4c6tU5lYNfWDOvZnpF92jO8VwcGdGl91Fc2KDhYwhurPmP2im0szMknuZkx\nYXgPpp/Sj5P6ddRle0TipGRUy5SMqlZWHmH3gRL2HS5l76ES9heVfTHLKSqLUFYeobQ8Qmm5E4n4\nFzOiZmY0s+gXcZsnN6NFMJtq0zyJNs1TaN08iTbNk2mZmkTr1GRSkpthgFl0thYdr5RdhcXk7j5I\nzu6DbNhZyOrt+zlcGv0Sb9sWyYzs3YERvdszpHtbBnZtw8Cubf7tStjlESf/YAlrduwnKzefJbn5\nZOUWUBZxBnRpzeTRvZg6po9WxokcBV2bTupFclIzurdvQff29feHulUqdGiVSr8qVp+XlUf4NO8g\nK7bsZcXWvSzfspc/f5BDeYXZW6vUJFo3T6Z1ahIHisvJP1jM5283M8jo2Y6rTu/PBSN7ktGjnWZB\nIvVAyUgSSnJSM4Z0b8uQ7m25eEx0wWZRaTmb9hwie9cBcvIOsO9wKQdLyjhYXE6r1CS6tGlOlzap\nDOrWllF9OzTJxRkiYdO/Okl4LVKSvkhQItIw6UqNIiISOiUjEREJnZKRiIiETslIRERCp2QkIiKh\nUzISEZHQKRmJiEjolIxERCR0ujZdnMwsj+iVwI9GF2q+I20iaqrbDU1327XdTUs8293P3bvW1JGS\nUT0ws6x4LhSYaJrqdkPT3XZtd9NSm9utw3QiIhI6JSMREQmdklH9eDjsAELSVLcbmu62a7ubllrb\nbp0zEhGR0GlmJCIioVMyqmNmNt7M1plZtpndEnY8dcXM+pjZXDP7xMxWm9n3g/JOZvaOmW0IfnYM\nO9a6YGZJZrbMzF4PXvc3s0XBdj9nZqlhx1jbzKyDmb1oZmuD/X5KU9jfZvbD4Hd8lZn9zcxaJOr+\nNrPHzWyXma2qUFblPrao+4O/dSvN7MQjGUvJqA6ZWRLwIDAByACmmVlGuFHVmTLgRncfCpwMXBts\n6y3Ae+6eDrwXvE5E3wc+qfB6BjAz2O4C4KpQoqpbvwfedPfjgZFEtz+h97eZ9QKuBzLd/QQgCZhK\n4u7vJ4Hxlcpi7eMJQHrwuBr445EMpGRUt8YC2e6e4+4lwCxgUsgx1Ql33+HuHwXPC4n+YepFdHuf\nCqo9BUwOJ8K6Y2a9gfOBR4PXBowDXgyqJNx2m1k74AzgMQB3L3H3vTSB/U30DtktzSwZaAXsIEH3\nt7t/AORXKo61jycBf/GohUAHM+sR71hKRnWrF7ClwuutQVlCM7M0YDSwCDjO3XdANGEB3cKLrM78\nDvgxEAledwb2untZ8DoR9/sAIA94Ijg8+aiZtSbB97e7bwPuATYTTUL7gKUk/v6uKNY+Pqa/d0pG\ndcuqKEvo5Ytm1gZ4CfiBu+8PO566ZmYTgV3uvrRicRVVE22/JwMnAn9099HAQRLskFxVgvMjk4D+\nQE+gNdHDU5Ul2v6OxzH93isZ1a2tQJ8Kr3sD20OKpc6ZWQrRRPRXd385KN75+VQ9+LkrrPjqyGnA\nBWaWS/Qw7DiiM6UOwWEcSMz9vhXY6u6LgtcvEk1Oib6/zwE2unueu5cCLwOnkvj7u6JY+/iY/t4p\nGdWtJUB6sNImleiJztkhx1QngvMkjwGfuPt9Fd6aDUwPnk8HXq3v2OqSu9/q7r3dPY3o/p3j7pcA\nc4EpQbVE3O7PgC1mNiQoOhtYQ4Lvb6KH5042s1bB7/zn253Q+7uSWPt4NnB5sKruZGDf54fz4qEv\nvdYxM/sa0f8pJwGPu/tvQg6pTpjZl4H5wMf837mTnxA9b/Q80JfoP+SL3L3yCdGEYGZfAW5y94lm\nNoDoTKkTsAy41N2Lw4yvtpnZKKKLNlKBHOBKov/BTej9bWa/Ar5JdAXpMuDbRM+NJNz+NrO/AV8h\nenXuncAvgFeoYh8HyfkBoqvvDgFXuntW3GMpGYmISNh0mE5EREKnZCQiIqFTMhIRkdApGYmISOiU\njEREJHRKRiIiEjolIxERCZ2SkYiIhO7/A3Qm5CO0GUcgAAAAAElFTkSuQmCC\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], "source": [ - "plt.plot(data[\"Y\"])\n", - "plt.show()" + "## One-shot immediate capture\n", + "\n", + "We are going to capture a number of data points (also referred to as samples) at a capture rate, retrieve data from the buffer, and plot it." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "# Lets capture by sending triggers. We use the IVVI to send triggers." + "### Set capture rate\n", + "\n", + "The lock-in will be capturing data at some rate. Let's set this rate:" ] }, { "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], + "execution_count": 6, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Capture rate is set to 1220.703125\n" + ] + } + ], "source": [ - "def send_trigger(): \n", - " ivvi.trigger()\n", - " time.sleep(0.1)" + "lockin.buffer.capture_rate(1220.7)\n", + "print(f\"Capture rate is set to {lockin.buffer.capture_rate()}\")" ] }, { - "cell_type": "code", - "execution_count": 9, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "n_samples = 100\n", - "sr.buffer.start_capture(\"ONE\", \"SAMP\")\n", - "\n", - "time.sleep(0.1)\n", - "for _ in range(n_samples): \n", - " send_trigger()\n", - "\n", - "sr.buffer.stop_capture()\n", - "\n", - "data = sr.buffer.get_capture_data(n_samples)" + "In case you want to capture data at a maximum possible rate, but you do not remember the value of the maximum possible capture rate, the convenient `set_capture_rate_to_maximum` method can be used: " ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 7, "metadata": {}, "outputs": [ { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" + "name": "stdout", + "output_type": "stream", + "text": [ + "Capture rate is set to its maximum: 39062.5\n" + ] } ], "source": [ - "plt.plot(data[\"X\"])\n", - "plt.show()" + "lockin.buffer.set_capture_rate_to_maximum()\n", + "print(f\"Capture rate is set to its maximum: {lockin.buffer.capture_rate()}\")" ] }, { - "cell_type": "code", - "execution_count": 13, + "cell_type": "markdown", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "100" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], "source": [ - "len(data[\"X\"])" + "### Capture data\n", + "\n", + "Now let's acquire some data:" ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "DataSet:\n", - " location = 'data/2017-11-28/#002_{name}_15-57-34'\n", - " | | | \n", - " Measured | X | X | (100,)\n", - "acquired at 2017-11-28 15:57:34\n" + "The number of acquired X data points is 678\n", + "The number of acquired Y data points is 678\n" ] } ], "source": [ - "meas = qcodes.Measure(sr.buffer.X)\n", - "data = meas.run()" + "sample_count = 678\n", + "\n", + "# Set the capture length (which is a portion of the buffer size) \n", + "# to fit the number of samples that we want to capture.\n", + "# For more information about the maximum buffer size, \n", + "# and other buffer-related properties, refer to the instrument manual.\n", + "lockin.buffer.set_capture_length_to_fit_samples(sample_count)\n", + "\n", + "# Start capturing data immediately, \n", + "# and without overwriting the buffer in case it gets full.\n", + "# For more information about the capture modes, refer to the instrument manual.\n", + "lockin.buffer.start_capture(\"ONE\", \"IMM\")\n", + "\n", + "# We call this blocking method to wait until \n", + "# the requested number of samples is captured.\n", + "lockin.buffer.wait_until_samples_captured(sample_count)\n", + "\n", + "# Stop capturing.\n", + "lockin.buffer.stop_capture()\n", + "\n", + "# Retrieve the data from the buffer.\n", + "# The returned data is a dictionary where keys are names of the variables\n", + "# from the capture config, and values are the captured values.\n", + "data = lockin.buffer.get_capture_data(sample_count)\n", + "\n", + "print(f\"The number of acquired X data points is {len(data['X'])}\")\n", + "print(f\"The number of acquired Y data points is {len(data['Y'])}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For convenience, the measurement code from above is encapsulated into a convenient `capture_samples` method of the lock-in buffer:" ] }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 9, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "data = lockin.buffer.capture_samples(sample_count)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's plot the captured data:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -316,7 +365,7 @@ " };\n", "\n", " this.imageObj.onunload = function() {\n", - " this.ws.close();\n", + " fig.ws.close();\n", " }\n", "\n", " this.ws.onmessage = this._make_on_message_function(this);\n", @@ -793,7 +842,7 @@ "};\n", "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n", "\n", - "mpl.extensions = [\"eps\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\"];\n", + "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n", "\n", "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n", " // Create a \"websocket\"-like object which calls the given IPython comm\n", @@ -811,7 +860,7 @@ " // Register the callback with on_msg.\n", " comm.on_msg(function(msg) {\n", " //console.log('receiving', msg['content']['data'], msg);\n", - " // Pass the mpl event to the overriden (by mpl) onmessage function.\n", + " // Pass the mpl event to the overridden (by mpl) onmessage function.\n", " ws.onmessage(msg['content']['data'])\n", " });\n", " return ws;\n", @@ -963,9 +1012,12 @@ " // 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", + " 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", @@ -1014,7 +1066,7 @@ { "data": { "text/html": [ - "" + "" ], "text/plain": [ "" @@ -1025,35 +1077,2864 @@ } ], "source": [ - "plot = qcodes.MatPlot()\n", - "plot.add(data.X)" + "# Set the figure size to be more convenient then the defaults\n", + "fig = plt.figure(figsize=(6, 3))\n", + "\n", + "# plot values of all the captured variables\n", + "for var_name in data:\n", + " plt.plot(data[var_name], label=var_name)\n", + "plt.xlabel(\"Sample, #\")\n", + "plt.ylabel(\"Measured value, V\")\n", + "\n", + "plt.legend() # show legend\n", + "plt.tight_layout() # adjust the figure so that all the labels fit" ] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" + "source": [ + "### Access captured data via Parameter interface\n", + "\n", + "The SR86x driver has the capture variables (X, Y, R, theta) as QCoDeS Parameters in the buffer. This allows to use `lockin.buffer.X.get()` syntax to retrieve the captured data. Beware that it is necessary that the `lockin.buffer.get_capture_data` method has been called before retrieving data via Parameters (in other words, `lockin.buffer.X.get()` does not initiate a new capture, it just returns the latest captured data).\n", + "\n", + "For the sake of demonstration, let's plot the captured data again, but now using the Parameters (notice that this plot contains the same data as the one above):" + ] }, - "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.6.3" + { + "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", + " fig.ws.close();\n", + " }\n", + "\n", + " this.ws.onmessage = this._make_on_message_function(this);\n", + "\n", + " this.ondownload = ondownload;\n", + "}\n", + "\n", + "mpl.figure.prototype._init_header = function() {\n", + " var titlebar = $(\n", + " '
');\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", + " 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" + } + ], + "source": [ + "# Set the figure size to be more convenient then the defaults\n", + "fig = plt.figure(figsize=(6, 3))\n", + "\n", + "# plot values of all the captured variables\n", + "for var_name in data:\n", + " plt.plot(data[var_name], label=var_name) \n", + "plt.xlabel(\"Sample, #\")\n", + "plt.ylabel(\"Measured value, V\")\n", + "\n", + "plt.legend() # show legend\n", + "plt.tight_layout() # adjust the figure so that all the labels fit" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Capturing one sample per trigger\n", + "\n", + "In this example, we are going to initiate data capture that will capture one sample per received trigger signal. Lock-in amplifier SR860 reacts on the falling edge of the trigger signal. We are going to use a marker of an AWG channel to send the triggers." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Setup AWG to emit a trigger pulse train\n", + "\n", + "The following code is specific to the AWG5208 that is used in this example. One is welcome to use waveform generation frameworks like `broadbean` rather than the low-level kind of interaction with the AWG driver below." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "awg.sample_rate(3000) # S/s\n", + "\n", + "# Create a waveform where the analog channel plays 0s,\n", + "# while the marker channel plays \n", + "# a number of falling edges from 1 to 0.\n", + "\n", + "n_samples_in_waveform = 3000\n", + "# the waveform will have a length of 1s\n", + "waveform_ch1 = numpy.zeros((2, n_samples_in_waveform))\n", + "\n", + "n_trigger_pulses = 100\n", + "waveform_ch1[1, :] = numpy.tile(\n", + " numpy.concatenate(( # this defines a single trigger pulse\n", + " # that represents a falling edge\n", + " # first half a single pulse is high (1s)\n", + " numpy.ones(n_samples_in_waveform//n_trigger_pulses//2),\n", + " # second half a single pulse is low (0s)\n", + " numpy.zeros(n_samples_in_waveform//n_trigger_pulses//2)\n", + " )),\n", + " n_trigger_pulses\n", + ") # falling from 1 to 0 (a.u.) every 0.01s after the start of the waveform\n", + "\n", + "elements = numpy.array([waveform_ch1]) # we only have one element in the sequence\n", + "waveforms = numpy.array([elements]) # we will use only 1 channel\n", + "\n", + "# Create a sequence file from the \"waveform\" array\n", + "seq_name = 'single_trigger_marker_1'\n", + "seqx = awg.makeSEQXFile(\n", + " trig_waits=[0], nreps=[1], event_jumps=[0], event_jump_to=[0], go_to=[1],\n", + " wfms=waveforms, amplitudes=[1.0], seqname=seq_name)\n", + "\n", + "# Send the sequence file to AWG internal disk\n", + "seqx_file_name = seq_name + '.seqx'\n", + "awg.sendSEQXFile(seqx, seqx_file_name)\n", + "\n", + "awg.clearSequenceList()\n", + "awg.clearWaveformList()\n", + "\n", + "# Load the sequence file\n", + "awg.loadSEQXFile(seqx_file_name)\n", + "\n", + "# Full resolution of the AWG channel is 16 bits for AWG5208,\n", + "# but we take 1 bit for the marker channel\n", + "awg.ch1.resolution = 16 - 1\n", + "\n", + "awg.ch1.awg_amplitude(1) # V\n", + "# Load a particular sequence to the channel\n", + "awg.ch1.setSequenceTrack(seq_name, 0)\n", + "# Assign a waveform to the channel\n", + "awg.ch1.setWaveform(awg.waveformList[0])\n", + "\n", + "# Set the marker's high as high as possible \n", + "# so that the lock-in detects the falling edge\n", + "awg.ch1.marker1_high(1.75) # V\n", + "awg.ch1.marker1_low(0) # V\n", + "\n", + "awg.ch1.state(1) # turns the channel \"on\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Capture data" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The number of acquired X data points is 100\n", + "The number of acquired Y data points is 100\n" + ] + } + ], + "source": [ + "sample_count = n_trigger_pulses\n", + "\n", + "# Set the capture length (which is a portion of the buffer size) \n", + "# to fit the number of samples that we want to acquire.\n", + "# For more information about the maximum buffer size, \n", + "# and other buffer-related properties, refer to the instrument manual.\n", + "lockin.buffer.set_capture_length_to_fit_samples(sample_count)\n", + "\n", + "# Start capturing data, and capture one sample per each received trigger signal.\n", + "# This basically arms the lock-in amplifier.\n", + "# For more information about the capture modes, refer to the instrument manual.\n", + "lockin.buffer.start_capture(\"ONE\", \"TRIG\")\n", + "\n", + "# Play the AWG sequence that contains the trigger pulses train.\n", + "awg.play()\n", + "\n", + "# We call this blocking function to wait\n", + "# until the requested number of samples is captured.\n", + "lockin.buffer.wait_until_samples_captured(sample_count)\n", + "\n", + "# Stop capturing.\n", + "lockin.buffer.stop_capture()\n", + "\n", + "# Stop the AWG sequence playback\n", + "awg.stop()\n", + "\n", + "# Retrieve the data from the buffer.\n", + "# The returned data is a dictionary where keys are names of the variables\n", + "# from the capture config, and values are the captured values.\n", + "data = lockin.buffer.get_capture_data(sample_count)\n", + "\n", + "print(f\"The number of acquired X data points is {len(data['X'])}\")\n", + "print(f\"The number of acquired Y data points is {len(data['Y'])}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For convenience, the measurement code from above is encapsulated into a method of the lock-in buffer `capture_one_sample_per_trigger`:" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "try:\n", + " \n", + " # Note the second argument - it is a callable \n", + " # that is responsible for starting the trigger pulse train\n", + " data = lockin.buffer.capture_one_sample_per_trigger(sample_count, awg.play)\n", + " \n", + "finally: # the try-finally block is here purely \n", + " # to ensure that the AWG is stopped anyway\n", + " awg.stop()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's plot the captured data:" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "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", + " fig.ws.close();\n", + " }\n", + "\n", + " this.ws.onmessage = this._make_on_message_function(this);\n", + "\n", + " this.ondownload = ondownload;\n", + "}\n", + "\n", + "mpl.figure.prototype._init_header = function() {\n", + " var titlebar = $(\n", + " '
');\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 = $('