{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# QCoDeS Example with AMI430" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*Testing on mock hardware*\n", "\n", "We have performed a lot of stand alone tests (tests with mocked hardware) in qcodes/tests/test_ami430.py. In particular, we have tested: \n", "- If the driver remembers the internal setpoints if these are given in cartesian, spherical and cylindrical coordinates\n", "- Check that we send to correct setpoint instructions to the individual instruments if inputs are cartesian, spherical or cylindrical coordinates\n", "- Test that we can call the measured parameters (e.g. cartesian_measured) without exceptions occuring. \n", "- Check that instruments which need to ramp down are given adjustment instructions first\n", "- Check that field limit exceptions are raised properly\n", "- Check that the driver remembers theta and phi coordinates even if the vector norm is zero. \n", "- Test that a warning is issued when the maximum ramp rate is increased \n", "- Test that an exception is raised when we try to set a ramp rate which is higher then the maximum allowed value.\n", "\n", "Furthermore, in qcodes/tests/test_field_vector.py we have tested if the cartesian to spherical/cylindircal coordinate transformations and vis-versa has been correctly implemented by asserting symmetry rules. \n", "\n", "*Testing on actual hardware*\n", "\n", "However, we also need to test with actual hardware, which is documented in this notebook. On individual instruments we need to run the following tests: \n", "- Test if communcation is established with the individual instruments\n", "- Test that we can correctly set current values of individual sources\n", "- Test that we can correctly measure current values of individual sources \n", "- Test that we can put the sources in paused mode \n", "- Test that the ramp rates are properly set \n", "\n", "With the 3D driver, we will test the following: \n", "- Test that the correct set points are reached if we give inputs in cartesian, spherical or cylindrical coordinates \n", "- Test that we can set theta and phi to non-zero values which are remembered if r is ramped from zero to r > 0. \n", "- Test that instruments are ramped up and down in the correct order, with ramp downs occuring before ramp ups. \n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import time\n", "import numpy as np\n", "import matplotlib.pyplot as plt \n", "\n", "from qcodes.instrument_drivers.american_magnetics.AMI430 import AMI430, AMI430_3D\n", "from qcodes.math_utils.field_vector import FieldVector" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Connected to: AMERICAN MAGNETICS INC. 430 (serial:2.01, firmware:None) in 0.60s\n", "Connected to: AMERICAN MAGNETICS INC. 430 (serial:2.01, firmware:None) in 0.62s\n", "Connected to: AMERICAN MAGNETICS INC. 430 (serial:2.01, firmware:None) in 0.57s\n" ] } ], "source": [ "# Check if we can establish communication with the power sources\n", "ix = AMI430(\"x\", address=\"169.254.146.116\", port=7180)\n", "iy = AMI430(\"y\", address=\"169.254.136.91\", port=7180)\n", "iz = AMI430(\"z\", address=\"169.254.21.127\", port=7180)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "coil constant = 0.076 T/A\n", "current rating = 79.1 A\n", "current ramp rate limit = 0.06 A/s\n" ] } ], "source": [ "# lets test an individual instrument first. We select the z axis. \n", "instrument = iz\n", "\n", "# Since the set method of the driver only excepts fields in Tesla and we want to check if the correct \n", "# currents are applied, we need to convert target currents to target fields. For this reason we need \n", "# the coil constant. \n", "coil_const = instrument._coil_constant\n", "current_rating = instrument._current_rating\n", "current_ramp_limit = instrument._current_ramp_limit\n", "print(\"coil constant = {} T/A\".format(coil_const))\n", "print(\"current rating = {} A\".format(current_rating))\n", "print(\"current ramp rate limit = {} A/s\".format(current_ramp_limit))" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Target field is 0.076 T\n", "Measured field is 0.07604 T\n", "Measured current is = 1.0005263157894737 A\n" ] } ], "source": [ "# Let see if we can set and get the field in Tesla \n", "target_current = 1.0 # [A] The current we want to set \n", "target_field = coil_const * target_current # [T]\n", "print(\"Target field is {} T\".format(target_field))\n", "instrument.field(target_field)\n", "\n", "field = instrument.field() # This gives us the measured field\n", "print(\"Measured field is {} T\".format(field))\n", "# The current should be \n", "current = field / coil_const\n", "print(\"Measured current is = {} A\".format(current))\n", "# We have verified with manual inspection that the current has indeed ben reached " ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYgAAAEKCAYAAAAIO8L1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xd8VGX2x/HPCb333kLvIBAUrKisoriIqKs/e1t1m25R\nAXsXddV117Wtirq6FoqKigUVdC2ooJCEDqH3DgZC2vn9cW/WGIcwhEwm5ft+vXhl7p1bzjwzzJnn\nlvOYuyMiIlJQQrwDEBGR0kkJQkREIlKCEBGRiJQgREQkIiUIERGJSAlCREQiUoIQEZGIlCBERCQi\nJQgREYmocrwDOBSNGzf2xMTEeIchIlKmzJ49e4u7NznQcmU6QSQmJjJr1qx4hyEiUqaY2cpoltMh\nJhERiUgJQkREIlKCEBGRiJQgREQkIiUIERGJSAlCREQiUoIQESljZq/czj+nL2X2yu0x3U+Zvg9C\nRKSi+XLpFi587hvcnaqVE3j5ikEMaNcgJvtSD0JEpIz4YukWfvPybHJynVyHrOxcZqZtjdn+1IMQ\nESnldu7J4p6p83l91hpa1KvO3sxccnJzqVI5gUEdGsVsv0oQIiKl2Pup67nlrXlsS8/k6uM68seh\nnZm3bhcz07YyqEOjmB1eAiUIEZFSadPuDG57ax7vpW6gR4u6jL9kIL1a1QNgQLsGMU0MeZQgRERK\nEXdnwuw13P3OfDKyc7lhWFd+fUwHqlQq+VPGShAiIqXEqq17uPGNFD5fuoXDExty35m96dikdtzi\nUYIQEYmznFxn/BfLeejDxVRKMO4e2YvzDm9LQoLFNS4lCBGROFq0YTejJyUzZ/UOTujWlLtH9qJl\n/RrxDgtQghARiYt92Tk8Pn0Zj89YSp3qVXj03MMY0bclZvHtNeSnBCEiUsK+W7Wd0ROTWbLpB0Ye\n1pJbf9mThrWqxjusn1GCEBEpIen7svnrh4t4/ssVtKhbnfGXDOT4bk3jHdZ+KUGIiJSA/y7ZzNjJ\nKazZvpeLBrfjhmHdqF2tdH8Fl+7oRETKuB17Mrn73QVMnL2GDk1qMeHqwQxMbBjvsKKiBCEiEgPu\nznupG7j1rXls35PJ747vyB9O6Ez1KpXiHVrUlCBERIrZxl0Z3PJmKh/O30ivVnV54bKB9GxZL95h\nHTQlCBGRYuLuvPbtau6ZuoDM7FzGntKNy49uT+U4lMkoDkoQIiLFYOXWdMZOTuHLZVs5on1Dxp3Z\nh/aNa8U7rEOiBCEicgiyc3IZ/8UKHpq2iCoJCdx7Rm/OHdgm7mUyioMShIhIES1Yv4vRk5JJXrOT\nod2bcffIXjSvVz3eYRUbJQgRkYO0LzuHxz5ZyhMzllGvRhUeO68fw3u3KFVlMoqDEoSIyEGYvXIb\noyelsHTTD4zq34pbhvegQSksk1EclCBERKKQvi+bBz9YxAtfraBlvRo8f+lAhnQtvWUyioMShIjI\nAcxYtImb3khl3c69XDw4ketO7lrqy2QUh5hdnGtmz5nZJjNLzTevoZlNM7Ml4d8G4Xwzs7+b2VIz\nSzaz/rGKS0QkWtvTM/nza3O4ZPy3VK+SwMSrB3P7iJ4VIjlADBME8DwwrMC8McDH7t4Z+DicBjgF\n6Bz+uxJ4IoZxiYgUyt15e+46hj78KVPmruMPJ3Ti3WuOYUC7slFDqbjELA26+2dmllhg9unAkPDx\nC8AMYHQ4/0V3d2CmmdU3sxbuvj5W8YmIRLJhZwY3v5nKRws20qd1PV664gi6t6gb77DioqT7Sc3y\nvvTdfb2Z5Z3haQWszrfcmnCeEoSIlIjcXOfVb1dz39QFZOXmctOp3bn0qMQyWyajOJSWA2mRLh72\niAuaXUlwGIq2bdvGMiYRqSBWbElnzORkZqZtY3CHRow7szftGpXtMhnFoaQTxMa8Q0dm1gLYFM5f\nA7TJt1xrYF2kDbj708DTAElJSRGTiIhINLJzcnn28+U8PG0xVSsnMG5Ub84Z2Kbc3fBWVCWdIKYA\nFwPjwr9v5Zv/ezN7FTgC2KnzDyISS/PXBWUyUtbu5KQezbhrZC+a1S0/ZTKKQ8wShJm9QnBCurGZ\nrQFuI0gMr5vZ5cAq4Oxw8anAqcBSYA9waaziEpGKLSMrh398soSnPk2jfs0qPH5+f07p1Vy9hghi\neRXT/+3nqRMjLOvA72IVi4gIwLcrtjF6UjJpm9M5a0Brbh7enfo1y2eZjOJQWk5Si4jEzA/7snng\n/YW8+NVKWjeowYuXHc6xXZrEO6xSTwlCRMq16Qs3cdMbKazflcGlRyVy3UldqVVB7oQ+VGolESmX\ntqVncufb83hzzjo6N63NxKuPZEC7BvEOq0xRghCRcsXdmTJ3HXe8PZ/dGVlce2Jnfnt8R6pVrhTv\n0MocJQgRKTfW79zLzW+k8vHCTfRtU58HzuxD1+Z14h1WmaUEISJlXm6u859vVjHuvYXk5Do3D+/O\npUe1p1I5GBc6npQgRKRMS9v8A2Mmp/DN8m0c1akR953Rh7aNasY7rHJBCUJEyqSsnFz+9d80/vbR\nEqpXTuCBs/pw9oDWuuGtGO03QZjZn6NYP93dnyrGeEREDih17U5GT0pm3rpdnNKrOXeM6ElTlcko\ndoX1IK4nGLinsHR8NaAEISIlIiMrh0c/XsLTn6XRsFZVnrygP8N6tYh3WOVWYQni3+5+Z2Erm5nq\n4YpIifg6bStjJqewfEs6v0pqzU2n9qBezSrxDqtc22+CcPcbDrRyNMuIiByK3RlZjHtvIS9/vYo2\nDWvw0uVHcHTnxvEOq0I44ElqM7sWGA/sBp4B+gFj3P3DGMcmIhXcxws2cvObqWzclcEVR7fnzyd1\noWZVXVtTUqJp6cvc/VEzOxloQlCKezygBCEiMbH1h33c8fZ8psxdR5dmtXn8/CPp11ZlMkpaNAki\n7yT1qcB4d59ruo5MRGLA3XlrzjrueHseP+zL5k9Du/CbIR2pWrnijgsdT9EkiNlm9iHQHhhrZnWA\n3NiGJSIVzdode7npjRRmLNpMv7b1uf/MPnRppjIZ8RRNgrgcOAxIc/c9ZtYIjfgmIsUkN9d56euV\n3P/eQnIdbj2tBxcfmagyGaVAYTfKNXf3De6eC3yXN9/dtwJb8y8T+zBFpDxauukHxk5O5tsV2zmm\nc2PuPaM3bRqqTEZpUVgPYirQ/wDrR7OMiMhPZOXk8vRnaTz60RJqVK3EX8/uy5n9W6lMRilTWILo\na2a7CnnegMKeFxH5mZQ1O7lhUjIL1u9ieO8W3DaiB03rqExGaVTYjXIaXUNEik1GVg6PfLSYZ/67\nnEa1qvLUhQM4uWfzeIclhdAdJyISc18t28rYycms2LqHcwe2Yeyp3alXQ2UySjslCBGJmV0ZWdw3\ndSGvfLOKtg1r8p8rjuDITiqTUVYoQYhITEybv5Gb30xh8+59XHlsB/40tAs1qurIdVkSVYIws6OB\nzu4+3syaALXdfXlsQxORsmjLD/u4fco83kleT7fmdXj6wiT6tqkf77CkCKIp1ncbkAR0JajBVAV4\nCTgqtqGJSFni7rzx/VrufGc+e/bl8JdfdOGq41QmoyyLpgdxBkEF1+8A3H1dWG5DRASANdv3cOMb\nqXy2eDMD2jXg/jN706mpvibKumgSRKa7u5k5aJAgEflRbq7z4lcreOCDRQDcMaInFw5qR4LKZJQL\n0SSI183sKaC+mf0auAz4V2zDEpHSbumm3YyelMLslds5rksT7jmjF60bqExGeXLABOHufzWzXxDc\nNd0VuNXdp8U8MhEplTKzc3nq02X845Ol1KxWiYd/1Zcz+qlMRnkU1VVM7j7NzL7OW97MGrr7tphG\nJiKlztzVOxg9KZmFG3ZzWp8W3D6iJ41rV4t3WBIj0VzFdBVwJ7CXYBwIAxzoENvQRKS02JuZw8PT\nFvHs58tpUqca/7ooiV/0aBbvsCTGoulBXAf0dPctsQ5GREqfL5duYczkFFZt28N5R7RlzCndqFtd\nZTIqgmgSxDJgT6wDEZHSZefeLO6buoBXv11NYqOavHrlIAZ1aBTvsKQERZMgxgJfhucg9uXNdPdr\nirpTM/sTcAXBoaoUghHqWgCvAg0J7rm40N0zi7oPESm6D+Zt4JY3U9manslVxwVlMqpXUZmMiiaa\nBPEU8AnBF/khj0VtZq2Aa4Ae7r7XzF4HzgVOBR5x91fN7EmCoU6fONT9iUj0Nu3O4PYp85iasoHu\nLery7MUD6d26XrzDkjiJJkFku/ufY7DfGmaWBdQE1gMnAOeFz78A3I4ShEiJcHcmzl7D3e8uYG9W\nDtef3JUrj+1AlUoqk1GRRZMgppvZlcDb/PQQU5Euc3X3tWb2V2AVwZVRHwKzgR3unh0utgZoVZTt\ni8jBWb1tDze+kcJ/l2whqV0Dxp3Zh05Na8c7LCkFokkQeb/qx+abV+TLXM2sAXA60B7YAUwATomw\nqO9n/SuBKwHatm1blBBEBMjJdV74cgUPfrCIBIO7Tu/J+UeoTIb8KJo7qdsX8z6HAsvdfTOAmU0G\njiQo5VE57EW0BtbtJ56ngacBkpKSIiYRESnc4o27uWFiMnNW72BI1ybcc0ZvWtWvEe+wpJTZb4Iw\nsxPc/RMzGxXpeXefXMR9rgIGmVlNgkNMJwKzgOnAWQRXMl0MvFXE7YvIfmRm5/L4jKX8c/pSaler\nzN/OOYzTD2upMhkSUWE9iOMIrl76ZYTnHChSgnD3r81sIsGlrNnA9wQ9gneBV83s7nDes0XZvohE\n9v2q7YyZlMKijbsZ0bclt/2yB41UJkMKYe6FH6Uxs/YFR4+LNC8ekpKSfNasWfEOQ6RU25OZzUMf\nLua5L5bTrE517jmjFyd2V5mMiszMZrt70oGWi+Yk9SSgf4F5E4EBRQlMRErO50u2MPaNZFZv28sF\ng9oyelg36qhMhkSpsHMQ3YCeQL0C5yHqAtVjHZiIFN3OPVnc/e58JsxeQ/vGtXjtykEcoTIZcpAK\n60F0BU4D6vPT8xC7gV/HMigRKbr3U9dzy1vz2JaeyW+GdOTaEzurTIYUyX4ThLu/BbxlZoPd/asS\njElEimDTrgxufWse78/bQM+WdRl/yUB6tVKZDCm6aO6DUHIQKcXcnQmz1nD3u/PJyM5l9LBuXHFM\ne5XJkEMW1YhyIlI6rdoalMn4fOkWDm/fkHGjetOhicpkSPFQghApg3JynfFfLOehDxdTKcG4e2Qv\nzju8rcpkSLGKZsjRRgSVVY8iuEHuc+BOd98a29BEJJJFG3Zzw6Rk5q7ewYndmnL3Gb1oUU9lMqT4\nRdODeBX4DDgznD4feI2gppKIlJB92Tn8c/oynpixlDrVq/D3/+vHL/u0UJkMiZloEkRDd78r3/Td\nZjYyVgGJyM99t2o7oycms2TTD5zRrxW3nNaDhrWqxjssKeeiHQ/iXOD1cPosgrpJIhJj6fuy+euH\ni3j+yxW0qFud8ZcO5PiuTeMdllQQ0SSIq4A/Ay+F0wlAupn9GXB3rxur4EQqss8Wb2bs5BTW7tjL\nRYPbccOwbtSuputKpOREcx9EnZIIREQCO/Zkctc7C5j03Ro6NKnFhKsHMzCxYbzDkgooqp8jZtYH\nSMy//CGMByEiEbg7U1M2cNuUVHbsyeL3x3fi9yd0UpkMiZtoLnN9DugDzANyw9lFHg9CRH5u464M\nbnkzlQ/nb6R3q3q8eNkR9Gipo7cSX9H0IAa5e4+YRyJSAbk7r327mnumLiAzO5exp3Tj8qPbU1ll\nMqQUiCZBfGVmPdx9fsyjEalAVmxJZ+zkFL5K28qgDg0ZN6oPiY1rxTsskf+JJkG8QJAkNgD7ACO4\neqlPTCMTKaeyc3J57ovlPDxtMVUSErhvVG/OSWqjMhlS6kSTIJ4DLgRS+PEchIgUwYL1uxg9KZnk\nNTsZ2r0Zd4/sRfN6Gn9LSqdoEsQqd58S80hEyrF92Tk89slSnpixjHo1qvDYef0Y3ltlMqR0iyZB\nLDSz/wBvExxiAnSZq0i0Zq3YxuhJySzbnM6o/q24ZXgPGqhMhpQB0SSIGgSJ4aR883SZq8gB/LAv\nmwffX8iLM1fSsl4Nnr90IENUJkPKkGjupL60JAIRKU9mLNrETW+ksm7nXi4enMh1J3dVmQwpc6K5\nUa46cDnQE/jf2TR3vyyGcYmUSdvTM7nrnflM/n4tHZvUYuLVgxnQTmUypGyK5ifNv4GFwMnAnQTj\nQSyIZVAiZY27807yem6fMo+de7O45oRO/O6ETlSrrDIZUnZFkyA6ufvZZna6u78QnrD+INaBiZQV\n63fu5ZY3U/lowSb6tK7HS1ccQfcWKpMhZV80CSIr/LvDzHoBGwgK94lUaLm5zivfrmLc1IVk5eZy\n06ndufSoRJXJkHIjmgTxtJk1AG4GpgC1gVtiGpVIKbd8SzpjJiXz9fJtDO7QiHFn9qZdI5XJkPKl\n0ARhZgnALnffTjAudYcSiUqklMrOyeWZz5fzyLTFVK2cwP1n9uZXSW10w5uUS4UmCHfPNbPf8+Nw\noyIV1rx1Oxk9KZnUtbs4qUcz7hrZi2Z1VSZDyq9oDjFNM7PrgNeA9LyZ7r4tZlGJlCIZWTn845Ml\nPPlpGg1qVuXx8/tzSq/m6jVIuRdNgsi73+F3+eY5OtwkFcC3YZmMtM3pnDWgNTcP7079miqTIRVD\nNHdSty+JQERKk90ZWTzw/iL+PXMlrRvU4MXLDufYLk3iHZZIidK9/yIFTF+4iZveSGH9rgwuO6o9\nfzmpC7VUJkMqoLh86s2sPvAM0IvgcNVlwCKC8xyJwArgV+HVUyIlYlt6Jne+PY8356yjc9PaTPrN\nkfRv2yDeYYnETbx+Fj0KvO/uZ5lZVaAmcCPwsbuPM7MxwBhgdJzikwrE3Zkydx13vD2f3RlZXHti\nZ357fEeVyZAKb78Jwsz6F7aiu39XlB2aWV3gWOCScDuZQKaZnQ4MCRd7AZiBEoTE2AfzNnD/+wtJ\n25xO3zb1eeDMPnRtXifeYYmUCoX1IB4K/1YHkoC5BONR9wG+Bo4u4j47AJuB8WbWF5gNXAs0c/f1\nAO6+3sxUOF9ixt25//2FPPlpGgCVE4ybh3dXchDJZ79FY9z9eHc/HlgJ9Hf3JHcfAPQDlh7CPisD\n/YEn3L0fwb0VY6Jd2cyuNLNZZjZr8+bNhxCGVFRrtu/houe++V9ygCBhfLNct/aI5BdNVbFu7p6S\nN+HuqcBhh7DPNcAad/86nJ5IkDA2mlkLgPDvpkgru/vTYbJKatJElx1K9Nydl79eycmPfMbsldv5\n9bEdqF4lgUoGVSonMKhDo3iHKFKqRHOSeoGZPQO8RHDF0QUcwngQ7r7BzFabWVd3XwScCMwP/10M\njAv/vlXUfYgUtHrbHsZMTuaLpVs5smMj7j+zD20a1mRYz+bMTNvKoA6NGNBOVyyJ5GfuXvgCwYhy\nvyE4sQxB0b4n3D2jyDs1O4zgMteqQBpwKUFv5nWgLbAKOPtA5TySkpJ81qxZRQ1DKoDcXOflb1Zx\n39QFGHDT8B783+EqricVm5nNdvekAy0XzZ3UGWb2JDA1/MV/yNx9DsGJ74JOLI7tiwCs2rqHGybN\nZWbaNo7p3Jj7RvWmdYOa8Q5LpMyIZkzqEcCDBL/224e//u909xGxDk6kKHJznX/PXMm49xZSKcEY\nN6o35wxUr0HkYEVzDuI24HCC+xJw9zlmlhi7kESKbuXWdK6fmMw3y7dxXJcm3DeqNy3r14h3WCJl\nUjQJItvdd+rXl5RmubnO81+u4IEPFlKlUgIPnNWHswe0Vq9B5BBEkyBSzew8oJKZdQauAb6MbVgi\n0Vu+JZ0bJs7l2xXbOb5rE+4d1ZsW9dRrEDlU0SSIPwA3AfuA/wAfAHfHMiiRaOTkOuO/WM6DHyyi\nWuUEHjq7L6P6t1KvQaSYHGhM6krAHe5+PUGSECkVlm3+gesnzOW7VTs4sVtT7h3VW8N/ihSzA41J\nnWNmA0oqGJEDycl1nv08jYc+XEz1KpV45Jy+jDxMvQaRWIjmENP3ZjYFmMBPx6SeHLOoRCJYumk3\n109M5vtVO/hFj2bcM7IXTdVrEImZaBJEQ2ArcEK+eQ4oQUiJyM7J5ZnPl/PwtMXUrFqJR889jBF9\nW6rXIBJj0dxJfWlJBCISyZKNu7luYjJzV+9gWM/m3DWyF03qVIt3WCIVQjR3Uo8n6DH8hLtfFpOI\nRAh6DU99lsajHy2hdvXKPHZeP4b3bqFeg0gJiuYQ0zv5HlcHzgDWxSYcEVi0YTfXT5xL8pqdnNq7\nOXee3ovGtdVrEClp0RximpR/2sxeAT6KWURSYWXl5PLUp8t49OMl1K1ehX+e15/hfVrEOyyRCiua\nHkRBnQlKcosUmwXrd3HdhLnMW7eL0/q04I4RPWmkXoNIXEVzDmI3Pz0HsQEYHbOIpELJysnl8enL\neGz6EurVqMIT5/fnlN7qNYiUBtEcYtIo7hIT89bt5PoJycxfv4vTD2vJbb/sScNaVeMdloiEoulB\nHAXMcfd0M7uAYPzoR919Zcyjk3IpMzuXx6Yv5fHpS6lfsypPXTiAk3s2j3dYIlJANOcgngD6mllf\n4AbgWeBF4LhYBiblU+ranVw3YS4LN+zmjH6tuO2XPahfU70GkdIo2vEg3MxOJ+g5PGtmF8c6MClf\n9mXn8NgnS3l8xjIa1arKMxclMbRHs3iHJSKFiCZB7DazscAFwLFhhdcqsQ1LypPkNTu4fkIyizbu\n5sz+rbn1tB7Uq6mPkEhpF02COAc4D7jc3TeYWVuCMapFCrUvO4dHP1rCU5+l0bh2VZ67JIkTuqnX\nIFJWRHMV0wbg4XzTqwjOQYjs15zVO7h+wlyWbPqBXyW15qbhPahXQ70GkbIkmquYBgH/ALoDVYFK\nwA/uXi/GsUkZlJGVw98+WsLTny2jWd3qPH/pQIZ0bRrvsESkCKI5xPQYcC7BeBBJwEUEd1OL/MR3\nq7Zz/YS5LNuczrkD23Dj8O7Ura5eg0hZFVWpDXdfamaV3D0HGG9mX8Y4LilDMrJyeHjaYp75bxrN\n61bnxcsO59guTeIdlogcomgSxB4zqwrMMbMHgPVArdiGJWXF7JXbuH5CMmlb0jnviLaMPaUbddRr\nECkXokkQFwIJwO+BPwFtgDNjGZSUfnszc3jow0U8+8VyWtarwUuXH8HRnRvHOywRKUbRXMW00sxq\nAC3c/Y4SiElKuW9XbOOGicks35LOBYPaMuaU7tSuVpTCwCJSmkVzFdMvgb8SXMHU3swOA+509xGx\nDk5Klz2Z2Tz4wSKe/3IFrerX4D9XHMGRndRrECmvovnZdztwODADwN3nmFlizCKSUunrtK3cMCmZ\nlVv3cNHgdowe1o1a6jWIlGvR1mLaqbGAK6b0fdk88P5CXvhqJW0b1uSVXw9icMdG8Q5LREpANAki\n1czOAyqZWWfgGkCXuVYAXy7bwuhJyazetpdLjkzkhmFdqVlVvQaRiiKa/+1/AG4C9gGvAB8Ad8Uy\nKImv9H3ZjHtvIf+euZLERjV5/arBHN6+YbzDEpESFs1VTHsIEsRNsQ9H4u2LpUGvYe2OvVx+dHuu\nO6krNapWindYIhIH0VzFlATcCCTmX97d+xzKjsOy4bOAte5+mpm1B14FGgLfARe6e+ah7EOitzsj\ni/veW8h/vl5F+8a1mHDVYJIS1WsQqciiOcT0MnA9kALkFuO+rwUWAHXD6fuBR9z9VTN7EricYDQ7\nibH/LtnMmEkprNu5l18f056/nNSV6lXUaxCp6KJJEJvdfUpx7tTMWgPDgXuAP1twidQJBONOALxA\ncHmtEkQM7c7I4t6pC3jlm9V0aFKLiVcfyYB2DeIdloiUEtEkiNvM7BngY4IT1QC4++RD2O/fCMa3\nrhNONwJ2uHt2OL0GaHUI25cD+HTxZsZOSmbDrgyuOq4DfxraRb0GEfmJaBLEpUA3gmFG8w4xOVCk\nBGFmpwGb3H22mQ3Jmx1hUd/P+lcCVwK0bdu2KCFUaLsysrjnnQW8Nms1nZrWZtJvjqRfW/UaROTn\nokkQfd29dzHu8yhghJmdClQnOAfxN6C+mVUOexGtgXWRVnb3p4GnAZKSkiImEYls+sJNjJ2cwqbd\nGfx2SEeuObGzeg0isl8JUSwz08x6FNcO3X2su7d290SCgYg+cffzgenAWeFiFwNvFdc+K7qde7K4\nbsJcLn3+W+rWqMwbvz2KG4Z1U3IQkUJF04M4GrjYzJYTnIMwwA/1MtcIRgOvmtndwPfAs8W8/Qrp\n4wUbufGNFLb8kMnvj+/EH07sRLXKSgwicmDRJIhhsdq5u8/gxyKAaQRFAaUY7NiTyZ1vz2fy92vp\n1rwOz1w0kN6tNYy4iEQvqvEgSiIQKT7T5ge9hu3pmVxzQid+f0JnqlaO5miiiMiPVHmtHNmenskd\nb8/jzTnr6N6iLuMvGUivVuo1iEjRKEGUE++nbuDmN1PZsSeTPw7tzG+HdFKvQUQOiRJEGbctPZPb\npszj7bnr6NGiLi9edjg9WtY98IoiIgegBFGGTU1Zzy1vprIrI4u//KILVw/pSJVK6jWISPFQgiiD\ntvywj9vemse7Kevp1aouL599BN2aq9cgIsVLCaKMeSd5Hbe+NY8fMrK5/uSuXHlsB/UaRCQmlCDK\ngNkrt/Pxgo18t2o7M9O20bd1PR48uy9dmtU58MoiIkWkBFHKzV6xjXP/NZOsnKDs1AVHtOP2ET2o\nrF6DiMSYvmVKsdXb9nDdxOT/JYcEgxb1qys5iEiJUA+iFMrOyWX8Fyt4eNpi3J3KCYa7U6VyAoM6\nNIp3eCJSQShBlDKpa3cyZnIyqWt3MbR7U+48vRfrd2YwM20rgzo00ohvIlJilCBKiT2Z2TwybTHP\nfr6cRrWr8fj5/TmlV3PMjJb1aygxiEiJU4IoBWYs2sRNb6SydsdezjuiLaOHdaNejSrxDktEKjgl\niDja8sM+7npnPm/NWUfHJrV4/arBHN6+YbzDEhEBlCDiwt2ZMHsN97y7gL2ZOfxxaGd+M6SjBvIR\nkVJFCaKELd+Szo2TU/gqbSsDExtw36jedGqqG95EpPRRgighmdm5PP3ZMv7+yVKqVU7g3jN6c+7A\nNiQkWLx1WYElAAANyElEQVRDExGJSAmiBMxeuZ0bJ6ewaONuhvduwW2/7EHTutXjHZaISKGUIGJo\nd0YWD36wiH/PXEnzutV55qIkhvZoFu+wRESiogQRIx/M28Btb81j4+4MLh6cyHUnd6V2NTW3iJQd\n+sYqZht2ZnDblFQ+mLeRbs3r8OSFAzisTf14hyUictCUIIpJbq7z8jereOC9hWTm5DJ6WDeuOKa9\nxmoQkTJLCaIYLN64m7GTU5i9cjtHdWrEPSN7k9i4VrzDEhE5JEoQhyAjK4d/Tl/Kk58uo3a1yjx0\ndl9G9W+FmS5dFZGyTwmiiGambeXGySmkbUlnVL9W3DS8O41qV4t3WCIixUYJ4iDt2JPJfVMX8tqs\n1bRpWIMXLzucY7s0iXdYIiLFTgkiSu7OO8nruePteWzfk8VVx3Xgjyd2oUZV1U8SkfJJCSIKa7bv\n4ZY3U5m+aDN9WtfjhcsOp2fLevEOS0QkppQgCpGdk8vzX67goQ8XYwa3nNaDS45MpJLqJ4lIBaAE\nsR+pa3cydnIKKWt3cnzXJtw1shetG9SMd1giIiVGCaKAPZnZ/O2jJTz7+XIa1KzKY+f1Y3jvFrp0\nVUQqHCWIfD5dvJmb30xh9ba9nDuwDWNP6U69mhr6U0QqJiUIgqE/735nPm/OWUeHxrV49cpBDOrQ\nKN5hiYjEVYVOEO7OxNlruGfqAtL3ZXPNCZ347fGdqF5Fl66KiJR4gjCzNsCLQHMgF3ja3R81s4bA\na0AisAL4lbtvj0UMs1du5/3U9cxM20rK2l0MaBcM/dmlmYb+FBHJE48eRDbwF3f/zszqALPNbBpw\nCfCxu48zszHAGGB0ce989srtnPv0V2TlOABXHtuBMcO6aehPEZECSrwWtbuvd/fvwse7gQVAK+B0\n4IVwsReAkbHY/8y0reTkBsmhkkG9GlWUHEREIojrYAVmlgj0A74Gmrn7egiSCNB0P+tcaWazzGzW\n5s2bD3qfgzo0omrlBCoZVKmcoJPRIiL7Ye4enx2b1QY+Be5x98lmtsPd6+d7fru7NyhsG0lJST5r\n1qyD3vfslduZmbaVQR0aMaBdobsQESl3zGy2uycdaLm4XMVkZlWAScDL7j45nL3RzFq4+3ozawFs\nitX+B7RroMQgInIAJX6IyYJbkp8FFrj7w/memgJcHD6+GHirpGMTEZEfxaMHcRRwIZBiZnPCeTcC\n44DXzexyYBVwdhxiExGRUIknCHf/HNjfZUMnlmQsIiKyf3G9iklEREovJQgREYlICUJERCKK230Q\nxcHMNgMr4x1HBI2BLfEOohRQOwTUDgG1Q6A0tEM7d29yoIXKdIIorcxsVjQ3oZR3aoeA2iGgdgiU\npXbQISYREYlICUJERCJSgoiNp+MdQCmhdgioHQJqh0CZaQedgxARkYjUgxARkYiUIA6BmbUxs+lm\ntsDM5pnZteH8hmY2zcyWhH8rROlYM6tkZt+b2TvhdHsz+zpsh9fMrGq8YywJZlbfzCaa2cLwszG4\nIn4mzOxP4f+LVDN7xcyqV4TPhJk9Z2abzCw137yI778F/m5mS80s2cz6xy/yn1OCODR5w6d2BwYB\nvzOzHgTDpX7s7p2Bj8PpiuBaghEC89wPPBK2w3bg8rhEVfIeBd53925AX4I2qVCfCTNrBVwDJLl7\nL6AScC4V4zPxPDCswLz9vf+nAJ3Df1cCT5RQjFFRgjgE8R4+tTQxs9bAcOCZcNqAE4CJ4SIVpR3q\nAscSlLTH3TPdfQcV8DNBUAy0hplVBmoC66kAnwl3/wzYVmD2/t7/04EXPTATqB+Oh1MqKEEUk6IM\nn1rO/A24AcgNpxsBO9w9O5xeQ5A8y7sOwGZgfHi47Rkzq0UF+0y4+1rgrwSl+9cDO4HZVMzPBOz/\n/W8FrM63XKlqEyWIYhAOnzoJ+KO774p3PCXNzE4DNrn77PyzIyxaES6Zqwz0B55w935AOuX8cFIk\n4TH204H2QEugFsHhlIIqwmeiMKX6/4kSxCEqbPjU8PmYDp9aShwFjDCzFcCrBIcR/kbQXc4bc6Q1\nsC4+4ZWoNcAad/86nJ5IkDAq2mdiKLDc3Te7exYwGTiSivmZgP2//2uANvmWK1VtogRxCDR8asDd\nx7p7a3dPJDgR+Ym7nw9MB84KFyv37QDg7huA1WbWNZx1IjCfCvaZIDi0NMjMaob/T/LaocJ9JkL7\ne/+nABeFVzMNAnbmHYoqDXSj3CEws6OB/wIp/Hjs/UaC8xCvA20Jh09194InrcolMxsCXOfup5lZ\nB4IeRUPge+ACd98Xz/hKgpkdRnCyviqQBlxK8GOsQn0mzOwO4ByCq/2+B64gOL5erj8TZvYKMISg\nautG4DbgTSK8/2HyfIzgqqc9wKXuPisecUeiBCEiIhHpEJOIiESkBCEiIhEpQYiISERKECIiEpES\nhIiIRKQEIcXKzP5oZjXzTU81s/pxjul2M7uuiOvOMLNCxw8u+Jqj3O6QvKq3EZ57Jazs+aeD2WYs\nhfEemW96ZFiYMm/6TjMbGsP9zzCzRWY2opBlzgmrokZsVzl4ShAVQHgTTkm9138kKMwGgLufGhar\nK89+8poPhZk1B4509z7u/kiB5yrvZ7WSMITgTug8I4H/JQh3v9XdP4pxDOe7+5T9PenurxHcayHF\nRAminDKzxHAsgseB74A2ZvaEmc0Ka/TfkW/ZFWZ2r5l9FT7f38w+MLNlZnZ1uMwQM/vMzN4ws/lm\n9mTBpGNm1xDU3ZluZtPzbbtxGM/CsHhdqpm9bGZDzeyLsEb+4eHytSyop/9tWOzu9P28vhvMLMXM\n5prZuHDer8P15prZpEi/6s2sk5l9FC7znZl1LPhr3sweM7NLIqz7s/bbz2s+KWzL78xsggW1ujCz\nYWEbfA6M2s9b9yHQ1MzmmNkx4S/ne83sU+BaM2tnZh+HPYyPzaxtuO3nw/imm1mamR0XtuMCM3t+\nP204Lnwvk83sr+G8JmHbfRv+O8qCQpRXA38K4zoOGAE8GE53DPd/Vr73/I7w9aeYWbd8254Wzn/K\nzFaGn41aZvZu+J6kmtk5+2mb/LFfky/2Vw+0vBSRu+tfOfwHJBLc3T0o37yG4d9KwAygTzi9AvhN\n+PgRIBmoAzQhKMIHwS/IDIJqpZWAacBZEfa7AmhccDqMJxvoTfDDZDbwHEGxstOBN8Pl7yW4uxag\nPrAYqFVgH6cAXwI1C7yuRvmWuRv4Q/j4doK7uyG4y/2M8HF1gl/+Q4B38q37GHBJ+HgGwZgGB2q/\nxuHjxsBneTEDo4Fbw32tJqj7bwR31b4Tof0SgdR80zOAx/NNvw1cHD6+LF+7PU9wh3Jee+4q0NaH\nFdhPQ2ARP94sWz/8+x/g6PBxW4IyMj9pw3z7OyvSdNgeeW3/W+CZfO06Nnw8jKAoXWPgTOBf+bZV\nL0K7/O99CKfXAdXyx57vc/qzdtW/ov1TD6J8W+lBjfk8vzKz7whKHPQk3yECgpowEJQN+drdd7v7\nZiDDfjyH8I27p7l7DvAKcPRBxrPc3VPcPReYRzCAiof7TAyXOQkYY2ZzCL4UqhN8UeU3FBjv7nsA\n/MeSFb3M7L9mlgKcH77G/zGzOkArd38jXC8jbxtRKqz98gwK538RvoaLgXZAt/D1Lwlf80sHsd/X\n8j0eTPAlDvBvfvoevJ2vPTcWaOvEAtvcRZDwnzGzUQRlHiBo28fC2KcAdcN2O1h5hStn59v30QRJ\nDHd/n2DAIMJ4h5rZ/WZ2jLvvjGL7ycDLZnYBwQ8PiYF4HtOU2EvPe2Bm7YHrgIHuvj087FA937J5\n9XBy8z3Om877nBSsy3KwdVoKbjf/PvP2YcCZ7r6okO3Yfvb9PDDS3eeGh4iGRFgvkmx+eri1esEF\nomi//PuY5u7/V2D9w/YTczTSC3ku/zajeQ+Dldyzw8N6JxIUWPw9QRXeBGCwu+/Nv7zZ/ppuv/L2\nn8NP39ufvwD3xWY2ADgVuM/MPnT3Ow+w/eEEAzONAG4xs57+4zgTUkzUg6g46hJ80ew0s2ZErs1/\nIIdbMKZwAkERts8jLLOb4PBUUX0A/MHCbyQz6xdhmQ+By/LOMZhZw3B+HWC9BSXYzy+4kgdjdawx\ns5HhetXCbawEeoTT9Qi+NAsqrP3yv+aZwFFm1incR00z6wIsBNqbWcdwuZ8kkIPwJcEXOuFrjPQe\nHFB4XqSeu08lOMl+WPjUhwTJIm+5vPkF39eivM+fA78Kt3sSkDcuc0tgj7u/RDDIUKHjMoefvzbu\nPp1gkKr6QO2DjEWioARRQbj7XIJDI/MIjv1/UYTNfAWMA1KB5cAbEZZ5Gngv74RtEdwFVAGSLRj0\n/a6CC4SHJ6YAs8JDIXmXsN5CcI5hGsEXciQXAteYWTLBl21zd19NcE4gGXiZoJ0K7rOw9vvfaw4P\ny10CvBLuYybQzd0zCMYcfjc8Sb0yuub4mWuAS8NtX0gwDnhR1AHeCbfzKZB3Se01QFJ48nc+wclp\nCM59nJF38pzgUNH1FlxI0LHgxvfjDuCk8DDdKQQjze0mOFfyTfhe3kRw/qgwlYCXwkOJ3xOMcV3e\nr5SLC1VzlahYvjLe8Y5FyiYzqwbkhIe3BhOMunfYgdYL151B8PkrtBS2PqfFSz0IESkpbYFvzWwu\n8Hfg1wex7jbgeTvAjXLA4/x48lsOkXoQIiISkXoQIiISkRKEiIhEpAQhIiIRKUGIiEhEShAiIhKR\nEoSIiET0/1ZMKCB1nHB9AAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "slope = 0.9993355432517128. A value close to one means the correct ramp times are used\n", "offset = 7.364001916301564. An offset indicates that there is a fixed delay is added to a ramp request\n" ] } ], "source": [ "# Verify that the ramp rate is indeed how it is specified \n", "ramp_rate = instrument.ramp_rate() # get the ramp rate\n", "instrument.field(0) # make sure we are back at zero amps\n", "\n", "target_fields = [0.1, 0.3, 0.7, 1.5] # [T]\n", "t_setting = []\n", "t_actual = []\n", "\n", "for target_field in target_fields:\n", "\n", " current_field = instrument.field()\n", " ts = abs(target_field - current_field) / ramp_rate\n", " t_setting.append(ts)\n", " \n", " tb = time.time()\n", " instrument.field(target_field)\n", " te = time.time()\n", " ta = te - tb\n", " t_actual.append(ta)\n", "\n", "fig, ax = plt.subplots()\n", "ax.plot(t_setting, t_actual, \".-\")\n", "plt.xlabel(\"ramp time calculated from settings [s]\")\n", "plt.ylabel(\"measured ramp time [s]\")\n", "plt.show()\n", "slope, offset = np.polyfit(t_setting, t_actual, 1)\n", "print(\"slope = {}. A value close to one means the correct ramp times are used\".format(slope))\n", "print(\"offset = {}. An offset indicates that there is a fixed delay is added to a ramp request\".format(offset))" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Lets move back to zero Amp\n", "instrument.field(0)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Lets test the 3D driver now. \n", "field_limit = [ # If any of the field limit functions are satisfied we are in the safe zone.\n", " lambda x, y, z: x == 0 and y == 0 and z < 3, # We can have higher field along the z-axis if x and y are zero.\n", " lambda x, y, z: np.linalg.norm([x, y, z]) < 2\n", "]\n", "\n", "i3d = AMI430_3D(\n", " \"AMI430-3D\", \n", " ix,\n", " iy,\n", " iz,\n", " field_limit=field_limit\n", ")" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def current_to_field(name, current):\n", " \"\"\"We cannot set currents directly, so we need to calculate what fields need to be generated for \n", " the desired currents\"\"\"\n", " instrument = {\"x\": ix, \"y\": iy, \"z\": iz}[name]\n", " coil_constant = instrument._coil_constant # [T/A]\n", " field = current * coil_constant\n", " return field" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "field target = [0.0386, 0.0121, 0.11399999999999999]\n", "field measured = [0.03816, 0.01211, 0.11384]\n" ] } ], "source": [ "# Lets see if we can set a certain current using cartesian coordinates\n", "current_target = [1.0, 0.5, 1.5]\n", "# calculate the fields needed\n", "field_target = [current_to_field(n, v) for n, v in zip([\"x\", \"y\", \"z\"], current_target)]\n", "print(\"field target = {}\".format(field_target))\n", "i3d.cartesian(field_target)\n", "field_measured = i3d.cartesian_measured()\n", "print(\"field measured = {}\".format(field_measured))" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "field target = [0.1209643335863923, 19.536859161547078, 17.404721375291402]\n", "field measured = [0.12077462481829535, 19.424782613847988, 17.532727661391853]\n" ] } ], "source": [ "# Lets move back to 0,0,0\n", "i3d.cartesian([0, 0, 0])\n", "\n", "# Lets see if we can set a certain current using spherical coordinates\n", "current_target = [1.0, 0.5, 1.5]\n", "# calculate the fields needed\n", "field_target_cartesian = [current_to_field(n, v) for n, v in zip([\"x\", \"y\", \"z\"], current_target)]\n", "# calculate the field target in spherical coordinates \n", "field_target_spherical = FieldVector(*field_target_cartesian).get_components(\"r\", \"theta\", \"phi\")\n", "\n", "print(\"field target = {}\".format(field_target_spherical))\n", "i3d.spherical(field_target_spherical)\n", "field_measured = i3d.spherical_measured()\n", "print(\"field measured = {}\".format(field_measured))\n", "# Like before, we see that the current target of 1.0, 0.5, 1.5 A for x, y and z have indeed been reached" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "field target = [0.040452070404368677, 17.404721375291402, 0.11399999999999999]\n", "field measured = [0.040235668255914431, 17.51627743673798, 0.11365]\n" ] } ], "source": [ "# Lets move back to 0,0,0\n", "i3d.cartesian([0, 0, 0])\n", "\n", "# Lets see if we can set a certain current using spherical coordinates\n", "current_target = [1.0, 0.5, 1.5]\n", "# calculate the fields needed\n", "field_target_cartesian = [current_to_field(n, v) for n, v in zip([\"x\", \"y\", \"z\"], current_target)]\n", "# calculate the field target in spherical coordinates \n", "field_target_cylindrical = FieldVector(*field_target_cartesian).get_components(\"rho\", \"phi\", \"z\")\n", "\n", "print(\"field target = {}\".format(field_target_cylindrical))\n", "i3d.cylindrical(field_target_cylindrical)\n", "field_measured = i3d.cylindrical_measured()\n", "print(\"field measured = {}\".format(field_measured))\n", "# Like before, we see that the current target of 1.0, 0.5, 1.5 A for x, y and z have indeed been reached" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "field target = [0.0386, 0.01815, 0.076]\n" ] } ], "source": [ "# Test that ramping up and down occurs in the right order. \n", "current_target = [1.0, 0.75, 1.0] # We ramp down the z, ramp up y and keep x the same \n", "# We should see that z is adjusted first, then y. \n", "# calculate the fields needed\n", "field_target = [current_to_field(n, v) for n, v in zip([\"x\", \"y\", \"z\"], current_target)]\n", "print(\"field target = {}\".format(field_target))\n", "i3d.cartesian(field_target)\n", "# Manual inspection has shown that z is indeed ramped down before y is ramped up " ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "error successfully raised. The driver does not let you do stupid stuff\n" ] } ], "source": [ "# check that an exception is raised when we try to set a field which is out side of the safety limits \n", "try:\n", " i3d.cartesian([2.1, 0, 0])\n", " print(\"something went wrong... we should not be able to do this :-(\")\n", "except:\n", " print(\"error successfully raised. The driver does not let you do stupid stuff\")" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1: Measured field = [-0.00013, -1e-05, 3e-05] T\n", "1: Theta measured = 98.72079692816342\n", "1: Phi measured = 180.0\n", "2: Measured field = [0.10484, -0.08797, 0.37558] T\n", "2: Theta measured = 20.032264760097508. We see that the input theta of 20.0 has been remembered\n", "2: Phi measured = -40.007172479040996. We see that the input phi of -40.0 has been remembered\n" ] } ], "source": [ "# Check that the driver remember theta/phi values if the set point norm is zero\n", "\n", "# lets go back to zero field\n", "i3d.cartesian([0, 0, 0])\n", "# Lets set theta and phi to a non zero value but keep the field magnitude at zero\n", "field_target_spherical = [0, 20.0, -40.0]\n", "i3d.spherical(field_target_spherical)\n", "field_measured = i3d.cartesian_measured()\n", "print(\"1: Measured field = {} T\".format(field_measured))\n", "\n", "# Note that theta_measured and phi_measured will give random values based on noisy current reading \n", "# close to zero (this cannot be avoided)\n", "theta_measured = i3d.theta_measured()\n", "print(\"1: Theta measured = {}\".format(theta_measured))\n", "phi_measured = i3d.phi_measured()\n", "print(\"1: Phi measured = {}\".format(phi_measured))\n", "\n", "# now lets set the r value\n", "i3d.field(0.4)\n", "\n", "field_measured = i3d.cartesian_measured()\n", "print(\"2: Measured field = {} T\".format(field_measured))\n", "# Now the measured angles should be as we intended\n", "theta_measured = i3d.theta_measured()\n", "print(\"2: Theta measured = {}. We see that the input theta of {} has been \"\n", " \"remembered\".format(theta_measured, field_target_spherical[1]))\n", "\n", "phi_measured = i3d.phi_measured()\n", "print(\"2: Phi measured = {}. We see that the input phi of {} has been \"\n", " \"remembered\".format(phi_measured, field_target_spherical[2]))" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "#### Notes:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The maximum current ramp rate can be increased to a desired value via setting the `current_ramp_limit` parameter. However, this should be done conservatively to avoid quenching the magnet. We strongly recommend to consult to the manual of your particular magnet before making any changes. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "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.7.5" }, "nbsphinx": { "execute": "never" } }, "nbformat": 4, "nbformat_minor": 2 }